2. Calibre命令行工具与脚本接口基础
Calibre 后端验证的自动化,本质上不是“把图形界面换成命令行”,而是把每个工具变成可被脚本编排的确定性进程。要做到这一点,必须掌握三件事:工具如何被调用、调用结果如何被表达(返回码与日志)、以及脚本如何稳定地封装这些调用。本节围绕 DRC、LVS、PEX 三类典型工具展开,同时说明它们共有的命令行约定。
一、Calibre 各工具的命令行调用方式
Calibre 的 DRC、LVS、PEX 分别由 calibre -drc、calibre -lvs、calibre -pex 启动,它们共享同一套运行框架,因此选项风格高度一致。最基础的调用形式是“运行文件 + 工作目录 + 日志文件”:
calibre -drc -hier -64 -turbo 8 \
-runset ./runset/drc_runset \
-batch \
./rule/tech_drc.svrf \
| tee ./log/drc_console.log
其中 -hier 表示层次化处理,-64 指定 64 位模式,-turbo 8 指定并行线程数,-batch 表示非交互批处理。LVS 与 PEX 的调用结构相同,只是规则文件与运行集不同:
calibre -lvs -hier -64 -turbo 8 -runset ./runset/lvs_runset -batch ./rule/tech_lvs.svrf
calibre -pex -hier -64 -turbo 8 -runset ./runset/pex_runset -batch ./rule/tech_pex.svrf
需要特别注意的是,Calibre 的输入输出路径通常不写在命令行里,而是由运行集(runset)或规则文件中的变量决定,例如 LAYOUT_PATH、SOURCE_PATH、REPORT_FILE。脚本封装时,推荐用环境变量或 -D 方式覆盖这些变量,而不是直接修改规则文件:
calibre -drc -batch \
-D LAYOUT_PATH=./layout/top.gds \
-D REPORT_FILE=./report/drc_top.rpt \
./rule/tech_drc.svrf
这样同一份规则文件可以在不同项目、不同版本间复用,脚本只需替换变量值,规则本身保持稳定。
二、常用选项与返回码
在自动化脚本中,最常用的选项可以归为四类:并行控制(-turbo)、层次控制(-hier)、批处理控制(-batch)、变量覆盖(-D)。此外,-64 用于指定 64 位模式,-runset 用于加载运行集,-log 可显式指定日志文件路径。
返回码是脚本判断成败的第一依据。Calibre 的返回码约定如下:
| 返回码 | 含义 | 脚本处理建议 |
|---|---|---|
| 0 | 运行成功,且无违规或违规数为 0 | 继续后续流程 |
| 1 | 运行成功,但存在违规(DRC/LVS 错误) | 记录违规数,按策略决定是否阻断 |
| 2 | 运行失败,规则或输入文件错误 | 立即终止,输出错误日志 |
| 3 | 运行被中断或超时 | 重试或人工介入 |
实际脚本中不能只看返回码,因为返回码 1 既可能是“有违规”,也可能是“部分检查未完成”。因此必须结合日志中的统计行做二次判断。
三、日志输出格式与关键字段
Calibre 的日志分为控制台输出和报告文件两部分。控制台输出以运行阶段为主,报告文件则包含具体的违规条目。典型的日志片段如下:
// Calibre DRC v2023.4
// Runset: ./runset/drc_runset
// Layout: ./layout/top.gds
// Rule: ./rule/tech_drc.svrf
// Start: 2024-06-01 10:12:03
...
TOTAL Results: 17
M1.SPACE: 5
M2.WIDTH: 8
VIA.ENCLOSURE: 4
// End: 2024-06-01 10:18:41
// CPU Time: 398.2s
脚本解析时,最值得提取的是 TOTAL Results 行和其后的分类统计行。前者给出总违规数,后者给出每类规则的违规数。若 TOTAL Results 为 0,则即使返回码为 1,也可判定为“无违规但存在警告”。若日志中出现 ERROR 或 FATAL 关键字,则无论返回码如何,都应视为运行失败。
TOTAL Results:\s*(\d+) 和 ^\s*([A-Z0-9_.]+):\s*(\d+),前者用于总控,后者用于生成分类报告。四、脚本封装要点
把 Calibre 调用封装成脚本时,核心目标是“可重复、可观测、可恢复”。可重复要求所有输入路径、变量、线程数都来自配置文件或环境变量,而不是硬编码;可观测要求每次运行都保留完整日志和报告,并记录运行时间、版本、返回码;可恢复要求脚本在失败时能保留现场,并支持从失败点重跑。
一个实用的封装结构如下:
#!/bin/bash
set -euo pipefail
RUN_ID=$(date +%Y%m%d_%H%M%S)
LOG_DIR=./log/${RUN_ID}
mkdir -p ${LOG_DIR}
run_calibre() {
local tool=$1 rule=$2 runset=$3
calibre -${tool} -hier -64 -turbo 8 \
-runset ${runset} -batch \
-log ${LOG_DIR}/${tool}.log \
${rule}
return $?
}
run_calibre drc ./rule/tech_drc.svrf ./runset/drc_runset
RC=$?
echo "DRC return code: ${RC}" | tee -a ${LOG_DIR}/summary.txt
grep -E "TOTAL Results|ERROR|FATAL" ${LOG_DIR}/drc.log >> ${LOG_DIR}/summary.txt
这段脚本做了三件事:为每次运行建立独立日志目录、把返回码写入汇总文件、把关键日志行提取到汇总文件。这样即使运行失败,也能从 summary.txt 快速定位问题,而不必翻遍整个日志。
五、三类工具的调用关系与数据流
DRC、LVS、PEX 在流程上并非孤立,而是依次依赖:DRC 检查版图几何,LVS 检查版图与网表一致性,PEX 在 LVS 通过后提取寄生参数。脚本编排时,通常把 LVS 通过作为 PEX 的前置条件,把 DRC 无违规作为签核条件。下图展示了三者的调用顺序、输入输出与返回码判断关系。
图中可以看到,DRC 的输出是几何违规统计,LVS 的输出是一致性结论,PEX 的输出是寄生网表。三者的返回码含义一致,但日志中的关键字段不同:DRC 看 TOTAL Results,LVS 看 CORRECT 或 INCORRECT,PEX 看是否生成完整的 SPEF/DSPF 文件。脚本封装时,应针对不同工具提取不同的关键字段,而不是用同一套正则处理所有日志。
WARNING 和 NOT CHECKED 行做最终判断。