A
Building Pcells with ROD Functions
The Pcells described in this reference were built in part with
If you want to make changes to the code in any of the Pcell devices, utility functions, or installation files, you should create a copy of the original sample file using a new filename and make your changes to the new file. This method preserves the sample files for future use. If you do not create new files when you customize, your custom files replace the original sample files, and when the sample Pcells are loaded again, your custom files are overwritten by the original sample files.
Multipart Paths, Subpaths, and Subrectangles
This code example utilizes the ROD function rodCreatePath to create a guardring consisting of an enclosure subpath and a subrectangle.
procedure(buildGuardRing(cv layer1 layer2 layer3 width1 width3
length3 pathpnts terminal pinlabel enc offset chop)
; pinlabel is a boolean that determines whether a label will be created
let(( guardRing )
guardRing = rodCreatePath(
?cvId cv
?layer layer1
?width width1
?pts pathpnts
?encSubPath list( list(
?layer layer2
?enclosure enc
?choppable chop
?pin t
?termName terminal
?pinLabel pinlabel
?pinLabelHeight length3
?pinLabelLayer "text"
))
?subRect list( list(
?layer layer3
?width width3
?length length3
?endOffset offset
))
)
))
Path Stitching with ROD Functions
This code example uses the ROD functions rodAlign and rodCreateRect to build a Pcell that can be used for path stitching. It is set up for double contacts.
-
Copy the sample
mpu.tffrom
to the location where you store your libraries.your_install_dir/tools/dfII/samples/techfiles/mpu.tf -
Comment out
M1_POLY1from thedeviceclass of the technology file.
This is necessary because path stitching will see two contact definitions for the same layer and choose the single-contact definition -
Create a new technology library using
mpu.tfas the ASCII technology file. - Load this file into your new library.
You can now use double contacts for path stitching.
; Path Stitching Example
devices(
tcCreateDeviceClass( "symbolic" "syEnhContact"
; class parameters
( (viaLayer "cont")
(viaPurpose "drawing")
(layer1 "poly1")
(purpose1 "drawing")
(layer2 "metal1")
(purpose2 "drawing")
(encByLayer1 .4)
(encByLayer2 .6)
)
; formal parameters
( (w 1.8)
(l .6)
(row 1)
(column 1)
(xPitch 2.4)
(yPitch 1.2)
(xBias "center")
(yBias "center")
)
cw = .6
cs = .6
lay1 = rodCreateRect(
?layer list(layer1 purpose1)
?width 2 * encByLayer1 + column * w + (column - 1) * cs
?length 2 * encByLayer1 + row * l + (row - 1) * cs
?pin t
?termName "m1p"
)
lay2 = rodCreateRect(
?layer list(layer2 purpose2)
?width 2 * encByLayer2 + column * w + (column - 1) * cs
?length 2 * encByLayer2 + row * l + (row - 1) * cs
?pin t
?termName "m1p"
)
for(i 0 row - 1
yStep = i * yPitch
for(j 0 column - 1
contlay1 = rodCreateRect(
?layer list(viaLayer viaPurpose)
?width cw
?length cw
)
contlay2 = rodCreateRect(
?layer list(viaLayer viaPurpose)
?width cw
?length cw
)
rodAlign(
?alignObj contlay1
?alignHandle "cC"
?refObj lay1
?refHandle "lL"
?xSep encByLayer1 + cw/2 + j * xPitch
?ySep encByLayer1 + cw/2 + yStep
)
rodAlign(
?alignObj contlay2
?alignHandle "cC"
?refObj lay1
?refHandle "lL"
?xSep encByLayer1 + cw/2 + j * xPitch + yPitch
?ySep encByLayer1 + cw/2 + yStep
)
)
)
rodAlign(
?alignObj lay1
?alignHandle "centerCenter"
?refObj lay2
?refHandle "cC"
)
)
tfcDefineDeviceClassProp(
; (viewName devClassName propName propValue)
(symbolic syEnhContact function "contact")
)
tcDeclareDevice( "symbolic" "syEnhContact" "M1_PLY"
( (viaLayer "cont") (viaPurpose "drawing")
(layer1 "poly1") (purpose1 "drawing")
(layer2 "metal1") (purpose2 "drawing")
(encByLayer1 .4) (encByLayer2 .6))
(
(w 1.8) (l .6)
(row 1) (column 1)
(xPitch 2.4)
(yPitch 1.2)
(xBias "center")
(yBias "center")
)
)
)
Return to top