简介:面向Cadence IC617模拟与版图设计用户,以及需要维护旧工艺库的工程师,这份PDF资料聚焦旧CDB数据迁移至OpenAccess(OA)平台时的兼容问题,可作为工艺库升级与Virtuoso环境切换的参考。压缩包仅含1个PDF文件,大小约697KB,篇幅紧凑,便于按主题查阅;内容围绕cdb2oa迁移场景,涵盖转换前的环境判断、转换工具入口、转换结果校验,以及“ddUpdateLibList”等常见警告的成因分析与处理思路。已有1556人学习,说明该问题在IC514向IC617迁移过程中较具代表性。读者可借此理解CDB与OA数据差异,建立从转换、保存到验证的排查框架,减少旧PDK在新平台打开时的试错成本。
1. 一开 Virtuoso 就满屏 Warning:CDB 转换 OA 这道坎,几乎每个换版本的组都要踩一次
工艺库在旧机器上跑得好好的,换到 IC617 上,CIW 窗口先甩出一行Warning: ddUpdateLibList: It appears that you are trying to run an OA executable on CDB data,后面还跟着库名和一个prop.xx的绝对路径,Library Manager 里那个库要么灰着,要么点开一片空白。新手第一反应通常是“库坏了”或者“环境装错了”,老手会先想到另一件事:这个库还是 CDB 格式,而 IC617 只认 OpenAccess。CDB 转换 OA 不是可选项,是换到 IC6 之后必须过的一道流程,工艺库越多、越老,这道流程越麻烦。下面按“警告怎么读、转换前怎么准备、图形界面和命令行两条路怎么走、出错后怎么查”的顺序,把我踩过的坑逐条列出来,适合刚接手老 PDK 的版图、电路工程师照着操作。
2. 逐句拆警告:IC617 读不了旧工艺库,问题从来不在库文件本身
这行警告信息量比大多数人以为的大得多,它其实已经把诊断结果、出错位置和建议动作全写出来了,只是被一堆重复的If this is an OA library...盖住了重点。把原文按行拆开看:
Warning: ddUpdateLibList: It appears that you are trying to run an OA executable on CDB data. Library 'ana035' contains file '/opt/pdk/pdk035/ana035/prop.xx' which is CDB data. If this is an OA library, this file needs to be removed. If this is an OA library, ... (原文此处重复多行)注意库名和路径是虚构的代称,实际输出里会是你的库名和你的绝对路径,但那不重要,重要的是这三行的结构:谁报的(ddUpdateLibList)、是什么冲突(OA 程序读 CDB 数据)、证据是什么(prop.xx)。
2.1 三个关键词:OA executable、CDB data、prop.xx
ddUpdateLibList是 Virtuoso 启动阶段刷新库列表的内部例程。警告从它这里发出来,说明问题卡在“列库”这一步,还没走到打开 cellview、加载 techfile 那么后面,所以不要一上来就去查版图、查规则文件,方向错了。
OA executable指的是当前这个 IC617 的可执行程序,它编译时链接的是 OpenAccess 的 API,代码里没有 CDB 的读写路径。CDB data指的是库目录里躺着的是 IC5141 那一代格式的数据。这两者不是“版本不兼容”这么含糊的说法,而是纯粹物理上无法互相兼容,就像拿着只能识别特定数据格式的读取程序去读取另一种格式的数据文件。
prop.xx是最值得记住的一个名字。它是 CDB 库根目录下的属性文件,可以理解为 CDB 格式的指纹。只要一个库的根目录下有这个文件,工具探测时就会把它归类为 CDB 库。反过来说,找一个库是不是 CDB,最省事的办法就是看有没有prop.xx,不用去翻版本日志。
2.2 根因链:cds.lib 指向的目录还是 CDB 格式
完整链路是这样的:Virtuoso 启动,读当前目录下的cds.lib(以及lib.defs、站点级的 include 链),里面每一行DEFINE ana035 /opt/pdk/pdk035/ana035就是库名到物理目录的映射;刷新库列表时逐个打开这些目录探测格式;探测到prop.xx,判定为 CDB;而当前程序没有 CDB 支持,于是发警告并跳过这个库。
所以根因是“cds.lib里登记的这个目录,内容是 CDB 格式”,并非“库坏了”。这个判断很重要,因为它直接决定了两条处理路线:
一条是把工具换回旧版本(比如继续用 IC5141 打开),属于回避,不解决协作问题;另一条是把数据升级成 OA 格式,也就是 CDB 转换 OA。只要团队里有任何一个人在用 IC6 以后的版本做设计、跑验证,第二条就是迟早要走的路,越早转越省事。
这里还有一个很典型的误读要先排掉。警告里有一句If this is an OA library, this file needs to be removed,很多人看到这句就直接把prop.xx删了,然后重新打开,发现不再报这行警告,以为解决了。实际发生的是:库现在既不是完整的 CDB(指纹被删了,但内部还是 CDB 目录结构),也不是 OA(没有.oa数据),工具对它的判断会变得不可预期,有些 cellview 能列出来但打不开,有些直接消失。这句英文是有前提的,前提是“如果这已经是一个 OA 库,那么残留的 prop.xx 应该删掉”,而不是“删掉 prop.xx 它就变成 OA 库了”。这个处理方向一定要记住。
2.3 三分钟判断手上的库到底是 CDB 还是 OA
在动手转换之前,先把范围内的库摸一遍,别转了一半才发现还有几个库是 CDB。我一般会在cds.lib所在目录下跑这几条:
# ① 先把 cds.lib 里所有库名到路径的映射列出来,注释行过滤掉 grep -i '^DEFINE' ~/cds.lib # ② 逐个库目录看有没有 CDB 指纹 prop.xx,只查库顶层,不往 cell 里钻 for lib in /opt/pdk/pdk035/*/; do [ -f "${lib}prop.xx" ] && echo "CDB : $lib" done # ③ 反过来找 OA 指纹:任一视图目录下的 .oa 数据文件 find /opt/pdk/pdk035/ana035 -maxdepth 3 -name '*.oa' | head -5第一条只过滤DEFINE开头的行,因为cds.lib里通常还有INCLUDE、SOFTINCLUDE、ASSIGN等语句,转换工具关心的是DEFINE定义的库范围。第二条里的[ -f ... ]是判文件存在,注意路径拼接后的斜杠,用${lib}prop.xx而不是$lib/prop.xx(后者会出现双斜杠,虽然 Linux 能容忍,但日志里不好看)。第三条的-maxdepth 3是关键参数,不加它会把整个 PDK 目录全部扫描一遍,几万个小文件可能要等好几分钟;正常 OA 库的结构是库名/单元名/视图名/*.oa,三层足够命中,head -5只是确认存在性,不需要全列。
判断结论只有三种:有prop.xx没.oa,纯 CDB,必须转换;有.oa没prop.xx,已经是 OA,不用动;两个都有,属于转换过一次但没清理干净的半成品,这种最麻烦,后面第 5 章会单独说怎么处理。
3. 转换之前的手上活:备份、库清单、隔离输出目录
转换这一步本身只要点几下,真正决定成败的是转换前这十几分钟的准备。我见过不止一次,有人直接在共享 PDK 目录上开转换,跑到一半报错,源目录被写进了半成品文件,整个组当天的版图工作全停了。下面三件事按顺序做,一件都别省。
3.1 先做备份:这是一次不可逆的操作
OA 数据一旦写出来,用旧版本工具是读不回去的,不存在“转换失败就撤销”的按钮。所以在任何转换动作之前,把源库原样封存一份:
# 方式一:打包备份,保留权限位,压缩后体积小,适合放归档盘 tar -czpf /archive/pdk035_cdb_$(date +%Y%m%d).tar.gz -C /opt/pdk pdk035 # 方式二:同盘快拷贝,保留符号链接、时间戳、属主,适合随时回滚 cp -a /opt/pdk/pdk035 /opt/pdk/pdk035.cdb.bak # 转换完确认没问题之前,源库目录本身也可以先改名而不是删除 # mv /opt/pdk/pdk035/ana035 /opt/pdk/pdk035/ana035.cdb.oldtar那行里-c创建、-z压缩、-p保留权限、-f指定文件名,-C /opt/pdk是先切到父目录再打包,这样包内路径是相对的pdk035/...,将来解压到任何位置都不会散落成一堆绝对路径。cp -a等价于-dR --preserve=all,会连符号链接本身一起拷(而不是跟随链接拷目标),PDK 目录里经常有指向共享 techfile 的软链接,用cp -r会把它展开成实体文件,体积翻倍还容易失联。
要不要打 tar 包看磁盘,cp -a那份是必须的,因为回滚时要的是一次改名就能恢复,不是解压半小时。
3.2 用 Library Path 的 Save As 生成一份干净的 cds.lib
转换工具需要读一个cds.lib作为转换范围清单,但它不该读你系统级那一份,因为转换过程中工具可能会往里面写东西,一旦改坏影响的是整个环境。
做法是在 CIW 里走一遍图形界面:Edit→Library Path,在弹出的列表里选中你要转换的库(或者全选),然后File→Save As,保存到 home 目录下,比如~/cdb2oa_cds.lib。这一步的作用有两个:一是把当前会话真实生效的库路径快照下来,避免你手写的cds.lib和实际加载的不一致;二是这份副本只包含你选中的库,转换范围可控,不会把一堆无关库也带进去。
保存完打开看一眼,确认里面DEFINE的行数和你要转的库数量对得上。有些环境里cds.lib是通过INCLUDE引入分库清单的,Save As出来的通常已经展开了,但如果发现只有几行INCLUDE,那就得去把被包含的文件也一起看,或者干脆用 3.1 里那条grep -i '^DEFINE'的方式对照。
3.3 输出目录单独建,别往 PDK 里写
转换的输出默认可能落在源库旁边,这在共享 PDK 上是灾难:一是权限,PDK 目录经常是只读挂载或者属主是管理员;二是脏数据,转换中途失败会在源目录里留下半成品。
# 单独建输出目录,确认可写、剩余空间够 mkdir -p ~/cdb2oa_out test -w ~/cdb2oa_out && echo "writable" || echo "NO WRITE PERMISSION" # 看剩余空间,PDK 转换后的体积一般是源库的 1.5~2 倍 df -h ~/cdb2oa_out # 转换前确认工具在 PATH 里,且版本和当前 Virtuoso 是同一套安装 which cdb2oa echo $CDS_HOMEtest -w是最省事的可写性检查,比转换跑十分钟再报 permission denied 强。df -h那一步不要跳过,我遇到过跑到 90% 报磁盘满、输出目录变成半成品的情况,重跑还得先手工清目录,很费时间。which cdb2oa和$CDS_HOME一起看,是为了确认命令行工具和你正在用的 Virtuoso 来自同一套安装;机器上装了两三个版本时,PATH 里排前面的那个很可能是旧版,用它转出来的库版本对不上,后面还要返工。
另外,转换前把其他正在跑的 Virtuoso 会话关掉。库目录里会有锁文件,转换工具拿不到写锁会直接报错退出,而报错信息往往只写“cannot lock”,不看日志根本不知道是被自己另一个窗口占着。
4. 图形界面路线:Conversion Toolbox 里的 CDB to OpenAccess Translator
大部分人的第一次转换都是走图形界面,因为入口就在菜单里,参数少,日志直接在窗口里滚。这条路线的关键不在点按钮,而在启动位置、输出结构和回填顺序这三个细节上。
4.1 入口在哪,以及为什么必须先 cd 到 home 再启动
在已经打开的 Virtuoso 主窗口里,菜单Tools→Conversion Toolbox...,弹出的小窗口左侧有一个下拉或者列表,选中CDB to OpenAccess Translator,右侧就是转换配置界面。
这里有个容易被忽略的前提:工具启动时会以当前工作目录为基准去找默认的cds.lib和写临时文件。如果你是从某个项目的版图目录里启动的 Virtuoso,那个目录下可能也有一份项目自己的cds.lib,转换工具默认加载的就是它,范围完全不对。
所以我的习惯是:先cd ~,再virtuoso &,等 CIW 起来再进 Conversion Toolbox。这样默认路径干净,选择cds.lib的时候也不容易选错。转换本身是个独立进程,库大的时候跑二三十分钟很正常,界面上会有进度和滚动的日志,不要在跑的时候去点同一个库做别的事。
4.2 三个必填项:源 cds.lib、输出目录、转换范围
| 配置项 | 填什么 | 说明 |
|---|---|---|
| CDB cds.lib | ~/cdb2oa_cds.lib | 用 3.2 里 Save As 出来的副本,不用系统级那份 |
| 输出目录 | ~/cdb2oa_out | 单独建的目录,不要指向 PDK 内部 |
| 库选择 | 先单个库试 | 第一次别全选,挑一个最小的库验证流程 |
| 日志 | 输出目录下自动生成 | 转换结束后第一时间看 |
填完点开始,界面会先做一遍扫描,把待转换的库、单元数量、可能的问题列出来。这一步的提示值得看,它会告诉你哪些视图类型不认识、哪些属性会丢失。视图类型转换不了的常见是自定义的 skill 视图或者第三方工具私有格式,这些在 OA 环境下本来也要单独处理,不是转换失败。
转换过程中日志会滚动输出,正常情况下一行一个单元地过。如果出现连续多行停在同一个单元上超过几分钟,大概率是卡在某个损坏的 cellview 上,可以先让它跑完,跑完再针对那个单元单独处理。
4.3 转换完先核对结构,别急着往 PDK 里搬
转换结束不等于成功,先花两分钟看产出:
# 看输出目录下生成了哪些库目录,正常情况下库名和源库一一对应 find ~/cdb2oa_out -maxdepth 1 -type d # 统计生成的 .oa 文件数量,和源库的 cell 数量做个量级对比 find ~/cdb2oa_out/ana035 -name '*.oa' | wc -l # 日志里揪错误,warning 可以粗看,error 必须逐条处理 grep -nE 'ERROR|Failed|abort|Abort' ~/cdb2oa_out/*.log | head -20 # 确认新库根目录没有残留的 CDB 指纹 find ~/cdb2oa_out/ana035 -maxdepth 1 -name 'prop.xx'第一条用-maxdepth 1只看顶层,确认库目录名和源库名完全一致——这点后面回填时非常关键,库名一致意味着cds.lib里的DEFINE一行都不用改。第二条的.oa数量是个粗略的量级校验,数量级差太多(比如源库上千个 cell,产出只有几十个文件)说明转换中途大面积失败过,得先看日志而不是继续。第三条的grep用-E同时匹配几种大小写形态,日志里ERROR、Failed、abort都可能出现,head -20是防止刷屏。
第四条那个检查是我吃过亏才加上去的:有些版本的转换工具在输出库根目录会留一个空的prop.xx或者一个cds.lib副本,如果原样搬回 PDK,下次启动还会报同样的警告,你会以为转换白做了。
4.4 回填 PDK 的正确顺序:改名、拷贝、重启验证
回填的核心原则是“库名和路径都不变,只换目录内容”。这样cds.lib里的DEFINE不用动,别人的工程引用也不用动。
# 1) 源库目录改名而不是 rm,留一条退路 mv /opt/pdk/pdk035/ana035 /opt/pdk/pdk035/ana035.cdb.old # 2) 把转换出的 OA 库搬回去,保持目录名与原库名一致 cp -a ~/cdb2oa_out/ana035 /opt/pdk/pdk035/ana035 # 3) 校验:新目录里应该全是 .oa,没有 prop.xx find /opt/pdk/pdk035/ana035 -maxdepth 1 -name 'prop.xx' # 无输出才是对的 find /opt/pdk/pdk035/ana035 -name '*.oa' | wc -l # 4) 进 PDK 目录重新起 Virtuoso,而不是在旧会话里刷新 cd /opt/pdk/pdk035 && virtuoso &第 1 步用mv而不是rm是血泪经验,转换后发现问题想回滚,一条mv back就恢复了,删了就只剩 tar 包。第 2 步的cp -a同样要保留权限和链接,PDK 里常有指向 techfile、display 文件的软链,拷丢了后面打开版图会报 techfile 找不到。第 4 步必须在 PDK 目录下重启,因为库列表是启动时读的,在旧会话里刷新Library Manager有时能看到新库,但 techfile 和 pcell 的加载路径还是旧的,容易出现“能打开但画不了”的奇怪状态。
重启之后进Library Manager,展开那个库,能看到 cell 列表就说明格式这一关过了。再打开一个版图看看图形是否完整、Design Rule 相关设置是否还在,才算真正落地。
5. 命令行路线与避坑:cdb2oa 参数、批量转换、五条踩过的坑
图形界面一次转一个库还行,PDK 里挂了七八个库的时候就不够用了。命令行 + 脚本可以批量跑,也可以挂在后台跑,日志按库分开存,出问题好定位。
5.1 cdb2oa 的基本用法与参数
先看本机这份工具支持什么参数,不同版本之间 flag 名会有差异,不要照抄别人的命令:
# 先看本机这版工具的用法,flag 以这个输出为准 cdb2oa -h 2>&1 | head -40确认之后,单个库的转换大致是这种形态:
# 指定 cds.lib、指定要转换的库、指定输出根目录和日志位置 cdb2oa -cdslib ~/cdb2oa_cds.lib \ -lib ana035 \ -targetDir ~/cdb2oa_out \ -log ~/cdb2oa_out/ana035.log-cdslib指定范围清单,务必用 3.2 里那份副本;-lib指定这一次只转哪个库,单个转的好处是失败时影响面小;-targetDir是输出根目录,工具会在下面自动建同名库目录;-log把日志单独落文件,方便事后grep。如果你本机-h输出的参数名是-oalib、-targetLib之类,按输出的来,语义是一样的。
跑完先看返回码,再决定看不看日志:
echo $? # 0 才算跑完,非 0 一律先看日志再谈别的5.2 批量转换多个库的写法
库多的时候,从cds.lib里把库名抽出来循环跑,比手点快得多,也不容易漏:
# 抽出所有 DEFINE 的库名,排除掉自动生成的系统库 grep -i '^DEFINE' ~/cdb2oa_cds.lib | awk '{print $2}' \ | grep -v '^cdsDefTechLib$' > /tmp/lib_list.txt # 逐库转换,失败的记录下来,不要中断整批 while read -r lib; do echo "== converting ${lib}" cdb2oa -cdslib ~/cdb2oa_cds.lib \ -lib "${lib}" \ -targetDir ~/cdb2oa_out \ -log ~/cdb2oa_out/${lib}.log \ || echo "FAILED ${lib}" >> /tmp/convert_failed.txt done < /tmp/lib_list.txtawk '{print $2}'取的是DEFINE后面那列库名,grep -v '^cdsDefTechLib$'把工具自带的系统库排掉,把它也转一遍纯属浪费时间而且容易报错。循环里|| echo ...那一句是整段脚本的关键:某个库失败时只记一笔,继续跑下一个,跑完统一看/tmp/convert_failed.txt。如果写成遇到失败就退出,前面转成功的库还得重新对一遍输出目录,很麻烦。
5.3 五条踩过的坑:从现象到解决
坑一:转换完成后仍然报同一条警告。现象是回填、重启、打开 Virtuoso,ddUpdateLibList那行一模一样又出现了。原因通常有两个:一是cds.lib的INCLUDE链里还有别的库是 CDB 格式,你只转了自己关注的那一个;二是启动目录不对,Virtuoso 读的是站点级或者项目级的另一份cds.lib,你改的那份压根没生效。解决:在cds.lib所在目录执行find . -maxdepth 3 -name 'prop.xx'把所有 CDB 库找全,逐个转;同时echo $CDS_PROJECT和启动目录核对一遍,确认读的是哪一份清单。
坑二:转换跑到一半中断,重跑时报目标目录已存在。现象是第二次启动转换立刻失败,日志里提示输出目录非空或者库已存在。原因是这个工具不做覆盖式写入,它认为目标存在就是异常。解决:先把~/cdb2oa_out/<库名>整个删掉再重跑,不要试图删几个文件了事,半成品目录里可能缺视图目录,删一半会得到结构不完整的库。跑之前用df -h看空间,磁盘满是这类中断最常见的原因。
坑三:回填后版图能开,但 pcell 全变成固定图形。现象是打开版图,原来参数化的器件变成了不能再调尺寸的图形,改参数没反应。原因是 CDB 时代的 pcell 依赖 PDK 自带的 skill 定义,转换只搬了数据,没搬这些运行时加载的脚本。解决:确认启动时 PDK 的cdsinit或者 skill 脚本被正确加载(看 CIW 启动日志里有没有相关 load 记录),必要时把 PDK 的 skill 路径显式加到启动脚本里;如果这个 pcell 本身是编译过的加密文件,那就只能找 PDK 提供方要 OA 版本的 pcell 或者重新生成。
坑四:有人看到警告说“这个文件该删”就把 prop.xx 删了。现象是删完警告消失,但库里的 cellview 变得时有时无,Library Manager刷新一次结果都不一样。原因在 2.2 里讲过,删指纹不等于转格式,库处在一个既不是 CDB 也不是 OA 的中间状态,工具靠猜。解决:从备份里把这个库恢复回来(所以 3.1 的备份是必须的),老老实实走一遍转换。已经删了又没有备份的,只能从别的机器或者归档盘上找原始 PDK 重来。
坑五:共享 PDK 目录只读,转换工具写不进去。现象是转换刚起步就报错,日志里是 permission denied,路径指向 PDK 内部。原因是某些配置下输出目录默认跟着源库走。解决:输出目录一律显式指到 home 下(-targetDir或界面里的输出框),转完再由有权限的人回填;如果连回填权限都没有,就把 OA 库放到自己有写权限的路径下,在cds.lib里把DEFINE指向新路径——代价是所有人的cds.lib都得跟着改一行,需要提前对齐。
6. 快速定位:从警告到验证,我固定走这条链路
被这类问题卡住的时候,最耗时间的不是解决,而是判断“现在卡在哪一步”。我的习惯是先看警告出现在什么时候,再决定往哪个方向查,这一步能省掉大半瞎试。
| 现象 | 最可能的原因 | 先看哪里 |
|---|---|---|
启动时刷OA executable on CDB data | 库还是 CDB 格式 | 库根目录有没有prop.xx |
| 警告消失但库打不开 | 指纹被删、库处于中间状态 | 从备份恢复后重转 |
| 转换报目标已存在 | 上次中断留下半成品 | 清空输出目录再跑 |
| 打开版图正常、改参数无效 | pcell 的 skill 没加载 | CIW 启动日志里的 load 记录 |
| 转换成功但 DRC 起不来 | techfile 没跟着转 | 输出库里有没有对应的 tech 库 |
| 换台机器又能打开 | 那台机器读的是另一份cds.lib | 启动目录和INCLUDE链 |
验证环节我固定跑四步,缺一步都不算完成:Library Manager里能列出全部 cell 且数量和源库对得上;随便打开一个版图和一个原理图,CIW 里没有新的 warning;对打开的 cellview 做一次 Check and Save,能写进去说明库权限和 OA 结构都正常;新建一个空 cell 再删掉,确认这个库不是只读的残留状态。这四步做完,才敢让别人也用这个库。
从那以后我每次动 PDK 之前,都强制自己先打一份 tar 包、再把cds.libSave As 到 home、输出目录单独建,这三件事做完才允许自己点转换按钮——不是流程洁癖,是被“删了 prop.xx 又没有备份”这种情况教过一次,恢复起来代价太大。希望帮到你。
本文还有配套的精品资源,点击获取