目录
[Calibre nmDRC 规则选择、结果控制与性能优化终极指南](#Calibre nmDRC 规则选择、结果控制与性能优化终极指南)
[一、规则检查选择(Rule Check Selection):精准控制运行范围](#一、规则检查选择(Rule Check Selection):精准控制运行范围)
[1. 核心选择逻辑(优先级:Select → Unselect)](#1. 核心选择逻辑(优先级:Select → Unselect))
[2. 关键配置语句与示例](#2. 关键配置语句与示例)
[3. 与结果数据库的关联影响](#3. 与结果数据库的关联影响)
[1. 结果数量限制(DRC Maximum Results)](#1. 结果数量限制(DRC Maximum Results))
[2. 空规则控制(DRC Keep Empty)](#2. 空规则控制(DRC Keep Empty))
[1. 并发运行(Concurrency)](#1. 并发运行(Concurrency))
[2. 结果冗余消除(Result Redundancy Elimination)](#2. 结果冗余消除(Result Redundancy Elimination))
[3. 图形运算调度](#3. 图形运算调度)
[1. 核心优化原则](#1. 核心优化原则)
[2. 关键优化手段(附规则示例)](#2. 关键优化手段(附规则示例))
[(1)联合检查(Conjunctive Checks):减少中间层数据](#(1)联合检查(Conjunctive Checks):减少中间层数据)
[(2)线宽 / 间距检查优化:优先拓扑操作,避免大约束](#(2)线宽 / 间距检查优化:优先拓扑操作,避免大约束)
[(4)大区间隔测量优化:用 EXPAND EDGE/SIZE 替代 EXT](#(4)大区间隔测量优化:用 EXPAND EDGE/SIZE 替代 EXT)
[3. 多边形分割(Polygon Segmentation)](#3. 多边形分割(Polygon Segmentation))
[1. 规则文件编译](#1. 规则文件编译)
[2. 退出值(Exit Values)](#2. 退出值(Exit Values))
Calibre nmDRC 规则选择、结果控制与性能优化终极指南
本文基于 Calibre v2017.1 官方手册,深度拆解 规则检查选择、结果限制、并发调度及性能优化的核心技术,聚焦大规模层级化版图的 DRC 效率提升,提供可直接落地的规则编写模板、配置命令及避坑方案。
一、规则检查选择(Rule Check Selection):精准控制运行范围
规则检查选择功能允许仅运行规则文件中的部分规则(形成 "检查集"),大幅缩短调试时间和运行资源消耗,核心逻辑围绕 DRC Select Check/DRC Unselect Check 系列语句展开。
可以从规则文件中选取一条或多条规则检查语句,Calibre nmDRC 会将其作为一个单元运行。该单元被称为检查集。规则检查名称需紧跟在规则检查语句的左大括号之前进行定义。
rule_check_name { ...
1. 核心选择逻辑(优先级:Select → Unselect)
默认情况下,Calibre nmDRC 在编译阶段会选取规则文件中的所有规则检查 。可以通过 DRC SELECT CHECK 和 DRC UNSELECT CHECK 规格语句,控制编译阶段需要纳入的规则检查项。Calibre nmDRC 编译规则文件时,选取规则检查的逻辑如下:
-
若规则文件中未包含
DRC SELECT CHECK规格语句,则 Calibre nmDRC 会选取所有规则检查;反之,则仅选取DRC SELECT CHECK规格语句中指定的规则检查。 -
对于规则文件中通过
DRC UNSELECT CHECK规格语句指定的规则检查,Calibre nmDRC 均不会选取。
在 Calibre 运行过程中,规则文件编译完成后,运行日志会同时列出已选取和未选取的 Calibre nmDRC 规则检查。
DRC [UN]SELECT CHECK BY LAYER 规格语句提供了额外的控制能力,可根据指定的图层,进一步筛选需要执行的规则检查。
- 默认行为 :无
DRC Select Check时,运行所有规则;存在时,仅运行指定规则。 - 排除逻辑 :无论是否选中,
DRC Unselect Check指定的规则均不运行。 - 层级控制 :支持按层筛选规则(
DRC [Un]Select Check By Layer),仅运行与指定层相关的规则。
2. 关键配置语句与示例
| 配置语句 | 语法格式 | 作用 | 示例 |
|---|---|---|---|
| 选中单个 / 多个规则 | DRC SELECT CHECK <rule_name1> [rule_name2 ...] |
仅运行指定规则 | DRC SELECT CHECK METAL_WIDTH CONTACT_SPACING |
| 排除单个 / 多个规则 | DRC UNSELECT CHECK <rule_name1> [rule_name2 ...] |
不运行指定规则 | DRC UNSELECT CHECK POLY_NOTCH |
| 按层选中规则 | DRC SELECT CHECK BY LAYER <layer_name> |
仅运行涉及该层的所有规则 | DRC SELECT CHECK BY LAYER METAL1 |
3. 与结果数据库的关联影响
Calibre nmDRC 及相关工具仅会按需读取版图数据库中的图层,即只读取当前运行的检查集所需的图层。**若某一图层并非本次运行所必需,则不会被读取。**同理,工具也仅会根据检查集的数据需求,生成必要的派生图层。
在生成掩膜(几何图形)结果数据库时,输出数据的内容会受检查集的影响。输出数据库的结构(包括层次结构、单元范围和输出图层)同样由本次运行所使用的检查集决定。
若因检查集不同导致多次运行生成的掩膜结果数据库存在差异,可通过以下方式追踪差异:针对设计中重点关注的区域,使用 LAYOUT WINDOW、LAYOUT WINDOW LAYER 和 LAYOUT WINDOW CELL 等语句,运行完整的 DRC 规则文件。当你在全版图上使用较小的检查集运行时,可将完整 DRC 运行得到的结果窗口作为对比基准。
通过设置 DRC 结果数据库的 USER 和 USER MERGED 选项,可在一定程度上缓解因检查集不同而导致的结果数据库层次结构差异。而 PSEUDO 选项则往往会因检查集的变化,造成输出层次结构出现最明显的差异。
-
版图数据读取:仅读取检查集所需的层数据,未用到的层不加载(减少 IO 开销)。
-
掩模层结果(GDSII/OASIS) :检查集影响输出数据库的层级结构、单元范围和输出层,建议用
LAYOUT WINDOW限定检查区域,便于不同检查集的结果对比。 -
层级一致性优化 :使用
DRC RESULTS DATABASE USER或USER MERGED选项,减少因检查集不同导致的结果数据库层级差异(PSEUDO选项差异最大)。
二、结果限制与空规则控制:避免数据库冗余
1. 结果数量限制(DRC Maximum Results)
控制单个规则的错误结果数量,防止因规则约束宽松(如大间距检查)导致结果数据库过大,影响后续查看和存储。可以通过 DRC MAXIMUM RESULTS 规格语句,或在 DRC CHECK MAP 规格语句中使用 MAXIMUM RESULTS 参数,限制任意一条 DRC 规则检查写入 DRC 结果数据库的结果数量。
限制结果数量有助于避免因 DRC 规则约束值过大,而生成体积庞大的 DRC 结果数据库。默认情况下,每条 DRC 规则检查的结果数量上限为 1000 。若你需要生成掩膜数据结果,则应指定关键字 ALL(即不限制结果数量)。
每当达到结果数量上限时,Calibre 都会发出一条警告信息。
在平面模式的 Calibre nmDRC 中,为优化性能,该结果数量上限会被自动传递至 EXTERNAL、INTERNAL 和 ENCLOSURE 运算。当这些运算判定写入 DRC 结果数据库的结果即将超出上限时,会停止生成 DRC 结果。但如果某条规则检查中包含多个运算,则不会触发此优化机制。
该优化机制通过避免生成和存储超出上限的结果,能够节省 CPU 时间与内存资源 ------ 这些超出上限的结果最终在写入 DRC 结果数据库时,也会被丢弃。
在层次化模式的 Calibre nmDRC 中,该性能优化机制的逻辑与之类似,但存在一个区别:工具无法确切判定是否会达到结果数量上限。当层次化模式下的 ENCLOSURE、EXTERNAL 和 INTERNAL 运算触发结果数量限制时,Calibre 会发出以下警告:
核心配置
- 语法 :
DRC MAXIMUM RESULTS <number> | ALL - 默认值:1000(单个规则最多输出 1000 个错误)。
- 关键场景 :
- 常规 DRC:保持默认或根据需求减小(如
500),快速定位主要错误。 - 掩模层生成(nmDRC-H):必须设为
ALL(否则会丢失掩模数据),搭配DRC CHECK MAP使用。
- 常规 DRC:保持默认或根据需求减小(如
- 性能优化 :扁平化运行时,
EXT/INT/ENCLOSURE操作会在结果达到限制时停止计算,节省 CPU 和内存。
示例
svrf
DRC MAXIMUM RESULTS 2000 ; 单个规则最多输出2000个错误
DRC MAXIMUM RESULTS ALL ; 掩模层生成时使用,不限制结果数量
2. 空规则控制(DRC Keep Empty)
实际应用中,部分规则检查可能不会生成任何 DRC 结果(即空规则检查)。可能不希望这些空规则检查占用 DRC 结果数据库的存储空间。但在某些场景下,无论是否产生结果,执行规则检查这一操作本身才是核心需求。
在 Calibre nmDRC 中,是否在 DRC 结果数据库中创建空规则检查的记录,由规则文件中的 DRC KEEP EMPTY 规格语句控制。若该语句指定为 NO,则空规则检查不会被写入 DRC 结果数据库;若指定为 YES,或未配置该语句,则空规则检查会被写入数据库。需要注意的是,DRC KEEP EMPTY 语句对 DRC CHECK MAP 数据库不产生任何影响。
- 语法 :
DRC KEEP EMPTY <YES | NO> - 默认值 :
YES(空规则写入数据库)。 - 适用场景 :
- 调试阶段:设为
YES,确认规则是否被正确执行。 - 正式运行:设为
NO,删除空规则,减小数据库体积。
- 调试阶段:设为
- 注意 :对
DRC CHECK MAP生成的掩模数据库无影响。
三、并发与冗余消除:提升运行效率
1. 并发运行(Concurrency)
Calibre nmDRC 支持对多个图层运算进行并发执行。这意味着,当规则文件中存在多个可并行的运算时,工具会同时运行它们。Calibre nmDRC 在执行图层运算时,会先筛选出所有可并发执行的必要运算,再将它们作为一个批次执行。这种方式能显著提升运行性能。
Calibre nmDRC 自动将无依赖的层操作分组并发执行,充分利用多核 CPU 资源,并发操作会在日志中分组显示。
关键特性
-
自动分组:无需手动配置,工具识别可并发的层操作(如独立的线宽检查、间距检查)。
-
日志标识 :并发执行的操作会被横线分组,显示共同的 CPU / 内存使用情况:
plaintext
min_spacing_metal1::<1> = EXT metal1 < 1 min_metal1_width::<1> = INT metal1 < 2 ---------------------------------------- min_spacing_metal1::<1> (HIER TYP=3 ...) min_metal1_width::<1> (HIER TYP=3 ...) CPU TIME = 0 REAL TIME = 0 OPS COMPLETE = 5 OF 20 -
手动优化 :通过
CONCURRENCY <number>配置最大并发线程数(默认自动适配 CPU 核心数)。
非并发执行的运算,则会单独展示,示例如下:
min_contact_width::<1> = INT contact < 1.75
-------------------------------------------
min_contact_width::<1> (HIER TYP=3 HGC=0 FGC=0 HEC=0 FEC=0)
CPU 时间 = 0 实际时间 = 0 逻辑视图堆内存 = 0/3/3 已完成运算数 = 20 中的 10 个
耗时 = 7
2. 结果冗余消除(Result Redundancy Elimination)
Calibre nmDRC 在运行期间,会自动合并所有完全相同的图层运算。若两个运算的关键字、参数和输入数据均一致,则判定为相同运算。
例如,在以下两条规则检查语句中,Calibre nmDRC 会识别出定义 x 和 p 的运算完全相同,定义 y 和 q 的运算也完全相同:
适用场景
- 跨规则的重复层定义(如多个规则均需
poly OR diff中间层)。 - 全局与局部重复操作(无需将中间层定义在全局 scope,工具自动识别)。
示例
svrf
ABC {
x = poly OR diff ; 与DEF规则中的p操作相同,自动合并
y = x INSIDE metal
}
DEF {
p = diff OR poly ; 顺序不影响,工具识别为相同操作
q = p INSIDE metal
}
需要注意的是,在规则文件中重复定义图层运算,不会影响文件的编译和执行。无论重复的运算位于全局作用域(规则检查语句外部)、局部作用域(规则检查语句内部),还是同时存在于两个作用域,这一结论均成立。对于 Calibre nmDRC 工具而言,无需为了避免图层运算重复而刻意将运算定义在全局作用域。
3. 图形运算调度
Calibre nmDRC 会自动调度所有必要的图层运算,以满足某一图层运算的数据依赖需求。
例如,假设检查集所需的某一图层运算引用了规则文件中定义的图层 A。Calibre nmDRC 会先找到图层 A 的定义,并执行其对应的运算。这是一个递归过程------ 工具会逐层追溯生成图层 A 所需的所有运算,直至从数据库中读取到原始图层的数据为止。
Calibre nmDRC 会将所有相关的图层运算纳入并发执行和冗余消除的调度流程,具体逻辑可参考前文的「结果冗余消除」章节。对于检查集运算所需的任意图层运算,在检查集的一次执行过程中,工具仅会运行一次。Calibre nmDRC 只会执行满足检查集数据需求所必需的运算。
通常情况下,Calibre nmDRC 会按照规则文件中规则检查语句的书写顺序执行检查。当某一图层的所有相关规则检查执行完毕后(即该图层不再参与后续任何规则检查),工具会将该图层从内存中删除。你可以通过优化规则文件的语句顺序来缩短运行时间 ------ 建议将针对同一组图层的所有规则检查集中连续排列。下文中会对此展开详细讨论。
4.最小化DRC处理能力与最小化运行时间
Calibre nmDRC 在运行过程中动态生成派生图层数据,并在数据不再被需要时,立即删除所有原始图层和派生图层数据。而部分其他工具的处理逻辑是:先一次性生成所有派生图层数据,再在运行结束后统一删除。Calibre nmDRC 采用的策略是延迟数据生成 (仅在需要时生成)和及时数据清理(不再需要时立即删除),以此最大化工具的处理能力。
Calibre nmDRC 的具体执行流程如下:
-
对数据库执行一次扫描,生成检查集所需的所有原始图层和图层集。注意:规则文件中定义但本次 DRC 运行不需要的图层(即检查集中无任何运算需要将其作为输入),不会被生成。
-
若检查集需要进行连接关系提取,则按照规则文件中
CONNECT和SCONNECT运算的书写顺序执行这两个操作。 -
按照规则文件中规则检查语句的书写顺序,执行检查集中的语句。执行一条规则检查语句,等价于:按照该语句内部的顺序,生成所有输出运算对应的派生图层,并将每个派生图层映射写入 DRC 结果数据库。
基于上述执行顺序,生成派生图层时需遵循以下原则,这些原则有助于你合理排列规则文件中规则检查语句的顺序,以最大化工具处理能力:
-
除非因并发执行机制,Calibre nmDRC 已提前生成某一图层,否则在运行过程中,工具只会在该图层被实际需要时,才会生成对应的派生图层(包括规则检查语句中输出运算生成的图层)。
-
所有图层(无论原始图层还是派生图层),仅会在内存中保留至不再被需要为止,随后会被 Calibre nmDRC 立即删除。
四、性能优化终极方案:最大化容量与最小化运行时间
1. 核心优化原则
Calibre nmDRC 的数据管理逻辑是 "延迟生成、即时删除 ":仅在需要时生成层数据,用完后立即释放内存。优化规则文件的核心是减少中间层数据量、避免重复计算、优先使用拓扑操作。
2. 关键优化手段(附规则示例)
(1)联合检查(Conjunctive Checks):减少中间层数据
将复杂逻辑拆分为多个小范围检查,避免生成大规模中间层(如 AND 操作)。
以如下设计规则为例:
所有金属接触孔必须位于金属层内部,且同时需位于多晶硅层或扩散层的其中一个内部。
该规则的含义是,金属接触孔的作用是连接金属层与多晶硅层,或连接金属层与扩散层。实现该检查的一种方式如下:
反例(低效):
svrf
metal_contact_check {
x = poly OR diff ; 生成大规模中间层x
y = x AND metal ; 生成大规模中间层y
contact NOT INSIDE y ; 基于大层y计算,速度慢
}
这种实现方式存在一个问题:在大规模设计中,中间图层 x 和 y 可能会生成海量数据,进而导致 AND 运算和 NOT INSIDE 运算的执行速度远低于预期。你可以通过联合检查的方式优化这条规则,减少中间数据的生成量,从而提升运行速度,且优化后的检查精度与原规则完全一致。优化后的规则如下:
正例(高效):
svrf
metal_contact_check {
bad1 = contact NOT INSIDE metal ; 小范围错误层(仅违规接触)
x = contact NOT INSIDE diff ; 小范围中间层
bad2 = x NOT INSIDE poly ; 小范围错误层
bad1 OR bad2 ; 合并错误,运算量小
}
更优方案:使用
ENCLOSURE OUTSIDE ALSO直接实现接触层包裹检查,无需中间层。
OR 运算会合并派生图层 bad1 和 bad2 中的重复对象。由于 bad1 和 bad2 中存储的是违规结果(正常情况下,这两个图层的数据量应该极小,甚至为空),因此最终的 OR 运算对性能的影响可以忽略不计。该规则中唯一的中间图层 x,其数据量通常仅为原始接触孔图层的三分之一左右。(不过在实际应用中,对于这类接触孔检查,使用 ENCLOSURE 运算的 OUTSIDE ALSO 选项,效率会更高。)
编写图层派生规则时,需遵循的核心原则是:尽可能减少派生图层中的多边形或边的数量。基于精简后的派生图层执行后续运算,速度会显著提升。
一般来说,拓扑运算的执行速度快于尺寸测量运算(即使用尺寸约束条件的运算)。因此,在功能满足需求的前提下,优先使用拓扑运算而非尺寸测量运算,往往能提升工具性能。
(2)线宽 / 间距检查优化:优先拓扑操作,避免大约束
通常情况下,若其他运算能够实现相同的检查功能,应尽量避免使用尺寸检查运算。尺寸检查运算的执行速度慢于其他图层运算,原因在于这类运算需要计算大量边之间的距离,计算开销较大。
- 替代维度检查(INT/EXT) :用
RECTANGLE/SIZE等拓扑操作替代维度测量,速度提升 10~100 倍。 - 避免大约束值 :大约束(如
EXT pad metal2 < 32)会导致工具遍历大量无关多边形,需先过滤数据。
示例 1:接触尺寸检查优化
接触孔检查就是一个典型的例子。例如,针对如下设计规则:
接触孔必须为矩形,宽度需大于等于 0.10,且小于等于 0.15。
| 低效(维度检查) | 高效(拓扑操作) |
|---|---|
INT (contact) >= 0.10 <= 0.15 ABUT < 90 |
NOT RECTANGLE contact >= 0.10 <= 0.15 BY >= 0.10 <= 0.15 |
| 需测量所有接触边缘,速度慢 | 直接过滤非矩形 / 尺寸不符的接触,速度快 |
该检查中使用的约束值,相较于典型的图形尺寸而言过于庞大,且设计中的 metal2 图层可能包含大量多边形。Calibre nmDRC 并未针对这类场景做优化 ------ 工具无法自动忽略电路中间区域那些完全不可能与焊盘产生相互作用的 metal2 图形,因此这条检查的执行速度会非常慢。
提示
为避免因使用大约束值导致的性能损耗,应尽可能减少尺寸检查运算需要处理的图层数据量。可通过精心设计的图层派生规则,过滤掉无关的图形对象。
由于多边形拓扑运算的速度快于尺寸检查运算,且焊盘图形的数量通常极少,因此以下规则可显著提升运行速度:
示例 2:大间距检查优化(32um 间距)
| 低效(直接大约束) | 高效(先过滤数据) |
|---|---|
EXT pad metal2 < 32 |
X = SIZE pad BY 32.1 ; 扩大pad范围,覆盖检查区域<br>Y = metal2 NOT OUTSIDE X ; 过滤无关metal2<br>EXT pad Y < 32 ; 仅对过滤后的数据检查 |
| 遍历所有 metal2 多边形,速度极慢 | 仅处理 pad 周边的 metal2,数据量减少 90%+ |
关于这条优化后的检查规则,需注意以下两点:
-
SIZE BY运算中选择 32.1 作为扩展值,带有一定的主观性。扩展尺寸需略大于待检查的约束距离,以确保所有可能引发违规的 metal2 多边形都被纳入检查范围。 -
所有位于图层
X内部或与X接触的 metal2 多边形,都会被输出至图层Y。这类多边形的数量通常很少,因此通过生成图层X和Y,可以过滤掉所有不相关的 metal2 图形。
该派生规则的设计意图是:提取 layer1 多边形之间间距大于 30.0 且位于单元边界内的区域,并将这些区域存入图层 x,用于后续检查。
假设 layer1 图层的图形密度极高,那么这条派生规则的执行效率会很低 ------ 原因是约束值的下限过大,且约束区间的范围也过大。
当需要执行
EXTERNAL类型的尺寸测量,且测量区间较大时,可使用EXPAND EDGE或SIZE运算编写更高效的规则。此外,也可考虑使用DFM SPACE运算。
对于上述图层 x 的派生需求,layer1 图层既可能是派生边图层,也可能是多边形图层。针对这两种情况,以下派生规则的运行效率远高于 EXTERNAL 运算。
(3)层操作调度:合理排序规则
- 同一层规则集中放置:将涉及同一层的所有规则连续编写,工具处理完该层后立即释放内存,避免重复加载。
- 复用中间层优先定义 :将多个规则共用的中间层(如
poly OR diff)提前定义,减少重复生成。
(4)大区间隔测量优化:用 EXPAND EDGE/SIZE 替代 EXT
对于 EXT layer > 30 < 90 这类大区间隔测量,EXT 操作效率低,推荐用拓扑操作替代。
场景 1:输入为边缘层(Derived-Edge)
这条派生规则完全规避了尺寸检查运算,同时采用了减少图层运算数据量的优化技巧。EXPAND EDGE 运算会合并大量多边形,从而让后续的 INTERACT 运算执行得非常迅速。
svrf
// 替代 EXT layer1 > 30.0 < 90.0 OPPOSITE REGION
w = EXPAND EDGE layer1 OUTSIDE BY 15.0 ; 合并30um内的边缘
y = EXTENT DRAWN ORIGINAL ; 获取芯片范围
z = y INTERACT w > 1 ; 筛选出间隔>30um的区域(w有多个形状)
layer1_big = w INTERACT z ; 最终需要的区域,无维度计算
场景 2:输入为多边形层(Polygon):
本情况与情况 1 的唯一区别在于,使用 SIZE 运算替代 EXPAND EDGE 运算。
svrf
// 替代 EXT layer1 > 30.0 < 90.0 OPPOSITE REGION
w = SIZE layer1 BY 15.0 ; 扩大多边形,合并30um内的形状
y = EXTENT DRAWN ORIGINAL
z = y INTERACT w > 1
layer1_big = w INTERACT z
这类派生规则存在一个缺点:结果的精度不如 EXTERNAL 运算 ------ 其输出结果更接近使用正方形度量 (SQUARE metric)的计算结果,而非 EXTERNAL 运算默认使用的欧几里得度量(Euclidean metric)。但你可以结合原始版图图形来分析这两种情况下的结果,从而判断哪些边符合原始规则的约束条件。
若要让结果更接近欧几里得度量的计算精度,可以移除 layer1 多边形上的小凸角,仅在拐角处保留小的 45 度边。
3. 多边形分割(Polygon Segmentation)
默认情况下,若 Calibre nmDRC 生成的 DRC 结果多边形的顶点数超过 4096 ,工具会自动对该多边形进行分割。可以通过 DRC MAXIMUM VERTEX 规格语句,控制多边形分割的顶点数上限。
需要注意的是,若 DRC MAXIMUM VERTEX 语句指定的数值超过 4096,Calibre nmDRC 会按照该数值执行分割;但部分 DRC 结果数据库格式(例如 ASCII 格式)不支持存储顶点数超过 4096 的多边形。因此,针对这类输出数据库格式,需限制结果多边形的顶点数。具体限制如下:
-
Calibre 读取 GDSII 多边形时,顶点数上限为 8191;读取 OASIS 多边形时,无实际顶点数限制,但为保证最优性能,建议将单个多边形的输入顶点数控制在 100 万以内。
-
Pyxis 版图模板数据库的顶点数上限为 4096。
-
Calma GDSII 数据库格式规范中规定的顶点数上限为 200,部分工具会强制执行该限制,但 Calibre 不受此限制约束。
DRC MAXIMUM VERTEX ALL 配置表示:输出 OASIS 格式时,顶点数上限为 2³²;输出 GDSII 格式时,顶点数上限为 8190。但对于 ASCII 格式的结果数据库,顶点数上限应设置为 4096。另外,Calibre 读取 GDSII 格式数据时,顶点数上限为 8191;读取 OASIS 格式数据时,顶点数上限为 2³²。
Calibre nmDRC 采用专用的多边形分割算法,对顶点数超过 DRC MAXIMUM VERTEX 限值的结果多边形进行分割。分割后生成的多个多边形(称为多边形片段),其顶点数均满足限值要求,且所有片段合并后的图形与原始多边形完全一致。
Calibre nmDRC 会在执行多边形分割后,统计 DRC 结果的数量。这些结果数量会被写入 DRC 结果数据库,或体现在各类 DRC 提示信息中。
每当有结果多边形被分割时,工具都会发出一条警告信息(每个被分割的多边形对应一条警告)。这是因为多边形分割可能会导致某些运算的结果产生歧义。例如,当顶点数较多的多边形被分割后,生成的多边形片段的边可能会偏离设计网格(多边形分割算法不遵循用户定义的网格)。若你期望 DRC 掩膜结果输出的边都严格对齐网格,这种情况可能会造成困扰。但实际上,这并非严重问题 ------ 所有多边形片段都位于同一图层,当这些片段后续被 Calibre 读取时,会被重新合并,偏离网格的边会在合并过程中被消除,最终恢复为原始的、对齐网格的大顶点数多边形。大多数 DRC 工具都会执行此类合并操作。
掩膜输出中另一个可能引发歧义的情况是:多边形片段可能会出现一些非预期的角度。这是因为多边形分割过程中,并未考虑角度相关的判定条件。但这些在孤立查看片段时,看似属于 DRC 违规的角度,会在后续工具读取并合并片段时被消除,最终还原的原始大顶点数多边形不会存在异常角度。
在基于面积的 DRC 检查中,工具会先根据指定的面积条件筛选结果多边形,再对剩余的多边形执行分割操作。但 DRC 结果数据库中记录的结果数量,以及用于控制结果数量上限的统计值,均是在多边形分割操作完成后计算得出的。
核心配置
- 语法 :
DRC MAXIMUM VERTEX <number> | ALL - 默认值:4096(顶点数超 4096 时自动分割)。
- 关键限制 :
- ASCII 结果数据库:建议限制为 4096(工具默认处理)。
- GDSII 输出:最大 8190 顶点(
ALL对应 8190)。 - OASIS 输出:最大 2³² 顶点(
ALL对应无限制)。
注意事项
- 分割后多边形的合并:后续导入 Calibre 时,工具会自动合并分割后的多边形,不影响验证结果。
- 警告提示:每个被分割的多边形会输出一次警告,分割边缘可能 "离栅"(off-grid),但合并后恢复正常。
五、编译与退出值:调试与自动化集成
1. 规则文件编译
-
编译流程:调用 nmDRC 时自动编译规则文件,语法错误会终止运行并输出错误信息(含位置和原因)。调用 Calibre nmDRC 工具时,必须指定规则文件的名称。Calibre nmDRC 执行命令的第一步,就是自动编译该规则文件。
-
错误处理 :逐次检测错误(一次仅提示一个),需修复后重新运行,常见错误包括:规则名重复、大括号缺失、层操作语法错误。若因致命错误导致 Calibre nmDRC 无法完成任何请求的处理,工具会以非零状态码 退出。在 UNIX Shell 环境中,你可以通过检查
$?环境变量的值,获取工具的退出状态。用于脚本自动化判断运行结果,UNIX 系统通过$?变量获取:
2. 退出值(Exit Values)
0:运行成功(无致命错误,可能存在 DRC 错误)。- 非
0:致命错误(如规则文件语法错误、版图读取失败、内存不足)。
自动化脚本示例(Shell)
bash
运行
#!/bin/sh
calibre -drc -hier rules.svrf # 层级化运行DRC
if [ $? -eq 0 ]; then
echo "DRC运行成功,生成结果数据库"
calibre -rve results.db # 自动打开RVE查看结果
else
echo "DRC运行失败,查看日志获取错误信息"
cat calibre.log | grep "ERROR" # 筛选错误日志
fi