【SKILL脚本】Virtuoso SKILL自动化版图:从入门到实战
Virtuoso SKILL自动化版图:从入门到实战
SKILL是Cadence Virtuoso的脚本语言,掌握SKILL可以大幅提升版图设计效率。本文从基础语法到实战案例,系统讲解SKILL编程。
一、SKILL基础语法
变量与数据类型
; 变量定义 let((x y z) x = 10 ; 整数 y = 3.14 ; 浮点数 z = "hello" ; 字符串 list(x y z) ; 列表 )
条件与循环
; 条件语句
if(x > 0
then printf("正数
")
else printf("负数
")
)
; 循环
for(i 0 10
printf("i = %d
" i)
)
; While循环
while(x > 0
x = x - 1
)
二、版图操作核心函数
创建图形
; 获取当前CellView
cv = getCurrentCellView()
; 创建矩形
dbCreateRect(cv list("M1" "drawing") list(0:0 10:10))
; 创建路径(Purpose, Width, Points)
dbCreatePath(cv list("M1" "drawing") 0.5 list(0:0 10:0 10:10))
; 创建多边形
dbCreatePolygon(cv list("M1" "drawing") list(0:0 10:0 10:10 0:10))
; 创建文本标签
dbCreateLabel(cv list("M1" "label") 5:5 "VDD" "centerCenter" "R0" 0.2)
操作实例
; 放置实例 dbCreateInst(cv "inv" nil "U1" 0:0 "R0") ; 放置数组实例 dbCreateInstArray(cv "inv" nil "U" 0:0 "R0" 4 2 10 10) ; 移动实例 dbMoveFig(inst 5:5) ; 旋转实例 dbRotateFig(inst "R90")
三、自动化Guard Ring脚本
这是版图设计中最常用的SKILL脚本之一:
procedure(addGuardRing(cv bbox layer enc)
; bbox: 目标区域边界 list(x1:y1 x2:y2)
; layer: Guard Ring层 list("NW" "drawing")
; enc: 包围距离
let((x1 y1 x2 y2 grRect)
x1 = xCoord(car(bbox)) - enc
y1 = yCoord(car(bbox)) - enc
x2 = xCoord(cadr(bbox)) + enc
y2 = yCoord(cadr(bbox)) + enc
; 创建外框
grRect = dbCreateRect(cv layer list(x1:y1 x2:y2))
; 创建内框(挖空)
dbCreateRect(cv layer
list((x1+0.2):(y1+0.2) (x2-0.2):(y2-0.2))
?operation 'subtract
)
printf("Guard Ring added: (%.2f,%.2f) to (%.2f,%.2f)
" x1 y1 x2 y2
)
)
)
; 使用示例
cv = getCurrentCellView()
bbox = getBBox(cv)
addGuardRing(cv list("NW" "drawing") 1.0)
四、批量Dummy Fill
procedure(addDummyFill(cv layer region spacing)
; 在指定区域添加Dummy填充
let((x1 y1 x2 y2 x y dummySize)
x1 = xCoord(car(region))
y1 = yCoord(car(region))
x2 = xCoord(cadr(region))
y2 = yCoord(cadr(region))
dummySize = 0.5
for(x x1 x2 spacing
for(y y1 y2 spacing
dbCreateRect(cv layer
list(x:y (x+dummySize):(y+dummySize))
)
)
)
printf("Dummy fill completed
")
)
)
五、错误处理
; 使用errset捕获错误
errset(
(dbCreateRect(cv list("M1" "drawing") list(0:0 10:10))
t ; 返回值
nil ; 错误时返回nil
)
; 错误信息
when(errset(expression)
printf("Error: %s
" errset.errset)
)
六、实用技巧
- 使用
printf输出调试信息 - 使用
timer函数测量脚本执行时间 - 将常用函数封装成库,方便复用
- 使用
hiSetBindKey绑定快捷键 - 脚本文件保存为
.il扩展名
#DRC
#ERC
#Guard Ring
#SKILL
#SKILL脚本
#Virtuoso
#学习路线
#寄生参数
#版图设计
#脚本
#自动化
#运放版图