从零开始掌握Skill:一份面向开发者的高效入门教程

2次阅读
没有评论

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

image.webp

Skill 语言简介

Skill 是 Cadence 公司开发的一种脚本语言,主要用于电子设计自动化 (EDA) 工具的扩展和自动化。它的主要特点包括:

从零开始掌握 Skill:一份面向开发者的高效入门教程

  • 专为 EDA 工具优化的语法结构
  • 强大的数据处理能力
  • 可直接调用 EDA 工具 API
  • 支持面向对象编程

Skill 最常见的应用场景包括:

  • 自动化重复性设计任务
  • 创建自定义 EDA 工具命令
  • 数据分析和报告生成
  • 设计流程自动化

开发环境搭建

  1. 安装 Cadence IC 工具套件(包含 Skill 解释器)
  2. 配置环境变量
  3. 设置 CDS_ROOT 指向 Cadence 安装目录
  4. 将 $CDS_ROOT/tools/bin 加入 PATH
  5. 验证安装
  6. 在终端输入 ”virtuoso &” 启动 Cadence Virtuoso
  7. 在 CIW 窗口输入 ”skill” 进入交互模式

基础语法讲解

数据类型和变量声明

Skill 支持多种基本数据类型:

; 整数
num = 123

; 浮点数
fnum = 3.14

; 字符串
str = "Hello Skill"

; 列表
lst = list(1 2 3 "four")

; 符号
sym = 'symbol

; 布尔值
trueVal = t
falseVal = nil

控制结构

条件判断

; if 语句
if( x > 10 then
    printf("x is greater than 10\n")
else
    printf("x is 10 or less\n")
)

; cond 语句
cond
    ((x < 0)  printf("Negative\n") )
    ((x == 0) printf("Zero\n") )
    (t        printf("Positive\n") )
)

循环

; for 循环
for( i 0 9
    printf("Count %d\n" i)
)

; while 循环
count = 0
while( count < 10
    printf("While count %d\n" count)
    count++
)

; foreach 循环
foreach(element list(1 2 3 4 5)
    printf("Element %L\n" element)
)

函数定义和调用

; 定义函数
defun(addTwoNumbers (a b)
    a + b
)

; 调用函数
sum = addTwoNumbers(3 5)
printf("Sum is %d\n" sum)

; 匿名函数
lambdaFunc = lambda((x y) x * y )
result = apply(lambdaFunc list(4 5))

实用代码示例

示例 1:批量重命名器件

procedure(renameDevices(@optional (cellViewId geGetEditCellView()))
    let((instances newName)
        ; 获取当前 cell 中的所有实例
        instances = geGetInstances(cellViewId)

        ; 遍历并重命名
        foreach( inst instances
            newName = sprintf(nil "inst_%s" inst->name)
            dbRenameInst(inst newName)
            printf("Renamed %s to %s\n" inst->name newName)
        )
    )
)

示例 2:自动创建矩形

procedure(createRectangle(layerName width height)
    let((rect bBox)
        ; 创建边界框
        bBox = list(0:0 width:height)

        ; 在指定层创建矩形
        rect = dbCreateRect(geGetEditCellView() layerName bBox)

        printf("Created rectangle on layer %s\n" layerName)
        rect
    )
)

示例 3:属性查询工具

procedure(displayProperties(obj)
    let((props)
        ; 获取对象属性
        props = obj~>?

        ; 显示属性
        printf("Properties of %s:\n" obj~>objType)
        foreach( prop props
            printf("%s: %L\n" prop get(obj prop))
        )
    )
)

常见错误与调试技巧

错误 1:变量未定义

; 错误
x = y + 1  ; y 未定义

; 解决方法
y = 5      ; 先定义 y
x = y + 1  ; 再使用

错误 2:括号不匹配

; 错误
defun(add a b
    a + b

; 解决方法
defun(add (a b)
    a + b
)

错误 3:类型不匹配

; 错误
x = "123"
y = x + 1  ; 不能将字符串与数字相加

; 解决方法
x = atoi("123")  ; 先转换为整数
y = x + 1

调试技巧

  1. 使用 printf 输出中间值
  2. 在 CIW 窗口使用 ”trace” 命令跟踪函数调用
  3. 使用 ”setBreakpoint” 设置断点
  4. 使用 ”skillDebugger” 启动图形化调试器
  5. 检查返回值是否与预期一致

进阶学习建议

  1. 官方文档
  2. Cadence Skill Language User Guide
  3. Skill API Reference

  4. 实用技巧

  5. 学习使用 db 函数操作设计数据库
  6. 掌握 hi 函数处理用户界面
  7. 了解 axl 函数用于 Allegro PCB 设计

  8. 社区资源

  9. Cadence Support Community
  10. Skill 编程论坛

  11. 项目实践

  12. 自动化版图 DRC 检查
  13. 创建自定义设计规则
  14. 开发参数化单元(PCell)

实践练习

尝试完成以下任务来巩固所学知识:

  1. 编写一个 Skill 函数,计算从 1 加到 n 的和
  2. 创建一个程序,在指定层上绘制一个十字形图案
  3. 开发一个脚本,查找并列出设计中所有宽度小于最小值的连线
  4. 实现一个交互式命令,允许用户选择器件并显示其属性

完成练习后,可以在 Cadence Virtuoso 的 CIW 窗口中测试你的代码。记住,Skill 编程最有效的学习方式就是不断实践和尝试解决实际问题。

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