烽火戏诸侯的个人空间 https://blog.eetop.cn/1769267 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

BOX

已有 394 次阅读| 2025-4-1 22:26 |系统分类:芯片设计

procedure(autoFillLVSBox()
    let((lvsForm ruleCheckbox inputField)
        ; 获取当前LVS验证窗口
        lvsForm = hiGetCurrentForm()
        unless(lvsForm && lvsForm->name == "lvsForm" 
            error("请先打开LVS验证窗口")
        )

        ; 定位include规则复选框(可能需要根据实际控件名称调整)
        ruleCheckbox = hiFindWidget(lvsForm "includeRuleStatements")
        when(ruleCheckbox
            hiFormButtonSelect(ruleCheckbox t)  ; 勾选复选框
        )

        ; 定位输入框并填写内容(可能需要调整控件标识)
        inputField = hiFindWidget(lvsForm "ruleIncludeField")
        when(inputField
            hiSetTextEntryValue(inputField "LVS BOX 1")
        )

        printf("LVS选项设置完成\n")
    )
)



点赞

全部作者的其他最新日志

发表评论 评论 (5 个评论)

回复 烽火戏诸侯 2025-4-2 12:05
在 Virtuoso 617 中,SKILL API 的函数名称和使用方式可能与新版本有所不同。以下是调整后的脚本及分步说明:

```skill
procedure(autoFillLVSBox()
    let((lvsForm ruleCheckbox inputField)
        ; 获取当前窗口 - 可能需要根据窗口标题或类型获取
        lvsForm = car(axlWindowGetAllOpen('LVS)) ; 假设窗口标题包含"LVS"
        unless(lvsForm
            error("请先打开LVS验证窗口")
        )

        ; 定位include规则复选框 - 需要实际控件名称
        ruleCheckbox = axlFormGetField(lvsForm "Include Rules")
        when(ruleCheckbox
            axlFormSetField(ruleCheckbox t)  ; 勾选复选框
        )

        ; 定位输入框 - 需要实际控件名称
        inputField = axlFormGetField(lvsForm "Rule File")
        when(inputField
            axlFormSetFieldValue(inputField "LVS BOX 1")
        )

        printf("LVS选项设置完成\n")
    )
)
```

**分步说明:**

1. **获取LVS窗口对象:**
   - 使用 `axlWindowGetAllOpen` 获取所有打开的LVS窗口
   - 通过窗口标题过滤(可能需要调整匹配字符串)
   - 如果获取失败提示错误

2. **操作复选框:**
   - 使用 `axlFormGetField` 通过控件标签获取复选框对象
   - 使用 `axlFormSetField` 设置选中状态(t 表示选中)

3. **填写输入框:**
   - 使用 `axlFormGetField` 通过控件标签获取输入框对象
   - 使用 `axlFormSetFieldValue` 设置输入框的值

4. **调试提示:**
   ```skill
   ; 打印所有字段名称用于调试
   axlFormDumpFields(lvsForm)
   ```

**注意事项:**

1. 必须通过CIW窗口菜单启动LVS验证,确保窗口对象存在
2. 实际控件名称需要通过以下方式获取:
   - 在LVS窗口打开时执行 `axlFormDumpFields(lvsForm)`
   - 在CIW窗口查看所有字段名称
3. 可能需要根据实际控件类型调整设置方法:
   - 对于按钮使用 `axlFormButtonPress`
   - 对于单选按钮使用 `axlFormSetFieldRadio`

**扩展建议:**
```skill
; 通用表单操作函数示例
procedure(setFormField(form field value)
    let((widget)
        widget = axlFormGetField(form field)
        when(widget
            case(widget->type
                ("CheckBox" axlFormSetField(widget value))
                ("TextEdit" axlFormSetFieldValue(widget value))
                (t printf("Unsupported widget type: %s\n" widget->type))
            )
        )
    )
)

; 使用示例
setFormField(lvsForm "Include Rules" t)
setFormField(lvsForm "Rule File" "LVS BOX 1")
```

建议通过以下步骤验证:
1. 手动打开LVS窗口
2. 在CIW窗口逐步执行代码片段
3. 使用 `axlFormDumpFields` 查看实际字段结构
4. 根据实际输出调整控件名称和操作方式
回复 烽火戏诸侯 2025-4-2 12:56
以下是对调整后的 SKILL 脚本中 **每个关键函数** 的详细解释,适用于 Virtuoso 617 版本:

