Allegro23.1 SKILL脚本开发入门:从零开始制作PCB设计自动化工具

1次阅读
没有评论

共计 2026 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

为什么选择 SKILL 脚本自动化

在 PCB 设计过程中,工程师经常面临大量重复性操作,比如元件重命名、设计规则检查、报表生成等。传统的手动操作不仅效率低下,还容易出错。常见的自动化方案包括:

Allegro23.1 SKILL 脚本开发入门:从零开始制作 PCB 设计自动化工具

  • 宏录制:操作简单但灵活性差,无法处理复杂逻辑
  • 第三方脚本语言(如 Python):功能强大但需要额外接口支持
  • SKILL 语言:Cadence 原生支持,直接调用 Allegro API,执行效率最高

SKILL 作为 Allegro 的内置脚本语言,能够深度集成设计环境,实现真正的无缝自动化。下面我们从基础语法开始逐步掌握 SKILL 开发。

SKILL 语言基础速成

1. 数据类型与变量

; 基本数据类型示例
a = 123                  ; 整数
b = 3.14                ; 浮点数
c = "Hello"             ; 字符串
d = list(1 2 3)         ; 列表
e = make_table("data")  ; 哈希表
  • 动态类型:变量无需声明类型
  • 特殊值:t表示真,nil表示假
  • 列表操作:car取首元素,cdr取剩余元素

2. 控制结构

; 条件判断
when(a > 10
  println("大于 10")
  )

; 循环结构
for(i 1 10
  printf("当前值:%d\n" i)
  )

; 异常处理
errset(axlDBOpenDesign(nil t)
  println("设计文件打开成功")
  )

3. 函数定义

procedure(addNumbers(a b)
  prog((sum)
    sum = a + b
    return(sum)
    )
  )
  • procedure定义函数
  • prog用于局部变量声明
  • 最后一个表达式的值作为返回值

实战案例精讲

案例 1:元件批量重命名

/*
 * 功能:按指定前缀 + 序号重命名所有元件
 * 参数:prefix- 新名称前缀
 */
procedure(renameComponents(prefix)
  prog((comp count)
    count = 1
    foreach(comp axlDBGetDesign()->components
      axlRenameComp(comp 
                   sprintf(nil "%s%d" prefix count))
      count++
      )
    axlUIWPrint(nil "已完成 %d 个元件重命名" count-1)
    )
  )

关键 API 说明
axlDBGetDesign: 获取当前设计对象
axlRenameComp: 重命名元件
axlUIWPrint: 在 Allegro 命令行输出信息

案例 2:设计规则检查自动化

procedure(autoDRC()
  prog((violations)
    ; 执行所有 DRC 检查
    axlDrcCheckAll()

    ; 获取违规列表
    violations = axlGetViolations()

    ; 生成报告文件
    with(outfile "drc_report.txt" "w"
      fprintf(outfile "发现 %d 个 DRC 违规 \n\n" length(violations))
      foreach(v violations
        fprintf(outfile "类型:%s\n 位置:%L\n\n" 
               v->type v->xy)
        )
      )
    )
  )

异常处理
– 添加 errset 包裹关键操作
– 检查文件写入权限

案例 3:BOM 报表自动生成

procedure(generateBOM()
  prog((comps outfile)
    ; 按参考编号排序元件
    comps = sort(axlDBGetDesign()->components 
                'lesspByRefdes)

    ; 创建 CSV 文件
    outfile = outfile("bom.csv" "w")
    fprintf(outfile "RefDes,Value,Footprint\n")

    ; 写入元件数据
    foreach(c comps
      fprintf(outfile "%s,%s,%s\n" 
             c->refdes c->compValue c->footprint)
      )
    close(outfile)
    )
  )

优化技巧
– 使用 sort 提高查找效率
– 流式写入避免内存溢出

避坑指南

常见语法错误

  1. 括号不匹配:SKILL 使用 Lisp 风格语法,每个左括号必须对应右括号
  2. 变量作用域 prog 中声明的变量才是局部的
  3. 字符串比较 :使用equal 而非 == 比较字符串

性能优化

  • 批量操作:尽量使用 axlDBGetDesign 一次获取所有数据
  • 缓存重用:重复使用的数据保存到变量
  • 延迟更新:复杂操作前调用 axlVisibleUpdate(nil) 暂停界面刷新

版本兼容

  • API 差异:23.1 版本使用 axl 前缀,旧版可能用 db 前缀
  • 功能检测:使用 isCallable('axlNewFunction) 判断 API 可用性

进阶思考方向

  1. 外部系统集成 :通过 SKILL 的system 函数调用外部程序,或使用 Socket 实现网络通信
  2. 复杂规则实现:将设计规则抽象为条件判断 + 几何运算的组合
  3. 用户界面扩展 :使用axlFormCreate 创建自定义对话框

学习建议

建议从简单脚本开始,逐步增加复杂度。Cadence 安装目录下的 skill 文件夹包含大量示例脚本,是极好的学习资源。遇到问题时,善用 Allegro 命令行中的 help 命令查询 API 文档。

正文完
 0
评论(没有评论)