
简介这份PDF文档面向需要将旧版CDB工艺库迁移到IC617平台的Cadence模拟与版图工程师聚焦cdb2oa数据转换及Virtuoso环境下的库路径处理定位为旧工艺库兼容迁移的实操参考。文档围绕CDB转OA的实际流程展开涵盖转换工具调用、库路径保存、转换后库的检查与验证并对ddUpdateLibList等常见警告给出排查思路适合具备一定Virtuoso使用基础、正处理旧工艺库兼容问题的读者参考。资源包共1个PDF文件大小约697KB轻量便于随查随用。目前已有1556人学习下载。通过这份材料读者可系统了解CDB与OA格式不兼容时的处理路径掌握转换前后的检查要点减少旧库在IC617中无法运行的问题并借鉴转换后库复制与验证的实践思路对旧工艺库报错、库列表更新异常及转换后数据完整性确认等场景也给出排查脉络可减少反复试错。1. 旧 PDK 挂上 IC617 就报 OA executable on CDB dataCDB 与 OA 到底差在哪里把 IC5141 时代的工艺库直接指到 IC617 的 Virtuoso 里CIW 里十有八九先弹出一行Warning: ddUpdateLibList: It appears that you are trying to run an OA executable on CDB data接着库是灰的、cellview 打不开、器件栏里空空如也。问题并不在于 Virtuoso 装坏了也不在于 license 掉了原因是你手上这份 PDK 还停在 CDB 格式而 IC617 只认 OA。cdb2oa 就是干这件事的把整个工艺库的 layout、schematic、symbol 和 CDF 参数一起翻译成 OA 库让旧工艺库在新平台上重新跑起来。适合手上积压了不少老工艺库、又必须把设计环境升级到 IC617 的人如果你只是临时查一个旧版图那就别动库另开一台机器更省事。2. 转换前的三件准备备份、cds.lib 副本与磁盘余量真正让转换失败得更彻底的往往是一开始就对着 PDK 原目录动手。cdb2oa 不是一个具备事务性的工具它没有回滚中途断掉之后原位留下的库就会同时带有 CDB 与 OA 两套特征之后不管你怎么重跑都容易得到莫名其妙的结果。所以准备工作比转换本身更值得花时间。2.1 先分清 CDB 库和 OA 库在磁盘上长什么样不用打开 Virtuoso 也能判断一个库是什么格式。CDB 库的根目录下会有prop.xx、master.tag、data.dm这几个特征文件每个 cell 是一个目录里面放的是老式二进制库文件OA 库的根目录同样有data.dm但 cell 目录里换成了layout.oa、sch.oa、symbol.oa这类按 view 分开的文件prop.xx和master.tag都不应该再出现。报错信息里那句contains file prop.xx which is CDB data本质就是 Virtuoso 在库根目录扫到了 CDB 的标记文件于是判定整个库不属于 OA。我一般先跑一遍扫描把 PDK 里到底有几个库需要转换、分别藏在哪个子目录搞清楚顺便确认没有漏掉符号链接指向的库# 在 PDK 根目录下扫一遍有 prop.xx 的就是 CDB 库需要转换 cd /path/to/pdk find . -maxdepth 3 -name prop.xx -printf %h\n | sort -u # 顺手看看哪些库目录其实是软链接转换时要特别对待 find . -maxdepth 3 -type l -ls这条find的-printf %h是打印文件所在目录而不是文件本身直接得到库路径比-name后自己截字符串省事。第二步列软链接很关键cdb2oa 遇到指向别处的符号链接时行为不完全一致有的版本会老老实实跟进去有的版本会直接报cannot open library提前知道总比事后猜好。注意转换是单向的我没见过可靠的反向工具能把 OA 库退回 CDB。备份是这件事里唯一的回退手段不要省。2.2 把 Library Path File 存一份副本到 homecdb2oa 的入口是一个cds.lib输出默认落在你运行转换时的当前目录。直接拿 PDK 里那份正式cds.lib去跑等于让转换结果和原库混在同一个目录树下一旦出错清理起来非常麻烦。常规做法是先把库路径文件另存一份到自己的 home在副本上做文章转完再回填。图形界面的路径是启动virtuoso 进 CIW 菜单Edit→Library Path在弹窗里选File→Save As把文件保存到 home 目录文件名随意比如cds_conv.lib确认后OK。存出来的文件内容长这样DEFINE 某工艺库 /path/to/pdk/某工艺库 DEFINE 某模拟库 /path/to/pdk/某模拟库 INCLUDE /path/to/pdk/cds.lib要留意最后那行INCLUDE。它会把 PDK 原版cds.lib的内容整段并进来于是同一个库名被定义了两次。Virtuoso 解析库路径时按先到先得处理重复定义的第二条基本不生效这就是后面明明转好了却还报旧错的根源。手工把INCLUDE行删掉或注释掉只保留你真正要转的那几个DEFINE是最稳妥的做法。库多的时候我会让副本只留待转库转完一批再追加下一批一次只推进一小步。2.3 环境自检工具在不在、盘够不够、版本对不对动手前有三件事值得花两分钟确认。第一cdb2oa是不是在 PATH 里、-help能不能正常输出——有些站点是整套 Virtuoso 装在共享目录、靠环境脚本挂进来的换个终端窗口就找不到了。第二磁盘余量。转换会在旁边完整生成一份 OA 库工艺库动辄几个 GBdf -h看一眼目标分区留出至少两倍库体积的空间跑到一半No space left on device是最难受的失败方式。第三版本一致性同一台机器上装多套 Virtuoso 时各自内置的 OA 版本不一样A 机器转出来的库拿到 B 机器上打不开是常有的事团队里最好先约定用哪一套环境做转换。# 1) 工具是否可用 which cdb2oa cdb2oa -help | head -30 # 2) 目标分区余量对比一下库体积 du -sh /path/to/pdk df -h /path/to/pdk ~ # 3) 确认当前 shell 用的是哪套 Virtuoso 环境 echo $CDS_INST_DIRCDS_INST_DIR是 Virtuoso 安装根目录的环境变量很多站点靠它切换版本。三行命令跑完你对能不能转、在哪儿转、转完放哪儿就有底了。这一步看着琐碎但它能挡掉后面一半的返工。3. 跑 cdb2oaConversion Toolbox 图形流程与命令行等价写法准备工作做完转换本身其实很快。图形界面和命令行两条路都能走通界面适合第一次摸清楚流程命令行适合重复执行和写进脚本。两条路跑的是同一套引擎日志格式也一样学会看日志比学会点按钮更值钱。3.1 图形界面Conversion Toolbox 的三个必填项在已经打开 Virtuoso 的 CIW 里进Tools→Conversion Toolbox在工具箱里选CDB to OpenAccess Translator弹出的对话框里核心只有三个输入待转换的cds.lib路径、要转的库名、以及输出目录。把 2.2 存到 home 的那份cds_conv.lib填进第一栏库名从下拉里挑输出目录给一个干净的临时目录比如~/cdb2oa_work确认后点OK就开始跑。界面会显示进度转换时间完全取决于库的规模几十个 cell 的小库一两分钟就结束上千个 cell 加上大量 pcell 的完整工艺库跑上半小时也不奇怪。这期间别去动 PDK 目录也别在同一个输出目录里再开一个转换任务两个进程往同一处写结果不可预期。提示转换期间 Virtuoso 界面可能会短暂无响应这是正常的不要急着点关闭。真的卡死了再看日志最后一行停在哪里比反复重启有用。图形界面跑完之后进输出目录确认一眼应该能看到一个和原库同名的目录根目录下不再有prop.xx与master.tag而是data.dm加一堆 cell 目录。到这一步格式转换在技术上已经完成剩下的活是验证和回填。3.2 命令行写法cdb2oa 的常用参数命令行更适合批量操作和留痕。各版本cdb2oa的参数名略有出入动手前先跑一次cdb2oa -help确认下面这套是我在 IC617 环境下一直用的写法# 建独立工作目录输出会落在当前目录下 mkdir -p ~/cdb2oa_work cd ~/cdb2oa_work # 转换单个库cdslib 指副本lib 指库名log 单独留档 cdb2oa \ -cdslib ~/cds_conv.lib \ -lib 某工艺库 \ -log cdb2oa_某工艺库.log # 退出码为 0 只代表进程正常结束不代表所有数据都转成功 echo exit code: $?几个参数的含义值得说清楚。-cdslib必须指向你准备好的那份副本它决定了工具从哪里读取库路径-lib是库名必须与cds.lib里DEFINE后面的名字一字不差大小写敏感写成目录名就会报找不到库。-log强烈建议每次都指定并带上库名批量转换时日志混在一起排查起来会非常痛苦。还有一个参数是-replace作用是输出目录里已经存在同名库时覆盖重建。第一次转换千万别加它会让工具跳过覆盖确认直接写入万一你输出目录填错填成了 PDK 目录原始 CDB 库当场就没了。等流程跑顺、确认路径无误之后重复执行时再加能省掉手工清理的步骤。# 只有确认输出目录绝对正确、且是重复执行时才加 -replace cdb2oa -cdslib ~/cds_conv.lib -lib 某工艺库 -log cdb2oa_r2.log -replace3.3 日志怎么读哪些 warning 可以放过哪些必须停转换日志是唯一能告诉你哪些数据没过来的东西但它的信息量很大从头读会淹掉。我的做法是先按级别筛# 先看有没有 ERROR再看 WARNING 的分布 grep -nE ^ERROR cdb2oa_某工艺库.log | head -20 grep -cE ^WARNING cdb2oa_某工艺库.log grep -nE ^WARNING cdb2oa_某工艺库.log | awk -F: {print $3} | sort | uniq -c | sort -rn | head第三条命令把 warning 内容去重计数一眼就能看出是某一个 pcell 反复报警还是几百条各不相同的告警。前者通常只影响单个器件后者往往意味着整类数据迁移有问题需要停下来查。实践中可以把日志分成三档处理。INFO级全部放过那是进度信息。WARNING里关于 CDF 参数缺失、pcell 回调解析失败、某个 cellview 被跳过的逐条记录下来这些是后面 CDF 参数丢失的直接原因属于必须看但不必停的类别。真正出现ERROR、或者日志在某一行之后不再增长、进程退出码非零那就停删掉输出目录从头来不要在残缺结果上继续往下做。4. 回填 PDK 并验证从 ls 到放一颗器件转换成功不等于能用。我见过太多次日志干干净净、库也能打开结果一放器件 CDF 参数全是空的或者版图打开发现 tech file 没绑上。回填这一步的价值在于把问题拦在替换之前——旧库还在原地随时可以退回去。4.1 替换前先做只读验证第一层验证在文件层面纯ls就能做不用开 Virtuoso# 期望没有 prop.xx / master.tag有 data.dm 和若干 cell 目录 cd ~/cdb2oa_work ls -d 某工艺库 find 某工艺库 -maxdepth 1 -type f -printf %f\n | sort find 某工艺库 -maxdepth 1 -type d | wc -l # cell 数量和原库对一下 # 抽查几个关键 cell 的 view 是否齐全 ls 某工艺库/某nmos器件/最后一条最关键一个 MOS 器件的 cell 目录里symbol、layout、schematic、auLvs、cdsTerm这些标准 view 应该都在。如果只有layout而没有symbol说明转换在某个环节跳过了数据回填之后你会在原理图里找不到这个器件。cell 数量也要跟原 CDB 库比一比差得太多就是没转全。第二层验证是把新库临时挂到一个干净的cds.lib下打开完全不动 PDK 原目录mkdir -p ~/oa_verify cd ~/oa_verify cat cds.lib EOF DEFINE 某工艺库 /home/你的账号/cdb2oa_work/某工艺库 EOF virtuoso 这样打开的 Virtuoso 只认识新库不会被 PDK 里其他旧库干扰出问题也污染不到正式环境。在 Library Manager 里展开库、双击几个 cellview 看能不能正常打开是最快的判定方式。4.2 回填先改名不要直接删源文章里的做法是把 home 下转换好的库复制回 PDK、覆盖原目录。我更倾向于把删除换成改名留档成本和删一次差不多但留下了后悔的机会cd /path/to/pdk # 旧库改名留档不删日期后缀方便以后追溯 mv 某工艺库 某工艺库.cdb.bak.$(date %Y%m%d) # 把转换结果整体搬进来-a 保留权限和时间戳 cp -a ~/cdb2oa_work/某工艺库 ./某工艺库 # 确认目录结构回来了 ls -ld 某工艺库 ls 某工艺库 | headcp -a里的-a等价于-dR --preserveall会把符号链接、权限、时间戳原样带过去这在 PDK 场景下很重要——工艺库里的文件权限经常是只读的用普通cp -r搬过去之后会被umask改掉后面想改都改不了。搬完之后还要检查 PDK 自己的cds.lib。因为库目录名没变、路径也没变正常情况下一行都不用改。但如果 PDK 里有多个cds.lib根目录一个、子目录一个.cdsinit里又INCLUDE了第三个同样会出现重复定义。用一条命令把所有定义点找出来grep -rn DEFINE[[:space:]]*某工艺库 /path/to/pdk --includecds.lib --include*.cdsinit同时确认 home 里那份临时的cds_conv.lib已经不再被任何启动脚本INCLUDE。我吃过这个亏验证用的临时路径忘了清启动时新库被临时路径抢先定义PDK 里明明换好了打开还是老样子白白查了一下午。4.3 用一颗器件跑通最后一公里cd /path/to/pdk virtuoso 进了 Virtuoso 之后按顺序做四件事Library Manager 里确认库出现在列表中且能展开打开一个器件的 symbol看管脚名和图形是否正常新建一个 schematic从器件库里把这个 MOS 放进去双击器件打开属性框看宽长比、模型名、m 值这些 CDF 参数是不是都在。最后那一步是整个流程里唯一能验证 CDF 转换是否成功的动作也最容易被跳过。CDF 参数丢失在文件层面完全看不出来——.oa文件该有的都在库也能打开就是属性框空着。等你在仿真阶段才发现模型名传不进去排查成本就完全不同了。版图侧同理打开一个器件 layout确认 tech file 绑上了LSW里有层次、能正常打孔否则后面 DRC 会一路报错。5. 常见问题cdb2oa 转换里最容易翻车的五类5.1 路径与权限类现象一转换跑到一半报cannot open library或者日志里某个库直接跳过。原因通常是两种库目录里存在指向别处的符号链接工具跟不进去或者 PDK 是从共享盘只读挂载的转换过程需要往库目录里写临时文件写不进去就中断。解决办法是先把这个库整体复制到本地可写目录再转用cp -aL而不是cp -a——-L会把符号链接解引用成真实文件把链接指向的内容一并搬过来之后再无链接依赖。转完把结果搬回去时再用cp -a保持原有结构。现象二转完回填启动 Virtuoso 仍然报prop.xx which is CDB data而且报的是新库。基本可以断定是cds.lib里同一个库名定义了两次第一次还指向旧目录。Virtuoso 取先出现的定义你看到的新库其实根本没被加载。用 4.2 里那条grep -rn DEFINE把所有定义点列出来逐个清理重点查.cdsinit、cds.lib里的INCLUDE行、以及你自己验证时留下的临时文件。5.2 数据与版本类现象三库能打开器件能放但属性框里 CDF 参数是空的。原因在于老 PDK 的 CDF 回调里大量使用了 CDB 时代的写法转换工具无法解析全部回调只能在日志里留一条WARNING然后跳过。这种情况在纯模拟工艺库里非常普遍。解决方法分两步先在日志里把所有 CDF 相关的告警捞出来定位到具体 cell再用 CDF Editor 手工补参数或者在允许的前提下联系 PDK 提供方索取 OA 版本的 CDF 定义直接导入。器件数量超过几十个时手工补不现实第二条路才是正解。现象四转换后的库在同事机器上打不开或者打开后 layout 一片空白。多数是 OA 版本不一致。不同版本的 Virtuoso 内置的 OA 版本不同高版本写的库在低版本上读会出问题。解决办法是团队内统一转换环境别各转各的如果一定要跨版本就在转换工具里把目标 OA 版本显式设成两边都支持的那个转换时多花几分钟比事后返工划算。5.3 中断与残留类现象五转换被 Ctrl-C 打断或机器断连输出目录里一半 OA 一半 CDB。别试图手工清理拼接。cdb2oa 不具备事务性中断后留下的目录里可能既有转换完成的.oa文件又有没处理完的中间状态你无法靠文件名判断哪些是完整的。唯一正确的处理是rm -rf整个输出目录从干净状态重来。这也是 2.2 强调在独立工作目录转换的原因——原始 CDB 库全程保持只读任何时候都能重新开一局。6. 多库批处理把 cdb2oa 包进脚本加一道转换后自检一个完整 PDK 往往挂着十几个库逐个点界面不现实写成脚本一次推完更省事。核心思路很简单从cdslib里把所有DEFINE行抽出来逐个调用转换日志按库名分开存。#!/bin/bash # batch_cdb2oa.sh把一个 cds.lib 里的库逐个转成 OA set -u CDSLIB${1:?用法: batch_cdb2oa.sh cds.lib} WORK${2:-$HOME/cdb2oa_work} mkdir -p $WORK cd $WORK || exit 1 # 只取 DEFINE 行INCLUDE / SOFTINCLUDE / ASSIGN / UNDEFINE 一律跳过 grep -E ^[[:space:]]*DEFINE[[:space:]] $CDSLIB | awk {print $2} | while read -r lib; do echo 正在转换: $lib # 失败不中断记下来最后统一看 cdb2oa -cdslib $CDSLIB -lib $lib -log cdb2oa_${lib}.log || \ echo !! 转换失败: $lib查 cdb2oa_${lib}.log doneset -u让未定义变量直接报错而不是静默变成空值避免cdslib传错时把库转到奇怪的地方。循环里故意不exit一个库失败不影响其余库继续跑跑完统一看日志比中断在第一处更有效率。awk {print $2}取第二个字段是库名第一个是DEFINE第三个是路径。转换完之后再跑一道自检一行都不用开 Virtuoso# 库根目录还有 prop.xx 就说明这个库没转成功 cd $WORK for d in */; do [ -e ${d}prop.xx ] echo 仍是 CDB: $d || echo OK: $d done配合下面这张清单基本能把回填前的风险挡掉大半检查项做法通过标准格式已切换找库根目录有无prop.xx、master.tag两者都不存在cell 数量一致对比新旧库的一级目录数差值在个位数以内关键 view 齐全抽查 MOS、电阻等器件的 cell 目录symbol/layout/schematic都在日志无致命错grep -E ^ERROR日志无输出CDF 可用Virtuoso 里放一颗器件看属性框参数完整、模型名正常这套流程我现在每次动 PDK 都会完整走一遍打包备份、改 home 里的cds.lib副本、转换、只读验证、mv旧库再回填一步都不跳。早年间图快直接在 PDK 原目录上跑转换中途磁盘写满一个用了三年的工艺库当场变成半 CDB 半 OA 的状态最后是靠一台没人动过的备份机才救回来。从那以后我就认一个理格式转换这种事宁可多花二十分钟做备份和验证也不要在出事之后找后悔药。希望帮到你。本文还有配套的精品资源点击获取