〜実務で使いやすいツールに進化〜
📝 はじめに
これまでの記事では、サンプルファイル名をコード中に直接書き込んで解析してきました。
しかし実務では、毎回違うTiming Reportファイルを扱います。
そこで今回は、コマンドライン引数でファイル名を指定できるように改造します。
これで、ツールとして一気に実用的になります。
🎯 やりたいこと
python parser.py timing_sample.rpt
のように実行できるようにする- どのファイルでも解析できる汎用ツール化
- ファイル未指定やエラー時の処理も加える
✍️ コード例
以下を parser_cli.py
として保存してください。
#```python
import re
import sys
import pandas as pd
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_cli.py ")
sys.exit(1)
filename = sys.argv[1]
try:
paths = parse_timing_report(filename)
df = pd.DataFrame([asdict(p) for p in paths])
print("=== 解析結果 ===")
print(df)
except FileNotFoundError:
print(f"エラー: ファイル {filename} が見つかりません")
▶️ 実行方法
ターミナルで以下のように実行します。
python parser_cli.py timing_sample.rpt
出力例:
=== 解析結果 ===
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
🔍 解説
- sys.argv
→ コマンドライン引数を取得(argv[1]
が指定ファイル名) - 例外処理
→ ファイルが存在しない場合にエラーメッセージを表示 - 汎用化
→ コード中に固定のファイル名を書かずに済む
💡 応用ポイント
argparse
モジュールを使えば、オプション指定(例:--csv
や--plot
)も可能- 複数ファイルを指定して一括解析することもできる
- 自動化スクリプトやCI/CDに組み込む下準備としても有効
✅ まとめ
- コマンドライン引数でファイルを指定できるようにした
- これで「どんなTiming Reportでも即座に解析」可能になった
- 実務での使いやすさが大幅に向上