SKILL Script Tutorial
Cadence SKILL 脚本编程入门教程
SKILL 是 Cadence Virtuoso 平台的脚本语言,基于 Lisp 语法,掌握 SKILL 编程能大幅提升版图设计效率。本文从实际应用出发,介绍 SKILL 的核心语法和常用版图自动化技巧。
SKILL 基础语法
; 变量定义
let((myVar)
myVar = 10
printf("Value: %d\n" myVar)
)
; 列表操作
myList = '(1 2 3 4 5)
car(myList) ; 返回 1(第一个元素)
cdr(myList) ; 返回 (2 3 4 5)(剩余元素)
cons(0 myList) ; 返回 (0 1 2 3 4 5)
; 条件判断
when(db == nil
printf("Error: database not found\n")
)
实用脚本示例1:批量添加 Label
procedure(addLabelsToPins(cv)
let((pinList labelName layer)
pinList = cv~>pins
foreach(pin pinList
labelName = pin~>name
layer = pin~>layer
dbCreateLabel(cv layer
pin~>origin
labelName
"lowerLeft"
"R0"
0.1
)
printf("Added label: %s on %L\n" labelName layer)
)
)
)
实用脚本示例2:自动测量器件间距
procedure(checkDeviceSpacing(cv minSpacing)
let((devices dev1 dev2 dist)
devices = setof(x cv~>instances x~>cellName != "guard_ring")
for(i 0 length(devices)-1
for(j i+1 length(devices)-1
dev1 = nth(i devices)
dev2 = nth(j devices)
dist = abs(car(dev1~>xy) - car(dev2~>xy))
when(dist < minSpacing
printf("WARNING: %s and %s spacing %.3f < %.3f\n"
dev1~>name dev2~>name dist minSpacing)
)
)
)
)
)
实用脚本示例3:一键生成 Guard Ring
procedure(addGuardRing(cv instName ringLayer ringWidth)
let((inst bbox x0 y0 x1 y1)
inst = dbFindInstByName(cv instName)
when(inst
bbox = inst~>bBox
x0 = car(car(bbox)) - ringWidth
y0 = cadr(car(bbox)) - ringWidth
x1 = car(cadr(bbox)) + ringWidth
y1 = cadr(cadr(bbox)) + ringWidth
dbCreateRect(cv list(ringLayer "drawing")
list(x0:y0 x1:y1)
)
)
)
)
调试技巧
- 使用
printf输出中间变量值,快速定位逻辑错误 - 在 CIW 中输入
skillDebugger()进入交互调试模式 - 善用
errset捕获异常,避免脚本中断 - 脚本文件扩展名用
.il,通过load("path/script.il")加载
常用 API 速查
| 函数 | 用途 |
|---|---|
dbOpenCellViewByType | |
| 打开 cellview | |
dbCreateRect | 创建矩形 |
dbCreateInst | 创建实例 |
dbCreateVia | 创建 via |
hiGetCurrentWindow | 获取当前窗口 |
leHiCreateInst | 交互式创建 instance |
进阶建议:学习 SKILL 不要死记语法,而是从解决实际问题出发。建议先从修改现有脚本开始,逐步理解 API 用法,再尝试编写完整自动化流程。
#DRC
#Guard Ring
#SKILL脚本
#Via规则
#Virtuoso
#学习路线
#版图设计