feat(falcon): v0.6.0 — WASM component pipeline, meld fuse → synth → ARM ELF#17
Conversation
…RM ELF
Reworked v0.6. Original scope was hardware bring-up on a Cube Orange;
hardware wasn't in place, so v0.6 became the WASM component pipeline +
Renode emulation — exercises the full meld → wasm-opt → synth
toolchain and produces a real ARM Cortex-M ELF, hardware-independent.
What lands:
WASM components
- wasm/falcon-mix-component, wasm/falcon-rate-component — cdylib
wrappers exposing relay-mix-quad / relay-rate as scalar-ABI WASM
exports (#[export_name] kebab names matching the WIT worlds).
rlib path unit-tested natively against the control crates (5 tests).
- wit/falcon-control/{mixer,rate}.wit — WIT worlds in the shape
spar-codegen's wit_gen emits from the AADL model.
Pipeline
- scripts/falcon-wasm-pipeline.sh — cargo build wasm32 → wasm-tools
component embed+new → meld fuse --memory shared → wasm-opt -Os →
synth compile --cortex-m. wasmtime is the reference oracle.
Result: 2 components → meld fuse → 4412 B → wasm-opt → 4126 B →
synth → 1716 B ARM Cortex-M ELF (fused) + 911 B (mixer).
- renode/falcon-cortex-m.resc — Renode STM32H743 machine script;
runs in Linux CI via renode-bazel-rules.
- meld + synth cargo-installed as pinned ~/.cargo/bin binaries.
Rivet
- FV-FALCON-PIPELINE-001 verification artifact (4 extractable steps).
- FEAT-FALCON-v0.6 reworked pending → approved.
Tool issues found during bring-up — investigated + filed upstream:
- synth#120 — unmapped-vreg panic on f32 division (float::div);
falcon-rate-component standalone trips it, fused module is fine.
Commented with the falcon repro.
- synth#124 (filed) — synth verify advertised but inert without
--features verify.
- meld#172 (filed) — meld fuse --memory multi default rejected by
wasm-opt/synth; pipeline uses --memory shared --address-rebase.
Verification
- cargo test --workspace: 65 test suites green (was 61 in v0.5)
- bash scripts/falcon-wasm-pipeline.sh: PASS
- python3 scripts/run-falcon-verification.py: ✅ 9/9 artifacts green
- rivet validate: 0 broken cross-references
Deferred to v0.7
- ekf/att/pos crates through the pipeline (gated on synth#120 —
they do f32 division)
- Full Bazel integration via rules_wasm_component
- Live Renode run in CI
- synth verify Z3 translation validation (gated on synth#124)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
running 13 tests test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 13 tests test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 13 tests test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.11s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 10 tests test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s --- scenario: mission --- running 3 tests test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 2 tests test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 3 tests test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 2 tests test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 10 tests test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 10 tests test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 10 tests test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.10s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 13 tests test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 13 tests test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 13 tests test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.60s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 10 tests test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s --- scenario: step --- running 9 tests test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 9 tests test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 9 tests test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.09s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 33 tests test result: ok. 33 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 33 tests test result: ok. 33 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 33 tests test result: ok. 33 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.40s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 16 tests test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 16 tests test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 16 tests test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.78s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 5 tests test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s --- noise=0 (deterministic) --- running 10 tests test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 10 tests test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 10 tests test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.10s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 10 tests test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s --- scenario: attitude --- running 9 tests test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.06s [falcon-hello-demo] building release binary... falcon verification gate (filter: (has-tag "falcon"))9 artifact(s) matched: FV-FALCON-POS-001, FV-FALCON-PIPELINE-001, FV-FALCON-MIX-001, FV-FALCON-RATE-001, FV-FALCON-EKF-STUB-001, FV-FALCON-MAVLINK-001, FV-FALCON-EKF-001, FV-FALCON-ATT-001, FV-FALCON-WORLD-001[ PASS] ( 8.33s) FV-FALCON-POS-001: cargo test -p relay-pos ✅ Rivet verification gate — falcon9/9 passed
Source of truth: |
Summary
v0.6 reworked. Original scope was hardware bring-up on a Cube Orange — hardware wasn't in place, so v0.6 became the WASM component pipeline + Renode emulation: control crates → WASM →
meld fuse→wasm-opt→synth→ real ARM Cortex-M ELF. Hardware-independent, CI-reproducible.What's in
wasm/falcon-mix-component,wasm/falcon-rate-component— cdylib wrappers exposingrelay-mix-quad/relay-rateas scalar-ABI WASM exports. rlib path unit-tested natively (5 tests).wit/falcon-control/{mixer,rate}.wit— WIT worlds in the spar-codegenwit_genshape.scripts/falcon-wasm-pipeline.sh— reproduciblecargo wasm32 → wasm-tools → meld fuse → wasm-opt → synthpipeline; wasmtime as reference oracle.renode/falcon-cortex-m.resc— Renode STM32H743 machine script (runs in Linux CI via renode-bazel-rules).FV-FALCON-PIPELINE-001,FEAT-FALCON-v0.6reworked.cargo install'd as pinned binaries.Pipeline result
cargo test --workspacebash scripts/falcon-wasm-pipeline.shrivet validateTool issues found + tracked
Bring-up surfaced three real tool issues — all investigated and filed upstream:
unmapped vregpanic on f32 division (float::div).falcon-rate-componentstandalone trips it; the meld-fused module compiles fine. Commented with the falcon repro.synth verifyadvertised in CLI but inert without--features verify.meld fusedefaults to--memory multi, rejected by wasm-opt/synth; pipeline uses--memory shared.Test plan
bash scripts/falcon-wasm-pipeline.shPASSes locally (needs wasm-tools, meld, synth, wasm-opt on PATH)Deferred to v0.7
ekf/att/poscrates through the pipeline (gated on synth#120 — they do f32 division)rules_wasm_componentsynth verifyZ3 translation validation (gated on synth#124)🤖 Generated with Claude Code