• 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. Automatically placement of PINS on NETS

Stats

  • Locked Locked
  • Replies 12
  • Subscribers 145
  • Views 21800
  • 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

Automatically placement of PINS on NETS

DannyRitt
DannyRitt over 8 years ago

Hello,


When generating/updating PINS in VXL it typically places them near the 0,0 coordinates as one group. I have a large block with many PINS, all grouped near 0,0 coordinates. I am interested to automatically place them on objects with the same layer and NET name. These PINS do not need to be on EDGES but on polygons with the same NET name. The skill script will take all selected PINS and move them to the matched path/rectangle/polygon with the same NET name.

Any ideas will be greatly appreciated.

Danny

  • Cancel
  • drdanmc
    drdanmc over 8 years ago
    First, make sure you understand terminals, pins, and figures. When you see a "pin" in layout, what you are seeing is a figure (like a rectangle or polygon) whose parent is a pin. That pin has a terminal as a parent. A terminal can have several pins.

    foreach(myTerm cv->terminals
    foreach(myPin myTerm->pins
    myNet = myPin->net
    figs_on_net = myNet->figs

    ;; write code to figure out which figure on the net (i.e. one of the members of figs_on_net)
    ;; you want to move the pin figure (myPin->fig) to.
    ;;
    ;; figure out what the pin figure type is with myPin->fig->objType
    ;; suppose you found that the objType is "rect" (typical) and you need to move
    ;; to the location specified by newBbox, then do
    myPin->fig->bBox = newBbox

    ;; if it is a path or polygon you need to do something different.

    ;; and move the label too. Labels are usually children.
    foreach( lab myPin->fig->children
    ;; put some objType checking in here...
    lab->xy = centerBox(newBbox)

    ;; could also figure out how much the pin moved by and adjust the xy position by the same delta
    ;; many variations and possibilities.
    )
    )
    )

    this obviously isn't a fully coded with checks for corner cases example but maybe it is enough to move you in the right direction.

    -Dan (paying the community dues....)
    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • DannyRitt
    DannyRitt over 8 years ago
    Hi Dan,

    The approach didn't seem to work properly.

    Then I tried to propagate pins from instances to the top level using the following method. Also didn't seem to work well.

    foreach(term cv~>terminals
    ; iterate over all the pins for this terminal
    foreach(pin term~>pins
    pinFig=pin~>fig
    net=term~>net
    ; only do this if there aren't more than one inst term
    unless(cdr(net~>instTerms)
    instTerm=car(net~>instTerms)
    ;childTerm=instTerm~>terminal
    childPinFig=car(instTerm~>pins)~>fig
    ; location within the instance master
    location=centerBox(childPinFig~>bBox)
    printf("Location is: %N\n" childTerm)

    ; transform to the top level coordinate system
    location=dbTransformPoint(location instTerm~>inst~>transform)
    pinFigLocation=centerBox(pinFig~>bBox)
    ; calculate the overall transform to move the pin to the new location
    transform=dbConcatTransform(list(-xCoord(pinFigLocation):-yCoord(pinFigLocation) "R0" 1) location)
    dbMoveFig(pinFig transform)
    )
    )
    )

    Thanks for the help.

    Danny
    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 8 years ago

    Danny,

    Without having tried your code, what "didn't work well" about it? It looks (at a high level glance) as if it should be moving the top level pins over the pin on an instance connected to that net, provided that there's only a single instance connected to that net. What actually happens when you run this code?

    Regards,

    Andrew.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • DannyRitt
    DannyRitt over 8 years ago

    Hi Andrew,


    The code, as is, fails with the transformation.

    *Error* dbTransformPoint: Invalid point - nil

    Also I am interested to have the current Top Level pin name and not the pin's name below.

    Thanks,


    Danny

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • DannyRitt
    DannyRitt over 8 years ago
    Hi Andrew,

    So another approach is to propagate the PINS from lower level and give them the current level names using the following code (Instead of selecting the PINS at the current level and have them moved to their terminals). Didn't work well...

    procedure(PropPins1()
    cv=geGetWindowCellView()

    foreach(inst cv~>instances
    foreach(instTerm inst~>instTerms
    ; if this is an I/O of this cell
    when(instTerm~>net~>term
    foreach(pin instTerm~>term~>pins
    foreach(fig pin~>figs
    ; propagate the pin shape up to this level
    newFig=dbCreateRect(cv list("m1" "drawing") dbTransformBBox(fig~>bBox inst~>transform))
    dbCreatePin(instTerm~>net newFig nil instTerm~>net~>term)

    ; Assign a Label over the PIN with the current level PIN Name
    netName = newFig~>net~>name
    when(netName = newFig~>net~>name
    lbl = dbCreateLabel(
    newFig~>cv
    list("m1" "lvs")
    centerBox(newFig~>bBox);
    netName
    "centerCenter"
    "R0"
    "roman"
    0.0625
    )


    )
    )
    )
    )
    )
    )


    Thanks,

    Danny
    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 8 years ago

    Unknown said:

    *Error* dbTransformPoint: Invalid point - nil

    Also I am interested to have the current Top Level pin name and not the pin's name below.

    I suggest you use the SKILL IDE to debug this - or put print statements in to print the variables used to form the arguments to dbTransformPoint - normal debugging procedures apply here. This is telling you that the first point to dbTransformPoint is nil, which means that the location variable is nil, which probably means that childPinFig was nil, and so on...

    Regards,

    Andrew.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • DannyRitt
    DannyRitt over 8 years ago
    Here is the working code that will do the job:
    Thank you all for the help and support.

    Danny

    procedure(MovePins()
    cv=geGetWindowCellView()
    foreach(term cv~>terminals
    ; iterate over all the pins for this terminal
    foreach(pin term~>pins
    pinFig=pin~>fig
    net=term~>net
    ; only do this if there aren't more than one inst term
    unless(cdr(net~>instTerms)
    instTerm=car(net~>instTerms)
    childTerm=instTerm~>term
    childPinFig=car(instTerm~>term~>pins)~>fig
    ; location within the instance master
    location=centerBox(childPinFig~>bBox)
    ; transform to the top level coordinate system
    location=dbTransformPoint(location instTerm~>inst~>transform)
    pinFigLocation=centerBox(pinFig~>bBox)
    ; calculate the overall transform to move the pin to the new location
    ;transform=dbConcatTransform(list(-xCoord(pinFigLocation):-yCoord(pinFigLocation) "R0" 1) location)
    transform=dbConcatTransform(list(-xCoord(pinFigLocation):-yCoord(pinFigLocation) "R0" 1) list(xCoord(location):yCoord(location) "R0" 1))
    dbMoveFig(pinFig cv transform)
    )
    )
    )
    )
    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • DannyRitt
    DannyRitt over 8 years ago
    With all permission, one more question please. Currently the script moves floating PINS onto instances pins/terminals. What if I would like to move floating PINS to shapes (rectangles, paths, polygons) with the same net name. Any advice will be greatly appreciated.

    Thank you.

    Danny
    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • jaggiml
    jaggiml over 8 years ago
    Hello Danny,

    this script worked pretty well for me, however if there are some un connected/floating pins at the top level then the script stops.
    I see the top pin assignment to the instance level pin is purely based on the pin order listed by cv~>terminals~>pins and cv~>terminals~>net may I know if the pin order is always consistent? if not then things can go quite wrong...

    also what happens when there are more than one vdd/gnd pins placed in instance level and has only one vdd/gnd pin at top level does this script still work?

    thanks
    Jaggi
    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • DannyRitt
    DannyRitt over 8 years ago
    Hi Jaggi,

    The script works to move PINS to instances pins at TOP LEVEL. It doesn't move existing floating pins if not on below instances. That's the additional functionality that I am looking for. The pin order should be consistent but currently it does not cover more then 1 pin of same net...

    Thanks,

    Danny
    • 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