共计 1891 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点:为什么需要版图 skill?
每次手工调整 PCB 走线到深夜时,我总在思考:为什么不能像写代码那样自动化处理这些重复劳动?传统设计流程存在三大顽疾:

- 耗时操作集中:批量修改 200 个过孔属性需要逐个点击,工程师 30% 时间消耗在机械操作上
- 版本控制困难:人工操作难以记录设计意图,每次改版都可能引入新错误
- 规则检查滞后:DRC 检查往往在后期才能发现问题,导致大量返工
技术对比:skill vs Python
在 Cadence 环境中,自动化方案主要有两种选择:
- 版图 skill(推荐选择)
- 原生集成在 Virtuoso 平台,执行效率高(比 Python 快 3 - 5 倍)
- 直接操作数据库对象,如
axlDBGetDesign()获取当前设计 -
支持交互式调试(
Ctrl+X快捷键进入命令行) -
Python 脚本
- 需要配置 API 桥梁(如 PySkill)
- 处理复杂几何运算时有优势
- 更适合数据后处理场景
核心语法精要
过程定义与参数传递
; 定义带默认参数的函数
defun(MyCreateWire (width @optional (layer "TOP"))
let((wireObj)
wireObj = axlPathStart(
?width width
?layer layer
)
axlPathAddPoint(wireObj 0:0) ; 起点坐标(0,0)
axlPathAddPoint(wireObj 1000:1000) ; 终点坐标(1000um,1000um)
axlPathFinish(wireObj)
)
)
数据库对象操作
; 批量修改过孔属性
procedure(ChangeAllVias(diameter)
foreach(via axlDBGetDesign()->vias
when( via->objType == "VIA"
axlSetField(via "DIAMETER" diameter)
)
)
axlUpdateDesign() ; 必须调用才能生效)
实战案例:自动避让布线
以下实现一个智能绕开障碍物的布线算法:
/*
* 自动避让布线函数
* @param startPt 起点坐标,如 list(0 0)
* @param endPt 终点坐标
* @param obstacles 障碍物对象列表
* @param width 线宽(单位 um)*/
defun(SmartRoute (startPt endPt obstacles width)
let((path obsBBox)
; Step1 创建初始路径
path = axlPathStart(
?width width
?layer "BOTTOM"
)
axlPathAddPoint(path startPt)
; Step2 处理每个障碍物
foreach( obs obstacles
obsBBox = axlGetExtents(obs)
when(axlIsPointInsideBBox(startPt obsBBox)
; 如果起点在障碍物内,先垂直逃逸
axlPathAddPoint(path
list(car(startPt) cadr(obsBBox->hi)+10)
)
)
; 添加绕行点(简化版)axlPathAddPoint(path
list(car(obsBBox->hi)+10 cadr(endPt))
)
)
; Step3 连接终点并完成布线
axlPathAddPoint(path endPt)
axlPathFinish(path)
println("布线完成!消耗长度:"
axlLineLength(path->segments)
)
)
)
性能优化技巧
处理万级元件版图时需注意:
-
增量更新:
axlSetVariable("batchMode" t) ; 开启批处理模式 axlSetVariable("dynamicUpdate" nil) ; 禁止实时刷新 -
内存管理:
- 使用
let限定变量作用域 -
大列表处理优先用
mapcar代替foreach -
对象缓存:
; 预加载所有元件 components = axlDBGetDesign()->components
常见错误排查
| 错误现象 | 解决方法 |
|---|---|
*Error* eval: unbound variable |
检查变量是否在 let 中声明 |
| 脚本执行无效果 | 确认末尾调用了axlUpdateDesign |
| 坐标越界 | 使用 axlGetExtents 获取合法范围 |
进阶思考题
- 如何实现元件按坐标自动对齐功能?
- 设计一个自动添加泪滴的通用函数
- 当两个网络间距小于 0.2um 时自动报警
从手动绘图到脚本自动化,就像从自行车换成了高铁。刚开始学习 skill 语法可能需要适应期,但当你看到深夜的办公室因为脚本自动完成任务而提前熄灯时,一切付出都值得了。下次可以试试把常用功能封装成菜单按钮,让整个团队都享受自动化的便利。
正文完
