Home
  • Products
  • Solutions
  • Support
  • Company

This search text may be transcribed, used, stored, or accessed by our third-party service providers per our Cookie Policy and Privacy Policy.

This search text may be transcribed, used, stored, or accessed by our third-party service providers per our Cookie Policy and Privacy Policy.

  • Products
  • Solutions
  • Support
  • Company
Community PCell Designer Adding Terminal and Pins In Pcell Using Pcell Designer Tool...

Stats

  • State Not Answered
  • Locked Locked
  • Replies 3
  • Subscribers 9
  • Views 16074
  • 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

Adding Terminal and Pins In Pcell Using Pcell Designer Tool.

AkshayN
AkshayN over 5 years ago

Hi Everyone,

I want to add Terminals to my "multi-finger" Pcell created using Pcell Designer Tool, such that it will be Easier for me to highlight them to perform operation such as Adding source/drain/gate routing to the pcell. 

Can anyone tell how can i do that?

Also, if anyone has any kind of documentation on Cadence Pcell Designer Tool please Share, It will be Helpful

Thank You,

Akshay Naik

  • Cancel
Parents
  • Andrew Beckett
    0 Andrew Beckett over 5 years ago

    Hi Akshay,

    Attached is an example of a multi-finger MOS transistor which includes creating pins with a suitable pin connectivity model. In general it's easiest to create the pins and terminals as you go along and then copy will generally do the right thing as you construct your multi-finger device (this is easier than creating all the shapes and then trying to retrofit the connectivity).

    In the example (which you can load using Tools->Open Pcell Designer, and is set up to work with gpdk045 layers), you'll see the setup connectivity  method (one of the tabs) which looks like this:

    This is defining a source pin, a drain pin and then for the first gate, it's got pins at the top and bottom which are on the same terminal (in the OA connectivity model, that means these top and bottom pins are weakly connected, which is what you want for a gate pin).

    Then within the draw fingers method, the copy command has "must" set which means that it preserves the connectivity on the objects copied (the gate and gate pins in this case are copied) and creates a must-connect relationship between the pins. So that means that you must connect to each gate, and not both the top and bottom because of the week connect:

    You can alter this copy behaviour if you want the pins to be strongly connected (e.g. if you know they are joined inside the pcell) or you want a weak connect relationship.

    In general you want to have a good understanding of the OA pin connectivity model (multiple shapes on the same pin are strongly connected; multiple pins on the same terminal are weakly connected; must-connects require separate terminals with most of them "physOnly" and a must-join relationship defined between the terminals) but the commands available in PCell Designer make this very easy to implement.

    Regards,

    Andrew.

    Fullscreen mos_base_layout.pcd.txt Download
    ;;; PCell Designer File (format version 2.2)
    
    ;;; File-out of the PCell Designer pcell "NmosDemo24"/"mos_base"/"layout"
    
    (pcdPcell
    
    ;; Mixins
    ?mixins
    nil
    
    ;; Create CDF?
    ?createCDF
    t
    
    ;; Reference cell for CDF
    ?referenceCDF
    nil
    
    ;; Main points
    ?mainPoints
    nil
    
    ;; Initial size
    ?initSize
    nil
    
    ;; Device Variables
    ?devVars
    nil
    
    ;; Device Variables visible to the commands
    ?guiVisibleDevVarNames
    nil
    
    ;; Methods used as commands
    ?methodCommands
    nil
    
    ;; PCell and CDF Parameters
    ?classEditorChanges
    ((nil name "l" nature both type number units "lengthMetric" value "45n" prompt "Gate Length") (nil name "w" nature both type number units "lengthMetric" value "120n" prompt "Finger Width") (nil name "fingers" nature both type int value "1" prompt "Fingers") (nil nature pcell name "abuttedLeft" type boolean value "nil") (nil nature pcell name "abuttedRight" type boolean value "nil") (nil choices (None Top Bottom Both) nature both name "gateconn" type cyclic value "None" prompt "Gate Connection") (nil choices (None Source Drain Both) nature both name "sdconn" type cyclic value "None" prompt "S/D Connection") (nil nature both name "swapsd" type boolean value "nil" prompt "Swap S/D"))
    
    ;; Simulation Information
    ?simulation
    (simulation)
    
    ;; Source Cell View
    ?sourceCellView
    ("NmosDemo24" "mos_base" "layout")
    
    ;; Last Edited with PCell Designer Version
    ?pcdVersion
    "2-5-5"
    
    ;; Method definitions
    ?methods
    ((newCommand command (newCommand ?name draw\ implant ?commandClass pcmdCommand ?category "MOS" ?help nil ?parameters (implant (layer nil ?valuep t ?requiredp t ?isExpression nil ?keyword t) well (layer nil ?valuep t ?requiredp t ?isExpression nil ?keyword t))) body ((group ?renderInfo (?renderAsFigGroup nil) name (group "implant" ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The name of the group to create") body (body ((rectangle name (lvalue "" ?valuep nil ?requiredp nil ?isExpression nil ?keyword nil ?help "The created rectangles, if any.") layer (layer "well" ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The layer or LPP for the created rectangles.") source (geo (geo type "Expression" points nil group "" name nil expression (grow (evalstringBbox "0.06" "0.06" "0.06" "0.06") (group ("active")))) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The bounding boxes of the rectangles to create.")) (polygon name (lvalue "" ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The created polygons, if any.") layer (layer "implant" ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The layer or LPP for the created polygons.") source (geo (geo type "Expression" points nil group "" name nil expression (lor (grow (evalstringBbox "0.07" "0.07" "0.07" "0.07") (group ("active"))) (grow (evalstringBbox "0.1" "0.1" "0.1" "0.1") (land (group ("active")) (group ("gate")))))) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The outlines of the polygons to create."))) ?valuep t ?requiredp t ?isExpression t ?keyword nil) lock (boolean nil ?valuep t ?requiredp t ?isExpression t ?keyword t ?help "Lock the shapes of a group in a figgroup")))) (newCommand command (newCommand ?name setup\ connectivity ?commandClass pcmdCommand ?category "MOS" ?help nil ?parameters (source_term (string "S" ?valuep t ?requiredp t ?isExpression nil ?keyword t) drain_term (string "D" ?valuep t ?requiredp t ?isExpression nil ?keyword t) gate_term (string "G" ?valuep t ?requiredp t ?isExpression nil ?keyword t))) body ((terminal name (string "source_term" ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The name of the terminal to create or re-use.") direction (terminal_direction input ?valuep t ?requiredp t ?isExpression nil ?keyword t ?help "The terminal direction") retain (boolean "nil" ?valuep t ?requiredp t ?isExpression nil ?keyword t ?help "Do not delete this terminal, even if no associated pins were created.") body (body ((pin name (string "" ?valuep nil ?requiredp nil ?isExpression nil ?keyword t ?help "If given, the name for the new pin. If ommitted, a name will be generated automatically.") accessDirection (pinfig_access ("left") ?valuep nil ?requiredp nil ?isExpression nil ?keyword t ?help "The access direction of the new pin") body (body ((geometry name (lvalue "" ?valuep nil ?requiredp nil ?isExpression nil ?keyword nil ?help "The result of the geometry query.") geo (geo (geo grow 0 type "Group" points nil group "source" name nil expression nil) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The geometry query to evaluate.") results (geo_query_results_enum geo ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The result type.") first_result_only (boolean "nil" ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "If true, return only the first result found."))) ?valuep t ?requiredp t ?isExpression t ?keyword nil))) ?valuep t ?requiredp t ?isExpression t ?keyword nil)) (terminal name (string "drain_term" ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The name of the terminal to create or re-use.") direction (terminal_direction output ?valuep t ?requiredp t ?isExpression nil ?keyword t ?help "The terminal direction") retain (boolean "nil" ?valuep t ?requiredp t ?isExpression nil ?keyword t ?help "Do not delete this terminal, even if no associated pins were created.") body (body ((pin name (string "" ?valuep nil ?requiredp nil ?isExpression nil ?keyword t ?help "If given, the name for the new pin. If ommitted, a name will be generated automatically.") accessDirection (pinfig_access ("left") ?valuep nil ?requiredp nil ?isExpression nil ?keyword t ?help "The access direction of the new pin") body (body ((geometry name (lvalue "" ?valuep nil ?requiredp nil ?isExpression nil ?keyword nil ?help "The result of the geometry query.") geo (geo (geo grow 0 type "Group" points nil group "drain" name nil expression nil) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The geometry query to evaluate.") results (geo_query_results_enum geo ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The result type.") first_result_only (boolean "nil" ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "If true, return only the first result found."))) ?valuep t ?requiredp t ?isExpression t ?keyword nil))) ?valuep t ?requiredp t ?isExpression t ?keyword nil)) (group ?renderInfo (?renderAsFigGroup nil) name (group "gate_pins" ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The name of the group to create") body (body ((terminal name (string "gate_term" ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The name of the terminal to create or re-use.") direction (terminal_direction inputOutput ?valuep t ?requiredp t ?isExpression nil ?keyword t ?help "The terminal direction") retain (boolean "nil" ?valuep t ?requiredp t ?isExpression nil ?keyword t ?help "Do not delete this terminal, even if no associated pins were created.") body (body ((pin name (string "" ?valuep nil ?requiredp nil ?isExpression nil ?keyword t ?help "If given, the name for the new pin. If ommitted, a name will be generated automatically.") accessDirection (pinfig_access ("left") ?valuep nil ?requiredp nil ?isExpression nil ?keyword t ?help "The access direction of the new pin") body (body ((rectangle name (lvalue "" ?valuep nil ?requiredp nil ?isExpression nil ?keyword nil ?help "The created rectangles, if any.") layer (layer "(\"Poly\" \"drawing\")" ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The layer or LPP for the created rectangles.") source (geo (geo type "Expression" points nil group "" name nil net nil expression (append (landnot (bisect "north" (group ("gate"))) (group ("active"))))) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The bounding boxes of the rectangles to create."))) ?valuep t ?requiredp t ?isExpression t ?keyword nil)) (pin name (string "" ?valuep nil ?requiredp nil ?isExpression nil ?keyword t ?help "If given, the name for the new pin. If ommitted, a name will be generated automatically.") accessDirection (pinfig_access ("left") ?valuep nil ?requiredp nil ?isExpression nil ?keyword t ?help "The access direction of the new pin") body (body ((rectangle name (lvalue "" ?valuep nil ?requiredp nil ?isExpression nil ?keyword nil ?help "The created rectangles, if any.") layer (layer "(\"Poly\" \"drawing\")" ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The layer or LPP for the created rectangles.") source (geo (geo type "Expression" points nil group "" name nil net nil expression (append (landnot (bisect "south" (group ("gate"))) (group ("active"))))) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The bounding boxes of the rectangles to create."))) ?valuep t ?requiredp t ?isExpression t ?keyword nil))) ?valuep t ?requiredp t ?isExpression t ?keyword nil))) ?valuep t ?requiredp t ?isExpression t ?keyword nil) lock (boolean nil ?valuep t ?requiredp t ?isExpression nil ?keyword t ?help "Lock the shapes of a group in a figgroup")))) (newCommand command (newCommand ?name setup\ abutment ?commandClass pcmdCommand ?category "MOS" ?help nil ?parameters (firstSD (geo (geo type "Name" points nil group "" name "firstSD" expression nil) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword t) lastSD (geo (geo type "Name" points nil group "" name "lastSD" expression nil) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword t))) body ((distance ?comment "Measure the width of the Oxide pin, which tfbTestAbut will need" name (lvalue "sdOxideWidth" ?valuep t ?requiredp nil ?isExpression nil ?keyword nil ?help "The shortest distance of those measured.") from (geo (geo type "Expression" points nil group "" name nil expression (edge "west" (layer readstring("(\"Oxide\" \"drawing\")") (name "firstSD")))) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "One or more points, outlines, or shapes.") from_handle (handle (point northWest) ?valuep nil ?requiredp nil ?isExpression nil ?keyword t ?help "Handle at the source shape for the measurement.") to (geo (geo type "Expression" points nil group "" name nil expression (edge "east" (layer readstring("(\"Oxide\" \"drawing\")") (name "firstSD")))) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "One or more points, outlines, or shapes.") to_handle (handle (point northWest) ?valuep nil ?requiredp nil ?isExpression nil ?keyword t ?help "Handle for the measurement target.") result_type (distance_type length ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The format to return the disantce in.") body (body nil ?valuep t ?requiredp t ?isExpression t ?keyword nil)) (skill\ abutment ?comment "Left abutment" source (geo (geo type "Expression" points nil group "" name "firstSD" expression (layer readstring("(\"Oxide\" \"drawing\")") (name "firstSD"))) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "Any figures found here will have abutment properties set on them.") abutment_function (string "tfbTestAbut" ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The name of a pre-existing abutment function.") directions (pinfig_access ("right" "left") ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The value of the <code>abutAccessDir</code> property.") abutClass (string "" ?valuep nil ?requiredp nil ?isExpression nil ?keyword t ?help "The value of the <code>abutClass</code> property. If not given, the default will be <code>pcd</code>") inst_spacing (boolean "nil" ?valuep t ?requiredp t ?isExpression nil ?keyword t ?help "If true (the default), <code>vxlInstSpacingRule</code> will be set to <code>abutFunction</code> to <code>t</code> and <code>vxlInstSpacingDir</code> to the value of <i>abutAccessDir</i>") props (names_and_values (("tfbDistance" "sdOxideWidth") ("tfbParam" "\"abuttedLeft\"")) ?valuep t ?requiredp t ?isExpression nil ?keyword t ?help "Any additional name/value pairs here will be set as properties on the source figures.")) (skill\ abutment ?comment "Right abutment" source (geo (geo type "Expression" points nil group "" name "lastSD" expression (layer readstring("(\"Oxide\" \"drawing\")") (name "lastSD"))) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "Any figures found here will have abutment properties set on them.") abutment_function (string "tfbTestAbut" ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The name of a pre-existing abutment function.") directions (pinfig_access ("left" "right") ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The value of the <code>abutAccessDir</code> property.") abutClass (string "" ?valuep nil ?requiredp nil ?isExpression nil ?keyword t ?help "The value of the <code>abutClass</code> property. If not given, the default will be <code>pcd</code>") inst_spacing (boolean "nil" ?valuep t ?requiredp t ?isExpression nil ?keyword t ?help "If true (the default), <code>vxlInstSpacingRule</code> will be set to <code>abutFunction</code> to <code>t</code> and <code>vxlInstSpacingDir</code> to the value of <i>abutAccessDir</i>") props (names_and_values (("tfbDistance" "sdOxideWidth") ("tfbParam" "\"abuttedRight\"")) ?valuep t ?requiredp t ?isExpression nil ?keyword t ?help "Any additional name/value pairs here will be set as properties on the source figures.")) when(?comment "When abutted, remove left geometry" condition (string "abuttedLeft" ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The condition to check.") then (body (delete(?comment "" source (geo (geo type "Expression" points nil group "" name nil expression ((name "firstSD") - (layer readstring("(\"Oxide\" \"drawing\")") (name "firstSD")))) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The shapes to delete.") reference (geo (geo grow 0 type "Group" points nil group nil name nil expression nil) ?lazyp nil ?valuep nil ?requiredp nil ?isExpression t ?keyword nil ?help "If given, only shapes overlapping <i>reference</i> will be deleted."))) ?valuep t ?requiredp t ?isExpression t ?keyword nil)) when(?comment "When abutted, remove right geometry" condition (string "abuttedRight" ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The condition to check.") then (body (delete(source (geo (geo type "Expression" points nil group "" name nil expression ((name "lastSD") - (layer readstring("(\"Oxide\" \"drawing\")") (name "lastSD")))) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The shapes to delete.") reference (geo (geo grow 0 type "Group" points nil group nil name nil expression nil) ?lazyp nil ?valuep nil ?requiredp nil ?isExpression t ?keyword nil ?help "If given, only shapes overlapping <i>reference</i> will be deleted."))) ?valuep t ?requiredp t ?isExpression t ?keyword nil)))) (newCommand command (newCommand ?name baseShapes ?commandClass pcmdCommand ?category "MOS" ?help nil ?parameters nil) body ((group ?renderInfo (?renderAsFigGroup nil) ?comment " " name (group "source" ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The name of the group to create") body (body ((rectangle name (lvalue "" ?valuep t ?requiredp nil ?isExpression nil ?keyword nil ?help "The created rectangles, if any.") layer (layer ("Metal1" "drawing") ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The layer or LPP for the created rectangles.") source (geo (geo type "Points" points ((-0.11 0.0) (-0.05 0.0) (-0.05 0.12) (-0.11 0.12))) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The bounding boxes of the rectangles to create.")) (rectangle ?comment "" name (lvalue "" ?valuep t ?requiredp nil ?isExpression nil ?keyword nil ?help "The created rectangles, if any.") layer (layer ("Oxide" "drawing") ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The layer or LPP for the created rectangles.") source (geo (geo type "Points" points ((-0.14 0.0) (-0.02 0.0) (-0.02 0.12) (-0.14 0.12))) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The bounding boxes of the rectangles to create."))) ?valuep t ?requiredp t ?isExpression t ?keyword nil) lock (boolean nil ?valuep t ?requiredp t ?isExpression t ?keyword t ?help "Lock the shapes of a group in a figgroup")) (group ?renderInfo (?renderAsFigGroup nil) name (group "drain" ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The name of the group to create") body (body ((rectangle name (lvalue "" ?valuep t ?requiredp nil ?isExpression nil ?keyword nil ?help "The created rectangles, if any.") layer (layer ("Metal1" "drawing") ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The layer or LPP for the created rectangles.") source (geo (geo type "Points" points ((0.095 0.0) (0.155 0.0) (0.155 0.12) (0.095 0.12))) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The bounding boxes of the rectangles to create.")) (rectangle name (lvalue "" ?valuep t ?requiredp nil ?isExpression nil ?keyword nil ?help "The created rectangles, if any.") layer (layer ("Oxide" "drawing") ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The layer or LPP for the created rectangles.") source (geo (geo type "Points" points ((0.065 0.0) (0.185 0.0) (0.185 0.12) (0.065 0.12))) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The bounding boxes of the rectangles to create."))) ?valuep t ?requiredp t ?isExpression t ?keyword nil) lock (boolean nil ?valuep t ?requiredp t ?isExpression t ?keyword t ?help "Lock the shapes of a group in a figgroup")) (group ?renderInfo (?renderAsFigGroup nil) name (group "gate" ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The name of the group to create") body (body ((rectangle name (lvalue "" ?valuep t ?requiredp nil ?isExpression nil ?keyword nil ?help "The created rectangles, if any.") layer (layer ("Poly" "drawing") ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The layer or LPP for the created rectangles.") source (geo (geo type "Points" points ((0.0 -0.1) (0.045 -0.1) (0.045 0.22) (0.0 0.22))) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The bounding boxes of the rectangles to create."))) ?valuep t ?requiredp t ?isExpression t ?keyword nil) lock (boolean nil ?valuep t ?requiredp t ?isExpression t ?keyword t ?help "Lock the shapes of a group in a figgroup")) (group ?renderInfo (?renderAsFigGroup nil) name (group "active" ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The name of the group to create") body (body ((rectangle name (lvalue "" ?valuep t ?requiredp nil ?isExpression nil ?keyword nil ?help "The created rectangles, if any.") layer (layer ("Oxide" "drawing") ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The layer or LPP for the created rectangles.") source (geo (geo type "Points" points ((-0.14 0.0) (0.185 0.0) (0.185 0.12) (-0.14 0.12))) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The bounding boxes of the rectangles to create."))) ?valuep t ?requiredp t ?isExpression t ?keyword nil) lock (boolean nil ?valuep t ?requiredp t ?isExpression t ?keyword t ?help "Lock the shapes of a group in a figgroup")) (group ?renderInfo (?renderAsFigGroup nil) name (group "implant" ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The name of the group to create") body (body nil ?valuep t ?requiredp t ?isExpression t ?keyword nil) lock (boolean nil ?valuep t ?requiredp t ?isExpression t ?keyword t ?help "Lock the shapes of a group in a figgroup")) (group ?renderInfo (?renderAsFigGroup nil) name (group "via" ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The name of the group to create") body (body ((para body (body ((via name (lvalue "" ?valuep t ?requiredp nil ?isExpression nil ?keyword nil ?help "The created vias, if any.") viaName (string "M1_DIFF" ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The name of the standard via definition to use.") transform (transformation ((0.125 0.06) "R0" 1.0) ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The point and rotation for the created via.") paramList (sexp nil ?valuep t ?requiredp t ?isExpression nil ?keyword nil))) ?valuep t ?requiredp t ?isExpression t ?keyword nil) scratch (boolean t ?valuep t ?requiredp t ?isExpression t ?keyword t))) ?valuep t ?requiredp t ?isExpression t ?keyword nil) lock (boolean nil ?valuep t ?requiredp t ?isExpression t ?keyword t ?help "Lock the shapes of a group in a figgroup")) (group ?renderInfo (?renderAsFigGroup nil) name (group "gate_via" ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The name of the group to create") body (body ((para body (body ((via name (lvalue "" ?valuep t ?requiredp nil ?isExpression nil ?keyword nil ?help "The created vias, if any.") viaName (string "M1_PO" ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The name of the standard via definition to use.") transform (transformation ((0.06 0.32) "R90" 1.0) ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The point and rotation for the created via.") paramList (sexp nil ?valuep t ?requiredp t ?isExpression nil ?keyword nil))) ?valuep t ?requiredp t ?isExpression t ?keyword nil) scratch (boolean t ?valuep t ?requiredp t ?isExpression t ?keyword t))) ?valuep t ?requiredp t ?isExpression t ?keyword nil) lock (boolean nil ?valuep t ?requiredp t ?isExpression t ?keyword t ?help "Lock the shapes of a group in a figgroup")))) (newCommand command (newCommand ?name draw\ fingers ?commandClass pcmdCommand ?category "MOS" ?help nil ?parameters (firstSD (lvalue nil ?valuep t ?requiredp t ?isExpression t ?keyword t) lastSD (lvalue nil ?valuep t ?requiredp t ?isExpression t ?keyword t))) body ((distance name (lvalue "pitch" ?valuep t ?requiredp nil ?isExpression nil ?keyword nil ?help "The shortest distance of those measured.") from (geo (geo type "Expression" points nil group "" name nil expression (edge "west" (layer readstring("(\"Metal1\" \"drawing\")") (group ("source"))))) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "One or more points, outlines, or shapes.") from_handle (handle (point northWest) ?valuep nil ?requiredp nil ?isExpression nil ?keyword t ?help "Handle at the source shape for the measurement.") to (geo (geo type "Expression" points nil group "" name nil expression (edge "west" (layer readstring("(\"Metal1\" \"drawing\")") (group ("drain"))))) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "One or more points, outlines, or shapes.") to_handle (handle (point northWest) ?valuep nil ?requiredp nil ?isExpression nil ?keyword t ?help "Handle for the measurement target.") result_type (distance_type length ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The format to return the disantce in.") body (body nil ?valuep t ?requiredp t ?isExpression t ?keyword nil)) (geometry ?comment "" name (lvalue "firstSD" ?valuep t ?requiredp nil ?isExpression nil ?keyword nil ?help "The result of the geometry query.") geo (geo (geo grow 0 type "Group" points nil group "source" name nil expression nil) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The geometry query to evaluate.") results (geo_query_results_enum geo ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The result type.") first_result_only (boolean "nil" ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "If true, return only the first result found.")) (geometry ?comment "" name (lvalue "lastSD" ?valuep t ?requiredp nil ?isExpression nil ?keyword nil ?help "The result of the geometry query.") geo (geo (geo grow 0 type "Group" points nil group "drain" name nil expression nil) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The geometry query to evaluate.") results (geo_query_results_enum geo ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The result type.") first_result_only (boolean "nil" ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "If true, return only the first result found.")) (repeat ?comment "" count_variable (binding "n" ?valuep t ?requiredp nil ?isExpression nil ?keyword nil ?help "If given, this name will be visible during execution of the body, with values counting up from 0.") repeat (int "fingers-1" ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "Number of times to execute the body.") body (body ((transforming name (lvalue "trf" ?valuep t ?requiredp nil ?isExpression nil ?keyword nil ?help "The most recent transformation.") transform (transformation (("pitch" "0") "R0" 1.0) ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The amount by which to shift the current transformation.") body (body ((copy name (lvalue "" ?valuep nil ?requiredp nil ?isExpression nil ?keyword nil ?help "The newly created shapes.") source (geo (geo grow 0 type "Group" points nil group ("gate" "gate_pins") name nil net nil expression nil) ?lazyp t ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The shapes to copy.") transform (transformation (("0" "0") "R0" 1.0) ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The transformation from the original to the copy, for each shape copied. If there is a current transform in place, this transform will be added after it.") preserve_groups (boolean t ?valuep t ?requiredp t ?isExpression nil ?keyword t ?help "If true, the copied shapes will be added back to the groups their sources are in.") preserve_para (boolean t ?valuep t ?requiredp t ?isExpression nil ?keyword t ?help "If true, copies of para shapes will themselves be para shapes.") preserve_color (boolean nil ?valuep t ?requiredp t ?isExpression t ?keyword t ?help "If true, copies of shapes will retain the color of the original. Otherwise, they will be grey.") connectivity (copy_connectivity must ?valuep t ?requiredp t ?isExpression nil ?keyword t ?help "Determines the connectivity relationship of the original shapes to the new copies.") repeat (int "1" ?valuep nil ?requiredp nil ?isExpression t ?keyword t ?help "Number of copies to create.")) if(condition (string "evenp(n)" ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The condition.") then (body ((copy ?comment "" name (lvalue "lastSD" ?valuep t ?requiredp nil ?isExpression nil ?keyword nil ?help "The newly created shapes.") source (geo (geo grow 0 type "Group" points nil group "source" name nil expression nil) ?lazyp t ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The shapes to copy.") transform (transformation (("pitch" "0") "R0" 1.0) ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The transformation from the original to the copy, for each shape copied. If there is a current transform in place, this transform will be added after it.") preserve_groups (boolean "t" ?valuep t ?requiredp t ?isExpression nil ?keyword t ?help "If true, the copied shapes will be added back to the groups their sources are in.") preserve_para (boolean "t" ?valuep t ?requiredp t ?isExpression nil ?keyword t ?help "If true, copies of para shapes will themselves be para shapes.") preserve_color (boolean nil ?valuep t ?requiredp t ?isExpression t ?keyword t ?help "If true, copies of shapes will retain the color of the original. Otherwise, they will be grey.") connectivity (copy_connectivity must ?valuep t ?requiredp t ?isExpression nil ?keyword t ?help "Determines the connectivity relationship of the original shapes to the new copies.") repeat (int "1" ?valuep nil ?requiredp nil ?isExpression t ?keyword t ?help "Number of copies to create."))) ?valuep t ?requiredp t ?isExpression t ?keyword nil) else (body ((copy name (lvalue "lastSD" ?valuep t ?requiredp nil ?isExpression nil ?keyword nil ?help "The newly created shapes.") source (geo (geo grow 0 type "Group" points nil group "drain" name nil expression nil) ?lazyp t ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The shapes to copy.") transform (transformation (("0" "0") "R0" 1.0) ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The transformation from the original to the copy, for each shape copied. If there is a current transform in place, this transform will be added after it.") preserve_groups (boolean "t" ?valuep t ?requiredp t ?isExpression nil ?keyword t ?help "If true, the copied shapes will be added back to the groups their sources are in.") preserve_para (boolean "t" ?valuep t ?requiredp t ?isExpression nil ?keyword t ?help "If true, copies of para shapes will themselves be para shapes.") preserve_color (boolean nil ?valuep t ?requiredp t ?isExpression t ?keyword t ?help "If true, copies of shapes will retain the color of the original. Otherwise, they will be grey.") connectivity (copy_connectivity must ?valuep t ?requiredp t ?isExpression nil ?keyword t ?help "Determines the connectivity relationship of the original shapes to the new copies.") repeat (int "1" ?valuep nil ?requiredp nil ?isExpression t ?keyword t ?help "Number of copies to create."))) ?valuep t ?requiredp t ?isExpression t ?keyword nil))) ?valuep t ?requiredp t ?isExpression t ?keyword nil))) ?valuep t ?requiredp t ?isExpression t ?keyword nil)) (use\ transform transform (sexp "trf" ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The transform to use. This should have the form of a Cadence standard transform: ((<i>dX</i> <i>dY</i>) <i>rotation</i>)") body (body ((stretch source (geo (geo grow 0 type "Group" points nil group ("active" "implant") name nil expression nil) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The shapes to stretch.") reference (geo (geo type "Expression" points nil group nil name nil expression nil) ?lazyp nil ?valuep nil ?requiredp nil ?isExpression t ?keyword nil ?help "Reference shapes to select the edges to be stretched.") compass (compass nil ?valuep nil ?requiredp nil ?isExpression nil ?keyword nil ?help "Stretch direction.") transform (transformation (("0" "0") "R0" 1.0) ?valuep t ?requiredp nil ?isExpression nil ?keyword nil ?help "Amount of the stretch. Any current transform will be taken into account."))) ?valuep t ?requiredp t ?isExpression t ?keyword nil)))) (newCommand command (newCommand ?name sdstretch ?commandClass pcmdCommand ?category "MOS" ?help nil ?parameters (w (float "0.0" ?valuep t ?requiredp t ?isExpression t ?keyword t) l (float "0.0" ?valuep t ?requiredp t ?isExpression t ?keyword t))) body ((height name (lvalue "initW" ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The measured height or heights.") geo (geo (geo type "Expression" points nil group "" name nil expression (layer readstring("(\"Metal1\" \"drawing\")") (group ("source")))) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The shapes to measure.") first_result_only (boolean "t" ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "If true, only the first measured height is returned, otherwise a list of all heights is returned.")) (width name (lvalue "initL" ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The measured width.") geo (geo (geo type "Expression" points nil group "" name nil expression (layer readstring("(\"Poly\" \"drawing\")") (group ("gate")))) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The shapes to measure.") first_result_only (boolean "t" ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "If true, only the first width is returned, otherwise return a list of all measured widths, one per shape.")) (stretch source (geo (geo grow 0 type "Group" points nil group ("active" "drain" "gate" "implant" "source") name nil expression nil) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The shapes to stretch.") reference (geo (geo type "Expression" points nil group nil name nil expression nil) ?lazyp nil ?valuep nil ?requiredp nil ?isExpression t ?keyword nil ?help "Reference shapes to select the edges to be stretched.") compass (compass nil ?valuep nil ?requiredp nil ?isExpression nil ?keyword nil ?help "Stretch direction.") transform (transformation (("0" "w-initW") "R0" 1.0) ?valuep t ?requiredp nil ?isExpression nil ?keyword nil ?help "Amount of the stretch. Any current transform will be taken into account.")) (stretch source (geo (geo grow 0 type "Group" points nil group ("active" "drain" "gate" "implant") name nil expression nil) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The shapes to stretch.") reference (geo (geo type "Expression" points nil group nil name nil expression nil) ?lazyp nil ?valuep nil ?requiredp nil ?isExpression t ?keyword nil ?help "Reference shapes to select the edges to be stretched.") compass (compass east ?valuep t ?requiredp nil ?isExpression nil ?keyword nil ?help "Stretch direction.") transform (transformation (("l-initL" "0") "R0" 1.0) ?valuep t ?requiredp nil ?isExpression nil ?keyword nil ?help "Amount of the stretch. Any current transform will be taken into account.")) (group ?renderInfo (?renderAsFigGroup nil) name (group "source" ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The name of the group to create") body (body ((via\ fill via (geo (geo grow 0 type "Group" points nil group "via" name "" expression nil) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The via or vias to use.") target (geo (geo type "Expression" points nil group "" name nil expression (layer readstring("(\"Oxide\" \"drawing\")") (group ("source")))) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword t ?help "The region to be filled.") enclosure (enclosure "0.0" ?valuep t ?requiredp t ?isExpression t ?keyword t ?help "The minimum spacing between the vias and the region boundary.") justifyx (xfill "center" ?valuep t ?requiredp t ?isExpression nil ?keyword t ?help "Justification in X direction.") justifyy (yfill "center" ?valuep t ?requiredp t ?isExpression nil ?keyword t ?help "Justification in Y direction.") body (body nil ?valuep t ?requiredp t ?isExpression t ?keyword t))) ?valuep t ?requiredp t ?isExpression t ?keyword nil) lock (boolean nil ?valuep t ?requiredp t ?isExpression t ?keyword t ?help "Lock the shapes of a group in a figgroup")) (group ?renderInfo (?renderAsFigGroup nil) name (group "drain" ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The name of the group to create") body (body ((via\ fill via (geo (geo grow 0 type "Group" points nil group "via" name "" expression nil) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The via or vias to use.") target (geo (geo type "Expression" points nil group "" name nil expression (layer readstring("(\"Oxide\" \"drawing\")") (group ("drain")))) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword t ?help "The region to be filled.") enclosure (enclosure "0.0" ?valuep t ?requiredp t ?isExpression t ?keyword t ?help "The minimum spacing between the vias and the region boundary.") justifyx (xfill "center" ?valuep t ?requiredp t ?isExpression nil ?keyword t ?help "Justification in X direction.") justifyy (yfill "center" ?valuep t ?requiredp t ?isExpression nil ?keyword t ?help "Justification in Y direction.") body (body nil ?valuep t ?requiredp t ?isExpression t ?keyword t))) ?valuep t ?requiredp t ?isExpression t ?keyword nil) lock (boolean nil ?valuep t ?requiredp t ?isExpression t ?keyword t ?help "Lock the shapes of a group in a figgroup")))) (newCommand command (newCommand ?name route ?commandClass pcmdCommand ?category "MOS" ?help nil ?parameters (name (lvalue "" ?valuep t ?requiredp t ?isExpression nil ?keyword t) trunk (lvalue "" ?valuep t ?requiredp t ?isExpression nil ?keyword t) source_shapes (geo (geo grow 0 type "Group" points nil group nil name nil expression nil) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword t) layer (layer "(\"Metal1\" \"drawing\")" ?valuep t ?requiredp t ?isExpression nil ?keyword t) side (compass north ?valuep t ?requiredp t ?isExpression nil ?keyword t) width (float "0.1" ?valuep t ?requiredp t ?isExpression t ?keyword t) avoid_layer (layer "(\"Metal1\" \"drawing\")" ?valuep t ?requiredp t ?isExpression nil ?keyword t))) body (set(settings (settings (("gap" "0.05" ?alert nil)) ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The name/value pairs to set.")) (rectangle name (lvalue "routing" ?valuep t ?requiredp nil ?isExpression nil ?keyword nil ?help "The created rectangles, if any.") layer (layer "layer" ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The layer or LPP for the created rectangles.") source (geo (geo type "Expression" points nil group "" name nil expression (grow (evalstringBbox "0.0" "0.0" "0.0" "gap") (edge evalstring("side") (layer evalstring("layer") (name "source_shapes"))))) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The bounding boxes of the rectangles to create.")) when(condition (string "side=='south" ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The condition to check.") then (body ((move source (geo (geo type "Name" points nil group "" name "routing" expression nil) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The shapes to move.") transform (transformation (("0" "-gap") "R0" 1.0) ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The amount to move the shapes. Any current transformation will be taken into account."))) ?valuep t ?requiredp t ?isExpression t ?keyword nil)) (distance name (lvalue "d" ?valuep t ?requiredp nil ?isExpression nil ?keyword nil ?help "The shortest distance of those measured.") from (geo (geo type "Expression" points nil group "" name nil expression (edge evalstring("side") (bbox (name "routing")))) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "One or more points, outlines, or shapes.") from_handle (handle (point northWest) ?valuep nil ?requiredp nil ?isExpression nil ?keyword t ?help "Handle at the source shape for the measurement.") to (geo (geo type "Expression" points nil group "" name nil expression (edge evalstring("side") (bbox (layer evalstring("layer") (shapes)) (layer evalstring("avoid_layer") (shapes))))) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "One or more points, outlines, or shapes.") to_handle (handle (point northWest) ?valuep nil ?requiredp nil ?isExpression nil ?keyword t ?help "Handle for the measurement target.") result_type (distance_type transformation ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The format to return the disantce in.") body (body ((stretch source (geo (geo type "Name" points nil group "" name "routing" expression nil) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The shapes to stretch.") reference (geo (geo type "Expression" points nil group nil name nil expression nil) ?lazyp nil ?valuep nil ?requiredp nil ?isExpression t ?keyword nil ?help "Reference shapes to select the edges to be stretched.") compass (compass nil ?valuep nil ?requiredp nil ?isExpression nil ?keyword nil ?help "Stretch direction.") transform (transformation (("0" "0") "R0" 1.0) ?valuep t ?requiredp nil ?isExpression nil ?keyword nil ?help "Amount of the stretch. Any current transform will be taken into account."))) ?valuep t ?requiredp t ?isExpression t ?keyword nil)) (rectangle name (lvalue "trunk" ?valuep t ?requiredp nil ?isExpression nil ?keyword nil ?help "The created rectangles, if any.") layer (layer "layer" ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The layer or LPP for the created rectangles.") source (geo (geo type "Expression" points nil group "" name nil expression (grow (evalstringBbox "0.0" "0.0" "0.0" "width") (edge evalstring("side") (bbox (name "routing"))))) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The bounding boxes of the rectangles to create.")) when(condition (string "side=='south" ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The condition to check.") then (body ((move source (geo (geo type "Name" points nil group "" name "trunk" expression nil) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The shapes to move.") transform (transformation (("0" "-width") "R0" 1.0) ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The amount to move the shapes. Any current transformation will be taken into account."))) ?valuep t ?requiredp t ?isExpression t ?keyword nil)) (geometry name (lvalue "name" ?valuep t ?requiredp nil ?isExpression nil ?keyword nil ?help "The result of the geometry query.") geo (geo (geo type "Name" points nil group "" name ("routing" "trunk") expression nil) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The geometry query to evaluate.") results (geo_query_results_enum geo ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The result type.") first_result_only (boolean "nil" ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "If true, return only the first result found.")))) (method command draw body ((baseShapes ?comment " ") (sdstretch ?comment " " w (float "w" ?valuep t ?requiredp t ?isExpression t ?keyword t) l (float "l" ?valuep t ?requiredp t ?isExpression t ?keyword t)) if(condition (string "swapsd" ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The condition.") then (body ((setup\ connectivity source_term (string "D" ?valuep t ?requiredp t ?isExpression nil ?keyword t) drain_term (string "S" ?valuep t ?requiredp t ?isExpression nil ?keyword t) gate_term (string "G" ?valuep t ?requiredp t ?isExpression nil ?keyword t))) ?valuep t ?requiredp t ?isExpression t ?keyword nil) else (body ((setup\ connectivity source_term (string "S" ?valuep t ?requiredp t ?isExpression nil ?keyword t) drain_term (string "D" ?valuep t ?requiredp t ?isExpression nil ?keyword t) gate_term (string "G" ?valuep t ?requiredp t ?isExpression nil ?keyword t))) ?valuep t ?requiredp t ?isExpression t ?keyword nil)) (draw\ fingers firstSD (lvalue "firstSD" ?valuep t ?requiredp t ?isExpression nil ?keyword t) lastSD (lvalue "lastSD" ?valuep t ?requiredp t ?isExpression nil ?keyword t)) (setup\ abutment ?comment "Setup abutment for the first and last SD groups" firstSD (geo (geo type "Name" points nil group "" name "firstSD" expression nil) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword t) lastSD (geo (geo type "Name" points nil group "" name "lastSD" expression nil) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword t)) when(condition (string "fingers>1" ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The condition to check.") then (body (when(condition (string "sdconn==\"Source\" || sdconn==\"Both\"" ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The condition to check.") then (body ((route name (lvalue "sroute" ?valuep t ?requiredp t ?isExpression nil ?keyword t) trunk (lvalue "" ?valuep t ?requiredp t ?isExpression nil ?keyword t) source_shapes (geo (geo type "Expression" points nil group nil name nil expression (terminal "S")) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword t) layer (layer "(\"Metal1\" \"drawing\")" ?valuep t ?requiredp t ?isExpression nil ?keyword t) side (compass north ?valuep t ?requiredp t ?isExpression nil ?keyword t) width (float "0.06" ?valuep t ?requiredp t ?isExpression t ?keyword t) avoid_layer (layer "(\"Metal1\" \"drawing\")" ?valuep t ?requiredp t ?isExpression nil ?keyword t))) ?valuep t ?requiredp t ?isExpression t ?keyword nil)) when(condition (string "sdconn==\"Drain\" || sdconn==\"Both\"" ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The condition to check.") then (body ((route name (lvalue "droute" ?valuep t ?requiredp t ?isExpression nil ?keyword t) trunk (lvalue "" ?valuep t ?requiredp t ?isExpression nil ?keyword t) source_shapes (geo (geo type "Expression" points nil group nil name nil expression (terminal "D")) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword t) layer (layer "(\"Metal1\" \"drawing\")" ?valuep t ?requiredp t ?isExpression nil ?keyword t) side (compass south ?valuep t ?requiredp t ?isExpression nil ?keyword t) width (float "0.06" ?valuep t ?requiredp t ?isExpression t ?keyword t) avoid_layer (layer "(\"Metal1\" \"drawing\")" ?valuep t ?requiredp t ?isExpression nil ?keyword t))) ?valuep t ?requiredp t ?isExpression t ?keyword nil)) when(condition (string "gateconn==\"Top\" || gateconn==\"Both\"" ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The condition to check.") then (body ((route name (lvalue "gateroute_top" ?valuep t ?requiredp t ?isExpression nil ?keyword t) trunk (lvalue "trunk_top" ?valuep t ?requiredp t ?isExpression nil ?keyword t) source_shapes (geo (geo grow 0 type "Group" points nil group "gate" name nil expression nil) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword t) layer (layer "(\"Poly\" \"drawing\")" ?valuep t ?requiredp t ?isExpression nil ?keyword t) side (compass north ?valuep t ?requiredp t ?isExpression nil ?keyword t) width (float "0.1" ?valuep t ?requiredp t ?isExpression t ?keyword t) avoid_layer (layer "(\"Metal1\" \"drawing\")" ?valuep t ?requiredp t ?isExpression nil ?keyword t))) ?valuep t ?requiredp t ?isExpression t ?keyword nil)) when(condition (string "gateconn==\"Bottom\" || gateconn==\"Both\"" ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The condition to check.") then (body ((route name (lvalue "gateroute_bot" ?valuep t ?requiredp t ?isExpression nil ?keyword t) trunk (lvalue "trunk_bot" ?valuep t ?requiredp t ?isExpression nil ?keyword t) source_shapes (geo (geo grow 0 type "Group" points nil group "gate" name nil expression nil) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword t) layer (layer "(\"Poly\" \"drawing\")" ?valuep t ?requiredp t ?isExpression nil ?keyword t) side (compass south ?valuep t ?requiredp t ?isExpression nil ?keyword t) width (float "0.1" ?valuep t ?requiredp t ?isExpression t ?keyword t) avoid_layer (layer "(\"Metal1\" \"drawing\")" ?valuep t ?requiredp t ?isExpression nil ?keyword t))) ?valuep t ?requiredp t ?isExpression t ?keyword nil)) (via\ fill via (geo (geo grow 0 type "Group" points nil group "gate_via" name "" expression nil) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The via or vias to use.") target (geo (geo type "Name" points nil group "" name ("trunk_bot" "trunk_top") expression nil) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword t ?help "The region to be filled.") enclosure (enclosure "0.0" ?valuep t ?requiredp t ?isExpression t ?keyword t ?help "The minimum spacing between the vias and the region boundary.") justifyx (xfill "center" ?valuep t ?requiredp t ?isExpression nil ?keyword t ?help "Justification in X direction.") justifyy (yfill "center" ?valuep t ?requiredp t ?isExpression nil ?keyword t ?help "Justification in Y direction.") body (body nil ?valuep t ?requiredp t ?isExpression t ?keyword t)) (merge name (lvalue "" ?valuep t ?requiredp t ?isExpression nil ?keyword nil ?help "The merged shapes.") source (geo (geo type "Name" points nil group "" name ("droute" "gateroute_bot" "gateroute_top" "sroute") expression nil) ?lazyp nil ?valuep t ?requiredp t ?isExpression t ?keyword nil ?help "The shapes to merge.") layer (layer "nil" ?valuep nil ?requiredp nil ?isExpression nil ?keyword t ?help "If provided, the merged shapes will be moved to this layer."))) ?valuep t ?requiredp t ?isExpression t ?keyword nil)))))
    
    ;; Imported local (Skill++) definitions
    ?importedCode
    nil
    
    ;; Saved state of the GUI
    ?guiData
    (nil selectedCommands (pcdGuiNM_draw_setup_20connectivity1) activeTab "draw" openTabs ("setup connectivity" "draw fingers" "sdstretch" "draw") commandPaletteSelection nil commandPalette (nil Add t Control\ Flow t MOS t))
    
    )
    

    • Cancel
    • Vote Up +1 Vote Down
    • Cancel
  • AkshayN
    0 AkshayN over 5 years ago in reply to Andrew Beckett

    Hi Andrew,

    Thank you for your reply.

    I have one more query regarding terminals. When i copy a shape which has terminal on it using "copy" command , the terminal is getting copied. But when i use "array" command, the terminal connectivity is lost in the resulting array. Can you tell me why this is happening and is there any alternative way to retain connectivity?

    1. Using Copy command

    2. Using Array Command

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
Reply
  • AkshayN
    0 AkshayN over 5 years ago in reply to Andrew Beckett

    Hi Andrew,

    Thank you for your reply.

    I have one more query regarding terminals. When i copy a shape which has terminal on it using "copy" command , the terminal is getting copied. But when i use "array" command, the terminal connectivity is lost in the resulting array. Can you tell me why this is happening and is there any alternative way to retain connectivity?

    1. Using Copy command

    2. Using Array Command

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
Children
  • Andrew Beckett
    0 Andrew Beckett over 5 years ago in reply to AkshayN

    The array command is not designed to retain connectivity - it's for doing a simple "fill" type operation but driven by the number of rows and columns (for example). It can place mosaics or stepped arrays of shapes.

    We decided not to overcomplicate it by adding connectivity support as well, as the copy command (either in a loop, or with the repeat parameter) can be used to achieve this with control of the connectivity.

    Regards,

    Andrew.

    • 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