共计 1414 个字符,预计需要花费 4 分钟才能阅读完成。
为什么需要学习 Skill 脚本?
在 IC 版图设计中,手动操作不仅效率低下,而且容易出错。比如一个简单的 DRC(设计规则检查)可能需要重复点击几十次菜单,而用 Skill 脚本只需几秒钟就能完成。根据实测数据:

- 批量修改 1000 个晶体管尺寸:手动操作需 2 小时,脚本仅需 8 秒
- 金属层(metal layer)密度检查:手动抽样检查需 1 天,脚本全检仅 15 分钟
环境配置三步走
-
确认 Virtuoso 版本
在 CIW 窗口输入version()查看版本号,建议 618 以上版本支持最新 API -
设置加载路径
在.cdsinit文件中添加:load("/path/to/your_script.il") -
测试交互式环境
在 CIW 输入println("Hello Skill")看到输出即表示环境正常
从 Hello World 到实际应用
基础语法三要素
-
列表(list)处理:
layers = list("M1" "M2" "M3") ; 创建金属层列表 nth(1 layers) ; 获取第二个元素(索引从 0 开始) -
循环控制:
foreach(layer layers printf("Processing %s layer\n" layer) ) -
条件判断:
if( layer == "M1" then width = 0.1 else width = 0.2 )
实用代码示例:矩形阵列生成
/* 生成 5x5 矩形阵列 */
procedure(createRectArray(@optional (cell "TOP") (layer "M1"))
let((cv width height spacing)
cv = dbOpenCellViewByType("lib" cell "layout" """a") ; 打开版图视图
width = 0.5 ; 单个矩形宽度(um)
height = 1.0 ; 单个矩形高度(um)
spacing = 2 ; 间距系数
for(i 0 4 ; 行循环
for(j 0 4 ; 列循环
dbCreateRect(
cv
list(layer "drawing") ; 指定图层和 purpose
list(i*width*spacing j*height*spacing ; 左下角坐标
(i+1)*width*spacing (j+1)*height*spacing) ; 右上角坐标
)
)
)
dbSave(cv)
printf("阵列生成完成,请检查 %s 层 \n" layer)
)
)
避坑指南
性能优化三原则
- 避免在循环内打开 / 保存 cellView
- 使用
mapcar替代嵌套foreach - 大数据量操作时定期
gc()释放内存
与 Calibre 集成技巧
/* 自动导出 GDS 并调用 DRC */
drcRun = list('gdsFile"/path/to/output.gds"'ruleFile"/pdks/tech/calibre/rule.drc"'runDir"/tmp/drc_run")
calibre(nil drcRun)
课后作业与进阶
实践任务:修改矩形阵列脚本,实现:
1. 支持六边形阵列生成
2. 添加错误处理(检查图层是否存在)
3. 输出运行日志到文件
官方资源:
– Cadence 文档:cdnshelp → Virtuoso → Skill API
– 实用函数库:$CDSHOME/tools/dfII/samples/skill
写在最后
刚开始写 Skill 脚本可能会觉得不如手动操作快,但就像学自行车一样,度过最初的不适应期后,你会发现自动化带来的效率提升是指数级的。建议从小的实用脚本开始,比如自动标注尺寸、批量重命名等,逐步积累自己的脚本库。
正文完
