在编写 Cadence SKILL 脚本时,工程师经常需要动态控制设计文件的自动检出(Auto Checkout)行为。一个常见的直觉是使用 setShellEnvVar("CDS_AUTO_CKOUT=none") 来禁用自动检出。
然而,很多用户发现:在 skill 脚本内部调用 setShellEnvVar 后,后续的写操作依然会触发自动检出告警或动作。 只有在启动 Virtuoso 之前在 Shell 中设置该变量才生效。本文将解析其背后的机制并提供正确的解决方案。
1. 现象描述
假设你有一个 SKILL 过程(Procedure),希望在执行批量修改前关闭自动检出保护:
procedure( MyBatchUpdate()
; 尝试关闭自动检出
setShellEnvVar("CDS_AUTO_CKOUT=none")
; 执行数据库写操作
cv = dbOpenCellViewByType("mylib" "mycell" "layout" "" "a")
; ... 修改代码 ...
dbSave(cv)
)
结果:即使执行了 setShellEnvVar,dbOpenCellViewByType 依然可能弹出检出提示,或根据之前的环境设置进行操作。
2. 深度解析:为什么 setShellEnvVar 不起作用?
A. 环境变量的读取时机(Initialization Caching)
Cadence 的底层子系统(如 Design Data Manager, dd 或 GDM)在处理环境变量时并非实时轮询,而是采用解析后缓存(Parse and Cache)的策略:
- 进程启动阶段:Virtuoso 启动时会初始化核心环境。
- 首次底层调用阶段:当脚本第一次触发数据库操作(如打开库、读取文件)时,相关子系统会通过
getenv()读取CDS_AUTO_CKOUT的值,并将其存储在内存中的 C 语言内部变量中。
一旦初始化完成,子系统将不再监控 Shell 环境变量的变化。setShellEnvVar 虽然修改了当前进程的环境列表(environ array),但并不会触发子系统去重读环境。
B. setShellEnvVar 的设计初衷
setShellEnvVar 的主要作用是影响当前进程及其后续派生的子进程(例如通过 ipcBeginProcess 启动的仿真器或 Netlister)。对于 Virtuoso 进程内部已经加载运行的动态库,它们通常已经完成了初始化。
3. 正确方案:使用专用的 SKILL API
对于此类深度集成在运行时的配置,Cadence 提供了专门的 API 来实时覆盖(Override)环境变量的初始值。
核心函数:ddAutoCtlSetVars
要控制自动检出和检入的行为,应使用 ddAutoCtlSetVars。它直接修改 DM 系统内存中的活动状态,无需重启。
语法映射:
CDS_AUTO_CKOUT=none 对应的运行状态是:
ddAutoCtlSetVars(0 0 0 0) ; 0 代表 None (禁用所有相关动作)
参数详细说明
ddAutoCtlSetVars 接收 4 个整数参数,其位置与含义如下:
- Prompt for Check-out: 是否提示检出。
- Prompt for Check-in: 是否提示检入。
- Auto Check-out: 是否自动检出。
- Auto Check-in: 是否自动检入。
数值映射表:
- 0: None (禁用)
- 1: Views (仅针对 Cellview)
- 2: Files (仅针对文件/属性)
- 3: Both (同时针对 Cellview 和文件)
因此,默认设置 (3 2 3 2) 意味着:提示检出(3:Both/Cellview+Files),提示检入(2:Files),自动检出(3:Both/Cellview+Files),自动检入(2:Files)。
稳妥的脚本实践
在脚本开头备份设置,结束后恢复,是最佳的工程实践:
procedure( MySafeUpdate()
let( (oldSettings)
; 1. 备份当前设置
oldSettings = ddAutoCtlGetVars()
; 2. 强制关闭所有自动检出
; 详细参数含义请参考上文“参数详细说明”表
ddAutoCtlSetVars(0 0 0 0)
printf("INFO: Auto checkout disabled for this task.\n")
; 3. 执行业务逻辑
; ... codes ...
; 4. 恢复之前的环境设置
apply('ddAutoCtlSetVars oldSettings)
printf("INFO: Auto checkout settings restored.\n")
)
)
4. 参考依据 (Verifiable References)
为了确保信息的准确性,您可以参考以下官方来源:
-
Cadence Community 官方社区讨论 (公开链接): Auto Checkout Preferences - Custom IC Design - Cadence Community 在该贴中,Distinguished Engineer Andrew Beckett 明确指出
setenv必须在启动前设置,或者使用ddAutoCtlSetVars进行运行时调整。 -
本地官方帮助文档 (Local Documentation): 在终端输入
cdnshelp,并搜索路径:Virtuoso Design Data Management SKILL Functions->ddAutoCtlSetVars该文档详细说明了如何使用该 API 在不重启 Virtuoso 的情况下覆盖环境变量。 -
Cadence Support 文章 (需登录账户搜索):
- Article ID: 20042456: How to enable/disable auto checkout through SKILL.
- Article ID: 11022416: Does setShellEnvVar() change the shell environment?
5. 总结
| 场景 | 推荐方法 | 备注 |
|---|---|---|
| 项目通用设置 | Shell export / .cdsinit |
启动前生效 |
| 子进程环境传递 | setShellEnvVar |
对 ipcBeginProcess 有效 |
| 运行时动态控制 | ddAutoCtlSetVars |
对当前会话的 DM 行为有效(推荐) |
[!TIP] 验证技巧:在 CIW 窗口输入
ddAutoCtlGetVars()。如果在调用setShellEnvVar后该返回值没有变化,即证明底层子系统并未重读环境列表。