• 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. Modified parameters don't change layout pcells

Stats

  • Locked Locked
  • Replies 11
  • Subscribers 144
  • Views 7962
  • 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

Modified parameters don't change layout pcells

egolowen
egolowen over 11 years ago

Hi,

I am writing SKILL code in order to modify the parameters of layout instances, however even though the parameter has been properly modified, the layout pcell does not change (for example, if I increase the length of an nfet the property is the correct value but the layout instance remains the same size).

 I have tried using:
  foreach(prop properties
... 
prop~>value = param_value
...
)

and:
 dbReplaceProp(inst prop~>name 'string param_value)

But neither have fixed the issue.
Is there a better may to modify these parameters so the layout itself is updated properly? I was thinking of trying to use a replay file but that may not do the trick.

Thanks,
Elizabeth

  • Cancel
  • Andrew Beckett
    Andrew Beckett over 11 years ago

    Hi Elizabeth,

    The only explanation can be that you're not actually changing the pcell parameters. Maybe you have two sets of parameters - one that is used for the edit properties form, and one which is used for pcells, which are set via CDF callbacks, maybe?

    You could try calling code such as abInvokeCdfCallbacks or CCSinvokeCdfCallbacks (search on the forum or support.cadence.com for these), or you could check what the pcell parameters are actually called. To do this, select the instance in question and type:

    car(geGetSelSet())~>master~>superMaster~>parameters~>value~>name

    This will give you the names of all the pcell parameters for the device you have selected.

    Regards,

    Andrew.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Heywire
    Heywire over 8 years ago
    Hi Andrew,
    I am trying to change instance width/length in layout. And I am not able to use abInvokeCdfCallbacks or CCSinvokeCdfCallbacks procedures and dbReplaceProp() is giving error. Please help.

    Thank You,
    Anand
    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 8 years ago

    Anand,

    I'm not really sure how you think I can help without explaining:

    1. Why you are not able to use abInvokeCdfCallbacks or CCSinvokeCdfCallbacks
    2. What the error is that dbReplaceProp is giving

    Regards,

    Andrew.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Heywire
    Heywire over 8 years ago
    Hi Andrew,
    Thanks for reply.
    1. I am beginner in skill manipulation. I do not understand abInvokeCdfCallbacks or CCSinvokeCdfCallbacks procedures or how to use them.
    Could you please give me stand-alone procedure set here that can do the job?

    2. For example, dbReplaceProp(car(geGetSelSet()) car(geGetSelSet())~>w "float" 12.0u) command executes but no change is not reflected in layout.

    Or is there any other correct way to change width/length of instance in layout.

    Thanks,
    Anand
    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 8 years ago

    Anand,

    The first thing is to determine what the PCell parameters are actually called, and what type they are, and whether they are the same as the CDF parameters. Sometimes there are CDF parameters which you set, and then the CDF callbacks set the pcell parameters.

    To find out the pcell parameters on the instance, I suggest you select the instance and then execute:

    foreach(mapcar prop car(geGetSelSet())~>master~>parameters~>value list(prop~>name prop~>value prop~>valueType))

    This will output something like:

    (("fingers" 2.0 "float")
    ("tap" "Integrated" "string")
    ("fw" 4e-07 "float")
    ("l" 4.5e-08 "float")
    ("connectGates" "None" "string")
    ("connectSD" "None" "string")
    ("switchSD" "FALSE" "boolean")
    ("diffCont" "TRUE" "boolean")
    ("dfm" "Minimum" "string")
    ("mtlCvg" "" "string")
    ("sdMtlWidth" 6e-08 "float")
    ("leftAbut" 0 "int")
    ("rightAbut" 0 "int")
    ("topTap" "FALSE" "boolean")
    ("bottomTap" "FALSE" "boolean")
    ("leftTap" "TRUE" "boolean")
    ("rightTap" "FALSE" "boolean")
    ("tapExtension" "" "string")
    ("tapCntRows" 1 "int")
    )

    You could compare this with the default values (I highlighted in red the difference):

    foreach(mapcar prop car(geGetSelSet())~>master~>superMaster~>parameters~>value list(prop~>name prop~>value prop~>valueType))

    You can also then compare with the CDF parameters:

    foreach(mapcar param cdfGetInstCDF(car(geGetSelSet()))~>parameters list(param~>prompt param~>name param~>value param~>paramType))

    (("Model Name" "model" "g45p1svt" "string")
    ("Multiplier" "m" "1" "string")
    ("Simulation Multiplier" "simM" "iPar(\"m\")" "string")
    ("Length" "l" "45n" "string")
    ("Finger Width" "fw" "400n" "string")
    ("Total Width" "w" "800n" "string")
    ("Simulation Width" "simW" "400n" "string")
    ("Fingers" "fingers" "2" "string")
    ("AreaFormula" "AreaFormula" "((iPar(\"fingers\")+1)*0.5u+iPar(\"fingers\")*iPar(\"l\"))*(iPar(\"fw\")+0.5u)*iPar(\"m\")" "string")
    ("Folding Threshold" "threshold" "10u" "string")
    ("Diff Cont" "diffCont" t "boolean")
    ("Gate Connection" "connectGates" "None" "cyclic")
    ("Use DFM Rules" "dfm" "Minimum" "cyclic")
    ("S/D Metal Width" "sdMtlWidth" "60n" "string")
    ("S/D Connection" "connectSD" "None" "cyclic")
    ("Switch S/D" "switchSD" nil "boolean")
    ("Metal Coverage" "mtlCvg" "" "string")
    ("Left Abutment" "leftAbut" 0 "int")
    ("Right Abutment" "rightAbut" 0 "int")
    ("Bodytie Type" "tap" "Integrated" "cyclic")
    ("Left Tap" "leftTap" t "boolean")
    ("Right Tap" "rightTap" nil "boolean")
    ("Bottom Tap" "bottomTap" nil "boolean")
    ("Top Tap" "topTap" nil "boolean")
    ("Tap Extension" "tapExtension" "" "string")
    ("Tap Contact Rows" "tapCntRows" 1 "int")
    ("Show Sim Parameters" "showSimParams" nil "boolean")
    ("Edit Area & Perim" "editAreaPerim" nil "boolean")
    ("Drain diffusion area" "ad" "56f" "string")
    ("Source diffusion area" "as" "56f" "string")
    ("Drain diffusion periphery" "pd" "1.08u" "string")
    ("Source diffusion periphery" "ps" "1.08u" "string")
    ("Drain diffusion res squares" "nrd" "0.35" "string")
    ("Source diffusion res squares" "nrs" "0.35" "string")
    ("Left S/D Length (SA)" "sa" "140n" "string")
    ("Right S/D Length (SB)" "sb" "140n" "string")
    ("Gate Spacing (SD)" "sd" "160n" "string")
    ("SCA" "sca" "100.511" "string")
    ("SCB" "scb" "0.07485" "string")
    ("SCC" "scc" "0.01118" "string")
    ("Drain diffusion length" "ld" "" "string")
    ("Source diffusion length" "ls" "" "string")
    ("Device initially off" "off" nil "boolean")
    ("Drain source initial voltage" "Vds" "" "string")
    ("Gate source initial voltage" "Vgs" "" "string")
    ("Bulk source initial voltage" "Vbs" "" "string")
    ("Temp rise from ambient" "trise" "" "string")
    ("Source/drain selector" "geo" "" "string")
    ("Additional drain resistance" "rdc" "" "string")
    ("Additional source resistance" "rsc" "" "string")
    ("Temperature difference" "dtemp" "" "string")
    ("PAS Update Param List" "pasUpdateParamList" "fw, l" "string")
    )

    As you can see in my example, there are many more CDF parameters than pcell parameters.

    When you do your dbReplaceProp, if you are settings the PCell parameter directly and it has the right type, you should see the effect - assume that the PCell actually takes note of that parameter. If you need to call the callbacks (generally needed if the parameter names don't match between CDF and PCells, or if more than one PCell parameter changes when you change the parameter on the edit properties form), then you'd also then need to call:

    instId=car(geGetSelSet())
    abInvokeInstCdfCallbacks(instId)

    or the CCSinvokeInstCdfCallbacks equivalent - to make everything update as if you'd done it through the edit properties form.

    Hope this helps a bit!

    Regards,

    Andrew.

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

    Hi Andrew,

    The width/length dimension edit works fine using dbReplaceProp() the way you suggested. However, there are some parameters for example,  "sdMtlWidth", for which I can not  find equivalent  attribute/parameter name. So, is there an alternate way to edit S/D Met1 width using SKILL.  And when I  load below abInvokeInstCdfCallbacks() procedure in CIW for cdfcallbacks , i get - *Error* procedure: too few arguments (at least 2 expected, 1 given) - (abInvokeInstCdfCallbacks(instance \@key debug(nil) order callInitProc(nil) ... ))

    -------------------------------------------------------------------------------------------------------------

    (procedure (abInvokeInstCdfCallbacks instance @key (debug nil) order (callInitProc nil) (useInstCDF nil) (addFormFields nil) (filterFunc nil))

    (let (cdf) (when debug (printf " Invoking callbacks for instance '%s'\n" (dbGetq instance name)))

    (setq cdf (cdfGetInstCDF instance)) (unless useInstCDF (setq cdf (abCreateEffectiveCDFLookalike cdf)) (when addFormFields (abAddFormFieldsToEffectiveCDFLookalike cdf instance) ) )

    (abInvokeObjCdfCallbacks cdf ?debug debug ?order order ?callInitProc callInitProc ?setCdfgForm (null useInstCDF) ?filterFunc filterFunc ) ))

    -------------------------------------------------------------------------------------------------------------

    Kindly help.

    Thank you,

    Anand

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

    Anand,

    I thought I'd answered this, but having checked I don't see my reply here (must have had a senior moment!). Anyway, where are you seeing this parameter "sdMtlWidth"? How do you know there's a parameter called that? This is very specific to the technology/pcell you're using, so I can't really answer it from the description you've given without some more detail as to how you know this parameter exists. Maybe some pictures would help?

    As for the code problem, it sounds as if it's been incorrectly copied and pasted. There's a bit of a problem with the forums at the moment that copy and paste of code loses the formatting (I have IT looking into it). The workaround is to use a web browser on Linux (e.g. firefox) and rather than doing an explicit "copy" and "paste", select the text with the mouse and then use the middle mouse button to paste into your editor (on Linux). Hopefully then you won't mess up the brackets (that sounds as if what must have happened). That said, copying and pasting the code you posted above didn't have that problem - it suggests you have the parentheses in the wrong place somehow though.

    Regards,

    Andrew.

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

    Hi Andrew,

    Forgive me for my equivocal statements earlier. What i meant was - i am trying to find equivalent attribute for "sdMtlWidth" in my PDK. I can't find it neither in property edit form nor using its SKILL attribute so as to edit the S/D metal 1 width of  a MOS instance. 

    And to answer your other question about I using abInvokeInstCdfCallbacks(),  I get that error after i invoke that procedure using commands below

    instId=car(geGetSelSet())
    abInvokeInstCdfCallbacks(instId)

     after dbReplaceProp() for another parameter i think is CDF parameter and not at the time of loading abInvokeInstCdfCallbacks() procedure  itself. 

    Gratitude,

    Anand

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

    Anand,

    Maybe there isn't a parameter to control the metal width of the source/drain metal. Why do  you think there is one?

    I cannot see how calling those two lines of code can cause the error:

    *Error* procedure: too few arguments (at least 2 expected, 1 given) - (abInvokeInstCdfCallbacks(instance \@key debug(nil) order callInitProc(nil) ... ))

    That can only happen when the procedure function is called (i.e. when the procedure is being defined), which wouldn't be happening when you just invoke abInvokeInstCdfCallbacks. So what you're saying doesn't make sense, I'm afraid - I cannot see how that would be possible.

    Regards,

    Andrew.

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

    Hi Andrew,

    I thought there is a  parameter to control the S/D metal1 width, as in the reply post earlier you described commands to separately display CDF/PCELL parameters. In that you can find  "sdmetal1width", in the parameters list. 

    And albeit, it was really help from you to execute dbReplceProp()!. And I will try to use abInvokeCDFCallbacks() as you said.

    Thanks,

    Anand 

    • 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