〜Timing Reportを数値とペアで扱えるようにする〜
📝 はじめに
これまでの記事では、
- ファイルの読み込みと行数・文字数カウント
- grepのようにキーワードを含む行を抽出
を学んできました。
今回はさらに一歩進めて、Timing Reportから「数値だけ」や「ペアの情報」を正規表現で抽出する方法を紹介します。
🎯 やりたいこと
slack
行から 数値だけ を抜き出すStartpoint
とEndpoint
をセットで取り出す
これができると、「どのパスで slack が何nsか」を一覧にできるようになります。
✍️ コード例
以下のスクリプトを extract_info.py
として保存してください。
#```python
#extract_info.py
#Timing Reportからslack数値とStartpoint/Endpointを抽出する
import re
filename = "timing_sample.rpt"
with open(filename, "r", encoding="utf-8") as f:
text = f.read()
#1. slack の数値を抽出
slack_pattern = r"slack.?([-+]?\d.?\d+)"
slack_matches = re.findall(slack_pattern, text, flags=re.IGNORECASE)
#2. Startpoint と Endpoint を抽出
start_pattern = r"Startpoint:\s(.+)" end_pattern = r"Endpoint:\s(.+)"
start_matches = re.findall(start_pattern, text)
end_matches = re.findall(end_pattern, text)
# 出力
print("=== Slack values ===")
for s in slack_matches:
print("slack:", s)
print("\n=== Startpoint / Endpoint pairs ===")
for sp, ep in zip(start_matches, end_matches):
print(f"Startpoint: {sp} -> Endpoint: {ep}")
実行方法
ターミナルで次のコマンドを実行します。
python extract_info.py
出力例:
=== Slack values ===
slack: 0.11
=== Startpoint / Endpoint pairs ===
Startpoint: U1/clk (rising edge-triggered flip-flop clocked by CLK) -> Endpoint: U5/data (rising edge-triggered flip-flop clocked by CLK)
🔍 解説
- 正規表現(Regex)
slack.*?([-+]?\d*\.?\d+)
slack
の後に出てくる数値(整数・小数・±符号)を抽出
Startpoint:\s*(.+)
Startpoint:
の後ろに続く文字列をすべて取得
- re.findall()
- マッチしたものをリストで返してくれる便利関数
- zip(start_matches, end_matches)
- StartpointとEndpointをペアでまとめてループ
💡 応用ポイント
- 複数パスがある場合でも、StartpointとEndpointをペアで対応付け可能
- Slack値と組み合わせれば「Startpoint → Endpoint の Slack値一覧」を作れる
- CSV出力にすればExcelで簡単に分析可能
✅ まとめ
- 正規表現を使えば slackの数値だけ 抜き出せる
- StartpointとEndpointをセットで取得できるようになった
- これで 「どのパスのSlackが何か」 を整理できる基礎が整った