Skill语言入门:从基础语法到实战项目开发

5次阅读
没有评论

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

image.webp

技术背景

Skill 语言是 Cadence EDA 工具链中的专用脚本语言,尤其在 Virtuoso 平台中扮演着自动化核心角色。与 Tcl/Python 等通用脚本语言相比,Skill 具有以下特性差异:

Skill 语言入门:从基础语法到实战项目开发

特性 Skill Python
执行环境 内嵌于 Cadence 工具 独立解释器
执行效率 直接调用 EDA 内核 API 需通过接口层转换
数据类型 动态类型 +EDA 对象系统 动态类型
典型应用 版图批量操作 算法开发 / 数据分析

开发环境配置

  1. 确认 Cadence 安装路径(通常为/cadence/IC617
  2. 在 home 目录创建或修改 .skill.cshrc 文件:
;; 加载默认库路径
loadi(strcat(getShellEnvVar("CDS_ROOT") "/tools/dfII/samples/skill/local/load.il"))
;; 设置自定义脚本搜索路径
setSkillPath(append1(getSkillPath() '("./skill_lib")))
  1. 启动 Virtuoso 后在 CIW 窗口输入 skill 进入交互模式

核心语法精讲

特殊表处理

  • list:可嵌套的异构容器,支持 car/cdr 操作

    myList = list(1 'a list(2 3))  ;=> (1 a (2 3))

  • defun:定义函数时自动创建局部变量作用域

    defun(addSquares (x y)
      let((sum)
        sum = x*x + y*y
        sum  ; 隐式返回值
      )
    )

  • progn:顺序执行多个表达式并返回最后结果

动态类型系统

类型检查发生在运行时,常见类型转换函数:

numberp(1.23)  ;=> t
stringp("text") ;=> t
listp('(a b))  ;=> t

实战代码示例

MOSFET 生成脚本

procedure(createNMOS (@key (w 1u) (l 180n) (fingers 1))
  let((cellId libId)
    libId = ddGetObj("analogLib")
    cellId = dbCreateCell(libId "nmos_auto")

    ;; 参数化器件生成
    pcDefinePCell(list(ddGetObj("basic") "nmos" "symbol")
      list(list("w" w "float")
        list("l" l "float")
      )
      let((master)
        master = pcCellMaster
        dbCreateParamInst(cellId master "I0" list(0 0) "R0" 1)
      )
    )
    cellId
  )
)

版图属性批量修改

defun(batchChangeProp (objList propName newVal)
  foreach(obj objList
    when(obj~>propName
      dbReplaceProp(obj propName newVal)
    )
  )
  t  ; 返回成功标志
)

避坑指南

常见错误处理

  1. *Error* eval: undefined function
  2. 检查函数名拼写
  3. 确认是否加载所需库文件

  4. 内存泄漏排查:

  5. 使用 status(freeHeap) 监控内存
  6. 及时释放 EDA 对象引用

进阶学习

  1. OpenAccess API:通过 oa<ClassName> 访问数据库对象
  2. AEL 语言:Skill 的扩展语法糖

思考题

  1. 如何实现自动计算并填充 MOSFET 的 finger 宽度?
  2. 编写递归函数统计版图中所有文本对象的数量
  3. 设计闭包函数实现属性修改的 undo 功能
正文完
 0
评论(没有评论)