在使用 Cadence Virtuoso 进行 IC 设计时,我们经常会在库目录中看到几个特殊的元数据文件:.oalib、cdsinfo.tag 和 data.dm。这些文件对于库的正常运作至关重要,但很多工程师对它们的作用和机制并不清楚。本文将详细解析这三个文件的用途、语法格式以及最佳实践。
核心概念对比
在深入探讨之前,先通过一张表格快速了解这三个文件的基本定位:
| 文件名 | 格式 | 主要作用 | 管理方式 |
|---|---|---|---|
.oalib |
XML | OpenAccess 库元数据,标记操作系统信息 | Virtuoso 自动管理 |
cdsinfo.tag |
纯文本 | 库配置文件,定义库属性和 DM 系统 | 需手动创建或编辑 |
data.dm |
二进制 | 属性包,存储技术库绑定、CDF 等信息 | OpenAccess 系统管理 |
.oalib 文件详解
什么是 .oalib?
.oalib 是一个自动生成的 XML 格式小文件,位于每个 Virtuoso 库的根目录下。它是 OpenAccess (OA) 库管理系统的核心元数据文件。
主要用途
1. 操作系统标识
.oalib 最重要的功能是记录库创建时的操作系统信息:
- Windows: 文件系统不区分大小写
- Linux: 文件系统区分大小写
这个信息对跨平台使用库至关重要。Virtuoso 需要根据源操作系统来正确处理文件名的大小写敏感性问题。
2. 库验证
oaScan 工具(用于库完整性检查)依赖 .oalib 文件来识别有效的 Virtuoso 库:
1
2
3
4
5
# 正常扫描(需要 .oalib 文件)
oaScan -lib mylib
# 强制扫描(即使没有 .oalib)
oaScan -lib mylib -forceLibPath
3. OpenAccess 库管理
作为 OpenAccess 数据库框架的一部分,.oalib 存储了库的内部属性和环境元数据。
文件格式
1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<oaLib>
<version>2.2</version>
<creator>Virtuoso</creator>
<creatorOS>Linux</creatorOS>
<!-- 其他 OA 内部属性 -->
</oaLib>
虽然用户通常不需要手动编辑此文件,但了解其基本结构有助于故障排查。
文件的创建与重建
自动创建:
- 新建库时自动生成
- 启动 Virtuoso 时,会为
cds.lib中定义的所有库重新创建缺失的.oalib文件
手动触发重建:
如果 .oalib 文件被误删,可以通过以下方式重建:
; 在 CIW 中执行
sh("cdsLibDebug")
或者完全退出并重新启动 Library Manager。
[!WARNING] 重要提醒
- 不要手动编辑或删除
.oalib文件- 跨操作系统复制库时要注意操作系统信息可能导致的兼容性问题
- 没有内置方法禁止创建此文件,它是 Virtuoso OA 集成的核心要求
cdsinfo.tag 文件详解
什么是 cdsinfo.tag?
cdsinfo.tag 是一个纯文本格式的配置文件,用于定义 Cadence 库的关键属性和行为。它是 Cadence Application Infrastructure (CAI) 的重要组成部分。
主要用途
1. 库标识
通过 CDSLIBRARY 关键字将目录明确标记为 Cadence 库:
1
CDSLIBRARY
2. 设计管理系统选择
指定使用哪个设计管理 (DM) 系统:
1
2
3
4
5
6
7
8
9
10
11
# 使用 Team Design Manager
DMTYPE TDM
# 不使用任何 DM 系统
DMTYPE none
# 使用 ClioSoft SOS
DMTYPE sos
# 使用 Synchronicity
DMTYPE synchronicity
3. 严格库检查
启用后,只有包含 cdsinfo.tag 文件的目录才会被识别为库:
1
CDSLIBCHECK ON
4. 文件系统命名空间
定义库的命名规则和大小写敏感性:
1
NAMESPACE LIBRARYUNIX
文件语法与格式
基本规则:
- 关键字: 不区分大小写 (DMTYPE 和 dmtype 等效)
- 注释: 以
#或--开头的行 - 空白: 空行和多余的空格/制表符会被忽略
- 路径: Windows 下支持
/和\两种分隔符
完整示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# ================================================
# Cadence Library Configuration File
# Library: MY_ANALOG_LIB
# Created: 2026-01-24
# ================================================
# 标记为 Cadence 库
CDSLIBRARY
# 启用严格检查
CDSLIBCHECK ON
# 使用 Team Design Manager
DMTYPE TDM
# 使用标准 UNIX 命名规则
NAMESPACE LIBRARYUNIX
常用关键字说明
| 关键字 | 参数 | 说明 |
|---|---|---|
CDSLIBRARY |
无 | 标记目录为 Cadence 库 |
CDSLIBCHECK |
ON/OFF | 启用/禁用严格库检查 |
DMTYPE |
system_name | 指定设计管理系统 |
NAMESPACE |
namespace_name | 定义命名空间规则 |
cdsinfo 命令行工具
Cadence 提供了 cdsinfo shell 工具来查询库属性:
1
2
3
4
# 查询库的 DM 类型
cdsinfo -l my_analog_lib DMTYPE
# 输出示例: TDM
命令格式:
1
cdsinfo -l <库名> <属性关键字>
文件位置要求
[!IMPORTANT]
cdsinfo.tag必须放在库的根目录下,不能放在 cell 或 view 子目录中。
最佳实践
1. 新建库时手动创建
1
2
3
4
5
6
cd /path/to/new_library
cat > cdsinfo.tag << 'EOF'
CDSLIBRARY
DMTYPE none
NAMESPACE LIBRARYUNIX
EOF
2. 多用户环境建议
在大型多用户环境中,为每个手动创建的库添加 cdsinfo.tag 可以避免库识别问题。
3. 故障排查
遇到 “Library not found” 错误时,检查:
- 是否启用了
CDSLIBCHECK ON cdsinfo.tag中是否有CDSLIBRARY条目- 文件是否位于库的根目录
4. DM 系统配置
对于实验性或临时库,显式设置 DMTYPE none 可以防止工具尝试加载 DM 相关的触发器或图标:
1
2
CDSLIBRARY
DMTYPE none
data.dm 文件详解
什么是 data.dm?
data.dm 是一个二进制格式的 “属性包” (property bag) 文件,在 OpenAccess 2.2 及更高版本 (如 IC6.1.X 和 ICADV12.X) 中使用。它是早期 prop.xx (CDBA/IC5141) 和 dd.db (OA 2.0) 文件的现代替代品。
主要用途
data.dm 的内容取决于其在库层次结构中的位置:
1. 库级别 (Library Level)
存储影响整个库的属性,最重要的是技术库绑定:
1
2
3
4
库根目录/
├── .oalib
├── cdsinfo.tag
└── data.dm ← 存储技术库绑定信息
2. Cell 级别
存储 Cell 特定的属性,如 Component Description Format (CDF) 信息:
1
2
3
库根目录/
└── inv/
└── data.dm ← 存储 CDF 和元数据
3. View 级别
存储特定 cellview 的元数据属性(之前版本存储在 libName.lib 目录文件中的信息):
1
2
3
4
库根目录/
└── inv/
└── layout/
└── data.dm ← 存储 view 级别的属性
文件格式
data.dm 是二进制数据库文件,由 OpenAccess 系统管理,没有可读的文本语法。
操作 data.dm 的 SKILL 函数
用户和开发者通过 SKILL 函数与 data.dm 交互:
; 打开属性包
bag = dbOpenBag(cv "prop")
; 读取属性
value = dbGetBag(bag "propertyName")
; 保存修改
dbSaveBag(bag)
; 关闭属性包
dbCloseBag(bag)
关键 API:
| 函数 | 功能 |
|---|---|
dbOpenBag() |
打开属性包 |
dbGetBag() |
获取属性值 |
dbSaveBag() |
保存修改 |
dbCloseBag() |
关闭属性包 |
设计管理中的注意事项
[!WARNING] 重要:Co-Managed 文件
data.dm是 “co-master” 或 “co-managed” 文件,这意味着:
- 在设计管理环境中(如 IC Manage、Cliosoft),它会与主设计文件一起被跟踪
- 编辑 CDF 等操作前,必须先 check out
data.dm文件- 否则会遇到权限错误
示例场景:
1
2
3
4
5
6
# 在 IC Manage 环境中编辑 CDF
# 1. 先 check out cell 的 data.dm
icmp4 edit /path/to/library/mycell/data.dm
# 2. 然后在 Virtuoso 中编辑 CDF
# CIW: Tools > CDF > Edit
文件权限
通常以 744 权限创建:
1
-rwxr--r-- 1 user group 2048 Jan 24 14:30 data.dm
故障排查
问题 1: 空的 data.dm 文件
症状:
1
(DB-260016): dbOpenBag: Unable to open property bag...
原因: 0 字节的 data.dm 文件会导致警告
解决方法:
; 删除空的 data.dm 文件,让系统重新创建
file("data.dm" "w") ; 不要这样做!
; 正确做法: 使用 SKILL 删除
deleteFile("path/to/data.dm")
问题 2: 修复损坏的 data.dm
使用 oaScan 工具扫描和修复:
1
oaScan -lib mylib -fix
版本演进对比
| Virtuoso 版本 | 属性存储文件 | 格式 |
|---|---|---|
| IC5141 (CDBA) | prop.xx |
二进制 |
| IC6.0 (OA 2.0) | dd.db |
二进制 |
| IC6.1+ (OA 2.2+) | data.dm |
二进制 |
三个文件的协同工作机制
典型库目录结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
MY_ANALOG_LIB/
├── .oalib ← OpenAccess 元数据 (XML)
├── cdsinfo.tag ← 库配置文件 (纯文本)
├── data.dm ← 技术库绑定 (二进制)
├── inv/
│ ├── data.dm ← Cell 级别属性 (CDF)
│ ├── layout/
│ │ ├── layout.oa ← 实际设计数据
│ │ └── data.dm ← View 级别属性
│ └── schematic/
│ ├── sch.oa
│ └── data.dm
└── nand2/
└── ...
工作流程
1. 创建新库
1
2
3
4
5
6
7
# 用户操作: Library Manager > File > New > Library
# Virtuoso 自动创建:
MY_NEW_LIB/
├── .oalib ← 自动生成
├── cdsinfo.tag ← 根据模板创建
└── data.dm ← 绑定技术库时创建
2. 绑定技术库
; 用户操作: 在 Library Manager 中绑定技术库
; Virtuoso 在 MY_NEW_LIB/data.dm 中写入:
; - 技术库名称
; - 技术库路径
; - 绑定参数
3. 创建 Cell 和 Symbol
; 创建 schematic 时
; → 生成 mycell/schematic/sch.oa
; Create Cellview > From Cellview 创建 symbol 时
; → 生成 mycell/data.dm (存储 CDF 和映射关系)
; → 生成 mycell/symbol/symbol.oa
文件丢失的影响
| 丢失文件 | 影响 | 恢复方法 |
|---|---|---|
.oalib |
oaScan 失败,跨平台问题 |
重启 Virtuoso 或执行 sh("cdsLibDebug") |
cdsinfo.tag |
启用 CDSLIBCHECK 后库无法识别 | 手动重新创建 |
data.dm (库级) |
技术库绑定丢失 | 重新绑定技术库 |
data.dm (Cell级) |
CDF 信息丢失 | 重新编辑 CDF |
实用技巧与最佳实践
技巧 1: 批量检查库元数据
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
# 检查所有库是否包含必要的元数据文件
for lib in $(grep DEFINE cds.lib | awk '{print $3}'); do
echo "Checking library: $lib"
[ -f "$lib/.oalib" ] && echo " ✓ .oalib exists" || echo " ✗ .oalib missing"
[ -f "$lib/cdsinfo.tag" ] && echo " ✓ cdsinfo.tag exists" || echo " ✗ cdsinfo.tag missing"
[ -f "$lib/data.dm" ] && echo " ✓ data.dm exists" || echo " ✗ data.dm missing (may be normal)"
echo ""
done
技巧 2: 标准化的 cdsinfo.tag 模板
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# ================================================
# Standard Cadence Library Configuration Template
# Organization: Your Company Name
# ================================================
# Mark as Cadence library
CDSLIBRARY
# Enable strict library checking
CDSLIBCHECK ON
# Design management system
# Options: TDM, sos, synchronicity, none
DMTYPE TDM
# Standard UNIX namespace
NAMESPACE LIBRARYUNIX
# ================================================
# Custom Properties (if needed)
# Add your organization-specific configurations here
# ================================================
技巧 3: 使用 SKILL 查询库属性
procedure(checkLibMetadata(libName)
let((libPath hasOalib hasCdsinfo hasDM)
; 获取库路径
libPath = ddGetObj(libName)~>readPath
; 检查文件存在性
hasOalib = isFile(strcat(libPath "/.oalib"))
hasCdsinfo = isFile(strcat(libPath "/cdsinfo.tag"))
hasDM = isFile(strcat(libPath "/data.dm"))
; 输出结果
printf("Library: %s\n" libName)
printf(" Path: %s\n" libPath)
printf(" .oalib: %s\n" if(hasOalib "✓" "✗"))
printf(" cdsinfo.tag: %s\n" if(hasCdsinfo "✓" "✗"))
printf(" data.dm: %s\n" if(hasDM "✓" "(not always required)"))
)
)
; 使用示例
checkLibMetadata("MY_ANALOG_LIB")
技巧 4: Git/SVN 版本控制配置
.gitignore 建议:
# 不要忽略元数据文件!
# These are critical:
# .oalib
# cdsinfo.tag
# data.dm
# 可以忽略的自动生成文件
*.log
.hist/
*.lock
[!TIP] 版本控制最佳实践
- 提交
cdsinfo.tag- 手动创建的配置- 提交
data.dm- 包含重要的属性信息- 谨慎对待
.oalib- 可以提交,但跨平台时可能需要重建
Update Workarea 中的库识别问题
什么是 Update Workarea?
Update Workarea 是 Cadence 设计管理 (Design Management) 系统中的核心命令,常见于以下系统:
- IC Manage (Cadence 官方 DM 系统)
- ClioSoft SOS (第三方版本控制系统)
- Team Design Manager (TDM) (Cadence 早期 DM 系统)
- Synchronicity (Dassault Systèmes 的 DM 解决方案)
其主要功能包括:
- 同步: 将本地工作区 (workarea) 与中央仓库 (vault/server) 对齐
- 刷新: 获取团队其他成员添加的新库、Cell 或 cellview
- 注册: 检测本地文件系统中新增的库目录,使其能被 DM 系统管理
库不可见的常见场景
[!WARNING] 典型问题症状
“明明在文件系统中看到了库目录,但在 Update Workarea 列表或 Library Manager 中找不到它!”
根本原因: DM 系统无法将该目录识别为有效的受管库 (Valid Managed Library)。
为什么技术库绑定能解决问题?
当你通过 Tools > Technology File Manager > Attach 将库绑定到技术库 (PDK) 时,Virtuoso 会执行一系列内部操作:
1. 验证库结构
Virtuoso 检查库的完整性,确保它是有效的 OpenAccess 库。
2. 生成/更新 .oalib
1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<oaLib>
<version>2.2</version>
<creator>Virtuoso</creator>
<creatorOS>Linux</creatorOS>
</oaLib>
如果 .oalib 缺失,会自动创建。这确保库在 OpenAccess 层面可识别。
3. 写入/更新 cdsinfo.tag
1
2
3
4
5
6
7
8
# 标记为 Cadence 库
CDSLIBRARY
# 指定设计管理系统
DMTYPE sos # 或 TDM, icmanage, synchronicity
# 命名空间
NAMESPACE LIBRARYUNIX
关键点: DMTYPE 字段告知 DM 系统该库受其管理。如果这个字段缺失或设置为 none,Update Workarea 会忽略该库。
4. 生成/更新 data.dm
在库根目录创建 data.dm 文件,存储:
- 技术库绑定信息 (技术库名称、路径)
- DM 系统的元数据 (如 checkout 状态、版本提示)
- 库级别的属性
实际案例解析
场景: 从备份或其他项目复制库到本地工作区
1
2
3
4
5
6
7
# 错误做法: 直接使用 OS 命令拷贝
cp -r /backup/MY_LIB /home/user/workarea/
# 结果: MY_LIB/ 目录存在,但:
# - .oalib 可能包含错误的 OS 信息
# - cdsinfo.tag 可能缺失或 DMTYPE 错误
# - data.dm 可能缺失或路径失效
Update Workarea 扫描器的判断逻辑:
1
2
3
4
5
6
检查 MY_LIB/:
├─ .oalib 存在? ❌ (或 OS 信息不匹配)
├─ cdsinfo.tag 存在? ❌
└─ cdsinfo.tag 中 DMTYPE = sos? ❌
结论: 跳过该目录,不作为受管库
正确的修复方法:
1
2
3
# 1. 在 Virtuoso Library Manager 中打开该库
# 2. Tools > Technology File Manager > Attach
# 3. 选择正确的技术库 (如 gpdk180)
Attach 操作后的变化:
1
2
3
4
5
6
MY_LIB/
├── .oalib ← 重建,OS 信息正确
├── cdsinfo.tag ← 更新,DMTYPE = sos
└── data.dm ← 创建,包含技术库绑定
现在 Update Workarea 可以识别!
DM 系统识别库的必要条件
| 条件 | 检查方法 | 缺失影响 |
|---|---|---|
.oalib 存在且有效 |
ls -la .oalib |
OpenAccess 引擎无法识别库 |
cdsinfo.tag 包含 CDSLIBRARY |
grep CDSLIBRARY cdsinfo.tag |
严格模式下库无法识别 |
cdsinfo.tag 的 DMTYPE 正确 |
grep DMTYPE cdsinfo.tag |
Update Workarea 忽略该库 |
data.dm 存在 (库级) |
ls -la data.dm |
DM 元数据丢失,同步可能失败 |
批量修复脚本
如果你有多个库需要修复,可以使用以下 SKILL 脚本批量重新绑定技术库:
procedure(batchAttachTechLib(libList techLibName)
let((lib cv)
foreach(lib libList
printf("Processing library: %s\n" lib)
; 打开库的一个 dummy cellview 来触发库加载
when(ddGetObj(lib)
; 绑定技术库
techBindTechFile(lib techLibName)
printf(" ✓ Attached to %s\n" techLibName)
)
)
printf("\nAll libraries processed.\n")
)
)
; 使用示例:
; batchAttachTechLib(list("LIB1" "LIB2" "LIB3") "gpdk180")
最佳实践:避免库识别问题
[!TIP] 推荐工作流程
1. 创建新库
- 始终通过 Library Manager > File > New > Library 创建
- 不要手动创建目录再添加到 cds.lib
2. 复制库
- 使用 Library Manager 的 Copy 功能
- 或使用 DM 系统的 Populate/Sync 命令
- 不要直接用
cp -r或rsync拷贝库目录3. 导入外部库
- 先用
cp -r复制到临时位置- 在 Virtuoso 中通过 Library Manager 打开
- 重新绑定技术库,触发元数据重建
- 然后执行 Update Workarea
4. 验证库可见性
1 2 3 4 5 6 7 # 检查三个关键文件 ls -la MY_LIB/.oalib ls -la MY_LIB/cdsinfo.tag ls -la MY_LIB/data.dm # 检查 DMTYPE grep DMTYPE MY_LIB/cdsinfo.tag
Update Workarea 故障排查流程图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
库在 Update Workarea 中不可见?
│
├─ 步骤 1: 检查 .oalib
│ ├─ 不存在? → 执行 sh("cdsLibDebug") 或重启 Virtuoso
│ └─ 存在但 OS 信息错误? → 删除重建
│
├─ 步骤 2: 检查 cdsinfo.tag
│ ├─ 不存在? → 手动创建或重新 Attach 技术库
│ ├─ 缺少 CDSLIBRARY? → 添加该行
│ └─ DMTYPE = none? → 改为正确的 DM 系统 (sos/TDM/icmanage)
│
├─ 步骤 3: 检查 data.dm
│ └─ 不存在? → 重新绑定技术库
│
└─ 步骤 4: 验证 cds.lib
└─ 路径正确? → 确认 DEFINE 行指向正确的目录
不同 DM 系统的 DMTYPE 设置
| DM 系统 | cdsinfo.tag 中的 DMTYPE | 备注 |
|---|---|---|
| ClioSoft SOS | DMTYPE sos |
SOS 7.x 及以上版本 |
| IC Manage | DMTYPE icmanage |
Cadence 官方解决方案 |
| Team Design Manager | DMTYPE TDM |
早期 Cadence DM 系统 |
| Synchronicity | DMTYPE synchronicity |
Dassault Systèmes 方案 |
| 无 DM 系统 | DMTYPE none |
实验库或本地库 |
调试技巧:启用 DM 日志
如果 Update Workarea 仍然无法识别库,可以启用详细日志:
1
2
3
4
5
6
7
# 对于 ClioSoft SOS
export SOS_DEBUG=1
virtuoso &
# 对于 IC Manage
export ICMANAGE_DEBUG=1
virtuoso &
查看日志中关于库扫描的输出,可以发现具体哪个元数据文件导致了识别失败。
常见问题与解决方案
问题 1: “Library not recognized”
症状: Library Manager 无法识别库
排查步骤:
- 检查
cdsinfo.tag是否存在 - 确认
cdsinfo.tag包含CDSLIBRARY关键字 - 检查是否启用了
CDSLIBCHECK ON - 验证
cds.lib中的路径是否正确
问题 2: 跨平台库迁移问题
症状: 从 Linux 复制到 Windows 后出现大小写错误
原因: .oalib 中记录的 OS 信息与实际环境不匹配
解决方法:
1
2
3
4
5
6
# 1. 删除旧的 .oalib
rm -f /path/to/library/.oalib
# 2. 启动 Virtuoso,自动重建
# 或在 CIW 中执行:
sh("cdsLibDebug")
问题 3: “Cannot modify CDF” 错误
症状: 编辑 CDF 时提示权限错误
原因: 在 DM 环境中未 check out data.dm
解决方法:
1
2
3
4
5
# IC Manage 示例
icmp4 edit /path/to/library/mycell/data.dm
# ClioSoft SOS 示例
soscmd co /path/to/library/mycell/data.dm
问题 4: 空的 data.dm 导致警告
症状: (DB-260016): dbOpenBag: Unable to open property bag
解决方法:
; 在 SKILL 中删除空文件
procedure(deleteEmptyDataDM(libName cellName)
let((dmPath)
dmPath = strcat(
ddGetObj(libName)~>readPath
"/"
cellName
"/data.dm"
)
when(isFile(dmPath)
when(fileSize(dmPath) == 0
deleteFile(dmPath)
printf("Deleted empty data.dm: %s\n" dmPath)
)
)
)
)
总结
这三个文件在 Cadence Virtuoso 库管理中各司其职:
| 职责维度 | 文件 | 核心功能 |
|---|---|---|
| 平台兼容性 | .oalib |
记录创建 OS,支持跨平台使用 |
| 库配置管理 | cdsinfo.tag |
定义库属性、DM 系统、检查规则 |
| 运行时数据 | data.dm |
存储技术库绑定、CDF、属性信息 |
关键要点:
- ✅
.oalib由 Virtuoso 自动管理,通常不需手动干预 - ✅
cdsinfo.tag应该手动创建和维护,尤其在多用户环境中 - ✅
data.dm是二进制文件,通过 SKILL API 操作 - ✅ 在设计管理环境中要特别注意
data.dm的 check out - ✅ 三个文件都应纳入版本控制(注意跨平台的
.oalib重建)
理解这些文件的作用和交互机制,可以有效避免库识别、技术库绑定、CDF 编辑等常见问题,提升 IC 设计流程的稳定性和效率。
参考资料
- Cadence Support - OpenAccess Library Management
- Cadence Application Infrastructure User Guide - cdsinfo.tag
- OpenAccess 2.2 Property Bag Documentation
- Cadence Virtuoso Help - Library Administration