Skill语言学习_5🦽
使用Skill语言,在MOS管两侧添加Dummy管

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)") ;绑定快捷键
测试该脚本:

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


浙公网安备 33010602011771号