〜学習の総仕上げ:実務で使える解析ツール〜
📝 はじめに
これまでの記事で、
- ファイル入出力や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化してドラッグ&ドロップで使えるようにする
ぜひ自分の現場に合わせて改良してみてください。