Skip to content

Compute extension implications and mark derived extensions with parentheses - #22

Merged
kako-jun merged 6 commits into
mainfrom
10-extension-implications
Sep 17, 2026
Merged

kako-jun merged 6 commits into
mainfrom
10-extension-implications

Conversation

@kako-jun

@kako-jun kako-jun commented Sep 17, 2026

Copy link
Copy Markdown
Owner

closes #10

背景

/proc/cpuinfo はカーネルが列挙した拡張しか報告しない。riscfetch はそれをそのまま表示していたため、Zba/Zbb/Zbs が揃っているのに B が出ない、M があるのに Zmmul が出ない、といった実際には利用可能な拡張を「無い」ものとして表示してしまっていた(外部ユーザーからの報告)。

設計

riscfetch-core に新しい implications モジュールを追加し、2種類の関係を1つの仕組みで解決する:

  • implication(順方向): X があれば依存先も有る。MZmmulDFFZicsrAZalrsc+ZaamoCZcaVZve64d→…→Zve32x(ISA manual の最小要件により D/F/Zicsr まで波及)、ZfhZfhminZvfhZvfhmin+ZfhminZdinxZfinxZvl* の連鎖 など
  • composition(逆方向): 略記拡張の構成要素が全部揃っていれば本体も有りとする。Zba+Zbb+ZbsBZaamo+ZalrscAZkn+Zkr+ZktZkZkn/Zks/Zvkn/Zvks/Zce

両方向とも while changed のワークリスト方式で推移閉包まで解決するので、VZve32x のような多段の連鎖もカバーし、循環があっても停止する。

出典

IMPLICATIONS/COMPOSITIONS テーブルは LLVM mainline の llvm/lib/Target/RISCV/RISCVFeatures.td の各 RISCVExtension 定義の Implies フィールド(2026-09-17 時点、WebFetch で確認)から取った。裏が取れないもの、rv32/rv64 条件付きで安全に表現できないもの(例: Zcf は rv32 限定)は入れていない。誤検出より欠落を選んでいる。各行にコメントで元の FeatureStdExt* 定義を付記している。

表示(括弧記法)

カーネルが実際に報告した拡張はそのまま表示し、含意/合成で導出した拡張は丸括弧付きで表示する:

Ext:        I M A F D C V (B)
Z-Multiply: (Zmmul)

既存の表示順・カテゴリ分類にそのまま混ぜ、別セクションは作っていない。括弧付きのものは dim 色にしているが、判別の主手段は色ではなく括弧そのもの。--explain モードでも同様。--all モード(チェックマーク表示)は今回スコープ外とし、SPEC.md にその旨明記した。

derived フィールド

ExtensionInfo/ExtensionEntryderived: bool を追加(加算的変更、supported の意味は変えない)。--json(デフォルト・collect_riscv_info/collect_all_info 経由)の extensions/z_extensions/s_extensions にも同じ derived フィールドが additive に付く。

ドキュメント

README(en/ja/zh-CN)、riscfetch-core/SPEC.md(含意・合成テーブルの出典と derived フィールド仕様の節を新設)、riscfetch-cli/SPEC.md(表示例・--json 例・--help 例)、実際の --helplong_about)に括弧記法の意味を明記した。

版数

