| ||
procedure( create_gate()
let(( cv instList inst_fl inst_l inst_fw
fingers tech viaDefId viaParams xy cutNum
x1 y1 x2 y2 x3 y3 x4 y4 x5 y5
PolyEncloseCT MetalEncloseCT CTSpace CTWidth
PolyExtensionOD MetalWidth CTCoreSpaceOD
PolyEncloseMetal PolyWidth FingersPolySpace )
CTWidth = 0.22
PolyEncloseCT = 0.1
MetalEncloseCT = 0.1
CTSpace = 0.3
PolyExtensionOD = 0.22
MetalWidth = 0.42
CTCoreSpaceOD = 0.53
PolyEncloseMetal = 0.25
PolyWidth = 0.52
FingersPolySpace = 0.54
cv = geGetEditCellView(getCurrentWindow())
tech = techGetTechFile(cv)
instList = geGetSelSet()
foreach(inst instList
inst_fl = atof(car(last(inst~>prop~>l)));get instance l\
prop=information in properties\
atof is change to float from Character string\
atoi is change to integer from Character string
if( (inst_fl >= 100) then inst_fl = inst_fl / 1000 )
inst_fw = atof(car(last(inst~>prop~>fw)));get instance fw
fingers = atof(car(last(inst~>prop~>fingers)));get instance fingers
inst_l = inst_fl * fingers + (fingers - 1) * FingersPolySpace
xy = inst~>xy
cutNum = int(((inst_l - (MetalWidth * 2) ) / (CTSpace+CTWidth) ))
if( (cutNum <= 2)
then cutNum = 2
else cutNum = cutNum
)
viaDefId = techFindViaDefByName(tech "M1_GT")
viaParams = list(list("cutSpacing" list(CTSpace CTSpace));cont via space
list("layer1Enc" list(PolyEncloseCT PolyEncloseCT));GTLYG enclosures cont via
list("layer2Enc" list(MetalEncloseCT MetalEncloseCT));M1 enclosures cont via
list("cutRows" 1) list("cutColumns" cutNum));Row=1 Column=cutNum
case(inst~>orient
("R0"
x1 = car(xy)
y1 = cadr(xy) + inst_fw + PolyExtensionOD
x2 = x1 + inst_l
y2 = y1 + PolyWidth
x3 = x1 + inst_l/2
y3 = cadr(xy) + inst_fw + CTCoreSpaceOD
x4 = x1 + PolyEncloseMetal
y4 = y2 - MetalWidth
x5 = x2 - PolyEncloseMetal
y5 = y2
dbCreateRect( cv list( "M1" "drawing" ) list(x4:y4 x5:y5))
dbCreateRect( cv list( "GT" "drawing" ) list(x1:y1 x2:y2))
dbCreateVia( cv viaDefId list(x3 y3) "R0" viaParams)
);end "R0"
("R90"
x1 = car(xy) - inst_fw - (PolyExtensionOD + PolyWidth)
y1 = cadr(xy)
x2 = car(xy) - inst_fw - PolyExtensionOD
y2 = y1 + inst_l
x3 = x1 + (MetalWidth / 2)
y3 = y1 + inst_l/2
x4 = x1
y4 = y1 + PolyEncloseMetal
x5 = x1 + MetalWidth
y5 = y2 - PolyEncloseMetal
dbCreateRect( cv list( "M1" "drawing" ) list(x4:y4 x5:y5))
dbCreateRect( cv list( "GT" "drawing" ) list(x1:y1 x2:y2))
dbCreateVia( cv viaDefId list(x3 y3) "R90" viaParams)
);end "R90"
("R180"
x1 = car(xy) - inst_l
y1 = cadr(xy) + PolyExtensionOD
x2 = car(xy)
y2 = cadr(xy) + (PolyExtensionOD + PolyWidth)
x3 = x1 + inst_l/2
y3 = cadr(xy) + CTCoreSpaceOD
x4 = x1 + PolyEncloseMetal
y4 = y2 - MetalWidth
x5 = x2 - PolyEncloseMetal
y5 = y2
dbCreateRect( cv list( "M1" "drawing" ) list(x4:y4 x5:y5))
dbCreateRect( cv list( "GT" "drawing" ) list(x1:y1 x2:y2))
dbCreateVia( cv viaDefId list(x3 y3) "R180" viaParams)
);end "R180"
("R270"
x1 = car(xy) - (PolyExtensionOD + PolyWidth)
y1 = cadr(xy) - inst_l
x2 = car(xy) - PolyExtensionOD
y2 = cadr(xy)
x3 = x1 + (MetalWidth / 2)
y3 = y1 + inst_l/2
x4 = x1
y4 = y1 + PolyEncloseMetal
x5 = x1 + MetalWidth
y5 = y2 - PolyEncloseMetal
dbCreateRect( cv list( "M1" "drawing" ) list(x4:y4 x5:y5))
dbCreateRect( cv list( "GT" "drawing" ) list(x1:y1 x2:y2))
dbCreateVia( cv viaDefId list(x3 y3) "R270" viaParams)
);end "R270"
("MY"
x1 = car(xy) - inst_l
y1 = cadr(xy) + inst_fw + PolyExtensionOD
x2 = car(xy)
y2 = y1 + PolyWidth
x3 = x1 + inst_l/2
y3 = y1 + PolyWidth - MetalWidth/2
x4 = x1 + PolyEncloseMetal
y4 = y2 - MetalWidth
x5 = x2 - PolyEncloseMetal
y5 = y2
dbCreateRect( cv list( "M1" "drawing" ) list(x4:y4 x5:y5))
dbCreateRect( cv list( "GT" "drawing" ) list(x1:y1 x2:y2))
dbCreateVia( cv viaDefId list(x3 y3) "MY" viaParams)
);end "MY"
("MYR90"
x1 = car(xy) - inst_fw - (PolyExtensionOD + PolyWidth)
y1 = cadr(xy) - inst_l
x2 = car(xy) - inst_fw - PolyExtensionOD
y2 = cadr(xy)
x3 = x1 + (MetalWidth / 2)
y3 = y1 + inst_l/2
x4 = x1
y4 = y1 + PolyEncloseMetal
x5 = x1 + MetalWidth
y5 = y2 - PolyEncloseMetal
dbCreateRect( cv list( "M1" "drawing" ) list(x4:y4 x5:y5))
dbCreateRect( cv list( "GT" "drawing" ) list(x1:y1 x2:y2))
dbCreateVia( cv viaDefId list(x3 y3) "MYR90" viaParams)
);end "MYR90"
("MX"
x1 = car(xy)
y1 = cadr(xy) + PolyExtensionOD
x2 = x1 + inst_l
y2 = y1 + PolyWidth
x3 = x1 + inst_l/2
y3 = y1 + PolyWidth - MetalWidth/2
x4 = x1 + PolyEncloseMetal
y4 = y2 - MetalWidth
x5 = x2 - PolyEncloseMetal
y5 = y2
dbCreateRect( cv list( "M1" "drawing" ) list(x4:y4 x5:y5))
dbCreateRect( cv list( "GT" "drawing" ) list(x1:y1 x2:y2))
dbCreateVia( cv viaDefId list(x3 y3) "MX" viaParams)
);end "MX"
("MXR90"
x1 = car(xy) - (PolyExtensionOD + PolyWidth)
y1 = cadr(xy)
x2 = car(xy) - PolyExtensionOD
y2 = cadr(xy)+ inst_l
x3 = x1 + (MetalWidth / 2)
y3 = y1 + inst_l/2
x4 = x1
y4 = y1 + PolyEncloseMetal
x5 = x1 + MetalWidth
y5 = y2 - PolyEncloseMetal
dbCreateRect( cv list( "M1" "drawing" ) list(x4:y4 x5:y5))
dbCreateRect( cv list( "GT" "drawing" ) list(x1:y1 x2:y2))
dbCreateVia( cv viaDefId list(x3 y3) "MXR90" viaParams)
);end "MXR90"
);end case
);end foreach
);end let
);end procedure
hiSetBindKey("layout" "shift<Key>1" "create_gate()" )