---

### **1. 获取 LVS 窗口对象**
```skill
lvsForm = car(axlWindowGetAllOpen('LVS))
```
- **函数作用**:
  - `axlWindowGetAllOpen()`:获取当前所有打开的窗口对象列表。
  - `'LVS`:过滤参数,匹配窗口标题中包含 "LVS" 的窗口(需根据实际窗口标题调整)。
  - `car()`:取列表中的第一个元素,假设用户只打开了一个 LVS 窗口。
- **返回值**:
  - 返回 LVS 验证窗口的表单对象 (`lvsForm`)。
- **注意事项**:
  - 如果打开多个 LVS 窗口,可能需要遍历列表选择正确的窗口。
  - 窗口标题匹配规则可能需要调整(如使用正则表达式)。

---

### **2. 勾选复选框**
```skill
ruleCheckbox = axlFormGetField(lvsForm "Include Rules")
axlFormSetField(ruleCheckbox t)
```
- **函数作用**:
  - `axlFormGetField(form fieldLabel)`:通过控件的显示名称(如 "Include Rules")获取表单内指定控件的对象。
  - `axlFormSetField(widget value)`:设置控件的值,`t` 表示勾选复选框。
- **关键点**:
  - 控件名称需与 LVS 窗口中显示的标签完全一致(区分大小写)。
  - 如果控件是复选框,`t` 表示选中,`nil` 表示取消选中。

---

### **3. 填写输入框**
```skill
inputField = axlFormGetField(lvsForm "Rule File")
axlFormSetFieldValue(inputField "LVS BOX 1")
```
- **函数作用**:
  - `axlFormGetField()`:同上,获取输入框控件对象。
  - `axlFormSetFieldValue(widget value)`:设置输入框的文本内容(如填写路径或规则名称)。
- **注意事项**:
  - 输入框类型可能是 `TextEdit` 或 `TextField`,需确保使用正确的设置函数。

---

### **4. 调试函数**
```skill
axlFormDumpFields(lvsForm)
```
- **函数作用**:
  - 打印表单 (`lvsForm`) 中所有控件的详细信息,包括:
    - 控件名称 (`fieldName`)
    - 显示标签 (`label`)
    - 控件类型 (`type`,如 `CheckBox`、`TextEdit`)
    - 当前值 (`value`)
- **使用场景**:
  - 当不确定控件名称时,在 CIW 窗口执行此函数,查看所有可用字段信息。
  - 示例输出:
    ```
    Field Name: ruleInclude  Label: "Include Rules"  Type: CheckBox  Value: nil
    Field Name: ruleFile    Label: "Rule File"      Type: TextEdit  Value: ""
    ```

---

### **5. 通用表单操作函数(扩展建议)**
```skill
procedure(setFormField(form field value)
  let((widget)
    widget = axlFormGetField(form field)
    when(widget
      case(widget->type
        ("CheckBox" axlFormSetField(widget value))
        ("TextEdit" axlFormSetFieldValue(widget value))
        (t printf("Unsupported type: %s\n" widget->type))
      )
    )
  )
)
```
- **函数作用**:
  - 封装对不同类型控件的统一操作。
  - 根据控件类型 (`widget->type`) 自动选择设置方法:
    - 复选框 (`CheckBox`) → `axlFormSetField`
    - 输入框 (`TextEdit`) → `axlFormSetFieldValue`
- **使用示例**:
  ```skill
  setFormField(lvsForm "Include Rules" t)      ; 勾选复选框
  setFormField(lvsForm "Rule File" "LVS BOX 1") ; 填写输入框
  ```

---

### **常见问题排查**
1. **控件无法找到**:
   - 使用 `axlFormDumpFields` 确认控件名称。
   - 检查窗口标题过滤条件是否准确。
2. **操作未生效**:
   - 确保控件类型匹配(如复选框用 `axlFormSetField`,输入框用 `axlFormSetFieldValue`)。
   - 部分控件可能需要先执行 `axlFormDisplay` 刷新表单状态。
3. **窗口对象获取失败**:
   - 确保 LVS 窗口是通过 CIW 菜单打开的,而非脚本创建的临时窗口。

