3. DRC结果文件解析:以Calibre .drc文件为例
DRC运行完成后,工具会生成一个结果文件,其中记录了所有违反设计规则的错误信息。对于Calibre工具,默认的DRC结果文件后缀为.drc。能否高效、准确地解析这个文件,直接决定了后续修复工作的效率。本节将深入剖析.drc文件的结构、错误标记(Marker)的含义,并给出标准化的读取与解析方法。
3.1 DRC结果文件的结构
一个典型的Calibre DRC结果文件(.drc)采用分层结构,主要包含以下四个部分:
| 结构层级 | 内容说明 | 示例片段 |
|---|---|---|
| 文件头 | 包含工具版本、运行日期、规则文件路径、顶层单元名称等元信息。 | // Calibre DRC Report v2023.3// Rule File: ./drc_rules/28nm_metal.drc |
| 规则摘要 | 列出所有被检查的规则名称、检查次数及通过/失败状态。 | RULE SUMMARY: M1_SPACE (PASS: 0, FAIL: 12) |
| 错误详情 | 按规则分组,列出每个错误的具体坐标、层次、关联的几何图形ID。 | M1_SPACE(12): @(x=123.45, y=678.90) LAYER M1 |
| 文件尾 | 包含总错误数、运行时间、内存消耗等统计信息。 | TOTAL VIOLATIONS: 47CPU TIME: 12.34s |
关键点: 错误详情部分是解析的核心。每个错误条目都包含一个唯一的错误编号(如
M1_SPACE(12)),该编号与版图编辑器中高亮显示的Marker编号一一对应。
3.2 错误标记(Marker)的含义
在Calibre RVE(Results Viewing Environment)或集成到版图编辑器(如Virtuoso、ICV)中,每个DRC错误都会以一个可视化的Marker呈现。Marker不仅是一个高亮框,它携带了丰富的属性信息:
- 形状(Shape):通常是一个多边形或矩形,精确标出违反规则的具体几何区域。
- 层次(Layer):指明错误发生在哪一层(如M1、VIA1、OD)。
- 规则名称(Rule Name):关联到DRC规则文件中的具体检查项。
- 坐标(Coordinate):Marker中心点或边界框的精确坐标,用于快速定位。
- 严重等级(Severity):部分工具支持将错误标记为Error(必须修复)或Warning(建议修复)。
实用技巧: 在版图编辑器中,双击一个Marker通常会直接跳转到该错误位置,并自动缩放至合适视图。利用Marker的“属性”面板,可以快速查看该错误涉及的相邻图形ID,便于追溯。
3.3 如何读取和解析DRC结果文件
解析.drc文件有两种主流方式:手动阅读(适用于小规模设计或快速排查)和脚本自动化解析(适用于大规模设计或批量处理)。
3.3.1 手动阅读方法
- 打开文件:使用任何文本编辑器(如Vim、Notepad++)打开
.drc文件。 - 定位规则摘要:搜索
RULE SUMMARY,快速了解哪些规则失败及失败次数。 - 跳转至错误详情:找到失败次数最多的规则,向下滚动至对应的
ERROR DETAILS段落。 - 读取坐标:记录每个错误的坐标和层次,在版图编辑器中手动定位。
3.3.2 脚本自动化解析(Python示例)
对于包含数千个错误的大型设计,手动解析不可行。以下是一个使用Python解析.drc文件并提取关键信息的示例脚本:
import re
def parse_calibre_drc(file_path):
violations = []
current_rule = None
pattern = r'(\w+)\s*\((\d+)\):\s*@\(x=([\d.]+),\s*y=([\d.]+)\)\s*LAYER\s+(\w+)'
with open(file_path, 'r') as f:
for line in f:
# 检测规则开始
rule_match = re.match(r'RULE SUMMARY:\s+(\w+)', line)
if rule_match:
current_rule = rule_match.group(1)
continue
# 检测错误条目
error_match = re.search(pattern, line)
if error_match and current_rule:
violations.append({
'rule': current_rule,
'index': int(error_match.group(2)),
'x': float(error_match.group(3)),
'y': float(error_match.group(4)),
'layer': error_match.group(5)
})
return violations
# 使用示例
drc_file = './results/chip_top.drc'
errors = parse_calibre_drc(drc_file)
print(f"共发现 {len(errors)} 个DRC错误")
for err in errors[:5]: # 打印前5个
print(f"规则: {err['rule']}, 坐标: ({err['x']}, {err['y']}), 层次: {err['layer']}")
注意: 上述正则表达式基于Calibre默认输出格式。不同版本的Calibre或自定义规则可能产生格式差异,实际使用时需根据具体文件格式调整正则表达式。
3.4 DRC结果文件解析流程(SVG图)
下图展示了从原始DRC结果文件到可执行修复动作的完整解析流程:
3.5 常见解析陷阱与避坑指南
| 陷阱场景 | 表现 | 解决方案 |
|---|---|---|
| 坐标格式不一致 | 部分错误使用科学计数法(如1.23e-4),导致解析失败。 |
在正则表达式中增加对科学计数法的支持:[\d.eE+-]+。 |
| 层次名称含特殊字符 | 层次名称为M1_DUMMY或VIA1[0],下划线或方括号干扰分割。 |
使用非贪婪匹配或明确字符集:[\w\[\]]+。 |
| 多行错误描述 | 某些复杂错误(如天线效应)的描述跨越多行,单行正则无法捕获。 | 采用状态机模式,记录多行上下文,直到遇到下一个错误编号或规则结束。 |
| 文件编码问题 | 从不同操作系统生成的.drc文件可能使用UTF-8或Latin-1编码。 |
在脚本中指定编码:open(file_path, 'r', encoding='utf-8', errors='ignore')。 |
最佳实践: 在项目初期,建议先手动解析一个小型
.drc文件(包含10~20个错误),验证解析脚本的正确性。确认无误后,再应用于全芯片的DRC结果文件。同时,保留原始文件备份,避免因解析错误导致数据丢失。