Calibre 配置解析失败:runset 读不进速查
更新时间:2026-10-22。FAQ 速查页,属于 EDA 工具排错系列。Calibre(Siemens EDA 的物理验证工具,DRC/LVS/PEX 三件套)真正开始检查版图之前,先要过两道配置关:shell 里的命令行开关、runset(运行控制文件,Tcl 语法)与 SVRF rule deck 的 INCLUDE 链。这一阶段挂掉的特征是——transcript 里几乎没有任何检查进度,错误集中在启动头几十行,且常常是「文件打不开」「变量原样出现在路径里」「这条命令在此模式下非法」三类。SVRF 规则语句本身的 token 级语法错见 Calibre 语法/解析报错,INCLUDE 指向的文件确实不存在见 Calibre 模块/单元找不到;本篇只讲启动配置、runset、环境变量与版本兼容。验证流程全貌见 Calibre 物理验证实操,deck 五段结构见 Calibre SVRF rule deck 解剖。
本文要回答的问题
Cannot open runset file是路径写错,还是环境变量根本没展开?- deck 在同事机器上能跑,换我这里 INCLUDE 路径全是空壳,差在哪?
- DRC deck 里出现一句 LVS 控制语句,为什么整个 run 直接不启动?
calibre -run、-turbo、-hier这些开关拼错时工具会怎么报错?- GUI 保存的 runset 拿到命令行跑报命令不识别,是版本问题还是用法问题?
一、报错原文与典型现象
配置阶段的报错全部出现在 transcript 最前面(启动目录下的 .drc.results/.lvs.report,或重定向的 log),在第一条检查进度之前。以下是四类典型文案,路径与工程名已占位:
1. runset 或 INCLUDE 文件打不开(最高频,路径里常能看到没展开的变量名):
***** ERROR: Cannot open runset file "/proj/demo/calibre_run.drc".
***** ERROR: Cannot open include file "$PDK_DIR/calibre/techfile/stack.svrf".
***** ERROR: Rule file was not found on the CALIBRE_HOME path.2. runset Tcl 语法或变量错(runset 是 Tcl,报错形态与 Tcl 解释器一致):
Error: can't read "RULE_PATH": no such variable
Error: invalid command name "LAYOUT PATHH"3. 控制语句出现在不允许的运行模式:
***** ERROR: "LVS REPORT" is not a valid command in DRC rule context.
***** ERROR: PEX control statement encountered outside -pex run.4. 命令行开关或版本/编码问题:
% calibre -drc -turboo proj_run.drc
Error: Unknown switch "-turboo".
***** ERROR: Rule deck version 2024.3 is newer than supported 2023.4.
***** ERROR: Illegal character encountered at line 1 of runset file.第一条判据:路径字符串里如果原样带着美元符号加变量名,就是变量没展开,先查 shell 环境再查文件;报「not a valid command in … context」说明文件读到了、但跑的模式不对;line 1 非法字符直接怀疑 BOM 或 CRLF。
二、报错现象到根因总览
| 报错现象 | 可能原因 | 处置 |
|---|---|---|
| Cannot open runset file | 相对路径基准错、文件没同步到本机、权限不可读 | 用绝对路径重跑,ls -l 核对存在与可读位 |
| INCLUDE 路径中变量名原样出现 | PDK 变量没 export、只在 GUI 环境里设过 | 启动 calibre 的 shell 里 echo 校验后重跑 |
| CALIBRE_HOME path 找不到规则 | 环境模块没 load,CALIBRE_HOME 为空或指错版本 | module load 对应版本,echo 确认安装根 |
| no such variable(runset) | runset 内变量未定义、定义在被注释行、作用域不对 | runset 头部集中 set,启动前 tclsh 预解析 |
| not a valid command in DRC/LVS context | DRC deck 混入 LVS/PEX 控制语句,或模式开关与 deck 不配套 | 命令与 deck 按模式分段,-drc/-lvs/-pex 对齐 |
| Unknown switch | -run/-turbo/-hier 等开关拼错或位置放错 | 对 calibre -help 逐条核对开关拼写 |
| Rule deck version newer than supported | deck 用了高版本指令/LAYER MAP/DFM 新语法 | 升级 Calibre 或向 PDK 索取兼容版 deck |
| GUI runset 到 CLI 报命令不识别 | 高版本 GUI 写入了低版本不支持的选项 | 用同版本 CLI,或删除新选项后另存 |
| line 1 Illegal character / 连环错 | UTF-8 BOM、CRLF、全角标点混入 runset | 去 BOM、dos2unix 转 LF、全角改半角 |
三、逐条排查展开
第一查:INCLUDE 链与环境变量——在「启动 calibre 的那个 shell」里验。 配置失败超过一半死在这一层。SVRF deck 顶层常有一串按 PDK 安装目录拼接的 INCLUDE,依赖 CALIBRE_HOME 与 PDK 自带变量;runset 里又可能用 Tcl 变量拼规则路径。变量只要没 export 进 calibre 的进程环境,deck 内的引用就展开为空串,报错路径里直接能看到美元符号加变量名的原文。注意「桌面终端能跑、回归脚本不能跑」是固定事故形态:交互 shell 的 .bashrc 里设过变量,无人值守脚本没有。
echo "$CALIBRE_HOME" # 为空或指向旧版本即中招
echo "$PDK_DIR"
ls -l "$PDK_DIR/calibre/techfile/stack.svrf"
module load calibre/<版本> # 走环境模块的团队先 load 再跑排查顺序:先在启动 calibre 的同一个 shell 里 echo 两个变量,再 ls -l INCLUDE 链上最靠前的那个文件;顶层 INCLUDE 过了再逐层往里走,第一个打不开的文件就是断点。runset 用相对路径时记住基准是「当前工作目录」,不是 runset 文件所在目录——这是 Cannot open runset file 与 INCLUDE 失败最常见的非变量原因,改用绝对路径立刻见分晓。
第二查:runset 语法与控制语句的位置。 runset 本身是 Tcl,变量必须先 set 后引用,一行 set RULE_PATH "/proj/demo/rules" 被注释掉或写在引用之后,后面的 LAYOUT RULES "$RULE_PATH/..." 就报 no such variable。可以先用系统 tclsh 把 runset 当普通 Tcl 预解析一遍(Calibre 专有命令会报 unknown command,但变量与括号错误会提前暴露)。另一类高频问题是模式错配:DRC、LVS、PEX 各有自己的合法控制语句集合,在 DRC deck 里写 LVS REPORT、在非 PEX run 里出现 PEX 控制段,解析器直接拒绝启动。处置是命令行模式与 deck 严格对齐——calibre -drc 配 DRC deck、-lvs 配 LVS deck,项目自加段落按模式分开 INCLUDE,不要图省事共用一个总 deck。
第三查:命令行开关拼写。 Calibre 的开关不多但都吃拼写:-hier(层次化)、-turbo(加速引擎)、-run(直接执行 runset)等,拼错一个字母就是 Unknown switch 后进程退出,不会「忽略并继续」。开关位置也要对:模式开关在前、runset 文件作为收尾参数。拿不准时跑 calibre -help 把当前版本支持的开关清单打出来对,不要凭记忆从老项目命令行里抄——不同版本可用开关集合有差异。
第四查:版本兼容——deck 版本高于 Calibre 时没有侥幸。 PDK 升级后下发的新 deck 可能用了旧版 Calibre 不认识的 LAYER MAP、DFM 指令或新控制选项,表现是解析阶段直接报 deck 版本高于支持版本,或在新指令行报 unknown command。方向只能是二选一:本机 Calibre 升到 deck 要求的版本,或向 PDK 厂索取与本版本兼容的 deck 修订;手工删新指令几乎必然改掉检查语义,不允许在签核流程里这么干。同类问题还有 GUI/CLI 版本错位:高版本 GUI 保存的 runset 写入了低版本不识别的选项行,拿到低版本命令行就报命令不识别——用与 deck 同版本的环境跑,或在同版本 GUI 里删掉新选项后重新另存。
第五查:编码与行尾,line 1 报错时的固定动作。 runset 在 Windows 上编辑或经邮件/网页转过一手后,常见三件套:开头的 UTF-8 BOM、CRLF 行尾、全角括号与中文引号。解析器在读取第一条语句前就撞上非法字节,之后的连环报错没有阅读价值。处置固定:去 BOM、dos2unix 转 LF、全角符号改半角,删掉本轮 run 目录干净重跑,只认重跑后的第一条报错。
读这张图按「先环境、后模式、再版本编码」的顺序收敛:红色入口是启动即失败,四个蓝色节点是四层排查,每层命中就进橙色修复,紫色是干净复验。关键纪律是环境变量必须在启动 calibre 的那个 shell 里验——换终端、换脚本、换提交节点都要重新 echo,不能拿桌面会话的结果担保无人值守 run。
四、预防与纪律
- 环境自检前置:回归脚本在调 calibre 前先 echo 关键变量并
lsINCLUDE 链首个文件,任一为空或不存在就硬退出,把失败挡在启动前。 - runset 内路径一律绝对路径,变量集中在 runset 头部 set;runset 文件纳入版本库,禁止只存在某台机器的 GUI 工作区里。
- 模式与 deck 成对维护:DRC/LVS/PEX 各自独立 runset 与 INCLUDE 段,命令行模式开关与 deck 一一对应。
- Calibre 版本与 PDK deck 版本登记在册:升级 PDK 先确认 deck 要求的 Calibre 下限,GUI 与 CLI 保持同版本。
- 仓库强制 Unix 行尾:runset 与 deck 在
.gitattributes中标记text eol=lf,编辑后dos2unix过一遍再提交。
这一篇在知识体系里的位置
本篇是 EDA 排错速查簇的一员,总入口见 开源 EDA 报错排错中心。与两篇 Calibre 姊妹篇按失败阶段分工:文件成功读入后、SVRF 规则语句本身的 token 语法错见 Calibre 语法/解析报错,INCLUDE 指向的文件或顶层 cell 在磁盘/库里确实不存在见 Calibre 模块/单元找不到。背景机制见 Calibre SVRF rule deck 解剖 与 Calibre 物理验证实操。
一句话总结
Calibre 配置解析失败按「环境变量 → 模式与开关 → 版本兼容 → 编码行尾」四层收敛:路径里带着没展开的变量名就在启动 calibre 的同一 shell 里 export 并改绝对路径,控制语句非法就核对 -drc/-lvs/-pex 模式与 deck 归属,deck 版本高于本机只能升级或换兼容 deck,line 1 非法字符固定去 BOM、转 LF、改全角;防复发靠脚本前置环境自检、runset 全绝对路径与版本登记三条纪律。