Calibre 路径/文件不存在:Cannot open file 速查
更新时间:2026-10-22。FAQ 速查页,属于 EDA 工具排错系列。Calibre 说一个路径「打不开、不存在」时,问题基本不在 Calibre 本身,而在 Linux 文件系统这一层:runset 里
LAYOUT PATH/SOURCE PATH指向的 GDS/OASIS、SVRF deck 的INCLUDE、PEX 阶段的模型文件,都是按「启动 calibre 时的字符串」直接去磁盘上找。它和数字仿真器读 filelist 是两套机制,也和 Calibre 模块/单元找不到 里按 cell 名对数据库的问题不同——本篇只收「文件系统里这个路径打不开」一族。验证流程全貌见 Calibre 物理验证实操,综合侧同类问题对照 Design Compiler 路径/文件不存在。
本文要回答的问题
- runset 里写的路径明明存在,为什么 Calibre 报
Cannot open file? - SVRF 里的相对路径到底相对谁?为什么换个目录启动就失败?
- 报错路径里
$PDK_DIR原样出现、软链指向旧目录、共享盘没挂上,各自怎么判别? - 交互跑能过,提交到计算集群后报文件不存在,问题出在哪台机器?
- 路径里有空格、中文或 Windows 反斜杠时,Calibre 下是什么表现?
一、报错原文与典型现象
以下文案整理自常见 transcript(drc.results、lvs.report、pex_*._x.log),工程名与路径均已占位:
1. runset 指定的版图/源网表打不开(DRC/LVS 读输入阶段,启动即断):
Error: Cannot open file "/proj/chip/run/gds/top_final.gds".
No such file or directory
Error: Could not open layout database "./gds/top.gds": file not found2. SVRF deck 的 INCLUDE 路径里变量没展开:
***** ERROR: Cannot open include file "$PDK_DIR/calibre/common/stack.svrf".
No such file or directory3. PEX 模型文件或工艺角目录缺失:
***** ERROR: Could not open model file "/opt/pdk/models/spectre/rc_typical.s".
No such file or directory4. 跑到作业节点上才断的共享路径:
Error: Cannot open file "/net/share/chip/gds/top.gds".
No such file or directory四种文案给的线索不一样:路径里看到 $PDK_DIR 字面字样,是环境变量根本没展开;相对路径(./gds/top.gds)失败,先怀疑启动目录;绝对路径失败,才轮到软链、挂载点、远端可见性。报错原文里的路径本身就是证据,先完整留存 transcript,别凭记忆转述。
二、原因速查表
| 报错现象 | 可能原因 | 处置 |
|---|---|---|
| 相对路径换个目录启动就失败 | 相对路径基准是启动目录,不是 runset/deck 所在目录 | 启动脚本先 cd 工程 run 目录,或改绝对路径 |
报错路径里 $PDK_DIR 原样出现 | 变量没 export 或非交互 shell 没加载环境 | echo $PDK_DIR 验证,脚本开头 source PDK setup |
ls 看得到文件名却打不开 | 悬空软链(dangling symlink) | ls -l/readlink -f 看指向,重指新位置 |
| 交互能过、提交集群就失败 | 计算节点没挂共享盘或挂载点不同 | 计算节点上 mount/ls 核对,改集群统一路径 |
| 绝对路径报 No such file | 中间某层目录被改名、清理或未挂载 | namei -l 逐层查第一个缺失的层 |
| 报模型文件找不到 | PDK 模型包未安装或工艺角目录被清理 | 按工艺厂安装清单补模型,runset 改指现存目录 |
| 路径在空格处被截断 | runset/deck 中路径未加引号 | 路径整体加双引号,规范上禁用空格目录 |
路径含 \ 或盘符样式 | Windows 路径混写进 Linux runset | 反斜杠改正斜杠,去掉 C: 盘符 |
| 昨天还能跑今天突然失败 | GDS 版本目录被清理脚本删了 | 恢复或重新导出,输出版本纳入保留策略 |
三、排查决策树
颜色按语义分角色:红是报错入口与文件系统层的根因(中间层断裂),蓝是分流与排查动作,橙是变量与相对路径两类当场可做的修复,紫是统一复验收尾。读这张图抓住「先分流再动手」:报错路径的长相($ 开头、./ 开头、/ 开头)直接决定查哪条通道,不要一上来就全盘 find /;绝对路径看着最「硬」,但软链、挂载点、跨节点可见性三个伪装者都藏在这一支。
四、逐条排查展开
第一类:环境变量没展开,报错里会留下字面 $。 SVRF deck 里常写 INCLUDE "$PDK_DIR/calibre/common/stack.svrf",runset 里也常用 $MGC_HOME、$PDK_DIR 锚定 PDK 安装根。变量没值或没传进 calibre 进程时,Calibre 拿到的就是带美元符号的字面路径,磁盘上当然不存在。在启动 calibre 的同一个 shell 里验证:
echo "$MGC_HOME / $PDK_DIR"
ls -l "$PDK_DIR/calibre/common/stack.svrf"交互终端有值、回归脚本里为空,几乎都是非交互 shell 不加载 .bashrc——调度系统起的作业不继承你桌面的环境。修法是在作业脚本开头显式 source 厂商/PDK 提供的 setup 脚本,顺便让 ls -l 证明文件真实存在且可读。拼写也要逐字符对:$PDKDIR 和 $PDK_DIR 是两个名字,shell 把拼错的那个安静地展开成空串,报错路径会显示成双斜杠开头的 //calibre/...——看到连续双斜杠,除了手滑多打一个 /,另一个常见来源就是空变量拼接。
第二类:相对路径的基准是启动目录,不是 runset 所在目录。 这是 Calibre 路径问题覆盖面最大的一条。runset 里写 LAYOUT PATH "./gds/top.gds",这个 ./ 解析自「敲下 calibre 命令时 shell 站的目录」,不是 runset 文件放哪就相对哪。同一个 runset,在工程 run 目录启动能过,在上一级目录用 calibre -drc run/run.drc 拉起就报 file not found,原因全在这里。判别只需在失败复现命令前加一行 pwd 并对同一路径 ls。团队纪律两条:启动脚本(或 bsub 包装脚本)第一行固定 cd <工程 run 目录>;PDK 公共 deck 段用 $PDK_DIR 绝对锚定,工程内文件用相对工程根的写法,不混着来。
第三类:绝对路径打不开,逐层拆软链与挂载。 绝对路径仍报 No such file,先用两条命令把路径拆开看:
ls -l /proj/chip/gds/top.gds
readlink -f /proj/chip/gds/top.gds
namei -l /proj/chip/gds/top.gdsls -l 里文件名还在、箭头指向标红,就是悬空软链——PDK 升级或 GDS 版本目录搬家后旧链没重指是常态,重指到新位置即可,不要在旧链上再套一层新链。namei -l 把从根开始每一层的存在性、属主与权限都列出来,第一个打问号或权限不足的层就是病灶:常见情形是 /proj/chip/gds_v2 整层被清理脚本删掉、或挂载点 /net/share 这层根本没起。挂载状态单独确认:
mount | grep -E "/proj|/net"挂载点没起时,目录本身可能还以空目录形式存在(所以 ls /net 不报错),但下面什么都没有——这正是「目录在、文件不在」假象的来源,找管理员重新挂载或检查 autofs。
第四类:作业分发到别的计算节点,共享路径不可见。 交互在登录节点跑得好好的,bsub/qsub 提交后稳定报某绝对路径不存在,且该路径在登录节点 ls 完全正常——问题发生在计算节点那台机器上:它没挂同一个 NFS/AFS 共享,或挂载点路径与登录节点不一致(登录节点是 /proj,计算节点是 /mnt/proj)。让失败作业先跑 hostname && ls <报错路径> 再退出,输出落到作业日志一看便知。修法是把工程放在集群所有节点统一挂载的共享区,作业脚本里不使用只在某台机器上成立的本地路径。顺带一提,跨节点还有 NFS 缓存延迟:另一台机器刚生成的 GDS,本机节点瞬间读可能「时有时无」,特征是报错不稳定复现,处置是在流程衔接点加同步等待,而不是去改一个写对的路径。
第五类:空格、中文与 Windows 反斜杠。 路径含空格时,未加引号的字符串在空格处被截断,报错路径明显短一截,这类目录常见于从 Windows 共享或压缩包解压出来的交付物;runset/SVRF 里把整个路径用双引号包住可解,根治是工程路径只用无空格纯英文。中文目录在部分 locale 配置下会因编码不一致表现为乱码路径或 No such file,同样不在工程路径里使用。Windows 路径混写有两个铁证:反斜杠(gds\top.gds,Linux 把 \ 当普通字符)和盘符(C:\...),从 Windows 侧拷 runset 后统一改正斜杠并去掉盘符。文件名大小写也在此列:Linux 大小写敏感,Top.GDS 与 top.gds 是两个文件,交接改名后以 ls 的真实输出为准逐字符对。
GDS 版本目录被清理是「昨天还好好的」专项。 报错路径里带版本/日期后缀(gds_v3、tapeout_20261020)且整个目录消失,多半是磁盘清理策略或同事做目录整理时删的。恢复备份或重新导出后,要把「验证输入物纳入保留白名单」补进工程纪律,否则下一次清理后还会复发。
五、预防与纪律
- 启动即自检:回归脚本第一段打印
pwd、MGC_HOME/PDK_DIR,并对 runset 里每个输入路径(GDS、网表、deck、模型)逐条ls -l,任一失败立即退出,不把环境问题带进几百行 transcript。 - 路径三原则:工程内相对工程根、PDK 走
$PDK_DIR绝对锚定、作业脚本先cd再启动 calibre;runset 里不写依赖个人机器的本地绝对路径。 - 集群视角组织工程:工程只放所有计算节点统一挂载的共享区,新节点入群先验挂载点与路径一致性。
- 软链与清理走通告:PDK/GDS 搬家统一重指软链并通知全组,定期
find <工程根> -xtype l扫死链;清理脚本对验证输入目录加白名单。 - 命名禁空格中文反斜杠:工程路径只用纯英文、正斜杠、无空格,规范在建工程第一天定死。
- 干净目录复验:修完删掉本轮 run 目录重跑完整流程,确认 transcript 0 Error,避免增量产物掩盖修复结果。
这一篇在知识体系里的位置
本篇是 EDA 排错速查簇中「文件系统路径」节点的 FAQ 页,总入口见 开源 EDA 报错排错中心;同批相邻两篇分别收 Calibre 模块/单元找不到(cell 名与 deck include 语义层)和 Calibre 权限被拒(Permission denied 权限层)——路径存在但打不开、报错是 Permission denied 时转那篇;deck 的 INCLUDE 与变量机制背景见 Calibre SVRF rule deck 解剖,run 目录组织见 Calibre 物理验证实操。综合侧同构问题对照 Design Compiler 路径/文件不存在。
一句话总结
Calibre 报「路径/文件不存在」时先看报错路径的长相分流:$ 原样出现查环境变量展开(echo 验证、脚本开头 source PDK setup,双斜杠是空变量的伪装),相对路径查启动目录(基准是 calibre 的启动目录而非 runset 所在目录,脚本先 cd 或改绝对路径),绝对路径用 ls -l/readlink/namei/mount 逐层排掉悬空软链、被清理目录和未挂载点,跨节点失败到计算节点上验共享路径,再收口空格、中文、反斜杠与大小写四个低级坑;最后靠「启动自检、路径三原则、集群统一挂载、清理走通告」四条纪律防复发。