|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
×
本帖最后由 bingyue789 于 2025-12-30 11:39 编辑
分享几个版图用的skill小程序,大部分来自网络,小部分我做了精简,适合放到 .cdsinit 里面使用。
感谢 chinarml 着着着火了 pweo dcce liuliuliu66 level90 sunxeu luwang acrofoxAgain 等大神的帮助,还有一些可能没有找到名字的,也非常感谢!
第一个是米字尺,会先清除所有尺子,然后创建米字尺,如果不需要清除尺子。前面的procedure删掉就好了。
;;;<1>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
hiSetBindKey("Layout" "<Key>d" "ruler()")
procedure(ruler()
leHiClearRuler() crossruler()
)
procedure(crossruler()
cv=geGetEditRep()
vr=1000
p0=enterPoint()
p1=geWindowToEditPoint(hiGetCurrentWindow(),p0)
px=xCoord(p1)
py=yCoord(p1)
dx=px+vr,dy=py+vr
sx=px-vr,sy=py-vr
leCreateRuler(cv list(px:py px:dy))
leCreateRuler(cv list(px:py px:sy))
leCreateRuler(cv list(px:py dx:py))
leCreateRuler(cv list(px:py sx:py))
leCreateRuler(cv list(px:py dx:dy))
leCreateRuler(cv list(px:py sx:sy))
leCreateRuler(cv list(px:py dx:sy))
leCreateRuler(cv list(px:py sx:dy))
)
这个快捷换层是大神sunxeu 写的,把选中层换成LSW中选中的层次,非常好用
;;;<2>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
hiSetBindKey("Layout" "<Key>@" "changeLayer2LSW()" )
procedure( changeLayer2LSW()
let( ( ToMetal )
ToMetal = leGetEntryLayer() ;;;;;;;;;;;;;;select LSW layer
leReplace(geGetEditCellView(getCurrentWindow()) geGetSelSet() list(list("layer" nil list(car(ToMetal) cadr(ToMetal)))))
);end let
);end procedure
下面这个小程序的思路是一个快捷键对应一个固定的层次,只要我设置的足够多,我就可以不需要LSW.
下面的M1、M2、M3、GT是LayerName,需要根据工艺修改 |
;;;<2>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
hiSetBindKeys( "Layout" list(
list("<Key>[" "convertToLayer(\"M1\")")
list("<Key>]" "convertToLayer(\"M2\")")
list("<Key>;" "convertToLayer(\"M3\")")
list("<Key>'" "convertToLayer(\"GT\")")
)) ;; hiSetBindKeys
procedure(convertToLayer(layerN)
cv = geGetEditCellView()
selObjects = geGetSelectedSet(cv)
for(i 0 length(selObjects)-1
obj = nth(i, selObjects)
obj~>layerName = layerN
obj~>purpose = "drawing"
);for
);convertToLayer
如果想用LayerNum,如下: 需要根据工艺修改。16是M1的layerNum ,17是M2的layerNum,18是M3的layerNum,9是GT的layerNum
;;;<2>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
hiSetBindKeys( "Layout" list(
list("<Key>[" "convertToLayer(layerN=16)")
list("<Key>]" "convertToLayer(layerN=17)")
list("<Key>;" "convertToLayer(layerN=18)")
list("<Key>'" "convertToLayer(layerN=9 )")
)) ;; hiSetBindKeys
procedure(convertToLayer(layerN)
cv = geGetEditCellView()
selObjects = geGetSelectedSet(cv)
for(i 0 length(selObjects)-1
obj = nth(i, selObjects)
obj~>layerNum = layerN
obj~>purpose = "drawing" ;you can delete
);for
);convertToLayer
这个是切换edit 和read only的快捷键,找不到哪位大神最先发表的了,
;;<3>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;hiSetBindKey("Layout" "<Key>F12" "changeMode())
foreach(xw list("Layout" "Schematics" "Symbol" "Command Interpreter") hiSetBindKey(xw "<Key>F12" "changeMode()"))
procedure(changeMode()
let((cvId)
cvId = geGetEditCellView()
if(cvId~>mode=="a" then
geChangeEditMode("r")
else
geChangeEditMode("a")
)
)
);changeMode
这个是另存并且替换,选中一个cell (不能是PDK),在Save As中输入新名字,可以完成另存并且替换。
感谢 pweo 大神的指导,这个程序虽小,搞了近一个月才搞定。
;;;<4>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
hiSetBindKey("Layout" "<Key>F4" "SaveAsReplace()" )
procedure(SaveAsReplace()
leHiEditInPlace()
geSaveAs()
backupLib = geSaveAsForm->libName->value
backupCell = geSaveAsForm->cellName->value
backupView = geSaveAsForm->viewName->value
leReturn()
leReplaceAnyInstMaster(car(geGetSelectedSet()) backupLib backupCell backupView)
);SaveAsReplace
这个程序时根据chinarml 大神的AddMosM1.il 简化来的 ,可以给MOS添加Metal. M1_width = 0.24可修改
;;;<5>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
hiSetBindKey("Layout" "<Key>!" "addMosM1()")
procedure(addMosM1()
M1_width = 0.24
cv = geGetEditCellView()
objs = geGetSelSet()
foreach(obj objs
transform = nil
if(obj~>objType == "inst" then transform = list(obj~>transform));end if
shapeList = obj ~>master~>shapes
foreach(shape shapeList
if(car(shape~>lpp) == "M1" && cadr(shape~>lpp) == "drawing"
then foreach(trans transform
metal1 = dbCopyFig(shape cv trans)
temp = leConvertPolygonToPath(metal1)
temp~>width = M1_width
);foreach
);if
);if
);foreach
))
这个是把底层的 label copy到上一层的小程序,其实和上面那个是一样的,就是对象不同。现在是copy所有的 label.
;;;<6>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
hiSetBindKey("Layout" "Shift<Key>l" "label2CurrentWindow()")
procedure(label2CurrentWindow()
cv = geGetEditCellView()
objs = geGetSelSet()
foreach(obj objs
transform = nil
if(obj~>objType == "inst" then transform = list(obj~>transform));end if
shapeList = obj ~>master~>shapes
foreach(shape shapeList
if(shape ~> objType == "label"
; then
; if(nth(0 shape ~>lpp) == "MnTXT" || nth(0 shape ~>lpp) == "ALPATXT" || nth(1 shape ~>lpp) == "pin"
then foreach(trans transform
dbCopyFig(shape cv trans)
);foreach
; );if
);if
);foreach
))
下面这个是把 polygon 和 rect 变成 path, 有三个,随便选一个用就好
感谢 liuliuliu66 acrofoxAgain 两位大神的指导
;;;<7>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
hiSetBindKey("Layout" "Ctrl<key>e" "polygon2Path()")
procedure( polygon2Path()
objs = geGetSelSet()
foreach(obj objs
if( obj~>objType == "polygon" || obj~>objType == "rect"
then leConvertPolygonToPath(obj));if
));pro
/*
hiSetBindKey("Layout" "Ctrl<key>e" "polygon2Path()")
procedure( polygon2Path()
objs = geGetSelSet()
for(i 0 length(objs)-1
obj = nth(i, objs)
if(obj~>objType == "polygon" || obj~>objType == "rect"
then leConvertPolygonToPath(obj));endif
);for
);pro
hiSetBindKey("Layout" "Ctrl<key>e" "polygon2Path()")
procedure( polygon2Path()
objs = geGetSelSet()
objp = setof(obj objs obj~>objType == "polygon" || obj~>objType == "rect")
for(i 0 length(objp)-1
obj = nth(i, objp)
leConvertPolygonToPath(obj));endfor
);pro
*/
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|