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 描述跨层关系。层次化引用写错,是初学者最常见的“匹配不到”原因之一。
四、常用操作符:让匹配更精确
操作符分为两类:空间关系操作符和逻辑组合操作符。空间关系操作符包括 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 覆盖”。操作步骤如下:
- 新建规则文件
first_match.rul,声明单位units = micron。 - 定义目标图形:
contact = pmMatch(layer = M1, shape = rectangle(0.2, 0.2))。 - 定义上下文:
cover = pmMatch(layer = M2, relation = overlaps(contact))。 - 执行匹配:
result = pmMatch(target = contact, context = cover, output = "contact_with_m2")。 - 运行 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" |
掌握以上语法后,你已经可以写出第一个可运行的匹配规则。下一步是把它应用到真实版图上,观察匹配结果与预期是否一致,并逐步加入更复杂的图形描述和关系组合。