3. 规则文件结构优化

在 Calibre 物理验证中,规则文件(Rule File)既是功能描述,也是性能契约。同一套 DRC/LVS 检查意图,用不同的规则结构表达,运行时间可能相差数倍。原因在于 Calibre 的执行模型:规则文件被解析后形成操作序列,每个操作在版图数据库上产生或消费几何图层,而图层数量、操作嵌套深度、条件分支的展开方式,直接决定了内存占用与 CPU 时间。本节聚焦三类最常见的结构性问题——层次化规则编写、条件规则、循环展开,分析它们对运行时间的影响机制,并给出可落地的重构方法。

一、层次化规则编写:让工具替你复用中间结果

Calibre 的规则语言支持通过 LAYER 语句定义派生图层,并允许在后续规则中反复引用。层次化规则编写的核心思想是:把多个检查共用的中间几何结果提取为命名图层,而不是在每个检查里重复推导。例如,若 M1 的间距检查、宽度检查和密度检查都需要“M1 与 M2 的合并区域”,那么先定义 LAYER M1M2_MERGE = M1 OR M2,再让三条规则引用它,Calibre 只需计算一次合并结果。

反之,若在每条规则内部各自写 M1 OR M2,工具会为每条规则分别生成中间图层,导致几何运算重复执行。在版图规模达到数亿图形的 SoC 上,这种重复可能让运行时间从小时级恶化到十小时级。重构方法是:先梳理规则文件中被多次使用的几何表达式,将其提升为顶层命名图层;再检查是否存在“先 OR 后 AND”与“先 AND 后 OR”的等价但代价不同的写法,优先选择中间结果更小、更早被裁剪的表达式顺序。

规则结构对运行时间的影响与重构 未优化结构:重复推导 + 全量展开 版图数据库:M1 / M2 / VIA1 原始图层 规则1:M1 OR M2 → 间距检查 规则2:M1 OR M2 → 宽度检查 规则3:M1 OR M2 → 密度检查 规则4:M1 OR M2 → 覆盖检查 重复几何运算 ×4 循环展开:for i in 1..8 每条迭代生成独立规则块 8 份相似几何操作全部执行 条件规则:IF 条件 THEN 检查 条件在运行时逐图形判断 分支未提前裁剪,全量参与 优化结构:共享图层 + 条件裁剪 + 循环合并 版图数据库:M1 / M2 / VIA1 原始图层 顶层共享:LAYER M1M2 = M1 OR M2 一次计算,多处引用 规则1/2/3/4 均引用 M1M2 几何运算仅执行 1 次 共享复用 条件规则:先裁剪再判断 用 SELECT/INTERACT 缩小图形集 仅对候选图形执行分支检查 循环合并:用参数化图层替代展开 8 次迭代合并为 1 次批量操作 减少规则块数量与调度开销 重构

二、条件规则:把判断从“运行时”前移到“结构时”

条件规则通常用于表达“当某图层存在时才执行某检查”或“根据图形属性选择不同阈值”。Calibre 支持在规则中使用条件判断,但需要区分两种写法:一种是让条件在几何运算之后逐图形判断,另一种是先通过图层选择把候选图形集缩小,再对缩小后的集合执行检查。前者会让大量不满足条件的图形也参与后续运算,后者则提前裁剪了数据规模。

例如,检查“仅当 M1 与 M2 重叠区域宽度小于 0.1μm 时才报错”,若写成先计算全部重叠区域、再逐图形判断宽度,则重叠区域的全量几何运算无法避免。重构方式是先用 INTERACT 或 SELECT 把 M1 与 M2 的交互区域提取出来,再在该子集上做宽度判断。这样,后续操作的输入图形数量可能下降一个数量级。判断依据是:条件规则的重构目标不是“少写几行”,而是让条件尽早参与图层裁剪,使几何运算的输入规模最小化。

三、循环展开:规则块数量与调度开销的权衡

规则文件中常出现对多个金属层、多个电压域或多个间距档位的重复检查。若用循环展开写成 8 份相似规则块,Calibre 会为每份规则块分别建立操作序列,带来额外的解析、调度和中间图层管理开销。更严重的是,若每份规则块内部又各自推导相同的中间图层,重复计算会被放大 8 倍。

重构方法有两种。第一种是参数化合并:把仅参数不同的规则块合并为一条带参数的操作,让工具在一次遍历中处理多个参数。第二种是循环内共享:若无法合并,则把循环体内共用的中间图层提升到循环外,循环内只保留参数相关的差异部分。实际项目中,一个包含 12 个金属层、每层 3 类间距检查的规则文件,经过共享图层与循环合并后,规则块数量可从 36 个降到 12 个左右,运行时间在示例假设下可观察到明显下降。需要强调的是,具体收益取决于版图图形密度、规则复杂度和机器配置,应以实际 profile 结果为准。

四、重构检查清单与判断依据

对规则文件做结构优化时,建议按以下顺序排查:

  • 重复表达式扫描:搜索规则文件中出现两次以上的几何表达式,判断是否可提升为顶层命名图层。
  • 条件位置检查:确认条件判断是否在几何运算之前完成裁剪,避免全量图形参与分支。
  • 循环体依赖分析:检查循环体内是否重复推导相同中间图层,若有则外提。
  • 规则块数量统计:统计展开后的规则块总数,评估是否可用参数化合并减少调度开销。
  • 运行时间对比:重构前后分别用相同版图和相同机器跑一次,记录 Calibre 的 CPU 时间与峰值内存,确认优化有效且未改变检查结果。
重构后必须做结果一致性验证:用同一版图分别跑重构前和重构后的规则文件,对比 DRC 结果数据库中的错误数量、错误类型和坐标范围。若错误数量一致,说明重构未改变检查语义;若不一致,优先检查图层提升是否引入了意外的图形合并或裁剪。
不要为了减少规则块数量而牺牲可读性。层次化规则编写的前提是命名清晰、注释完整。一个难以维护的“高性能”规则文件,在后续工艺迭代中带来的风险可能远大于节省的运行时间。

总结来看,规则文件结构优化的本质是:让 Calibre 尽可能少做重复几何运算,尽可能早地裁剪数据规模,尽可能少地建立独立操作序列。层次化规则解决“重复计算”,条件规则解决“全量参与”,循环展开解决“调度膨胀”。三者共同作用,才能在保持检查语义不变的前提下,把运行时间压到合理区间。