共计 2492 个字符,预计需要花费 7 分钟才能阅读完成。
技术背景
Allegro Skill Code 是 Cadence Allegro PCB 设计工具中专用的脚本语言,属于 EDA(Electronic Design Automation)工具链中的关键自动化组件。与传统的 TCL 或 VBScript 相比,Skill Code 直接内置于 Allegro 运行时环境,能够直接操作 PCB 设计对象(如元件 component、网络 net、铜箔 shape 等),无需通过中间接口层。这种深度集成带来了显著的性能优势——在我们的实测中,批量处理 1000 个元件的操作,Skill Code 比 TCL 快 5 - 8 倍。

但 Skill Code 的学习曲线较为陡峭:官方文档分散在多个 PDF 中,且缺少实际工程场景的示例。例如修改过孔属性的标准函数 axlDBCreateVia() 在 17.2 和 22.1 版本的参数顺序完全不同,这种版本差异在文档中往往没有明显标注。
核心语法精要
函数定义与 PCB 对象操作
Skill 采用 Lisp 方言语法,函数定义使用 procedure 关键字。以下代码演示如何获取当前设计的全部元件:
procedure(getAllComponents()
let((design)
design = axlDBGetDesign()
axlDBGetDesign()->components ; 返回组件列表)
)
关键点:
– axlDBGetDesign()获取当前 PCB 设计对象(相当于面向对象中的 this)
– 箭头运算符 -> 用于访问对象成员(类似 C ++ 的->)
列表处理与迭代
Skill 提供丰富的列表操作函数,推荐使用 foreach 而非 while 进行遍历:
foreach(comp getAllComponents()
printf("Component %s located at %L" comp->name comp->xy)
)
对于复杂转换,mapcar比循环更简洁:
; 将所有元件名转为大写
mapcar('upcase (getAllComponents())->name)
文件 IO 操作
写入设计数据到 CSV 的典型模式:
let((csvPort)
csvPort = outfile("components.csv" "w")
fprintf(csvPort "Name,X,Y\n")
foreach(comp getAllComponents()
fprintf(csvPort "%s,%f,%f\n" comp->name xCoord(comp->xy) yCoord(comp->xy))
)
close(csvPort)
)
实战案例
案例 1:批量修改过孔属性
procedure(changeViaProperties(@optional (oldLayer "TOP") (newLayer "BOTTOM"))
let((vias failed)
vias = axlDBGetDesign()->vias
failed = nil
foreach(via vias
when(via->startLayer == oldLayer
try(
axlDBCreateVia(
?name via->name
?startLayer newLayer ; 关键修改处
?endLayer via->endLayer
?x via->xy->x
?y via->xy->y
)
axlDeleteObject(via) ; 必须删除旧对象
)
catch(err
failed = cons(via failed)
axlMsgPut("Failed on via %s: %s" via->name err->message)
)
)
)
axlFlushRedraw() ; 谨慎调用:每次重绘消耗约 50ms
failed ; 返回失败列表
)
)
优化提示:
– 通过 @optional 参数提供默认值
– 使用 try-catch 捕获 axlDBCreateVia 可能抛出的层叠规则错误
案例 2:元件位号自动调整
procedure(autoRenameRefdes(@key (prefix "U") (startNum 1))
let((comps counter)
comps = sort(getAllComponents() 'lessp'name) ; 按原名排序
counter = startNum
foreach(comp comps
comp->name = sprintf(nil "%s%d" prefix counter++)
when(comp->isMirror
comp->text->text = strcat(comp->name "*") ; 镜像元件加标记
)
)
t ; 返回成功标识
)
)
避坑指南
内存管理
Skill 没有自动垃圾回收,必须显式释放资源:
let((shapeList)
shapeList = axlDBGetShapes() ; 获取铜箔列表
... ; 处理代码
axlClearObjectCache() ; 手动清理)
版本兼容
检查 Allegro 版本的推荐方式:
when(axlVersion('version) >= 22.1
; 新版 API 代码
...
~
; 旧版兼容代码
...
)
调试技巧
printf输出到控制台,适合开发阶段axlMsgPut显示在 Allegro 消息窗口,适合用户提示- 使用
axlUIConfirm中断脚本执行确认中间状态
进阶建议
函数库封装
建议按功能模块组织代码,例如创建via_utils.il:
; File: via_utils.il
procedure(viaChangeLayer(via oldLayer newLayer)
...
)
procedure(viaCopyProperties(srcVia dstVia)
...
)
在启动脚本中加载:
load("via_utils.il")
官方 API 配合
Cadence 提供的 axlCoreSkill 包含未文档化的底层函数,例如:
axlCoreSkill("axlGetXSection") ; 获取层叠结构对象
使用时需自行测试稳定性。
结语
通过系统性地掌握 Skill Code,我们团队已将重复性 PCB 操作耗时降低 65%。建议从小的实用函数开始积累,逐步构建自己的工具库。遇到复杂问题时,不妨直接分析 allegro.ilinit 中的官方实现——这往往比文档更有启发性。
