From c0330d5f0b6753c9dc379539733a5795b45a8dba Mon Sep 17 00:00:00 2001 From: Ralf Anton Beier Date: Thu, 27 Aug 2026 08:48:03 +0200 Subject: [PATCH] feature: ALL FIVE falcon cascade stages export and the fused image EXECUTES on the RT1176 M7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit synth's increment 2 (PR#1075, "frame-homed overflow VFP locals") removes the 13->14 homed-local wall that jess's fixture isolated. jess built synth main from source, confirmed increment 2 was present via the discriminating fixture (14-live locals CLEARS, 80-deep stack 0 hits), then closed the gap synth named explicitly and asked jess to close before v0.60. THE CONFIGURATION SYNTH COULD NOT TEST — meld 0.52 fuse --memory shared --pack-rebase over the five published 1.134.1 components -> loom 1.4.1 -> synth main: exit=0 skips=0 5/5 exports: T pulseengine:falcon-cascade/attitude@0.7.0#tick T pulseengine:falcon-cascade/ekf@0.7.0#estimate T pulseengine:falcon-cascade/mixer@0.7.0#mix T pulseengine:falcon-cascade/position@0.7.0#tick T pulseengine:falcon-cascade/rate@0.7.0#tick Their per-stage result reproduces at the FUSED level — the open question, since --pack-rebase merges all five into one 64 KB linear memory and could plausibly have changed the pressure. AND IT EXECUTES: self-contained EXEC, 94,907 B (was 65,452 with 2 exports, +45%), both TEST-PIX-031 assertions pass — linear-memory init byte-exact at the same four non-zero probes (values unchanged; the fused linear memory is identical, only relocated in flash), PC 0x16C, 213,439 instructions retired. WHAT THIS DOES NOT PROVE, stated plainly upstream and here: this is "the fused image loads, initialises its linear memory correctly, and executes without stalling or faulting". It is NOT "attitude#tick and ekf#estimate compute correct values" — that needs canonical-ABI argument marshalling, which is the next rung and where relay's SIL reference (0.193 s, |err| 0.0059 rad/s) becomes the baseline. No regression: rate and mixer still export; the image still initialises and runs. Verified: oracle 2/2 OK on the new image; rivet validate PASS. Co-Authored-By: Claude Opus 4.8 --- artifacts/phase2-pixhawk.yaml | 14 ++++++++++---- .../renode/cascade-m7/falcon-cascade-m7.elf | Bin 65452 -> 94907 bytes 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/artifacts/phase2-pixhawk.yaml b/artifacts/phase2-pixhawk.yaml index 782aa9f..5bb0f26 100644 --- a/artifacts/phase2-pixhawk.yaml +++ b/artifacts/phase2-pixhawk.yaml @@ -550,10 +550,16 @@ artifacts: meld 0.52.0 `fuse --memory shared --pack-rebase` (5 pages / 320 KB -> 1 page / 64 KB) -> loom 1.2.0 optimize -> synth 0.55 `compile -t cortex-m7dp --cortex-m` = a self-contained EXEC image, 65,452 B, entry 0x81, text at 0x0, RW at 0x20000000 (DTCM), exporting - pulseengine:falcon-cascade/{rate@0.7.0#tick, mixer@0.7.0#mix} as real defined symbols. - Three functions remain skipped, ALL GI-FPU-002 (VFP register-file exhaustion, synth#881), so - iekf/position/attitude entry points are NOT in this image - expected, and the single remaining - upstream gate. + the cascade entry points as real defined symbols. + *** UPDATED 2026-08-27: ALL FIVE STAGES NOW EXPORT AND THE IMAGE STILL EXECUTES. *** synth + increment 2 (PR#1075, "frame-homed overflow VFP locals", on synth main) removes the 13->14 + homed-local wall, and the fused --pack-rebase image compiles with 0 SKIPS and 5/5 exports: + attitude@0.7.0#tick, ekf@0.7.0#estimate, mixer@0.7.0#mix, position@0.7.0#tick, rate@0.7.0#tick. + Image 65,452 -> 94,907 B (+45%). Both oracle assertions still pass (PC 0x16C, 213,439 + instructions retired, linear-memory init byte-exact at the same four non-zero probes - the probe + VALUES are unchanged because the fused linear memory is identical, only relocated in flash). + This closed the gap synth named explicitly: they verified per-stage but not on the meld-fused + image (their local meld predates fuse --pack-rebase), and asked jess to close it before v0.60. ASSERTIONS, each chosen to be OBSERVABLE (a check that cannot fail is not a check): A LINEAR-MEMORY INIT - the reset handler copies 0xd061 (53,345) B of wasm linear memory from flash 0x2ac8 to RAM 0x20000100. Probes are deliberately NON-ZERO words, because RAM reads diff --git a/hardware/renode/cascade-m7/falcon-cascade-m7.elf b/hardware/renode/cascade-m7/falcon-cascade-m7.elf index 79faee13177b083c141d2d32a2ace5b76246568e..a741a0b5d4433ccc5cd60f3b41da1eb6d1c6364f 100644 GIT binary patch literal 94907 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