通过以上函数组合,可以实现对 Virtuoso LVS 表单的自动化操作。实际使用时需根据 `axlFormDumpFields` 的输出调整控件名称和操作逻辑。
回复 烽火戏诸侯 2025-4-2 13:03
在 Cadence Virtuoso 的 SKILL 语言中,`mgc()` 函数的具体用途和参数通常需要结合上下文或文档确认,因为它可能是自定义函数或特定工艺设计工具包(PDK)的一部分。以下是查找其用法和参数的步骤:

---

### 1. **确认函数名称和来源**
   - **检查拼写**:确保函数名正确(如 `mgc()`、`mcg()` 或其他变体)。
   - **确认来源**:是否是 PDK 提供的函数、公司内部库,还是自定义脚本中的函数?

---

### 2. **使用内置帮助工具**
   - 在 Virtuoso 的 **CIW(Command Interpreter Window)** 输入:
     ```tcl
     help mgc
     ```
     或使用 SKILL 函数查看帮助(如果文档已集成)。

---

### 3. **通过 SKILL 函数自省**
   - **查看参数数量和名称**:
     ```tcl
     args(mgc)        ; 返回参数数量
     mgc~>parameters  ; 尝试获取参数名(需函数未加密)
     ```
   - **检查函数类型**:
     ```tcl
     mgc~>type        ; 返回函数类型(如“subr”表示内置函数)
     ```

---

### 4. **查找文档或示例**
   - **PDK 文档**:检查 PDK 的用户指南或函数手册。
   - **代码示例**:在现有脚本或库中搜索 `mgc(`,观察其调用方式。
   - **联系支持**:向 PDK 供应商或内部团队咨询。

---

### 5. **常见参数猜测(仅供参考)**
   - 如果是版图相关函数,参数可能类似:
     ```tcl
     mgc(layer width height)  ; 例如:层名、宽度、高度
     ```
   - 如果是仿真或模型函数,参数可能是模型名、变量、配置选项。

---

### 6. **调试与测试**
   - **打印返回值**:尝试调用函数并观察输出或生成的图形。
     ```tcl
     mgc(arg1 arg2 arg3)  ; 替换为实际参数测试
     ```
   - **逐步调试**:使用 `trace` 或 `printf` 跟踪函数行为。

---

### 总结
如果无法通过上述方法找到信息,建议:
1. 在调用 `mgc()` 的脚本中查找上下文。
2. 向 PDK 或 IT 部门提交支持请求。
3. 如果是加密函数,可能需要直接联系开发者获取文档。

希望这些方法能帮助您定位到 `mgc()` 的具体用法!
回复 烽火戏诸侯 2025-4-11 16:44
在 Cadence Virtuoso 中查看自定义 Skill 函数的定义代码,可以通过以下步骤实现:

---

### **方法 1:使用 `getd` 函数**
1. 打开 **CIW(Command Interpreter Window)**(默认 Virtuoso 启动时显示的交互窗口)。
2. 输入以下命令,将 `yourFunctionName` 替换为实际的函数名:
   ```skill
   getd('yourFunctionName)
   ```
   - 示例:
     ```skill
     getd('myCustomFunction)
     ```
3. **输出结果**:
   - 如果函数是明文定义的(未加密/编译),将直接显示函数的定义代码。
   - 如果返回 `nil`,可能是函数不存在、未加载到当前环境,或是编译后的函数(无法查看源码)。

---

### **方法 2:使用 `printf` + `%f` 格式化**
1. 在 CIW 中输入:
   ```skill
   printf("%f\n" getd('yourFunctionName))
   ```
   - 这会以更友好的格式输出函数定义,尤其适合多行代码。

---

### **方法 3:检查加载的库文件**
如果函数定义在某个库文件中(如 `.il` 文件):
1. 确认函数所在的库已加载(可通过 `libList` 或 `load` 命令管理库)。
2. 使用文本编辑器直接搜索库文件中的 `defun yourFunctionName` 或 `procedure(yourFunctionName` 定义。

---

### **常见问题排查**
1. **函数未加载**:
   - 确保包含函数的库已通过 `load` 命令加载。
   - 示例:`load("path/to/library.il")`

2. **函数已编译**:
   - 如果函数是编译后的二进制(如 `.ils` 文件),无法查看源码。需联系代码提供者获取明文版本。

3. **函数名错误**:
   - 使用 `isCallable('yourFunctionName)` 验证函数是否存在。

---

### **总结**
- **明文函数**:直接使用 `getd` 或 `printf` 查看。
- **加密/编译函数**:无法直接查看,需联系提供者。
- **未加载函数**:确保相关库文件已正确加载。

