
简介这份 PDF 文档面向正在使用 Cadence IC617、需要复用旧工艺库的模拟版图工程师与 PDK 维护人员针对早期 CDB 格式库无法在新平台直接打开的问题梳理 cdb2oa 数据迁移的关键环节。内容围绕转换工具的使用思路、Virtuoso 中 Library Path 的保存位置、转换后库在 home 目录下的确认与回填 PDK 的注意事项展开并对 “run an OA executable on CDB data” 一类告警给出排查方向帮助读者理解 CDB 与 OA 数据不兼容的成因。资源包仅含 1 个 PDF 文件大小约 697KB篇幅短小适合具备基础 Virtuoso 操作经验、希望快速完成旧库迁移的中级读者作为速查手册。已有 1557 人学习说明该问题在 IC617 平台切换中具有普遍性。读者可据此建立从转换、目录检查到 Virtuoso 验证的完整认知减少因库格式不匹配导致的反复试错提高旧工艺库复用与平台迁移效率。1. 从一条 ddUpdateLibList 警告说起IC617 读不了旧 CDB 库IC617 下把数据从 CDB 转换为 OA最常被搜到的工具就是 cdb2oa。旧工艺 PDK 在 IC514 上能打开换到 IC617 后 Virtuoso 一启动就弹Warning: ddUpdateLibList: It appears that you are trying to run an OA executable on CDB data很多人第一反应是库坏了、PDK 装错了其实多数时候只是库格式还停在 CDB而 IC617 的启动程序按 OA 方式去读。这个坑在旧工艺迁移、老项目复现、实验室环境升级里非常常见装不好轻则库打不开重则把唯一一份 PDK 覆盖掉。下面按环境核对、备份、图形化转换、cdb2oa 命令、避坑、验证的顺序把这套转换流程走一遍。2. 环境与版本核对IC617、OA 与 cdb2oa 到底要哪些前置2.1 先确认 Virtuoso 和 cdb2oa 来自同一套 IC617动手前先别急着点转换按钮先确认当前 shell 找到的virtuoso和cdb2oa是同一套 IC617 安装目录里的。旧机器上经常出现 PATH 里同时挂着 IC514 和 IC617virtuoso启动的是 IC617cdb2oa却来自旧路径转换到一半报奇怪的库错误这种翻车最难查。我一般会先看which再看cdb2oa -h能不能正常输出帮助帮助都出不来就说明环境变量或 license 还没通。# 确认当前 shell 实际调用的 Virtuoso 和 cdb2oa 路径 which virtuoso which cdb2oa # 看 cdb2oa 当前版本支持哪些参数不同 IC617 小版本参数名可能不同 cdb2oa -h 21 | head -40 # 只做检查不在这里硬编码 license 地址 echo CDS_INST_DIR$CDS_INST_DIR echo CDS_LIC_FILE$CDS_LIC_FILE echo LM_LICENSE_FILE$LM_LICENSE_FILEwhich的作用是确认 PATH 顺序避免 IC514 的旧工具抢先被调用。cdb2oa -h用来确认转换工具本身可执行同时看清当前版本认哪些参数不同 IC617 小版本对-cdslib、-lib、-out这类参数名可能略有差异先看帮助比照抄旧笔记稳。CDS_INST_DIR是安装根目录CDS_LIC_FILE和LM_LICENSE_FILE是 license 入口只检查不写死避免把不存在的 license 服务器带进脚本。注意如果which cdb2oa输出为空不要继续往下走。常见做法是先把 IC617 的tools/bin加进 PATH再重新开一个终端确认别在旧终端里反复source到变量互相覆盖。2.2 IC514 的 CDB 库和 IC617 的 OA 库差在哪CDB 是旧一代库格式IC514 时代大量工艺库、cellview、CDF 配置都按 CDB 组织IC617 的 Virtuoso 可执行程序按 OA 方式启动遇到库目录里还带prop.xx这类 CDB 标记文件就会在ddUpdateLibList阶段报警。这个警告不是“库内容全坏了”而是“启动程序用 OA 的方式读到了 CDB 的壳”。转换的目标不是把每个 cellview 手工另存而是让 cdb2oa 或 Conversion Toolbox 把整库转成 OA 目录结构再让cds.lib指向新库。检查项旧 CDB 环境IC514 时代IC617 目标环境库格式CDBOA启动表现可读旧库OA executable 读 CDB 数据时报警转换入口无或旧脚本Conversion Toolbox / cdb2oa库目录标记prop.xx等 CDB 文件data.dm等 OA 标记配置入口cds.lib指向库路径cds.lib仍是指向入口库本身要换成 OA这张表不是让你背概念而是排查时对着看。启动日志里出现prop.xx先怀疑库还是 CDBcds.lib里DEFINE的路径没改Virtuoso 就还会去读旧目录。转换工具做的是库级迁移不是简单改后缀所以输出目录、库名、cds.lib三者必须对得上。2.3 目录、权限和 license 的最小检查转换过程会往输出目录写大量文件输出目录所在磁盘要有足够空间当前用户要有读写权限。不要直接在原 PDK 目录里让工具覆盖写常见做法是新建一个空的工作目录把转换结果先落到那里。license 方面cdb2oa和 Virtuoso 启动通常共用一套 license 配置但转换工具可能有自己的 feature 检查如果virtuoso能开、cdb2oa一跑就退出先看日志里是不是 license 没拿到。# 建一个干净的转换工作目录别拿原 PDK 当输出目录 WORK/home/eda/cdb2oa_work mkdir -p $WORK/out $WORK/log chmod urwx $WORK # 看磁盘空间转换整库时空间不够会中途失败 df -h $WORK # 看原 PDK 大小备份前心里有数 du -sh /home/eda/pdk_oldWORK是工作根目录out放转换结果log放日志分开是为了失败时能整目录回滚。df -h看剩余空间du -sh看原 PDK 体积这两个数差太多就别急着转。权限用chmod urwx只保证当前用户可写不建议图省事chmod -R 777后面复制回 PDK 时权限混乱更难查。3. 转换前的备份与 cds.lib 整理别让原 PDK 成为唯一副本3.1 先冻结旧 PDK再做可回滚备份转换前最重要的一步不是启动工具而是备份。旧 PDK 往往是实验室或项目里唯一一份转换工具一旦把输出目录指到原库或者复制回时手滑覆盖没有后悔药。我一般会先cp -a一份带时间戳的备份再确认备份目录能读才动原库。备份不要放在原 PDK 子目录里避免被cds.lib的INCLUDE或后续复制操作带进去。set -e OLD_PDK/home/eda/pdk_old STAMP$(date %Y%m%d_%H%M) BACKUP/home/eda/pdk_backup_$STAMP # -a 保留权限、时间戳和符号链接别用普通 cp cp -a $OLD_PDK $BACKUP # 确认备份目录存在且可读 test -d $BACKUP echo 备份完成: $BACKUP du -sh $BACKUPset -e让命令一旦失败就停避免备份没完成还继续往下跑。STAMP用时间戳区分每次备份cp -a保留原权限和链接关系旧 PDK 里常有符号链接普通cp容易把链接展开成实体文件。test -d和du -sh是备份后的最低确认别只看命令没报错就认为备份好了。注意备份盘和原 PDK 不要放在同一块即将写满的磁盘上。转换整库时输出目录可能比原库大空间不够时先清工作目录不要删备份。3.2 把 cds.lib 复制到工作目录别让工具直接改原文件cds.lib是 Virtuoso 找库的入口里面用DEFINE把逻辑库名映射到实际路径。转换工具读的是cds.lib但不同工具对原文件的写行为不一样稳妥做法是先在 Virtuoso 的 Library Path 编辑器里Save As一份到工作目录或者直接复制一份出来让转换工具读副本。项目里常见的操作是打开 Virtuoso 后进入 Library Path 编辑界面把当前库路径另存到 home 下的工作目录再拿这份cds.lib去选。# 复制一份 cds.lib 到工作目录原文件先不动 cp -a /home/eda/pdk_old/cds.lib /home/eda/cdb2oa_work/cds.lib # 看当前 cds.lib 里有哪些库定义注意 DEFINE 后面的绝对路径 grep -nE ^\s*(DEFINE|INCLUDE|SOFTINCLUDE) /home/eda/cdb2oa_work/cds.libcp -a保留原文件属性grep -nE把DEFINE、INCLUDE、SOFTINCLUDE行连行号列出来。DEFINE后面两个参数分别是逻辑库名和库目录绝对路径转换时要确认逻辑库名就是你要转的那个路径指向旧 CDB 库而不是空目录。INCLUDE和SOFTINCLUDE说明配置被拆到别的文件里别只改主文件就以为改全了。3.3 新建干净的输出目录库名和路径先对齐转换工具的输出目录必须是空的或者至少不能混着上一次的 OA 库。常见翻车是同一个out目录反复用第一次转一半失败第二次工具看到目录里已有同名库行为就变得不可预测。我一般按库名和时间戳建输出目录转换成功后先检查目录结构再决定复制回 PDK 的哪一层。# 输出目录按库名隔离避免多次转换互相污染 LIB_NAMEmyOldLib OUT/home/eda/cdb2oa_work/out/${LIB_NAME}_$(date %Y%m%d_%H%M) mkdir -p $OUT echo 本次输出目录: $OUT # 确认输出目录是空的 find $OUT -mindepth 1 -maxdepth 1 -printLIB_NAME要和cds.lib里DEFINE的逻辑库名一致不要自己另起一个名字去转否则复制回 PDK 后cds.lib对不上。OUT带时间戳失败后直接换目录重来不用清理旧结果。find打印输出目录第一层内容空目录应该没有输出如果有东西先确认是不是上一次的残留。4. 用 Conversion Toolbox 跑通 CDB 到 OA图形界面与 cdb2oa 命令两条路4.1 从 PDK 目录启动 Virtuoso再开 Conversion Toolbox图形化转换对第一次做 CDB 转 OA 的人更友好因为能直接看到读的是哪份cds.lib、输出到了哪个目录。先在 PDK 目录下启动 Virtuoso让当前工作目录和库路径关系清楚再进Tools菜单找Conversion Toolbox选择CDB to OpenAccess Translator。路径选第 3 章复制出来的cds.lib副本不要直接选原 PDK 里那份还没备份的配置。# 在 PDK 目录启动 Virtuoso方便确认当前 cds.lib 和库路径 cd /home/eda/pdk_old virtuoso cd到 PDK 目录是为了让 Virtuoso 启动时读到的相对路径和cds.lib里的定义一致。virtuoso 放后台启动终端还能继续看日志。启动后不要急着点转换先在 Library Path 编辑器里确认cds.lib指向的是旧库路径再打开 Conversion Toolbox。图形界面里的操作顺序可以按下面走Tools菜单进入Conversion Toolbox选择CDB to OpenAccess Translator。cds.lib选/home/eda/cdb2oa_work/cds.lib也就是第 3 章复制的副本。输出目录选第 3 章建好的空OUT目录不要选原 PDK 目录。库名勾选要转的旧库确认逻辑库名和cds.lib里的DEFINE一致。点OK后看转换日志窗口不要关掉 Virtuoso等它跑完。转换过程中最容易被忽略的是日志。工具界面可能只显示“完成”但日志里会列出哪些 cellview 跳过、哪些文件没转。常见做法是等结束后先看输出目录第一层有没有data.dm这类 OA 标记再find查有没有prop.xx残留。图形界面只是入口真正判断成功与否还是看目录和日志。4.2 转换完成后先检查输出目录再复制回 PDK转换结束后输出目录里应该出现以库名命名的 OA 库目录。先别直接覆盖原 PDK先确认输出目录结构、文件数量和日志没有硬错误。项目里常见的做法是先把原库改名备份再把新库复制回原路径这样cds.lib里的DEFINE不用大改Virtuoso 启动时直接读新库。# 先看转换输出目录第一层结构 OUT/home/eda/cdb2oa_work/out/myOldLib_20240101_1010 find $OUT -maxdepth 2 -type d -print | head -20 # 查有没有 CDB 残留标记有就说明没转干净 find $OUT -maxdepth 3 \( -name prop.xx -o -name *.cdb \) -print # 查 OA 标记文件是否出现 find $OUT -maxdepth 2 -name data.dm -printfind第一组只看目录层级确认库目录和 cell 目录已经生成。第二组查prop.xx和*.cdb有输出就别急着复制回 PDK说明转换结果里还混着 CDB 文件。第三组查data.dm它是 OA 库常见标记之一有它至少说明新库结构已经落盘。三步都过了再做复制比直接cp覆盖稳。# 原库先改名备份再把新库复制回原路径 cd /home/eda/pdk_old mv myOldLib myOldLib.cdb.bak.$(date %Y%m%d_%H%M) cp -a $OUT/myOldLib ./myOldLib # 确认原路径下已经是新库 ls -ld /home/eda/pdk_old/myOldLib find /home/eda/pdk_old/myOldLib -maxdepth 2 -name prop.xx -printmv把旧 CDB 库改名保留在原 PDK 目录里但不被cds.lib引用cp -a把新 OA 库复制回原逻辑路径这样cds.lib里的DEFINE不用改。复制后ls -ld看目录属主和权限find再查一次prop.xx如果又出现说明复制源不对或者原库没移干净。不要用rm -rf直接删原库改名备份就是留给自己的后悔药。4.3 命令行 cdb2oa 的批处理写法与参数取舍图形界面适合第一次转换批量或重复转换时命令行更省事。摘要里常见的cdb2oa -i input.cdb -o output.oa是单文件示意写法整库转换通常要指定cds.lib、库名和输出目录具体参数以cdb2oa -h为准。我一般先在一个小库上跑通命令再放到批处理脚本里避免参数写错把大库转一半。# 变量按实际路径替换out 目录必须是空目录 CDS_LIB/home/eda/cdb2oa_work/cds.lib LIB_NAMEmyOldLib OUT_DIR/home/eda/cdb2oa_work/out/${LIB_NAME}_cli LOG/home/eda/cdb2oa_work/log/${LIB_NAME}_cdb2oa.log mkdir -p $OUT_DIR $(dirname $LOG) # 如果 -h 里没有 -cdslib/-lib/-out按当前版本帮助调整参数名 cdb2oa -cdslib $CDS_LIB -lib $LIB_NAME -out $OUT_DIR 21 | tee $LOGCDS_LIB指向第 3 章复制出来的cds.lib副本LIB_NAME必须和DEFINE里的逻辑库名一致OUT_DIR每次新建空目录LOG用tee同时输出到终端和文件。-cdslib、-lib、-out是常见参数名但不同 IC617 小版本可能不同执行前先用cdb2oa -h核对。命令跑完后先grep日志里的error、failed、skip再看输出目录不要只看退出码。# 转换后先扫日志关键字再决定是否复制回 PDK grep -iE error|failed|skip|cannot|license $LOG || echo 日志未见明显错误关键字 # 查输出库是否含 OA 标记和 CDB 残留 find $OUT_DIR -maxdepth 2 -name data.dm -print find $OUT_DIR -maxdepth 3 \( -name prop.xx -o -name *.cdb \) -printgrep -iE忽略大小写扫错误关键字没有匹配时用|| echo给出提示避免脚本因为grep返回 1 就中断。find两组检查和图形化转换后一样先确认 OA 标记再确认没有 CDB 残留。命令行转换的优势是可重复但前提是输出目录和日志都按库名隔离否则第二次跑会很难判断结果属于哪一次。5. 避坑与排查cdb2oa 转换中最容易翻车的五处5.1 现象转换后库目录里还是 cdb 文件现象是转换工具显示完成但进输出目录一看里面还能找到prop.xx或*.cdbVirtuoso 启动仍然报警。原因通常是cds.lib选错工具读的是另一份指向旧库的配置或者输出目录不是空的工具把结果写到了上次残留的目录里还有一种情况是库名勾选错了转的是同 PDK 里另一个已经转过的库。解决时先回到第 3 章的grep确认cds.lib副本里DEFINE的路径就是旧 CDB 库再换一个全新的空输出目录重跑。# 重新确认 cds.lib 副本里的库定义 grep -nE ^\s*DEFINE\smyOldLib\s /home/eda/cdb2oa_work/cds.lib # 换全新输出目录重跑避免旧结果污染 NEW_OUT/home/eda/cdb2oa_work/out/myOldLib_retry_$(date %Y%m%d_%H%M) mkdir -p $NEW_OUT find $NEW_OUT -mindepth 1 -maxdepth 1 -printgrep只匹配myOldLib的DEFINE行确认路径没有指向备份目录或空目录。NEW_OUT用新时间戳find确认目录为空再跑转换。重跑后如果还有prop.xx不要再反复覆盖原 PDK先把结果目录整个移到一边回头查转换日志里有没有skip或cannot convert。5.2 现象Virtuoso 启动仍报 OA executable on CDB data现象是库已经复制回原路径Virtuoso 一启动还是弹ddUpdateLibList警告警告里仍然带着旧库名和prop.xx路径。原因常见有三种cds.lib里还有另一条DEFINE指向旧 CDB 目录原库改名后没改干净启动路径又读到了备份目录复制回的新库里混进了旧库的prop.xx。解决时先grep整个cds.lib和包含文件把所有指向旧路径的DEFINE找出来再确认原路径下只有一套库。# 扫 cds.lib 和常见包含文件里所有 DEFINE 行 grep -RInE ^\s*DEFINE\s /home/eda/pdk_old/cds.lib /home/eda/cdb2oa_work/cds.lib 2/dev/null # 查原路径和新库目录里是否还有 CDB 标记 find /home/eda/pdk_old/myOldLib -maxdepth 3 \( -name prop.xx -o -name *.cdb \) -printgrep -RIn会连文件名和行号一起输出方便确认是哪份配置还在指旧路径。find查原路径下的 CDB 标记如果有先把它们移到备份目录不要直接删到不可恢复。确认cds.lib只剩一条指向新 OA 库的DEFINE后重新开一个终端启动 Virtuoso旧终端里的环境变量可能还指着旧库。5.3 现象转换中途退出或日志里 license 报错现象是cdb2oa跑几秒就退出日志里出现 license、feature 或 cannot connect 之类关键字图形界面则可能卡在启动转换工具那一步。原因通常是当前 shell 的CDS_LIC_FILE或LM_LICENSE_FILE指向了旧版本配置或者转换工具需要的 feature 没被 license 覆盖。解决时先确认virtuoso能正常启动再单独跑cdb2oa -h如果帮助都出不来先修环境变量和 license不要怪库。# 检查当前 license 变量和 cdb2oa 可执行性 env | grep -E CDS_LIC_FILE|LM_LICENSE_FILE || true cdb2oa -h /dev/null 21 echo cdb2oa 可执行 || echo cdb2oa 启动失败先查 license 和 PATH # 看转换日志里的 license 关键字 grep -iE license|feature|connect|cannot /home/eda/cdb2oa_work/log/*.log 2/dev/null || trueenv | grep只查看当前 shell 的 license 变量不在文章里写死具体服务器地址。cdb2oa -h是最小可执行性检查帮助都出不来就别继续转库。日志grep用来定位 license 关键字|| true防止没有日志时脚本中断。常见做法是先把 license 环境修到virtuoso和cdb2oa都能启动再重新跑转换。5.4 现象复制回 PDK 后层次、CDF 或参数丢失现象是库能打开cellview 也在但器件参数、CDF 表单或某些层次显示不对。原因通常不是 cdb2oa 把 cellview 转坏了而是旧 PDK 的 CDF 和 techfile 初始化脚本没有跟着新库加载转换工具主要处理库和 cellview 结构PDK 的 CDF 配置往往还在原 PDK 的 SKILL 初始化或 techfile 里。解决时先拿一个小库做对照转换确认原库能打开、新库能打开再比对 CDF 参数不要一上来就转整个 PDK。# 先在小库上做对照转换减少一次性影响范围 SMALL_LIBtestOldLib SMALL_OUT/home/eda/cdb2oa_work/out/${SMALL_LIB}_small mkdir -p $SMALL_OUT # 小库转换命令示例参数仍以 cdb2oa -h 为准 cdb2oa -cdslib /home/eda/cdb2oa_work/cds.lib -lib $SMALL_LIB -out $SMALL_OUT 21 | tee /home/eda/cdb2oa_work/log/${SMALL_LIB}.logSMALL_LIB选一个 cell 数量少、依赖简单的旧库SMALL_OUT单独建目录日志单独存。小库转换后先在 Virtuoso 里打开一个 cellview检查 CDF 参数和层次再决定是否转大库。CDF 丢失时不要急着重转先确认 PDK 初始化脚本是否加载、cds.lib是否还指向旧 techfile 路径很多“转换丢参数”其实是 PDK 环境没带全。5.5 现象同一库多次转换后目录混乱现象是同一个库转了两三次out目录里出现多个同名库复制回 PDK 时不知道哪个是最新cds.lib也出现重复DEFINE。原因是输出目录复用了或者复制回 PDK 时没有把旧 OA 结果移走。解决时按库名和时间戳隔离输出目录复制回 PDK 前先ls确认原路径只有一套库cds.lib里同名库只留一条DEFINE。# 列出工作目录下所有转换结果按时间排序 ls -1dt /home/eda/cdb2oa_work/out/myOldLib_* 2/dev/null | head -10 # 查 cds.lib 里同名库是否重复定义 grep -nE ^\s*DEFINE\smyOldLib\s /home/eda/pdk_old/cds.lib /home/eda/cdb2oa_work/cds.lib 2/dev/nullls -1dt按修改时间倒序列出转换结果最新的一般在最上面。grep查同名库是否有多条DEFINE有重复就只保留指向当前 OA 库的那条其余注释掉或移到备份配置。目录混乱时不要靠猜先按时间戳和日志对上是哪一次转换再把不用的结果移到out/_trash之类目录别直接删到无法追溯。6. 装完怎么验证用三个检查确认 IC617 真的读的是 OA 库6.1 启动日志里不再出现 CDB 警告转换和复制完成后从 PDK 目录重新启动 Virtuoso把终端输出重定向到日志等几秒再grep关键字。这个检查最直接如果还出现ddUpdateLibList、OA executable on CDB或prop.xx说明cds.lib或库目录还有 CDB 残留。注意要在新终端里跑旧终端可能还带着之前的 PATH 和库路径。cd /home/eda/pdk_old virtuoso virtuoso_verify.log 21 sleep 8 grep -iE ddUpdateLibList|OA executable on CDB|prop\.xx virtuoso_verify.log || echo 启动日志未见 CDB 警告sleep 8是给 Virtuoso 留启动时间机器慢就加到 15 秒。grep没有匹配时返回非零用|| echo给出明确提示。日志里如果只有普通加载信息没有 CDB 关键字再进下一步。6.2 库目录检查有 data.dm没有 prop.xx光看启动日志不够还要直接查库目录。旧 CDB 库常见prop.xx新 OA 库常见data.dm。下面这组检查可以做成脚本每次转换后跑一遍。LIB_DIR/home/eda/pdk_old/myOldLib find $LIB_DIR -maxdepth 2 -name data.dm -print find $LIB_DIR -maxdepth 3 \( -name prop.xx -o -name *.cdb \) -print第一条查 OA 标记第二条查 CDB 残留。期望结果是第一条有输出、第二条没有输出。如果第二条有输出先别在 Virtuoso 里保存任何 cellview把残留文件移到备份目录再重新检查cds.lib指向。6.3 打开一个 cellview 做读档和另存验证最后一步是实际打开一个 cellview看层次、CDF 参数和符号是否正常。不要直接保存原库先另存到一个测试库或复制一份 cellview 再保存。我一般会挑一个含器件参数的小 cell打开后看 CDF 表单能不能正常弹出再另存到测试库确认保存不报错。这个动作能抓到“库能启动但保存失败”的问题。检查项命令或动作期望启动日志grepCDB 关键字无ddUpdateLibList警告OA 标记find -name data.dm有输出CDB 残留find -name prop.xx无输出cellview 读档Library Manager 打开小 cell层次和 CDF 正常另存测试复制到测试库保存不报库格式错误如果另存时报错先回滚到第 3 章的备份再检查转换输出目录是不是混了旧库。回滚命令不要临时手写按备份时间戳来cd /home/eda/pdk_old mv myOldLib myOldLib.oa.bad.$(date %Y%m%d_%H%M) mv myOldLib.cdb.bak.20240101_1010 myOldLibmv先把有问题的 OA 库移到一边再把之前备份的 CDB 库改回原名。回滚后重新启动 Virtuoso确认旧库还能打开再从头排查转换步骤。从那以后我每次动 PDK 前都先跑一遍备份和cds.lib检查脚本哪怕只是改一个DEFINE路径也不省略。这套转换检查清单和cds.lib模板我整理在资源入口里拿到后先按第 2 章核对版本再照第 3 章备份别一上来就覆盖原 PDK。希望帮到你。本文还有配套的精品资源点击获取