発展編②:pandasでSlackワースト10を抽出する

Parser

〜表データ処理の基本とクリティカルパス分析〜

📝 はじめに

前回は、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より速く、再現性のある解析が可能になった
タイトルとURLをコピーしました