SOP — NCSU PDK 部署 + Calibre↔Virtuoso 集成初始化(2026-09-27)¶
变更目录:
pdk_integration_20260927/;执行人:Agent(用户确认后执行) 落点:共享盘宿主dell-R620(192.168.31.249)的/data/nfs/pdk、共享 modulefile、 lsf 三台/etc/fstab(红线动作,经用户单独确认) 前置:IC617 工具链已装(ic617_install_20260926);跨厂商共存已修正(slurm_insmodule_family_scope_20260927) 实现体:deployer.py(编排)+utils/(预检查、三态探测、配置校验、执行通道)
目录¶
- 背景 / 2. 目标 / 3. 前置条件 / 4. 影响范围 / 5. 分步操作 / 6. 验证 / 7. 回滚 / 8. 风险说明 / 附录
1. 背景¶
HANDOFF 未完成项 #1:NCSU PDK 与 Calibre↔Virtuoso 集成未做。其中跨厂商共存的环境前提已于 09-27 具备
(module_family_scope_20260927:cadence + virtuoso/IC06.17.700 + siemens + calibre/2015.2_36.27 四模块同屏 active)。
介质 10.Calibre config.zip 提供的 .cdsinit 只做一件事——load($CALIBRE_HOME/lib/calibre.skl);
而该 Skill 界面文件已在已装 Calibre 树内($CALIBRE_HOME/lib/calibre.skl)。故"集成"的实质是
让 Virtuoso 加载这段 .cdsinit;而 IC617 的 modulefile 设了 CDS_LOAD_ENV=CWD,Virtuoso 只从
当前工作目录读 .cdsinit/cds.lib,因此必须向用户交付可复制的站点模板,并让 CDK_DIR 由模块提供。
/data/nfs/pdk 此前为空目录且已导出、六台客户端已按 /pdk 挂载(slurm 三台),lsf 三台未挂载。
2. 目标(可验证状态)¶
| # | 判据 | 实测结果 |
|---|---|---|
| 1 | 三个 kit 落点完整(CDK 1.6.0.beta / FreePDK45 / FreePDK15) | ✓ 52M + 23M + 194M |
| 2 | 站点模板 .cdsinit / cds.lib 写入 /pdk/templates/,内容哈希稳定 |
✓ |
| 3 | CDK_DIR 由 IC617 modulefile 下发 |
✓ module load 后 /pdk/ncsu-cdk-1.6.0.beta |
| 4 | 六台客户端可见 PDK、CDK_DIR 正确、Calibre skl 就位 |
✓ 六台 OK |
| 5 | lsf 三台 /pdk 挂载接入(fstab + 立即挂载) |
✓ 三台 done |
| 6 | 集成在 Virtuoso 中真实生效(.cdsinit 加载 Calibre Skill + NCSU CDK) |
✓ [pdk] Loading… ×2 + Done loading NCSU_CDK customizations |
| 7 | 幂等:复跑零变更 | ✓ 全部 done、状态 skipped |
| 8 | 独立漂移检测无漂移 | ✓ 9 项全 OK |
3. 前置条件(均已落为 precheck 检查项)¶
- 环境契约:操作机 Ubuntu/Debian、x86_64;客户端 Rocky 9 主版本。
sudo免密(写/data/nfs与 modulefile 的前提):实测可用。- 介质:
Cadence安装软件包/11.NCSU_pdk.zip存在且含 3 个外层包(unzip -l校验成员)。 - 目标根可写:
/data/nfs(PDK 根父目录);待改 modulefile 存在。 - SSH 免密到六台验证节点(
root,密钥认证;用户名入配置、密码不入配置)。 - 无需停服;无在跑作业;窗口任意。
4. 影响范围¶
| 项 | 内容 |
|---|---|
| 宿主共享盘 | 新增 /data/nfs/pdk/{ncsu-cdk-1.6.0.beta,FreePDK45,FreePDK15,templates}(约 269M,root:root、go-w) |
| 共享 modulefile | /data/nfs/modulefiles/cadence/virtuoso/IC06.17.700.lua 追加 1 行 setenv("CDK_DIR", …) |
| lsf 三台 | /etc/fstab 各追加 1 行(192.168.31.249:/data/nfs/pdk /pdk nfs ro,hard,…)并立即挂载 —— 红线动作,经用户单独确认 |
| 客户端视图 | 六台 /pdk(slurm 三台原已挂载,lsf 三台本次接入) |
| 是否停服 | 否;未动 slurm.conf、未重启任何 daemon(fstab 追加不影响已运行服务) |
| 在跑作业 | 无 |
有意不动:/tools(IC617/MMSIM/ASSURA/Calibre 树)、license 服务、/opt/modulefiles 其它模块、
FreePDK3D45 / LithoSim / CDK 1.5.1 等未选 kit(介质保留在 Cadence安装软件包/)。
5. 分步操作¶
步骤 1:备份(改前必做)¶
坑:本次三类对象跨宿主共享盘与远端 fstab。共享盘文件用共享库 backup_with_timestamp 落
backup/<相对路径>/<原名>.bak.<时间戳>;远端 fstab 先 cat 回本地再落 backup/<hostname>/etc/fstab.bak.<时间戳>,
并写入 backup/README.md 台账。
D=pdk_integration_20260927; TS=$(date +%Y%m%d-%H%M%S)
mkdir -p "$D/backup/data/nfs/modulefiles/cadence/virtuoso" "$D/backup/lsf-work-0{1,2,3}/etc"
cp -p /data/nfs/modulefiles/cadence/virtuoso/IC06.17.700.lua \
"$D/backup/data/nfs/modulefiles/cadence/virtuoso/IC06.17.700.lua.bak.$TS"
for h in 25 26 27; do ssh root@192.168.31.$h 'cat /etc/fstab' > "$D/backup/lsf-work-0X/etc/fstab.bak.$TS"; done
预期:4 个备份文件 + 台账行。失败判断:任一读取失败即中止,不得继续。
步骤 2:解包三个 kit 到 PDK 根¶
坑(关键):介质是套娃包——*.zip → 外层 *.tar(内含 README/.sig/真实压缩包)→ 内层 *.tar.gz;
内层自带顶层目录(ncsu-cdk-1.6.0.beta/、FreePDK45/、FreePDK15/),直接解到 PDK 根,不要 strip-components。
解包动作需 root,故经 sudo -n;zip 提取在工程 scratch/ 内以普通用户进行,避免污染共享盘。
# 高危:写共享盘(六台可见)
W=$D/scratch/ncsu-cdk-1.6.0.beta; mkdir -p "$W"
unzip -o -j -q "Cadence安装软件包/11.NCSU_pdk.zip" '*/NCSU-CDK-1.6.0.beta.tar' -d "$W"
tar -xf "$W/NCSU-CDK-1.6.0.beta.tar" -C "$W"
sudo -n tar -xzf "$W/ncsu-cdk-1.6.0.beta.tar.gz" -C /data/nfs/pdk
sudo -n chown -R root:root /data/nfs/pdk/ncsu-cdk-1.6.0.beta
sudo -n chmod -R u=rwX,go=rX /data/nfs/pdk/ncsu-cdk-1.6.0.beta
# FreePDK45(外层 NCSU-FreePDK45-1.4.tar → 内层 ncsu-FreePDK45-1.4.tar.gz)
# FreePDK15(外层 NCSU-FreePDK15-1.2.tar → 内层 NCSU-FreePDK15-1.2.tgz)同理
预期:三个顶层目录出现,属主 root:root、组/其他无写位。失败判断:tar 非 0 → 检查介质完整性后重试(同一动作失败 2 次即停)。
步骤 3:写入站点模板¶
坑(三个实测坑,务必保留写法):
① cds.lib 的注释符是 --——用 ;; 会被解析成「注释 + 残留语句」,导致被注释的 SOFTINCLUDE 仍被执行;
② 注释行尾不要留 -(被当作续行,下一行被误解析并 Warning);
③ 模板与注释一律用英文(Cadence 以非 UTF-8 解析,中文会被逐行 Skipping 刷屏)。
# 高危:写共享盘模板目录
sudo -n mkdir -p /data/nfs/pdk/templates
sudo -n install -o root -g root -m 644 "$D/scratch/cds.lib.new" /data/nfs/pdk/templates/cds.lib
sudo -n install -o root -g root -m 644 "$D/scratch/.cdsinit.new" /data/nfs/pdk/templates/.cdsinit
.cdsinit 内容(Skill 语法;; 为 Skill 注释符)核心两段:CALIBRE_HOME 就绪则
load(strcat(cal_home "/lib/calibre.skl"));CDK_DIR 就绪则 load(strcat(cdk_dir "/cdssetup/cdsinit")),
两者缺失时打印明确提示而不中断启动。cds.lib 只 SOFTINCLUDE $CDK_DIR/cdssetup/cds.lib;
FreePDK45 / FreePDK15 的 INCLUDE 默认注释(FreePDK45 与 NCSU CDK 同时定义 basic 库会冲突)。
预期:两个文件写入、sha256sum 稳定。失败判断:写入失败 → 检查 /data/nfs 可写性与 sudo。
步骤 4:lsf 三台 /pdk 挂载接入(高危;红线动作)¶
坑:/pdk 在 lsf 三台连目录都不存在;fstab 条目参数须与 slurm 三台一致(ro,hard,timeo=600,…),
否则同集群出现两种挂载语义。追加用「先 grep 判存在」实现幂等;mount 不重启任何服务。
# 高危:改远端 /etc/fstab(每台单独确认;已备份见步骤 1)
for h in 25 26 27; do ssh root@192.168.31.$h '
target=/pdk; mkdir -p "$target"
line="192.168.31.249:/data/nfs/pdk /pdk nfs ro,hard,timeo=600,retrans=2,noatime,actimeo=30,_netdev 0 0"
grep -qE "^[^#].*[[:space:]]/pdk[[:space:]]" /etc/fstab || printf "%s\n" "$line" >> /etc/fstab
mount "$target"'; done
预期:三台 findmnt /pdk 显示 192.168.31.249:/data/nfs/pdk,参数含 ro。失败判断:mount 报错 → 回滚该台 fstab 条目(第 7 章)。
步骤 5:modulefile 增加 CDK_DIR¶
坑:modulefile 是六台共享且内容为手工维护(含 IC617+MMSIM+ASSURA 组合环境),
只允许追加,不得重写;插入锚点取 setenv("CDS_LOAD_ENV", "CWD") 行之后,幂等判据为文件中已含 CDK_DIR。
M=/data/nfs/modulefiles/cadence/virtuoso/IC06.17.700.lua
grep -q 'CDK_DIR' "$M" || python3 - "$M" <<'PY'
import sys, pathlib
p = pathlib.Path(sys.argv[1]); t = p.read_text()
anchor = 'setenv("CDS_LOAD_ENV", "CWD")'
add = '\n-- 【2026-09-27 pdk_integration_20260927】NCSU PDK 站点根\nsetenv("CDK_DIR", "/pdk/ncsu-cdk-1.6.0.beta")\n'
p.write_text(t.replace(anchor, anchor + add, 1))
PY
预期:grep -n CDK_DIR "$M" 命中 1 行。失败判断:锚点缺失 → 停止(不得盲改),人工核对 modulefile 版本。
实现体入口(仅供复核,不作为步骤正文):
pdk_integration_20260927/main.py apply子命令:precheck(只读门禁)/apply(幂等部署,可--dry-run)/drift(只读漂移)/verify(只读功能验证)。
6. 验证¶
# ① 落点与模板(宿主)
ls -d /data/nfs/pdk/{ncsu-cdk-1.6.0.beta,FreePDK45,FreePDK15} /data/nfs/pdk/templates/{.cdsinit,cds.lib}
# ② 六台客户端:CDK_DIR + PDK 可见 + Calibre skl
for h in 18 19 20 25 26 27; do ssh root@192.168.31.$h 'bash -lc "
source /etc/profile.d/zzz_site_lmod.sh >/dev/null 2>&1
module load cadence; module load virtuoso/IC06.17.700
module load siemens; module load calibre/2015.2_36.27
echo \$CDK_DIR; ls -d /pdk/ncsu-cdk-1.6.0.beta; test -f \$CALIBRE_HOME/lib/calibre.skl && echo SKL_OK"'; done
# ③ 集成真实生效(任一台;临时目录内用站点模板启动,输出应含 [pdk] 两行与 NCSU 完成行)
ssh root@192.168.31.18 'bash -s' < pdk_integration_20260927/scratch/verify_cdsinit.sh
# ④ 幂等与漂移(只读)
cd pdk_integration_20260927 && .venv/bin/python main.py apply && .venv/bin/python main.py drift
实测(2026-09-27 18:08–18:13):
| 判据 | 实测 |
|---|---|
| 落点 | CDK 52M / FreePDK45 23M / FreePDK15 194M,root:root、go-w |
| 模板 | .cdsinit、cds.lib 写入,sha256 稳定 |
| modulefile | 第 25 行 setenv("CDK_DIR", "/pdk/ncsu-cdk-1.6.0.beta") |
| 六台客户端 | 全 OK(CDK_DIR 正确、PDK 可见、CALIBRE_SKL_OK) |
| lsf 三台挂载 | mount:192.168.31.25/26/27: done |
| 集成实测 | // [pdk] Loading Calibre Skill Interface: …、// [pdk] Loading NCSU CDK: /pdk/ncsu-cdk-1.6.0.beta、Loading NCSU SKILL routines...、Done loading NCSU_CDK customizations.;Skipping/redefines/NOT loaded 均为 0 |
| license | Virtuoso Framework License (111) was checked out successfully(0.29s) |
| 幂等 | 复跑 状态: skipped、零变更 |
| 漂移 | 结论:无漂移(9 项全 OK) |
7. 回滚¶
备份位置:pdk_integration_20260927/backup/(逐条用途见 backup/README.md)。
回滚判据:第 6 章任一判据不达标(六台有节点异常、.cdsinit 未加载、漂移非 0)即回滚。
D=pdk_integration_20260927
# 1) modulefile 回滚(去掉 CDK_DIR 行)
cp -p "$D/backup/data/nfs/modulefiles/cadence/virtuoso/IC06.17.700.lua.bak.<TS>" /tmp/mf.orig
sudo -n cp /tmp/mf.orig /data/nfs/modulefiles/cadence/virtuoso/IC06.17.700.lua
# 2) lsf 三台 fstab 回滚 + 卸载(按 IP 替换 <host>)
sudo -n cp "$D/backup/lsf-work-0X/etc/fstab.bak.<TS>" /tmp/fstab.orig
scp /tmp/fstab.orig root@192.168.31.<host>:/etc/fstab && ssh root@192.168.31.<host> 'umount /pdk'
# 3) 删除本次新增的 PDK 树(不可逆:PDK 为纯数据,可由介质重解)
sudo -n rm -rf /data/nfs/pdk/ncsu-cdk-1.6.0.beta /data/nfs/pdk/FreePDK45 /data/nfs/pdk/FreePDK15 /data/nfs/pdk/templates
回滚后验证:六台 module load 后 echo $CDK_DIR 为空;六台 findmnt /pdk 与挂载前一致(slurm 三台保持原挂载,lsf 三台不再挂载);
drift 回到「kit/template/modulefile 全部 pending」(表示已回到未部署态)。
8. 风险说明¶
| 风险 | 说明 | 缓解 |
|---|---|---|
| fstab 红线 | 改 lsf 三台 /etc/fstab 属不可逆倾向操作,写错会影响开机挂载 |
经用户单独确认;逐台先备份回本地并登记台账;条目参数与 slurm 三台一致;mount 失败即按第 7 章回滚该台 |
| 门禁与修复目标死锁 | 「客户端 /pdk 未挂载」既是门禁项又是本次修复目标,会把变更卡死 |
已将该检查降级为 WARN(挂载状态交由 sync_status 判定与修复),门禁只保留真正前提(SSH 可达等)——首次 apply 曾因此中止,已修正 |
cds.lib 注释符 |
;; 会让被注释的 SOFTINCLUDE 仍被执行(实测 5 条库冲突) |
模板统一用 --;英文注释;注释行尾不留 - |
| PDK 库冲突 | FreePDK45 与 NCSU CDK 都定义 basic 库 |
模板中 FreePDK45/FreePDK15 的 INCLUDE 默认注释,按需启用 |
| 共享盘写入影响六台 | /data/nfs/pdk 六台共享,误操作即时扩散 |
逐条明确路径、权限 go-w、先备份;新增目录不覆盖既有内容(原先为空) |
| 使用侧未验收 | 自动化只验证到「.cdsinit 被加载、NCSU CDK 生效」;实际版图/DRC 流程需人在 GUI 中确认 |
列为待验收项(见附录),不影响回滚判据 |
| LD_PRELOAD 告警 | -nograph 下 32 位启动器报 wrong ELF class,属 IC617 已知现象 |
无害,已记录 |
附录¶
A. 交付物清单¶
| 路径(相对本目录) | 内容 |
|---|---|
main.py / deployer.py / utils/ |
工程实现体(入口、编排、预检查、三态探测、配置校验、执行通道) |
config/pdk_integration.yaml(+.example) |
配置唯一真源(契约/PDK/模板/modulefile/kits/节点/客户端挂载/预检查) |
docs/SOP.md |
本文件 |
docs/RUNBOOK.md |
运行与使用手册(日常操作、故障处置 A–F) |
backup/README.md |
备份台账(1 个 modulefile + 3 个远端 fstab) |
scratch/verify_cdsinit.sh |
集成生效性验证脚本(在客户端临时目录用站点模板启动 virtuoso 并检查加载痕迹) |
logs/pdk_integration.log、reports/precheck-*.md |
运行日志与门禁报告 |
B. 未纳入本轮的 kit¶
NCSU-CDK-1.5.1、NCSU-FreePDK3D45-1.1、NCSU-LithoSim-FreePDK45-1.2、ncsu-cdk-1.6.0.beta.tar.gz(重复包)
仍保留在 Cadence安装软件包/11.NCSU_pdk.zip;需要时在 config/pdk_integration.yaml 的 kits 追加一项后重跑 apply。
C. 待验收项(使用侧)¶
- 用户将
/pdk/templates/{.cdsinit,cds.lib}复制到自己的设计目录后,在 Virtuoso GUI 中确认: Calibre 菜单/命令可用、NCSU CDK 库可见(本工程已用-nograph验证加载路径与语法无误)。 - 如需 FreePDK45 / FreePDK15 库,按模板注释启用对应
SOFTINCLUDE(注意与 NCSU CDK 的basic冲突,二选一)。
D. 2026-10-04 追加变更:NCSU opusUnix.il 覆盖 cd/ls 修复(补丁标记 NCSU-OPUSUNIX-LS-FIX)¶
本节为 2026-10-04 在既有部署之上的追加变更记录,不改动上文 §1–§8。
背景 / 症状:切到项目副本 .cdsinit 后,Virtuoso ADE-XL 点 Run 报
*Error* ls: a nlambda must be defined or declared before its use
ERROR (ADEXL-5025): Preparation to run the simulation is failed for the run Interactive.N, point 1, test pll45:vco5:1
失败点在 launch 前的准备阶段,网表生成本身是成功的。
根因(附证据):NCSU CDK 的 skill/misc/opusUnix.il(第 55 行 nprocedure( ls(dir)用 nprocedure(nlambda)
重新定义 cd/ls(及 cat/rm),覆盖了 Cadence 内建 cd/ls(autoload 的 lambda);Virtuoso 启动时打印
*WARNING* (def): redefining function cd/ls from a lambda to be a nlambda
ADE-XL 已编译的运行准备代码调用 ls(path),符号被换成 nlambda 后即报上述错误。
证据位置(主机 hpc-submit = 192.168.31.28):
/home/rain01/CDS.log(第 1477~1595 行含netlisting of design for the point ID与nlambda报错)/projects/design/rain01/proj1/cdssetup/logs_rain01/logs0/Job0.log、Job3.log(两条 redefinition 警告);Job4.log、Job5.log(ADEXL-5025 失败)- PDK 侧定义处:
/pdk/ncsu-cdk-1.6.0.beta/skill/misc/opusUnix.il
影响范围:所有加载 NCSU CDK 并以 ADE-XL 运行的项目;不影响网表生成,仅影响运行准备阶段。
处置:在 NCSU CDK 加载之后,把 ls/cd 重新注册为普通 lambda(补丁标记 NCSU-OPUSUNIX-LS-FIX):
(define ls (lambda (dir) (cons "." (cons ".." (getDirFiles (if dir dir (getWorkingDir)))))))
(define cd (lambda (dir) (changeWorkingDir (if dir dir "~")) (getWorkingDir)))
三处落点(均已落地):
| # | 落点 | 位置 |
|---|---|---|
| 1 | 项目副本 .cdsinit |
.28:/projects/design/rain01/proj1/cdssetup/.cdsinit |
| 2 | 模板生成器 | deployer.py 的 _render_templates()(生成的 .cdsinit 末尾追加同一补丁块) |
| 3 | 站点模板 | /data/nfs/pdk/templates/.cdsinit(客户端视图 /pdk/templates/.cdsinit,1641 B,root:root 644) |
验证证据(均已实测):
- 生成器渲染结果与已部署站点模板逐字节相同(1641 B,sha256
28e8b84fc0377228668bb7326c10a78b323aa776e860a71fc616dc073849ece3)⇒ 重跑部署为幂等空操作; - 站点模板与项目副本
.cdsinit逐字节相同; - 无头验证(
.28上以rain01跑virtuoso -nograph):警告变为redefining function cd/ls from a nlambda to be a lambda,ls("/tmp")返回列表、cd正常; - 用户 GUI 复跑:
spectre completed with 0 errors, 7 warnings, and 1 notice(.../results/data/Interactive.2/1/pll45:vco5:1/psf/spectre.out)。
回滚:用 backup/data/nfs/pdk/templates/.cdsinit.bak.20261004-034915(889 B)覆盖回站点模板;
用 .28:/projects/design/rain01/proj1/backup/adexl_ncsu_ls_20261004-034226/.cdsinit.bak.20261004-034226(889 B)覆盖回项目副本;
并去除 deployer.py 中追加的补丁块(本轮为纯追加,移除该块即还原)。备份逐条登记见 backup/README.md。
风险:ls/cd 改回 lambda 后,若有 Skill 代码依赖其 nlambda 语义(可变参等)会受影响——本项目与站点侧均未见此类依赖;
站点模板改动会影响全部复制该模板的新项目,故先做逐字节比对与无头验证再确认。
E. 2026-10-12 追加变更:ADE-XL 仿真数据落层段(补丁标记 SIM-DATA-LAYERING)¶
本节为 2026-10-12 在既有部署之上的追加变更记录,不改动上文 §1–§8。
背景:ADE-XL 仿真数据默认落 ~/cadence/simulation。按 EDA 存储分层(Tier1 NFS 持久 / Tier0 Lustre 共享临时),把工程落项目区、大波形落 Lustre。机制见 eda_tools_ins/design/docs/BASELINE.md §7.11。
处置:在 .cdsinit 模板末尾(NCSU 加载之后)追加通用落层段(不硬编码用户,用工作目录 + USER):
envSetVal("asimenv.startup" "projectDir" 'string strcat(getWorkingDir() "/simulation"))
envSetVal("adexl.results" "saveResDir" 'string strcat("/mnt/lustre/scratch/users/" getShellEnvVar("USER") "/adexl"))
三处落点:
| # | 落点 | 位置 |
|---|---|---|
| 1 | 生成器 | deployer.py 的 _render_templates()(.cdsinit 模板末尾) |
| 2 | 站点模板 | /data/nfs/pdk/templates/.cdsinit(1641 B→2459 B,root:root 644) |
| 3 | 项目副本 | .28:/projects/design/rain01/proj1/cdssetup/.cdsinit(1641 B→2371 B) |
验证:main.py apply 幂等(dry-run 仅 template:.cdsinit 一项待变更,其余全跳过,6 台客户端可见);站点模板经临时设计目录无头 virtuoso -nograph 验证,projectDir=<cwd>/simulation、saveResDir=/mnt/lustre/scratch/users/rain01/adexl。
前置依赖:/mnt/lustre/scratch/users 为 755 root:root,普通用户不能自建 <user> 目录(TaskProlog 只建本地层);非 rain01 用户使用前须平台侧预建其目录或放开权限(尚未处理)。
回滚:站点模板用 backup/data/nfs/pdk/templates/.cdsinit.bak.20261012-012148 覆盖;项目副本用 .28:.../.cdsinit.bak.20261012-011523 覆盖;生成器为纯追加,移除 SIM-DATA-LAYERING 块即还原。台账见 backup/README.md。
来源:
/home/rain/Documents/eda_tools_ins/Cadence/pdk_integration_20260927/docs/SOP.md| 最后更新:2026-10-12 01:23(由build/sync.py同步,请勿在站点侧修改)