通过上述方法,您可以快速定位自定义 Skill 函数的代码定义。
回复 烽火戏诸侯 2025-4-11 16:46
在 Cadence Virtuoso 中,如果已知某个 Skill 函数存在但无法查看其定义(例如函数被加密或未加载明文代码),可以通过以下方法追踪其**调用路径**或**依赖关系**:

---

### **方法 1:使用 `trace` 动态追踪调用**
通过 `trace` 函数监控目标函数的调用和返回,记录调用时的参数和上下文信息。

```skill
; 启用跟踪
trace('yourFunctionName)

; 运行相关操作(触发函数调用)
; 此时 CIW 窗口会实时打印调用信息,包括参数和调用位置

; 关闭跟踪
untrace('yourFunctionName)
```

**输出示例**:  
```
Entering yourFunctionName: arg1=value1, arg2=value2  
Exiting yourFunctionName: return_value  
```
通过多次触发操作,可以观察哪些流程调用了该函数。

---

### **方法 2:通过断点和调用栈分析**
在函数调用前设置断点,捕获调用栈(Call Stack)信息:  
```skill
; 在目标函数入口设置断点
brkAt('yourFunctionName)

; 运行相关操作(触发函数调用)
; 当断点触发时,在 CIW 中输入以下命令查看调用栈:
stackTrace()

; 取消断点
unbrkAt('yourFunctionName)
```

**输出示例**:  
```
Call Stack:
  yourFunctionName(arg1 arg2)  -- 当前断点位置
  callerFunction1()            -- 调用者1
  callerFunction2()            -- 调用者2
  ...
```

---

### **方法 3:使用 `xref` 查找静态调用关系**
通过交叉引用工具 `xref` 查找代码中对目标函数的静态调用关系(需确保相关库已加载):  
```skill
; 查找所有调用该函数的位置
xref('yourFunctionName 'callers)
```

**输出示例**:  
```
Callers of yourFunctionName:
  /path/to/file1.il: line 100 (callerFunction1)
  /path/to/file2.il: line 50  (callerFunction2)
```

---

### **方法 4:触发错误捕获调用栈**
如果函数可能抛出错误,通过触发错误获取调用栈:  
```skill
; 启用调试模式(显示详细错误)
setSkillVar('debugMode t)

; 手动调用函数(或触发相关操作)
yourFunctionName(arg1 arg2)

; 观察 CIW 中的错误信息,通常包含完整调用栈
```

---

### **方法 5:全局搜索明文代码(仅限未加密库)**
如果函数来自明文库文件(如 `.il` 文件),可通过文本工具全局搜索调用点:  
```bash
# 在 Linux 终端中使用 grep 搜索
grep -rn "yourFunctionName" /path/to/cadence/libs/
```

---

### **适用场景总结**
| **场景**                     | **推荐方法**                          |
|-------------------------------|---------------------------------------|
| 动态运行时追踪               | `trace` 或 `brkAt` + `stackTrace`     |
| 静态代码分析(明文库)       | `xref` 或 `grep` 搜索                |
| 加密函数/无法查看源码         | `trace`(仅能追踪调用,无法查看逻辑)|
| 未加载函数                   | 检查 `libList()` 并加载相关库         |

---

### **注意事项**
1. **加密函数(`.ils` 文件)**  
   - 如果函数是编译后的二进制文件,`xref` 和 `grep` 无法分析其调用关系,需依赖动态追踪(`trace` 或断点)。
   - 需联系库提供者获取明文代码或文档。

2. **函数未加载**  
   - 使用 `isCallable('yourFunctionName)` 确认函数是否存在于当前环境。
   - 使用 `libDefinedBy('yourFunctionName)` 检查函数所属库是否已加载。

3. **动态调用**  
   - 如果函数通过 `apply` 或 `eval` 动态调用,需结合运行时调试工具(如 `trace`)捕获路径。

---

通过上述方法,即使无法查看函数定义,也能有效追踪其调用路径和依赖关系,辅助定位问题或理解代码逻辑。

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 3

    关注
  • 0

    粉丝
  • 3

    好友
  • 0

    获赞
  • 6

    评论
  • 9

    访问数
关闭

站长推荐 上一条 /2 下一条

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-5-9 09:51 , Processed in 0.022223 second(s), 16 queries , Gzip On, MemCached On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部