Skill语言学习_5🦽

使用Skill语言,在MOS管两侧添加Dummy管

image-20260304170453916

Skill版本:

getSkillVersion
"SKILL35.00"
> 

学习参考:

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

脚本思路:

1、获取编辑环境与选中对象;

2、计算目标器件的几何信息;

3、确定Dummy器件的模板;

4、计算Dummy器件的摆放位置;

5、生成唯一的Dummy器件名称;

6、创建Dummy器件并复制属性。

设计操作:

1、获取编辑环境与选中对象;

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

cv = geGetEditCellView()

获取当前在版图窗口中被鼠标选中的所有对象的id列表;

selected = geGetSelSet()

提取列表中第一个器件作为基准;

targetInst = car(selected)

2、计算目标器件的几何信息;

获得基准器件的边界框bBox和原点origin坐标;

bBox = targetInst~>bBox
origin = targetInst~>xy

解析出其左 (left)、右 (right)、上 (top)、下 (bottom) 边界坐标,进而计算出器件的宽度 (width) 和高度 (height)

left = caadr(bBox)
right = caar(bBox)
top = cadadr(bBox)
bottom = cadar(bBox)
width  = left - right
height = top - bottom

计算出框选器件中最左侧器件的x坐标,最右侧器件的x坐标以及所有器件的y坐标;

x1 = car(origin)
y = cadr(origin)
x2 = caar(last(selected)~>xy)

3、确定Dummy器件的模板;

获取目标器件所属的库和单元名称,保证 Dummy 将与原器件使用完全相同的物理结构单元;

dummyLib  = targetInst~>libName      
dummyCell = targetInst~>cellName 

dbOpenCellViewByType() 函数根据库名、单元名和视图类型("layout"即版图)打开对应的主单元视图(Master CellView);

masterCv = dbOpenCellViewByType(dummyLib dummyCell "layout")

这个返回的 masterCv 对象将作为 dbCreateInst() 函数的 d_master 参数,用于指定新创建实例的模板。

4、计算Dummy器件的摆放位置;

根据用户输入的 spacing 参数,脚本计算出左侧和右侧 Dummy 的坐标;

leftOrigin = list(x1 - width - spacing, y)
rightOrigin = list(x2 + width + spacing, y)

5、生成唯一的 Dummy 器件名称;

为了避免命名冲突,脚本遍历当前单元视图 (cv) 中的所有实例名称,查找所有以"Dummy"开头的所有器件,提取最大的数字后缀加1作为新的"Dummy"的起始编号;

maxNum = 0
foreach(instName cv~>instances~>name
    if(rexMatchp("Dummy*" instName)
        then
        num = atoi(substring(instName strlen("Dummy")+1))
        if(num > maxNum then
            maxNum = num
        );if
    );if
);foreach

使用 sprintf() 函数生成新的"Dummy"器件名称;

newName = sprintf(str "Dummy%d" (maxNum+1))

6、创建Dummy器件并复制属性。

通过 dbCreateInst() 函数实现"Dummy"器件的创建;

leftInst  = dbCreateInst(cv masterCv newName leftOrigin  "R0" 1)

使用 dbCopyProp() 将原始目标器件的属性复制到新创建的 Dummy 器件上,确保其电气特性与原始器件一致;

dbCopyProp(targetInst leftInst)

同理,在右边添加"Dummy"器件;

maxNum++
newName = sprintf(str "Dummy%d" (maxNum+1))
rightInst = dbCreateInst(cv masterCv newName rightOrigin "R0" 1)
dbCopyProp(targetInst rightInst)

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

procedure(AddDummy(spacing)
	let((cv targetInst bBox origin left right top bottom x1 y width height dummyLib dummyCell leftOrigin rightOrigin maxNum num newName leftInst rightInst)
		cv = geGetEditCellView()
		selected = geGetSelSet()
		targetInst = car(selected)
		
		bBox = targetInst~>bBox
		origin = targetInst~>xy
		left = caadr(bBox)
		right = caar(bBox)
		top = cadadr(bBox)
		bottom = cadar(bBox)
		width  = left - right
		height = top - bottom
		
		x1 = car(origin)
		y = cadr(origin)
		x2 = caar(last(selected)~>xy)
		
		dummyLib  = targetInst~>libName      
		dummyCell = targetInst~>cellName    
		masterCv = dbOpenCellViewByType(dummyLib dummyCell "layout")
		
		leftOrigin  = list(x1 - width - spacing, y)
		rightOrigin = list(x2 + width + spacing, y)
		
		maxNum = 0
		foreach(instName cv~>instances~>name
			if(rexMatchp("Dummy*" instName)
				then
		        	num = atoi(substring(instName strlen("Dummy")+1))
		        	if(num > maxNum then
		        		maxNum = num
		        );if
			);if
		);foreach
		newName = sprintf(str "Dummy%d" (maxNum+1))

		leftInst  = dbCreateInst(cv masterCv newName leftOrigin  "R0" 1)
		dbCopyProp(targetInst leftInst)
		maxNum++
		newName = sprintf(str "Dummy%d" (maxNum+1))
		rightInst = dbCreateInst(cv masterCv newName rightOrigin "R0" 1)
		dbCopyProp(targetInst rightInst)
	);let
);procedure

hiSetBindKey("Layout" "Ctrl<Key>4" "AddDummy(2)")	;绑定快捷键

测试该脚本:

image-20260305101733012

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

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

image-20260305102013284

综上完成了在MOS管两侧添加Dummy管的功能🎉🎉🎉

posted @ 2026-03-05 10:22  StupidMonkey19  阅读(70)  评论(0)    收藏  举报