3. 版图数据特征与性能影响

在版图验证中,Calibre 的运行时间和峰值内存并不只由规则文件决定,版图数据本身的结构特征往往才是性能差异的根源。同一套 DRC 规则,面对两个面积相近但组织方式不同的版图,运行时间可能相差数倍。理解 GDSII/OASIS 的层次结构、单元复用方式、多边形密度、层数以及总数据量如何影响 Calibre 的展开、切分与运算过程,是后续所有优化手段的判断基础。

一、GDSII 与 OASIS 的层次结构差异

GDSII 和 OASIS 都是层次化格式,版图由若干 cell 组成,cell 内部包含多边形、路径、文本等几何对象,并通过 SREF(单元引用)和 AREF(阵列引用)复用其他 cell。区别在于:GDSII 采用定长记录、32 位整数坐标,单个文件通常不超过 4 GB,坐标精度受数据库单位限制;OASIS 采用变长记录、支持 64 位坐标、内建压缩与重复对象引用,文件体积通常只有等价 GDSII 的 1/5 到 1/10,且能表达更复杂的重复结构。

对 Calibre 而言,输入格式影响的是读取与展开阶段。Calibre 读入版图后会构建内部层次数据库,SREF/AREF 在内部以引用关系保留,而不是立即展开成扁平几何。因此,一个被引用 1000 次的单元,在内存中只存一份几何加一份引用表。这正是层次化格式能显著降低内存占用的原因。但如果规则中包含 FLATTEN 类操作,或某些检查必须逐层展开,引用关系会在运算前被展开,内存与时间随之上升。

版图数据特征对 Calibre 性能的影响路径 版图数据特征 层次结构深度 cell 嵌套层数 / 引用链 单元复用率 SREF / AREF 重复次数 多边形密度 单位面积顶点/边数 层数与层组合 参与运算的 layer/datatype 总数据量 文件大小 / 几何对象总数 格式:GDSII / OASIS Calibre 内部处理 读取与层次数据库构建 保留引用关系,不立即展开 层次展开 / 切分 FLATTEN 或逐层运算时触发 几何运算与布尔操作 边数、顶点数决定运算量 结果合并与输出 结果层几何回写数据库 中间数据可能驻留内存或落盘 受 -turbo / 并行度影响 性能表现 运行时间 展开 + 运算 + 输出 峰值内存 层次数据库 + 中间结果 I/O 与临时文件 大数据量时落盘开销 判断依据: 时间增长是否超线性

二、单元复用:层次化带来的收益与陷阱

单元复用是版图数据最核心的性能杠杆。以一个标准单元为例:假设某标准单元内部有 200 个多边形,在顶层被实例化 50000 次。若保持层次,Calibre 只需存储 200 个多边形加 50000 条引用记录;若被完全展开,则变成 1000 万个多边形。两者在内存上的差距是数量级的。

但复用并不总是有利。当规则要求对每个实例单独做位置相关运算(例如基于绝对坐标的密度检查、与顶层其他图形的交互检查)时,Calibre 可能不得不在局部展开引用。此时若单元内部几何复杂、引用次数又高,展开后的几何量会迅速膨胀。实践中常见的判断方法是:观察 Calibre 日志中 FLATTEN 或 hierarchical 相关阶段的耗时占比,若展开阶段占用总时间超过 40%,说明层次结构未被有效利用,需要检查规则中是否存在不必要的全局展开操作。

三、多边形密度与层数的影响

多边形密度指单位面积内的顶点数、边数和图形数量。Calibre 的几何运算(如 AND、NOT、SIZE、DRC 检查)复杂度与参与运算的边数近似成正比。一个由 4 个顶点组成的矩形和一个由 200 个顶点组成的近似圆形,在布尔运算中的代价相差数十倍。因此,高密度模拟版图、填充图形(dummy fill)密集区域、以及由曲线近似产生的多顶点多边形,都是性能热点。

层数的影响体现在两个方面:一是参与运算的 layer/datatype 组合数量,每增加一个运算层,就多一轮几何处理;二是层间布尔操作的组合爆炸。例如 10 个层两两做间距检查,理论组合数为 45 对;若规则中还有层组合派生(如 layer1 AND layer2 生成新层再参与后续检查),实际运算层数会进一步放大。经验上,层数从 20 增加到 40,运行时间往往不是线性翻倍,而是增加 2.5 到 3 倍。

四、数据量、格式与内存的量化关系

总数据量可以用三个指标衡量:文件大小、几何对象总数、展开后的等效多边形数。文件大小影响读取 I/O;几何对象总数影响数据库构建;展开后的等效多边形数决定运算峰值内存。三者中,展开后的等效多边形数最难从文件大小直接推断,因为层次复用率高的版图,文件可能只有几百 MB,展开后却达到数十亿多边形。

下面给出一个用于估算展开后几何量的参考计算方式,帮助在跑 Calibre 之前预判内存需求:

# 展开后等效多边形数估算(示例参数,非实测)
# 假设某模块 cell 内部多边形数 P = 200
# 该 cell 被引用次数 N = 50000
# 层次复用保留系数 k = 1(完全展开时)
# 则展开后多边形数 ≈ P × N × k = 200 × 50000 = 10,000,000

# 若保持层次,实际驻留多边形数 ≈ P + N(引用记录)
# = 200 + 50000 = 50,200

# 内存粗估(示例):每个多边形约 100~200 字节
# 完全展开:10,000,000 × 150 B ≈ 1.5 GB
# 保持层次:50,200 × 150 B ≈ 7.5 MB

上述数字为教学示例,实际字节数取决于 Calibre 内部数据结构、顶点数、是否带属性等。但比例关系是可靠的:层次复用率越高,保持层次带来的内存收益越大;一旦被迫展开,内存会按引用次数成倍增长。

五、面向性能的版图数据检查清单

在提交 Calibre 运行前,建议对版图数据做一次快速体检,判断哪些特征可能成为性能瓶颈:

检查项 观察方式 风险判断
层次深度 查看 cell 嵌套层数,是否超过 20 层 过深会增加引用链解析开销
单元复用率 统计 SREF/AREF 总数与唯一 cell 数之比 比值高说明复用好,但展开风险也高
多边形密度 抽样统计单位面积顶点数 高密度区域是运算热点
层数 统计参与规则的 layer/datatype 数量 层数多则组合运算量上升
文件格式 GDSII 还是 OASIS,文件大小 OASIS 读取更快、体积更小
填充图形 是否存在大面积 dummy fill 填充图形数量大,易拖慢密度检查
若发现某模块引用次数极高且内部多边形数大,可优先考虑在规则中对该模块使用层次化处理,避免全局 FLATTEN;若必须展开,可尝试分块运行或提高并行度,把峰值内存压力分散到多个进程。

总结来看,版图数据对 Calibre 性能的影响可以归纳为一条主线:层次结构决定引用是否被保留,单元复用率决定展开后的几何放大倍数,多边形密度决定单位几何的运算代价,层数决定运算轮次与组合数,总数据量决定 I/O 与内存基线。把这五个特征与 Calibre 日志中的阶段耗时对应起来,就能从“跑得慢”定位到“慢在哪个数据特征”,为后续的规则优化、分块策略和格式转换提供依据。