• 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 7952
  • 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
Parents
  • 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
Reply
  • 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
Children
No Data

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