仕上げ編②:CSV出力+グラフ自動生成で報告資料を時短

Parser

〜結果をそのままExcelとPowerPointに流用〜

📝 はじめに

これまでに、

  • Timing Reportを解析してSlackを抽出
  • コマンドラインで任意のファイルを指定して解析

ができるようになりました。

しかし実務では「結果をExcelにまとめる」「Slack分布を図にする」といった作業も欠かせません。
そこで今回は、CSV出力とグラフ自動生成 を組み合わせて、報告資料を一瞬で作れる仕組みを作ります。


🎯 やりたいこと

  • 解析結果を自動的にCSVに保存
  • 同時にSlack分布グラフをPNGで出力
  • ワンコマンドで「表+グラフ」が揃う

✍️ コード例

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

```python
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

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

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

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

        # === CSV出力 ===
        df.to_csv(csv_out, index=False, encoding="utf-8")
        print(f"CSV出力完了: {csv_out}")

        # === Slack分布をグラフ化 ===
        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(png_out)
        print(f"グラフ保存完了: {png_out}")

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

▶️ 実行方法

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

python parser_report.py timing_sample.rpt

出力例:

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

📊 出力される成果物

  1. timing_summary.csv
    • Startpoint, Endpoint, Slack の一覧
    • Excelでそのままフィルタ・並べ替え可能
  2. slack_histogram.png
    • Slackの分布をヒストグラムで可視化
    • 報告資料に貼り付けて説明が容易

🔍 解説

  • pandas.DataFrame.to_csv()
    → CSV出力をワンライナーで実現
  • matplotlib.pyplot.hist()
    → Slackの分布をヒストグラム表示
  • plt.axvline(0.0, …)
    → クリティカル境界を赤線で強調

💡 応用ポイント

  • Slackワースト10だけを別CSVに保存する
  • StartpointごとにSlackの最小値を集計して表にまとめる
  • 複数ファイルをまとめて解析して比較グラフを出力する

✅ まとめ

  • 解析結果を CSV として保存できるようにした
  • 同時に Slack分布グラフ を自動生成
  • 報告資料にすぐ使えるアウトプットをPythonで一括作成できるようになった
タイトルとURLをコピーしました