仕上げ編③:Timing Report Parserを完成させる

Parser

〜学習の総仕上げ:実務で使える解析ツール〜

📝 はじめに

これまでの記事で、

  • ファイル入出力やgrep代替の基礎
  • 正規表現での抽出
  • dataclassによるデータ構造整理
  • pandasによるワースト10抽出
  • matplotlibによる可視化
  • コマンドライン対応
  • CSV+グラフ自動生成

を順に学んできました。

今回はそれらを 1つに統合して「完成版Timing Report Parser」 として仕上げます。
これで「誰でもすぐに使えるPythonツール」が完成します。


🎯 ツールの機能

  • コマンドライン引数で解析対象ファイルを指定
  • Startpoint / Endpoint / Slack を抽出
  • CSV形式で保存
  • Slack分布をグラフで自動生成
  • Slackワースト10をターミナルに表示

✍️ 完成版コード

以下を timing_parser.py として保存してください。

import re
import sys
import pandas as pd
import matplotlib.pyplot as plt
from dataclasses import dataclass, asdict

@dataclass
class TimingPath:
    startpoint: str
    endpoint: str
    slack: float

def parse_timing_report(filename: str):
    with open(filename, "r", encoding="utf-8") as f:
        text = f.read()

    start_matches = re.findall(r"Startpoint:\s*(.+)", text)
    end_matches   = re.findall(r"Endpoint:\s*(.+)", text)
    slack_matches = re.findall(r"slack.*?([-+]?\d*\.?\d+)", text, flags=re.IGNORECASE)

    paths = []
    for sp, ep, sl in zip(start_matches, end_matches, slack_matches):
        paths.append(TimingPath(startpoint=sp, endpoint=ep, slack=float(sl)))
    return paths

def save_csv(df: pd.DataFrame, filename: str):
    df.to_csv(filename, index=False, encoding="utf-8")
    print(f"[OK] CSV出力完了: {filename}")

def save_histogram(df: pd.DataFrame, filename: str):
    plt.hist(df["slack"], bins=20, edgecolor="black")
    plt.axvline(0.0, color="red", linestyle="--", label="Slack=0 (Critical)")
    plt.title("Slack Distribution")
    plt.xlabel("Slack (ns)")
    plt.ylabel("Path Count")
    plt.grid(True, linestyle="--", alpha=0.7)
    plt.legend()
    plt.savefig(filename)
    print(f"[OK] グラフ保存完了: {filename}")

if __name__ == "__main__":
    if len(sys.argv) < 2: print("使い方: python timing_parser.py ")
        sys.exit(1)

    rpt_file = sys.argv[1]
    csv_out = "timing_summary.csv"
    png_out = "slack_histogram.png"

    try:
        paths = parse_timing_report(rpt_file)
        df = pd.DataFrame([asdict(p) for p in paths])

        # CSV保存
        save_csv(df, csv_out)

        # グラフ保存
        save_histogram(df, png_out)

        # ワースト10表示
        df_sorted = df.sort_values(by="slack", ascending=True)
        print("\n=== Slack ワースト10 ===")
        print(df_sorted.head(10))

    except FileNotFoundError:
        print(f"エラー: ファイル {rpt_file} が見つかりません")

▶️ 実行方法

ターミナルで以下を実行します。

python timing_parser.py timing_sample.rpt

出力例:

[OK] CSV出力完了: timing_summary.csv
[OK] グラフ保存完了: slack_histogram.png

=== Slack ワースト10 ===
                                         startpoint  \
0  U1/clk (rising edge-triggered flip-flop clocked by CLK)   

                                           endpoint  slack  
0  U5/data (rising edge-triggered flip-flop clocked by CLK)   0.11  

成果物:

  • timing_summary.csv → Excelで開ける一覧
  • slack_histogram.png → Slack分布を示すグラフ

✅ まとめ

  • 学習の集大成としてTiming Report Parserを完成させた
  • コマンドラインから呼び出せる実用的なツールになった
  • 出力は「CSV+グラフ+ワースト10表示」で報告資料にそのまま使える

🎉 おわりに

これで「Python初心者」から「Timing Reportを自動解析できる技術者」へのステップアップが完了しました。

このツールは拡張も簡単です。例えば:

  • arrival/required timeを追加抽出する
  • Startpointごとの最悪Slackを一覧化する
  • GUI化してドラッグ&ドロップで使えるようにする

ぜひ自分の現場に合わせて改良してみてください。

タイトルとURLをコピーしました