Skill语言学习_4🦽

使用Skill语言将MOS管源漏端的M1层复制并加宽

image-20260304153843277

Skill版本:

getSkillVersion
"SKILL35.00"
> 

学习参考:

[ Skill ] Cadence Skill 语言入门 - YEUNGCHIE - 博客园

脚本思路:

1、找到框选区域所有的M1层并复制为新列表;

2、设定新Width为0.38;

3、将新列表中所有“竖”M1的宽度变为0.38;

设计操作:

1、找到框选区域所有的M1层并复制为新列表;

获取当前处于编辑状态的 CellView 的数据库 ID,赋值给 cv。

cv = geGetEditCellView()

调用交互函数enterBox,参数 ?points mouseAddPt() 表示通过鼠标添加点来定义矩形,返回该矩形的坐标列表(格式如 ((x1 y1) (x2 y2)));

bBox = enterBox(?points mouseAddPt())

在当前CellView中查询所有位于矩形bBox内、层名为 "M1"、类型为 "drawing" 的图形。返还一个包含图形ID和变换信息的列表,赋值给hier_list;

hier_list = dbShapeQuery(cv list("M1" "drawing") bBox)

从层级结构中复制M1图形,并将其ID保存在新列表中;

foreach(hier hier_list
    hier_trans = dbGetInstTransform(hier)
    newFig = dbCopyFig(car(last(hier)) cv hier_trans)
    when(newFig
    	copiedFigsList = cons(newFig copiedFigsList)
    );when
);foreach

正确执行完上述脚本后,M1列表在CIW中应显示为:

copiedFigsList
(db:0x24038525 db:0x2403852a db:0x24038532)
> 

MOS管的源漏栅极的M1层均被复制。

整合上述代码:

cv = geGetEditCellView()
bBox = enterBox(?points mouseAddPt())
hier_list = dbShapeQuery(cv list("M1" "drawing") bBox)
copiedFigsList = nil
foreach(hier hier_list
    hier_trans = dbGetInstTransform(hier)
    println(hier)
    println(hier_trans)
    newFig = dbCopyFig(car(last(hier)) cv hier_trans)
    println(newFig) 
    when(newFig
        copiedFigsList = cons(newFig copiedFigsList)
    );when
);foreach

2、设定新Width为0.38;

根据实际工艺的要求设定M1的宽度;

newWidth = 0.38

3、将M1列表中所有“竖”的M1,宽度变为0.38;

foreach(fig copiedFigsList
    oldBBox = fig~>bBox
    width = caadr(oldBBox) - caar(oldBBox)  
    height = cadadr(oldBBox) -  cadar(oldBBox)
    when(height > width && abs(width - newWidth) > 0.001
        centerX = (caadr(oldBBox) + caar(oldBBox)) / 2.0
            centerY = (cadadr(oldBBox) + cadar(oldBBox)) / 2.0
            newBBox = list(
            list(centerX - newWidth/2.0, centerY - height/2.0),
            list(centerX + newWidth/2.0, centerY + height/2.0))
            fig~>bBox = newBBox
    );when
);foreach

正确执行完上述脚本后,所有“竖”的M1宽度应变为0.38,如下图:

image-20260304154227959

整合上述代码,并绑定快捷键:

procedure(CopyM1FromHierarchy_1()
	let((cv hier_list hier_trans newFig bBox hier copiedFigsList oldBBox width height centerX centerY newBBox)
		cv = geGetEditCellView()
		bBox = enterBox(?points mouseAddPt())
		hier_list = dbShapeQuery(cv list("M1" "drawing") bBox)
		copiedFigsList = nil
		foreach(hier hier_list
			hier_trans = dbGetInstTransform(hier)
			newFig = dbCopyFig(car(last(hier)) cv hier_trans)
			when(newFig
                copiedFigsList = cons(newFig copiedFigsList)
             );when
		);foreach

		newWidth = 0.38
		foreach(fig copiedFigsList
			oldBBox = fig~>bBox
			width = caadr(oldBBox) - caar(oldBBox)  
			height = cadadr(oldBBox) -  cadar(oldBBox)
				when(height > width && abs(width - newWidth) > 0.001
				    centerX = (caadr(oldBBox) + caar(oldBBox)) / 2.0
		  			centerY = (cadadr(oldBBox) + cadar(oldBBox)) / 2.0
        			 newBBox = list(
					list(centerX - newWidth/2.0, centerY - height/2.0),
					list(centerX + newWidth/2.0, centerY + height/2.0))
        			 fig~>bBox = newBBox
			);when
		);foreach
	);let
);procedure

hiSetBindKey("Layout" "Ctrl<Key>3" "CopyM1FromHierarchy_1()")

测试该脚本:

image-20260302155554373

将该脚本写入.cdsinit文件自动load

在桌面打开Terminal,输入:
cd
gedit .cdsinin
在.cdsinit文件内,load脚本的全路径:
load("/home/~~/~~/~~/CopyM1FromHierarchy_1.il")
如下:

image-20260304153001639

综上完成了从底层复制M1层,并加宽的功能🎉🎉🎉

posted @ 2026-03-04 15:44  StupidMonkey19  阅读(52)  评论(0)    收藏  举报