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: 47
CPU 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 手动阅读方法

  1. 打开文件:使用任何文本编辑器(如Vim、Notepad++)打开.drc文件。
  2. 定位规则摘要:搜索RULE SUMMARY,快速了解哪些规则失败及失败次数。
  3. 跳转至错误详情:找到失败次数最多的规则,向下滚动至对应的ERROR DETAILS段落。
  4. 读取坐标:记录每个错误的坐标和层次,在版图编辑器中手动定位。

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结果文件到可执行修复动作的完整解析流程:

DRC结果文件解析流程 DRC结果文件解析与修复流程 原始 .drc 文件 规则摘要提取 错误详情解析 坐标与层次映射 版图定位与高亮 修复决策与执行 解析要点: • 规则摘要帮助快速定位高频错误类型,优先修复数量最多的规则。 • 错误详情中的坐标是版图定位的关键,建议结合脚本批量提取。 • 修复决策需结合设计规则手册(DRM)确认最小间距/宽度等参数。

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结果文件。同时,保留原始文件备份,避免因解析错误导致数据丢失。