• Skip to main content
  • Skip to search
  • Skip to footer
Cadence Home
  • This search text may be transcribed, used, stored, or accessed by our third-party service providers per our Cookie Policy and Privacy Policy.

  1. Community Forums
  2. Custom IC SKILL
  3. Question/Help with rodCreatePath (have not worked with Skill...

Stats

  • Locked Locked
  • Replies 5
  • Subscribers 143
  • Views 2202
  • Members are here 0
This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Question/Help with rodCreatePath (have not worked with Skill in a long time)

dpilhorn
dpilhorn over 14 years ago

 I have skill code that I wrote a long time ago to create nwell and substrate paths/rings using rodCreatePath().  I have not coded much skill since then so I am very rusty.  The code is not complex and works great for paths that are not too wide.  When someone uses it to create, for example, a 10um substrate ring to help isolate a large noisy fet, there are tens if not hundreds of thousands of contact shapes created with the ?subRect section of rodCreatePath().  Everything is created correctly, but all the contacts with their associated rod overhead causes everything in the layout to come to a screaching halt when being re-drawn or if someone makes the mistake of trying to stretch the ring.

 That is the problem.  I have been searching for answers, but I can't seem to find a way to create the contacts w/o the rod overhead for the wide paths.  Is there a way to remove the ?subRect and add db created rectangles to the path and still have them be choppable,  or am I out of luck?

Here is my code:

  procedure( pathDone( w done pts )
   if( done then
     cv=geGetEditCellView()

;; code to determine number of contacts wide goes here

        numCont= fix(eval(pForm->sw->value)/.44)
        startOffSet = 0.3
;;printf("test number : %n \n" numCont)
    subRectList = nil
;;; end numCont code
;;; create list of list for subRect property

if( (numCont <= 1) then
subRectList = cons(list(
       ?layer "CA"
       ?length 0.2
       ?width 0.2
       ?space 0.24
       ?gap "minimum"
       ?beginOffset -0.3
       ?endOffset -0.3
       ?choppable t
          ) subRectList) ;end of list
else
 for(i 0 numCont-1
subRectList = cons(list(
       ?layer "CA"
       ?length 0.2
       ?width 0.2
       ?space 0.24
       ?gap "minimum"
       ?beginOffset -0.3
       ?sep -(0.3 + 0.44*i)
       ?justification "left"
       ?endOffset -0.3
       ?choppable t
          ) subRectList);end of list
);end of for
);end of if

;;;;;;;;; end list of list

     epath = rodCreatePath(
       ?cvId cv
       ?layer "RX"
       ?width eval(pForm->sw->value)
       ?pts pts
       ?choppable nil
       ?beginExt 0
       ?endExt 0
       ?encSubPath list(
    list(
       ?layer "M1"
       ?beginOffset 0.0
       ?endOffset 0.0
           ?enclosure 0.0
       ?choppable t
    )
    list(
       ?layer "BP"
           ?enclosure 0.0
        ?beginOffset 0.0
       ?endOffset 0.0
       ?choppable nil
    ));encSubPath

       ?subRect subRectList

    );rodCreatePath  

   else
     println("Path entry completed.")
   )
 ); procedure pathDone

 hiCreateOptionsForm(
    'pForm
    "Enclosed Signal Pair Options"
    list(hiCreateFloatField(
        ?name 'sw
        ?prompt "Signal line width"
        ?defValue 0.4
         );CreateFloatField
    ); list
 )

 enterPath( ?prompts
    list( "Enter the first point."
    "Enter the next point." )
    ?doneProc "pathDone"
    ?form eval(pForm)
    ?pathWidth eval(pForm->sw->value)
    ?pathStyle "Truncate"
 );enterPath

 

Thank you in advance for any help you can offer.

Dan

 

  • Cancel
  • Andrew Beckett
    Andrew Beckett over 14 years ago
    Hi Dan,

    I just tried doing this using the new Fluid Guard ring capability in IC615 and the performance seems pretty reasonable. I created a guard path which is 10um wide and 2mm or so long. It takes a few seconds to build, but because fluid guard rings are pcells, they do not end up with all the shapes (about 280000 in my case) in the current cellView. So that really helps.

    Fluid guard rings are very manipulatable - choppable, stretchable, and can be used as paths, rectangles, rings and so on - and handle multiple rows of vias. They're easy to set up too.

    What version of the software are you using?

    Regards,

    Andrew
    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • dpilhorn
    dpilhorn over 14 years ago
    Hi Andrew,

    I am currently using IC514.  We have IC615 installed, but we are not "allowed" to use it for our current fab :(
    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • skillUser
    skillUser over 14 years ago

    Hi Dan,

    Since you are using IC5141 I would perhaps suggest that you could remove the ?subRect argument to the rodCreatePath function, and when you have created the rod path, iterate over the segments to work out the bbox for each segment, and then use the rodFillBBoxWithRects() ROD function - the rectangles have no ROD attributes, so they should be more efficient with no ROD overhead. Iterating over the rod segments should be fairly straightforward - there is a numSegments attribute for the path, and then perhaps use the startLeft0 - endRight0 for the opposing corners.  However, since these sections abut, you may need to "trim" some from each segment so that the rectangles are not too close to each other, or to the path edges. Here's a simple outline to get you started:

    
    for(i 0 epath~>numSegments-1
       rodFillBBoxWithRects(?cvId geGetEditCellView()
         ?layer "CA"
         ?fillBBox list(
           rodGetHandle(epath concat("startLeft" i))
           rodGetHandle(epath concat("endRight" i)))
         ?width 0.2 ?spaceX 0.24
         ?gap "minimum")
    ); for
    

    As I said, you will probably need to modify the corners a little, but this may help you.

    Best regards,

    Lawrence.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 14 years ago
    Dan,

    The other approach I was going to suggest would be to create a cellView containing the cut shape, and then place a mosaic of these. However, that wouldn't then work with layout XL, I believe, and it certainly would not be choppable.

    I suspect that such a huge number of shapes could be a problem for layout XL anyway - because the extractor will need to deal wth them.

    Creating a pcell might be another approach, but making it choppable would be tricky (without a bunch of utility code to provide those operations). You could make it stretchable by adding stretch handles in the pcell, maybe.

    Regards,


    Andrew
    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • dpilhorn
    dpilhorn over 14 years ago

    Sorry for the delay, taping out our chips this week :)

     

    Thank you for all the help, the rodFillBBoxWithRects() works, just not exactly the way I want.  But, it has given me a path and train of thought to follow when my time frees up again.

     

    Hoping that with our new foundry, I can upgrade to IC615.

     

    Dan

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel

Community Guidelines

The Cadence Design Communities support Cadence users and technologists interacting to exchange ideas, news, technical information, and best practices to solve problems and get the most from Cadence technology. The community is open to everyone, and to provide the most value, we require participants to follow our Community Guidelines that facilitate a quality exchange of ideas and information. By accessing, contributing, using or downloading any materials from the site, you agree to be bound by the full Community Guidelines.

© 2025 Cadence Design Systems, Inc. All Rights Reserved.

  • Terms of Use
  • Privacy
  • Cookie Policy
  • US Trademarks
  • Do Not Sell or Share My Personal Information