The repository now includes a local embedded smoke harness:
python3 scripts/run_embedded_smoke.pyThis lane is intentionally separate from scripts/run_proofs.py. The full
corpus remains available for local/manual runs, and the named concurrency suite
is also used by the blocking CI embedded job as part of the admitted
Jorvik-backed concurrency contract. See
jorvik_concurrency_contract.md.
If you want to deploy an arbitrary single-file Safe program instead of running
the fixed smoke corpus, see embedded_deploy.md.
- Linux host only
- Renode only
- current emitted
pragma Profile (Jorvik)must work unchanged - built-in STM32F4 runtime only:
light-tasking-stm32f4
- target board model is STM32F4 Discovery / STM32F407-class
- pass/fail is based on an exported RAM status word, not on
printoutput
The harness expects these tools on PATH:
alrgprbuildrenodearm-elf-gnatlsorarm-eabi-gnatls
The first matching ARM triplet is used for the whole run:
arm-elfarm-eabi
The selected toolchain must also provide the built-in Ada runtime:
light-tasking-stm32f4
The harness checks that runtime with <triplet>-gnatls --RTS=light-tasking-stm32f4 -v
before it starts the Jorvik probe or any real case.
List the available cases:
python3 scripts/run_embedded_smoke.py --list-casesList the available suites:
python3 scripts/run_embedded_smoke.py --list-suitesRun the STM32F4 target:
python3 scripts/run_embedded_smoke.py --target stm32f4Run only the blocking concurrency suite:
python3 scripts/run_embedded_smoke.py --target stm32f4 --suite concurrencyRun the STM32F4 target and one case:
python3 scripts/run_embedded_smoke.py --target stm32f4 --case binary_shift_resultKeep generated build and simulator artifacts:
python3 scripts/run_embedded_smoke.py --target stm32f4 --keep-tempThe harness uses the dedicated tests/embedded/ corpus instead of the
print-heavy Rosetta samples:
entry_integer_result.safepackage_integer_result.safebinary_shift_result.safescoped_receive_result.safeproducer_consumer_result.safedelay_scope_result.safeselect_priority_result.safestring_channel_result.safe
The blocking concurrency suite is the bounded subset:
scoped_receive_result.safeproducer_consumer_result.safedelay_scope_result.safeselect_priority_result.safestring_channel_result.safe
Before running the corpus for a target, the harness also builds and runs a tiny generated Jorvik startup probe under Renode. That probe proves both:
- the selected built-in
light-tasking-stm32f4runtime accepts the emittedgnat.adc - the runtime's startup/elaboration path completes under Renode
Each case is emitted to Ada and rebuilt with a generated embedded driver. That
driver exports a stable symbol named safe_embedded_status:
0= still running1= pass2= fail
The harness launches Renode headlessly and polls the exported status word
through the Renode monitor with sysbus ReadDoubleWord. It does not rely on
Ada.Text_IO, semihosting, or UART capture.
- No timing or cycle-accuracy claims
- No peripheral validation beyond runtime startup/elaboration
- No GNATemulator backend in this first lane
- No
print-based embedded assertions - No F0/G0 crate-based runtime path anymore; the harness is currently F4-only
- The blocking CI job covers only the named concurrency suite; the remaining embedded cases stay local/manual hardening coverage