AddMosM1_Custom.il
功能是在mos的S/D/G上加盖一层metal1,并且加宽。最初的算法是识别mos的原点,然后根据mos的length去计算metal1的位置,然后画path。前几天在eetop上看到另一个帖子写的相同功能的脚本,算法是获取mos的所有shapes,然后获取其中的metal1,然后将这层metal1复制了放进一个新建的cell内,再调用进来盖在mos上面,再打散。
procedure(AddMosM1_Custom()
let((cv objs metal1 temp shapes x y ux uy xy row column transform M1_width)
M1_width = 0.1
cv = geGetEditCellView()
objs = geGetSelSet()
foreach(obj objs
transform = nil
if(obj~>objType == "inst" then transform = list(obj~>transform));end if
if(obj~>objType == "mosaic" then
x = xCoord(obj~>xy)
y = yCoord(obj~>xy)
ux = obj~>uX
uy = obj~>uY
row = obj~>rows
column = obj~>columns
for(a 0 row-1
for(b 0 column-1
case(car(obj~>tileArray)
("R0" xy = list(x+bux : y+auy))
("MXR90" xy = list(x+aux : y+buy))
("R90" xy = list(x-aux : y+buy))
("MY" xy = list(x-bux : y+auy))
("R0" xy = list(x+aux : y-buy))
("MXR90" xy = list(x+bux : y-auy))
("R0" xy = list(x-bux : y-auy))
("MXR90" xy = list(x-aux : y-buy))
);end case
transform = append1(transform list(car(xy) car(obj~>tileArray) 1.0))
);end for
);enf for
);end if
shapes = obj>master>shapes
foreach(shape shapes
if(car(shape~>lpp) == "M1" && cadr(shape~>lpp) == "drawing"
then
foreach(trans transform
metal1 = dbCopyFig(shape cv trans)
temp = convertPolygon2Path(metal1)
temp~>width = M1_width
);foreach
);if
);foreach
);foreach
);let
);proc
procedure(convertPolygon2Path(obj)
let((cv BOX layerName x1 x2 y1 y2 width startPoint endPoint)
cv = geGetEditCellView()
if(obj ~> objType == "rect" then
BOX = obj ~> bBox
layerName = obj ~> layerName
x1 = caar(BOX)
y1 = nth(1 car(BOX))
x2 = caadr(BOX)
y2 = nth(1 cadr(BOX))
if(x2-x1 > y2-y1 then
println("It is horizontal")
width = y2-y1
startPoint = x1 : y1+(y2-y1)/2
endPoint = x2 : y1+(y2-y1)/2
else
println("It is vertical")
width = x2-x1
startPoint = x1+(x2-x1)/2 : y1
endPoint = x1+(x2-x1)/2 : y2
);if
);if
dbDeleteObject(obj)
dbCreatePath(cv layerName list(startPoint endPoint) width)
);let
);proc
hiSetBindKey("Layout" "
浙公网安备 33010602011771号