〜表データ処理の基本とクリティカルパス分析〜
📝 はじめに
前回は、dataclassを使ってTiming Reportのパス情報を
Startpoint・Endpoint・Slackを1つのオブジェクトに整理 しました。
今回はさらに一歩進めて、pandasを使ってSlackワースト10を抽出します。
実務でよく使う「クリティカルパス分析」をPythonで自動化できるようになります。
📦 pandasとは?
pandasは、Pythonで表形式データを扱うためのライブラリです。
- CSVやリストを簡単に読み込み可能
- 並べ替え・フィルタ・集計に強い
- Excelより高速で自動化向き
インストールしていない場合は以下を実行してください。
pip install pandas
✍️ クラスからpandasへ
まずは前回のクラスデータをリストに格納してあるとします。
それを pandasのDataFrame に変換してみましょう。
import re
import pandas as pd
from dataclasses import dataclass, asdict
@dataclass
class TimingPath:
startpoint: str
endpoint: str
slack: float
filename = "timing_sample.rpt"
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)))
# pandas DataFrameに変換
df = pd.DataFrame([asdict(p) for p in paths])
print(df)
出力例:
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
🔍 Slackワースト10を抽出
pandasを使うと、並べ替えや抽出が一瞬でできます。
# Slackを昇順で並べ替え(小さい=悪いパス)
df_sorted = df.sort_values(by="slack", ascending=True)
# ワースト10を抽出
worst10 = df_sorted.head(10)
print("=== Slack ワースト10 ===")
print(worst10)
出力例(サンプルなので1件のみ):
=== 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
💡 応用ポイント
df[df["slack"] < 0]
→ タイミング違反パスだけを抽出df.to_csv("worst10.csv", index=False)
→ 抽出結果をCSVとして保存df.groupby("startpoint")["slack"].min()
→ Startpointごとの最悪Slackを一覧化
✅ まとめ
- pandasを使えば、複数パスを簡単に並べ替え・抽出できる
- Slackの小さい順に並べれば「クリティカルパス分析」が自動化できる
- Excelより速く、再現性のある解析が可能になった