• 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. dbCreateVia() questions: justification and other exampl...

Stats

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

dbCreateVia() questions: justification and other examples

TrevorB
TrevorB over 15 years ago

I am migrating my pcells to IC6, and I am wrestling with the new via model.  Our PDK uses "standard vias", so I understand that I need to use the dbCreateVia function.

Apparently, I can override paramaters, even for standard vias, so I can use the following syntax:

dbCreateVia(cvId viaId list(x y) list(list("cutRows" 2) list("cutColumns" 3)))

However, I need to alter the justification to "lowerLeft".  This leads me to a few questions:
  1. How do I specify the justification using dbCreateVia?
  2. Does anybody have a "fully involved" dbCreateVia example that uses all possible options?  The manual is a little weak, methinks.
  3. How do I change the justification after I have created the via?  I cannot find it any where in the returned viaId, its header, its viaDef, or the header's master.

Thanks!

Trevor

  • Cancel
  • kbhow
    kbhow over 15 years ago

    Hi Trevor,

    There is several unique stuff in creating via compare to other instances. As what i know, there is no pption to specify the justification if you using SKILL function -dbCreateVia to create via rather than the GUI.

    Fortunately, the justification can be specific by doing some manual calculation and input the value as an option - "originOffset". The full syntax of dbCreateVia will be:

        dbCreateVia(  d_cvId d_viaDefId l_origin t_orientation l_paramlist)

        eg: dbCreateVia( cvId vidDefId list(x y) "R0" 

                                                 list( list("cutRows" 2)             ;row

                                                 list("cutColumns" 4)               ;column

                                                 list("cutSpacing" list(x y))       ; cut spacing for x and y

                                                 list("layer1Enc" list(x y))         ; enclosure for layer1

                                                 list("layer2Enc" list(x y))         ; enclosure for layer2

                                                 list("cutWidth" 0.2)                 ; cut width

                                                 list("cutHeight" 0.4)                ;cut height

                                                 list("originOffset" list(x y)))      ; justification

    You can change the justification by changing the option -"originOffset". The input must be in l_point which specify the x and y offset from center of the via. A mathematic calculation is needed to measure the distance from the origin point to the center of the via.

     

    How 

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • TrevorB
    TrevorB over 15 years ago

    Thanks, How!

    Let's say, I wanted to specify the  x-cutSpacing, but I did not know the y-cutSpacing, and I wanted to leave the y-cutSpacing at the default value.

    How would I do this inside the pcell's SKILL environment?  Surely, there is something more elegant than lxComputeViaParams.  Does it even work in the pcell environment?

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 15 years ago

    Please create a service request at Cadence Customer Support. lx functions are not legal in pcells, so that's not an option; I'm not aware of a convenient way of doing this within a pcell, so it would be best to ask via customer support and  then  an enhancement request can be filed, and maybe R&D can come up with a workaround.

    Regards,

    Andrew.

     

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • TrevorB
    TrevorB over 15 years ago

    Thanks, Andrew!  I filed a SR.  Hopefully, R&D can come up with something.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Tsien
    Tsien over 13 years ago

    Just wondering if you were able to come up with a solution to your problem?  I would also like to write some skill code to convert one via type to another.  But it seems like the only way possible in IC6 is to delete the old via and recreate a new one.  But to create an identical via to the original, I would need to set the parameters such as justification.

     Thanks.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • TrevorB
    TrevorB over 13 years ago

    I never found or was given a clean solution.  I wrote some bimodal code to consistently place a contact in either IC5.1 or IC6.1, like below.

    HTH,

    Trevor

     

    procedure(apcCreateContact(@key                   ;_Oct  7 11 tbowen 528
                                cv
                                master
                                origin
                                rotation
                                width
                                height
                                rows
                                columns
                                xPitch
                                yPitch
                                xBias
                                yBias
                                viaEdgeCenter
              )
    
      let((inst params)
        unless(origin
           origin = 0:0
        )
        unless(rotation
           rotation = "R0"
        )
        if(isOA()
           then
           when(rows
              params = append1(params list("cutRows" rows))
           )
           when(columns
              params = append1(params list("cutColumns" columns))
           )
           when(xPitch && yPitch && width && height
              params = append1(params list("cutSpacing" list(xPitch-width yPitch-height)))
           )
           when(width
              params = append1(params list("cutWidth" width))
           )
           when(height
              params = append1(params list("cutHeight" height))
           )
           inst = dbCreateVia(cv master origin rotation params)
           when((stringp(xBias) && rexMatchp("[lLrR][eEiI][fFgG][tThH]" xBias) && columns > 1) ||
              (stringp(yBias) && rexMatchp("[lLuU][oOpP][wWpP][eE][rR]" yBias) && rows > 1)
              if(numberp(viaEdgeCenter)
                 then
                 xOffset = yOffset = 0.0
                 bBox = inst~>bBox
                 when(stringp(xBias) && !rexMatchp("[cC]enter" xBias) && columns > 1
                    cond(
                       (rexMatchp("[rR]ight" xBias)
                        xOffset = viaEdgeCenter - width(bBox)/2.0
                       )
                       (rexMatchp("[lL]eft" xBias)
                        xOffset = width(bBox)/2.0 - viaEdgeCenter
                       )
                    ) ; ** cond rexMatchp **
                 ) ; ** when xBias **
                 when(stringp(yBias) && !rexMatchp("[cC]enter" yBias) && rows > 1
                    cond(
                       (rexMatchp("[uU]pper" xBias)
                        yOffset = viaEdgeCenter - height(bBox)/2.0
                       )
                       (rexMatchp("[lL]ower" xBias)
                        yOffset = height(bBox)/2.0 - viaEdgeCenter
                       )
                    ) ; ** cond rexMatchp **
                 ) ; ** when yBias **
                 inst~>originOffset = xOffset:yOffset
              else
                 fprintf(stdout "(E) apcCreateContact:  Offset bias ignored, because viaEdgeCenter was not a number (xBias=%L, yBias=%L\n" xBias yBias)
              ) ; ** if numberp **
           ) ; ** when xBias **
        else
           inst = dbCreateInst(cv master nil origin rotation)
           when(width
              inst~>l = width
           )
           when(height
              inst~>w = height
           )
           when(rows
              inst~>row = rows
           )
           when(columns
              inst~>column = columns
           )
           when(xPitch
              inst~>xPitch = xPitch
           )
           when(yPitch
              inst~>yPitch = yPitch
           )
           when(xBias
              inst~>xBias = xBias
           )
           when(yBias
              inst~>yBias = yBias
           )
        ) ; ** if isOA **
        inst    
      ) ; ** let **
    ) ; ** procedure apcCreateContact **
    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Tsien
    Tsien over 13 years ago

    Yes, that definitely helps.   Thanks for the reply.

     Its too bad that cadence doesn't improve the via accessibility through SKILL in OA.

     Tsien

    • 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