资讯详情

资讯详情

IC617下CDB转OA:老PDK工艺库转换与排查实践

简介面向使用 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 是 OpenAccessSi2 推的开放数据库标准。它同样是目录树但组织方式变了库根下有data.dm这类元数据文件每个 cell 一个目录每个 cellview 对应一个.oa文件例如layout.oa。库的注册靠lib.defsVirtuoso 在启动时会根据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 目录里是一堆.dbOA 的 cell 目录里是layout.oa、data.dm这类文件一眼就能分辨。判据CDB 库OA 库库根标志文件cdsinfo.tag、prop.xxdata.dmcellview 存储cell 目录下多个.db文件cell 目录下按 view 命名的.oa文件库注册方式cds.lib的DEFINEcdsinfo.taglib.defs由 Virtuoso 依据cds.lib维护技术文件techfile.tf及配套.tfftech.dbIC617 能否直接打开否会报 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 uw $DST du -sh $BAK $DST脚本里set -euo pipefail让任何一步失败立刻停下避免在源库不完整的情况下继续复制。cp -a的-a等价于-dR --preserveall对 PDK 很重要因为库里有大量软链接指向共享的 techfile 目录用普通cp -r会把链接展开成实体文件体积翻几倍还可能断链。chmod -R uw只给属主加写权限不动组和其他人的位避免把共享目录的权限改乱。备份目录名带时间戳是为了同一个库反复转换时不会互相覆盖。存档那份转换完不要删它是后面回滚的唯一依据。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 \ 21 | tee /pdk/oa_work/logs/cdb2oa_stdout.log参数逐个说清楚-cdslib指定配置文件工具靠它把逻辑名解析成真实路径-lib是要转换的源库逻辑名必须和cds.lib里的DEFINE对上-oaLib是转换后新库的名字可以和源库同名但强烈建议加后缀同名会让两个库在不同路径下重名后面挂载时容易挂错-log指定日志文件。21 | 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 里跑一段 Skilllet((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 uw做过最后把目标库目录整个删掉重来不要在残留目录上续跑半成品会被当成已存在的库工具直接跳过。第二条报 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 21; 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一份扔到另一个物理盘上压缩包名带上日期和库名。这个包平时用不上但它是我唯一敢在转换失败后说“没关系”的底气。希望帮到你。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →