共计 2289 个字符,预计需要花费 6 分钟才能阅读完成。
从重复性劳动说起
每次在 Altium Designer 里手动标注 200 个元件的坐标,或者在 Cadence Allegro 中逐个检查 DRC 错误时,我都忍不住想:这些重复操作难道不能交给程序吗?直到发现 Skill 脚本——这个 EDA 工具链中的瑞士军刀,我的设计效率终于迎来转折点。

语言选型:Skill vs Python
- 执行效率:Skill 脚本直接运行在 EDA 工具进程内,比通过 COM 接口调用的 Python 快 3 - 8 倍
- API 支持度:Cadence 官方提供超过 2000 个 axl 开头的专属函数(如 axlDBCreateShape),这是外部语言无法比拟的优势
- 学习成本:Python 生态更丰富,但 Skill 与 EDA 操作深度绑定,例如下面这个对比:
;; Skill 直接操作设计数据库 axlDBDeleteObject(axlDBCreateRectangle(list(0:0 100:100) "TOP"))# Python 需要通过 CLI 接口 subprocess.run(['allegro_exec', '-s', 'delete_shape.scr'])
语法速成课
1. 数据结构处理
Skill 的 list 和 dict 与常规语言差异较大:
;; 列表声明(注意单引号与括号的组合)pinLocations = '((10 20)"R1.1"(30 40)"U3.A12" )
;; 字典等效实现
props = makeTable("propsTable")
props["tol"] = "±5%" ;; 注意字符串用双引号
2. 流程控制
;; 带条件判断的循环
foreach(pin pins
when(pin->layer == "BOTTOM"
printf("%L is on bottom\n" pin->name)
)
)
调试技巧
-
实时输出:在 Allegro 命令栏直接注册调试命令
axlCmdRegister("debug" 'printVars) procedure(printVars() axlUIWPrint(nil "Current var1: %L" var1) ) -
断点调试 :使用
break函数和resume命令procedure(checkDRC() break("Check violations") ;; 检查代码... )
模块化开发实战
元件坐标报告生成器
/*--------------------------------------------------------------*
* 功能:生成 CSV 格式的元件坐标报告
* 参数:* layerFilter - 可选,指定层别(如 "TOP")* 返回值:生成的文件路径
* 内存管理:显式释放选择集内存
*--------------------------------------------------------------*/
procedure(genComponentReport(layerFilter)
;; 参数校验
when(layerFilter && !stringp(layerFilter)
error("Layer filter must be string")
)
let((selSet outFile)
;; 创建选择集(内存敏感操作)selSet = axlSingleSelectObjects(
?objects 'comp
?filter (if layerFilter then
list(strcat("LAYER==" layerFilter)))
)
;; 生成报告
outFile = strcat(axlTempDir() "/comp_report_",
getCurrentTime(), ".csv")
outPort = outfile(outFile)
fprintf(outPort "RefDes,X,Y,Rotation\n")
foreach(comp selSet
fprintf(outPort "%s,%.4f,%.4f,%.2f\n"
comp->name
comp->xy->x
comp->xy->y
comp->rotation
)
)
close(outPort)
;; 关键!释放选择集内存
axlClearSelSet(selSet)
skillFree(selSet)
;; 返回文件路径
outFile
)
)
避坑指南
1. 动态作用域陷阱
;; 错误示例:函数意外修改全局变量
defun(calcArea()
radius = 10 ;; 可能覆盖外部同名变量
3.14 * radius * radius
)
;; 正确做法:使用 let 创建局部作用域
defun(calcArea()
let((radius)
radius = 10
3.14 * radius * radius
)
)
2. 版本兼容性处理
;; 检查 Allegro 版本再调用 API
when(axlVersion('version) >= 17.2
;; 使用新版布线引擎
axlDBAutoRoute(?algorithm "adaptive")
t
else
;; 旧版兼容方案
axlDBAutoRoute(nil)
)
思考题延伸
如何实现差分对自动等长布线?这里给出伪代码思路:
procedure(autoLengthTuning(diffPair)
;; 1. 获取当前差分对
;; 2. 测量原始长度差
;; 3. 计算需要补偿的蛇形线参数
;; 4. 应用 axlDBCreateTuning 函数
;; 5. 验证等长误差
)
实际开发中需要处理:阻抗匹配规则、最小弯曲半径约束、避开禁布区等复杂条件。这正体现了 Skill 脚本的价值——将工程师的经验转化为可重复执行的智能流程。
下一次当你面对重复设计任务时,不妨先问自己:这个操作能否用 Skill 脚本自动化?往往只需 20 行代码,就能省下 2 小时手工劳动。
正文完
