简介:本资源是一份面向Cadence IC设计工程师与PDK迁移工程师的CDB工艺库向OpenAccess(OA)格式转换实战指南,专为解决IC617平台无法直接加载旧版CDB格式工艺库(如tsmc035mm等)的兼容性问题。文档详细解析cdb2oa命令行工具的使用方法(如cdb2oa -i input.cdb -o output.oa)、Conversion Toolbox图形化转换流程、Library Path配置要点,以及关键报错(如ddUpdateLibList警告)的成因与验证方案。资源为单文件PDF,大小697KB,内容精炼聚焦,涵盖从启动转换、路径保存、PDK替换到Virtuoso中最终调用的完整闭环操作。目前已有1557人学习下载,适合正面临IC514→IC617平台升级、需快速完成工艺库格式迁移并确保数据完整性与可运行性的中高级EDA用户。
1. IC617 下 CDB 转 OA 不是“点一下就完事”:它本质是工艺库的底层数据模型迁移,卡在 Warning: ddUpdateLibList 的人,90% 都漏了三步验证
你打开 Virtuoso IC617,加载一个老 PDK(比如 tsmc35mm、umc180nm 或早期的 smic 工艺),界面没报错,但一进 Library Manager 就弹出红字:Warning: ddUpdateLibList: It appears that you are trying to run an OA executable on CDB data. Library 'xxx' contains file '/path/to/prop.xx' which is CDB data.—— 这不是警告,是拒绝服务。IC617 的 OA 内核根本不认 CDB 格式的库文件,哪怕只差一个.cdslib里指向的路径、一个prop.xx属性文件、甚至一个没清理干净的cds.lib~备份,都会让整个库加载失败、仿真中断、DRC 崩溃。这不是版本兼容问题,是 Cadence 在 IC617 中彻底弃用 CDB 数据模型后设下的硬性隔离墙。这个转换不是格式换壳,而是把整套工艺库从旧式数据库(CDB)迁移到 OpenAccess 元数据架构(OA)——它涉及库结构重映射、属性字段对齐、视图命名规范统一、以及最关键的:所有.cdslib和lib.defs文件必须完成 OA 意义下的语义重写。适合正在维护 legacy PDK、接手老项目、或被客户强制要求升级到 IC617 的版图工程师和 PDK 集成人员。别信“一键转换”的宣传,真实过程里,你得亲手校验 7 类文件、改写 3 类配置、并用oaShell做 2 轮元数据探针。
2. cdb2oa 工具链不是独立程序:它是 IC617 安装包内置的 OA SDK 组件,必须用对版本、路径和上下文环境
Cadence 并没有发布一个叫cdb2oa的独立可执行文件供用户下载。它实际是 IC617 安装目录下tools/dfII/bin/中的一个 shell 封装脚本,其真实后端是oaConvert(由oaShell驱动的 OA SDK 工具)。很多人在终端敲cdb2oa -h报command not found,根本原因是你没 source IC617 的环境变量,或者误用了 IC5141/IC615 的安装路径。正确启动的前提,是确保当前 shell 已完整加载 IC617 的setup.sh(或setenv.csh),且PATH中优先命中tools/dfII/bin/。否则,即使你手动找到二进制,也会因缺少OA_HOME、CDS_INST_DIR或LD_LIBRARY_PATH中的 OA 运行时库而 segmentation fault。
2.1 确认 IC617 环境已就绪:四步验证法
先运行以下命令,逐条确认输出是否符合预期:
# 1. 检查 IC617 主版本与 OA 支持状态 echo $CDS_INST_DIR # 正常应输出类似:/opt/cadence/IC617/tools/dfII # 2. 检查 OA_HOME 是否指向正确路径(IC617 自带 OA 2.2+) echo $OA_HOME # 正常应输出:/opt/cadence/IC617/tools/oa # 3. 检查 cdb2oa 是否在 PATH 中且可执行 which cdb2oa # 正常应输出:/opt/cadence/IC617/tools/dfII/bin/cdb2oa # 4. 检查 OA 运行时库是否能加载(关键!) ldd $(which cdb2oa) | grep -i "oa\|openaccess" # 必须看到类似:liboa.so => /opt/cadence/IC617/tools/oa/lib/liboa.so (0x...)提示:如果第 4 步无输出或报
not found,说明LD_LIBRARY_PATH缺失OA_HOME/lib。临时修复:export LD_LIBRARY_PATH="$OA_HOME/lib:$LD_LIBRARY_PATH"
2.2 cdb2oa 的真实调用逻辑与参数含义解析
cdb2oa本身不处理数据,它只是oaShell的参数转发器。其核心命令等价于:
oaShell -nograph -eval "(load \"tools/dfII/skill/cdb2oa/cdb2oa.il\") (cdb2oaConvert \"/path/to/cds.lib\" \"/path/to/output_oa_lib\" ?force t ?verbose t)"但日常使用中,我们用封装后的命令更安全。标准语法为:
cdb2oa \ -lib <cds.lib_path> \ -out <output_oa_root_dir> \ -map <map_file> \ -force \ -verbose-lib:必须是完整路径的cds.lib文件,不是目录。该文件需包含所有待转换库的DEFINE行,且每行DEFINE后的路径必须是绝对路径(相对路径会导致转换后库路径错乱);-out:输出 OA 库的根目录,不能与原 CDB 库同名同路径,建议新建如pdk_oa/;-map:映射文件(.map),用于定义 CDB 视图名 → OA 视图名的转换规则(例如symbol → schematic,layout → layout),若不指定,工具会按默认规则映射,但abstract,maskLayout,physical等特殊视图极易丢失;-force:强制覆盖已存在 OA 库。慎用:若上一次转换中途失败,残留部分 OA 文件,-force会清空整个目标目录,导致前序成功转换的库也丢失;-verbose:输出详细日志,必须开启。日志中会显示每个库的转换状态、跳过的视图、失败的 cell、以及关键警告(如property 'xxx' not mapped)。
2.3 实战:以 tsmc35mm 为例的完整转换流程(含路径修正)
假设你的原始 PDK 位于/home/user/tsmc035mm_3d3v_5v_v2d7a_PDK/,其中cds.lib内容如下:
DEFINE tsmc35mm /home/user/tsmc035mm_3d3v_5v_v2d7a_PDK/tsmc35mm DEFINE tsmc35mm_models /home/user/tsmc035mm_3d3v_5v_v2d7a_PDK/tsmc35mm_models执行转换前,先做两件事:
- 修正
cds.lib中的路径为绝对路径(很多老 PDK 用./或$PDK_ROOT变量,OA 不支持); - 创建专用输出目录并赋权:
mkdir -p /home/user/tsmc35mm_oa chmod 755 /home/user/tsmc35mm_oa然后执行转换:
cdb2oa \ -lib /home/user/tsmc035mm_3d3v_5v_v2d7a_PDK/cds.lib \ -out /home/user/tsmc35mm_oa \ -map /home/user/tsmc35mm_3d3v_5v_v2d7a_PDK/cdb2oa.map \ -force \ -verbose > /home/user/cdb2oa_log.txt 2>&1参数说明:
-map文件需提前编写,内容示例(cdb2oa.map):# CDB_view_name OA_view_name symbol schematic layout layout abstract abstract maskLayout physical physical physical此映射确保
symbol视图转为 OA 的schematic,避免 Virtuoso 加载时找不到原理图。
转换完成后,检查日志末尾是否出现Conversion completed successfully.。若出现ERROR: Failed to convert library 'tsmc35mm',则需根据日志中cell xxx failed定位具体 cell,通常因该 cell 包含非法字符(如空格、中文)、损坏的 GDS 引用、或缺失prop.xx文件。
3. 转换后不是“复制粘贴”就完事:OA 库必须通过三重路径注册 + 视图完整性校验才能被 IC617 识别
很多人把cdb2oa输出的tsmc35mm_oa/目录直接拷贝到原 PDK 路径下,重启 Virtuoso 后仍报ddUpdateLibList错误。这是因为 OA 架构下,库的“可见性”不再依赖cds.lib单一文件,而是由三套独立注册机制共同控制:cds.lib(仅作路径声明)、lib.defs(OA 库元数据描述)、以及 Virtuoso 启动时读取的OA_LIB_PATH环境变量。漏掉任意一层,库都处于“黑匣子”状态——Virtuoso 能看到路径,但无法实例化 cell、无法打开视图、无法提取参数。
3.1 第一层注册:重写 cds.lib,指向 OA 根目录而非 CDB 目录
原始cds.lib中:
DEFINE tsmc35mm /home/user/tsmc035mm_3d3v_5v_v2d7a_PDK/tsmc35mm必须改为:
DEFINE tsmc35mm /home/user/tsmc35mm_oa/tsmc35mm注意:不是/home/user/tsmc35mm_oa/(根目录),而是/home/user/tsmc35mm_oa/tsmc35mm(具体库目录)。因为cdb2oa输出结构为:
tsmc35mm_oa/ ├── tsmc35mm/ ← OA 库主目录(含 lib.defs, cells/) ├── tsmc35mm_models/ └── ...若指向根目录,Virtuoso 会尝试在/home/user/tsmc35mm_oa/下找lib.defs,但该文件实际在/home/user/tsmc35mm_oa/tsmc35mm/lib.defs。
3.2 第二层注册:校验并修复 lib.defs 文件的 OA 语义合法性
lib.defs是 OA 库的“身份证”,由cdb2oa自动生成,但常含致命错误。用文本编辑器打开/home/user/tsmc35mm_oa/tsmc35mm/lib.defs,检查三项:
oaVersion字段必须为2.2或更高(IC617 要求 OA 2.2+):(libDef (name "tsmc35mm") (oaVersion "2.2") ← 必须是字符串 "2.2",不能是 2.2(无引号)或 2.1viewNames列表必须包含所有已转换视图,且顺序与cdb2oa.map一致:(viewNames ("schematic" "layout" "abstract" "physical"))techFile路径必须为绝对路径且可读:(techFile "/home/user/tsmc35mm_oa/tsmc35mm/techfile.oa")若原 CDB 库用的是
techfile.tf,cdb2oa会尝试转换它,但常失败。此时需手动用oaShell生成:oaShell -nograph -eval "(load \"tools/dfII/skill/oa/techfileConvert.il\") (techfileConvert \"/home/user/tsmc35mm_3d3v_5v_v2d7a_PDK/tsmc35mm/techfile.tf\" \"/home/user/tsmc35mm_oa/tsmc35mm/techfile.oa\")"
3.3 第三层注册:设置 OA_LIB_PATH 并验证 Virtuoso 加载链
IC617 启动时,会按顺序搜索库:
OA_LIB_PATH环境变量中列出的路径;cds.lib中DEFINE的绝对路径;CDS_SITE下的cds.lib(若有)。
因此,必须确保OA_LIB_PATH包含 OA 库根目录:
export OA_LIB_PATH="/home/user/tsmc35mm_oa:$OA_LIB_PATH"然后,在 Virtuoso 中验证是否真正加载:
- 启动 Virtuoso IC617;
- 执行
Tools → Library Path Editor; - 点击
Refresh,观察左侧列表是否出现tsmc35mm,且状态栏显示Status: OK; - 若显示
Status: Error,双击该库,查看弹窗中的具体错误(常见为lib.defs parse error或techfile.oa not found)。
注意:
Library Path Editor中的Save As功能(如原文所述存到 home)只是保存当前 session 的路径快照,并不修改cds.lib或OA_LIB_PATH。它仅用于临时调试,生产环境必须固化cds.lib和环境变量。
4. 避坑:五个血泪经验总结的高频翻车点,现象、原因、解法全闭环
转换失败不是玄学,是可复现、可定位、可修复的工程问题。以下是我在多个 PDK 迁移项目中踩出的 5 个最典型坑,每一条都附带现场诊断命令和修复动作。
4.1 现象:cdb2oa运行几秒后直接退出,日志为空或只有Segmentation fault
- 原因:
LD_LIBRARY_PATH未包含OA_HOME/lib,导致liboa.so加载失败;或CDS_INST_DIR指向 IC5141 安装路径(其oaShell不兼容 IC617 的 OA 2.2)。 - 诊断:
ldd $(which cdb2oa) | grep "not found" echo $CDS_INST_DIR | grep "IC5141" - 解法:
# 确保 source 正确的 setup.sh source /opt/cadence/IC617/tools/dfII/etc/setup.sh export LD_LIBRARY_PATH="$OA_HOME/lib:$LD_LIBRARY_PATH"
4.2 现象:转换日志显示Converted 0 libraries,但cds.lib路径无误
- 原因:
cds.lib中DEFINE行的路径末尾有空格、Tab 或换行符;或路径中含~(波浪线),shell 未展开。 - 诊断:
cat -A /home/user/pdk/cds.lib | grep DEFINE # 查看是否显示 ^I(Tab)或 $(行尾) - 解法:用
sed清理:sed -i 's/[[:space:]]*$//' /home/user/pdk/cds.lib sed -i 's/~/\/home\/user/g' /home/user/pdk/cds.lib
4.3 现象:Virtuoso 加载库时报Error: Cannot open view 'schematic' for cell 'nand2'
- 原因:
cdb2oa.map中未定义symbol → schematic映射,或nand2cell 的symbol视图在 CDB 中损坏(如symbol目录下无symbol文件,或symbol是空目录)。 - 诊断:
# 检查 CDB 中 symbol 视图是否存在 ls -l /home/user/pdk/tsmc35mm/cells/nand2/symbol/ # 检查 map 文件是否含该映射 grep "symbol" /home/user/pdk/cdb2oa.map - 解法:
- 若
symbol视图缺失,从备份中恢复,或用skill脚本批量重建; - 若 map 缺失,在
cdb2oa.map中补一行:symbol schematic。
- 若
4.4 现象:Library Path Editor中库状态为OK,但打开Library Manager后 cell 列表为空
- 原因:
lib.defs中viewNames字段缺失schematic或layout;或cells/目录权限为700(仅属主可读),而 Virtuoso 以其他用户身份运行。 - 诊断:
grep "viewNames" /home/user/tsmc35mm_oa/tsmc35mm/lib.defs ls -ld /home/user/tsmc35mm_oa/tsmc35mm/cells/ - 解法:
# 修正 lib.defs sed -i 's/(viewNames .*)/(viewNames ("schematic" "layout" "abstract"))/' /home/user/tsmc35mm_oa/tsmc35mm/lib.defs # 修复权限 chmod -R 755 /home/user/tsmc35mm_oa/tsmc35mm/cells/
4.5 现象:转换后 DRC/LVS 规则文件报Error: Unknown technology 'tsmc35mm'
- 原因:
calibre或Assura的 rule deck 中仍引用 CDB 路径下的techfile.tf,未切换到 OA 的techfile.oa;或techfile.oa未生成/损坏。 - 诊断:
# 检查 techfile.oa 是否存在且非空 ls -lh /home/user/tsmc35mm_oa/tsmc35mm/techfile.oa # 检查 rule deck 中的 techfile 路径 grep "techfile" /path/to/calibre/rule/deck - 解法:
- 用
oaShell重新生成techfile.oa(见 3.2 节); - 修改 rule deck,将
TECHNOLOGY_FILE = "/old/path/techfile.tf"改为TECHNOLOGY_FILE = "/home/user/tsmc35mm_oa/tsmc35mm/techfile.oa"。
- 用
5. 验证不是“能打开就行”:用 oaShell 做三阶元数据探针,确认 cell 级视图、属性、连接关系全部就位
转换完成、Virtuoso 能加载库、甚至能打开几个 cell 的 schematic,都不代表迁移成功。真正的验收标准是:每个关键 cell 的所有视图(schematic/layout/abstract)、所有属性(instName,masterName,viewName)、所有 pin 连接关系(netName,termName),在 OA 数据库中均可被oaShell查询并返回有效值。这是绕过 GUI 黑箱、直击数据内核的验证方式。我每次交付 PDK 前,必跑这三组oaShell探针,缺一不可。
5.1 探针一:验证 cell 存在性与视图完备性
目标:确认nand2cell 的schematic和layout视图均已注册且可访问。
oaShell -nograph -eval " (load \"tools/dfII/skill/oa/oaUtils.il\") (let ((lib (oaGetLib \"tsmc35mm\"))) (printf \"Library: %s\\n\" (oaLibGetName lib)) (let ((cell (oaGetCell lib \"nand2\" \"schematic\"))) (if cell (printf \"✓ schematic view exists\\n\") (printf \"✗ schematic view missing\\n\"))) (let ((cell (oaGetCell lib \"nand2\" \"layout\"))) (if cell (printf \"✓ layout view exists\\n\") (printf \"✗ layout view missing\\n\"))) )"- 预期输出:
Library: tsmc35mm ✓ schematic view exists ✓ layout view exists - 若失败:说明
cdb2oa未转换该视图,检查cdb2oa.map和 CDB 中对应视图目录是否存在。
5.2 探针二:验证 cell 属性与 pin 连接关系
目标:确认nand2的schematic视图中,A,B,Y三个 pin 的termName和netName正确绑定。
oaShell -nograph -eval " (load \"tools/dfII/skill/oa/oaUtils.il\") (let* ((lib (oaGetLib \"tsmc35mm\")) (cell (oaGetCell lib \"nand2\" \"schematic\")) (pins (oaCellGetPins cell))) (printf \"Cell nand2 has %d pins:\\n\" (length pins)) (foreach pin pins (let ((term (oaPinGetTerm pin)) (net (oaPinGetNet pin))) (printf \" Pin %s -> Term %s -> Net %s\\n\" (oaPinGetName pin) (if term (oaTermGetName term) \"N/A\") (if net (oaNetGetName net) \"N/A\"))))) "- 预期输出(关键看
Term和Net是否非N/A):Cell nand2 has 3 pins: Pin A -> Term A -> Net N1 Pin B -> Term B -> Net N2 Pin Y -> Term Y -> Net N3 - 若
Term或Net为N/A:说明cdb2oa未正确解析 symbol 中的 terminal 定义,需检查 CDBsymbol视图下的terminal文件或symbolskill 脚本。
5.3 探针三:验证技术文件(techfile.oa)的 layer 映射完整性
目标:确认techfile.oa中定义的poly,diff,metal1等 layer,其purpose和datatype与工艺文档一致。
oaShell -nograph -eval " (load \"tools/dfII/skill/oa/oaUtils.il\") (let* ((tf (oaTechFileOpen \"/home/user/tsmc35mm_oa/tsmc35mm/techfile.oa\" \"r\")) (layers (oaTechFileGetLayers tf))) (printf \"Techfile has %d layers:\\n\" (length layers)) (foreach layer layers (let ((name (oaLayerGetName layer)) (purpose (oaLayerGetPurpose layer)) (datatype (oaLayerGetDatatype layer))) (printf \" %s: purpose=%s, datatype=%d\\n\" name purpose datatype))) (oaTechFileClose tf) )"- 预期输出(抽查关键 layer):
poly: purpose=Drawing, datatype=1 diff: purpose=Drawing, datatype=2 metal1: purpose=Drawing, datatype=3 - 若
datatype为0或purpose为nil:说明techfile.tf转换失败,需用techfileConvert.il重跑(见 3.2 节)。
从那以后我每次交付 PDK,都强制走一遍这三组oaShell探针——不是为了炫技,是因为 GUI 里“看起来正常”的 cell,可能在 LVS 中因 pin 名不匹配而断连,在 DRC 中因 layer datatype 错误而漏查,在寄生参数提取中因abstract视图缺失而崩溃。这些黑匣子问题,只有穿透到 OA 元数据层才能提前暴露。希望帮到你。
本文还有配套的精品资源,点击获取