Conversation
- Phase 1: module/port/always_ff/always_comb/if-else コード生成 - Phase 2: case文 (SwitchInt多分岐→case/endcase)、parameter宣言 - Phase 3: BRAM/LutRAM推論 (#[sv::bram]/[sv::lutram]) - Phase 4: マルチクロックドメイン (#[sv::clock_domain]) - Phase 5: パイプライン/リソース共有ヒント - テストベンチ自動生成 (*_tb.sv) - XDC制約ファイル出力 (#[sv::pin]) - inoutポートサポート - 非合成型チェック (Pointer/String/Float) - テストランナー統合 (make test-sv / tsv0-tsv3) - Verilator lintによる生成SV検証 - テストケース7件 (basic3/control2/memory1/advanced1) 全PASS
- テストランナーにStage 3シミュレーション実行を追加 - iverilog + vvp で自動生成テストベンチを実際にシミュレーション実行 - 全7テストでシミュレーション成功確認 (VCD波形生成) - .expectファイルでSIM_OK/COMPILE_OKの両方に対応
- SVターゲットではMIR最適化(DCE/CopyProp/ConstFold)をスキップ (合成ツールが最適化を行うため、一時変数代入の除去を防止) - テストファイルの関数宣言を func→void に修正 - SVテストからmain()を削除(ハードウェアにmainは不要) - 不要なデバッグ出力を削除 - .gitignoreにVCDファイルを追加
- alwaysブロック直前に関数名コメントを出力 (// add, // tick等) - MIR一時変数(_tXXXX)を再帰的にインライン展開 - adder: result = a + b; (4行→1行に簡潔化) - counter: count <= count + 32'd1; (ノンブロッキング代入も対応) - mux: if (sel) (if条件内の一時変数も展開) - ブロッキング代入(=)とノンブロッキング代入(<=)の両方に対応 - デバッグ出力の残骸を削除
- テストベンチに//! test:コメント駆動のテストシナリオ自動生成 - 例: //! test: a=3, b=5 -> result=8 - combinational: #10待ち、sequential: repeat(N) @(posedge clk) - テストランナーでTEST行の期待値比較検証 - モジュール名をソースファイル名から生成(SV予約語output回避) - SV予約語チェック追加(output,input等をモジュール名に使用不可) - 値検証テスト: adder(3件), mux(2件), priority_encoder(3件) - sequential回路(counter,shift_register,bram,multi_clock)はCOMPILE_OK
網羅テスト追加 (8テスト新規): - basic/arithmetic: 算術演算 (+,-,*,/,%) - basic/bitwise: ビット演算 (&,|,^,~) - basic/shift: シフト演算 (<<,>>) - basic/unary: 単項演算 (-,~) - basic/multi_expr: 複合式・複数出力 - control/compare: 比較演算 (==,!=,<,>,<=,>=) - control/nested_if: ネストif-else - control/signed_ops: 符号付き演算 バグ修正: - BitNot(~)のMIR lowering欠落: HirUnaryOp::BitNot→MirUnaryOp::BitNotのcase文追加 - if条件内の一時変数が多段展開されない: 反復展開ループに修正 - signed定数を32'sd形式で出力(signed/unsigned比較ミスマッチ防止) 全15テスト PASS (make test-sv-o0)
- TypeKindにPosedge/Negedge/Wire/Reg型を追加 - レキサー/パーサーにSVキーワードの解析を追加 - posedge型パラメータ → always_ff @(posedge X) ブロック生成 - negedge型パラメータ → always_ff @(negedge X) ブロック生成 - テストベンチ生成: リセット信号名を動的に検出(rst/rst_n対応) - rst_nの場合はアクティブLowリセットシーケンスを生成 - posedge_counter.cm / negedge_reset.cm テストを追加 - 全17件SVテストPASS確認
- 100MHz想定、50Mカウントで約1Hz点滅 - posedge型クロック入力 + リセット付きカウンタ + LEDトグル - SVテスト全18件PASS
- 0bリテラルによるビットマスク操作のSV変換を検証 - 0b01010101 → 32'd85、0b10101010 → 32'd170 として正しく変換 - SVテスト全19件PASS
- レキサーで数値直後のN'[dbhDBH]VALUEパターンを認識 - Token→AST→HIR→MIR→SVコード生成の全段でbit_width情報を伝搬 - emitConstantでユーザー指定幅を使用 (例: 8'hFF → 8'd255) - テスト: sv_width_literal.cm, binary_bits.cm 追加 - SVテスト全20件PASS
- bit_base/bit_originalフィールドをToken→AST→HIR→MIRの全段に追加 - SVコード生成で元の表記をそのまま使用: 3'b101 → 3'b101 (以前: 3'd5) 8'hFF → 8'hFF (以前: 8'd255) 8'd170 → 8'd170 (変化なし) - SVテスト全20件PASS
- SV幅付きリテラルテストを全ベース形式(d/b/h)で網羅 8'd170, 4'b1010, 8'hAB, 3'b101, 16'hDEAD 等9パターン - VSCode拡張: 文字リテラルパターンをmatchベースに変更 'X' (1文字)のみを文字リテラルとして認識 8'hFF等がcharとして認識される問題を修正 - VSCode拡張: SV幅付きリテラルのハイライトパターン追加 constant.numeric.sv-literal.cm スコープ - SVテスト全20件PASS
- run_parallel_testにSVバックエンドのcaseを追加 - verilator lint→iverilog→vvpシミュレーションのフルパイプライン - ファイル名にBASHPID/RANDOMを付与して並列安全性を確保 - make tsvp で全20件PASS確認
- analyzeFunctionでインデントレベルを1(module内)で開始 - Pass 2のインライン展開で元の行インデントを保持 - if/else内の代入文が正しいインデントで出力されるように - always_comb/always_ffブロックがmodule内に正しく配置 - SVテスト全20件PASS
- analyzeFunctionでalwaysブロック構築後に使用状況を解析 - alwaysブロック内で参照されない_tXXXX変数をreg_declarationsから除去 - nested_if: logic宣言9個→0個に削減 - led_blinker: counterのみ残留(実際に使用) - SVテスト全20件PASS
- CIにSVテスト(sv-o3)をintegration-testに追加 - SVバックエンドチュートリアル(ja/en)を追加 ポート宣言、組み合わせ/順序回路、SV幅付きリテラル等を網羅 - v0.15.0リリースノートを作成 SVバックエンド、VSCode拡張、テスト基盤の全変更をまとめ - releases/index.mdにv0.15.0を追記
- VERSION, src/main.cpp, vscode-extension/package.json を0.15.0に更新
- SVバックエンド全機能の変更概要 - VSCode拡張の変更内容 - テスト基盤・CI・ドキュメント変更をまとめ
- NOT ~0: 0→-1 (全ビット反転の正しい結果) - flags after clear 0: 5→4 (ビット0クリア後の正しい結果)
- tests/programs/配下のexpectファイルも同様に修正 - NOT ~0: 0→-1, flags after clear 0: 5→4 - 全400テストPASS確認
1. rst自動追加: clkの実位置を検索して直後に挿入 2. validateSynthesizableTypes: compile()から呼出し、エラー時はruntime_errorで停止 3. emitBlock: verboseガードを除去し常時ブロック生成 4. signed_ops.expect: シミュレーション結果に合わせて修正 5. bram.cm: コメントを実態に合わせて修正(BRAM配列推論は将来対応) 6. test_runner Stage3: expectにSIM_OK/TEST行がある場合のみシミュレーション実行 7. expect_ident: posedge/negedge/wire/regも識別子として受理(文脈キーワード化) SVテスト20/20 PASS, JITテスト400/400 PASS
- レキサのキーワードテーブルからSV固有語を削除 - parse_typeでIdentテキスト比較による文脈キーワードとして処理 - is_type_start(), is_global_var_start()も同様にIdentテキスト比較に変更 - expect_ident/current_textのSVキーワード受理コードを削除(不要化) - baremetal/allowed_pointerの`int* reg = ...`が正常にパース可能に SVテスト20/20 PASS, JITテスト400/400 PASS
- tests/programs/を削除(tests/に展開済みの旧コピー) - unified_test_runner.shのPROGRAMS_DIRをtests/に変更 - CI: SVバックエンドテスト用にiverilogインストールステップ追加 - ヘルプメッセージ更新 SVテスト20/20 PASS
- lexer.hppにLexerPlatform enum (Default/SV) 追加 - lexer.cppにadd_sv_keywords()、detect_platform_directive()実装 - --target=sv時: LexerPlatform::SVでposedge/negedge/wire/regをキーワード化 - //! platform: svディレクティブでソースレベルのSVモード指定に対応 - parse_type()のSV固有型Identテキスト比較をswitch-case方式に完全移行 - parser_stmt/decl: is_type_start()/is_global_var_start()にKwPosedge等のcase追加 - parser_type: expect_ident()/current_text()にKwPosedge等の受理を追加 SVテスト20/20 PASS、JITテスト367/373 PASS baremetal/allowed_pointer (regを変数名として使用) 正常動作確認
- systemverilog_backend.md: Phase 1 → IMPLEMENTED、テストパスをtests/sv/に修正 - systemverilog_codegen_pipeline.md: Phase 1 → IMPLEMENTED、Target enum更新 - method_chaining.md: v1.2更新、パーサー対応済み/型チェッカー未実装を明記 - type_identity_and_name_resolution.md: 未着手→v0.16.0検討のステータス追加 - module_separate_compilation.md: v0.16.0先送りステータス追加 テストベンチ自動生成・プラットフォームディレクティブ実装の反映、 tests/programs/sv/廃止→tests/sv/統合済みの反映
parse_namespace()で型キーワード(KwString等)のnamespace名取得に current().get_string()を使用していたが、キーワードトークンは get_string()が空文字列を返すため、namespace名が空になり 関数が"::length"のような不正な名前で登録されていた。 token_kind_to_string(kind)に変更し、式パーサーの型キーワード 名前空間ハンドラ(parser_expr.cpp:1187行)と同じパターンに統一。 JITテスト368/373 PASS (0 FAIL, 5 SKIP)、SVテスト20/20 PASS
- プラットフォームディレクティブ/LexerPlatformモードの追加 - tests/programs統合の反映 - type_keyword_namespaceバグ修正の記載 - CI iverilog追加の反映 - テスト結果更新 (JIT 368/0/5, SV 20/0/0) - 設計ドキュメント5件更新の記載 - v0.16.0ロードマップ追加
## PRレビュー指摘5件対応 - SV幅付きリテラルのstoi/stoull例外防止(値部空チェック・基数検証・フォールバック) - current_text()でSVキーワードのテキスト取得をtoken_kind_to_stringに修正 - グローバル変数初期化子省略をSVポート型/属性に限定 - Token/AST/HIR/MIR/codegen全段でBitLiteralInfo optional化 - CI: macOS brew install失敗時にSVテストスキップへ明示的分岐 ## ビルド高速化 - ccache自動検出・有効化 - CMake Unity build導入(バッチサイズ16) - gpu_runtime.mm(ObjC++)をUnity buildから除外 ## SV生成物管理 - make cleanに*.sv/*.vcd/*.vvp削除を追加 - SVデフォルト出力先をルート→.tmp/に変更 - VCD $dumpfileパスをSV出力と同ディレクトリに配置 - .gitignoreに*.vvp追加 ## コンパイラ警告解消(0 warnings達成) - buffered_codegen.hpp: int/size_t符号比較をstatic_castで修正 - codegen.cpp: ||内の&&に明示的括弧追加 - mir_to_llvm.cpp: 未使用変数hasAsmOperands削除・isAsmReferencedにmaybe_unused
## 三項演算子最適化 - if/elseが同一変数への単一代入のみの場合、cond ? a : b に自動変換 - ブロッキング代入(=)・ノンブロッキング代入(<=)の両方に対応 - 合成ツールの効率向上と生成コードの可読性改善 ## パラメータ化モジュール修正 - sv::param変数がparameter宣言とlogic宣言で二重定義されるバグを修正 - analyzeFunctionでmod.parametersに登録済みの変数をreg宣言から除外 ## テストケース追加(20→23件) - sv/basic/ternary: 三項演算子最適化の検証 - sv/advanced/fsm: 有限状態マシン(FSM)のif-elseチェーン - sv/advanced/parameterized: sv::paramアトリビュートによるparameter宣言
## 定数リテラルのビット幅自動調整 - BinaryOpで片方が定数の場合、相手オペランドの型からビット幅を推論 - emitConstant/emitOperandにtarget_widthパラメータを追加 - 8bitポートの比較/演算で32'dが付与される問題を部分改善 ## else if チェーンの正規化 - 'end else begin + if (...)' → 'end else if (...)' に自動変換 - 余分なendの追跡・除去をbegin/end深度カウントで実装 - priority_encoder/fsm/led_blinker/sv_width_literalで正しく動作確認 ## 冗長三項演算子の除去 - 'cond ? X : X' パターンを検出し 'X' に簡略化 ## NOT演算子のSV準拠 - MirUnaryOp::Not を '!' → '~' に変更(SVスタイル推奨) ## parameter宣言の簡潔化 - 'parameter logic signed [31:0] WIDTH' → 'parameter WIDTH' に変更 - 合成ツール互換性の向上
- emitRvalueにtarget_widthパラメータ追加 - emitStatementで代入先(place.type/locals)の型からビット幅を推論 - 32bit(intデフォルト)以外の場合、emitRvalue→emitOperand→emitConstantに伝播 - place.typeを優先使用し、なければfunc.localsからフォールバック
- always_ff, always_comb, always_latch をCm言語のキーワードとして追加 - always (無印) は自動判別: if/else解析でcomb/latchを自動選択 - #[sv::latch] 属性を削除、always_kind enumベースに移行 - 関数属性の伝搬チェーン構築 (AST→HIR→MIR→Codegen) - エッジ信号の重複排除修正 - テスト23件追加 (26→49テスト) - always系: async_reset, auto_latch, comb_explicit, ff_explicit, latch_explicit, mixed, multi_always_comb - 後方互換: backward_compat_async/posedge/comb - const/param: const_expr, sv_param, localparam_const - 型: signed_types, unsigned_types, bool_logic, internal_reg - 演算子: all_operators, all_comparisons, nested_ternary - 制御構文: deep_if_else, compound_conditions - 複合回路: clock_domain, uart_counter
- switch → case/endcase テスト追加 (control/switch_case.cm) - 多段FSM状態遷移テスト追加 (control/switch_fsm.cm) - for ループテスト追加 (control/for_loop.cm) - increment ++ 展開テスト追加 (basic/increment.cm) - パーサー未対応テスト削除 (assign_wire, bit_width, inout_port, wire_reg)
- bit[N]カスタムビット幅型: TypeKind::Bit追加、bit[4]→logic[3:0]変換 - AST/パーサー(parse_type, is_type_start, is_global_var_start) - Codegen(mapType, getBitWidth): Array(Bit,N)→logic[N-1:0] - assign文: トップレベルassign type name = expr; パース - AST/HIR/MIR is_assignフラグ伝搬チェーン - Codegen: wire宣言 + assign name = expr; 出力 - inout初期化子なし変数: is_global_var_start()で;終端もサポート - 配列サフィックス[N]のルックアヘッドスキップ追加
…ion automatic (59テスト全PASS) - enum → typedef enum logic [W-1:0]: ビット幅自動計算、メンバー値出力 - struct → typedef struct packed: 全フィールドをlogic型で宣言 - function → function automatic / task automatic: - posedge/negedge以外の引数を持つ関数のみSV function/taskに変換 - 引数なし/void関数は従来通りalways_combで出力 - SVModule に type_declarations + function_blocks 追加 - emitModule に対応する出力処理追加
パーサー: {構造体リテラル}, {連接}, {N{複製}} の3パターン判別を追加
型チェッカー: __builtin_concat/__builtin_replicate のバイパスを追加
HIR lowering: ビルトイン関数リストに連接/複製を登録
SV Codegen: Call Terminator でRef+Const逆引きマップを構築し
連接→{a, b, ...}、複製→{N{expr}} のSV構文を直接出力
SV002ポインタ型テンポラリスキップを追加
function body内のテンポラリ変数宣言を修正
テスト: concat_replicate テスト+expect追加
全60テストPASS、回帰なし
There was a problem hiding this comment.
Pull request overview
Cm v0.15.1 に向けて、SystemVerilog(SV)バックエンド向けのフロントエンド拡張(SV固有型/always/assign/幅付きリテラル/concat・replicate構文)と、それに伴うMIR/HIR伝搬・CI/ビルド設定更新を行うPRです。合わせて、旧 tests/programs/** 配下の多数のテスト資産が削除され、tests/common/** 側へ整理されているように見えます。
Changes:
- SV向け構文・型・属性のパース/AST→HIR→MIR伝搬を追加(幅付き整数リテラル、SV固有型、always/assign、属性の名前空間対応)
- 新規SVコード生成バックエンド骨組みを追加し、ターゲット/Make/CIにSVを追加
- 期待値の更新(例: bitwise NOTの期待値修正)と、旧テストプログラム群の削除
Reviewed changes
Copilot reviewed 290 out of 1132 changed files in this pull request and generated 9 comments.
Show a summary per file
| File | Description |
|---|---|
| src/frontend/lexer/token.hpp | SV固有キーワードと幅付きリテラル情報(BitLiteralInfo)をトークンに追加 |
| src/frontend/parser/parser_expr.cpp | {a,b} 連接 / {N{expr}} 複製 / {field:...} 構造体リテラルの判別とbuiltin化を追加 |
| src/frontend/parser/parser_type.cpp | SV固有型キーワード(posedge/negedge/wire/reg/bit)を型として解釈 |
| src/frontend/parser/parser_module.cpp | 属性の名前空間対応、SVポート宣言向けにグローバル変数初期化子省略を導入 |
| src/frontend/types/checking/call.cpp | __builtin_concat/__builtin_replicate の型推論バイパスを追加 |
| src/frontend/ast/types.hpp | SV固有TypeKindと型生成ヘルパーを追加 |
| src/hir/nodes.hpp | リテラルのbit_info、関数always情報、GVのassign/attributesを追加 |
| src/mir/nodes.hpp | 定数bit_info、関数always情報、GVのassign/attributesを追加 |
| src/hir/lowering/decl.cpp | AST→HIRでalways_kind/attributes/is_assign を伝搬 |
| src/hir/lowering/expr.cpp | AST→HIRでliteral bit_infoを伝搬、builtin関数集合を拡張 |
| src/mir/lowering/impl.cpp | HIR→MIRでalways_kind/attributes を伝搬 |
| src/mir/lowering/expr_basic.cpp | HIR→MIRで定数bit_infoを伝搬 |
| src/mir/lowering/base.cpp | const GVもSV出力のため global_vars に登録する動作へ変更 |
| src/common/target.hpp | TargetにSVを追加 |
| src/codegen/sv/codegen.hpp | SVバックエンドのコード生成クラス/構造体を新規追加 |
| CMakeLists.txt | ccache自動検出、Unity build有効化、SVバックエンドソース追加 |
| Makefile | SVターゲットのビルド/テストショートカットを追加、生成物(.sv等)をclean対象へ |
| .github/workflows/ci.yml | ubuntu-latest/macos-15 への更新、SVテストジョブとiverilog導入を追加 |
| tests/common/basic/bitwise_ops.expect | ~0 と flags clear の期待値を修正 |
| docs/v0.15.1/sv_cm_mapping.md | Cm⇔SVマッピング表を追加(ただし一部現状と齟齬あり) |
| VERSION | 0.15.1へ更新 |
| tests/programs/** (多数) | 旧テストプログラム/expect/skip 等を大量に削除(整理) |
Comments suppressed due to low confidence (2)
src/frontend/ast/types.hpp:72
TypeKind::Bitを追加していますが、get_primitive_info()に Bit の分岐がありません。このままだとBit型のサイズ/アラインメントがデフォルト扱いになり、SV型マッピングやコード生成でビット幅計算が破綻する可能性があります。最低限case TypeKind::Bit: return {1,1};のように明示し、必要ならbit[N]のNを表現できるようType表現(幅フィールド等)も合わせて拡張してください。
inline TypeInfo get_primitive_info(TypeKind kind) {
src/frontend/ast/types.hpp:360
TypeKind::Bitの文字列表現がtype_to_string()に存在しません。デバッグ表示・エラーメッセージ・テスト期待値生成等でBit型が空/不正表現になる恐れがあるため、case TypeKind::Bit: return \"bit\";(幅があるならbit [N-1:0]等)を追加してください。
inline std::string type_to_string(const Type& t) {
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| // SV固有キーワードも識別子として受理(SVモードでキーワードトークンの場合) | ||
| if (check(TokenKind::KwPosedge) || check(TokenKind::KwNegedge) || check(TokenKind::KwWire) || | ||
| check(TokenKind::KwReg)) { | ||
| std::string name(current().get_string()); | ||
| advance(); | ||
| return name; | ||
| } |
There was a problem hiding this comment.
expect_ident() がSVキーワードトークン(KwPosedge等)を識別子として受理する分岐で current().get_string() を使っていますが、同ファイル内の current_text() では『キーワードトークンはget_string()が空文字を返す』と明記されています。ここも token_kind_to_string(current().kind) を使う(または current_text() を呼ぶ)形に揃えないと、posedge 等が空文字として解釈され、名前解決やエラーメッセージ生成が壊れます。
| if (check(TokenKind::LBrace)) { | ||
| // 先読みで構造体リテラルかどうかを判別 | ||
| auto saved_pos = pos_; | ||
| advance(); // { を消費 | ||
|
|
||
| // 空の {} はスキップ(ブロックとして扱う) | ||
| if (check(TokenKind::RBrace)) { | ||
| pos_ = saved_pos; | ||
| // 通常のブロック式として処理をフォールスルー | ||
| } |
There was a problem hiding this comment.
空の {} を『ブロックとして扱う』目的で pos_ を巻き戻していますが、このまま同じ {...} 判別ロジックの後続(concat/struct判別)に進むため、結果的に {} を concat として解釈しようとして parse_expr() に入り、再び {} 判別へ戻る再帰(無限再帰/スタックオーバーフロー)になり得ます。{} を検出した時点で、この分岐を抜けてブロック式の既存パースへ委譲する(例: その場でブロック式パース関数を呼んでreturn、もしくはラベル/フラグでこの新ロジックをスキップ)ように制御フローを切ってください。
| // 初期化子省略をSVポート型/アトリビュートに限定 | ||
| // posedge/negedge型、または#[input]/#[output]属性付きはport宣言のため初期化子不要 | ||
| bool is_sv_port = false; | ||
| if (type && (type->name == "posedge" || type->name == "negedge")) { |
There was a problem hiding this comment.
SVポート判定が type->name 文字列比較になっていますが、今回 ast::make_posedge() / make_negedge() は TypeKind::Posedge/Negedge を返す実装で、name が必ずしも設定されない可能性があります(=判定に失敗して = 必須エラーになる)。type->kind(Posedge/Negedge)で判定するか、Type生成時に name を必ず入れるなど、表現に依存しない判定へ変更してください。
| if (type && (type->name == "posedge" || type->name == "negedge")) { | |
| if (type && (type->kind == ast::TypeKind::Posedge || | |
| type->kind == ast::TypeKind::Negedge)) { |
| case TypeKind::String: | ||
| case TypeKind::CString: | ||
| return {8, 8}; // ポインタサイズ | ||
| case TypeKind::Posedge: | ||
| case TypeKind::Negedge: | ||
| return {1, 1}; // 信号型(1bit) | ||
| case TypeKind::Wire: | ||
| case TypeKind::Reg: | ||
| return {0, 1}; // 修飾子型(サイズは要素型依存) | ||
| default: | ||
| return {0, 1}; | ||
| } |
There was a problem hiding this comment.
TypeKind::Bit を追加していますが、get_primitive_info() に Bit の分岐がありません。このままだとBit型のサイズ/アラインメントがデフォルト扱いになり、SV型マッピングやコード生成でビット幅計算が破綻する可能性があります。最低限 case TypeKind::Bit: return {1,1}; のように明示し、必要なら bit[N] のNを表現できるようType表現(幅フィールド等)も合わせて拡張してください。
| case TypeKind::Wire: | ||
| return "wire " + (t.element_type ? type_to_string(*t.element_type) : "?"); | ||
| case TypeKind::Reg: | ||
| return "reg " + (t.element_type ? type_to_string(*t.element_type) : "?"); |
There was a problem hiding this comment.
TypeKind::Bit の文字列表現が type_to_string() に存在しません。デバッグ表示・エラーメッセージ・テスト期待値生成等でBit型が空/不正表現になる恐れがあるため、case TypeKind::Bit: return \"bit\";(幅があるなら bit [N-1:0] 等)を追加してください。
| return "reg " + (t.element_type ? type_to_string(*t.element_type) : "?"); | |
| return "reg " + (t.element_type ? type_to_string(*t.element_type) : "?"); | |
| case TypeKind::Bit: | |
| return "bit"; |
| | `generate ... endgenerate` | パラメトリック生成 | 未サポート | | ||
| | `always @(*)` | 旧来の組み合わせ | `always_comb` を使用 | | ||
| | `always @(posedge ... or negedge ...)` | 非同期リセット | 未サポート | | ||
| | `assign wire = expr;` | 連続代入 | 未サポート | |
There was a problem hiding this comment.
本文では assign / {a,b} / {N{expr}} を『未サポート』としていますが、このPRでは HirGlobalVar::is_assign の追加、__builtin_concat / __builtin_replicate のパースと型推論バイパス追加が入っており、少なくとも“フロントエンドが受け付ける/内部表現がある”段階には進んでいます。実際のSVコード生成が未対応なら『パース/IRまでは対応、SV出力は未対応』等に表現を更新し、対応済みなら表を更新してください。
| | `assign wire = expr;` | 連続代入 | 未サポート | | |
| | `assign wire = expr;` | 連続代入 | パース/IR までは対応、SV出力は未対応 | |
| | `{a, b}` | 連接 (concatenation) | 未サポート | | ||
| | `{N{expr}}` | 複製 (replication) | 未サポート | |
There was a problem hiding this comment.
本文では assign / {a,b} / {N{expr}} を『未サポート』としていますが、このPRでは HirGlobalVar::is_assign の追加、__builtin_concat / __builtin_replicate のパースと型推論バイパス追加が入っており、少なくとも“フロントエンドが受け付ける/内部表現がある”段階には進んでいます。実際のSVコード生成が未対応なら『パース/IRまでは対応、SV出力は未対応』等に表現を更新し、対応済みなら表を更新してください。
| | `{a, b}` | 連接 (concatenation) | 未サポート | | |
| | `{N{expr}}` | 複製 (replication) | 未サポート | | |
| | `{a, b}` | 連接 (concatenation) | パース/IRまでは対応、SV出力は未対応 | | |
| | `{N{expr}}` | 複製 (replication) | パース/IRまでは対応、SV出力は未対応 | |
| // always_kind を伝搬(HIR→MIR: enum値をintでキャスト) | ||
| mir_func->always_kind = static_cast<MirFunction::AlwaysKind>( | ||
| static_cast<int>(func.always_kind)); |
There was a problem hiding this comment.
AST/HIR/MIR間の AlwaysKind を int 経由でキャストしており、列挙子の順序変更・追加で静かに不整合が発生します。明示的な変換関数(switchで各列挙子を対応付け)か、少なくとも static_assert で列挙子数や値が一致することを保証して、将来の変更で壊れないようにしてください。
| // always_kind を伝搬(HIR→MIR: enum値をintでキャスト) | |
| mir_func->always_kind = static_cast<MirFunction::AlwaysKind>( | |
| static_cast<int>(func.always_kind)); | |
| // always_kind を伝搬(HIR→MIR: enum間を直接キャスト) | |
| mir_func->always_kind = static_cast<MirFunction::AlwaysKind>(func.always_kind); |
| set(CMAKE_UNITY_BUILD ON) | ||
| set(CMAKE_UNITY_BUILD_BATCH_SIZE 16) |
There was a problem hiding this comment.
Unity build をデフォルトで強制ONにすると、プラットフォームやコンパイラ差・ODR/匿名名前空間/マクロ衝突などでビルドが不安定化しやすく、外部開発者の環境でも挙動差が出ることがあります。option(CM_UNITY_BUILD ...) のようにプロジェクトオプション化してデフォルトOFF(またはCIのみON)にする、もしくはUnity除外リストを整備して安全に段階導入するのがおすすめです。
| set(CMAKE_UNITY_BUILD ON) | |
| set(CMAKE_UNITY_BUILD_BATCH_SIZE 16) | |
| option(CM_UNITY_BUILD "Enable unity build (experimental; default OFF)" OFF) | |
| if(CM_UNITY_BUILD) | |
| set(CMAKE_UNITY_BUILD ON) | |
| set(CMAKE_UNITY_BUILD_BATCH_SIZE 16) | |
| endif() |
|
ブランチミス |
概要
変更点
関連Issue
テスト
チェックリスト
docker compose run --rm lint通過docs/design/との整合性確認