riscfetch-core 2.3.0 → 3.0.0(セルフレビュー後に修正: ExtensionEntry/ExtensionInfo は全フィールド公開・#[non_exhaustive] なしの公開構造体なので、必須フィールド derived: bool の追加は JSON 消費者には加算的でも Rust API 利用者には破壊的変更にあたるため major を上げた)。riscfetch (CLI) 2.4.0 → 2.5.0、ワークスペース version も 2.5.0(CLI 自身はバイナリで機能追加のみなので minor のまま)。CLI → core の依存バージョン指定も 3.0.0 に追従。Cargo.lock 更新済み。CHANGELOG.md[2.5.0] セクション追加(core が 3.0.0 になった理由も明記)。

テスト

cargo test --workspace で全 107 件成功(既存 91 件 + 新規 16 件、うち実機 ISA 文字列の回帰テスト、および ZihpmZicsr 含意追加分を含む)。cargo fmt --all --check / cargo clippy --all-targets -- -D warnings も警告ゼロ。

実機相当の検証として、スクラッチの example バイナリで下記2つの実 ISA 文字列を get_extensions_with_derived / parse_z_extensions_with_category_and_derived に通し、期待通りの derived 拡張が出ることを確認した(テスト完了後 example は削除済み):

  • Orange Pi RV2 / SpacemiT K1: Ext (all): I M A F D C (B) V — derived std: ["B"]、derived Z: ["Zbkc", "Zaamo", "Zalrsc", "Zmmul", "Zvl32b", "Zvl64b", "Zvl128b"]
  • MangoPi MQ-Pro / D1 (rv64imafdc): derived Z: ["Zicsr", "Zca", "Zaamo", "Zalrsc", "Zmmul"]

レビュー対応(追加コミット)

  • riscfetch-core の semver を上記の通り 3.0.0 に訂正、SPEC.md の「既存コンシューマは影響を受けない」という記述を JSON/Rust API で区別する記述に訂正
  • LLVM RISCVFeatures.tdFeatureStdExtZihpm(Implies=[FeatureStdExtZicsr])に対応する ZihpmZicsrIMPLICATIONS に追加(ZkrImplies を持たないため対象外)
  • COMPOSITIONSA に、A は ISA manual 上 Zaamo+Zalrsc の合成として定義され LLVM の独立ビットマスクは hwprobe 用の識別子であって独自の挙動ではない旨のコメントを追加
  • --explain の派生ラベル幅を、実際の最長ラベル(Sscounterenw 等 12 文字)に合わせて 10→12 に拡張

迷った点

  • デフォルト(非 --all)の --json が使う ExtensionEntry 構造体は Issue 本文で名指しされていなかったが、ExtensionInfo だけに derived を足すと terminal 表示は直っても同じデータを使う default JSON だけ直らず一貫性が壊れるため、ExtensionEntry にも additive に derived: bool を追加した。
  • --all --jsonget_all_*_with_status ベース)は「全拡張を supported true/false で列挙する」既存の別モードで、Issue の設計にも記載がなかったため、今回は意図的にスコープ外にした(supported の意味を変えない、チェックマーク表示も変えない)。SPEC.md にその旨明記済み。

🤖 Generated with Claude Code

https://claude.ai/code/session_01EDEpX7TmuaahkgX3CZ3C1z

/proc/cpuinfo はカーネルが列挙した拡張しか報告しないため、M はあるのに
Zmmul が出ない、Zba/Zbb/Zbs は揃っているのに B が出ない、といった実際に
は存在する拡張が「無い」ものとして扱われていた。

riscfetch-core に implications モジュールを追加し、以下の2方向の関係を
ワークリスト方式(while changed)で推移閉包まで解決する:

- implication(順方向): M→Zmmul, D→F, F→Zicsr, A→Zalrsc+Zaamo, C→Zca,
  V→Zve64d→...→Zve32x(ISA manualの最小要件によりD/F/Zicsrまで波及)、
  Zfh→Zfhmin、Zvfh→Zvfhmin+Zfhmin、Zdinx→Zfinx、Zvl*の連鎖など
- composition(逆方向・略記拡張の構成要素が揃ったら本体も有りとする):
  Zba+Zbb+Zbs→B、Zaamo+Zalrsc→A、Zkn+Zkr+Zkt→Zk、Zkn/Zks/Zvkn/Zvks/Zce

出典は LLVM mainline の llvm/lib/Target/RISCV/RISCVFeatures.td の
Implies フィールド(2026-09-17時点、WebFetchで確認)。rv32/rv64で条件が
変わるものなど裏を取れないものは入れていない。

