| ||
备份
LIBRARY = "layout_lib" ;libname
CELL = "mos_w_0d2_S28" ;cellname
pcDefinePCell(
list(ddGetObj(LIBRARY) CELL "layout")
(
(fingers string "1")
(fingers_dummypoly_left string "2")
(fingers_dummypoly_right string "2")
(l string "0.03u")
;(w string "0.2u")
(core boolean t);core or TG
(nmos boolean t);nmos or pmos
;(gt_top_ct boolean t)
;(gt_bottom_ct boolean t)
)
let(()
tf = techGetTechFile(ddGetObj("techlib")) ; techlib
GT = techGetLayerNum(tf "GT") ; layer number from techlib
AA = techGetLayerNum(tf "AA")
CT = techGetLayerNum(tf "CT")
M1 = techGetLayerNum(tf "M1")
GTDMP = techGetLayerNum(tf "GTDMP")
SN = techGetLayerNum(tf "SN")
SP = techGetLayerNum(tf "SP")
TG = techGetLayerNum(tf "TG")
nf = evalstring(fingers)
nfl = evalstring(fingers_dummypoly_left)
nfr = evalstring(fingers_dummypoly_right)
l = evalstring(l)*1000000
;w = evalstring(w)*1000000
if(core then l = max(l 0.03) else l = max(l 0.25))
if(core then
if( l > 0.09 then
gts = 0.12
else gts = 0.1)
else gts = 0.18)
if(core then
if(l > 0.05 then
gtml = 0.05 else gtml = l )
else if(l > 0.27
then gtml = 0.27
else gtml = l ))
if( l == 0.03 then gtex = 0.095 else gtex = 0.08 )
w = 0.2
gtp = gts + l
gtw = w + 2*gtex
if(nfl >1 then nfll = nfl-1
else nfll =0)
if(nfr >1 then nfrr = nfr-1
else nfrr=0)
if(nfl == 0 then
diffoffset = gts
else diffoffset =0)
impl = gtp*nf+gts+(nfl+nfr)*gtml+(nfll+nfrr)*gts
;create SN OR SP
if(nmos then
rodCreateRect(
?name sprintf(nil "SN")
?layer SN
?bBox list(-diffoffset:0.0 (impl-diffoffset):gtw)
)
else
rodCreateRect(
?name sprintf(nil "SP")
?layer SP
?bBox list(-diffoffset:0.0 (impl-diffoffset):gtw)
)
)
unless(core
rodCreateRect(
?name sprintf(nil "TG")
?layer TG
?bBox list(0.0:0.0 impl:gtw)
))
; create GTDMP
for(i 0 nfl-1
rodCreateRect(
?name sprintf(nil "polyl_%d" i)
?layer GTDMP
?bBox list(0.0:0.0 gtml:gtw)
)
)
when(nfl >1
for(i 1 nfl-1
rodAlign(
?alignObj rodGetObj(sprintf(nil "polyl_%d" i))
?alignHandle "centerLeft"
?refObj rodGetObj(sprintf(nil "polyl_%d" i-1))
?refHandle "centerRight"
?xSep gts
)
))
for(i 0 nfr-1
rodCreateRect(
?name sprintf(nil "polyr_%d" i)
?layer GTDMP
?bBox list((nf*gtp+nfl*(gtml+gts)):0.0 (nf*gtp+nfl*(gtml+gts)+gtml):gtw)
)
)
when(nfr >1
for(i 1 nfr-1
rodAlign(
?alignObj rodGetObj(sprintf(nil "polyr_%d" i))
?alignHandle "centerLeft"
?refObj rodGetObj(sprintf(nil "polyr_%d" i-1))
?refHandle "centerRight"
?xSep gts
)
))
;create AA
rodCreateRect(
?name sprintf(nil "DIFF" )
?layer AA
?bBox list((nfl*(gtml+gts)+0.025-gts):gtex (nf*gtp+nfl*(gtml+gts)-0.025):gtex+w)
)
; create GT
for(i 0 nf-1
rodCreateRect(
?name sprintf(nil "GT_%d" i)
?layer GT
?bBox list((nfl*gtml+nfl*gts):0.0 (nfl*gtml+nfl*gts+l):gtw)
)
);for
when(nf > 1
for(i 1 nf-1
rodAlign(
?alignObj rodGetObj(sprintf(nil "GT_%d" i))
?alignHandle "centerLeft"
?refObj rodGetObj(sprintf(nil "GT_%d" i-1))
?refHandle "centerRight"
?xSep gts
)
);for
);when
;create M1 & CT
for(i 1 nf-1
rodCreateRect(
?name sprintf(nil "M1_%d" i)
?layer M1
?bBox list((nfl*gtml+nfl*gts-0.5*gts+gtp-0.025):gtex (nfl*gtml+nfl*gts-0.5*gts+gtp+0.025):gtex+w)
?subRectArray
list( list(
?layer CT
?width 0.04
?length 0.04
?gap "minimum"
?lowerLeftOffsetX 0.005
?lowerLeftOffsetY 0.025
?spaceY 0.07
))
))
when(nf > 1
for(i 2 nf-1
rodAlign(
?alignObj rodGetObj(sprintf(nil "M1_%d" i))
?alignHandle "centerLeft"
?refObj rodGetObj(sprintf(nil "M1_%d" i-1))
?refHandle "centerRight"
?xSep (gtp-0.05)
)))
rodCreateRect(
?name sprintf(nil "M1_L")
?layer M1
?bBox list((nfl*gtml+nfl*gts-0.5*gts-0.025):gtex (nfl*gtml+nfl*gts-0.5*gts+0.025):gtex+w)
?subRectArray
list( list(
?layer CT
?width 0.04
?length 0.04
?gap "minimum"
?lowerLeftOffsetX 0.005
?lowerLeftOffsetY 0.08
?spaceY 0.07
)))
rodCreateRect(
?name sprintf(nil "M1_R")
?layer M1
?bBox list((impl-nfr*gtml-nfrr*gts-0.5*gts-0.025-diffoffset):gtex (impl-nfr*gtml-nfrr*gts-0.5*gts+0.025-diffoffset):gtex+w)
?subRectArray
list( list(
?layer CT
?width 0.04
?length 0.04
?gap "minimum"
?lowerLeftOffsetX 0.005
?lowerLeftOffsetY 0.08
?spaceY 0.07
)))
);let
);poc