〜結果をそのまま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
📊 出力される成果物
- timing_summary.csv
- Startpoint, Endpoint, Slack の一覧
- Excelでそのままフィルタ・並べ替え可能
- 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で一括作成できるようになった