共计 2430 个字符,预计需要花费 7 分钟才能阅读完成。
背景与痛点
作为一名 EDA 工程师,在日常的电路设计过程中,我们经常会遇到一些重复性高、操作繁琐的任务。比如:

- 手动批量修改元件属性
- 重复走线布线操作
- 设计规则检查 (DRC) 的反复执行
- 生成标准化的报告文档
这些工作不仅耗时费力,还容易因为人为因素导致错误。传统的手动操作方式已经成为提升设计效率的主要瓶颈。
EDA365 Skill 正是为了解决这些问题而生的自动化工具,它基于 Lisp 语言的变体,可以让我们通过编写脚本来自动化这些重复性工作。但很多工程师在使用时遇到了几个常见困难:
- 学习曲线陡峭,语法不熟悉
- 不知道如何将日常任务转化为脚本
- 脚本执行效率低下
- 调试困难
Skill 脚本基础
让我们先从最基本的 Skill 语法开始。Skill 语言虽然基于 Lisp,但为了适应 EDA 环境做了一些特殊优化。以下是最常用的语法元素:
- 变量定义
(setq myVar 10) ; 定义变量并赋值
- 函数定义
(defun myFunction (arg1 arg2)
"这是一个示例函数"
(+ arg1 arg2)) ; 返回两个参数的和
- 条件判断
(if (> a b)
(println "a 大于 b")
(println "a 不大于 b"))
- 循环结构
(foreach elem myList
(println elem)) ; 遍历列表并打印每个元素
- 常用 EDA 函数
(drcCheck design) ; 执行 DRC 检查
(createWire startPoint endPoint width) ; 创建走线
(getProp component "propertyName") ; 获取元件属性
自动化设计实现
让我们通过一个实际案例来演示如何自动化设计流程。假设我们需要批量修改设计中所有电阻的阻值:
; 定义修改电阻值的函数
(defun changeResistorValues (design newValue)
"将设计中所有电阻值改为 newValue"
(let ((resistors (getComponents design "RESISTOR"))) ; 获取所有电阻元件
(foreach res resistors
(setProp res "VALUE" newValue) ; 设置新的阻值
(println (strcat "已修改电阻" (getProp res "REFDES") "的值为" newValue)))))
; 调用函数
(changeResistorValues myDesign "10K")
这个脚本展示了几个关键点:
- 使用
getComponents获取特定类型的元件 - 通过
foreach遍历所有符合条件的元件 - 使用
setProp修改元件属性 - 添加日志输出以便调试
性能优化
随着设计规模增大,脚本执行效率变得至关重要。以下是几个优化建议:
- 减少数据库访问
; 不佳的方式 - 每次循环都访问数据库
(foreach comp (getComponents design)
(setProp comp "TEMP" (calculateTemp comp)))
; 优化方式 - 批量获取数据
(let ((components (getComponents design))
(properties (mapcar calculateTemp components)))
(foreach comp components prop properties
(setProp comp "TEMP" prop)))
- 使用并行处理
对于大型设计,可以利用 EDA365 的并行处理功能:
(parallel
(foreach group (splitList bigList 4) ; 将任务分成 4 组
(processComponentGroup group)))
- 缓存常用数据
; 定义全局缓存表
(setq *propertyCache* (makeTable "propertyCache"))
(defun getCachedProp (comp propName)
(or (getTableEntry *propertyCache* (strcat (getProp comp "REFDES") propName))
(let ((value (getProp comp propName)))
(putTableEntry *propertyCache* (strcat (getProp comp "REFDES") propName) value)
value)))
避坑指南
在 Skill 脚本开发过程中,我们总结了一些常见问题及解决方案:
- 变量作用域问题
; 错误示例
(defun badExample ()
(setq temp 10) ; 隐式创建全局变量
...)
; 正确做法
(defun goodExample ()
(let ((temp 10)) ; 使用 let 限定作用域
...))
- 内存泄漏
长时间运行的脚本可能会积累大量未释放的对象,定期使用 gc() 强制垃圾回收。
- 错误处理
(defun safeOperation ()
(catch 'error
(when (errorOccurred)
(throw 'error" 操作失败 "))
;; 正常操作
))
-
调试技巧
-
使用
println输出中间结果 - 利用
trace函数跟踪函数调用 - 设置
(debug t)开启调试模式
互动环节
现在,我建议你尝试完成一个小练习:编写一个脚本,自动将设计中所有电容按值分类并统计数量。你可以使用以下函数作为起点:
(defun countCapacitors (design)
"统计设计中不同值的电容数量"
;; 在这里实现你的代码
)
完成后,不妨在评论区分享你的实现方法和遇到的挑战。我们也可以一起讨论如何进一步优化这个脚本。
结语
通过本文的介绍,相信你已经对 EDA365 Skill 有了基本的了解。从简单的属性修改到复杂的设计流程自动化,Skill 脚本可以大幅提升我们的工作效率。记住,自动化是一个渐进的过程,可以从小的任务开始,逐步构建你的脚本库。
在实际应用中,建议:
- 先为最耗时的重复性任务编写脚本
- 保持代码模块化,便于复用
- 添加充分的注释和日志
- 定期备份重要的脚本
随着经验的积累,你会发现越来越多可以用自动化优化的环节。希望本文能成为你 EDA 自动化之旅的良好开端。
