• 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. Rod align warning ROD-1055 and ROD-1075

Stats

  • Locked Locked
  • Replies 4
  • Subscribers 143
  • Views 8505
  • 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

Rod align warning ROD-1055 and ROD-1075

MorrisDH
MorrisDH over 3 years ago

Getting rod warnings from pcell layout code and the result is a broken layout.

The pcell compiles with no errors or warnings and an initial placement of the pcell looks perfect. However, while editing parameters I will see the following warnings.

*WARNING* (ROD-1055) rodAlign: Reference object rodObj:808548320 named S0 not in cellView db:0x24cf221a named nmos4
*WARNING* (ROD-1075) rodAlign: command failed in "<lib>/<cell>/layout"
*WARNING* (ROD-1055) rodAlign: Reference object rodObj:808548320 named S0 not in cellView db:0x24cf221a named nmos4
*WARNING* (ROD-1075) rodAlign: command failed in "<lib>/<cell>/layout"

The <cell> is a mos device placed with Inst = dbCreateParamInstByMasterName(... and <lib> is the tech library.

This pcell which instantiates <cell> is not being compiled in the tech library. Don't think that matters.

After placing the mos device and use rodGetObj(Inst) to make a rod object from the instance. I then create two shapes and attempt to align them to the instance.

    gateConnLeft  = rodCreateRect(?cvId cvId ?layer "poly" ?width 0.4 ?length 0.6)
    gateConnRight = rodCreateRect(?cvId cvId ?layer "poly" ?width 0.4 ?length 0.6)
    rodAlign(?alignObj gateConnLeft ?alignHandle "upperLeft"
             ?refObj rodInst ?refHandle "upperLeft" ?xSep 0.17 ?ySep -0.16)
    rodAlign(?alignObj gateConnRight ?alignHandle "upperRight"
             ?refObj rodInst ?refHandle "upperRight" ?xSep -0.17 ?ySep -0.16 )

The intent is simply to align the rectangles at the upper left and right corners on the instance with some offset and it works fine until it does.

After a few edits the warning begins and the rectangle objects appear as if they are being placed and then rotated 90 degrees. It's the strangest thing I've ever seen.

Complete code:

procedure(switchPcell(@key w l nf polyPitch)
  let( ( cvId length width gatePitch fingers drainSourceWidth tfName tfId contactWidth
          con2Poly con2PolyS con2PolyD con2Edge polyRailWidth gateConnWidth gateConnLength
          contact2Edge gateConnLeft gateConnRight totalLength Inst)

    cvId = pcCellView
    ;cvId = geGetEditCellView()

    ; variables generated from parameters
    length = evalstring(l)/1u
    width  = evalstring(w)/1u
    gatePitch = evalstring(polyPitch)/1u
    fingers = evalstring(nf)

    ; derived variables
    drainSourceWidth = gatePitch-length
    ; contact width extracted from technology
    tfName = techGetTechLibName(ddGetObj(cvId~>libName))
    tfId = techOpenTechFile(tfName "tech")
    contactWidth = techGetParam(tfId "contact_width")
    con2Poly = (drainSourceWidth-contactWidth)/2
    polyRailWidth = 0.48
    gateConnWidth = 0.4
    gateConnLength = 0.6
    con2Edge = 0.072
    totalLength = (fingers-1)*gatePitch+2*(con2Edge+contactWidth+con2Poly)+0.18+length

    ; derived or hard-coded variables for nmos4 parameters
    con2PolyS = con2PolyD = sprintf(nil "%gu" con2Poly)
    contact2Edge = sprintf(nil "%gu" con2Edge)

    Inst = dbCreateParamInstByMasterName(
      cvId
     <lib>
     <cell>
     "layout"
      "S0"
      width:0
     "R90"
      1
      list(
        list("w" "string" w)
        list("l" "string" l)
        list("nf" "string" nf)
        list("advlay" "boolean" t)
        list("con2PolyS" "string" con2PolyS)
        list("con2PolyD" "string" con2PolyD)
        list("contToEdge" "string" con2Edge)
      ) ; parameter list
      t
    ) ; place nmos4
    rodInst = rodGetObj(Inst)

    ; create and align gate connections
    gateConnLeft  = rodCreateRect(?cvId cvId ?layer "poly" ?width gateConnWidth ?length gateConnLength)
    gateConnRight = rodCreateRect(?cvId cvId ?layer "poly" ?width gateConnWidth ?length gateConnLength)
    rodAlign(?alignObj gateConnLeft ?alignHandle "upperLeft"
             ?refObj rodInst ?refHandle "upperLeft" ?xSep 0.17 ?ySep -0.16)
    rodAlign(?alignObj gateConnRight ?alignHandle "upperRight"
             ?refObj rodInst ?refHandle "upperRight" ?xSep -0.17 ?ySep -0.16 )

    ; create body connections
    rodCreatePath(?cvId cvId ?layer "metal1" ?width 0.16
                             ?pts list(-(polyRailWidth+0.12):-0.37 polyRailWidth+0.12+width:-0.37))

  ) ; let
) ; procedure

Made edits to the above procedure to hide certain info.

  • Cancel
Parents
  • MorrisDH
    MorrisDH over 3 years ago

    Fixed it. The mos device that was being instantiated was also setting cvId = pcCellView. Unfortunately cvId was a global variable in the mos device. This was the root cause of the bizarre behavior.

    Problem solved.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
Reply
  • MorrisDH
    MorrisDH over 3 years ago

    Fixed it. The mos device that was being instantiated was also setting cvId = pcCellView. Unfortunately cvId was a global variable in the mos device. This was the root cause of the bizarre behavior.

    Problem solved.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
Children
  • Andrew Beckett
    Andrew Beckett over 3 years ago in reply to MorrisDH

    That explains it. I was doing some experiments with a different device from another PDK and changing a few layers, and it was all working for me - but I did wonder whether there was a difference in a cellView somewhere but didn't spot the mistake.

    I did notice a couple of things during my testing. First you have:

    tfName = techGetTechLibName(ddGetObj(cvId~>libName))
    tfId = techOpenTechFile(tfName "tech")

    I think it's better to just do tfId=techGetTechFile(cvId) - that's simpler and more robust.

    I also had to fix one of the parameters to the instance:

    ; ANDREW - this was wrong - it failed to create the instance
    ; because of the type mismatch
    ;list("contToEdge" "string" con2Edge)
    list("contToEdge" "string" contact2Edge)

    Since you'd already created the contact2Edge variable as a string, I assume this was just a simple mistake that maybe you''d already corrected.

    Andrew 

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • MorrisDH
    MorrisDH over 3 years ago in reply to Andrew Beckett

    Hi Andrew,

    The conToEdge is a cdf parameter defined as a string. I need to evaluate the value elsewhere so that is where the other variable, contactToEdge comes in. I confess that it looks a bit clunky.

    Thanks for the tip on techGetTechFile. I'm sure I've used that before but forgot it existed.

    Cheers,

    • 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