简介:这份资源面向使用 Cadence IC617 平台的模拟/版图工程师与工艺库维护人员,聚焦旧工艺库从 CDB 数据格式迁移到 OA 格式这一常见痛点。当在 IC617 中打开旧 PDK 时,常会触发 ddUpdateLibList 相关警告,提示正在对 CDB 数据运行 OA 可执行程序,资源正是围绕该问题给出可落地的转换思路与验证方法。包内为 1 个 PDF 文档,压缩包约 697KB,内容以图文形式梳理 cdb2oa 工具的命令行用法、Conversion Toolbox 中 CDB to OpenAccess Translator 的路径选取与转换流程,以及在 Virtuoso 中通过 Library Path 保存到 home 目录、复制回原 PDK 的完整操作脉络。目前已有 1551 人学习,适合需要将 IC514 时代工艺库迁移到 IC617 环境、并希望减少格式不兼容报错的读者参考,可帮助快速理解转换步骤与常见错误的排查方向。
1. 从一条 ddUpdateLibList 警告说起:IC617 里 CDB 转 OA 到底在转什么
如果你在 IC617 里打开 Virtuoso,终端刷出Warning: ddUpdateLibList: It appears that you are trying to run an OA executable on CDB data,后面还跟着某个工艺库的prop.xx路径,那基本可以确定:你手上这套 PDK 还是 IC514 时代的 CDB 格式,而 IC617 的 Virtuoso 只认 OpenAccess(OA)数据库。这不是库坏了,也不是环境变量写错了,纯粹是数据格式代差。CDB 是 Cadence 早期版本的库格式,OA 是后来统一的数据模型,IC617 不再向下兼容 CDB,所以必须做一次格式迁移。cdb2oa就是官方随 IC617 一起装好的转换工具,它能把 CDB 库整体翻译成 OA 库,让老工艺库在新平台上重新可用。这篇笔记面向的是手里攥着老 PDK、又必须上 IC617 的版图与电路工程师,我会把转换前的准备、转换中的参数、转换后的验证,以及我踩过的几个坑一次讲清楚。
2. 转换前的环境确认与 cdb2oa 调用方式
2.1 先确认你的库到底是不是 CDB
动手之前别急着敲命令,先确认两件事:IC617 的安装路径是否完整,以及目标库是不是真的 CDB。判断方法很直接,进到 PDK 目录看有没有cds.lib,再打开它看库定义指向的目录里是否存在prop.xx、tech.db这类文件。CDB 库的典型特征是每个库目录下有一堆.db文件和prop.xx,而 OA 库则是data.dm加一堆以库名命名的子目录。我一般会先用ls扫一眼:
# 进入疑似 CDB 的 PDK 根目录 cd /home/user/PDK_old # 查看 cds.lib 内容,确认库定义 cat cds.lib # 列出库目录,CDB 库通常能看到 prop.xx 和大量 .db ls -la如果cds.lib里写的是DEFINE ts35mm ./ts35mm,而ts35mm目录下确实有prop.xx,那它就是 CDB。这里有个容易翻车的点:有些 PDK 是混合的,一部分库已经转成 OA,另一部分还是 CDB,cds.lib里两种定义混在一起。这种情况下不能整个cds.lib丢给转换工具,得先把 CDB 那几行单独拎出来,否则转换工具会报库已存在或者直接跳过。
2.2 cdb2oa 的两种调用姿势
cdb2oa有命令行和图形界面两条路。命令行适合脚本化、批量处理,图形界面适合第一次转换时肉眼确认。命令行基本形式是:
# 基本调用:指定输入 cds.lib 和输出目录 cdb2oa -i /home/user/PDK_old/cds.lib -o /home/user/PDK_oa参数含义:-i指向包含 CDB 库定义的cds.lib,-o是转换后 OA 库的输出根目录。注意-o目录必须提前建好,工具不会自动创建,我第一次跑的时候没建目录,它直接报了个权限错误,排查了半天才发现是目录不存在。另外cdb2oa默认会转换cds.lib里所有库,如果只想转其中某一个,可以在cds.lib里临时注释掉其他行,或者用-l指定库名。
图形界面走的是 Virtuoso 里的 Conversion Toolbox。启动 Virtuoso 后,在 CIW 窗口菜单里找Tools -> Conversion Toolbox,打开后选CDB to OpenAccess Translator,然后浏览到 PDK 里的cds.lib,点 OK 就开始转。图形界面的好处是它会实时打印每个库的转换进度和警告,哪些库转成功、哪些库有文件被跳过,一眼能看清。我通常第一次转用图形界面,确认没问题后再把命令记下来,以后批量转直接跑命令行。
2.3 转换过程中的日志该看什么
不管走哪条路,转换都会输出日志。日志里最需要盯的是三类信息:Converting library表示开始处理某个库,Skipped表示某个文件被跳过,Error才是真正需要处理的。常见的Skipped是某些.db文件在 OA 里没有对应格式,比如一些老的仿真状态文件,这种跳过一般不影响版图和原理图使用。但如果出现Error: cannot open或者Error: invalid,那就要停下来看是文件权限问题还是文件本身损坏。我一般会把日志重定向到文件,转完后用grep过滤:
# 命令行转换并把日志存下来 cdb2oa -i /home/user/PDK_old/cds.lib -o /home/user/PDK_oa > cdb2oa.log 2>&1 # 只看错误和跳过 grep -E "Error|Skipped" cdb2oa.log这样转完一遍,哪些库干净、哪些库有遗留问题,心里就有数了。
3. 转换后的库替换与 Virtuoso 加载验证
3.1 把 OA 库放回 PDK 的正确顺序
转换完成后,-o指定的目录下会出现一套 OA 格式的库目录。接下来的操作顺序很关键,顺序错了 Virtuoso 照样报错。正确做法是:先备份原 PDK 里的 CDB 库目录,再把转换好的 OA 库目录复制进原 PDK 对应位置,最后更新cds.lib里的路径指向。我见过有人直接把 OA 库复制进去覆盖,结果原 CDB 库没了,新库又因为cds.lib没改而加载不到,两头空。
# 备份原 CDB 库目录 mv /home/user/PDK_old/ts35mm /home/user/PDK_old/ts35mm_cdb_bak # 把转换好的 OA 库复制过去 cp -r /home/user/PDK_oa/ts35mm /home/user/PDK_old/ts35mm # 确认 cds.lib 里的 DEFINE 路径没变,仍然指向 ./ts35mm这里有个细节:转换工具生成的 OA 库目录名可能和原库名一致,也可能带后缀,复制前先ls确认一下。另外cds.lib里如果有ASSIGN或者INCLUDE语句指向其他配置文件,也要检查那些文件里有没有残留的 CDB 路径。
3.2 在 Virtuoso 里验证库是否真正可用
库放回去之后,别急着开原理图。先启动 Virtuoso,在 CIW 里执行ddUpdateLibList,看终端还刷不刷那条 CDB 警告。如果警告消失,说明库已经被识别为 OA。然后打开 Library Manager,找到目标库,展开看 Cell 列表能不能正常显示。能显示 Cell 还不够,得实际打开一个版图或者原理图,看图层、器件符号、参数是否完整。我一般会挑一个包含器件和走线的版图单元打开,检查 Layer Selection 里各层是否齐全,再跑一次 DRC 看规则文件能不能正常读取。这一步是验证转换质量的关键,因为有些 CDB 库的图层定义在转换后会出现映射偏移,DRC 一跑就暴露了。
# 在 Virtuoso CIW 中执行,刷新库列表 ddUpdateLibList # 或者直接在终端启动 Virtuoso 时观察输出 virtuoso &如果打开版图后发现某些图层丢失,常见原因是 CDB 里的tech.db在转换时没有正确映射到 OA 的techfile。这时候需要检查转换日志里关于techfile的部分,看是否有Skipped。如果有,可能需要手动用techfile转换工具单独处理,或者从原 PDK 里找对应的 OA 版 techfile 补上。
3.3 转换前后关键文件对照
| 项目 | CDB 格式特征 | OA 格式特征 |
|---|---|---|
| 库根目录 | 包含prop.xx、大量.db | 包含data.dm、库名子目录 |
| 技术文件 | tech.db | techfile或tech.db(OA 封装) |
| 库定义 | cds.lib中DEFINE指向 CDB 目录 | cds.lib中DEFINE指向 OA 目录 |
| Virtuoso 识别 | 报ddUpdateLibList警告 | 无警告,Library Manager 正常展开 |
这张表可以帮你快速判断一个库当前处于哪种状态,转换前后各看一眼,心里有底。
4. 避坑与排查:cdb2oa 转换中最容易翻车的五个点
4.1 现象:转换报 “Library already exists” 直接退出
原因:-o输出目录下已经存在同名库目录,cdb2oa默认不覆盖。解决:要么换一个干净的输出目录,要么先把输出目录里的同名库删掉再转。我现在的习惯是每次转换前rm -rf一个专门的临时输出目录,转完确认无误再往 PDK 里放。
4.2 现象:转换成功但 Virtuoso 打开库时提示 “Unable to open library”
原因:cds.lib里的路径没更新,或者 OA 库目录的权限不对。解决:先确认cds.lib里DEFINE指向的路径确实存在且是 OA 库,再用ls -ld看目录权限,确保当前用户有读和执行权限。如果是多人共用的 PDK,权限问题尤其常见。
4.3 现象:版图打开后图层缺失或 DRC 报大量未定义层
原因:CDB 的tech.db在转换时没有完整映射到 OA 的techfile,或者转换时跳过了techfile相关文件。解决:翻转换日志找techfile相关的Skipped记录,从原 PDK 里找 OA 版 techfile 补上,或者用techfile转换工具单独转一次。这个坑我踩过,当时 DRC 跑出来几百个错,查了一下午才发现是 techfile 没转全。
4.4 现象:转换过程卡在某个库不动,日志也不再刷新
原因:某个.db文件损坏或者被其他进程占用。解决:先看日志最后一行停在哪个库哪个文件,用ls -l确认文件大小是否为 0,或者用fuser看有没有进程占用。如果是文件损坏,从备份里恢复该文件再重转;如果是占用,关掉相关 Virtuoso 会话再试。
4.5 现象:转换后原理图能打开但器件参数丢失
原因:CDB 里的 CDF(Component Description Format)参数在转换时没有正确迁移。解决:检查转换日志里关于CDF的记录,如果确实丢了,需要在 OA 库里重新加载 CDF,或者从原 CDB 库里导出 CDF 再导入 OA 库。这个属于比较隐蔽的问题,建议转换后随机抽几个器件看参数是否完整。
5. 批量转换与版本回退:我的两个保命习惯
批量转换多个 PDK 时,我习惯写一个简单的 shell 脚本,把每个 PDK 的cds.lib路径列进去,循环调用cdb2oa,每个库的日志单独存。这样转十个库和转一个库的工作量差不多,而且出问题能快速定位是哪个库。脚本骨架大概是这样:
#!/bin/bash # 批量转换多个 PDK 的 CDB 库到 OA PDK_LIST=("/home/user/PDK_A/cds.lib" "/home/user/PDK_B/cds.lib") OUT_BASE="/home/user/PDK_oa_batch" mkdir -p "$OUT_BASE" for pdk in "${PDK_LIST[@]}"; do name=$(basename $(dirname "$pdk")) echo "Converting $name ..." cdb2oa -i "$pdk" -o "$OUT_BASE/$name" > "$OUT_BASE/$name.log" 2>&1 if [ $? -eq 0 ]; then echo "$name done." else echo "$name failed, check $OUT_BASE/$name.log" fi done这个脚本里$?判断上一步cdb2oa的退出码,非零就提示去看日志。注意cdb2oa有时候即使有Skipped也返回 0,所以退出码只能判断严重失败,细节还得看日志。
另一个习惯是版本回退。转换前我一定把原 CDB 库整个目录打包备份,命名带日期,比如ts35mm_cdb_20231014.tar.gz。转换后如果发现 OA 库有问题,直接解包恢复,不用重新从别处找 PDK。这个习惯救过我一次:有个库转换后器件符号全乱了,我直接回退到 CDB 备份,换了个时间窗口重新转,第二次就正常了。从那以后我每次做库格式迁移,都强制走一遍“备份-转换-验证-再替换”的流程,绝不跳过备份直接覆盖。希望这些经验能帮到你,少走几个弯路。
本文还有配套的精品资源,点击获取