简介:面向使用 Cadence Virtuoso 与 IC617 的版图设计人员、工艺库维护者,以及需要把旧版 CDB 数据迁移到 OpenAccess 环境的工程师,内容围绕 cdb2oa 转换、兼容性判断和常见报错展开,适合作为旧工艺库在新平台上复用前的查阅与排错参考,尤其适合首次处理旧工艺库迁移、需要快速定位问题的人群。压缩包内仅有 1 个 PDF,大小约 697KB,内容集中、便于本地检索和归档,不会带来繁杂的目录负担。已有 1557 人学习,说明 IC617 环境下 CDB 转 OA 的需求较为集中,也反映出旧 PDK 升级是不少设计团队会遇到的实际问题。读者可从中梳理 CDB 与 OA 的数据结构差异、转换工具的适用边界、ddUpdateLibList 等警告的成因,以及迁移后库路径设置、数据完整性验证和结果复核的思路,并结合实际库进行抽样核对,逐步形成可复用的迁移检查清单,减少盲目试错与重复劳动。
1. CDB 转 OA 这个动作:IC617 里那句 ddUpdateLibList 警告到底在提醒什么
把一个跑了十几年的老工艺库塞进 IC617,启动 Virtuoso 时 CIW 会刷出一段ddUpdateLibList: It appears that you are trying to run an OA executable on CDB data。这句警告不难读懂:Virtuoso 的可执行体已经链接到 OpenAccess 运行时,而它扫到的库目录里还躺着cdsinfo.tag、prop.xx这类 CDB 时代的标志文件。手上这套 CDB 转换为 OA 的流程,解决的正是这个卡点——让老 PDK、老设计库能在新版本里被识别、被打开、被继续编辑。
适合两类人看:一是手里只有 IC5141 时代工艺库、又必须在 IC617 上做设计的人;二是接手了别人留下的老项目,库能列出来但 cellview 打不开的人。不适合的情况也说清楚:如果原厂已经提供 OA 版本 PDK,直接换新库,别折腾转换。
2. 先给库“验血”:CDB 与 OA 的存储差异和兼容边界
动手之前得先确认手上的库到底是哪种血统。判断错了,后面所有步骤都是白跑,甚至会把一个本来还能在旧版本里打开的库弄坏。
2.1 两套数据模型:文件树、索引与可执行体
CDB 是 Cadence DataBase 的缩写,服务的是 IC5141 及更早那几代工具。它的库是一个普通目录,库根下放cdsinfo.tag(记录库属性、单位、技术文件引用)和prop.xx(记录参数与工艺相关信息);每个 cell 对应一个子目录,子目录里按 view 拆成多个二进制文件,比如layout.db、schematic.db、symbol.db。库要被工具认识,靠的是cds.lib里一行DEFINE,再加上库根那个cdsinfo.tag做二次确认。
OA 是 OpenAccess,Si2 推的开放数据库标准。它同样是目录树,但组织方式变了:库根下有data.dm这类元数据文件,每个 cell 一个目录,每个 cellview 对应一个.oa文件(例如layout.oa)。库的注册靠lib.defs,Virtuoso 在启动时会根据cds.lib的内容去维护或读取lib.defs。IC617 的 dfII 可执行体链接的是 OA 运行时,它扫描库目录时会做一次格式探测,一旦命中cdsinfo.tag,就抛出那句 “OA executable on CDB data”。
所以转换的本质不是“改个后缀”,而是把一整套二进制记录按 OA 的数据模型重建一遍:cellview 重新序列化,库属性重新登记,技术文件从techfile.tf转成tech.db。这也解释了为什么转换工具对源库的完整性很敏感——源库里任何一个损坏的 cellview 都可能让那一个 cell 被跳过。
常见的误判是“库目录里有.oa文件就算 OA 库”。不对。有些库被半途转换过,根目录既有data.dm又有cdsinfo.tag,这种混合态最麻烦,工具既不会当纯 CDB 处理,Virtuoso 打开时又会因为残留文件报警告。判断标准应该是“有没有 CDB 标志文件”,而不是“有没有 OA 文件”。
2.2 三条命令判断手上的库是 CDB 还是 OA
不用打开图形界面,三条命令足够定性。先把库路径设成变量,避免后面手滑打错:
# 把这里换成你自己的库路径 LIB=/pdk/tech35mm # 1) 看库根的标志性文件 for f in cdsinfo.tag prop.xx data.dm lib.defs; do if [ -e "$LIB/$f" ]; then echo "命中: $f" fi done这段脚本逐个检查库根下的四个关键文件。cdsinfo.tag或prop.xx命中,基本可以判定是 CDB 库;data.dm命中说明是 OA 库;两个都命中就是混合态,需要先清理再谈转换。lib.defs一般出现在 OA 库的上级目录或库本身,用来登记库的别名和路径。
# 2) 统计库根下 .db 与 .oa 文件的数量(只看一层,避免扫进子目录) echo "db 文件: $(find "$LIB" -maxdepth 2 -name '*.db' | wc -l)" echo "oa 文件: $(find "$LIB" -maxdepth 2 -name '*.oa' | wc -l)" # 3) 看看 cell 目录里到底存了什么 ls "$LIB" | head -5 | while read -r c; do [ -d "$LIB/$c" ] && echo "--- $c ---" && ls "$LIB/$c" | head -5 done第二条命令用-maxdepth 2是因为 CDB 的.db文件藏在 cell 子目录里,扫太深会把备份目录也算进去,数字虚高。第三条命令抽前几个 cell 看目录内容,CDB 的 cell 目录里是一堆.db,OA 的 cell 目录里是layout.oa、data.dm这类文件,一眼就能分辨。
| 判据 | CDB 库 | OA 库 |
|---|---|---|
| 库根标志文件 | cdsinfo.tag、prop.xx | data.dm |
| cellview 存储 | cell 目录下多个.db文件 | cell 目录下按 view 命名的.oa文件 |
| 库注册方式 | cds.lib的DEFINE+cdsinfo.tag | lib.defs,由 Virtuoso 依据cds.lib维护 |
| 技术文件 | techfile.tf及配套.tff | tech.db |
| IC617 能否直接打开 | 否,会报 OA executable on CDB data | 是 |
提示:如果
find出来的.db数量是 0,但cdsinfo.tag还在,说明这个库可能被人手工删过内容,先别转,拿 IC5141 打开确认库是否完整。
3. 动手前的清场:备份、路径和 cds.lib 三件事
转换失败的案例里,一大半不是工具本身的问题,而是准备工作没做干净:原地转换把源库写坏、cds.lib里路径是相对路径导致工具找不到库、目标目录没有写权限跑到一半退出。这三件事提前处理掉,后面的成功率会高很多。
3.1 复制而不是原地改:备份脚本与目录约定
cdb2oa在工作过程中会往目标库目录写文件,中途失败会留下半成品。如果目标就是源库本身,失败之后连 IC5141 都打不开,这是最难受的一种翻车。我一般的做法是准备两份副本:一份只读存档,一份工作副本,所有转换都在工作副本上做。
#!/usr/bin/env bash set -euo pipefail SRC="/pdk/tech35mm" # 原 CDB 库 STAMP="$(date +%Y%m%d_%H%M)" BAK="/pdk/backup/tech35mm_${STAMP}" # 只读存档 DST="/pdk/oa_work/tech35mm" # 转换工作副本 mkdir -p "$(dirname "$BAK")" "$(dirname "$DST")" # -a 保留权限、时间戳和软链接,PDK 里常有指向公共目录的链接 cp -a "$SRC" "$BAK" cp -a "$SRC" "$DST" # PDK 常见是只读挂载或 555 权限,工作副本必须可写 chmod -R u+w "$DST" du -sh "$BAK" "$DST"脚本里set -euo pipefail让任何一步失败立刻停下,避免在源库不完整的情况下继续复制。cp -a的-a等价于-dR --preserve=all,对 PDK 很重要,因为库里有大量软链接指向共享的 techfile 目录,用普通cp -r会把链接展开成实体文件,体积翻几倍还可能断链。chmod -R u+w只给属主加写权限,不动组和其他人的位,避免把共享目录的权限改乱。
备份目录名带时间戳,是为了同一个库反复转换时不会互相覆盖。存档那份转换完不要删,它是后面回滚的唯一依据。
3.2 cds.lib 的写法:绝对路径、DEFINE 与 INCLUDE
转换工具需要一个cds.lib来定位源库。这里有个容易忽略的点:它读的是你显式传给它的那份cds.lib,不是~/.cdsinit里加载的那份。所以正确的做法是单独建一份用于转换的cds.lib,只写必要的几行。
# /pdk/oa_work/cds.lib 仅用于转换,不要和日常使用的混在一起 # 源 CDB 库,名字必须和 cdb2oa -lib 参数一致 DEFINE tech35mm /pdk/tech35mm # 转换产物的目标库 DEFINE tech35mm_oa /pdk/oa_work/tech35mm # 如果源库依赖别的库(比如 base 库),在这里一并登记 DEFINE baseLib /pdk/baseLibDEFINE后面的第一个字段是库的逻辑名,第二个字段是绝对路径。逻辑名必须和后面命令行-lib传的名字完全一致,大小写敏感;路径必须是绝对路径,写成./tech35mm这种相对路径时,工具的当前工作目录一变就找不到库,报的错还很含糊,只说 library not found。
INCLUDE要慎用。如果源库目录里自带一个cds.lib,你在自己的转换用cds.lib里再INCLUDE它,很容易形成环状引用,工具解析到一半就退出。稳妥的做法是把需要的DEFINE行手工抄过来,而不是整份INCLUDE。
注意:转换期间不要用同一个
cds.lib同时开 Virtuoso。Virtuoso 启动时会回写lib.defs,和转换工具并发写同一份配置,出现过库名被覆盖的情况。
4. 跑通转换:Conversion Toolbox 图形流程与 cdb2oa 命令行的对应关系
工具链上其实只有一个东西:cdb2oa这个可执行程序。Conversion Toolbox 是它的图形外壳,最终还是会拼一条命令行去调用。理解这层关系,图形界面卡住的时候就能直接看日志里那条等价命令,手工重跑。
4.1 GUI 流程七个动作
从 CIW 进 Tools 菜单,找到 Conversion Toolbox,进去之后选 CDB to OpenAccess Translator。这套流程我走过很多遍,动作顺序大致是固定的:
- 在 Translator 对话框里指定
cds.lib的路径,指向第 3 章准备的那份转换专用配置。 - 工具解析完
cds.lib后会把库名列出来,勾选要转的那个,比如tech35mm。 - 指定输出位置。这里填的是目标库的父目录,工具会在其下按库名建目录,不要直接填到库目录本身。
- 勾选是否转换技术文件。老 PDK 的
techfile.tf必须一起转,否则转出来的版图没有层信息,打开是一片空白。 - 设置日志路径。默认日志会写到当前工作目录,建议显式指到一个固定目录,方便事后对比。
- 点 Apply 或 Run,等进度条走完。库大的话几十分钟很正常,不要中途点 Cancel。
- 转换结束后先别关窗口,把日志从头翻一遍,重点看 skipped、failed 这两类记录。
关于原做法里“先 Edit → Library Path File → Save As 到 home”这一步,它的意图是把当前工程的库路径配置另存一份到可控目录,避免直接改动 PDK 安装目录里的cds.lib。这个思路是对的,和我上面单独建转换用cds.lib是一个目的,只是存放位置不同。我倾向放在工程目录下而不是 home 根目录,因为 home 下文件多了之后,几个月后根本分不清哪份是哪份。
4.2 命令行等价写法与日志读法
图形界面每一步在日志里都会对应一条实际执行的命令。想省事,第一次用 GUI 跑通,然后把日志里那条命令抄出来,之后就能脚本化。
先把工具加进 PATH。cdb2oa通常位于安装目录的tools/dfII/bin下:
export CDS_INST_DIR=/opt/cadence/IC617 export PATH="$CDS_INST_DIR/tools/dfII/bin:$PATH" # 先看本机这个版本的参数,不同版本选项名有差异 cdb2oa -help-help这步别省。不同 IC6.1.7 小版本的cdb2oa参数名不完全一样,照抄网上教程经常出现 unknown option。看完 help 再拼命令,能少走一轮弯路。
mkdir -p /pdk/oa_work/logs cdb2oa \ -cdslib /pdk/oa_work/cds.lib \ -lib tech35mm \ -oaLib tech35mm_oa \ -log /pdk/oa_work/logs/cdb2oa_tech35mm.log \ 2>&1 | tee /pdk/oa_work/logs/cdb2oa_stdout.log参数逐个说清楚:-cdslib指定配置文件,工具靠它把逻辑名解析成真实路径;-lib是要转换的源库逻辑名,必须和cds.lib里的DEFINE对上;-oaLib是转换后新库的名字,可以和源库同名但强烈建议加后缀,同名会让两个库在不同路径下重名,后面挂载时容易挂错;-log指定日志文件。2>&1 | tee是把标准错误并进标准输出,同时打到屏幕和文件,因为这类工具的错误信息有时走 stderr,只重定向 stdout 会丢。
转换跑完先做粗筛:
LOG=/pdk/oa_work/logs/cdb2oa_tech35mm.log grep -inE "error|fail|cannot|skip" "$LOG" | head -40 grep -ic "warning" "$LOG"第一条筛出致命错误和被跳过的 cell,第二条只统计警告数量。警告多不一定是坏事,OA 对命名规则比 CDB 严,一些带特殊字符的老 cell 名会被警告并做替换,这类只要记录在案就行;真正要盯的是 skip 和 fail,那意味着有 cellview 没转过去。
4.3 转换后的自检:库挂载、cell 计数与 techfile 抽查
转换完成不等于能用。我习惯做三层校验:文件层看结构,数量层看有没有丢 cell,工具层看 Virtuoso 能不能真的打开。
NEW=/pdk/oa_work/tech35mm # 第一层:结构检查,确认已经是纯 OA 库 [ -e "$NEW/data.dm" ] && echo "data.dm 存在,OA 结构 OK" [ -e "$NEW/cdsinfo.tag" ] && echo "警告:CDB 残留文件还在,需要清理" [ -e "$NEW/tech.db" ] && echo "tech.db 存在,技术文件已转" # 第二层:cell 数量对比 echo "源库 cell 数: $(find /pdk/tech35mm -maxdepth 1 -mindepth 1 -type d | wc -l)" echo "新库 cell 数: $(find "$NEW" -maxdepth 1 -mindepth 1 -type d | wc -l)"第一层里cdsinfo.tag的检查最关键。如果它还在新库目录里,Virtuoso 启动时照样报那句警告,等于白转。有些版本的工具会自己清理,有些不会,必须手工确认。第二层的数量对比允许有少量差异,因为源库里可能混着catalog、.cdsLib这类非 cell 目录,差个位数属正常,差几十个就得回去翻日志。
第三层在 Virtuoso 的 CIW 里跑一段 Skill:
let((lib cellList n) lib = ddGetObj("tech35mm_oa") unless(lib error("库没挂上,先检查 cds.lib 里的 DEFINE 行和路径") ) cellList = lib~>cells n = length(cellList) printf("库 %s 共 %d 个 cell\n" "tech35mm_oa" n) foreach(c cellList printf(" %s\n" c~>name) ) )ddGetObj返回库对象,返回 nil 就说明库根本没被识别,问题一定在cds.lib或lib.defs,不在转换结果上。lib~>cells拿到 cell 列表,length给数量,和上一步 shell 统计的数字应该基本吻合。foreach那几行是打印明细,第一次转换时建议全打出来,和源库的 cell 清单 diff 一遍,比只看总数可靠。
技术文件单独抽查:在 Virtuoso 里新建一个 layout,看层选择窗口(LSW)里有没有正常的层名和颜色。如果 LSW 是空的,说明tech.db没挂上或者转换时没勾技术文件,这时不要急着改库,先在 Technology File Manager 里看当前库 attach 的是哪个 tech library。
5. 避坑与排查:五类翻车现场,从现象倒推原因
转换这类操作,出错信息往往只有一行,真正的根因藏在几步之前。下面这五条是我实际踩过或者帮人排查过的,按现象、原因、解决三段写,遇到问题时可以直接对号入座。
5.1 转换阶段的三个硬坑
第一条,转换跑到一半退出,目标目录里留下半套 cell。现象是进度条走到某个百分比停住,日志末尾出现 write error 或 no space left。原因通常是目标分区空间不够,或者 PDK 副本还是只读权限,工具写到某个文件时被拒。解决分三步:先df -h看目标分区余量,一个中等规模 PDK 转完大概要几百 MB 到一两 GB;再确认chmod -R u+w做过;最后把目标库目录整个删掉重来,不要在残留目录上续跑,半成品会被当成已存在的库,工具直接跳过。
第二条,报 library already exists 直接退出。现象是命令刚执行几秒就结束,日志里说目标库已存在。原因是-oaLib指定的名字对应的目录已经在输出位置存在,工具默认不覆盖。解决办法是换一个库名(比如加_v2后缀),或者把旧目录改名挪走。不建议找强制覆盖的选项硬来,覆盖过程中如果失败,旧库和新库都废了,没有后悔药。
第三条,转换成功但 cell 数明显变少。现象是日志结尾显示 completed,可数量对比差了十几个。原因是源库里有损坏的 cellview,或者用了 OA 不支持的 view type,工具选择跳过而不是报错。解决方式是先grep -i skip把跳过的 cell 名单拉出来,然后回到 IC5141 里逐个打开这些 cell,能打开的就重新存一次,打不开的说明数据本身已经坏了,只能从备份或者版本库里找旧版。这一步没有捷径,跳过就是跳过,工具不会帮你修数据。
5.2 挂载与打开阶段的三个软坑
第四条,转换完了,Virtuoso 启动还是刷那句 ddUpdateLibList 警告。现象是警告文本和转换前一模一样,让人怀疑是不是没生效。原因有两个:一是cds.lib里的DEFINE还指向老的 CDB 路径,新库虽然转出来了但根本没被加载;二是新库目录里cdsinfo.tag或prop.xx没清干净,探测逻辑仍然把它当 CDB。解决:先grep DEFINE cds.lib确认路径,再ls新库根目录看残留,两个都处理掉,重启 Virtuoso。
第五条,版图能打开,但没有层信息,DRC 规则也调不出来。现象是 layout 窗口一片灰,LSW 里层列表是空的或者只有 default。原因是技术文件没跟着转,或者转了但没 attach 到新库上。解决:先确认新库根目录有tech.db,没有就重跑转换并勾上技术文件选项;有的话进 Technology File Manager,把新库 attach 到这份tech.db上。另外layermap文件经常被漏掉,它不在tech.db里,得从原 PDK 目录手工拷一份过来,否则后面跑 DRC、LVS 时层映射对不上,报的错会指向莫名其妙的地方。
提示:这五条里,第四条和第五条最容易被误判成“转换失败”,实际上转换本身是成功的,问题出在挂载配置。排查时先分层定位——文件在不在、配置指没指对、工具认没认出来,别一上来就重转。
6. 进阶:批量转换与可回滚的库切换
一个 PDK 往往不止一个库,主工艺库之外还有 IO 库、模拟库、标准单元库。一个一个点 GUI 太慢,而且顺序错了会出现依赖库还没转、主库先转的情况。批处理的关键不是循环本身,而是顺序和失败隔离。
6.1 一次转多个库的批处理脚本
#!/usr/bin/env bash set -uo pipefail CDS_INST_DIR=/opt/cadence/IC617 export PATH="$CDS_INST_DIR/tools/dfII/bin:$PATH" CDSLIB=/pdk/oa_work/cds.lib LOGDIR=/pdk/oa_work/logs mkdir -p "$LOGDIR" # 顺序有讲究:被依赖的基础库放前面 LIBS=(baseLib tech35mm io_35mm) for lib in "${LIBS[@]}"; do log="$LOGDIR/cdb2oa_${lib}.log" echo "=== 开始转换 $lib ===" if cdb2oa -cdslib "$CDSLIB" -lib "$lib" -oaLib "${lib}_oa" -log "$log" > /dev/null 2>&1; then echo "OK $lib" else echo "FAIL $lib,日志见 $log" # 不中断,继续下一个,最后统一看哪些失败 fi done echo "=== 汇总 ===" grep -l -iE "error|fail" "$LOGDIR"/cdb2oa_*.log || echo "全部无致命错误"这里没有用set -e,是有意的:单个库失败不应该让整批停下,否则得从头再跑一遍。失败信息留在各自的日志里,循环结束后用grep -l一次列出所有含错误的日志文件。LIBS数组的顺序按依赖关系排,被引用的基础库必须在前,因为转换主库时工具会去解析它引用的库,找不到就跳过相关 cellview。
6.2 用 cds.lib 做“后悔药”:切换与回滚
转换完成后,切换和回滚都只改一行配置,这是我认为最值得坚持的做法——永远不要删源库,让cds.lib决定用哪一套。
# 上线用新库 DEFINE tech35mm /pdk/oa_work/tech35mm # 出问题时改回这一行,注释掉上面那行 # DEFINE tech35mm /pdk/backup/tech35mm_20231014_1010逻辑名保持tech35mm不变,只换路径。这样所有设计库、脚本、约束文件里引用的库名都不用动,回滚成本接近零。如果转换时新库用了_oa后缀,就得改所有引用处,反而把简单事情搞复杂了。所以我在批处理里虽然写了${lib}_oa,实际落地时会在验证通过后把目录改名回原库名,只保留一份DEFINE。
验证方法也就固定成一套动作:改完cds.lib,重启 Virtuoso,确认警告消失,打开一个最复杂的 cell(通常是带 pcell 的电容或者带衬底接触的器件),看版图层次、DRC 能不能跑,再打开一个原理图做一次 check and save。pcell 这块要特别留意,转换后 pcell 的求值环境可能变化,参数面板里个别字段会显示异常,这类问题不会在转换日志里体现,只能靠打开看。
我从第一次把老 PDK 转坏、不得不从磁带备份里翻原始库之后,就养成了一个习惯:任何转换动手前,先把源库tar一份扔到另一个物理盘上,压缩包名带上日期和库名。这个包平时用不上,但它是我唯一敢在转换失败后说“没关系”的底气。希望帮到你。
本文还有配套的精品资源,点击获取