在使用 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.tagDMTYPE 正确 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 -rrsync 拷贝库目录

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 无法识别库

排查步骤:

  1. 检查 cdsinfo.tag 是否存在
  2. 确认 cdsinfo.tag 包含 CDSLIBRARY 关键字
  3. 检查是否启用了 CDSLIBCHECK ON
  4. 验证 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 设计流程的稳定性和效率。

参考资料

  1. Cadence Support - OpenAccess Library Management
  2. Cadence Application Infrastructure User Guide - cdsinfo.tag
  3. OpenAccess 2.2 Property Bag Documentation
  4. Cadence Virtuoso Help - Library Administration