4. Pattern Matching规则语法入门

Pattern Matching 的规则文件本质上是一段“用几何语言写成的查询语句”。它要回答三个问题:找什么图形、在哪个层次找、找到后怎么处理。Calibre 的 PM 规则通常写在 .pm 或 .rul 文件中,由 pmMatch 系列语句驱动,配合图形描述块和层次化引用完成匹配。本节从一个最小可运行的任务出发,把语法骨架一次讲清。

一、最小匹配语句的骨架

一个最简单的匹配任务由“定义图形 + 执行匹配 + 输出结果”三部分组成。下面是一个可直接参考的示例,用于在版图中查找“一个矩形接触孔被两条金属线夹住”的结构:

// 1. 定义待匹配图形
pattern = pmMatch(
    layer = M1,
    shape = rectangle(width = 0.2, height = 0.2)
)

// 2. 定义上下文关系
context = pmMatch(
    layer = M2,
    shape = rectangle(width >= 0.5),
    relation = overlaps(pattern)
)

// 3. 执行匹配并输出
result = pmMatch(
    target = pattern,
    context = context,
    output = "match_result"
)

这段代码里,pmMatch 是核心语句,layer 指定工艺层,shape 描述几何形状,relation 描述图形之间的空间关系,output 指定结果输出层。实际项目中,语句顺序可以调整,但“先定义、后引用”的逻辑必须遵守。

二、图形描述方式:从矩形到多边形

PM 支持多种图形描述方式,最常用的是矩形、多边形和路径。矩形用 rectangle(width, height) 描述,适合接触孔、通孔等规则图形;多边形用 polygon(points) 描述,适合 L 形、T 形等复杂结构;路径用 path(vertices) 描述,适合金属走线。图形描述还可以附加约束条件,例如 width >= 0.5、height <= 1.0,这些约束在匹配时作为过滤条件使用。

需要注意的是,图形描述中的尺寸单位默认与版图数据库一致,通常是微米。如果版图使用纳米,需要在规则文件开头用 units 语句声明,否则匹配结果会出现数量级偏差。

三、层次化引用:在正确的层级找图形

版图是层次化的,同一个图形可能出现在顶层,也可能被多次例化在子单元中。PM 提供三种层次化引用方式:flat 表示忽略层次、把所有图形打平后匹配;hier 表示保留层次、只在同一层级内匹配;cell 表示限定在指定单元内匹配。选择哪种方式,取决于你要找的结构是否跨越层次边界。

例如,查找“标准单元内部的接触孔”时,用 cell = "STD_CELL" 限定范围即可;查找“跨单元的信号线连接”时,则要用 flat 或 hier 配合 relation 描述跨层关系。层次化引用写错,是初学者最常见的“匹配不到”原因之一。

Pattern Matching 规则语法结构图 规则文件结构 units 单位声明 (可选,默认微米) pattern 图形定义 rectangle / polygon / path context 上下文关系 overlaps / inside / adjacent pmMatch 执行匹配 target + context + output output 结果输出 层名 / 文件 / 标记 层次化引用:flat / hier / cell 匹配执行流程 ① 读取版图数据库 GDS / OASIS 输入 ② 按 layer 提取图形 M1 / M2 / VIA 等 ③ 按 shape 过滤形状 尺寸 / 角度 / 顶点数 ④ 按 relation 匹配关系 overlaps / inside / adjacent ⑤ 输出匹配结果 常用操作符与关系 overlaps(A) 与 A 有重叠区域 inside(A) 完全位于 A 内部 adjacent(A, dist) 与 A 距离为 dist encloses(A) 完全包围 A AND / OR / NOT 逻辑组合条件 width / height / area 尺寸约束操作符 关系可嵌套组合 relation = overlaps(inside(A))

四、常用操作符:让匹配更精确

操作符分为两类:空间关系操作符和逻辑组合操作符。空间关系操作符包括 overlaps(重叠)、inside(包含于)、adjacent(相邻)、encloses(包围)等,它们描述两个图形之间的几何关系。逻辑组合操作符包括 AND、OR、NOT,用于组合多个条件。

例如,要查找“被 M2 完全包围且面积大于 0.1 平方微米的 M1 图形”,可以写成:

result = pmMatch(
    target = pmMatch(layer = M1, shape = rectangle(area > 0.1)),
    context = pmMatch(layer = M2, relation = encloses(target)),
    output = "enclosed_m1"
)

这里 encloses(target) 表示 M2 包围 M1,area > 0.1 是尺寸约束。操作符可以嵌套,但嵌套层级不宜过深,否则可读性和调试效率都会下降。

五、第一个简单图形匹配任务

现在完成一个完整任务:在版图中查找“宽度为 0.2 微米、高度为 0.2 微米的 M1 接触孔,且其上方有 M2 覆盖”。操作步骤如下:

  1. 新建规则文件 first_match.rul,声明单位 units = micron。
  2. 定义目标图形:contact = pmMatch(layer = M1, shape = rectangle(0.2, 0.2))。
  3. 定义上下文:cover = pmMatch(layer = M2, relation = overlaps(contact))。
  4. 执行匹配:result = pmMatch(target = contact, context = cover, output = "contact_with_m2")。
  5. 运行 Calibre,检查输出层 contact_with_m2 中是否有图形。

运行后,如果输出层为空,优先检查三件事:M1 和 M2 的层号是否与版图一致;rectangle(0.2, 0.2) 的尺寸是否与版图实际尺寸匹配;overlaps 是否写成了 inside 或 adjacent。这三个问题是初学者最常遇到的“匹配不到”原因。

调试建议:先用 flat 模式跑一遍,确认图形确实存在;再切换到 hier 或 cell 模式,观察结果变化。如果 flat 有结果而 hier 没有,说明目标图形跨越了层次边界,需要调整层次化引用方式。

六、语法要点速查

语法元素 作用 示例
pmMatch 核心匹配语句 pmMatch(layer = M1, shape = ...)
layer 指定工艺层 layer = M1
shape 描述图形几何 rectangle(0.2, 0.2)
relation 描述空间关系 overlaps(contact)
output 指定结果输出 output = "result_layer"
flat / hier / cell 层次化引用方式 cell = "STD_CELL"

掌握以上语法后,你已经可以写出第一个可运行的匹配规则。下一步是把它应用到真实版图上,观察匹配结果与预期是否一致,并逐步加入更复杂的图形描述和关系组合。