きっかけ
組み込み開発をしていると、新しいチップを触るたびにデータシートのレジスタマップ(レジスタ・ビットフィールド定義の表)を読んで、ヘッダファイルなり手元のメモなりに書き写す作業が発生します。数十ページの小さいICならまだしも、数百ページのMCUリファレンスマニュアルだと、これが地味に一日仕事になります。
「これAIで自動化できるのでは」と思い立ち、Claude Codeと一緒に作ってみました。
作ったもの
RegMap Extractor というツールです。
- データシートPDFをアップロードすると、レジスタマップを構造化データとして抽出
- 抽出結果を表形式でレビュー・その場で修正
- CSV / Excel / JSON / Markdown / Cヘッダー(
#defineマクロ)として書き出し
GitHub: https://github.com/miya-taro/regmap-extractor
なぜCSV/Excel出力にこだわったか
実は最初、「PDF→Cヘッダー生成」という発想で作り始めました。調べてみるとSmart Datasheetという類似サービスが既にあり、しかもチップ設計チーム向けにIP-XACT/SystemRDL/Verilog/VHDLまで対応していて、後発で同じ土俵に立つのは厳しそうでした。
一方で、生成AIによる抽出は完璧ではありません。ビット位置やリセット値を間違えると実機バグに直結するので、「AIが吐いたコードをそのまま信じる」設計は危険だと考えました。そこで方針を変えて、
- 出力の主軸はCSV/Excel(人間が目視レビューしやすい)
- Cヘッダー等のコード生成はその後工程として位置づける
という、精度に不安がある前提を織り込んだ設計にしました。
技術的に苦労したところ
① AI単独では見落としが起きる
最初、PDFをそのままClaude APIに渡して構造化JSONで抽出させたところ、あるチップ(MCP23017というI/Oエキスパンダ)でPort A/B両方あるはずのレジスタのうち、Port Bが丸ごと抜け落ちるという問題が起きました。原因は、ビットフィールドの説明文はデータシート内で1箇所にしか書かれておらず、実際のアドレス(Port AとBそれぞれ)は別のテーブルに載っている、という構造をAIが正しく突き合わせられなかったためでした。
対策として、pdfplumberでPDF内のテーブルを機械的に抽出し、その生テキストをプロンプトに追加コンテキストとして渡すハイブリッド方式に変更しました。
raw_tables_text = extract_raw_tables_text(pdf_bytes)
content = [
{"type": "document", "source": {...}},
{"type": "text", "text": EXTRACTION_PROMPT},
]
if raw_tables_text.strip():
content.append({"type": "text", "text": RAW_TABLES_HEADER + raw_tables_text})
これでPort A/Bの欠落は解消しましたが、今度は逆にビット単位の展開が崩れる副作用が出たり、出力量が増えてmax_tokens制限に引っかかってJSONが途中で切れたりと、一つ直すと一つ問題が出る、を何度か繰り返しました。
② 認証・課金モデル
当初は自分のAPIキーをサーバーに持たせる構成を考えていましたが、それだと「他人に配った瞬間に自分のAPIキーが無制限に使われる」リスクがあります。そこでBYOK(Bring Your Own Key)方式に変更し、各ユーザーが自分のAnthropic APIキーをブラウザのlocalStorageに保存し、リクエストごとにヘッダーで送る形にしました。サーバー側は一切キーを保持しません。
副産物として、「PDFの中身が外部サーバーを経由しない」という構成にもなったので、機密性への配慮としても説明しやすくなりました。
③ 配布形態
FastAPI + ブラウザという構成で作っていましたが、「localhostにアクセスして使う」のはさすがに配布物として使いにくいと考え直し、pywebviewでネイティブウィンドウ化、さらにPyInstallerで単体exe化しました。Python未インストールの環境でもダブルクリックで起動できます。
使ってみてほしい・フィードバック募集
現時点で動作確認できているのは、Microchip / STMicroelectronics / Texas Instruments 各1〜2種類の小〜中規模データシートのみです。数百ページ級の大規模リファレンスマニュアルでの動作は未検証なので、そこが一番知りたいところです。
無料・現状有姿(as-is)で公開しているので、気になった方は触ってみて、不具合や「このデータシートで壊れた」等あればGitHub Issueで教えてもらえると嬉しいです。