ベース URL(ローカル開発時): http://localhost:8000
案内用のルートです。 本サービスは API 専用で、ユーザーインターフェイスはフロントエンドが別途配信します。
レスポンス 200 OK
{
"service": "ModView API",
"version": "0.1.0",
"message": "This is the backend API. Open the frontend UI instead - ...",
"endpoints": ["POST /api/parse", "GET /api/health", "GET /docs"]
}ヘルスチェックと Verible の利用可否の確認です。
レスポンス 200 OK
{ "status": "ok", "version": "0.1.0", "verible": true }version はバックエンドアプリケーションのバージョンです(リポジトリの CHANGELOG を参照)。
verible-verilog-syntax バイナリが見つからない場合、verible は false になります。
1 つ以上の SystemVerilog ファイルを解析し、抽出した設計を返します。
リクエスト(multipart/form-data)
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
files |
File[] | はい | .sv / .v のソースファイル |
top |
string | いいえ | トップモジュール名のヒント。top_candidates の先頭に並べ替えられます |
上限は 1 リクエストあたり 20 000 ファイル、1 ファイル 50 MB、合計 500 MB です。 ディレクトリ単位のアップロードが可能なのは、このファイル数の上限によります。 上限は multipart ボディの読み取り時に適用されるため、大きすぎるリクエストはファイルがディスクに書き出される前に拒否されます。
200 のレスポンスは常に同じ 3 つのキーを持ちます。
| キー | 型 | 説明 |
|---|---|---|
status |
"ok" | "partial" | "error" |
下記参照 |
errors |
配列 | 構文エラー 1 件につき 1 要素。空の場合もあります |
design |
オブジェクト | 抽出された設計。3 つの状態すべてで返されます |
status の値は次の 3 つです。
ok:すべてのファイルを解析できました。errorsは空です。partial:一部のファイルは失敗したものの、少なくとも 1 つのモジュールを抽出できました。 クライアントは図の描画とエラー一覧の提示を同時に行えます。error:ファイルの解析に失敗し、モジュールが 1 つも残りませんでした。 描画できるものがありません。
{
"status": "ok",
"errors": [],
"design": {
"modules": {
"cpu_top": {
"name": "cpu_top",
"ports": [
{ "name": "clk", "direction": "input", "width": 1 },
{ "name": "data_o", "direction": "output", "width": 32, "msb": 31, "lsb": 0 }
],
"parameters": { "WIDTH": "32" }
}
},
"top_candidates": ["cpu_top"],
"instances_by_parent": {
"cpu_top": [
{
"instance_name": "u_alu",
"module_name": "alu",
"parameters": {},
"connections": [
{ "port_name": "y", "signal": "alu_out" }
]
}
]
},
"interfaces": {},
"interface_instances_by_parent": {}
}
}width と msb と lsb は、定数のパック範囲([31:0])から導出されます。
[WIDTH-1:0] のようなパラメータ化された範囲は width: 1 にフォールバックします。
<interface>.<modport> <name> 形式で宣言されたポート(例: pcie_avst_if.slave tx)は、direction: "interface" と結び付け情報を伴って返されます。
{
"name": "tx",
"direction": "interface",
"width": 1,
"interface_name": "pcie_avst_if",
"modport": "slave"
}.bus(axi_bus.master) のように書かれた接続では、結び付け情報は接続側に付きます。
{
"port_name": "bus",
"signal": "axi_bus.master",
"interface_instance": "axi_bus",
"modport": "master"
}interface_instance と modport、および interface_name と modport は、該当しない場合には省略されます。
そのため通常の信号接続は、上の成功例に示した 2 キーの形のままです。
interface の宣言そのものは design.interfaces に入ります。
{
"interfaces": {
"axi_if": {
"name": "axi_if",
"signals": [{ "name": "cmd", "width": 8, "msb": 7, "lsb": 0 }],
"modports": {
"master": {
"name": "master",
"signals": [{ "name": "cmd", "direction": "output" }]
}
},
"parameters": {}
}
},
"interface_instances_by_parent": {
"cpu_top": [
{ "instance_name": "axi_bus", "interface_name": "axi_if", "parameters": {} }
]
}
}一部のファイルは失敗したものの、解析できたモジュールは返されます。
{
"status": "partial",
"errors": [
{ "file": "broken.sv", "line": 42, "column": 8, "message": "syntax error (parse)" }
],
"design": { "modules": { "cpu_top": { "...": "..." } }, "...": "..." }
}構文エラーは HTTP の失敗としては扱いません。
利用できるものが何も残らなかった場合、status は error となり、design は空のコレクションを含みます。
{
"status": "error",
"errors": [
{ "file": "cpu.sv", "line": 42, "column": 8, "message": "syntax error (parse)" }
],
"design": {
"modules": {},
"top_candidates": [],
"instances_by_parent": {},
"interfaces": {},
"interface_instances_by_parent": {}
}
}ファイルのないリクエスト、未対応の拡張子、サイズ上限の超過で返されます。
アプリケーション自身のエラーは message を使います。
{ "status": "error", "message": "unsupported file type: notes.txt" }multipart ボディの読み取り中に発生した失敗は捕捉され、先頭に multipart parse error: を付けて同じ形で返されます。
ハンドラに到達する前にフレームワークが拒否した場合は、代わりに FastAPI の detail キーが使われます。
{ "detail": "..." }したがってクライアントは message を先に読み、なければ detail にフォールバックします。
同梱のフロントエンドクライアントはそのように実装されています。
{ "error": "verible not found" }| 変数 | 既定値 | 用途 |
|---|---|---|
VERIBLE_BIN |
verible-verilog-syntax |
Verible バイナリのパスまたは名前 |
SVMV_CORS_ORIGINS |
* |
許可する CORS オリジン(カンマ区切り) |