ExtensionInfo/ExtensionEntry に derived: bool を追加(加算的変更)。
supported の意味は変えず、直接報告されたものは false、含意/合成で導出
したものは true になる。

(#10)
デフォルト表示(--explain 併用時も含む)で、ISA 文字列に直接現れない
が含意/合成で導出された拡張を括弧付きで表示する:

  Ext: I M A F D C V (B)
  Z-Multiply: (Zmmul)

既存の表示順・カテゴリ分類の中にそのまま混ぜ、別セクションは作らない。
色は括弧付きのものを dim にするが、判別の主手段はあくまで括弧そのもの
とし、色だけに依存しない。

--all モードのチェックマーク表示は今回のスコープ外(カーネル報告の有無
のみを表し続ける)。

(#10)
括弧付き表示(導出された拡張)の意味を、日英中3言語の README、
riscfetch-core/SPEC.md(含意・合成テーブルの出典と derived フィールド
の仕様)、riscfetch-cli/SPEC.md(表示例・--json 例・--help 例)、実際の
--help 出力(long_about)に明記する。

(#10)
riscfetch-core 2.3.0 → 2.4.0、riscfetch (CLI) 2.4.0 → 2.5.0、ワークスペー
ス version も 2.5.0 に統一。CLI から core への依存バージョン指定も追従。
CHANGELOG.md に [2.5.0] セクションを追加。

(#10)
@kako-jun

Copy link
Copy Markdown
Owner Author

Hardware A/B check with the CI artifact from this PR, against the installed v2.4.0 on the same boards.

Orange Pi RV2 (SpacemiT K1) — the exact case from the issue:

2.4.0  Ext: I M A F D C V
2.5.0  Ext: I M A F D C (B) V
2.5.0  Z-Atomics: (Zaamo) (Zalrsc)
2.5.0  Z-Cryptography: Zkt (Zbkc)
2.5.0  Z-Multiply: (Zmmul)
2.5.0  Z-Vector: ... Zvfhmin (Zvl32b) (Zvl64b) (Zvl128b)

MangoPi MQ-Pro (Allwinner D1, plain rv64imafdc) — before, the whole Z section was empty:

2.4.0  Ext: I M A F D C
2.5.0  Ext: I M A F D C
2.5.0  Z-Atomics: (Zaamo) (Zalrsc)
2.5.0  Z-Base: (Zicsr)
2.5.0  Z-Compressed: (Zca)
2.5.0  Z-Multiply: (Zmmul)

Nothing that the kernel did report changed, and everything newly shown is parenthesised.

ExtensionEntry/ExtensionInfo への derived: bool 追加は、全フィールド公開・
#[non_exhaustive] なしの公開構造体にとって Rust API の破壊的変更(構造体
リテラルでの生成が壊れる)。JSON 消費者にとって加算的であることとは別の
話なので、riscfetch-core を 2.4.0 -> 3.0.0 に、riscfetch-cli の依存も追従
させる(cli 自身と workspace は機能追加のみなので 2.5.0 のまま)。
SPEC.md の Derived Extensions 節も、JSON 出力(加算的)と Rust API(破壊的)
を区別する記述に訂正する(issue #10)。
LLVM RISCVFeatures.td の FeatureStdExtZihpm は Implies=[FeatureStdExtZicsr]
なので IMPLICATIONS に追加(zihpm を明示するが zicsr を明示しない ISA
文字列のテストも追加)。Zkr は Implies を持たないため追加しない。

COMPOSITIONS の A の行には、A は ISA manual 上 Zaamo+Zalrsc の合成として
定義され、LLVM の独立ビットマスクは hwprobe 用の識別子であって独自の挙動
ではない旨のコメントを添える。

--explain の括弧付き派生ラベルは実際の最長ラベル(Sscounterenw 等 12 文字、
派生の (Zvl16384b) 等 11 文字)に対して幅指定が 10 文字で不足していたため
12 文字に広げる(#10)。
@kako-jun
kako-jun merged commit 1b4daa9 into main Sep 17, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Treat implications between extensions

1 participant