跳转至

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_ins module_family_scope_20260927) 实现体:deployer.py(编排)+ utils/(预检查、三态探测、配置校验、执行通道)

目录

  1. 背景 / 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. 待验收项(使用侧)

  1. 用户将 /pdk/templates/{.cdsinit,cds.lib} 复制到自己的设计目录后,在 Virtuoso GUI 中确认: Calibre 菜单/命令可用、NCSU CDK 库可见(本工程已用 -nograph 验证加载路径与语法无误)。
  2. 如需 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 同步,请勿在站点侧修改)