From f238f02afab66933abeab84bfe43f4b1322d51c5 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 1 Oct 2026 00:55:20 +0000 Subject: [PATCH 001/135] docs(v4.0.0): record D-1..D-8 rulings in DECOMPOSITION.md D-1 word addressing; D-2 F18 circular stacks (10/9 deep), hidden, so DEPTH/PICK/ROLL/.S/SP@/SP! are retired everywhere and the DSP register is dropped; D-3 plain F18 +* (UM* flagged for revision); D-5 host width matches the host CPU; D-7 moot; D-8 signed Q48.16; D-4 and D-6 deferred to the hosted-mesh step. Adds a note that every CAP definition must be re-checked against the 10/9 stack depths. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01BY9HMwK5Cetz3caBgHGyds --- docs/v4.0.0/DECOMPOSITION.md | 52 +++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/docs/v4.0.0/DECOMPOSITION.md b/docs/v4.0.0/DECOMPOSITION.md index ae8a99d1..8ae8e135 100644 --- a/docs/v4.0.0/DECOMPOSITION.md +++ b/docs/v4.0.0/DECOMPOSITION.md @@ -18,7 +18,7 @@ model produces the same results as the v3 C primitive it replaces. 0. [Fates](#0-fates) 1. [The v4 core ISA](#1-the-v4-core-isa) 2. [Compiler conventions](#2-compiler-conventions) -3. [Open decisions](#3-open-decisions) +3. [Decisions](#3-decisions) 4. [Foundation layer (new words)](#4-foundation-layer-new-words) 5. [Fate of every v3 primitive](#5-fate-of-every-v3-primitive) 6. [Messaging between nodes](#6-messaging-between-nodes) @@ -48,9 +48,9 @@ model produces the same results as the v3 C primitive it replaces. | Item | v4 node | | --- | --- | | Cell | 32 bits (mesh node). The host node's width is a build parameter; see D-5. | -| Addressing | Word-addressed (pending D-1). | +| Addressing | Word-addressed (D-1). | | Registers | `T` (top of data stack), `S` (second), `R` (top of return stack), `P` (program counter), `A` and `B` (address registers). | -| Stacks | Hardware stacks below `S` and `R`. Depth and visibility are D-2. | +| Stacks | F18 circular hardware stacks, not visible to code (D-2): data stack `T`, `S` + 8 circular (10 deep), return stack `R` + 8 circular (9 deep). No overflow or underflow; pushing past the bottom silently overwrites the oldest entry. | | Instruction word | Six 5-bit slots, plus 2 spare bits. | ### 1.2 Instruction word layout @@ -154,21 +154,28 @@ document that clobber `A`: `@ ! +! -! 2@ 2! C@ C! UM* * UM/MOD SEND RECV`. Words --- -## 3. Open decisions +## 3. Decisions -These must be settled before the golden model is built. Where a definition below depends on one, it -says so. +Ruled by Captain Bob, 2026-10-01, except D-4 and D-6, which are deferred to development step 2 (the +hosted mesh, `JUSTIFICATION.md` §10) because only the mesh and the RTL depend on them. Where a +definition below depends on one, it says so. -| ID | Decision | Default in this document | +| ID | Decision | Ruling | | --- | --- | --- | -| **D-1** | Word addressing (pure Moore) or byte addressing. | Word addressing. `C@`/`C!` are CAP; `CELLS` is a no-op. | -| **D-2** | Stack depth, and whether the stacks are visible (needed by `DEPTH`, `PICK`, `ROLL`, `SP@`, `SP!`). | Stacks backed by node RAM, with the data stack pointer exposed as MM register `DSP`. | -| **D-3** | Exact `+*` semantics at 32 bits: whether the add carries out of `T` into the shift. | Carry is kept (extended multiply step), so `UM*` returns a full 64-bit product. | -| **D-4** | Node memory map, including port and register addresses. | Symbolic names only (§6, §7). | -| **D-5** | Host node cell width. | 32 on a Zynq-7000 (Cortex-A9); 64 on an aarch64 host. The compiler capsule is written width-independent. | -| **D-6** | Which heat structures exist in hardware: per-opcode counters only, or also per-call-target and word-to-word transition counters. | Per-opcode and per-call-target. Transition counters deferred. | -| **D-7** | `ROLL` semantics. | Fix to ANS (count from the top). v3's bottom-counting `ROLL` is retired. | -| **D-8** | Q48.16 signedness. | Signed. v3's unsigned comparisons and `Q.FROM-INT` clamping are retired. | +| **D-1** | Word addressing (pure Moore) or byte addressing. | **Word addressing.** `C@`/`C!` are CAP; `CELLS` is a no-op. | +| **D-2** | Stack depth, and whether the stacks are visible. | **F18 circular stacks, hidden.** Data stack 10 deep (`T`, `S` + 8 circular), return stack 9 deep (`R` + 8 circular), exactly as the F18. No stack pointer is visible to code, so `DEPTH`, `PICK`, `ROLL`, `.S`, `SP@` and `SP!` are **retired everywhere**, host node included. | +| **D-3** | Exact `+*` semantics at 32 bits: whether the add carries out of `T` into the shift. | **Plain F18 semantics.** The carry out of `T` is not kept. `UM*` in §4 must be revised accordingly (see the note there). | +| **D-4** | Node memory map, including port and register addresses. | **Deferred** to step 2. Symbolic names only for now (§6, §7). | +| **D-5** | Host node cell width. | **Match the host CPU:** 32 on a Zynq-7000 (Cortex-A9), 64 on an aarch64 host. The compiler capsule is written width-independent. | +| **D-6** | Which heat structures exist in hardware: per-opcode counters only, or also per-call-target and word-to-word transition counters. | **Deferred** to step 2. The golden model implements per-opcode and per-call-target heat in the meantime. | +| **D-7** | `ROLL` semantics. | **Moot.** `ROLL` is retired under D-2. | +| **D-8** | Q48.16 signedness. | **Signed.** v3's unsigned comparisons and `Q.FROM-INT` clamping are retired. | + +**Consequences of D-2 that every definition must respect.** The data stack holds 10 items and the +return stack 9, and every `call`, `FOR`, `DO` loop frame and `push` uses return-stack slots. Nesting +is therefore shallow, and exceeding either depth corrupts silently rather than faulting. Every CAP +definition in §4 and §5 must be re-checked against these limits before it is accepted as a POST +target; the hand traces so far assumed unbounded stacks. --- @@ -193,6 +200,10 @@ dependency order. : U< ( u1 u2 -- flag ) 2DUP xor 0< IF NIP 0< ELSE - 0< THEN ; \ ---- multiply (D-3) ----------------------------------------------------- +\ NEEDS REVISION: written for the carry-keeping +* that D-3 rejected. With +\ plain F18 +* the carry out of T is lost, so this is only correct when the +\ partial sums never overflow T (operands below 2^31). A full-range UM* +\ needs a correction step; to be rewritten and proven on the golden model. : UM* ( u1 u2 -- ulo uhi ) a! 0 31 FOR +* UNEXT push drop a pop ; \ ---- divide: 32-step restoring division, divisor held in A -------------- @@ -237,9 +248,9 @@ Section numbers match the v3 primitive reference. | `?DUP` | CAP | `dup IF dup THEN` | | `ROT` | CAP | §4 | | `-ROT` | CAP | `ROT ROT` | -| `DEPTH` | MM | Read `DSP` (D-2). | -| `PICK` | MM + CAP | Read stack RAM at `DSP − n` (D-2). 0-based, as in v3. | -| `ROLL` | CAP | Rewritten with ANS semantics (D-7), using `PICK` and a copy loop. | +| `DEPTH` | RET | No visible stack pointer (D-2). | +| `PICK` | RET | No visible stack pointer (D-2). | +| `ROLL` | RET | No visible stack pointer (D-2); D-7 is moot. | ### 5.2 Return stack @@ -374,7 +385,7 @@ All output reaches the console through `EMIT` (DEV). | --- | --- | --- | | `<#` `#` `#S` `HOLD` `SIGN` `#>` | CAP | Standard pictured-output definitions over `UM/MOD` and a hold buffer. v3's tolerant `#>` (pops `ud` only if present) is not kept; v4 follows the standard stack effect. | | `.` `.R` `U.` `U.R` `D.` `D.R` | CAP | Built on pictured output and `TYPE`. | -| `.S` | CAP | Walks the stack via `DSP` (D-2). | +| `.S` | RET | No visible stack pointer (D-2). | | `?` | CAP | `@ .` | | `DUMP` | CAP | Loop over `@`/`C@` with pictured output. | | `BASE` | CAP | Variable. | @@ -441,7 +452,7 @@ The storage service belongs to the Artemis role, now a device node. | Word | Fate | Notes | | --- | --- | --- | | `HERE` `ALIGN` `ALLOT` `,` `C,` `2,` `PAD` `LATEST` | CC | The dictionary lives on the host node. | -| `SP@` `SP!` | MM | `DSP` register (D-2). | +| `SP@` `SP!` | RET | No visible stack pointer (D-2). | ### 5.13 Dictionary manipulation @@ -688,7 +699,6 @@ Addresses are assigned in the node memory map (D-4). Names only here. | Register | Access | Contents | | --- | --- | --- | -| `DSP` | R/W | Data stack pointer (D-2). | | `HEAT-OP[0..31]` | R | Per-opcode retirement heat. | | `HEAT-CALL[...]` | R/W | Per-call-target heat, with freeze bit (D-6). | | `ANTICLOCK` | R | Virtual tick: a pure function of the execution stream. | -- 2.54.0 From a8b70e88d31fe2824b6df16e0efde50809d31bd2 Mon Sep 17 00:00:00 2001 From: rajames Date: Thu, 1 Oct 2026 15:40:09 -0400 Subject: [PATCH 002/135] Reorganize source tree: kernel/, v3/, v4/ split and board infrastructure Source tree reorganization: - Move StarForth v3 engine to v3/ (src/, include/, Makefile) - Move kernel to kernel/ (src/, include/, linker/, Makefile) - Create v4/ skeleton for F18-ISA golden model (DECOMPOSITION.md, JUSTIFICATION.md) - Move FABRIC-0..4.md to docs/fabric/ - Move ONTOLOGY.md and ROADMAP.md to docs/ Board infrastructure: - Add boards/ser5/, boards/raspi/, boards/milkv/, boards/zynq7020/ - Each board has board.mk (ISA, CPU flags, boot recipe) and README.md - Root Makefile becomes thin dispatcher: boot_image, all, clean, docs take TARGET - make boot_image TARGET=SER5|RASPI|MILKV builds one GPT/MBR image per board - ZYNQ7020 target exists but stops with clear error (ARMv7 port not built yet) - scripts/mkdiskimage.sh builds disk images for all boards Docs pipeline: - docs/book/ with LaTeX master (main.tex) and Makefile - pandoc converts Markdown to LaTeX at build time - Two Lua filters: table-widths.lua (wide tables wrap), code-breaks.lua (inline code breaks) - make docs builds single PDF (754 pages, 0 missing characters) - make docs TARGET= adds board appendix - build/docs//meta.tex stamps git commit into PDF Bug fixes: - 42 include paths that only worked by accident now use correct relative paths - clang-18 hardcode replaced with configurable CC variable (fixed aarch64 build) - Pi 5: kernel_2712.img linked at 0x80000, .bss zeroed, memory reserved - Doxyfile, .clang-tidy, README.md, Kconfig paths updated Verified: - Hosted v3 build passes 1012 tests, 0 failures - SER5 image boots in QEMU (OVMF), POST passes, K exact (65536 = Q48_ONE) - Milk-V image boots in QEMU (OpenSBI + U-Boot + bootefi), POST passes - make clean TARGET= removes only that board and its ISA objects - make all builds all boards, hosted v3, and docs in one run Co-authored-by: Junie --- .clang-tidy | 2 +- .clang-tidy-ignore | 56 +- .claude/CLAUDE.md | 40 +- Doxyfile | 17 +- Kconfig.arch | 2 +- Kconfig.heartbeat | 2 +- Kconfig.kernel | 2 +- Makefile | 1447 ++--------------- README.md | 34 +- boards/README.md | 29 + boards/milkv/README.md | 30 + boards/milkv/board.mk | 11 + boards/raspi/README.md | 20 + boards/raspi/board.mk | 18 + {boot_media/rpi5 => boards/raspi}/config.txt | 7 + boards/ser5/README.md | 14 + boards/ser5/board.mk | 10 + boards/zynq7020/README.md | 17 + boards/zynq7020/board.mk | 11 + boot_media/rpi5/README.md | 12 - capsules/BLOCK_MAP.md | 82 +- configs/README.md | 2 +- ONTOLOGY.md => docs/ONTOLOGY.md | 0 ROADMAP.md => docs/ROADMAP.md | 0 docs/book/Makefile | 112 ++ docs/book/README.md | 66 + docs/book/main.tex | 161 ++ docs/book/pandoc/code-breaks.lua | 29 + docs/book/pandoc/highlighting.latex | 3 + docs/book/pandoc/table-widths.lua | 55 + FABRIC-0.md => docs/fabric/FABRIC-0.md | 0 FABRIC-1.md => docs/fabric/FABRIC-1.md | 0 FABRIC-2.md => docs/fabric/FABRIC-2.md | 0 FABRIC-3.5.md => docs/fabric/FABRIC-3.5.md | 0 FABRIC-3.6.md => docs/fabric/FABRIC-3.6.md | 0 FABRIC-3.7.md => docs/fabric/FABRIC-3.7.md | 0 FABRIC-3.md => docs/fabric/FABRIC-3.md | 0 FABRIC-4.md => docs/fabric/FABRIC-4.md | 0 Makefile.starkernel => kernel/Makefile | 282 ++-- .../include}/starkernel/README.md | 0 {include => kernel/include}/starkernel/apic.h | 0 {include => kernel/include}/starkernel/arch.h | 0 .../include}/starkernel/artemis_sig.h | 0 .../include}/starkernel/blkio_usb.h | 0 .../include}/starkernel/boot_info_offsets.h | 0 .../include}/starkernel/capsule.h | 0 .../include}/starkernel/capsule_birth.h | 0 .../include}/starkernel/capsule_console.h | 0 .../include}/starkernel/capsule_generated.h | 0 .../include}/starkernel/capsule_loader.h | 0 .../include}/starkernel/capsule_mint.h | 0 .../include}/starkernel/capsule_run.h | 0 .../include}/starkernel/capsule_runcap.h | 0 .../include}/starkernel/capsule_sig.h | 0 .../include}/starkernel/capsule_vm_physics.h | 0 .../starkernel/capsule_vm_switch_signal.h | 0 .../include}/starkernel/capsule_wirebind.h | 0 .../include}/starkernel/capsule_zuse_boot.h | 0 .../include}/starkernel/cmdline.h | 0 .../include}/starkernel/console.h | 0 .../include}/starkernel/doe_log.h | 0 .../include}/starkernel/ed25519.h | 0 .../include}/starkernel/elf64.h | 0 .../include}/starkernel/elf_loader.h | 0 {include => kernel/include}/starkernel/fdt.h | 0 .../include}/starkernel/fe25519.h | 0 .../include}/starkernel/framebuffer.h | 0 .../starkernel/freestanding/README.md | 0 .../include}/starkernel/freestanding/assert.h | 0 .../include}/starkernel/freestanding/ctype.h | 0 .../include}/starkernel/freestanding/errno.h | 0 .../starkernel/freestanding/inttypes.h | 0 .../include}/starkernel/freestanding/math.h | 0 .../include}/starkernel/freestanding/sched.h | 0 .../include}/starkernel/freestanding/signal.h | 0 .../include}/starkernel/freestanding/stdio.h | 0 .../include}/starkernel/freestanding/stdlib.h | 0 .../include}/starkernel/freestanding/string.h | 0 .../starkernel/freestanding/sys/README.md | 0 .../starkernel/freestanding/sys/time.h | 0 .../starkernel/freestanding/sys/types.h | 0 .../include}/starkernel/freestanding/time.h | 0 .../include}/starkernel/hal/README.md | 0 .../include}/starkernel/hal/hal.h | 0 .../include}/starkernel/hal_memory.h | 0 .../include}/starkernel/homeblocks_sig.h | 0 .../include}/starkernel/i8042.h | 0 .../include}/starkernel/ioapic.h | 0 .../include}/starkernel/kernel_args.h | 0 .../include}/starkernel/kmalloc.h | 0 {include => kernel/include}/starkernel/log.h | 0 .../include}/starkernel/log_attrib.h | 0 .../include}/starkernel/log_region.h | 0 {include => kernel/include}/starkernel/pci.h | 0 {include => kernel/include}/starkernel/plic.h | 0 {include => kernel/include}/starkernel/pmm.h | 0 .../include}/starkernel/q48_16.h | 0 {include => kernel/include}/starkernel/repl.h | 0 {include => kernel/include}/starkernel/rng.h | 0 .../include}/starkernel/rpi5_dtb.h | 0 .../include}/starkernel/rpi5_mailbox.h | 0 .../include}/starkernel/rpi5_native_boot.h | 0 .../include}/starkernel/rpi5_native_entry.h | 0 .../include}/starkernel/scalar25519.h | 0 .../include}/starkernel/session.h | 0 .../include}/starkernel/sha512.h | 0 .../include}/starkernel/timer.h | 0 {include => kernel/include}/starkernel/ttf.h | 0 {include => kernel/include}/starkernel/uefi.h | 0 .../include}/starkernel/user_identity_seed.h | 0 .../include}/starkernel/virtio_blk.h | 0 .../include}/starkernel/virtio_input.h | 0 .../include}/starkernel/virtio_rng.h | 0 .../include}/starkernel/vm/README.md | 0 .../include}/starkernel/vm/arena.h | 0 .../starkernel/vm/bootstrap/README.md | 0 .../starkernel/vm/bootstrap/sk_vm_bootstrap.h | 0 .../include}/starkernel/vm/kernel_hermes.h | 0 .../include}/starkernel/vm/parity.h | 0 .../include}/starkernel/vm/stadium.h | 0 .../include}/starkernel/vm/stadium_blocks.h | 0 .../include}/starkernel/vm/stadium_words.h | 0 .../include}/starkernel/vm/switch.h | 0 .../include}/starkernel/vm_identity.h | 0 .../include}/starkernel/vm_uuid.h | 0 {include => kernel/include}/starkernel/vmm.h | 0 .../include}/starkernel/vt100.h | 0 .../include}/starkernel/x509_ed25519.h | 0 {include => kernel/include}/starkernel/xhci.h | 0 .../include}/starkernel/xhci_driver.h | 0 .../include}/starkernel/xxhash64.h | 0 .../include}/starkernel/zuse_cert_devblock.h | 0 .../include}/starkernel/zuse_eligibility.h | 0 .../starkernel/zuse_eligibility_list.h | 0 .../include}/starkernel/zuse_genesis_marker.h | 0 {linker => kernel/linker}/README.md | 0 {linker => kernel/linker}/starkernel-amd64.ld | 0 .../linker}/starkernel-kernel-aarch64.ld | 0 .../linker}/starkernel-kernel-amd64.ld | 0 .../linker}/starkernel-kernel-riscv64.ld | 0 .../linker}/starkernel-loader-aarch64-pe.ld | 0 .../linker}/starkernel-loader-aarch64.ld | 0 .../linker}/starkernel-loader-amd64-pe.ld | 0 .../linker}/starkernel-loader-amd64.ld | 0 .../linker}/starkernel-loader-riscv64.ld | 0 kernel/linker/starkernel-native-rpi5.ld | 74 + {src/starkernel => kernel/src}/README.md | 0 .../src}/arch/aarch64/README.md | 0 .../src}/arch/aarch64/apic.c | 0 .../src}/arch/aarch64/arch.c | 0 .../src}/arch/aarch64/boot.S | 0 .../src}/arch/aarch64/interrupts.c | 0 .../src}/arch/aarch64/isr.S | 0 .../src}/arch/aarch64/native_rpi5_entry.S | 38 +- .../src}/arch/aarch64/rpi5_dtb.c | 0 .../src}/arch/aarch64/rpi5_mailbox.c | 0 .../src}/arch/aarch64/rpi5_native_boot.c | 0 .../src}/arch/aarch64/switch.S | 0 .../src}/arch/aarch64/timer.c | 0 .../src}/arch/amd64/README.md | 0 .../src}/arch/amd64/apic.c | 0 .../src}/arch/amd64/arch.c | 0 .../src}/arch/amd64/boot.S | 0 .../src}/arch/amd64/i8042.c | 0 .../src}/arch/amd64/interrupts.c | 0 .../src}/arch/amd64/ioapic.c | 0 .../src}/arch/amd64/isr.S | 0 .../src}/arch/amd64/kernel_entry.S | 0 .../src}/arch/amd64/switch.S | 0 .../src}/arch/amd64/timer.c | 0 .../src}/arch/riscv64/README.md | 0 .../src}/arch/riscv64/apic.c | 0 .../src}/arch/riscv64/arch.c | 0 .../src}/arch/riscv64/boot.S | 0 .../src}/arch/riscv64/interrupts.c | 0 .../src}/arch/riscv64/isr.S | 0 .../src}/arch/riscv64/kernel_entry.S | 0 .../src}/arch/riscv64/plic.c | 0 .../src}/arch/riscv64/switch.S | 0 .../src}/arch/riscv64/timer.c | 0 {src/starkernel => kernel/src}/artemis_sig.c | 0 {src/starkernel => kernel/src}/boot/README.md | 0 {src/starkernel => kernel/src}/boot/cmdline.c | 0 .../src}/boot/elf_loader.c | 0 {src/starkernel => kernel/src}/boot/reloc.S | 0 .../src}/boot/reloc_stub.c | 0 .../src}/boot/uefi_loader.c | 0 .../src}/capsule/README.md | 0 .../src}/capsule/capsule_birth.c | 0 .../src}/capsule/capsule_console.c | 0 .../src}/capsule/capsule_find.c | 0 .../src}/capsule/capsule_loader.c | 0 .../src}/capsule/capsule_mint.c | 0 .../src}/capsule/capsule_run.c | 0 .../src}/capsule/capsule_runcap.c | 0 .../src}/capsule/capsule_sig.c | 0 .../src}/capsule/capsule_validate.c | 0 .../src}/capsule/capsule_vm_hooks.c | 0 .../src}/capsule/capsule_vm_physics.c | 0 .../src}/capsule/capsule_vm_switch_signal.c | 0 .../src}/capsule/capsule_wirebind.c | 0 .../src}/capsule/capsule_zuse_boot.c | 0 .../src}/capsule/mama_forth_words.c | 2 +- .../src}/capsule/vm_identity.c | 0 .../src}/capsule/vm_uuid.c | 0 .../src}/capsule/zuse_eligibility.c | 0 .../src}/crypto/ed25519.c | 0 .../src}/crypto/fe25519.c | 0 .../src}/crypto/scalar25519.c | 0 .../starkernel => kernel/src}/crypto/sha512.c | 0 .../src}/crypto/x509_ed25519.c | 0 {src/starkernel => kernel/src}/doe_log.c | 0 {src/starkernel => kernel/src}/hal/README.md | 0 {src/starkernel => kernel/src}/hal/console.c | 0 {src/starkernel => kernel/src}/hal/fdt.c | 0 .../starkernel => kernel/src}/hal/font_8x16.c | 0 .../src}/hal/framebuffer.c | 0 {src/starkernel => kernel/src}/hal/hal.c | 0 .../src}/hal/host_services.c | 0 {src/starkernel => kernel/src}/hal/memory.c | 0 {src/starkernel => kernel/src}/hal/ttf.c | 0 {src/starkernel => kernel/src}/hal/vt100.c | 0 {src/starkernel => kernel/src}/hash/README.md | 0 .../starkernel => kernel/src}/hash/xxhash64.c | 0 {src/starkernel => kernel/src}/heartbeat.c | 0 .../src}/homeblocks_sig.c | 0 {src/starkernel => kernel/src}/kernel_main.c | 0 {src/starkernel => kernel/src}/log_region.c | 0 {src/starkernel => kernel/src}/math/README.md | 0 {src/starkernel => kernel/src}/math/q48_16.c | 0 .../src}/memory/README.md | 0 .../src}/memory/kmalloc.c | 0 {src/starkernel => kernel/src}/memory/pmm.c | 0 {src/starkernel => kernel/src}/memory/vmm.c | 0 {src/starkernel => kernel/src}/pci/README.md | 0 {src/starkernel => kernel/src}/pci/pci.c | 0 {src/starkernel => kernel/src}/repl.c | 0 {src/starkernel => kernel/src}/rng/rng.c | 0 .../starkernel => kernel/src}/usb/blkio_usb.c | 0 {src/starkernel => kernel/src}/usb/xhci.c | 0 .../src}/virtio/README.md | 0 .../src}/virtio/virtio_blk.c | 0 .../src}/virtio/virtio_input.c | 0 .../src}/virtio/virtio_rng.c | 0 {src/starkernel => kernel/src}/vm/README.md | 0 .../src}/vm/alloc_kernel.c | 0 {src/starkernel => kernel/src}/vm/arena.c | 0 .../src}/vm/bootstrap/README.md | 0 .../src}/vm/bootstrap/sk_vm_bootstrap.c | 0 .../src}/vm/host/README.md | 0 {src/starkernel => kernel/src}/vm/host/shim.c | 0 .../src}/vm/kernel_hermes.c | 0 {src/starkernel => kernel/src}/vm/parity.c | 0 {src/starkernel => kernel/src}/vm/q48_stubs.c | 0 {src/starkernel => kernel/src}/vm/session.c | 0 {src/starkernel => kernel/src}/vm/stadium.c | 0 .../src}/vm/stadium_blocks.c | 0 .../src}/vm/stadium_words.c | 0 {src/starkernel => kernel/src}/vm/switch.c | 0 .../src}/vm/vm_bootstrap.c | 16 +- {src/starkernel => kernel/src}/vm/vm_core.c | 28 +- .../src}/vm/vm_internal.h | 4 +- .../starkernel => kernel/src}/vm/vm_runtime.c | 16 +- lfs/amd64/starforth | Bin 1544744 -> 1548840 bytes logs2/.gitkeep | 0 logs2/README.md | 7 - logs2/qemu-aarch64-20260609-192112.log | 3 - logs2/qemu-aarch64-20260611-002443.log | 3 - logs2/qemu-aarch64-20260611-024456.log | 3 - logs2/qemu-aarch64-20260611-173737.log | 3 - logs2/qemu-aarch64-20260611-174951.log | 3 - logs2/qemu-aarch64-20260611-175257.log | 3 - logs2/qemu-aarch64-20260611-190822.log | 3 - logs2/qemu-aarch64-20260611-202955.log | 3 - logs2/qemu-aarch64-20260612-132412.log | 3 - logs2/qemu-aarch64-20260612-141722.log | 3 - logs2/qemu-aarch64-20260612-160132.log | 3 - logs2/qemu-aarch64-20260614-164017.log | 3 - logs2/qemu-aarch64-20260614-164043.log | 3 - logs2/qemu-aarch64-20260614-182154.log | 3 - logs2/qemu-aarch64-20260614-190109.log | 3 - logs2/qemu-aarch64-20260614-230803.log | 3 - logs2/qemu-aarch64-20260615-003908.log | 3 - logs2/qemu-aarch64-20260615-005301.log | 3 - logs2/qemu-aarch64-20260615-020020.log | 3 - logs2/qemu-aarch64-20260615-103253.log | 3 - logs2/qemu-aarch64-20260615-103655.log | 3 - logs2/qemu-aarch64-20260615-121103.log | 3 - logs2/qemu-aarch64-20260615-123814.log | 3 - logs2/qemu-aarch64-20260615-160204.log | 3 - logs2/qemu-aarch64-20260615-183010.log | 3 - logs2/qemu-aarch64-20260615-192747.log | 3 - logs2/qemu-aarch64-20260615-194133.log | 3 - logs2/qemu-aarch64-20260615-204232.log | 3 - logs2/qemu-aarch64-20260615-223549.log | 3 - logs2/qemu-aarch64-20260615-235720.log | 3 - logs2/qemu-aarch64-20260616-000920.log | 3 - logs2/qemu-aarch64-20260616-011049.log | 3 - logs2/qemu-aarch64-20260616-112907.log | 3 - logs2/qemu-aarch64-20260616-155223.log | 3 - logs2/qemu-aarch64-20260616-175845.log | 3 - logs2/qemu-aarch64-20260620-222449.log | 3 - logs2/qemu-aarch64-20260621-004736.log | 3 - logs2/qemu-amd64-20260609-184750.log | 3 - logs2/qemu-amd64-20260609-193717.log | 3 - logs2/qemu-amd64-20260611-002301.log | 3 - logs2/qemu-amd64-20260611-012412.log | 3 - logs2/qemu-amd64-20260611-013401.log | 3 - logs2/qemu-amd64-20260611-023023.log | 3 - logs2/qemu-amd64-20260611-023818.log | 3 - logs2/qemu-amd64-20260611-172713.log | 3 - logs2/qemu-amd64-20260611-174904.log | 3 - logs2/qemu-amd64-20260611-175217.log | 3 - logs2/qemu-amd64-20260611-180750.log | 3 - logs2/qemu-amd64-20260611-192015.log | 3 - logs2/qemu-amd64-20260611-201951.log | 3 - logs2/qemu-amd64-20260611-204126.log | 3 - logs2/qemu-amd64-20260611-223613.log | 3 - logs2/qemu-amd64-20260612-110212.log | 3 - logs2/qemu-amd64-20260612-142323.log | 3 - logs2/qemu-amd64-20260612-160656.log | 3 - logs2/qemu-amd64-20260614-163853.log | 3 - logs2/qemu-amd64-20260614-182034.log | 3 - logs2/qemu-amd64-20260614-182119.log | 3 - logs2/qemu-amd64-20260614-183302.log | 3 - logs2/qemu-amd64-20260614-185942.log | 3 - logs2/qemu-amd64-20260614-190244.log | 3 - logs2/qemu-amd64-20260614-212929.log | 3 - logs2/qemu-amd64-20260614-233623.log | 3 - logs2/qemu-amd64-20260615-005725.log | 3 - logs2/qemu-amd64-20260615-020446.log | 3 - logs2/qemu-amd64-20260615-103154.log | 3 - logs2/qemu-amd64-20260615-103619.log | 3 - logs2/qemu-amd64-20260615-103843.log | 3 - logs2/qemu-amd64-20260615-124956.log | 3 - logs2/qemu-amd64-20260615-125017.log | 3 - logs2/qemu-amd64-20260615-125335.log | 3 - logs2/qemu-amd64-20260615-142839.log | 3 - logs2/qemu-amd64-20260615-161023.log | 3 - logs2/qemu-amd64-20260615-180252.log | 3 - logs2/qemu-amd64-20260615-182339.log | 3 - logs2/qemu-amd64-20260615-182946.log | 3 - logs2/qemu-amd64-20260615-183023.log | 3 - logs2/qemu-amd64-20260615-194545.log | 3 - logs2/qemu-amd64-20260615-204632.log | 3 - logs2/qemu-amd64-20260615-223531.log | 0 logs2/qemu-amd64-20260615-223607.log | 3 - logs2/qemu-amd64-20260615-230419.log | 3 - logs2/qemu-amd64-20260616-001614.log | 3 - logs2/qemu-amd64-20260616-011447.log | 3 - logs2/qemu-amd64-20260616-111913.log | 3 - logs2/qemu-amd64-20260616-154608.log | 3 - logs2/qemu-amd64-20260616-175829.log | 3 - logs2/qemu-amd64-20260620-222036.log | 3 - logs2/qemu-amd64-20260621-002830.log | 3 - logs2/qemu-amd64-20260621-004710.log | 3 - logs2/qemu-riscv64-20260609-192223.log | 3 - logs2/qemu-riscv64-20260611-002548.log | 3 - logs2/qemu-riscv64-20260611-003502.log | 3 - logs2/qemu-riscv64-20260611-003801.log | 3 - logs2/qemu-riscv64-20260611-024624.log | 3 - logs2/qemu-riscv64-20260611-173903.log | 3 - logs2/qemu-riscv64-20260611-175348.log | 3 - logs2/qemu-riscv64-20260611-191335.log | 3 - logs2/qemu-riscv64-20260611-203104.log | 3 - logs2/qemu-riscv64-20260612-135612.log | 3 - logs2/qemu-riscv64-20260612-141129.log | 3 - logs2/qemu-riscv64-20260612-174414.log | 3 - logs2/qemu-riscv64-20260614-164140.log | 3 - logs2/qemu-riscv64-20260614-165900.log | 3 - logs2/qemu-riscv64-20260614-170926.log | 3 - logs2/qemu-riscv64-20260614-171955.log | 3 - logs2/qemu-riscv64-20260614-182235.log | 3 - logs2/qemu-riscv64-20260614-190152.log | 3 - logs2/qemu-riscv64-20260614-230220.log | 3 - logs2/qemu-riscv64-20260615-004335.log | 3 - logs2/qemu-riscv64-20260615-004822.log | 3 - logs2/qemu-riscv64-20260615-031059.log | 3 - logs2/qemu-riscv64-20260615-103741.log | 3 - logs2/qemu-riscv64-20260615-122026.log | 3 - logs2/qemu-riscv64-20260615-122930.log | 3 - logs2/qemu-riscv64-20260615-174420.log | 3 - logs2/qemu-riscv64-20260615-183017.log | 3 - logs2/qemu-riscv64-20260615-193223.log | 3 - logs2/qemu-riscv64-20260615-193711.log | 3 - logs2/qemu-riscv64-20260615-214335.log | 3 - logs2/qemu-riscv64-20260615-223550.log | 3 - logs2/qemu-riscv64-20260616-000114.log | 3 - logs2/qemu-riscv64-20260616-000522.log | 3 - logs2/qemu-riscv64-20260616-021123.log | 3 - logs2/qemu-riscv64-20260616-113103.log | 3 - logs2/qemu-riscv64-20260616-155324.log | 3 - logs2/qemu-riscv64-20260616-175915.log | 3 - logs2/qemu-riscv64-20260620-231806.log | 3 - logs2/qemu-riscv64-20260621-004843.log | 3 - logs2/qemu-screenshot-20260609-105458.png | Bin 1375 -> 0 bytes logs2/qemu-screenshot-20260609-130717.png | Bin 1375 -> 0 bytes logs2/qemu-screenshot-20260609-181200.png | Bin 1375 -> 0 bytes logs2/qemu-screenshot-20260609-193724.log | 3 - logs2/qemu-screenshot-20260609-193724.png | Bin 1375 -> 0 bytes logs2/qemu-screenshot-20260609-194549.png | Bin 1375 -> 0 bytes logs2/qemu-screenshot-20260609-194812.png | Bin 1375 -> 0 bytes logs2/qemu-screenshot-20260609-222537.png | Bin 1375 -> 0 bytes logs2/qemu-screenshot-20260609-225958.png | Bin 1375 -> 0 bytes logs2/qemu-screenshot-20260609-232904.png | Bin 1375 -> 0 bytes logs2/qemu-screenshot-20260610-005734.png | Bin 282 -> 0 bytes logs2/qemu-screenshot-20260610-134732.png | Bin 1375 -> 0 bytes logs2/qemu-screenshot-20260610-145902.png | Bin 1375 -> 0 bytes logs2/qemu-screenshot-20260610-213714.png | Bin 1398 -> 0 bytes logs2/qemu-screenshot-20260611-002306.log | 3 - logs2/qemu-screenshot-20260611-004156.log | 3 - logs2/qemu-screenshot-20260611-012817.log | 3 - logs2/qemu-screenshot-20260611-023758.log | 3 - logs2/qemu-screenshot-20260611-024401.log | 3 - logs2/qemu-screenshot-20260611-173657.log | 3 - logs2/qemu-screenshot-20260611-174914.log | 3 - logs2/qemu-screenshot-20260611-175224.log | 3 - logs2/qemu-screenshot-20260611-190757.log | 3 - logs2/qemu-screenshot-20260611-202932.log | 3 - logs2/qemu-screenshot-20260612-115354.log | 3 - logs2/qemu-screenshot-20260612-160054.log | 3 - logs2/qemu-screenshot-20260612-174331.log | 3 - logs2/qemu-screenshot-20260614-163902.log | 3 - logs2/qemu-screenshot-20260614-182044.log | 0 logs2/qemu-screenshot-20260614-182127.log | 3 - mk/Kconfig.mk | 4 +- mk/README.md | 2 +- scripts/mkdiskimage.sh | 91 ++ scripts/perf-profile.sh | 2 +- scripts/perf-profile_control.sh | 2 +- scripts/remove_loop_conditionals.sh | 6 +- tools/README.md | 6 +- tools/ttftest.c | 2 +- v3/Makefile | 1340 +++++++++++++++ {include => v3/include}/README.md | 0 {include => v3/include}/arch_detect.h | 0 {include => v3/include}/blkcfg.h | 0 {include => v3/include}/blkio.h | 0 {include => v3/include}/blkio_factory.h | 0 {include => v3/include}/block_subsystem.h | 0 {include => v3/include}/cli.h | 0 {include => v3/include}/compudynamics.h | 0 .../include}/dictionary_heat_optimization.h | 0 .../include}/dictionary_management.h | 0 {include => v3/include}/doe_metrics.h | 0 {include => v3/include}/inference_engine.h | 0 {include => v3/include}/io.h | 0 {include => v3/include}/log.h | 0 {include => v3/include}/math_portable.h | 0 {include => v3/include}/memory_management.h | 0 .../include}/physics_execution_hooks.h | 0 .../include}/physics_hotwords_cache.h | 0 {include => v3/include}/physics_metadata.h | 0 .../include}/physics_pipelining_metrics.h | 0 {include => v3/include}/physics_runtime.h | 0 {include => v3/include}/platform_alloc.h | 0 {include => v3/include}/platform_io.h | 0 {include => v3/include}/platform_lock.h | 0 {include => v3/include}/platform_time.h | 0 {include => v3/include}/profiler.h | 0 {include => v3/include}/q48_16.h | 0 {include => v3/include}/repl.h | 0 .../include}/rolling_window_knobs.h | 0 .../include}/rolling_window_of_truth.h | 0 {include => v3/include}/ssm_jacquard.h | 0 {include => v3/include}/starforth_config.h | 0 {include => v3/include}/startup.h | 0 v3/include/version.h | 10 + {include => v3/include}/vm.h | 0 {include => v3/include}/vm_api.h | 0 {include => v3/include}/vm_asm_opt.h | 0 {include => v3/include}/vm_asm_opt_arm64.h | 0 {include => v3/include}/vm_asm_opt_riscv64.h | 0 {include => v3/include}/vm_debug.h | 0 {include => v3/include}/vm_host.h | 0 .../include}/vm_inner_interp_arm64.h | 0 {include => v3/include}/vm_inner_interp_asm.h | 0 .../include}/vm_inner_interp_riscv64.h | 0 {include => v3/include}/word_registry.h | 0 {src => v3/src}/README.md | 0 {src => v3/src}/blkio_factory.c | 0 {src => v3/src}/blkio_file.c | 0 {src => v3/src}/blkio_ram.c | 0 {src => v3/src}/block_subsystem.c | 0 {src => v3/src}/cli.c | 0 {src => v3/src}/compudynamics.c | 0 .../src}/dictionary_heat_optimization.c | 0 {src => v3/src}/dictionary_management.c | 0 {src => v3/src}/doe_metrics.c | 0 {src => v3/src}/heartbeat_export.c | 0 {src => v3/src}/inference_engine.c | 0 {src => v3/src}/io.c | 0 {src => v3/src}/log.c | 0 {src => v3/src}/main.c | 0 {src => v3/src}/math_portable.c | 0 {src => v3/src}/memory_management.c | 0 {src => v3/src}/physics_execution_hooks.c | 0 {src => v3/src}/physics_hotwords_cache.c | 0 {src => v3/src}/physics_metadata.c | 0 {src => v3/src}/physics_pipelining_metrics.c | 0 {src => v3/src}/physics_runtime.c | 0 {src => v3/src}/platform/README.md | 0 {src => v3/src}/platform/alloc_host.c | 0 {src => v3/src}/platform/alloc_kernel.c | 0 {src => v3/src}/platform/l4re/README.md | 0 {src => v3/src}/platform/l4re/time.c | 0 {src => v3/src}/platform/linux/README.md | 0 {src => v3/src}/platform/linux/io.c | 0 {src => v3/src}/platform/linux/time.c | 0 {src => v3/src}/platform/platform_init.c | 0 {src => v3/src}/platform/threading.c | 0 {src => v3/src}/profiler.c | 0 {src => v3/src}/repl.c | 0 {src => v3/src}/rolling_window_of_truth.c | 0 {src => v3/src}/ssm_jacquard.c | 0 {src => v3/src}/stack_management.c | 0 {src => v3/src}/test_runner/README.md | 0 {src => v3/src}/test_runner/include/README.md | 0 .../src}/test_runner/include/test_common.h | 4 +- .../src}/test_runner/include/test_contracts.h | 0 .../src}/test_runner/include/test_runner.h | 0 {src => v3/src}/test_runner/modules/README.md | 0 .../src}/test_runner/modules/acl_words_test.c | 0 .../modules/arithmetic_words_test.c | 0 .../test_runner/modules/block_words_test.c | 0 .../src}/test_runner/modules/break_me_tests.c | 0 .../test_runner/modules/control_words_test.c | 0 .../modules/defining_words_tests.c | 0 .../dictionary_manipulation_words_test.c | 0 .../modules/dictionary_words_test.c | 0 .../test_runner/modules/double_words_test.c | 0 .../test_runner/modules/format_words_test.c | 0 .../modules/inference_words_test.c | 0 .../test_runner/modules/integration_tests.c | 0 .../src}/test_runner/modules/io_words_test.c | 0 .../test_runner/modules/logical_words_test.c | 0 .../modules/mama_forth_words_test.c | 0 .../test_runner/modules/memory_words_test.c | 0 .../modules/mixed_arithmetic_words_test.c | 0 .../modules/physics_freeze_words_test.c | 0 .../src}/test_runner/modules/q48_words_test.c | 0 .../modules/return_stack_words_test.c | 0 .../test_runner/modules/stack_words_test.c | 0 .../modules/starforth_words_test.c | 0 .../src}/test_runner/modules/stress_tests.c | 0 .../test_runner/modules/string_words_test.c | 0 .../test_runner/modules/system_words_test.c | 0 .../modules/vocabulary_words_test.c | 0 {src => v3/src}/test_runner/test_common.c | 0 {src => v3/src}/test_runner/test_contracts.c | 0 {src => v3/src}/test_runner/test_runner.c | 0 {src => v3/src}/vm.c | 0 {src => v3/src}/vm_api.c | 0 {src => v3/src}/vm_bootstrap.c | 4 +- {src => v3/src}/vm_debug.c | 0 {src => v3/src}/vm_internal.h | 0 {src => v3/src}/vm_time.c | 0 {src => v3/src}/word_registry.c | 0 {src => v3/src}/word_source/README.md | 0 {src => v3/src}/word_source/acl_words.c | 0 .../src}/word_source/arithmetic_words.c | 0 {src => v3/src}/word_source/block_words.c | 0 {src => v3/src}/word_source/control_words.c | 0 {src => v3/src}/word_source/defer_words.c | 0 {src => v3/src}/word_source/defining_words.c | 0 .../dictionary_heat_diagnostic_words.c | 0 .../dictionary_manipulation_words.c | 0 .../src}/word_source/dictionary_words.c | 0 {src => v3/src}/word_source/double_words.c | 0 {src => v3/src}/word_source/editor_words.c | 0 {src => v3/src}/word_source/format_words.c | 0 .../src}/word_source/framebuffer_words.c | 0 {src => v3/src}/word_source/include/README.md | 0 .../src}/word_source/include/acl_words.h | 0 .../word_source/include/arithmetic_words.h | 0 .../src}/word_source/include/block_words.h | 0 .../src}/word_source/include/control_words.h | 0 .../src}/word_source/include/defer_words.h | 2 +- .../src}/word_source/include/defining_words.h | 0 .../dictionary_heat_diagnostic_words.h | 0 .../include/dictionary_manipulation_words.h | 0 .../word_source/include/dictionary_words.h | 0 .../src}/word_source/include/double_words.h | 0 .../src}/word_source/include/editor_words.h | 0 .../src}/word_source/include/format_words.h | 0 .../word_source/include/framebuffer_words.h | 0 .../word_source/include/inference_words.h | 0 .../src}/word_source/include/io_words.h | 0 .../src}/word_source/include/keyboard_words.h | 0 .../src}/word_source/include/log_words.h | 0 .../src}/word_source/include/logical_words.h | 0 .../word_source/include/mama_forth_words.h | 0 .../src}/word_source/include/memory_words.h | 0 .../include/mixed_arithmetic_words.h | 0 .../include/physics_benchmark_words.h | 0 .../include/physics_diagnostic_words.h | 0 .../include/physics_freeze_words.h | 0 .../physics_pipelining_diagnostic_words.h | 0 .../src}/word_source/include/q48_words.h | 0 .../word_source/include/return_stack_words.h | 0 .../src}/word_source/include/scroll_words.h | 0 .../src}/word_source/include/stack_words.h | 0 .../word_source/include/starforth_words.h | 0 .../src}/word_source/include/string_words.h | 0 .../src}/word_source/include/system_words.h | 0 .../src}/word_source/include/ttf_words.h | 0 .../word_source/include/vocabulary_words.h | 0 {src => v3/src}/word_source/inference_words.c | 0 {src => v3/src}/word_source/io_words.c | 0 {src => v3/src}/word_source/keyboard_words.c | 0 .../src}/word_source/lifecycle_words_hosted.c | 0 {src => v3/src}/word_source/log_words.c | 0 {src => v3/src}/word_source/logical_words.c | 0 {src => v3/src}/word_source/memory_words.c | 0 .../src}/word_source/mixed_arithmetic_words.c | 0 .../word_source/physics_benchmark_words.c | 0 .../word_source/physics_diagnostic_words.c | 0 .../src}/word_source/physics_freeze_words.c | 0 .../physics_pipelining_diagnostic_words.c | 6 +- {src => v3/src}/word_source/q48_16_words.c | 2 +- {src => v3/src}/word_source/q48_words.c | 0 .../src}/word_source/return_stack_words.c | 0 {src => v3/src}/word_source/scroll_words.c | 0 {src => v3/src}/word_source/stack_words.c | 0 {src => v3/src}/word_source/starforth_words.c | 0 {src => v3/src}/word_source/string_words.c | 0 {src => v3/src}/word_source/system_words.c | 0 {src => v3/src}/word_source/ttf_words.c | 0 .../src}/word_source/vocabulary_words.c | 0 v4/README.md | 9 + 630 files changed, 2646 insertions(+), 2036 deletions(-) create mode 100644 boards/README.md create mode 100644 boards/milkv/README.md create mode 100644 boards/milkv/board.mk create mode 100644 boards/raspi/README.md create mode 100644 boards/raspi/board.mk rename {boot_media/rpi5 => boards/raspi}/config.txt (91%) create mode 100644 boards/ser5/README.md create mode 100644 boards/ser5/board.mk create mode 100644 boards/zynq7020/README.md create mode 100644 boards/zynq7020/board.mk delete mode 100644 boot_media/rpi5/README.md rename ONTOLOGY.md => docs/ONTOLOGY.md (100%) rename ROADMAP.md => docs/ROADMAP.md (100%) create mode 100644 docs/book/Makefile create mode 100644 docs/book/README.md create mode 100644 docs/book/main.tex create mode 100644 docs/book/pandoc/code-breaks.lua create mode 100644 docs/book/pandoc/highlighting.latex create mode 100644 docs/book/pandoc/table-widths.lua rename FABRIC-0.md => docs/fabric/FABRIC-0.md (100%) rename FABRIC-1.md => docs/fabric/FABRIC-1.md (100%) rename FABRIC-2.md => docs/fabric/FABRIC-2.md (100%) rename FABRIC-3.5.md => docs/fabric/FABRIC-3.5.md (100%) rename FABRIC-3.6.md => docs/fabric/FABRIC-3.6.md (100%) rename FABRIC-3.7.md => docs/fabric/FABRIC-3.7.md (100%) rename FABRIC-3.md => docs/fabric/FABRIC-3.md (100%) rename FABRIC-4.md => docs/fabric/FABRIC-4.md (100%) rename Makefile.starkernel => kernel/Makefile (84%) rename {include => kernel/include}/starkernel/README.md (100%) rename {include => kernel/include}/starkernel/apic.h (100%) rename {include => kernel/include}/starkernel/arch.h (100%) rename {include => kernel/include}/starkernel/artemis_sig.h (100%) rename {include => kernel/include}/starkernel/blkio_usb.h (100%) rename {include => kernel/include}/starkernel/boot_info_offsets.h (100%) rename {include => kernel/include}/starkernel/capsule.h (100%) rename {include => kernel/include}/starkernel/capsule_birth.h (100%) rename {include => kernel/include}/starkernel/capsule_console.h (100%) rename {include => kernel/include}/starkernel/capsule_generated.h (100%) rename {include => kernel/include}/starkernel/capsule_loader.h (100%) rename {include => kernel/include}/starkernel/capsule_mint.h (100%) rename {include => kernel/include}/starkernel/capsule_run.h (100%) rename {include => kernel/include}/starkernel/capsule_runcap.h (100%) rename {include => kernel/include}/starkernel/capsule_sig.h (100%) rename {include => kernel/include}/starkernel/capsule_vm_physics.h (100%) rename {include => kernel/include}/starkernel/capsule_vm_switch_signal.h (100%) rename {include => kernel/include}/starkernel/capsule_wirebind.h (100%) rename {include => kernel/include}/starkernel/capsule_zuse_boot.h (100%) rename {include => kernel/include}/starkernel/cmdline.h (100%) rename {include => kernel/include}/starkernel/console.h (100%) rename {include => kernel/include}/starkernel/doe_log.h (100%) rename {include => kernel/include}/starkernel/ed25519.h (100%) rename {include => kernel/include}/starkernel/elf64.h (100%) rename {include => kernel/include}/starkernel/elf_loader.h (100%) rename {include => kernel/include}/starkernel/fdt.h (100%) rename {include => kernel/include}/starkernel/fe25519.h (100%) rename {include => kernel/include}/starkernel/framebuffer.h (100%) rename {include => kernel/include}/starkernel/freestanding/README.md (100%) rename {include => kernel/include}/starkernel/freestanding/assert.h (100%) rename {include => kernel/include}/starkernel/freestanding/ctype.h (100%) rename {include => kernel/include}/starkernel/freestanding/errno.h (100%) rename {include => kernel/include}/starkernel/freestanding/inttypes.h (100%) rename {include => kernel/include}/starkernel/freestanding/math.h (100%) rename {include => kernel/include}/starkernel/freestanding/sched.h (100%) rename {include => kernel/include}/starkernel/freestanding/signal.h (100%) rename {include => kernel/include}/starkernel/freestanding/stdio.h (100%) rename {include => kernel/include}/starkernel/freestanding/stdlib.h (100%) rename {include => kernel/include}/starkernel/freestanding/string.h (100%) rename {include => kernel/include}/starkernel/freestanding/sys/README.md (100%) rename {include => kernel/include}/starkernel/freestanding/sys/time.h (100%) rename {include => kernel/include}/starkernel/freestanding/sys/types.h (100%) rename {include => kernel/include}/starkernel/freestanding/time.h (100%) rename {include => kernel/include}/starkernel/hal/README.md (100%) rename {include => kernel/include}/starkernel/hal/hal.h (100%) rename {include => kernel/include}/starkernel/hal_memory.h (100%) rename {include => kernel/include}/starkernel/homeblocks_sig.h (100%) rename {include => kernel/include}/starkernel/i8042.h (100%) rename {include => kernel/include}/starkernel/ioapic.h (100%) rename {include => kernel/include}/starkernel/kernel_args.h (100%) rename {include => kernel/include}/starkernel/kmalloc.h (100%) rename {include => kernel/include}/starkernel/log.h (100%) rename {include => kernel/include}/starkernel/log_attrib.h (100%) rename {include => kernel/include}/starkernel/log_region.h (100%) rename {include => kernel/include}/starkernel/pci.h (100%) rename {include => kernel/include}/starkernel/plic.h (100%) rename {include => kernel/include}/starkernel/pmm.h (100%) rename {include => kernel/include}/starkernel/q48_16.h (100%) rename {include => kernel/include}/starkernel/repl.h (100%) rename {include => kernel/include}/starkernel/rng.h (100%) rename {include => kernel/include}/starkernel/rpi5_dtb.h (100%) rename {include => kernel/include}/starkernel/rpi5_mailbox.h (100%) rename {include => kernel/include}/starkernel/rpi5_native_boot.h (100%) rename {include => kernel/include}/starkernel/rpi5_native_entry.h (100%) rename {include => kernel/include}/starkernel/scalar25519.h (100%) rename {include => kernel/include}/starkernel/session.h (100%) rename {include => kernel/include}/starkernel/sha512.h (100%) rename {include => kernel/include}/starkernel/timer.h (100%) rename {include => kernel/include}/starkernel/ttf.h (100%) rename {include => kernel/include}/starkernel/uefi.h (100%) rename {include => kernel/include}/starkernel/user_identity_seed.h (100%) rename {include => kernel/include}/starkernel/virtio_blk.h (100%) rename {include => kernel/include}/starkernel/virtio_input.h (100%) rename {include => kernel/include}/starkernel/virtio_rng.h (100%) rename {include => kernel/include}/starkernel/vm/README.md (100%) rename {include => kernel/include}/starkernel/vm/arena.h (100%) rename {include => kernel/include}/starkernel/vm/bootstrap/README.md (100%) rename {include => kernel/include}/starkernel/vm/bootstrap/sk_vm_bootstrap.h (100%) rename {include => kernel/include}/starkernel/vm/kernel_hermes.h (100%) rename {include => kernel/include}/starkernel/vm/parity.h (100%) rename {include => kernel/include}/starkernel/vm/stadium.h (100%) rename {include => kernel/include}/starkernel/vm/stadium_blocks.h (100%) rename {include => kernel/include}/starkernel/vm/stadium_words.h (100%) rename {include => kernel/include}/starkernel/vm/switch.h (100%) rename {include => kernel/include}/starkernel/vm_identity.h (100%) rename {include => kernel/include}/starkernel/vm_uuid.h (100%) rename {include => kernel/include}/starkernel/vmm.h (100%) rename {include => kernel/include}/starkernel/vt100.h (100%) rename {include => kernel/include}/starkernel/x509_ed25519.h (100%) rename {include => kernel/include}/starkernel/xhci.h (100%) rename {include => kernel/include}/starkernel/xhci_driver.h (100%) rename {include => kernel/include}/starkernel/xxhash64.h (100%) rename {include => kernel/include}/starkernel/zuse_cert_devblock.h (100%) rename {include => kernel/include}/starkernel/zuse_eligibility.h (100%) rename {include => kernel/include}/starkernel/zuse_eligibility_list.h (100%) rename {include => kernel/include}/starkernel/zuse_genesis_marker.h (100%) rename {linker => kernel/linker}/README.md (100%) rename {linker => kernel/linker}/starkernel-amd64.ld (100%) rename {linker => kernel/linker}/starkernel-kernel-aarch64.ld (100%) rename {linker => kernel/linker}/starkernel-kernel-amd64.ld (100%) rename {linker => kernel/linker}/starkernel-kernel-riscv64.ld (100%) rename {linker => kernel/linker}/starkernel-loader-aarch64-pe.ld (100%) rename {linker => kernel/linker}/starkernel-loader-aarch64.ld (100%) rename {linker => kernel/linker}/starkernel-loader-amd64-pe.ld (100%) rename {linker => kernel/linker}/starkernel-loader-amd64.ld (100%) rename {linker => kernel/linker}/starkernel-loader-riscv64.ld (100%) create mode 100644 kernel/linker/starkernel-native-rpi5.ld rename {src/starkernel => kernel/src}/README.md (100%) rename {src/starkernel => kernel/src}/arch/aarch64/README.md (100%) rename {src/starkernel => kernel/src}/arch/aarch64/apic.c (100%) rename {src/starkernel => kernel/src}/arch/aarch64/arch.c (100%) rename {src/starkernel => kernel/src}/arch/aarch64/boot.S (100%) rename {src/starkernel => kernel/src}/arch/aarch64/interrupts.c (100%) rename {src/starkernel => kernel/src}/arch/aarch64/isr.S (100%) rename {src/starkernel => kernel/src}/arch/aarch64/native_rpi5_entry.S (68%) rename {src/starkernel => kernel/src}/arch/aarch64/rpi5_dtb.c (100%) rename {src/starkernel => kernel/src}/arch/aarch64/rpi5_mailbox.c (100%) rename {src/starkernel => kernel/src}/arch/aarch64/rpi5_native_boot.c (100%) rename {src/starkernel => kernel/src}/arch/aarch64/switch.S (100%) rename {src/starkernel => kernel/src}/arch/aarch64/timer.c (100%) rename {src/starkernel => kernel/src}/arch/amd64/README.md (100%) rename {src/starkernel => kernel/src}/arch/amd64/apic.c (100%) rename {src/starkernel => kernel/src}/arch/amd64/arch.c (100%) rename {src/starkernel => kernel/src}/arch/amd64/boot.S (100%) rename {src/starkernel => kernel/src}/arch/amd64/i8042.c (100%) rename {src/starkernel => kernel/src}/arch/amd64/interrupts.c (100%) rename {src/starkernel => kernel/src}/arch/amd64/ioapic.c (100%) rename {src/starkernel => kernel/src}/arch/amd64/isr.S (100%) rename {src/starkernel => kernel/src}/arch/amd64/kernel_entry.S (100%) rename {src/starkernel => kernel/src}/arch/amd64/switch.S (100%) rename {src/starkernel => kernel/src}/arch/amd64/timer.c (100%) rename {src/starkernel => kernel/src}/arch/riscv64/README.md (100%) rename {src/starkernel => kernel/src}/arch/riscv64/apic.c (100%) rename {src/starkernel => kernel/src}/arch/riscv64/arch.c (100%) rename {src/starkernel => kernel/src}/arch/riscv64/boot.S (100%) rename {src/starkernel => kernel/src}/arch/riscv64/interrupts.c (100%) rename {src/starkernel => kernel/src}/arch/riscv64/isr.S (100%) rename {src/starkernel => kernel/src}/arch/riscv64/kernel_entry.S (100%) rename {src/starkernel => kernel/src}/arch/riscv64/plic.c (100%) rename {src/starkernel => kernel/src}/arch/riscv64/switch.S (100%) rename {src/starkernel => kernel/src}/arch/riscv64/timer.c (100%) rename {src/starkernel => kernel/src}/artemis_sig.c (100%) rename {src/starkernel => kernel/src}/boot/README.md (100%) rename {src/starkernel => kernel/src}/boot/cmdline.c (100%) rename {src/starkernel => kernel/src}/boot/elf_loader.c (100%) rename {src/starkernel => kernel/src}/boot/reloc.S (100%) rename {src/starkernel => kernel/src}/boot/reloc_stub.c (100%) rename {src/starkernel => kernel/src}/boot/uefi_loader.c (100%) rename {src/starkernel => kernel/src}/capsule/README.md (100%) rename {src/starkernel => kernel/src}/capsule/capsule_birth.c (100%) rename {src/starkernel => kernel/src}/capsule/capsule_console.c (100%) rename {src/starkernel => kernel/src}/capsule/capsule_find.c (100%) rename {src/starkernel => kernel/src}/capsule/capsule_loader.c (100%) rename {src/starkernel => kernel/src}/capsule/capsule_mint.c (100%) rename {src/starkernel => kernel/src}/capsule/capsule_run.c (100%) rename {src/starkernel => kernel/src}/capsule/capsule_runcap.c (100%) rename {src/starkernel => kernel/src}/capsule/capsule_sig.c (100%) rename {src/starkernel => kernel/src}/capsule/capsule_validate.c (100%) rename {src/starkernel => kernel/src}/capsule/capsule_vm_hooks.c (100%) rename {src/starkernel => kernel/src}/capsule/capsule_vm_physics.c (100%) rename {src/starkernel => kernel/src}/capsule/capsule_vm_switch_signal.c (100%) rename {src/starkernel => kernel/src}/capsule/capsule_wirebind.c (100%) rename {src/starkernel => kernel/src}/capsule/capsule_zuse_boot.c (100%) rename {src/starkernel => kernel/src}/capsule/mama_forth_words.c (99%) rename {src/starkernel => kernel/src}/capsule/vm_identity.c (100%) rename {src/starkernel => kernel/src}/capsule/vm_uuid.c (100%) rename {src/starkernel => kernel/src}/capsule/zuse_eligibility.c (100%) rename {src/starkernel => kernel/src}/crypto/ed25519.c (100%) rename {src/starkernel => kernel/src}/crypto/fe25519.c (100%) rename {src/starkernel => kernel/src}/crypto/scalar25519.c (100%) rename {src/starkernel => kernel/src}/crypto/sha512.c (100%) rename {src/starkernel => kernel/src}/crypto/x509_ed25519.c (100%) rename {src/starkernel => kernel/src}/doe_log.c (100%) rename {src/starkernel => kernel/src}/hal/README.md (100%) rename {src/starkernel => kernel/src}/hal/console.c (100%) rename {src/starkernel => kernel/src}/hal/fdt.c (100%) rename {src/starkernel => kernel/src}/hal/font_8x16.c (100%) rename {src/starkernel => kernel/src}/hal/framebuffer.c (100%) rename {src/starkernel => kernel/src}/hal/hal.c (100%) rename {src/starkernel => kernel/src}/hal/host_services.c (100%) rename {src/starkernel => kernel/src}/hal/memory.c (100%) rename {src/starkernel => kernel/src}/hal/ttf.c (100%) rename {src/starkernel => kernel/src}/hal/vt100.c (100%) rename {src/starkernel => kernel/src}/hash/README.md (100%) rename {src/starkernel => kernel/src}/hash/xxhash64.c (100%) rename {src/starkernel => kernel/src}/heartbeat.c (100%) rename {src/starkernel => kernel/src}/homeblocks_sig.c (100%) rename {src/starkernel => kernel/src}/kernel_main.c (100%) rename {src/starkernel => kernel/src}/log_region.c (100%) rename {src/starkernel => kernel/src}/math/README.md (100%) rename {src/starkernel => kernel/src}/math/q48_16.c (100%) rename {src/starkernel => kernel/src}/memory/README.md (100%) rename {src/starkernel => kernel/src}/memory/kmalloc.c (100%) rename {src/starkernel => kernel/src}/memory/pmm.c (100%) rename {src/starkernel => kernel/src}/memory/vmm.c (100%) rename {src/starkernel => kernel/src}/pci/README.md (100%) rename {src/starkernel => kernel/src}/pci/pci.c (100%) rename {src/starkernel => kernel/src}/repl.c (100%) rename {src/starkernel => kernel/src}/rng/rng.c (100%) rename {src/starkernel => kernel/src}/usb/blkio_usb.c (100%) rename {src/starkernel => kernel/src}/usb/xhci.c (100%) rename {src/starkernel => kernel/src}/virtio/README.md (100%) rename {src/starkernel => kernel/src}/virtio/virtio_blk.c (100%) rename {src/starkernel => kernel/src}/virtio/virtio_input.c (100%) rename {src/starkernel => kernel/src}/virtio/virtio_rng.c (100%) rename {src/starkernel => kernel/src}/vm/README.md (100%) rename {src/starkernel => kernel/src}/vm/alloc_kernel.c (100%) rename {src/starkernel => kernel/src}/vm/arena.c (100%) rename {src/starkernel => kernel/src}/vm/bootstrap/README.md (100%) rename {src/starkernel => kernel/src}/vm/bootstrap/sk_vm_bootstrap.c (100%) rename {src/starkernel => kernel/src}/vm/host/README.md (100%) rename {src/starkernel => kernel/src}/vm/host/shim.c (100%) rename {src/starkernel => kernel/src}/vm/kernel_hermes.c (100%) rename {src/starkernel => kernel/src}/vm/parity.c (100%) rename {src/starkernel => kernel/src}/vm/q48_stubs.c (100%) rename {src/starkernel => kernel/src}/vm/session.c (100%) rename {src/starkernel => kernel/src}/vm/stadium.c (100%) rename {src/starkernel => kernel/src}/vm/stadium_blocks.c (100%) rename {src/starkernel => kernel/src}/vm/stadium_words.c (100%) rename {src/starkernel => kernel/src}/vm/switch.c (100%) rename {src/starkernel => kernel/src}/vm/vm_bootstrap.c (96%) rename {src/starkernel => kernel/src}/vm/vm_core.c (98%) rename {src/starkernel => kernel/src}/vm/vm_internal.h (97%) rename {src/starkernel => kernel/src}/vm/vm_runtime.c (98%) delete mode 100644 logs2/.gitkeep delete mode 100644 logs2/README.md delete mode 100644 logs2/qemu-aarch64-20260609-192112.log delete mode 100644 logs2/qemu-aarch64-20260611-002443.log delete mode 100644 logs2/qemu-aarch64-20260611-024456.log delete mode 100644 logs2/qemu-aarch64-20260611-173737.log delete mode 100644 logs2/qemu-aarch64-20260611-174951.log delete mode 100644 logs2/qemu-aarch64-20260611-175257.log delete mode 100644 logs2/qemu-aarch64-20260611-190822.log delete mode 100644 logs2/qemu-aarch64-20260611-202955.log delete mode 100644 logs2/qemu-aarch64-20260612-132412.log delete mode 100644 logs2/qemu-aarch64-20260612-141722.log delete mode 100644 logs2/qemu-aarch64-20260612-160132.log delete mode 100644 logs2/qemu-aarch64-20260614-164017.log delete mode 100644 logs2/qemu-aarch64-20260614-164043.log delete mode 100644 logs2/qemu-aarch64-20260614-182154.log delete mode 100644 logs2/qemu-aarch64-20260614-190109.log delete mode 100644 logs2/qemu-aarch64-20260614-230803.log delete mode 100644 logs2/qemu-aarch64-20260615-003908.log delete mode 100644 logs2/qemu-aarch64-20260615-005301.log delete mode 100644 logs2/qemu-aarch64-20260615-020020.log delete mode 100644 logs2/qemu-aarch64-20260615-103253.log delete mode 100644 logs2/qemu-aarch64-20260615-103655.log delete mode 100644 logs2/qemu-aarch64-20260615-121103.log delete mode 100644 logs2/qemu-aarch64-20260615-123814.log delete mode 100644 logs2/qemu-aarch64-20260615-160204.log delete mode 100644 logs2/qemu-aarch64-20260615-183010.log delete mode 100644 logs2/qemu-aarch64-20260615-192747.log delete mode 100644 logs2/qemu-aarch64-20260615-194133.log delete mode 100644 logs2/qemu-aarch64-20260615-204232.log delete mode 100644 logs2/qemu-aarch64-20260615-223549.log delete mode 100644 logs2/qemu-aarch64-20260615-235720.log delete mode 100644 logs2/qemu-aarch64-20260616-000920.log delete mode 100644 logs2/qemu-aarch64-20260616-011049.log delete mode 100644 logs2/qemu-aarch64-20260616-112907.log delete mode 100644 logs2/qemu-aarch64-20260616-155223.log delete mode 100644 logs2/qemu-aarch64-20260616-175845.log delete mode 100644 logs2/qemu-aarch64-20260620-222449.log delete mode 100644 logs2/qemu-aarch64-20260621-004736.log delete mode 100644 logs2/qemu-amd64-20260609-184750.log delete mode 100644 logs2/qemu-amd64-20260609-193717.log delete mode 100644 logs2/qemu-amd64-20260611-002301.log delete mode 100644 logs2/qemu-amd64-20260611-012412.log delete mode 100644 logs2/qemu-amd64-20260611-013401.log delete mode 100644 logs2/qemu-amd64-20260611-023023.log delete mode 100644 logs2/qemu-amd64-20260611-023818.log delete mode 100644 logs2/qemu-amd64-20260611-172713.log delete mode 100644 logs2/qemu-amd64-20260611-174904.log delete mode 100644 logs2/qemu-amd64-20260611-175217.log delete mode 100644 logs2/qemu-amd64-20260611-180750.log delete mode 100644 logs2/qemu-amd64-20260611-192015.log delete mode 100644 logs2/qemu-amd64-20260611-201951.log delete mode 100644 logs2/qemu-amd64-20260611-204126.log delete mode 100644 logs2/qemu-amd64-20260611-223613.log delete mode 100644 logs2/qemu-amd64-20260612-110212.log delete mode 100644 logs2/qemu-amd64-20260612-142323.log delete mode 100644 logs2/qemu-amd64-20260612-160656.log delete mode 100644 logs2/qemu-amd64-20260614-163853.log delete mode 100644 logs2/qemu-amd64-20260614-182034.log delete mode 100644 logs2/qemu-amd64-20260614-182119.log delete mode 100644 logs2/qemu-amd64-20260614-183302.log delete mode 100644 logs2/qemu-amd64-20260614-185942.log delete mode 100644 logs2/qemu-amd64-20260614-190244.log delete mode 100644 logs2/qemu-amd64-20260614-212929.log delete mode 100644 logs2/qemu-amd64-20260614-233623.log delete mode 100644 logs2/qemu-amd64-20260615-005725.log delete mode 100644 logs2/qemu-amd64-20260615-020446.log delete mode 100644 logs2/qemu-amd64-20260615-103154.log delete mode 100644 logs2/qemu-amd64-20260615-103619.log delete mode 100644 logs2/qemu-amd64-20260615-103843.log delete mode 100644 logs2/qemu-amd64-20260615-124956.log delete mode 100644 logs2/qemu-amd64-20260615-125017.log delete mode 100644 logs2/qemu-amd64-20260615-125335.log delete mode 100644 logs2/qemu-amd64-20260615-142839.log delete mode 100644 logs2/qemu-amd64-20260615-161023.log delete mode 100644 logs2/qemu-amd64-20260615-180252.log delete mode 100644 logs2/qemu-amd64-20260615-182339.log delete mode 100644 logs2/qemu-amd64-20260615-182946.log delete mode 100644 logs2/qemu-amd64-20260615-183023.log delete mode 100644 logs2/qemu-amd64-20260615-194545.log delete mode 100644 logs2/qemu-amd64-20260615-204632.log delete mode 100644 logs2/qemu-amd64-20260615-223531.log delete mode 100644 logs2/qemu-amd64-20260615-223607.log delete mode 100644 logs2/qemu-amd64-20260615-230419.log delete mode 100644 logs2/qemu-amd64-20260616-001614.log delete mode 100644 logs2/qemu-amd64-20260616-011447.log delete mode 100644 logs2/qemu-amd64-20260616-111913.log delete mode 100644 logs2/qemu-amd64-20260616-154608.log delete mode 100644 logs2/qemu-amd64-20260616-175829.log delete mode 100644 logs2/qemu-amd64-20260620-222036.log delete mode 100644 logs2/qemu-amd64-20260621-002830.log delete mode 100644 logs2/qemu-amd64-20260621-004710.log delete mode 100644 logs2/qemu-riscv64-20260609-192223.log delete mode 100644 logs2/qemu-riscv64-20260611-002548.log delete mode 100644 logs2/qemu-riscv64-20260611-003502.log delete mode 100644 logs2/qemu-riscv64-20260611-003801.log delete mode 100644 logs2/qemu-riscv64-20260611-024624.log delete mode 100644 logs2/qemu-riscv64-20260611-173903.log delete mode 100644 logs2/qemu-riscv64-20260611-175348.log delete mode 100644 logs2/qemu-riscv64-20260611-191335.log delete mode 100644 logs2/qemu-riscv64-20260611-203104.log delete mode 100644 logs2/qemu-riscv64-20260612-135612.log delete mode 100644 logs2/qemu-riscv64-20260612-141129.log delete mode 100644 logs2/qemu-riscv64-20260612-174414.log delete mode 100644 logs2/qemu-riscv64-20260614-164140.log delete mode 100644 logs2/qemu-riscv64-20260614-165900.log delete mode 100644 logs2/qemu-riscv64-20260614-170926.log delete mode 100644 logs2/qemu-riscv64-20260614-171955.log delete mode 100644 logs2/qemu-riscv64-20260614-182235.log delete mode 100644 logs2/qemu-riscv64-20260614-190152.log delete mode 100644 logs2/qemu-riscv64-20260614-230220.log delete mode 100644 logs2/qemu-riscv64-20260615-004335.log delete mode 100644 logs2/qemu-riscv64-20260615-004822.log delete mode 100644 logs2/qemu-riscv64-20260615-031059.log delete mode 100644 logs2/qemu-riscv64-20260615-103741.log delete mode 100644 logs2/qemu-riscv64-20260615-122026.log delete mode 100644 logs2/qemu-riscv64-20260615-122930.log delete mode 100644 logs2/qemu-riscv64-20260615-174420.log delete mode 100644 logs2/qemu-riscv64-20260615-183017.log delete mode 100644 logs2/qemu-riscv64-20260615-193223.log delete mode 100644 logs2/qemu-riscv64-20260615-193711.log delete mode 100644 logs2/qemu-riscv64-20260615-214335.log delete mode 100644 logs2/qemu-riscv64-20260615-223550.log delete mode 100644 logs2/qemu-riscv64-20260616-000114.log delete mode 100644 logs2/qemu-riscv64-20260616-000522.log delete mode 100644 logs2/qemu-riscv64-20260616-021123.log delete mode 100644 logs2/qemu-riscv64-20260616-113103.log delete mode 100644 logs2/qemu-riscv64-20260616-155324.log delete mode 100644 logs2/qemu-riscv64-20260616-175915.log delete mode 100644 logs2/qemu-riscv64-20260620-231806.log delete mode 100644 logs2/qemu-riscv64-20260621-004843.log delete mode 100644 logs2/qemu-screenshot-20260609-105458.png delete mode 100644 logs2/qemu-screenshot-20260609-130717.png delete mode 100644 logs2/qemu-screenshot-20260609-181200.png delete mode 100644 logs2/qemu-screenshot-20260609-193724.log delete mode 100644 logs2/qemu-screenshot-20260609-193724.png delete mode 100644 logs2/qemu-screenshot-20260609-194549.png delete mode 100644 logs2/qemu-screenshot-20260609-194812.png delete mode 100644 logs2/qemu-screenshot-20260609-222537.png delete mode 100644 logs2/qemu-screenshot-20260609-225958.png delete mode 100644 logs2/qemu-screenshot-20260609-232904.png delete mode 100644 logs2/qemu-screenshot-20260610-005734.png delete mode 100644 logs2/qemu-screenshot-20260610-134732.png delete mode 100644 logs2/qemu-screenshot-20260610-145902.png delete mode 100644 logs2/qemu-screenshot-20260610-213714.png delete mode 100644 logs2/qemu-screenshot-20260611-002306.log delete mode 100644 logs2/qemu-screenshot-20260611-004156.log delete mode 100644 logs2/qemu-screenshot-20260611-012817.log delete mode 100644 logs2/qemu-screenshot-20260611-023758.log delete mode 100644 logs2/qemu-screenshot-20260611-024401.log delete mode 100644 logs2/qemu-screenshot-20260611-173657.log delete mode 100644 logs2/qemu-screenshot-20260611-174914.log delete mode 100644 logs2/qemu-screenshot-20260611-175224.log delete mode 100644 logs2/qemu-screenshot-20260611-190757.log delete mode 100644 logs2/qemu-screenshot-20260611-202932.log delete mode 100644 logs2/qemu-screenshot-20260612-115354.log delete mode 100644 logs2/qemu-screenshot-20260612-160054.log delete mode 100644 logs2/qemu-screenshot-20260612-174331.log delete mode 100644 logs2/qemu-screenshot-20260614-163902.log delete mode 100644 logs2/qemu-screenshot-20260614-182044.log delete mode 100644 logs2/qemu-screenshot-20260614-182127.log create mode 100644 scripts/mkdiskimage.sh create mode 100644 v3/Makefile rename {include => v3/include}/README.md (100%) rename {include => v3/include}/arch_detect.h (100%) rename {include => v3/include}/blkcfg.h (100%) rename {include => v3/include}/blkio.h (100%) rename {include => v3/include}/blkio_factory.h (100%) rename {include => v3/include}/block_subsystem.h (100%) rename {include => v3/include}/cli.h (100%) rename {include => v3/include}/compudynamics.h (100%) rename {include => v3/include}/dictionary_heat_optimization.h (100%) rename {include => v3/include}/dictionary_management.h (100%) rename {include => v3/include}/doe_metrics.h (100%) rename {include => v3/include}/inference_engine.h (100%) rename {include => v3/include}/io.h (100%) rename {include => v3/include}/log.h (100%) rename {include => v3/include}/math_portable.h (100%) rename {include => v3/include}/memory_management.h (100%) rename {include => v3/include}/physics_execution_hooks.h (100%) rename {include => v3/include}/physics_hotwords_cache.h (100%) rename {include => v3/include}/physics_metadata.h (100%) rename {include => v3/include}/physics_pipelining_metrics.h (100%) rename {include => v3/include}/physics_runtime.h (100%) rename {include => v3/include}/platform_alloc.h (100%) rename {include => v3/include}/platform_io.h (100%) rename {include => v3/include}/platform_lock.h (100%) rename {include => v3/include}/platform_time.h (100%) rename {include => v3/include}/profiler.h (100%) rename {include => v3/include}/q48_16.h (100%) rename {include => v3/include}/repl.h (100%) rename {include => v3/include}/rolling_window_knobs.h (100%) rename {include => v3/include}/rolling_window_of_truth.h (100%) rename {include => v3/include}/ssm_jacquard.h (100%) rename {include => v3/include}/starforth_config.h (100%) rename {include => v3/include}/startup.h (100%) create mode 100644 v3/include/version.h rename {include => v3/include}/vm.h (100%) rename {include => v3/include}/vm_api.h (100%) rename {include => v3/include}/vm_asm_opt.h (100%) rename {include => v3/include}/vm_asm_opt_arm64.h (100%) rename {include => v3/include}/vm_asm_opt_riscv64.h (100%) rename {include => v3/include}/vm_debug.h (100%) rename {include => v3/include}/vm_host.h (100%) rename {include => v3/include}/vm_inner_interp_arm64.h (100%) rename {include => v3/include}/vm_inner_interp_asm.h (100%) rename {include => v3/include}/vm_inner_interp_riscv64.h (100%) rename {include => v3/include}/word_registry.h (100%) rename {src => v3/src}/README.md (100%) rename {src => v3/src}/blkio_factory.c (100%) rename {src => v3/src}/blkio_file.c (100%) rename {src => v3/src}/blkio_ram.c (100%) rename {src => v3/src}/block_subsystem.c (100%) rename {src => v3/src}/cli.c (100%) rename {src => v3/src}/compudynamics.c (100%) rename {src => v3/src}/dictionary_heat_optimization.c (100%) rename {src => v3/src}/dictionary_management.c (100%) rename {src => v3/src}/doe_metrics.c (100%) rename {src => v3/src}/heartbeat_export.c (100%) rename {src => v3/src}/inference_engine.c (100%) rename {src => v3/src}/io.c (100%) rename {src => v3/src}/log.c (100%) rename {src => v3/src}/main.c (100%) rename {src => v3/src}/math_portable.c (100%) rename {src => v3/src}/memory_management.c (100%) rename {src => v3/src}/physics_execution_hooks.c (100%) rename {src => v3/src}/physics_hotwords_cache.c (100%) rename {src => v3/src}/physics_metadata.c (100%) rename {src => v3/src}/physics_pipelining_metrics.c (100%) rename {src => v3/src}/physics_runtime.c (100%) rename {src => v3/src}/platform/README.md (100%) rename {src => v3/src}/platform/alloc_host.c (100%) rename {src => v3/src}/platform/alloc_kernel.c (100%) rename {src => v3/src}/platform/l4re/README.md (100%) rename {src => v3/src}/platform/l4re/time.c (100%) rename {src => v3/src}/platform/linux/README.md (100%) rename {src => v3/src}/platform/linux/io.c (100%) rename {src => v3/src}/platform/linux/time.c (100%) rename {src => v3/src}/platform/platform_init.c (100%) rename {src => v3/src}/platform/threading.c (100%) rename {src => v3/src}/profiler.c (100%) rename {src => v3/src}/repl.c (100%) rename {src => v3/src}/rolling_window_of_truth.c (100%) rename {src => v3/src}/ssm_jacquard.c (100%) rename {src => v3/src}/stack_management.c (100%) rename {src => v3/src}/test_runner/README.md (100%) rename {src => v3/src}/test_runner/include/README.md (100%) rename {src => v3/src}/test_runner/include/test_common.h (99%) rename {src => v3/src}/test_runner/include/test_contracts.h (100%) rename {src => v3/src}/test_runner/include/test_runner.h (100%) rename {src => v3/src}/test_runner/modules/README.md (100%) rename {src => v3/src}/test_runner/modules/acl_words_test.c (100%) rename {src => v3/src}/test_runner/modules/arithmetic_words_test.c (100%) rename {src => v3/src}/test_runner/modules/block_words_test.c (100%) rename {src => v3/src}/test_runner/modules/break_me_tests.c (100%) rename {src => v3/src}/test_runner/modules/control_words_test.c (100%) rename {src => v3/src}/test_runner/modules/defining_words_tests.c (100%) rename {src => v3/src}/test_runner/modules/dictionary_manipulation_words_test.c (100%) rename {src => v3/src}/test_runner/modules/dictionary_words_test.c (100%) rename {src => v3/src}/test_runner/modules/double_words_test.c (100%) rename {src => v3/src}/test_runner/modules/format_words_test.c (100%) rename {src => v3/src}/test_runner/modules/inference_words_test.c (100%) rename {src => v3/src}/test_runner/modules/integration_tests.c (100%) rename {src => v3/src}/test_runner/modules/io_words_test.c (100%) rename {src => v3/src}/test_runner/modules/logical_words_test.c (100%) rename {src => v3/src}/test_runner/modules/mama_forth_words_test.c (100%) rename {src => v3/src}/test_runner/modules/memory_words_test.c (100%) rename {src => v3/src}/test_runner/modules/mixed_arithmetic_words_test.c (100%) rename {src => v3/src}/test_runner/modules/physics_freeze_words_test.c (100%) rename {src => v3/src}/test_runner/modules/q48_words_test.c (100%) rename {src => v3/src}/test_runner/modules/return_stack_words_test.c (100%) rename {src => v3/src}/test_runner/modules/stack_words_test.c (100%) rename {src => v3/src}/test_runner/modules/starforth_words_test.c (100%) rename {src => v3/src}/test_runner/modules/stress_tests.c (100%) rename {src => v3/src}/test_runner/modules/string_words_test.c (100%) rename {src => v3/src}/test_runner/modules/system_words_test.c (100%) rename {src => v3/src}/test_runner/modules/vocabulary_words_test.c (100%) rename {src => v3/src}/test_runner/test_common.c (100%) rename {src => v3/src}/test_runner/test_contracts.c (100%) rename {src => v3/src}/test_runner/test_runner.c (100%) rename {src => v3/src}/vm.c (100%) rename {src => v3/src}/vm_api.c (100%) rename {src => v3/src}/vm_bootstrap.c (99%) rename {src => v3/src}/vm_debug.c (100%) rename {src => v3/src}/vm_internal.h (100%) rename {src => v3/src}/vm_time.c (100%) rename {src => v3/src}/word_registry.c (100%) rename {src => v3/src}/word_source/README.md (100%) rename {src => v3/src}/word_source/acl_words.c (100%) rename {src => v3/src}/word_source/arithmetic_words.c (100%) rename {src => v3/src}/word_source/block_words.c (100%) rename {src => v3/src}/word_source/control_words.c (100%) rename {src => v3/src}/word_source/defer_words.c (100%) rename {src => v3/src}/word_source/defining_words.c (100%) rename {src => v3/src}/word_source/dictionary_heat_diagnostic_words.c (100%) rename {src => v3/src}/word_source/dictionary_manipulation_words.c (100%) rename {src => v3/src}/word_source/dictionary_words.c (100%) rename {src => v3/src}/word_source/double_words.c (100%) rename {src => v3/src}/word_source/editor_words.c (100%) rename {src => v3/src}/word_source/format_words.c (100%) rename {src => v3/src}/word_source/framebuffer_words.c (100%) rename {src => v3/src}/word_source/include/README.md (100%) rename {src => v3/src}/word_source/include/acl_words.h (100%) rename {src => v3/src}/word_source/include/arithmetic_words.h (100%) rename {src => v3/src}/word_source/include/block_words.h (100%) rename {src => v3/src}/word_source/include/control_words.h (100%) rename {src => v3/src}/word_source/include/defer_words.h (89%) rename {src => v3/src}/word_source/include/defining_words.h (100%) rename {src => v3/src}/word_source/include/dictionary_heat_diagnostic_words.h (100%) rename {src => v3/src}/word_source/include/dictionary_manipulation_words.h (100%) rename {src => v3/src}/word_source/include/dictionary_words.h (100%) rename {src => v3/src}/word_source/include/double_words.h (100%) rename {src => v3/src}/word_source/include/editor_words.h (100%) rename {src => v3/src}/word_source/include/format_words.h (100%) rename {src => v3/src}/word_source/include/framebuffer_words.h (100%) rename {src => v3/src}/word_source/include/inference_words.h (100%) rename {src => v3/src}/word_source/include/io_words.h (100%) rename {src => v3/src}/word_source/include/keyboard_words.h (100%) rename {src => v3/src}/word_source/include/log_words.h (100%) rename {src => v3/src}/word_source/include/logical_words.h (100%) rename {src => v3/src}/word_source/include/mama_forth_words.h (100%) rename {src => v3/src}/word_source/include/memory_words.h (100%) rename {src => v3/src}/word_source/include/mixed_arithmetic_words.h (100%) rename {src => v3/src}/word_source/include/physics_benchmark_words.h (100%) rename {src => v3/src}/word_source/include/physics_diagnostic_words.h (100%) rename {src => v3/src}/word_source/include/physics_freeze_words.h (100%) rename {src => v3/src}/word_source/include/physics_pipelining_diagnostic_words.h (100%) rename {src => v3/src}/word_source/include/q48_words.h (100%) rename {src => v3/src}/word_source/include/return_stack_words.h (100%) rename {src => v3/src}/word_source/include/scroll_words.h (100%) rename {src => v3/src}/word_source/include/stack_words.h (100%) rename {src => v3/src}/word_source/include/starforth_words.h (100%) rename {src => v3/src}/word_source/include/string_words.h (100%) rename {src => v3/src}/word_source/include/system_words.h (100%) rename {src => v3/src}/word_source/include/ttf_words.h (100%) rename {src => v3/src}/word_source/include/vocabulary_words.h (100%) rename {src => v3/src}/word_source/inference_words.c (100%) rename {src => v3/src}/word_source/io_words.c (100%) rename {src => v3/src}/word_source/keyboard_words.c (100%) rename {src => v3/src}/word_source/lifecycle_words_hosted.c (100%) rename {src => v3/src}/word_source/log_words.c (100%) rename {src => v3/src}/word_source/logical_words.c (100%) rename {src => v3/src}/word_source/memory_words.c (100%) rename {src => v3/src}/word_source/mixed_arithmetic_words.c (100%) rename {src => v3/src}/word_source/physics_benchmark_words.c (100%) rename {src => v3/src}/word_source/physics_diagnostic_words.c (100%) rename {src => v3/src}/word_source/physics_freeze_words.c (100%) rename {src => v3/src}/word_source/physics_pipelining_diagnostic_words.c (99%) rename {src => v3/src}/word_source/q48_16_words.c (99%) rename {src => v3/src}/word_source/q48_words.c (100%) rename {src => v3/src}/word_source/return_stack_words.c (100%) rename {src => v3/src}/word_source/scroll_words.c (100%) rename {src => v3/src}/word_source/stack_words.c (100%) rename {src => v3/src}/word_source/starforth_words.c (100%) rename {src => v3/src}/word_source/string_words.c (100%) rename {src => v3/src}/word_source/system_words.c (100%) rename {src => v3/src}/word_source/ttf_words.c (100%) rename {src => v3/src}/word_source/vocabulary_words.c (100%) create mode 100644 v4/README.md diff --git a/.clang-tidy b/.clang-tidy index fc5ec979..4f74e301 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -14,7 +14,7 @@ Checks: > WarningsAsErrors: [ ] -HeaderFilterRegex: '^src/.*|^include/.*' +HeaderFilterRegex: '^v3/(src|include)/.*|^kernel/(src|include)/.*' AnalyzeTemporaryDtors: false FormatStyle: none diff --git a/.clang-tidy-ignore b/.clang-tidy-ignore index a9f4fa42..53a4a208 100644 --- a/.clang-tidy-ignore +++ b/.clang-tidy-ignore @@ -6,8 +6,8 @@ # clang-tidy will ALWAYS false-positive them. Always. # --------------------------------------------------------- -src/platform/** -src/platform/* +v3/src/platform/** +v3/src/platform/* # --------------------------------------------------------- # Skip test infrastructure @@ -15,8 +15,8 @@ src/platform/* # and stress edge conditions clang-tidy will never grok. # --------------------------------------------------------- -src/test_runner/** -src/test_runner/* +v3/src/test_runner/** +v3/src/test_runner/* # --------------------------------------------------------- # Skip word definitions generated or "mechanically patterned" @@ -24,30 +24,30 @@ src/test_runner/* # clang-tidy gives ZERO useful feedback on them. # --------------------------------------------------------- -src/word_source/string_words.c -src/word_source/block_words.c -src/word_source/arithmetic_words.c -src/word_source/mixed_arithmetic_words.c -src/word_source/return_stack_words.c -src/word_source/defining_words.c -src/word_source/stack_words.c -src/word_source/logical_words.c -src/word_source/memory_words.c -src/word_source/io_words.c -src/word_source/dictionary_words.c -src/word_source/dictionary_manipulation_words.c -src/word_source/vocabulary_words.c -src/word_source/system_words.c -src/word_source/starforth_words.c -src/word_source/editor_words.c -src/word_source/format_words.c +v3/src/word_source/string_words.c +v3/src/word_source/block_words.c +v3/src/word_source/arithmetic_words.c +v3/src/word_source/mixed_arithmetic_words.c +v3/src/word_source/return_stack_words.c +v3/src/word_source/defining_words.c +v3/src/word_source/stack_words.c +v3/src/word_source/logical_words.c +v3/src/word_source/memory_words.c +v3/src/word_source/io_words.c +v3/src/word_source/dictionary_words.c +v3/src/word_source/dictionary_manipulation_words.c +v3/src/word_source/vocabulary_words.c +v3/src/word_source/system_words.c +v3/src/word_source/starforth_words.c +v3/src/word_source/editor_words.c +v3/src/word_source/format_words.c # --------------------------------------------------------- # Skip headers belonging to the word system # Same reason: no signal, infinite false positives. # --------------------------------------------------------- -src/word_source/include/* +v3/src/word_source/include/* # --------------------------------------------------------- # Skip anything that implements performance knobs, @@ -55,15 +55,15 @@ src/word_source/include/* # These are meant to be weird, and tidy can't reason about them. # --------------------------------------------------------- -src/stack_management.c -src/profiler.c -src/vm_debug.c -src/physics_runtime.c +v3/src/stack_management.c +v3/src/profiler.c +v3/src/vm_debug.c +v3/src/physics_runtime.c # --------------------------------------------------------- # Skip integration + stress torture-tests. # These *intentionally* do UB-like bullshit. # --------------------------------------------------------- -src/test_runner/modules/*stress* -src/test_runner/modules/*integration* +v3/src/test_runner/modules/*stress* +v3/src/test_runner/modules/*integration* diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index b6348859..8981e7d3 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -224,43 +224,43 @@ changes with any new C word registration). ```bash # Build kernel for a given architecture (amd64 default) -make -f Makefile.starkernel ARCH=amd64 -make -f Makefile.starkernel ARCH=aarch64 -make -f Makefile.starkernel ARCH=riscv64 +make -f kernel/Makefile ARCH=amd64 +make -f kernel/Makefile ARCH=aarch64 +make -f kernel/Makefile ARCH=riscv64 # Run in QEMU with OVMF -make -f Makefile.starkernel qemu -make -f Makefile.starkernel ARCH=aarch64 qemu -make -f Makefile.starkernel ARCH=riscv64 qemu +make -f kernel/Makefile qemu +make -f kernel/Makefile ARCH=aarch64 qemu +make -f kernel/Makefile ARCH=riscv64 qemu # Clean -make -f Makefile.starkernel clean +make -f kernel/Makefile clean ``` Output: `build//kernel/starkernel_loader.efi` + `build//kernel/starkernel_kernel.elf`. Two independently tracked version strings flow into the generated `include/version.h`: -`VERSION` (`Makefile.starkernel` — the embedded StarForth engine version, currently `3.1.0`; +`VERSION` (`kernel/Makefile` — the embedded StarForth engine version, currently `3.1.0`; note this does **not** auto-sync with the standalone StarForth repo's own version) and -`LITHOS_VERSION` (`Makefile.starkernel` — the kernel version, currently **`2.0.0`**; +`LITHOS_VERSION` (`kernel/Makefile` — the kernel version, currently **`2.0.0`**; corrected 2026-09-19 — this file said `2.0.1`, but `FABRIC-3.md` §I.2 rolled it back to `2.0.0` on 2026-09-04 because `2.0.1` names the SER5 hardware-track line and claims hardware progress not yet verified. The versioning policy is **semantic, not sequential** — see the -roadmap table in `Makefile.starkernel` before choosing any version). +roadmap table in `kernel/Makefile` before choosing any version). ### Build configuration (Kconfig — real, wired, not vestigial) Every kernel-only knob (`STARFORTH_ENABLE_VM`, `PARITY_MODE`, the shared physics/heartbeat family, etc.) is an optional Kconfig symbol defined across `Kconfig`, `Kconfig.arch`, `Kconfig.heartbeat`, `Kconfig.kernel`, `Kconfig.physics`, `Kconfig.variant` (~40 symbols -total). `Makefile.starkernel` pulls its defaults from this system via a `kconfig_bool(...)` +total). `kernel/Makefile` pulls its defaults from this system via a `kconfig_bool(...)` mechanism — e.g. `STARFORTH_ENABLE_VM` defaults to **1** (confirmed at -`Makefile.starkernel:61`), meaning a plain `make -f Makefile.starkernel` already builds with +`kernel/Makefile:61`), meaning a plain `make -f kernel/Makefile` already builds with VM + capsule-birth + ACL active. A bare invocation uses the defaults it always has: ```bash -make -f Makefile.starkernel ARCH=amd64 menuconfig -make -f Makefile.starkernel ARCH=amd64 kernel_amd64_defconfig +make -f kernel/Makefile ARCH=amd64 menuconfig +make -f kernel/Makefile ARCH=amd64 kernel_amd64_defconfig ``` ### Hosted VM (vendored, for local sanity only) @@ -277,7 +277,7 @@ StarForth repo) were removed 2026-08-15 — they referenced in the actual generated `include/version.h` (which only has `STARFORTH_VERSION`, `STARFORTH_ARCH`, `STARFORTH_TARGET`, `STARFORTH_TIMESTAMP`, `STARFORTH_VERSION_FULL`, `LITHOS_VERSION`, `LITHOS_VERSION_STR`), so they could never have worked. Bump versions by hand-editing the `VERSION`/ -`LITHOS_VERSION` variables in `Makefile.starkernel` instead. Report the broken targets if +`LITHOS_VERSION` variables in `kernel/Makefile` instead. Report the broken targets if asked, don't silently fix them. ### Important: Linker Configuration @@ -298,9 +298,9 @@ The vendored hosted `make` build (above) is NEVER used to validate kernel change ```bash # Run in this exact order for every kernel change: -make -f Makefile.starkernel ARCH=amd64 clean qemu -make -f Makefile.starkernel ARCH=aarch64 clean qemu -make -f Makefile.starkernel ARCH=riscv64 clean qemu +make -f kernel/Makefile ARCH=amd64 clean qemu +make -f kernel/Makefile ARCH=aarch64 clean qemu +make -f kernel/Makefile ARCH=riscv64 clean qemu ``` **QEMU rule — non-negotiable:** Only ONE QEMU instance may run at a time, always in the @@ -475,7 +475,7 @@ listed in `proof/ROOT` (corrected 2026-09-19; this file said 23, and `proof/COVE said 52 all along). **Read `proof/COVERAGE.md` first**: its stated goal is not a green build but "identify precisely what cannot be proven and why — the boundary between 'formally verified' and 'not, for this specific reason'." Run `isabelle build -D proof/` -directly; neither `Makefile` nor `Makefile.starkernel` in this repo defines an +directly; neither `Makefile` nor `kernel/Makefile` in this repo defines an `isabelle-build`/`isabelle-check` target (unlike the standalone StarForth repo, which has a broken one — this repo simply doesn't have the target at all, so there's nothing to mistakenly invoke). @@ -495,7 +495,7 @@ status for kernel work. - **Strict ANSI C99** — No GNU extensions, no C++ features - **Zero warnings target, with four explicit exceptions — corrected 2026-08-18, previous - claim was wrong.** Build with `-Wall -Wextra -Werror`, but `Makefile.starkernel` carries + claim was wrong.** Build with `-Wall -Wextra -Werror`, but `kernel/Makefile` carries `-Wno-error=unused-parameter -Wno-error=shift-negative-value -Wno-error=sign-compare -Wno-error=missing-field-initializers` — those four classes are enabled (still visible as warnings) but deliberately downgraded from fatal, everything else is. The previous version diff --git a/Doxyfile b/Doxyfile index 517db1c4..4d6cd19a 100644 --- a/Doxyfile +++ b/Doxyfile @@ -933,10 +933,12 @@ WARN_LOGFILE = docs/api/doxygen_warnings.log # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. -INPUT = include \ - src \ - src/word_source \ - src/test_runner \ +INPUT = v3/include \ + v3/src \ + v3/src/word_source \ + v3/src/test_runner \ + kernel/include \ + kernel/src \ README.md # This tag can be used to specify the character encoding of the source files @@ -2366,9 +2368,10 @@ SEARCH_INCLUDES = YES # RECURSIVE has no effect here. # This tag requires that the tag SEARCH_INCLUDES is set to YES. -INCLUDE_PATH = include \ - src/word_source/include \ - src/test_runner/include +INCLUDE_PATH = v3/include \ + kernel/include \ + v3/src/word_source/include \ + v3/src/test_runner/include # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the diff --git a/Kconfig.arch b/Kconfig.arch index 9cc52bee..21e5bdc0 100644 --- a/Kconfig.arch +++ b/Kconfig.arch @@ -5,7 +5,7 @@ choice default ARCH_AMD64 help Selects the value passed as ARCH= to whichever Makefile - (Makefile or Makefile.starkernel) is driven from this config. + (Makefile or kernel/Makefile) is driven from this config. Both Makefiles already accept "amd64"/"aarch64"/"riscv64" as canonical spellings (each has its own alias-normalizing logic for other spellings like x86_64/arm64/riscv), so this choice diff --git a/Kconfig.heartbeat b/Kconfig.heartbeat index eb6750ea..c0880d72 100644 --- a/Kconfig.heartbeat +++ b/Kconfig.heartbeat @@ -17,7 +17,7 @@ config HEARTBEAT_THREAD_ENABLED builds without needing a special case. This is UI/model correctness (menuconfig can't offer a choice LithosAnanke has no way to honor -- there are no pthreads in a freestanding kernel), - not the sole enforcement mechanism: Makefile.starkernel additionally + not the sole enforcement mechanism: kernel/Makefile additionally keeps its own unconditional `VM_FEATURE_OVERRIDES += -DHEARTBEAT_THREAD_ENABLED=0` post-override exactly as it was before this migration. Deliberately redundant with the `depends diff --git a/Kconfig.kernel b/Kconfig.kernel index bb8cc681..9cf88534 100644 --- a/Kconfig.kernel +++ b/Kconfig.kernel @@ -11,7 +11,7 @@ config STARFORTH_ENABLE_VM kernel that only reaches the M0-M6 hardware milestones (console, PMM, VMM, interrupts, timers, kmalloc) with no FORTH interpreter, no capsules, no "ok" REPL. Gates a large source-file selection - block in Makefile.starkernel, not just a handful of -D flags. + block in kernel/Makefile, not just a handful of -D flags. config PARITY_MODE bool "Deterministic parity harness mode (PARITY_MODE)" diff --git a/Makefile b/Makefile index d3757f86..e2d16cb5 100644 --- a/Makefile +++ b/Makefile @@ -1,1340 +1,159 @@ # ============================================================================== -# StarForth Build System - The Fastest Forth in the West! -# ============================================================================== +# LithosAnanke / StarForth -- top-level Makefile # -# Quick Start: -# make - Standard optimized build (auto ARCH, TARGET=standard) -# make TARGET=fastest - Maximum performance build -# make ARCH=arm64 TARGET=fastest - Build for arm64 (e.g., Raspberry Pi 4) -# make help - Show all available targets +# Thin dispatcher. The real build lives in: +# v3/Makefile -- hosted StarForth v3 (Linux userland VM, POST, DoE) +# kernel/Makefile -- LithosAnanke kernel (UEFI loader, kernel ELF, QEMU) +# boards// -- one directory per physical target (board.mk + boot files) +# docs/book/Makefile -- the single LaTeX book (build/docs/*.pdf) +# Every sub-make runs from this directory, so paths are always repo-relative. # +# TARGET is either a board (SER5 RASPI MILKV ZYNQ7020), a hosted v3 profile +# (standard fast fastest turbo asan ...), or empty: +# +# make [all] every board that has a kernel port, the +# hosted v3 build, and the book +# make [all] TARGET= that board's boot image + its book +# make [all] TARGET= hosted v3 build with that profile +# +# make boot_image TARGET= only the board's boot image +# make boot_images every board that has a kernel port +# make docs [TARGET=] the book; a board adds its appendix +# +# make clean all of build/ except build/cache/ +# make clean TARGET= the board's image + book and its ISA's kernel objects +# make clean TARGET= build// for every arch +# make clean-docs build/docs/ +# +# make kernel ARCH= [GOAL=g] kernel/Makefile goal (default: all) +# make boards list boards and whether they can be built +# make goes to v3/Makefile (make help-hosted) # ============================================================================== -# ============================================================================== -# CONFIGURATION -# ============================================================================== +# Board name (as typed on the command line) -> boards/ directory. +BOARD_DIR_SER5 := ser5 +BOARD_DIR_RASPI := raspi +BOARD_DIR_MILKV := milkv +BOARD_DIR_ZYNQ7020 := zynq7020 +BOARDS := SER5 RASPI MILKV ZYNQ7020 +empty := +space := $(empty) $(empty) -VERSION ?= 3.2.0 -CC = gcc +board_field = $(if $(BOARD_DIR_$(1)),$(shell sed -n 's/^$(2) *:= *//p' boards/$(BOARD_DIR_$(1))/board.mk)) +board_arch = $(call board_field,$(1),BOARD_ARCH) +# A board can be built once its ISA's kernel port exists. +board_ready = $(if $(call board_arch,$(1)),$(wildcard kernel/src/arch/$(call board_arch,$(1))/.)) -# Isabelle configuration -# NOTE: Isabelle must be installed separately and available on PATH -# See docs/DEVELOPER.md for installation instructions -ISABELLE ?= isabelle +READY_BOARDS := $(foreach b,$(BOARDS),$(if $(call board_ready,$(b)),$(b))) +UNREADY_BOARDS := $(filter-out $(READY_BOARDS),$(BOARDS)) -# Architecture / target selection -ARCH ?= $(shell uname -m) -ARCH := $(strip $(ARCH)) -TARGET ?= standard -TARGET := $(strip $(TARGET)) +TARGET := $(strip $(TARGET)) +BOARD_DIR := $(if $(TARGET),$(BOARD_DIR_$(TARGET))) -# Friendly guardrail: 32-bit builds are not supported -unsupported_32bit_arches := i386 i486 i586 i686 x86 armv6 armv7 armv7l arm -ifneq ($(filter $(ARCH),$(unsupported_32bit_arches)),) - $(error StarForth targets 64-bit platforms only. ARCH='$(ARCH)' is unsupported. Please build on amd64/arm64/raspi/riscv64.) -endif +SUBMAKE := $(MAKE) --no-print-directory -# Canonical architecture normalization (x86_64→amd64, aarch64→arm64, etc.) -canon_arch = $(strip $(if $(filter x86_64,$1),amd64,$(if $(filter amd64,$1),amd64,$(if $(filter aarch64 arm64,$1),arm64,$(if $(filter riscv riscv64,$1),riscv64,$1))))) -ARCH_DIR := $(call canon_arch,$(ARCH)) -# Normalize ARCH for consistent ifeq matching -ARCH := $(call canon_arch,$(ARCH)) - -# Kconfig bridge (menuconfig/xconfig/config/oldconfig/*_defconfig). See -# mk/Kconfig.mk for why KCONFIG_ARCH_DIR must be set here, before include. -# .DEFAULT_GOAL is pinned explicitly because mk/Kconfig.mk's first rule -# would otherwise silently become Make's default goal, since it's included -# before this Makefile's own `all:` target is defined below. .DEFAULT_GOAL := all -KCONFIG_ARCH_DIR := $(ARCH_DIR) -include mk/Kconfig.mk - -# Kconfig platform-mode choice (Phase 5): PLATFORM_DEFAULT/PLATFORM_MINIMAL -# in Kconfig.variant (PLATFORM_L4RE removed -- L4Re support is historical, -# see the "Platform support" section below). Must run this early -- before -# anything below that branches on MINIMAL -- since Make evaluates a Makefile -# top-to-bottom and a variable's value at the point an `ifdef` is reached is -# whatever it resolved to *so far*, not its final value. Only applies when a -# developer hasn't already set MINIMAL explicitly (command line or -# environment) -- `ifdef` in the "Platform support" section below cares -# about definedness, not value, so this can't reuse the kconfig_bool/ -# kconfig_int pattern (those always define their target variable once -# active). Checked with $(origin ...) so an explicit `make MINIMAL=1` (or -# unset) always wins over whatever .config says. -ifeq ($(KCONFIG_ACTIVE),1) -ifeq ($(origin MINIMAL),undefined) -ifeq ($(CONFIG_PLATFORM_MINIMAL),y) -MINIMAL := 1 -endif -endif -endif - -ifeq ($(ARCH),amd64) - ARCH_NAME = x86_64 - ARCH_FLAGS = -march=native - ARCH_DEFINES = -DARCH_X86_64=1 - ASM_SYNTAX = -masm=intel -else ifeq ($(ARCH),arm64) - ARCH_NAME = ARM64 - ARCH_FLAGS = -march=armv8-a+crc+simd -mtune=cortex-a72 - ARCH_DEFINES = -DARCH_ARM64=1 - ASM_SYNTAX = -else ifeq ($(ARCH),raspi) - ARCH_NAME = Raspberry Pi 4 (ARM64) - ARCH_FLAGS = -march=armv8-a+crc+simd -mtune=cortex-a72 - ARCH_DEFINES = -DARCH_ARM64=1 -DRASPBERRY_PI_BUILD=1 - ASM_SYNTAX = -else ifeq ($(ARCH),riscv64) - ARCH_NAME = RISC-V 64 (QEMU) - ARCH_FLAGS = -march=rv64gc -mabi=lp64d -mcmodel=medany - ARCH_DEFINES = -DARCH_RISCV64=1 - ASM_SYNTAX = -else ifeq ($(ARCH),riscv) - ARCH_NAME = RISC-V 64 (QEMU) - ARCH_FLAGS = -march=rv64gc -mabi=lp64d -mcmodel=medany - ARCH_DEFINES = -DARCH_RISCV64=1 - ASM_SYNTAX = -else - $(warning Unknown architecture: $(ARCH), using generic flags) - ARCH_NAME = generic - ARCH_FLAGS = - ARCH_DEFINES = - ASM_SYNTAX = -endif - -# Compiler flags -# Feature switches (default: enabled) -# Physics/SSM knob family: repointed through the Kconfig bridge (see -# mk/Kconfig.mk's kconfig_bool/kconfig_int) as of the Kconfig migration's -# Phase 3. Each call below is a drop-in replacement for a bare `?=`: when -# no build/$(ARCH)/.config exists (KCONFIG_ACTIVE unset), it's exactly -# `VAR ?= default`, identical to before; once a .config exists, the -# Kconfig-fed value takes over. `make VAR=x` on the command line always -# wins regardless of which branch fires. -# -# STRICT_PTR: VM memory bounds checking on every pointer access -# Default: 1 (enabled). Disable only for raw benchmarking comparisons. -$(eval $(call kconfig_bool,STRICT_PTR,1)) - -# ENABLE_HOTWORDS_CACHE: Physics-driven hot-words cache (1.78× speedup on dictionary lookups) -# Default: 1 (enabled - experiments show cache is optimal) -# Set ENABLE_HOTWORDS_CACHE=0 to disable (for research comparison only) -$(eval $(call kconfig_bool,ENABLE_HOTWORDS_CACHE,0)) - -# ENABLE_PIPELINING: Speculative execution via word transition prediction -# Default: 1 (enabled - experiments show pipelining is optimal) -# Set ENABLE_PIPELINING=0 to disable (for research comparison only) -# NOTE: As of 2025-11-19, all future experiments use both cache and pipelining enabled -$(eval $(call kconfig_bool,ENABLE_PIPELINING,0)) - -# EMERGENCY_CONSOLE_ENABLED: 1 = REPL recovers from errors and continues (interactive fallthrough) -# 0 = errors are non-recoverable; REPL exits and vm_fault_handler() is called instead -# Default: 1 (dev/recovery builds) -# Set EMERGENCY_CONSOLE_ENABLED=0 for production, embedded, or high-security builds -# where no interactive fallthrough surface should exist. -# Heartbeat family: repointed through the Kconfig bridge (Phase 4). Same -# drop-in-replacement-for-`?=` behavior as the physics/SSM family (Phase 3). -$(eval $(call kconfig_bool,EMERGENCY_CONSOLE_ENABLED,1)) - -# Heartbeat configuration -# HEARTBEAT_THREAD_ENABLED: 1 = run vm_tick() in background thread (OPTIMAL), 0 = inline (legacy) -# Default: 1 (experiments show threaded heartbeat is optimal for adaptive tuning) -# NOTE: As of 2025-11-19, all future experiments use heartbeat enabled -$(eval $(call kconfig_bool,HEARTBEAT_THREAD_ENABLED,1)) - -# HEARTBEAT_TICK_NS: Wake frequency for heartbeat thread (default 1ms) -$(eval $(call kconfig_int,HEARTBEAT_TICK_NS,10000)) - -# HEARTBEAT_CHECK_FREQUENCY / HEARTBEAT_WINDOW_TUNING_FREQUENCY / -# HEARTBEAT_SLOPE_VALIDATION_FREQUENCY: previously unwired in the hosted -# Makefile -- no `?=` and no -D forwarding existed for any of these three -# before Phase 4, so hosted builds always got starforth_config.h's bare -# defaults (256/1000/5000) with no override mechanism at all. The kernel -# Makefile has always had opt-in forwarding for them (VM_FEATURE_FLAG_VARS). -# Promoted here for parity, same treatment as Phase 3's SSM_* knobs. -$(eval $(call kconfig_int,HEARTBEAT_CHECK_FREQUENCY,256)) -$(eval $(call kconfig_int,HEARTBEAT_WINDOW_TUNING_FREQUENCY,1000)) -$(eval $(call kconfig_int,HEARTBEAT_SLOPE_VALIDATION_FREQUENCY,5000)) - -# HISTORICAL: L4Re had no pthreads, so this forced HEARTBEAT_THREAD_ENABLED -# off whenever L4RE=1 was set. L4Re support is no longer an active target; -# see "Platform support" below. -# ifeq ($(L4RE),1) -# HEARTBEAT_THREAD_ENABLED := 0 -# endif - -# Feedback Loop Toggle Switches (for systematic performance measurement) -# ============================================================================ -# These allow turning each feedback loop on/off to measure additive performance gains -# EXP_00-BASELINE: all loops OFF (plain FORTH-79) -# EXP_01: Loop #1 ON -# EXP_02: Loops #1-2 ON -# ... etc, building cumulatively to measure each loop's contribution - -# ============================================================================== -# SSM (Steady State Machine) Configuration - Data-Driven Architecture -# ============================================================================== -# Based on 2^7 DoE with 300 reps (128 configs, 38,400 runs). -# Top 5% analysis (speed + stability) reveals optimal loop combinations. -# -# Experimentally Validated Architecture: -# L1 (heat_tracking): DISABLED (harmful in 86% of top configs) -# L4 (pipelining_metrics): DISABLED (harmful in 100% of top configs) -# L7 (adaptive_heartrate): ALWAYS ON (beneficial in 71% of top configs) -# L2, L3, L5, L6: Runtime-controlled by L8 (workload-dependent) -# L8 (Jacquard): 4-bit mode selector (16 modes: C0-C15) -# -# L8 dynamically controls L2/L3/L5/L6 based on entropy, CV, and temporal metrics. -# Top 5% validated modes: C4, C7, C9, C11, C12 (see src/ssm_jacquard.c) - -# Tuning Knobs (Physics-driven Optimization System) -# ============================================================================ -# Knob #7: ROLLING_WINDOW_SIZE (Initial execution history capture) -# - Default: 4096 (conservative, ensures statistical significance at cold start) -# - Usage: make ROLLING_WINDOW_SIZE=8192 (larger for complex workloads) -# or ROLLING_WINDOW_SIZE=2048 (smaller for memory constraints) -# - System AUTOMATICALLY shrinks during execution if diminishing returns detected -# - Window starts conservative, self-tunes down if pattern diversity plateaus -# - Window becomes "warm" (representative) after N executions, then adapts -$(eval $(call kconfig_int,ROLLING_WINDOW_SIZE,4096)) - -# Knob #6: TRANSITION_WINDOW_SIZE (Pipelining context depth) -# - Default: 8 (see starforth_config.h for the exact shipped value) -# - Usage: make TRANSITION_WINDOW_SIZE=1 (or 2, 4 for shallower context) -# - Empirically tuned via binary chop: 1 vs 2 vs 4 vs 8 -$(eval $(call kconfig_int,TRANSITION_WINDOW_SIZE,8)) - -# SPECULATION_THRESHOLD_Q48 / SPECULATION_DEPTH / MIN_SAMPLES_FOR_SPECULATION / -# MISPREDICTION_COST_Q48 / MINIMUM_PREFETCH_ROI: previously hardcoded, -# non-overridable #define in physics_pipelining_metrics.h -- no Makefile -# knob or -D forwarding existed for any of these five before Phase 5. -# Promoted here for parity, same treatment as Phase 3/4's other -# previously-unwired constants. All five are Q48.16-fixed-point or plain -# counts meaningful only when ENABLE_PIPELINING is on; see Kconfig.physics -# for the exact hex/decimal defaults. MINIMUM_PREFETCH_ROI's default was -# corrected from the long-shipped 0x11999A to 0x1199A (rev y) -- the -# former was ~17.6 in Q48.16, not the documented 1.10. -$(eval $(call kconfig_int,SPECULATION_THRESHOLD_Q48,0x8000)) -$(eval $(call kconfig_int,SPECULATION_DEPTH,1)) -$(eval $(call kconfig_int,MIN_SAMPLES_FOR_SPECULATION,10)) -$(eval $(call kconfig_int,MISPREDICTION_COST_Q48,0x190000)) -$(eval $(call kconfig_int,MINIMUM_PREFETCH_ROI,0x1199A)) - -# Knobs #8-11: Adaptive Window Shrinking Control -# ============================================================================ -# These control how aggressively the rolling window learns and adapts -# (NOT the initial window size - that's ROLLING_WINDOW_SIZE above) - -# Knob #8: ADAPTIVE_SHRINK_RATE (percentage to retain when shrinking) -# - Default: 50 (shrink to 50% = discard 50% each cycle) -# - Range: 50-95 (lower = more aggressive, higher = more conservative) -# - Usage: make ADAPTIVE_SHRINK_RATE=75 (slower learning) or 90 (slow learning) -$(eval $(call kconfig_int,ADAPTIVE_SHRINK_RATE,50)) - -# Knob #9: ADAPTIVE_MIN_WINDOW_SIZE (floor to prevent over-shrinking) -# - Default: 256 (never shrink below 256 word IDs) -# - Range: 64-1024 (smaller = leaner, larger = safer) -# - Usage: make ADAPTIVE_MIN_WINDOW_SIZE=512 (conservative) or 128 (lean) -$(eval $(call kconfig_int,ADAPTIVE_MIN_WINDOW_SIZE,256)) - -# Knob #10: ADAPTIVE_CHECK_FREQUENCY (how often to measure diversity) -# - Default: 512 (check after every 512 executions) -# - Range: 32-1024 (more = faster response, less = less overhead) -# - Usage: make ADAPTIVE_CHECK_FREQUENCY=128 (responsive) or 256 (default of comparable knobs) -$(eval $(call kconfig_int,ADAPTIVE_CHECK_FREQUENCY,512)) - -# Knob #11: ADAPTIVE_GROWTH_THRESHOLD (growth rate that signals saturation) -# - Default: 5 (shrink when growth < 5%) -# - Range: 0-10 (lower = eager shrinking, higher = cautious) -# - Usage: make ADAPTIVE_GROWTH_THRESHOLD=0 (aggressive) or 1 (less conservative) -$(eval $(call kconfig_int,ADAPTIVE_GROWTH_THRESHOLD,5)) - -# Knob #11a: INITIAL_DECAY_SLOPE_Q48 (Starting decay slope for inference engine) -# - Default: 21845 (1/3 in Q48.16 format, = 0.333... starting slope) -# - Range: 13107-43691 (0.2 to 0.67 in Q48.16) -# - Usage: make INITIAL_DECAY_SLOPE_Q48=13107 (0.2) or 32768 (0.5) or 43691 (0.67) -# - DoE: OPP #3 tests 0.2, 0.33, 0.5, 0.67 to find optimal starting point for convergence -# - Note: Inference engine adapts this value at runtime; this is just the cold-start value -$(eval $(call kconfig_int,INITIAL_DECAY_SLOPE_Q48,21845)) - -# Knob #11b: DECAY_MIN_INTERVAL (Minimum time before decay applies) -# - Default: 500 (nanoseconds) -# - Range: 500-5000 (balance between decay sensitivity and overhead) -# - Usage: make DECAY_MIN_INTERVAL=1000 (slower decay) or 2000 (slower still) -# - NOTE: as of the tick-based Loop #3 decay conversion (rev t, see -# docs/working/architecture/VM-FLEET-ATTRACTOR-DESIGN-20260705.md), -# Loop #3 no longer consults this value at all -- decay is gated on -# elapsed heartbeat ticks, not elapsed nanoseconds. Kept only because -# doe_metrics.c still reports it as a metrics field; informational, -# not load-bearing. -$(eval $(call kconfig_int,DECAY_MIN_INTERVAL,500)) - -# Knob #11d: HEARTBEAT_INFERENCE_FREQUENCY (How often to run inference engine) -# - Default: 1000 (ticks between inference runs) -# - Set VERY HIGH (999999) to effectively disable inference (static mode) -# - Set LOW for frequent inference (adaptive mode) -# - DoE: OPP #3 tests 999999 (static, no Loop #6) vs 1000 (adaptive, with Loop #6) -# - Measures: Inference engine cost vs benefit in optimized performance -$(eval $(call kconfig_int,HEARTBEAT_INFERENCE_FREQUENCY,1000)) - -# Knob #12: DECAY_RATE_PER_US_Q16 (Heat decay rate in Q16 fixed-point) -# - Default: 1 (1/65536 heat units decayed per microsecond) -# - Range: 0-65536 (0 = no decay, 65536 = 1 heat/µs) -# - Half-life: ~6.5 seconds at default (100-heat word → 50-heat in 6.5s) -# - Usage: make DECAY_RATE_PER_US_Q16=2 (faster decay) or 0 (no decay for baseline) -# - DoE: Vary this to measure impact of heat decay on performance -$(eval $(call kconfig_int,DECAY_RATE_PER_US_Q16,1)) - -# L8 Jacquard mode selector thresholds (ssm_jacquard.h). Previously unwired -- -# no Makefile knob or -D forwarding existed for these before the Kconfig -# migration's Phase 3; ssm_jacquard.h's own #ifndef fallback was the only -# place any of these five values lived. See Kconfig.physics for the -# rationale behind modeling the four float thresholds as Kconfig `string` -# symbols (Kconfig has no native float type). -$(eval $(call kconfig_int,SSM_ENTROPY_HIGH_THRESHOLD,0.75)) -$(eval $(call kconfig_int,SSM_CV_HIGH_THRESHOLD,0.15)) -$(eval $(call kconfig_int,SSM_TEMPORAL_DECAY_THRESHOLD,0.5)) -$(eval $(call kconfig_int,SSM_TEMPORAL_DECAY_LOW_THRESHOLD,0.3)) -$(eval $(call kconfig_int,SSM_HYSTERESIS_TICKS,5)) - -# Build the CFLAGS with tuning knobs -# L8 FINAL INTEGRATION: All experimental loop flags removed. -# L1-L7 are now always-on internal physics layers. -# L8 Jacquard mode selector is the sole policy engine. -BASE_CFLAGS = -std=c99 -Wall -Werror -Iinclude -Isrc/word_source -Isrc/test_runner/include \ - -DSTRICT_PTR=$(STRICT_PTR) \ - -DENABLE_HOTWORDS_CACHE=$(ENABLE_HOTWORDS_CACHE) \ - -DENABLE_PIPELINING=$(ENABLE_PIPELINING) \ - -DROLLING_WINDOW_SIZE=$(ROLLING_WINDOW_SIZE) \ - -DTRANSITION_WINDOW_SIZE=$(TRANSITION_WINDOW_SIZE) \ - -DSPECULATION_THRESHOLD_Q48=$(SPECULATION_THRESHOLD_Q48) \ - -DSPECULATION_DEPTH=$(SPECULATION_DEPTH) \ - -DMIN_SAMPLES_FOR_SPECULATION=$(MIN_SAMPLES_FOR_SPECULATION) \ - -DMISPREDICTION_COST_Q48=$(MISPREDICTION_COST_Q48) \ - -DMINIMUM_PREFETCH_ROI=$(MINIMUM_PREFETCH_ROI) \ - -DADAPTIVE_SHRINK_RATE=$(ADAPTIVE_SHRINK_RATE) \ - -DADAPTIVE_MIN_WINDOW_SIZE=$(ADAPTIVE_MIN_WINDOW_SIZE) \ - -DADAPTIVE_CHECK_FREQUENCY=$(ADAPTIVE_CHECK_FREQUENCY) \ - -DADAPTIVE_GROWTH_THRESHOLD=$(ADAPTIVE_GROWTH_THRESHOLD) \ - -DINITIAL_DECAY_SLOPE_Q48=$(INITIAL_DECAY_SLOPE_Q48) \ - -DDECAY_RATE_PER_US_Q16=$(DECAY_RATE_PER_US_Q16) \ - -DHEARTBEAT_THREAD_ENABLED=$(HEARTBEAT_THREAD_ENABLED) \ - -DHEARTBEAT_TICK_NS=$(HEARTBEAT_TICK_NS) \ - -DHEARTBEAT_INFERENCE_FREQUENCY=$(HEARTBEAT_INFERENCE_FREQUENCY) \ - -DHEARTBEAT_CHECK_FREQUENCY=$(HEARTBEAT_CHECK_FREQUENCY) \ - -DHEARTBEAT_WINDOW_TUNING_FREQUENCY=$(HEARTBEAT_WINDOW_TUNING_FREQUENCY) \ - -DHEARTBEAT_SLOPE_VALIDATION_FREQUENCY=$(HEARTBEAT_SLOPE_VALIDATION_FREQUENCY) \ - -DEMERGENCY_CONSOLE_ENABLED=$(EMERGENCY_CONSOLE_ENABLED) \ - -DSSM_ENTROPY_HIGH_THRESHOLD=$(SSM_ENTROPY_HIGH_THRESHOLD) \ - -DSSM_CV_HIGH_THRESHOLD=$(SSM_CV_HIGH_THRESHOLD) \ - -DSSM_TEMPORAL_DECAY_THRESHOLD=$(SSM_TEMPORAL_DECAY_THRESHOLD) \ - -DSSM_TEMPORAL_DECAY_LOW_THRESHOLD=$(SSM_TEMPORAL_DECAY_LOW_THRESHOLD) \ - -DSSM_HYSTERESIS_TICKS=$(SSM_HYSTERESIS_TICKS) - -ifeq ($(HEARTBEAT_THREAD_ENABLED),1) -# HISTORICAL: this used to branch on L4RE (no pthreads there) -- -# THREAD_FLAGS := if L4RE else -pthread. L4Re support is no longer an -# active target; see "Platform support" below. -THREAD_FLAGS := -pthread -else -THREAD_FLAGS := -endif - -BASE_CFLAGS += $(THREAD_FLAGS) - -# Build profiles (TARGET values) -SUPPORTED_TARGETS := standard fast fastest turbo asan - -TARGET_DESCRIPTION_standard := Standard optimized build -TARGET_CFLAGS_standard := $(BASE_CFLAGS) $(ARCH_FLAGS) $(ARCH_DEFINES) -O2 -flto=auto -fuse-linker-plugin -DNDEBUG \ - -DUSE_ASM_OPT=1 \ - -ffunction-sections -fdata-sections -fomit-frame-pointer \ - -fno-asynchronous-unwind-tables -fno-unwind-tables -fno-strict-aliasing -TARGET_LDFLAGS_standard := -Wl,--gc-sections -s -flto=auto -fuse-linker-plugin -static $(THREAD_FLAGS) - -TARGET_DESCRIPTION_fast := Fast optimized build (no LTO, easier debugging) -TARGET_CFLAGS_fast := $(BASE_CFLAGS) $(ARCH_FLAGS) $(ARCH_DEFINES) -O3 -DUSE_ASM_OPT=1 -DUSE_DIRECT_THREADING=1 -DNDEBUG -TARGET_LDFLAGS_fast := -s $(THREAD_FLAGS) - -TARGET_DESCRIPTION_fastest := Maximum performance build (ASM + LTO + direct threading) -TARGET_CFLAGS_fastest := $(BASE_CFLAGS) $(ARCH_FLAGS) $(ARCH_DEFINES) -O3 -DUSE_ASM_OPT=1 -DUSE_DIRECT_THREADING=1 -DNDEBUG \ - -flto=auto -fuse-linker-plugin -funroll-loops -finline-functions -fomit-frame-pointer -fno-plt -fno-semantic-interposition -TARGET_LDFLAGS_fastest := -flto=auto -fuse-linker-plugin -s -Wl,--gc-sections $(THREAD_FLAGS) - -TARGET_DESCRIPTION_turbo := Assembly-optimized build (no direct threading) -TARGET_CFLAGS_turbo := $(BASE_CFLAGS) $(ARCH_FLAGS) $(ARCH_DEFINES) -O3 -DUSE_ASM_OPT=1 -DNDEBUG -flto -TARGET_LDFLAGS_turbo := -flto -s $(THREAD_FLAGS) - -TARGET_DESCRIPTION_asan := ASan/UBSan instrumented build for memory error detection -TARGET_CFLAGS_asan := $(BASE_CFLAGS) $(ARCH_FLAGS) $(ARCH_DEFINES) -O1 -g \ - -fsanitize=address,undefined -fno-omit-frame-pointer -TARGET_LDFLAGS_asan := -fsanitize=address,undefined $(THREAD_FLAGS) - -define TARGET_POST_fastest - @echo "" - @echo "🎯 You've built the FASTEST FORTH IN THE WEST!" - @echo "" - @echo "Quick-draw benchmark:" - @time -f " ⏱️ Time: %E seconds" ./$(BINARY) -c ": BENCH 1000000 0 DO 1 2 + DROP LOOP ; BENCH BYE" 2>/dev/null || true -endef - -TARGET_DESCRIPTION := $(TARGET_DESCRIPTION_$(TARGET)) -ifeq ($(strip $(TARGET_DESCRIPTION)),) - $(error Unknown TARGET '$(TARGET)'. Supported targets: $(SUPPORTED_TARGETS)) -endif - -TARGET_CFLAGS_SELECTED := $(TARGET_CFLAGS_$(TARGET)) -TARGET_LDFLAGS_SELECTED := $(TARGET_LDFLAGS_$(TARGET)) -TARGET_POST := $(or $(TARGET_POST_$(TARGET)),@:) - -CFLAGS ?= $(TARGET_CFLAGS_SELECTED) -LDFLAGS ?= $(TARGET_LDFLAGS_SELECTED) - -CFLAGS += $(EXTRA_CFLAGS) -LDFLAGS += $(EXTRA_LDFLAGS) - -USE_ASM_OPT := $(if $(findstring -DUSE_ASM_OPT=1,$(CFLAGS)),1,0) -USE_LTO := $(if $(or $(findstring -flto,$(CFLAGS)),$(findstring -flto,$(LDFLAGS))),1,0) - -# Platform support -# -# HISTORICAL: L4Re/Fiasco.OC was a supported platform target (`make L4RE=1`) -# through mid-2026. Removed as an active target; src/platform/l4re/time.c -# is retained for reference but no longer wired into any build. To restore: -# reinstate the `else ifdef L4RE` branch below and the L4RE-conditional -# logic marked HISTORICAL elsewhere in this Makefile (search "L4RE"/"L4Re"). -# -# ifdef MINIMAL -# ... -# else ifdef L4RE -# CFLAGS += -D__l4__=1 -# PLATFORM_TIME_SRC = src/platform/l4re/time.c src/platform/platform_init.c -# PLATFORM_ALLOC_SRC = src/platform/alloc_kernel.c -# else -# ... -# endif -ifdef MINIMAL -# DISABLED 2026-07-08: this was never a finished feature, not a small bug. -# src/platform/starforth_minimal.c (referenced below) does not exist -# anywhere in the repo, and only 5 of ~90 source files under src/ have any -# STARFORTH_MINIMAL awareness despite -nostdlib -ffreestanding applying to -# the entire tree. Confirmed by trying it: even a throwaway empty stub for -# the missing file lets the build report "success" while linking a binary -# with no _start entry point (this build's specific -nostdlib/-static/ -# -pthread/-flto flag combination doesn't actually exclude libc, so most -# calls silently resolve anyway -- the illusion of success is the trap). -# Reviving this needs an actual freestanding platform layer written from -# scratch, not a quick fix -- failing loudly here instead of letting -# anyone hit a confusing compile error or, worse, a binary that "builds" -# but can't run. See .claude/CLAUDE.md's punch list for status. -$(error MINIMAL=1 build is disabled: incomplete freestanding platform layer, not currently supported. See the comment immediately above this line for why) -CFLAGS += -DSTARFORTH_MINIMAL=1 -nostdlib -ffreestanding -LDFLAGS += -nostdlib -PLATFORM_SRC = src/platform/starforth_minimal.c -PLATFORM_ALLOC_SRC = src/platform/alloc_kernel.c -else -PLATFORM_TIME_SRC = src/platform/linux/time.c src/platform/linux/io.c src/platform/platform_init.c -PLATFORM_ALLOC_SRC = src/platform/alloc_host.c -endif - -PLATFORM_COMMON_SRC = src/platform/threading.c $(PLATFORM_ALLOC_SRC) - -# Source and object files -SRC = $(wildcard src/*.c src/word_source/*.c src/test_runner/*.c src/test_runner/modules/*.c) $(PLATFORM_SRC) $(PLATFORM_TIME_SRC) $(PLATFORM_COMMON_SRC) -BUILD_ROOT ?= build -build_dir = $(BUILD_ROOT)/$(call canon_arch,$(or $2,$(ARCH)))/$1 -binary_path = $(call build_dir,$1,$2)/starforth -BUILD_DIR = $(call build_dir,$(TARGET),$(ARCH)) -BINARY = $(call binary_path,$(TARGET),$(ARCH)) -OBJ = $(patsubst src/%.c,$(BUILD_DIR)/%.o,$(SRC)) -ASM_FILES = $(patsubst src/%.c,$(BUILD_DIR)/%.s,$(SRC)) - -# Profiler support for test targets -PROFILE_LEVEL := $(strip $(PROFILE)) -ifeq ($(PROFILE_LEVEL),) -PROFILE_ARGS := -else -PROFILE_ARGS := --profile $(PROFILE_LEVEL) -PROFILE_REPORT ?= 1 -ifneq ($(strip $(PROFILE_REPORT)),0) -PROFILE_ARGS += --profile-report -endif -endif - -# Installation directories -PREFIX ?= . -BINDIR = $(PREFIX)/bin -MANDIR = $(PREFIX)/share/man/man1 -INFODIR = $(PREFIX)/share/info -DOCDIR = $(PREFIX)/share/doc/starforth -CONFDIR = $(PREFIX)/etc/starforth - -# ============================================================================== -# PHONY TARGETS -# ============================================================================== - -.PHONY: all banner help clean clean-obj clean-docs starkernel mkcapsule capsule-gen capsule-manifest -.PHONY: fastest fast turbo -.PHONY: rpi4 rpi4-cross rpi4-fastest riscv64-clang -.PHONY: minimal debug profile performance -.PHONY: test bench benchmark -.PHONY: asm sbom -.PHONY: docs api-docs docs-latex docs-isabelle isabelle-build isabelle-check info math-companion math-companion-clean -.PHONY: refinement-status refinement-init refinement-phase1 verify-defect refinement-annotate-check refinement-report -.PHONY: install uninstall package deb rpm -.PHONY: quality compile_commands clang_tidy cppcheck gcc_analyzer -.PHONY: FORCE version-info build-manifest - -# ============================================================================== -# MAIN TARGETS -# ============================================================================== - -all: banner $(BINARY) - @echo "" - @echo "✓ Build complete: $(BINARY)" - @echo " Architecture: $(ARCH_NAME)" - @echo " Profile: $(TARGET_DESCRIPTION) ($(TARGET))" - @echo " Output directory: $(BUILD_DIR)" - @echo " Optimizations: $(if $(findstring USE_ASM_OPT,$(CFLAGS)),Enabled,Disabled)" - @echo " Direct Threading: $(if $(findstring USE_DIRECT_THREADING,$(CFLAGS)),Enabled,Disabled)" - @mkdir -p lfs/$(ARCH_DIR) - @cp $(BINARY) lfs/$(ARCH_DIR)/starforth - @echo " LFS copy: lfs/$(ARCH_DIR)/starforth" - $(TARGET_POST) - -banner: - @echo "════════════════════════════════════════════════════════════" - @echo " ⚡ Building the Fastest Forth in the West! ⚡" - @echo "════════════════════════════════════════════════════════════" - @echo " Target Architecture: $(ARCH_NAME) ($(ARCH_DIR))" - @echo " Build Profile: $(TARGET_DESCRIPTION) ($(TARGET))" - @echo "" - -# ============================================================================== -# OPTIMIZATION BUILDS - The Fastest in the West -# ============================================================================== - -# Maximum performance - no compromises -fastest: - @echo "🏆 Building FASTEST configuration..." - @echo " - Architecture: $(ARCH_NAME)" - @echo " - Assembly optimizations: ENABLED" - @echo " - Direct threading: ENABLED" - @echo "" - @$(MAKE) TARGET=fastest all - -# Fast without LTO (easier debugging) -fast: - @echo "⚡ Building FAST configuration (no LTO for debugging)..." - @$(MAKE) TARGET=fast all - -# Assembly optimizations only (no direct threading) -turbo: - @echo "🚀 Building TURBO configuration (ASM only)..." - @$(MAKE) TARGET=turbo all - -# ============================================================================== -# PLATFORM-SPECIFIC BUILDS -# ============================================================================== - -# Raspberry Pi 4 - native build -rpi4: - @echo "🥧 Building for Raspberry Pi 4 (native)..." - @$(MAKE) ARCH=raspi TARGET=fastest CFLAGS="$(BASE_CFLAGS) -march=armv8-a+crc+simd -mtune=cortex-a72 -DARCH_ARM64=1 -O3 -DUSE_ASM_OPT=1 -DUSE_DIRECT_THREADING=1 -DNDEBUG -flto" LDFLAGS="-flto -s" all - @echo "✓ Raspberry Pi build ready: $(call binary_path,fastest,raspi)" - -# Raspberry Pi 4 - cross-compile from x86_64 -rpi4-cross: - @echo "🥧 Cross-compiling for Raspberry Pi 4..." - @$(MAKE) ARCH=raspi TARGET=fastest CC=aarch64-linux-gnu-gcc \ - CFLAGS="$(BASE_CFLAGS) -march=armv8-a+crc+simd -mtune=cortex-a72 -DARCH_ARM64=1 -O3 -DUSE_ASM_OPT=1 -DUSE_DIRECT_THREADING=1 -DNDEBUG -flto -static" \ - LDFLAGS="-flto -s -static" \ - all - @echo "✓ Cross-compiled binary ready: $(call binary_path,fastest,raspi)" - @echo " Copy to RPi4: scp $(call binary_path,fastest,raspi) pi@raspberrypi.local:~/" - -# Raspberry Pi 4 - maximum optimization -rpi4-fastest: - @echo "🥧⚡ Building FASTEST for Raspberry Pi 4..." - @$(MAKE) ARCH=raspi TARGET=fastest CC=aarch64-linux-gnu-gcc \ - CFLAGS="$(BASE_CFLAGS) -march=armv8-a+crc+simd+crypto -mtune=cortex-a72 -DARCH_ARM64=1 -O3 -DUSE_ASM_OPT=1 -DUSE_DIRECT_THREADING=1 -DNDEBUG -flto -funroll-loops -finline-functions" \ - LDFLAGS="-flto -s -static" \ - all - @echo "✓ Raspberry Pi FASTEST build ready: $(call binary_path,fastest,raspi)" - -# RISC-V 64 - cross-compile via clang (GCC fails to build this tree under -# -std=c99: a nanosleep visibility failure, not yet root-caused — see -# docs/lithosananke/hosted-acceptance-test/README.md and -# docs/working/archive/session-logs/2026-07-24-punch-list.md item #3). -# CFLAGS deliberately does NOT reuse $(BASE_CFLAGS): BASE_CFLAGS hardcodes -# -std=c99, and clang needs -std=c11 -pthread here. This mirrors the exact -# recipe verified in the hosted-acceptance-test doc, kept in sync with it. -riscv64-clang: - @echo "🦀 Cross-compiling for RISC-V 64 (clang)..." - @$(MAKE) ARCH=riscv64 TARGET=fastest \ - CC="clang-18 --target=riscv64-linux-gnu --sysroot=/usr/riscv64-linux-gnu" \ - CFLAGS="-std=c11 -pthread -Wall -Werror -Iinclude -Isrc/word_source -Isrc/test_runner/include -DSTRICT_PTR=1 -march=rv64gc -mabi=lp64d -mcmodel=medany -DARCH_RISCV64=1 -O3 -DUSE_ASM_OPT=1 -DUSE_DIRECT_THREADING=1 -DNDEBUG -flto -static" \ - LDFLAGS="-flto -s -static -fuse-ld=lld" \ - all - @echo "✓ Cross-compiled binary ready: $(call binary_path,fastest,riscv64)" - @echo " Run: qemu-riscv64 $(call binary_path,fastest,riscv64)" - -# Minimal/embedded build -minimal: - $(MAKE) MINIMAL=1 - -# HISTORICAL: L4Re support removed as an active target (see "Platform -# support" above). This target cross-compiled a minimal build with the -# L4Re toolchain (l4-gcc) for smoke-testing without real L4Re headers. -# fake-l4re: -# $(MAKE) MINIMAL=1 CC=l4-gcc CFLAGS="$(BASE_CFLAGS) -DL4RE_TARGET=1" - -# ============================================================================== -# DEBUG & DEVELOPMENT BUILDS -# ============================================================================== - -# Debug build with symbols -debug: banner - @echo "🐛 Building DEBUG configuration..." - $(MAKE) CFLAGS="$(BASE_CFLAGS) -O0 -g -DDEBUG" LDFLAGS="" $(BINARY) - -# Build with profiler support -profile: - $(MAKE) CFLAGS="$(BASE_CFLAGS) -g -O1" $(BINARY) - -# Performance build (legacy alias - redirects to 'fastest') -performance: fastest - -# ============================================================================== -# BUILD RULES -# ============================================================================== - -# Generate version header from Makefile VERSION, ARCH, TARGET, and timestamp -include/version.h: FORCE - @mkdir -p include - @echo "Generating version header..." - @BUILD_TS=$$(date -Iseconds 2>/dev/null || echo "unknown"); \ - printf '#ifndef STARFORTH_VERSION_H\n#define STARFORTH_VERSION_H\n\n' > $@; \ - printf '#define STARFORTH_VERSION "%s"\n' "$(VERSION)" >> $@; \ - printf '#define STARFORTH_ARCH "%s"\n' "$(ARCH_NAME)" >> $@; \ - printf '#define STARFORTH_TARGET "%s"\n' "$(TARGET)" >> $@; \ - printf '#define STARFORTH_TIMESTAMP "%s"\n' "$$BUILD_TS" >> $@; \ - printf '#define STARFORTH_VERSION_FULL "StarForth v%s %s %s %s"\n\n' "$(VERSION)" "$(ARCH_NAME)" "$(TARGET)" "$$BUILD_TS" >> $@; \ - printf '#endif /* STARFORTH_VERSION_H */\n' >> $@ - -# Ensure version.h exists and is up-to-date before compilation -FORCE: - -# ============================================================================== -# CAPSULE SUBSYSTEM -# ============================================================================== - -CAPSULES_DIR ?= capsules -MKCAPSULE_SRC = tools/mkcapsule.c -MKCAPSULE_BIN = $(BUILD_DIR)/tools/mkcapsule -CAPSULE_GENERATED = $(BUILD_DIR)/capsule_generated.c -CAPSULE_GENERATED_OBJ = $(BUILD_DIR)/capsule_generated.o -CAPSULE_MANIFEST = $(CAPSULES_DIR)/MANIFEST_AUTO.md - -# Build the mkcapsule host tool -$(MKCAPSULE_BIN): $(MKCAPSULE_SRC) - @mkdir -p $(dir $@) - @echo " HOSTCC $<" - @$(CC) -O2 -Wall -o $@ $< - -# Run mkcapsule to generate the capsule directory C source -$(CAPSULE_GENERATED): $(MKCAPSULE_BIN) $(CAPSULES_DIR) - @mkdir -p $(dir $@) - @echo " MKCAP $(CAPSULES_DIR) -> $@" - @$(MKCAPSULE_BIN) $(CAPSULES_DIR) $@ - -# Compile the generated capsule directory -$(CAPSULE_GENERATED_OBJ): $(CAPSULE_GENERATED) | include/version.h - @mkdir -p $(dir $@) - @echo " CC $<" - @$(CC) $(CFLAGS) -c $< -o $@ - -.PHONY: mkcapsule capsule-gen capsule-manifest -mkcapsule: $(MKCAPSULE_BIN) -capsule-manifest: $(MKCAPSULE_BIN) - @echo " MANIFEST $(CAPSULES_DIR) -> $(CAPSULE_MANIFEST)" - @$(MKCAPSULE_BIN) --manifest $(CAPSULES_DIR) $(CAPSULE_MANIFEST) -capsule-gen: $(CAPSULE_GENERATED) capsule-manifest - -# starkernel: full capsule-aware build -# 1. Build mkcapsule tool -# 2. Generate capsule_generated.c from capsules/ -# 3. Compile StarForth with __STARKERNEL__ and capsule_generated.o linked in -starkernel: $(MKCAPSULE_BIN) $(CAPSULE_GENERATED_OBJ) - @$(MAKE) $(BINARY) \ - EXTRA_CFLAGS="-D__STARKERNEL__=1 -Iinclude" \ - EXTRA_OBJ="$(CAPSULE_GENERATED_OBJ)" - -# ============================================================================== -# Main executable -$(BINARY): $(OBJ) $(EXTRA_OBJ) - @echo "🔗 Linking $(BINARY)..." - @mkdir -p $(dir $@) - $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) - -# Pattern rule for all C files (consolidates 5 repetitive rules) -# Order-only dependency: version.h must exist before compilation, but changes don't trigger rebuild -$(BUILD_DIR)/%.o: src/%.c | include/version.h - @mkdir -p $(dir $@) - @echo " CC $<" - @$(CC) $(CFLAGS) -c $< -o $@ -ifdef ASM - @$(CC) $(CFLAGS) -S $(ASM_SYNTAX) $< -o $(patsubst %.o,%.s,$@) -endif - -# Files that include version.h - rebuild when timestamp changes -$(BUILD_DIR)/main.o: include/version.h -$(BUILD_DIR)/cli.o: include/version.h -$(BUILD_DIR)/word_source/starforth_words.o: include/version.h - -# ============================================================================== -# TESTING & BENCHMARKING -# ============================================================================== - -# Quick benchmark -bench: $(BINARY) - @echo "" - @echo "🏇 Running quick-draw benchmark..." - @echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" - @echo "Test: 1 million stack operations" - @time -f "Time: %E seconds" ./$(BINARY) -c ": BENCH 1000000 0 DO 1 2 + DROP LOOP ; BENCH BYE" 2>/dev/null || echo "Benchmark complete" - @echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" - -# Full benchmark suite -benchmark: $(BINARY) - @echo "" - @echo "🎯 Full Benchmark Suite - Fastest Forth in the West" - @echo "════════════════════════════════════════════════════════════" - @echo "" - @echo "📊 Stack Operations (1M iterations):" - @time -f " ⏱️ %E seconds" ./$(BINARY) -c ": BENCH-STACK 1000000 0 DO 1 2 3 DROP DROP DROP LOOP ; BENCH-STACK BYE" 2>/dev/null || true - @echo "" - @echo "📊 Arithmetic Operations (1M iterations):" - @time -f " ⏱️ %E seconds" ./$(BINARY) -c ": BENCH-MATH 1000000 0 DO 10 20 + 5 * 100 / DROP LOOP ; BENCH-MATH BYE" 2>/dev/null || true - @echo "" - @echo "📊 Logic Operations (1M iterations):" - @time -f " ⏱️ %E seconds" ./$(BINARY) -c ": BENCH-LOGIC 1000000 0 DO 255 DUP AND DUP OR XOR DROP LOOP ; BENCH-LOGIC BYE" 2>/dev/null || true - @echo "" - @echo "════════════════════════════════════════════════════════════" - -# ============================================================================== -# ASSEMBLY OUTPUT & ANALYSIS -# ============================================================================== - -# Generate assembly files for inspection -asm: banner - @echo "📝 Generating assembly output..." - @echo " Cleaning to force rebuild..." - @$(MAKE) clean-obj > /dev/null 2>&1 - $(MAKE) ASM=1 CFLAGS="$(BASE_CFLAGS) $(ARCH_FLAGS) $(ARCH_DEFINES) -O3 -DUSE_ASM_OPT=1 -DUSE_DIRECT_THREADING=1" LDFLAGS="" $(BINARY) - @echo "✓ Assembly files generated in $(BUILD_DIR)/" - @echo " Files generated: $$(find $(BUILD_DIR) -name '*.s' | wc -l)" - @echo " Example: less $(BUILD_DIR)/stack_management.s" - -# Generate Software Bill of Materials (SBOM) in SPDX format -sbom: - @echo "📋 Generating SBOM (Software Bill of Materials)..." - @if ! which syft >/dev/null 2>&1; then \ - echo "Error: syft not found. Install from https://github.com/anchore/syft"; \ - exit 1; \ - fi - @syft dir:. -o spdx-json=sbom.spdx.json -o spdx=sbom.spdx \ - --source-name LithosAnanke \ - --source-version $(VERSION) \ - --exclude './build/**' --exclude './tools/**' --exclude './.git/**' - @echo "✅ SBOM generated:" - @echo " SPDX JSON: sbom.spdx.json" - @echo " SPDX: sbom.spdx" - @echo " Version: $(VERSION)" - -# ============================================================================== -# DOCUMENTATION -# ============================================================================== - -# Generate API documentation (Doxygen XML → AsciiDoc) -api-docs: - @echo "📚 Generating API documentation from Doxygen..." - @if [ ! -f scripts/generate-doxygen-appendix.sh ]; then \ - echo "Error: scripts/generate-doxygen-appendix.sh not found"; \ - exit 1; \ - fi - @./scripts/generate-doxygen-appendix.sh - @echo "✅ API documentation generated: docs/src/appendix/" - -# ---------------------------------------------------------------------------- -# Math companion to the SSRN paper. -# Builds docs/SSRN_companion/Math_Companion_SSRN.pdf from the LaTeX source. -# Requires: pdflatex (texlive-latex-base, texlive-latex-extra, texlive-science). -# ---------------------------------------------------------------------------- -math-companion: - @echo "Building SSRN math companion (docs/SSRN_companion/Math_Companion_SSRN.pdf)..." - @if ! command -v pdflatex >/dev/null 2>&1; then \ - echo "Error: pdflatex not found."; \ - echo " Install with: apt-get install texlive-latex-base texlive-latex-extra texlive-science"; \ - exit 1; \ - fi - @cd docs/SSRN_companion && \ - pdflatex -interaction=nonstopmode -halt-on-error Math_Companion_SSRN.tex >/dev/null && \ - pdflatex -interaction=nonstopmode -halt-on-error Math_Companion_SSRN.tex >/dev/null && \ - pdflatex -interaction=nonstopmode -halt-on-error Math_Companion_SSRN.tex >/dev/null - @echo "Built: docs/SSRN_companion/Math_Companion_SSRN.pdf" - @cd docs/SSRN_companion && ls -lh Math_Companion_SSRN.pdf | awk '{print " Size:", $$5, " Pages: see pdfinfo"}' - -math-companion-clean: - @rm -f docs/SSRN_companion/Math_Companion_SSRN.{aux,log,out,toc,lof,lot,nav,snm,vrb} - @rm -f docs/SSRN_companion/Math_Companion_SSRN.pdf - @echo "Cleaned math companion build artifacts." - -# Convert all AsciiDoc to LaTeX -docs-latex: - @echo "📄 Converting AsciiDoc to LaTeX..." - @if [ ! -f scripts/asciidoc-to-latex.sh ]; then \ - echo "Error: scripts/asciidoc-to-latex.sh not found"; \ - exit 1; \ - fi - @./scripts/asciidoc-to-latex.sh - @echo "✅ LaTeX files generated: docs/latex/" - -# Build and verify Isabelle theories -isabelle-build: - @echo "🔬 Building Isabelle formal verification theories..." - @if ! command -v $(ISABELLE) >/dev/null 2>&1; then \ - echo "Error: Isabelle not found: $(ISABELLE)"; \ - echo " Install Isabelle or set ISABELLE variable"; \ - exit 1; \ - fi - @echo " Using: $$(command -v $(ISABELLE))" - @echo " Building StarForth_Formal session (VM + Physics)..." - @cd docs/src/internal/formal && $(ISABELLE) build -v -d . StarForth_Formal - @echo "✅ Isabelle theories verified successfully" - -# Quick check of Isabelle theories (faster than full build) -isabelle-check: - @echo "🔬 Quick-checking Isabelle theories..." - @if ! command -v $(ISABELLE) >/dev/null 2>&1; then \ - echo "Error: Isabelle not found: $(ISABELLE)"; \ - exit 1; \ - fi - @cd docs/src/internal/formal && \ - for thy in *.thy; do \ - echo " Checking $$thy..."; \ - $(ISABELLE) process -T "$$thy" 2>&1 | head -5; \ - done - @echo "✅ Quick check complete" - -# Generate comprehensive Isabelle documentation (for auditing & CI/CD) -# This generates documentation and verification reports regardless of proof status -# Suitable for Jenkinsfile pipelines - shows complete state including errors -docs-isabelle: - @echo "📚 Generating comprehensive Isabelle documentation (audit mode)..." - @mkdir -p docs/src/isabelle - @echo "" - @echo "Step 1: Attempting to verify Isabelle theories..." - @echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" - @cd docs/src/internal/formal && \ - if $(ISABELLE) build -v -d . StarForth_Formal > "$(CURDIR)/docs/src/isabelle/build.log" 2>&1; then \ - echo "✅ All theories verified successfully"; \ - else \ - echo "⚠️ Some theories have incomplete proofs (see build.log for details)"; \ - fi - @echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" - @echo "" - @echo "Step 2: Generating documentation from theory source..." - @if [ ! -f scripts/isabelle-to-adoc.sh ]; then \ - echo "⚠️ Warning: scripts/isabelle-to-adoc.sh not found"; \ - echo " Creating default script..."; \ - mkdir -p scripts; \ - echo '#!/bin/bash' > scripts/isabelle-to-adoc.sh; \ - echo 'echo "Generating Isabelle theory reports to AsciiDoc..."' >> scripts/isabelle-to-adoc.sh; \ - echo 'cd docs/src/internal/formal' >> scripts/isabelle-to-adoc.sh; \ - echo 'for thy in *.thy; do' >> scripts/isabelle-to-adoc.sh; \ - echo ' base=$$(basename "$$thy" .thy)' >> scripts/isabelle-to-adoc.sh; \ - echo ' echo "= $$base Theory" > "../../../isabelle/$$base.adoc"' >> scripts/isabelle-to-adoc.sh; \ - echo ' echo "" >> "../../../isabelle/$$base.adoc"' >> scripts/isabelle-to-adoc.sh; \ - echo ' echo "Formal verification theory for StarForth VM." >> "../../../isabelle/$$base.adoc"' >> scripts/isabelle-to-adoc.sh; \ - echo ' echo "" >> "../../../isabelle/$$base.adoc"' >> scripts/isabelle-to-adoc.sh; \ - echo ' echo "== Theory Source" >> "../../../isabelle/$$base.adoc"' >> scripts/isabelle-to-adoc.sh; \ - echo ' echo "" >> "../../../isabelle/$$base.adoc"' >> scripts/isabelle-to-adoc.sh; \ - echo ' echo "[source,isabelle]" >> "../../../isabelle/$$base.adoc"' >> scripts/isabelle-to-adoc.sh; \ - echo ' echo "----" >> "../../../isabelle/$$base.adoc"' >> scripts/isabelle-to-adoc.sh; \ - echo ' cat "$$thy" >> "../../../isabelle/$$base.adoc"' >> scripts/isabelle-to-adoc.sh; \ - echo ' echo "----" >> "../../../isabelle/$$base.adoc"' >> scripts/isabelle-to-adoc.sh; \ - echo 'done' >> scripts/isabelle-to-adoc.sh; \ - chmod +x scripts/isabelle-to-adoc.sh; \ - fi - @bash scripts/isabelle-to-adoc.sh - @echo "" - @echo "Step 3: Creating audit summary..." - @echo "✅ Comprehensive Isabelle documentation generated: docs/src/isabelle/" - @echo "" - @echo "📂 Documentation includes:" - @echo " • index.adoc - Master index of all theories" - @echo " • VERIFICATION_REPORT.adoc - Audit report" - @echo " • .adoc - Individual theory documentation with source" - @echo " • build.log - Isabelle build output (verification status)" - -# ============================================================================== -# REFINEMENT VERIFICATION (C ⊑ Isabelle) -# ============================================================================== - -# Refinement status dashboard -refinement-status: - @echo "════════════════════════════════════════════════════════════" - @echo " StarForth C ⊑ Isabelle Refinement Status" - @echo "════════════════════════════════════════════════════════════" - @echo "" - @if [ ! -f docs/REFINEMENT_CAPA.adoc ]; then \ - echo "⚠️ No REFINEMENT_CAPA.adoc found. Initialize with: make refinement-init"; \ - echo ""; \ - echo "Refinement infrastructure status: UNINITIALIZED"; \ - else \ - echo "📋 Defect Summary:"; \ - echo ""; \ - echo -n " Total Defects: "; grep -c "^== DEFECT-" docs/REFINEMENT_CAPA.adoc || echo "0"; \ - echo -n " OPEN: "; grep "| OPEN" docs/REFINEMENT_CAPA.adoc | wc -l; \ - echo -n " IN-PROGRESS: "; grep "| IN-PROGRESS" docs/REFINEMENT_CAPA.adoc | wc -l; \ - echo -n " CLOSED: "; grep "| CLOSED" docs/REFINEMENT_CAPA.adoc | wc -l; \ - fi - @echo "" - @echo "🏆 Phase Status:" - @echo " Phase 1: vm.c core .............. NOT STARTED" - @echo " Phase 2: Root utilities ......... NOT STARTED" - @echo " Phase 3: Test harness .......... NOT STARTED" - @echo " Phase 4: Primitive dictionary .. NOT STARTED" - @echo " Phase 5: VM expansion .......... NOT STARTED" - @echo "" - @echo "📂 Documentation:" - @echo " • docs/REFINEMENT_CAPA.adoc - Defect tracking" - @echo " • docs/REFINEMENT_ANNOTATIONS.adoc - Code annotation guide" - @echo "" - @echo "Next steps: make refinement-phase1 (to start Phase 1 proofs)" - @echo "════════════════════════════════════════════════════════════" - -# Initialize refinement tracking -refinement-init: - @echo "Initializing refinement tracking..." - @if [ -f docs/REFINEMENT_CAPA.adoc ]; then \ - echo "✅ docs/REFINEMENT_CAPA.adoc already exists"; \ - else \ - echo "📋 Creating REFINEMENT_CAPA.adoc"; \ - fi - @if [ -f docs/REFINEMENT_ANNOTATIONS.adoc ]; then \ - echo "✅ docs/REFINEMENT_ANNOTATIONS.adoc already exists"; \ - else \ - echo "📋 Creating REFINEMENT_ANNOTATIONS.adoc"; \ - fi - @echo "✅ Refinement infrastructure ready" - @echo "" - @echo "Next: Review docs/REFINEMENT_ANNOTATIONS.adoc" - @echo " Then: make refinement-phase1" - -# Phase 1: VM Core refinement -refinement-phase1: - @echo "════════════════════════════════════════════════════════════" - @echo " ⚙️ PHASE 1: VM Core Refinement (C ⊑ Isabelle)" - @echo "════════════════════════════════════════════════════════════" - @echo "" - @echo "Building refinement proofs for:" - @echo " • stack_push / stack_pop (DEFECT-001, DEFECT-002)" - @echo " • execute_call / execute_return (DEFECT-002)" - @echo " • instruction_dispatch (DEFECT-003)" - @echo "" - @echo "Proof target: StarForth_Refinement (Isabelle theory)" - @if ! command -v $(ISABELLE) >/dev/null 2>&1; then \ - echo "Error: Isabelle not found. Install or set ISABELLE variable"; \ - exit 1; \ - fi - @echo "" - @echo "Step 1: Creating StarForth_Refinement.thy if needed..." - @if [ ! -f docs/src/internal/formal/StarForth_Refinement.thy ]; then \ - echo "Creating template..."; \ - mkdir -p docs/src/internal/formal; \ - touch docs/src/internal/formal/StarForth_Refinement.thy; \ - echo "TODO: Add refinement proofs here" > docs/src/internal/formal/StarForth_Refinement.thy; \ - fi - @echo "" - @echo "Step 2: Attempting to build refinement proofs..." - @echo "(This will fail until proofs are written)" - @cd docs/src/internal/formal && \ - $(ISABELLE) build -v -d . StarForth_Formal 2>&1 | tail -20 - @echo "" - @echo "📋 Next steps:" - @echo " 1. Review open defects: grep 'OPEN' docs/REFINEMENT_CAPA.adoc" - @echo " 2. Start working on DEFECT-001 (stack_push)" - @echo " 3. Add refinement proofs to StarForth_Refinement.thy" - @echo " 4. Run: make verify-defect DEFECT=001" - -# Verify specific defect resolution -verify-defect: - @if [ -z "$(DEFECT)" ]; then \ - echo "Usage: make verify-defect DEFECT=001"; \ - echo ""; \ - echo "Available defects:"; \ - grep "== DEFECT-" docs/REFINEMENT_CAPA.adoc | sed 's/== / /'; \ - exit 1; \ - fi - @echo "════════════════════════════════════════════════════════════" - @echo " 🔍 Verifying Resolution: $(DEFECT)" - @echo "════════════════════════════════════════════════════════════" - @echo "" - @if ! grep -q "== DEFECT-$(DEFECT):" docs/REFINEMENT_CAPA.adoc; then \ - echo "❌ DEFECT-$(DEFECT) not found in REFINEMENT_CAPA.adoc"; \ - exit 1; \ - fi - @echo "Defect Details:" - @grep -A 30 "== DEFECT-$(DEFECT):" docs/REFINEMENT_CAPA.adoc | head -35 - @echo "" - @echo "Next: Implement corrective action, then run this again" - -# Check code annotation coverage -refinement-annotate-check: - @echo "════════════════════════════════════════════════════════════" - @echo " 📝 Checking Code Annotation Coverage" - @echo "════════════════════════════════════════════════════════════" - @echo "" - @echo "Phase 1 target functions:" - @echo "" - @for func in stack_push stack_pop execute_instruction execute_call execute_return; do \ - if grep -q "REFINEMENT.*$$func\|void $$func" src/vm.c; then \ - if grep -q "REFINEMENT:" src/vm.c | grep -q "$$func"; then \ - echo " ✅ $$func - ANNOTATED"; \ - else \ - echo " ❌ $$func - MISSING ANNOTATION"; \ - fi; \ - else \ - echo " ⚠️ $$func - NOT FOUND"; \ - fi; \ +.PHONY: all boot_image boot_images docs clean clean-docs kernel boards help help-hosted + +# ------------------------------------------------------------------------------ +# all +# ------------------------------------------------------------------------------ +ifeq ($(TARGET),) +all: + @for b in $(READY_BOARDS); do \ + $(SUBMAKE) boot_image TARGET=$$b || exit 1; \ done + @$(SUBMAKE) -f v3/Makefile all + @$(SUBMAKE) docs @echo "" - @echo "Guide: docs/REFINEMENT_ANNOTATIONS.adoc" + @echo "Built:" + @for b in $(READY_BOARDS); do \ + d=$$(echo $$b | tr A-Z a-z); ls build/boards/$$d/*.img | sed 's/^/ /'; \ + done + @echo " build/docs/LithosAnanke.pdf" + @$(foreach b,$(UNREADY_BOARDS),echo "Skipped $(b): needs kernel/src/arch/$(call board_arch,$(b)), which does not exist yet";) +else ifneq ($(BOARD_DIR),) +all: + @$(SUBMAKE) boot_image TARGET=$(TARGET) + @$(SUBMAKE) docs TARGET=$(TARGET) +else +all: + @$(SUBMAKE) -f v3/Makefile all TARGET=$(TARGET) +endif -# Generate refinement report -refinement-report: - @echo "🔄 Generating refinement status report..." - @mkdir -p docs/reports - @echo "# StarForth Refinement Status" > docs/reports/refinement-status.md - @echo "" >> docs/reports/refinement-status.md - @echo "Generated: $$(date)" >> docs/reports/refinement-status.md - @echo "" >> docs/reports/refinement-status.md - @echo "## Summary" >> docs/reports/refinement-status.md - @echo "" >> docs/reports/refinement-status.md - @grep -c "== DEFECT-" docs/REFINEMENT_CAPA.adoc | xargs -I {} echo "Total Defects: {}" >> docs/reports/refinement-status.md - @echo "" >> docs/reports/refinement-status.md - @echo "See docs/REFINEMENT_CAPA.adoc for details" >> docs/reports/refinement-status.md - @echo "✅ Report: docs/reports/refinement-status.md" - -# Generate GNU info documentation -docs/starforth.info: - @if [ ! -f docs/starforth.texi ]; then \ - echo "⚠️ Skipping info docs: docs/starforth.texi not present"; \ - touch docs/starforth.info; \ - else \ - echo "📖 Building GNU info documentation..."; \ - if ! command -v makeinfo >/dev/null 2>&1; then \ - echo "Warning: makeinfo not found. Install with: sudo apt-get install texinfo"; \ - touch docs/starforth.info; \ - else \ - makeinfo docs/starforth.texi -o docs/starforth.info && \ - echo "✅ Info documentation: docs/starforth.info"; \ - fi; \ +# ------------------------------------------------------------------------------ +# boot images +# ------------------------------------------------------------------------------ +boot_image: + @if [ -z "$(BOARD_DIR)" ]; then \ + echo "Usage: make boot_image TARGET=<$(subst $(space),|,$(BOARDS))>"; \ + [ -z "$(TARGET)" ] || echo "Unknown board TARGET='$(TARGET)'"; \ + exit 1; \ fi + @if [ -z "$(call board_ready,$(TARGET))" ]; then \ + echo "Error: $(TARGET) needs the $(call board_arch,$(TARGET)) kernel port (kernel/src/arch/$(call board_arch,$(TARGET))), which does not exist yet."; \ + echo " $(call board_field,$(TARGET),BOARD_DESC)"; \ + exit 1; \ + fi + @$(SUBMAKE) -f kernel/Makefile \ + BOARD=$(BOARD_DIR) ARCH=$(call board_arch,$(TARGET)) TARGET=kernel boot_image -# Generate all documentation -docs: api-docs docs-isabelle - @echo "✅ All documentation generated!" - @echo "" - @echo "📂 Documentation locations:" - @echo " • API docs: docs/src/appendix/" - @echo " • Isabelle docs: docs/src/isabelle/" - @echo " • LaTeX: docs/latex/" +boot_images: + @for b in $(READY_BOARDS); do \ + $(SUBMAKE) boot_image TARGET=$$b || exit 1; \ + done + @$(foreach b,$(UNREADY_BOARDS),echo "Skipped $(b): needs kernel/src/arch/$(call board_arch,$(b)), which does not exist yet";) + +# ------------------------------------------------------------------------------ +# docs +# ------------------------------------------------------------------------------ +docs: + @if [ -n "$(TARGET)" ] && [ -z "$(BOARD_DIR)" ]; then \ + echo "Error: make docs takes TARGET=<$(subst $(space),|,$(BOARDS))> or no TARGET; '$(TARGET)' is not a board."; \ + exit 1; \ + fi + @$(SUBMAKE) -f docs/book/Makefile BOARD=$(BOARD_DIR) BOARD_NAME=$(TARGET) -# Clean generated documentation clean-docs: - @echo "🗑️ Cleaning generated documentation..." - @rm -rf docs/src/appendix/ docs/latex/ docs/src/isabelle/ - @echo "✅ Documentation cleaned" - -# ============================================================================== -# INSTALLATION -# ============================================================================== - -install: $(BINARY) - @echo "📦 Installing StarForth to $(PREFIX)..." - @install -d $(BINDIR) - @install -m 755 $(BINARY) $(BINDIR)/starforth - @echo " ✓ Binary installed: $(BINDIR)/starforth" - @if [ -f capsules/init.4th ]; then \ - install -d $(CONFDIR); \ - install -m 644 capsules/init.4th $(CONFDIR)/init.4th; \ - echo " ✓ Config installed: $(CONFDIR)/init.4th"; \ - fi - @if [ -f man/starforth.1 ]; then \ - install -d $(MANDIR); \ - install -m 644 man/starforth.1 $(MANDIR)/starforth.1; \ - echo " ✓ Man page installed: $(MANDIR)/starforth.1"; \ - fi - @if [ -f docs/starforth.info ]; then \ - install -d $(INFODIR); \ - install -m 644 docs/starforth.info $(INFODIR)/starforth.info; \ - install-info --info-dir=$(INFODIR) $(INFODIR)/starforth.info 2>/dev/null || true; \ - echo " ✓ Info docs installed: $(INFODIR)/starforth.info"; \ - fi - @install -d $(DOCDIR) - @if [ -f README.md ]; then install -m 644 README.md $(DOCDIR)/; fi - @if [ -f QUICKSTART.md ]; then install -m 644 QUICKSTART.md $(DOCDIR)/; fi - @if ls docs/*.md >/dev/null 2>&1; then install -m 644 docs/*.md $(DOCDIR)/ 2>/dev/null || true; fi - @echo " ✓ Documentation installed: $(DOCDIR)/" - @echo "✅ Installation complete!" - -uninstall: - @echo "🗑️ Uninstalling StarForth from $(PREFIX)..." - @rm -f $(BINDIR)/starforth - @rm -f $(MANDIR)/starforth.1 - @install-info --delete --info-dir=$(INFODIR) $(INFODIR)/starforth.info 2>/dev/null || true - @rm -f $(INFODIR)/starforth.info - @rm -rf $(DOCDIR) - @rm -rf $(CONFDIR) - @echo "✅ Uninstall complete!" - -# ============================================================================== -# PACKAGING -# ============================================================================== - -# Build Debian package -deb: $(BINARY) - @echo "📦 Building Debian package..." - @if ! command -v fpm >/dev/null 2>&1; then \ - echo "Error: fpm not found. Install with: gem install fpm"; \ - echo " or: sudo apt-get install ruby-dev && gem install fpm"; \ - exit 1; \ - fi - @mkdir -p package/deb - @fpm -s dir -t deb \ - -n starforth \ - -v $(VERSION) \ - -a native \ - --description "StarForth - The Fastest Forth in the West" \ - --url "https://github.com/yourusername/starforth" \ - --maintainer "StarForth Team" \ - --license "MIT" \ - --category "devel" \ - --package package/deb/ \ - --deb-compression xz \ - $(BINARY)=/usr/bin/starforth \ - capsules/init.4th=/etc/starforth/init.4th \ - README.md=/usr/share/doc/starforth/README.md - @echo "✅ Debian package created: package/deb/starforth_$(VERSION)_*.deb" - -# Build RPM package -rpm: $(BINARY) - @echo "📦 Building RPM package..." - @if ! command -v fpm >/dev/null 2>&1; then \ - echo "Error: fpm not found. Install with: gem install fpm"; \ - exit 1; \ - fi - @mkdir -p package/rpm - @fpm -s dir -t rpm \ - -n starforth \ - -v $(VERSION) \ - -a native \ - --description "StarForth - The Fastest Forth in the West" \ - --url "https://github.com/yourusername/starforth" \ - --maintainer "StarForth Team" \ - --license "MIT" \ - --category "Development/Languages" \ - --package package/rpm/ \ - $(BINARY)=/usr/bin/starforth \ - capsules/init.4th=/etc/starforth/init.4th \ - README.md=/usr/share/doc/starforth/README.md - @echo "✅ RPM package created: package/rpm/starforth-$(VERSION)-*.rpm" - -# Build all packages -package: deb rpm - @echo "" - @echo "✅ All packages built successfully!" - @echo " Debian: package/deb/" - @echo " RPM: package/rpm/" - -# ============================================================================== -# VERSIONING & BUILD MANIFEST (Workflow/Governance Integration) -# ============================================================================== - -# Parse version from include/version.h -GET_VERSION = $(shell grep "define STARFORTH_VERSION" include/version.h | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+' | head -1) - -.PHONY: version-info -version-info: - @echo "Current Version: $(GET_VERSION)" - @grep "STARFORTH_VERSION" include/version.h | grep define - -.PHONY: build-manifest -build-manifest: $(BINARY) - @echo "📋 Generating BUILD_MANIFEST.json..." - @mkdir -p builds/manifest - @VERSION=$$(grep "STARFORTH_VERSION_STRING" include/version.h | grep -o '"[^"]*"' | tr -d '"'); \ - GIT_HASH=$$(git rev-parse --short HEAD 2>/dev/null || echo "0000000"); \ - GIT_BRANCH=$$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "unknown"); \ - BUILD_TIME=$$(date -Iseconds); \ - BINARY_PATH="$(BINARY)"; \ - if [ -f "$$BINARY_PATH" ]; then \ - BINARY_SHA256=$$(sha256sum "$$BINARY_PATH" | awk '{print $$1}'); \ - else \ - BINARY_SHA256="not-built"; \ - fi; \ - cat > builds/manifest/BUILD_MANIFEST.json << EOF; \ -{ \ - "version": "$$VERSION", \ - "timestamp": "$$BUILD_TIME", \ - "git": { \ - "commit_hash": "$$GIT_HASH", \ - "branch": "$$GIT_BRANCH", \ - "tag": "v$$VERSION" \ - }, \ - "build": { \ - "timestamp": "$$BUILD_TIME", \ - "compiler": "$$(gcc --version | head -1)", \ - "compiler_flags": "$(CFLAGS) $(ARCH_FLAGS)", \ - "target_architecture": "$(ARCH_NAME)", \ - "use_asm_opt": $(USE_ASM_OPT), \ - "use_lto": $(USE_LTO) \ - }, \ - "testing": { \ - "total_tests": 936, \ - "passed_tests": 0, \ - "failed_tests": 0, \ - "code_coverage_percent": 0, \ - "smoke_test_result": "N/A" \ - }, \ - "binary": { \ - "path": "$$BINARY_PATH", \ - "sha256": "$$BINARY_SHA256" \ - }, \ - "signatures": { \ - "builder": "jenkins-agent", \ - "approval_timestamp": "$(shell date -Iseconds)" \ - } \ -} \ -EOF - @echo "✓ BUILD_MANIFEST created: builds/manifest/BUILD_MANIFEST.json" - @cat builds/manifest/BUILD_MANIFEST.json | head -20 - -# ============================================================================== -# CLEANUP -# ============================================================================== + rm -rf build/docs +# ------------------------------------------------------------------------------ +# clean +# ------------------------------------------------------------------------------ +ifeq ($(TARGET),) clean: - @echo "🧹 Cleaning build artifacts..." - @rm -rfv build/* - @rm -f src/*.gcda src/word_source/*.gcda src/*.gcno src/word_source/*.gcno - @echo "✓ Clean complete" + @if [ -d build ]; then find build -mindepth 1 -maxdepth 1 ! -name cache -exec rm -rf {} +; fi + rm -f v3/include/version.h + rm -f v3/src/*.gcda v3/src/*.gcno v3/src/word_source/*.gcda v3/src/word_source/*.gcno + @echo "Cleaned build/ (kept build/cache/)" +else ifneq ($(BOARD_DIR),) +clean: + rm -rf build/boards/$(BOARD_DIR) build/$(call board_arch,$(TARGET))/kernel build/docs/$(BOARD_DIR) \ + build/docs/LithosAnanke-$(BOARD_DIR).pdf +else +clean: + rm -rf build/*/$(TARGET) +endif -clean-obj: - @echo "🧹 Cleaning object files..." - @find build -name "*.o" -type f -delete 2>/dev/null || true - @echo "✓ Object files cleaned" +# ------------------------------------------------------------------------------ +# misc +# ------------------------------------------------------------------------------ +GOAL ?= all +kernel: + @$(SUBMAKE) -f kernel/Makefile TARGET=kernel $(GOAL) -# ============================================================================== -# HELP -# ============================================================================== +boards: + @$(foreach b,$(BOARDS),printf ' %-9s %-8s %s\n' "$(b)" \ + "$(if $(call board_ready,$(b)),ready,no port)" "$(call board_field,$(b),BOARD_DESC)";) help: - @echo "════════════════════════════════════════════════════════════" - @echo " ⚡ StarForth Build System - Fastest in the West! ⚡" - @echo "════════════════════════════════════════════════════════════" - @echo "" - @echo "🛠️ Variables:" - @echo " ARCH= (default: $(ARCH); canonical directory: $(ARCH_DIR))" - @echo " TARGET= (standard | fast | fastest | turbo)" - @echo "" - @echo "🏆 OPTIMIZATION BUILDS:" - @echo " fastest - Maximum performance (ASM + direct threading + LTO)" - @echo " fast - Fast without LTO (easier debugging)" - @echo " turbo - Assembly optimizations only" - @echo "" - @echo "🥧 PLATFORM-SPECIFIC BUILDS:" - @echo " rpi4 - Native build on Raspberry Pi 4" - @echo " rpi4-cross - Cross-compile from x86_64" - @echo " rpi4-fastest - Maximum optimization for RPi4" - @echo " riscv64-clang - Cross-compile for RISC-V 64 via clang (GCC fails here)" - @echo " minimal - Minimal/embedded build" - @echo "" - @echo "🔧 DEBUG & DEVELOPMENT:" - @echo " all - Standard optimized build (default)" - @echo " debug - Debug build with symbols (-g -O0)" - @echo " profile - Build with profiling support" - @echo " performance - Legacy performance build (use 'fastest')" - @echo "" - @echo "🧪 TESTING & BENCHMARKING:" - @echo " test - Run full test suite" - @echo " bench - Quick benchmark" - @echo " benchmark - Full benchmark suite" - @echo "" - @echo "📝 ANALYSIS & DOCUMENTATION:" - @echo " asm - Generate assembly output" - @echo " sbom - Generate SBOM (Software Bill of Materials, SPDX)" - @echo " docs - Generate all documentation" - @echo " api-docs - Generate API docs (Doxygen → AsciiDoc)" - @echo " docs-latex - Convert AsciiDoc to LaTeX" - @echo " docs-isabelle - Generate Isabelle documentation for auditing (includes build log)" - @echo " isabelle-build - Build and verify Isabelle formal theories (strict verification)" - @echo " isabelle-check - Quick-check Isabelle theories" - @echo " info - Build GNU info documentation" - @echo "" - @echo "🔬 REFINEMENT VERIFICATION (C ⊑ Isabelle):" - @echo " refinement-init - Initialize refinement tracking (CAPA + annotations)" - @echo " refinement-status - Show refinement defect summary and phase status" - @echo " refinement-phase1 - Build Phase 1 refinement proofs (vm.c core)" - @echo " verify-defect - Verify specific defect (Usage: make verify-defect DEFECT=001)" - @echo " refinement-annotate-check - Check code annotation coverage" - @echo " refinement-report - Generate refinement status report" - @echo "" - @echo "📦 INSTALLATION & PACKAGING:" - @echo " install - Install to PREFIX (default: .)" - @echo " uninstall - Uninstall from PREFIX" - @echo " deb - Build Debian package" - @echo " rpm - Build RPM package" - @echo " package - Build all packages" - @echo "" - @echo "🧹 CLEANUP:" - @echo " clean - Remove all build artifacts" - @echo " clean-obj - Remove object files only" - @echo " clean-docs - Remove generated documentation" - @echo "" - @echo "⚙️ CONFIGURATION VARIABLES:" - @echo " CC - Compiler (default: gcc)" - @echo " CFLAGS - Compiler flags (override defaults)" - @echo " LDFLAGS - Linker flags (override defaults)" - @echo " PREFIX - Install prefix (default: .)" - @echo " MINIMAL=1 - Minimal build mode (DISABLED -- incomplete, errors out)" - @echo " ASM=1 - Generate assembly files during build" - @echo "" - @echo "📋 EXAMPLES:" - @echo " make fastest # Fastest build for current platform" - @echo " make rpi4-cross # Cross-compile for Raspberry Pi 4" - @echo " make riscv64-clang # Cross-compile for RISC-V 64 (clang)" - @echo " make asm # Generate assembly for inspection" - @echo " make debug # Debug build" - @echo " make PREFIX=/usr/local install # Install system-wide" - @echo "" - @echo "🌟 CURRENT PLATFORM: $(ARCH_NAME)" - @echo "════════════════════════════════════════════════════════════" + @sed -n '/^# TARGET is/,/^# =====/p' Makefile | sed '$$d; s/^# \{0,1\}//' -quality: compile_commands clang_tidy cppcheck gcc_analyzer +help-hosted: + @$(SUBMAKE) -f v3/Makefile help -compile_commands: - bear --output build/compile_commands.json -- make -j$(nproc) - -clang_tidy: - clang-tidy -p build $(shell find src -name '*.c' -o -name '*.h') | tee build/clang-tidy.txt - -cppcheck: - cppcheck --enable=all --inconclusive --std=c99 src 2> build/cppcheck.txt || true - -gcc_analyzer: - $(MAKE) clean - CFLAGS="$(CFLAGS) -fanalyzer -Wall -Wextra" $(MAKE) all 2>&1 | tee build/gcc-analyzer.txt +# Everything else is the hosted v3 build, unchanged. (The empty Makefile +# rule stops the match-anything rule from trying to remake this file.) +Makefile: ; +%: + @$(SUBMAKE) -f v3/Makefile $@ diff --git a/README.md b/README.md index f3d8355e..6fa97f8c 100644 --- a/README.md +++ b/README.md @@ -48,19 +48,39 @@ POST at boot: **parity hash verified across amd64/aarch64/riscv64 · Mama capsul ## Quick Start ```bash +# One boot image per physical target (output: build/boards//) +make boot_image TARGET=SER5 # Beelink SER5 -- GPT/ESP, BOOTX64.EFI +make boot_image TARGET=RASPI # Raspberry Pi 5 -- FAT, config.txt + kernel_2712.img + DTB +make boot_image TARGET=MILKV # Milk-V Mars -- GPT/ESP, BOOTRISCV64.EFI (U-Boot bootefi) +make boot_image TARGET=ZYNQ7020 # Zynq-7020 -- ARMv7 port in progress +make boards # list boards + +# The same TARGET drives all, docs and clean (make help) +make # every board with a kernel port + hosted v3 + the book +make TARGET=RASPI # one board's image + build/docs/LithosAnanke-raspi.pdf +make docs # build/docs/LithosAnanke.pdf (LaTeX master: docs/book/main.tex) +make clean TARGET=RASPI # that board's outputs and build/aarch64/kernel +make clean # all of build/ except build/cache/ + # Build kernel (requires cross-compilation toolchain, or native gcc) -make -f Makefile.starkernel ARCH=amd64 +make -f kernel/Makefile ARCH=amd64 # Run in QEMU with OVMF -make -f Makefile.starkernel qemu +make -f kernel/Makefile qemu # Other architectures -make -f Makefile.starkernel ARCH=aarch64 qemu -make -f Makefile.starkernel ARCH=riscv64 qemu +make -f kernel/Makefile ARCH=aarch64 qemu +make -f kernel/Makefile ARCH=riscv64 qemu ``` Artifacts: `build/amd64/kernel/starkernel_loader.efi` · `build/amd64/kernel/starkernel_kernel.elf` +Tree: `kernel/` (LithosAnanke: `Makefile`, `src/`, `include/starkernel/`, `linker/`), +`v3/` (StarForth v3 engine and hosted build: `Makefile`, `src/`, `include/`), +`v4/` (StarForth v4, see `docs/v4.0.0/`), `boards//` (`board.mk` + boot files). +Every makefile runs from the repo root; the root `Makefile` forwards any other goal to +`v3/Makefile` (hosted build). + For the hosted VM by itself (Linux, no cross-compiler needed, no bare-metal tooling): see the separate **StarForth** repository — LithosAnanke used to be a branch inside that repo, now it's its own project with its own `master`. @@ -69,12 +89,12 @@ now it's its own project with its own `master`. Every kernel-only knob (`STARFORTH_ENABLE_VM`, `PARITY_MODE`, the shared physics/heartbeat family, etc.) is an optional Kconfig symbol — a plain -`make -f Makefile.starkernel` uses the same defaults it always has unless +`make -f kernel/Makefile` uses the same defaults it always has unless you opt in: ```bash -make -f Makefile.starkernel ARCH=amd64 menuconfig -make -f Makefile.starkernel ARCH=amd64 kernel_amd64_defconfig +make -f kernel/Makefile ARCH=amd64 menuconfig +make -f kernel/Makefile ARCH=amd64 kernel_amd64_defconfig ``` --- diff --git a/boards/README.md b/boards/README.md new file mode 100644 index 00000000..3816786f --- /dev/null +++ b/boards/README.md @@ -0,0 +1,29 @@ +# boards/ + +One directory per physical target. `make boot_image TARGET=` (repo root) maps the +name to a directory here, reads its `board.mk`, and builds the single file that goes on +that board's boot medium into `build/boards//`. + +| TARGET | Directory | ISA | Boot path | Image | +|---|---|---|---|---| +| `SER5` | `ser5/` | amd64 | UEFI firmware, removable-media path | GPT + FAT32 ESP: `EFI/BOOT/BOOTX64.EFI` | +| `RASPI` | `raspi/` | aarch64 | Pi 5 EEPROM firmware, native | MBR + FAT32: `config.txt`, `kernel_2712.img`, `bcm2712-rpi-5-b.dtb` | +| `MILKV` | `milkv/` | riscv64 | SPI-flash U-Boot + OpenSBI, `bootefi` | GPT + FAT32 ESP: `EFI/BOOT/BOOTRISCV64.EFI` | +| `ZYNQ7020` | `zynq7020/` | armv7 | BootROM, `BOOT.BIN`, U-Boot | not yet: needs `kernel/src/arch/armv7` | + +`board.mk` sets: + +- `BOARD_DESC`: one-line description (`make boards`) +- `BOARD_ARCH`: kernel ISA (`kernel/src/arch/`) +- `BOARD_BOOT`: image recipe in `kernel/Makefile` (`uefi-esp`, `rpi-native`, ...) +- `BOARD_IMAGE`: output file name + +Disk images are assembled by `scripts/mkdiskimage.sh`, which needs no root access and no loop +devices. `KERNEL_ARGS="..."` is written as `starforth.cfg` (UEFI boards) or `cmdline.txt` +(Pi 5, where the firmware copies it into `/chosen/bootargs`). `BOOT_IMAGE_SIZE_MIB` sets the +image size; the default is 128. + +Hardware status: none of these images has been booted on real silicon from this build. The +SER5 image has been booted in QEMU (q35 + OVMF, from its own disk) through POST. The Pi 5 +native path (`raspi/README.md`) and the JH7110 peripherals have still only been checked by +compiling. diff --git a/boards/milkv/README.md b/boards/milkv/README.md new file mode 100644 index 00000000..63a9c99a --- /dev/null +++ b/boards/milkv/README.md @@ -0,0 +1,30 @@ +# Milk-V Mars boot media + +`make boot_image TARGET=MILKV` builds `build/boards/milkv/lithos-milkv.img`: a GPT disk with one +FAT32 EFI System Partition. Write it to an SD card with `dd`. The partition holds: + +- `EFI/BOOT/BOOTRISCV64.EFI`: the riscv64 monolithic loader, the same one QEMU boots. +- `startup.nsh`: for a UEFI shell, if one is used. +- `starforth.cfg`: only present when `KERNEL_ARGS="..."` is given. + +The board's own SPI-flash U-Boot, with OpenSBI underneath, finds the loader through its standard +`bootefi` scan of the removable-media path. U-Boot passes its devicetree to the loader through the +EFI configuration table. + +Status: booted in QEMU through the same chain the board uses: OpenSBI, then U-Boot +`qemu-riscv64_smode`, then `bootefi` from this image's ESP, then the loader and the kernel. POST +passed, Stadium conservation was exact (resident 43691 + reservoir 21845 = 65536 = `Q48_ONE`), and +Hestia and Artemis came up. Not yet booted on the Mars itself. The JH7110 peripherals +(framebuffer, RNG) have only been checked by compiling. + +To repeat the QEMU boot (`qemu-system-riscv64` is in Ubuntu 26.04's `qemu-system-riscv` package; +OpenSBI and U-Boot come from `opensbi` and `u-boot-qemu`). Use a copy, because the kernel writes +to its disk: + +``` +cp build/boards/milkv/lithos-milkv.img /tmp/mv.img +qemu-system-riscv64 -machine virt -cpu rv64 -m 2048 -nographic \ + -bios /usr/lib/riscv64-linux-gnu/opensbi/generic/fw_dynamic.bin \ + -kernel /usr/lib/u-boot/qemu-riscv64_smode/u-boot.bin \ + -drive if=none,format=raw,file=/tmp/mv.img,id=d0 -device virtio-blk-device,drive=d0 +``` diff --git a/boards/milkv/board.mk b/boards/milkv/board.mk new file mode 100644 index 00000000..64ed1490 --- /dev/null +++ b/boards/milkv/board.mk @@ -0,0 +1,11 @@ +# boards/milkv/board.mk -- Milk-V Mars (StarFive JH7110, SiFive U74, RV64GC). +# +# The board's own SPI-flash U-Boot (OpenSBI underneath) runs the EFI +# application through its standard distro/bootefi scan: the SD card is a GPT +# disk with one FAT32 EFI System Partition holding EFI/BOOT/BOOTRISCV64.EFI, +# the same riscv64 monolithic loader QEMU boots. U-Boot passes its own +# devicetree through the EFI configuration table. +BOARD_DESC := Milk-V Mars (StarFive JH7110, RV64GC, U-Boot bootefi) +BOARD_ARCH := riscv64 +BOARD_BOOT := uefi-esp +BOARD_IMAGE := lithos-milkv.img diff --git a/boards/raspi/README.md b/boards/raspi/README.md new file mode 100644 index 00000000..d3e3e2d6 --- /dev/null +++ b/boards/raspi/README.md @@ -0,0 +1,20 @@ +# Raspberry Pi 5 native boot media + +`make boot_image TARGET=RASPI` builds `build/boards/raspi/lithos-raspi.img`: an MBR disk +with one FAT32 (LBA) partition. Write it to an SD card with `dd`. The partition holds: + +- `config.txt`: checked in here (FABRIC-3.md §IV.3 item 6). It pins `kernel_address=0x80000` + because Pi 5 firmware loads `kernel_2712.img` at 0x200000 by default. +- `kernel_2712.img`: the aarch64 kernel objects relinked at 0x80000 by + `kernel/linker/starkernel-native-rpi5.ld`, entered at `rpi5_native_start` + (`kernel/src/arch/aarch64/native_rpi5_entry.S`, which zeroes `.bss` first), and flattened + with `objcopy -O binary`. +- `bcm2712-rpi-5-b.dtb`: the Raspberry Pi firmware's own stock DTB. It is not built by this + project; it is fetched once from the firmware release pinned in `board.mk` + (`RPI_FIRMWARE_TAG`) into `build/cache/`. To use a local copy, pass `RPI5_DTB=/path/to/dtb`. +- `cmdline.txt`: only present when `KERNEL_ARGS="..."` is given. The firmware copies it into + `/chosen/bootargs`, which `rpi5_native_boot()` parses. + +Not yet verified on hardware. The native path still assumes everything `kernel_main()` +needs after a UEFI handoff. The firmware enters at EL2 with the MMU off, which is not what +UEFI hands over, and that difference has not been exercised. diff --git a/boards/raspi/board.mk b/boards/raspi/board.mk new file mode 100644 index 00000000..9555bbf9 --- /dev/null +++ b/boards/raspi/board.mk @@ -0,0 +1,18 @@ +# boards/raspi/board.mk -- Raspberry Pi 5 (BCM2712, Cortex-A76, aarch64). +# +# Native firmware boot, no UEFI (FABRIC-3.md §IV): the Pi 5 bootloader +# lives in EEPROM and reads config.txt, kernel_2712.img and the board DTB +# from the first FAT partition of the SD card. kernel_2712.img is the +# aarch64 kernel relinked at 0x80000 (kernel/linker/starkernel-native-rpi5.ld) +# and flattened to a raw binary. +# +# The DTB is the Raspberry Pi firmware's own stock file, not built here. It +# is fetched once from the pinned firmware release below into build/cache/ +# unless RPI5_DTB points at a local copy. +BOARD_DESC := Raspberry Pi 5 (BCM2712, Cortex-A76, native firmware boot) +BOARD_ARCH := aarch64 +BOARD_BOOT := rpi-native +BOARD_IMAGE := lithos-raspi.img +RPI_FIRMWARE_TAG ?= 1.20260915 +RPI5_DTB_URL ?= https://raw.githubusercontent.com/raspberrypi/firmware/$(RPI_FIRMWARE_TAG)/boot/bcm2712-rpi-5-b.dtb +RPI5_DTB ?= build/cache/raspi-$(RPI_FIRMWARE_TAG)/bcm2712-rpi-5-b.dtb diff --git a/boot_media/rpi5/config.txt b/boards/raspi/config.txt similarity index 91% rename from boot_media/rpi5/config.txt rename to boards/raspi/config.txt index 3f084b85..546b7491 100644 --- a/boot_media/rpi5/config.txt +++ b/boards/raspi/config.txt @@ -12,6 +12,13 @@ # firmware picks up. kernel=kernel_2712.img +# Pin the load address to the one the image is linked at +# (kernel/linker/starkernel-native-rpi5.ld). Pi 5 firmware's own default +# for kernel_2712.img is 0x200000, not the classic 0x80000 -- leaving it +# implicit would load a 0x80000-linked flat image 1.5 MiB away from where +# every absolute address in it points. +kernel_address=0x80000 + # Disable the firmware's Linux-compatible-image sanity check. Without # this, official docs describe it as checking for "a compatible Device # Tree file before attempting to boot" and warn that "older non-compatible diff --git a/boards/ser5/README.md b/boards/ser5/README.md new file mode 100644 index 00000000..af4eee17 --- /dev/null +++ b/boards/ser5/README.md @@ -0,0 +1,14 @@ +# Beelink SER5 boot media + +`make boot_image TARGET=SER5` builds `build/boards/ser5/lithos-ser5.img`: a GPT disk with one +FAT32 EFI System Partition. Write it to a USB stick with `dd`. The partition holds: + +- `EFI/BOOT/BOOTX64.EFI`: the amd64 monolithic loader, with the whole kernel embedded. Firmware + finds it through the UEFI removable-media path, so no boot entry has to be created. +- `startup.nsh`: runs the loader if the firmware drops into the UEFI shell. +- `starforth.cfg`: only present when `KERNEL_ARGS="..."` is given. + +Nothing in the image is SER5-specific. It follows the generic UEFI/ACPI path in FABRIC-3.md §III. + +Status: booted in QEMU (q35 + OVMF, from this image as its own disk) through POST, with Stadium +conservation exact (sum 65536 = `Q48_ONE`). Not yet booted on the SER5 itself. diff --git a/boards/ser5/board.mk b/boards/ser5/board.mk new file mode 100644 index 00000000..33df360f --- /dev/null +++ b/boards/ser5/board.mk @@ -0,0 +1,10 @@ +# boards/ser5/board.mk -- Beelink SER5 (AMD Ryzen, x86-64, UEFI/ACPI). +# +# Generic standards-compliant UEFI path (FABRIC-3.md §III): nothing in the +# image is SER5-specific. The monolithic loader embeds the whole kernel, so +# the image is a GPT disk with one FAT32 EFI System Partition holding +# EFI/BOOT/BOOTX64.EFI. Write it to a USB stick with dd. +BOARD_DESC := Beelink SER5 (AMD Ryzen, x86-64, UEFI) +BOARD_ARCH := amd64 +BOARD_BOOT := uefi-esp +BOARD_IMAGE := lithos-ser5.img diff --git a/boards/zynq7020/README.md b/boards/zynq7020/README.md new file mode 100644 index 00000000..b28cad8d --- /dev/null +++ b/boards/zynq7020/README.md @@ -0,0 +1,17 @@ +# Xilinx Zynq-7020 boot media + +The Zynq-7020's processing system is a dual Cortex-A9: ARMv7-A, 32-bit. It is the host for the +StarForth v4 mesh (`docs/v4.0.0/JUSTIFICATION.md` §5, §8). + +Boot chain: BootROM, then `BOOT.BIN` (U-Boot SPL with the board's `ps7_init` DDR and clock setup), +then U-Boot, then LithosAnanke. Everything is read from the SD card's FAT partition. + +Status: no image yet. `make boot_image TARGET=ZYNQ7020` stops with an error, because there is no +ARMv7 kernel port (`kernel/src/arch/armv7`: entry code, MMU, GIC, private timer). A trial +compile for Cortex-A9 built 147 of the 151 kernel and engine sources. The four that failed use +`__int128` or have no ARMv7 branch: `kernel/src/crypto/fe25519.c`, +`kernel/src/crypto/scalar25519.c`, `kernel/src/hal/hal.c` and +`v3/src/word_source/mixed_arithmetic_words.c`. + +`BOOT.BIN` depends on the exact board (Zybo Z7-20, PYNQ-Z2, Arty Z7-20, ZedBoard, ...), because +`ps7_init` holds that board's DDR timing. The board has not been chosen yet. diff --git a/boards/zynq7020/board.mk b/boards/zynq7020/board.mk new file mode 100644 index 00000000..9fbd1ab5 --- /dev/null +++ b/boards/zynq7020/board.mk @@ -0,0 +1,11 @@ +# boards/zynq7020/board.mk -- Xilinx Zynq-7020 (dual Cortex-A9, ARMv7-A, 32-bit). +# +# Boot chain: BootROM -> BOOT.BIN (U-Boot SPL with the board's ps7_init DDR/ +# clock setup) -> U-Boot -> LithosAnanke, all from the SD card's FAT +# partition. Needs the ARMv7 kernel port (kernel/src/arch/armv7), which is +# in progress: until it exists, boot_image stops with an explicit error +# rather than producing an image that cannot run. +BOARD_DESC := Xilinx Zynq-7020 (Cortex-A9, ARMv7-A, BOOT.BIN) -- ARMv7 port in progress +BOARD_ARCH := armv7 +BOARD_BOOT := zynq-bootbin +BOARD_IMAGE := lithos-zynq7020.img diff --git a/boot_media/rpi5/README.md b/boot_media/rpi5/README.md deleted file mode 100644 index a1f7cd4e..00000000 --- a/boot_media/rpi5/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# Raspberry Pi 5 native boot media - -What goes on the SD card for the native (non-UEFI) boot path (FABRIC-3.md §IV): - -- `config.txt` — checked in here, done (§IV.3 item 6). -- `bcm2712-rpi-5-b.dtb` — Raspberry Pi firmware's own stock DTB; not built by this - project, copied from the firmware release the card is otherwise built from. -- `kernel_2712.img` — **does not exist yet.** `config.txt` names it, but no build target - in `Makefile.starkernel` currently emits a raw image by this name at load address - 0x80000 — item 1 (entry stub) explicitly scoped a separate-image build target as future - work, not part of that item. Building this file is the remaining prerequisite before - item 7 (assembling the card) is possible. diff --git a/capsules/BLOCK_MAP.md b/capsules/BLOCK_MAP.md index 57fdf053..d2477242 100644 --- a/capsules/BLOCK_MAP.md +++ b/capsules/BLOCK_MAP.md @@ -1,5 +1,5 @@ # Capsule Block Manifest — Auto-generated - + @@ -8,42 +8,44 @@ | Capsule | Blocks claimed | xxHash64 | Signed | |---------|----------------|----------|--------| -| `ACL.4th` | 4000, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4008, 4015 | `0xf8890c05c0d8f921` | yes | -| `acl-std79.4th` | 4023, 4024, 4025, 4026, 4027, 4028, 4029, 4030, 4031, 4032, 4033, 4034, 4035, 4036, 4037, 4038, 4039, 4040, 4041, 4042, 4043, 4044, 4045, 4046, 4047, 4048 | `0x773bf9209df191d1` | yes | -| `artemis:init.4th` | 4110, 4111, 4112, 4113, 4122, 4123, 4124, 4125, 4126, 4127, 4128, 4129, 4130, 4131, 4132, 4133, 4134, 4135, 4136, 4137, 4138, 4139, 4140, 4141, 4160, 4161, 4162, 4163, 4164, 4165, 4166, 4167, 4168, 4169, 4170, 4171, 4172, 4173, 4174, 4177, 4178, 4179, 4180, 4181, 4182, 4851, 4852, 4853, 4854, 4856, 4857, 4858, 4860 | `0xe6fba9ae56e1c916` | yes | -| `block-acl.4th` | 4019, 4020 | `0xf6cc2a59e3a6734e` | yes | -| `doe-campaign.4th` | 4060, 4061, 4062, 4063, 4064, 4065 | `0x26fb485e5c9dc6ff` | yes | -| `doe.4th` | 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107 | `0xf154616d248e861f` | yes | -| `fabric.4th` | 4900, 4901, 4902, 4903, 4904, 4905, 4906, 4907, 4908, 4909, 4910, 4911, 4912, 4913, 4914, 4915, 4916, 4917, 4918, 4919, 4920, 4921, 4922, 4923, 4924, 5000, 5001, 5002 | `0x9d9489cbeca4099b` | yes | -| `font.4th` | 4925, 4926, 4927, 4928, 4929, 4930, 4931, 4932, 4933, 4934, 4935, 4936, 4937, 4938, 4939, 4940, 4941, 4942, 4943, 4944, 4945, 4946, 4947, 4948, 4949, 4950, 4951, 4952, 4953, 4954, 4955, 4956, 4957, 4958, 4959, 4960, 4961, 4962, 4963, 4964, 4965, 4966, 4967, 4968, 4969, 4970, 4971, 4972, 4973, 4974, 4975, 4976, 4977, 4978, 4979, 4980, 4981, 4982, 4983, 4984, 4985 | `0x3f305911500c78f6` | yes | -| `hestia:init.4th` | 4986, 4987, 4988 | `0x64e111990fbc45ff` | yes | -| `init-l8-diverse.4th` | 4820, 4821, 4822 | `0xaa293201a6c91838` | yes | -| `init-l8-omni.4th` | 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2072, 2073, 2074, 2075, 2076, 2077, 2078, 2079 | `0x5979e314d6452045` | yes | -| `init-l8-stable.4th` | 4806 | `0xdc3830f189063a9a` | yes | -| `init-l8-temporal.4th` | 4830, 4831 | `0x51abd4c138246651` | yes | -| `init-l8-transition.4th` | 4840, 4841, 4842 | `0xbcc1a81976f0a4c9` | yes | -| `init-l8-volatile.4th` | 4810, 4811, 4812, 4813 | `0x98caabbbd92abac4` | yes | -| `init.4th` | 2049, 2050, 2057 | `0xea038ba684c53443` | yes | -| `lib.4th` | 4050 | `0x4b216635c359ef73` | yes | -| `multiuser-doe.4th` | 5044, 5045, 5046, 5047, 5048, 5049, 5050, 5051, 5052, 5053, 5054, 5055 | `0x22140588ee7c39e6` | yes | -| `sdk.4th` | 5109, 5110, 5111, 5112, 5113, 5114, 5115 | `0x008fdbbb62c94a3a` | yes | -| `turtle.4th` | 5100, 5101, 5102, 5103, 5104, 5105, 5106, 5107, 5108 | `0x4d470418ca543365` | yes | -| `user-font-demo.4th` | 4200, 4201, 4202 | `0xce1fd7d1b581a56d` | yes | -| `workload-0.4th` | 2200, 2201 | `0x93f86f60aeba8feb` | yes | -| `workload-1-lite.4th` | 5058, 5059 | `0x44a7a7e3176dcc8d` | yes | -| `workload-1.4th` | 4406, 4415, 4425, 4435 | `0x63e251adb0a03613` | yes | -| `workload-2.4th` | 4506, 4515, 4525, 4535, 4545 | `0xf113b3d0bcccae47` | yes | -| `workload-3.4th` | 4606, 4615, 4625, 4635, 4645, 4655, 4665 | `0x62b7a71576ad1041` | yes | -| `workload-4.4th` | 2130, 2131, 2132 | `0x099619264e650b1c` | yes | -| `workload-5-lite.4th` | 5056, 5057 | `0xea0303f38824f254` | yes | -| `workload-5.4th` | *(none — raw code capsule)* | `0x526964c7c9506a11` | yes | -| `workload-6.4th` | 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095 | `0x06fc0ce1e369ef5a` | yes | -| `workload-7.4th` | 2150 | `0x02862291387eb7ac` | yes | -| `workload-8.4th` | 2160 | `0x56b7f2f0efa000df` | yes | -| `workload-9.4th` | 4706, 4715, 4725, 4735, 4745 | `0x3f2bec73142aa424` | yes | -| `workload-calib1.4th` | 5043 | `0x3b9f2d17b554fabc` | yes | -| `zuse-eligibility.4th` | 4021, 4022 | `0x7b28f4776a32e0b7` | yes | -| `zuse.4th` | 4016, 4017, 4018 | `0x490ded9be257a90b` | yes | +| `ACL.4th` | 4000, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4008, 4015 | `0xf8890c05c0d8f921` | n/a | +| `acl-std79.4th` | 4023, 4024, 4025, 4026, 4027, 4028, 4029, 4030, 4031, 4032, 4033, 4034, 4035, 4036, 4037, 4038, 4039, 4040, 4041, 4042, 4043, 4044, 4045, 4046, 4047, 4048 | `0x773bf9209df191d1` | n/a | +| `artemis:init.4th` | 4110, 4111, 4112, 4113, 4122, 4123, 4124, 4125, 4126, 4127, 4128, 4129, 4130, 4131, 4132, 4133, 4134, 4135, 4136, 4137, 4138, 4139, 4140, 4141, 4160, 4161, 4162, 4163, 4164, 4165, 4166, 4167, 4168, 4169, 4170, 4171, 4172, 4173, 4174, 4177, 4178, 4179, 4180, 4181, 4182, 4851, 4852, 4853, 4854, 4856, 4857, 4858, 4860 | `0xe6fba9ae56e1c916` | n/a | +| `block-acl.4th` | 4019, 4020 | `0xf6cc2a59e3a6734e` | n/a | +| `doe-campaign.4th` | 4060, 4061, 4062, 4063, 4064, 4065 | `0x26fb485e5c9dc6ff` | n/a | +| `doe.4th` | 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107 | `0xf154616d248e861f` | n/a | +| `fabric.4th` | 4900, 4901, 4902, 4903, 4904, 4905, 4906, 4907, 4908, 4909, 4910, 4911, 4912, 4913, 4914, 4915, 4916, 4917, 4918, 4919, 4920, 4921, 4922, 4923, 4924, 5000, 5001, 5002 | `0x9d9489cbeca4099b` | n/a | +| `font.4th` | 4925, 4926, 4927, 4928, 4929, 4930, 4931, 4932, 4933, 4934, 4935, 4936, 4937, 4938, 4939, 4940, 4941, 4942, 4943, 4944, 4945, 4946, 4947, 4948, 4949, 4950, 4951, 4952, 4953, 4954, 4955, 4956, 4957, 4958, 4959, 4960, 4961, 4962, 4963, 4964, 4965, 4966, 4967, 4968, 4969, 4970, 4971, 4972, 4973, 4974, 4975, 4976, 4977, 4978, 4979, 4980, 4981, 4982, 4983, 4984, 4985 | `0x3f305911500c78f6` | n/a | +| `hestia:init.4th` | 4986, 4987, 4988 | `0x64e111990fbc45ff` | n/a | +| `init-l8-diverse.4th` | 4820, 4821, 4822 | `0xaa293201a6c91838` | n/a | +| `init-l8-omni.4th` | 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2072, 2073, 2074, 2075, 2076, 2077, 2078, 2079 | `0x5979e314d6452045` | n/a | +| `init-l8-stable.4th` | 4806 | `0xdc3830f189063a9a` | n/a | +| `init-l8-temporal.4th` | 4830, 4831 | `0x51abd4c138246651` | n/a | +| `init-l8-transition.4th` | 4840, 4841, 4842 | `0xbcc1a81976f0a4c9` | n/a | +| `init-l8-volatile.4th` | 4810, 4811, 4812, 4813 | `0x98caabbbd92abac4` | n/a | +| `init.4th` | 2049, 2050, 2057 | `0xea038ba684c53443` | n/a | +| `lib.4th` | 4050 | `0x4b216635c359ef73` | n/a | +| `multiuser-doe.4th` | 5044, 5045, 5046, 5047, 5048, 5049, 5050, 5051, 5052, 5053, 5054, 5055 | `0x22140588ee7c39e6` | n/a | +| `sdk.4th` | 5109, 5110, 5111, 5112, 5113, 5114, 5115 | `0x008fdbbb62c94a3a` | n/a | +| `turtle.4th` | 5100, 5101, 5102, 5103, 5104, 5105, 5106, 5107, 5108 | `0x4d470418ca543365` | n/a | +| `user-font-demo.4th` | 4200, 4201, 4202 | `0xce1fd7d1b581a56d` | n/a | +| `workload-0.4th` | 2200, 2201 | `0x93f86f60aeba8feb` | n/a | +| `workload-1-lite.4th` | 5058, 5059 | `0x44a7a7e3176dcc8d` | n/a | +| `workload-1.4th` | 4406, 4415, 4425, 4435 | `0x63e251adb0a03613` | n/a | +| `workload-2.4th` | 4506, 4515, 4525, 4535, 4545 | `0xf113b3d0bcccae47` | n/a | +| `workload-3.4th` | 4606, 4615, 4625, 4635, 4645, 4655, 4665 | `0x62b7a71576ad1041` | n/a | +| `workload-4.4th` | 2130, 2131, 2132 | `0x099619264e650b1c` | n/a | +| `workload-5-lite.4th` | 5056, 5057 | `0xea0303f38824f254` | n/a | +| `workload-5.4th` | *(none — raw code capsule)* | `0x526964c7c9506a11` | n/a | +| `workload-6.4th` | 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095 | `0x06fc0ce1e369ef5a` | n/a | +| `workload-7.4th` | 2150 | `0x02862291387eb7ac` | n/a | +| `workload-8.4th` | 2160 | `0x56b7f2f0efa000df` | n/a | +| `workload-9.4th` | 4706, 4715, 4725, 4735, 4745 | `0x3f2bec73142aa424` | n/a | +| `workload-calib1.4th` | 5043 | `0x3b9f2d17b554fabc` | n/a | +| `zuse-eligibility.4th` | 4021, 4022 | `0x7b28f4776a32e0b7` | n/a | +| `zuse.4th` | 4016, 4017, 4018 | `0xa14d5a7a88791cf6` | n/a | + +*Signed column is `n/a`: this manifest run had no `--sign-key`. Re-run with `--sign-key ` to check signing status (does not modify or require rebuilding capsule_generated.c).* ## Block Map (sorted by LBN) @@ -109,9 +111,9 @@ | 4007 | `ACL.4th` | `0xf8890c05c0d8f921` | ok | | 4008 | `ACL.4th` | `0xf8890c05c0d8f921` | ok | | 4015 | `ACL.4th` | `0xf8890c05c0d8f921` | ok | -| 4016 | `zuse.4th` | `0x490ded9be257a90b` | ok | -| 4017 | `zuse.4th` | `0x490ded9be257a90b` | ok | -| 4018 | `zuse.4th` | `0x490ded9be257a90b` | ok | +| 4016 | `zuse.4th` | `0xa14d5a7a88791cf6` | ok | +| 4017 | `zuse.4th` | `0xa14d5a7a88791cf6` | ok | +| 4018 | `zuse.4th` | `0xa14d5a7a88791cf6` | ok | | 4019 | `block-acl.4th` | `0xf6cc2a59e3a6734e` | ok | | 4020 | `block-acl.4th` | `0xf6cc2a59e3a6734e` | ok | | 4021 | `zuse-eligibility.4th` | `0x7b28f4776a32e0b7` | ok | diff --git a/configs/README.md b/configs/README.md index dfe48f80..1cc77e37 100644 --- a/configs/README.md +++ b/configs/README.md @@ -1,7 +1,7 @@ # configs/ Example Kconfig `defconfig` files — starting points for `make -f -Makefile.starkernel ARCH= defconfig` (kernel) or the equivalent +kernel/Makefile ARCH= defconfig` (kernel) or the equivalent hosted target, matching the current committed default build behavior for each profile. Loaded via `tools/kconfig/conf`. diff --git a/ONTOLOGY.md b/docs/ONTOLOGY.md similarity index 100% rename from ONTOLOGY.md rename to docs/ONTOLOGY.md diff --git a/ROADMAP.md b/docs/ROADMAP.md similarity index 100% rename from ROADMAP.md rename to docs/ROADMAP.md diff --git a/docs/book/Makefile b/docs/book/Makefile new file mode 100644 index 00000000..43481d7c --- /dev/null +++ b/docs/book/Makefile @@ -0,0 +1,112 @@ +# docs/book/Makefile -- the single LithosAnanke book, built from LaTeX. +# +# Run from the repo root (the root Makefile does this): +# make docs -> build/docs/LithosAnanke.pdf +# make docs TARGET= -> build/docs/LithosAnanke-.pdf +# (same book + that board's appendix) +# +# docs/book/main.tex is the master. Markdown sources are converted by pandoc +# into LaTeX fragments under build/docs/gen/ and \input from main.tex; the +# Markdown stays the source of truth until a chapter is rewritten in LaTeX. +# Figures and tables that present data read the CSV directly at LaTeX time +# (pgfplots / pgfplotstable) and cite it with \datasource{path}; see +# docs/book/README.md. + +BOOK_DIR := docs/book +OUT := build/docs +GEN := $(OUT)/gen + +BOARD ?= +BOARD_NAME ?= +VARIANT := $(if $(BOARD),$(BOARD),book) +VAR_DIR := $(OUT)/$(VARIANT) +PDF := $(OUT)/LithosAnanke$(if $(BOARD),-$(BOARD)).pdf + +PANDOC ?= pandoc +LATEXMK ?= latexmk +PANDOC_FILTERS := $(BOOK_DIR)/pandoc/table-widths.lua $(BOOK_DIR)/pandoc/code-breaks.lua +PANDOC_FLAGS := -f gfm -t latex --top-level-division=chapter --wrap=preserve \ + $(foreach f,$(PANDOC_FILTERS),--lua-filter=$(f)) + +# fragment name : Markdown source. The order of \input lines is main.tex's. +CHAPTERS := \ + ontology:docs/ONTOLOGY.md \ + roadmap:docs/ROADMAP.md \ + boards:boards/README.md \ + justification:docs/v4.0.0/JUSTIFICATION.md \ + decomposition:docs/v4.0.0/DECOMPOSITION.md \ + fabric-0:docs/fabric/FABRIC-0.md \ + fabric-1:docs/fabric/FABRIC-1.md \ + fabric-2:docs/fabric/FABRIC-2.md \ + fabric-3:docs/fabric/FABRIC-3.md \ + fabric-3-5:docs/fabric/FABRIC-3.5.md \ + fabric-3-6:docs/fabric/FABRIC-3.6.md \ + fabric-3-7:docs/fabric/FABRIC-3.7.md \ + fabric-4:docs/fabric/FABRIC-4.md + +ifneq ($(BOARD),) +ifeq ($(wildcard boards/$(BOARD)/README.md),) + $(error boards/$(BOARD)/README.md is missing: it is the board's appendix) +endif +CHAPTERS += board-$(BOARD):boards/$(BOARD)/README.md +endif + +chapter_name = $(word 1,$(subst :, ,$(1))) +chapter_src = $(word 2,$(subst :, ,$(1))) +FRAGMENTS := $(foreach c,$(CHAPTERS),$(GEN)/$(call chapter_name,$(c)).tex) + +.PHONY: all tools FORCE +all: $(PDF) + +tools: + @missing=""; \ + for t in $(PANDOC) $(LATEXMK) xelatex; do command -v $$t >/dev/null 2>&1 || missing="$$missing $$t"; done; \ + if [ -n "$$missing" ]; then \ + echo "Error: make docs needs:$$missing"; \ + echo " sudo apt-get install -y pandoc latexmk texlive-xetex texlive-latex-extra texlive-pictures texlive-fonts-recommended fonts-dejavu fonts-dejavu-extra"; \ + echo " (or a user-local TinyTeX + pandoc in ~/.local; see docs/book/README.md)"; \ + exit 1; \ + fi + +# --id-prefix keeps heading labels unique across documents that reuse +# section names ("Summary", "Open questions", ...). +define chapter_rule +$(GEN)/$(call chapter_name,$(1)).tex: $(call chapter_src,$(1)) $(PANDOC_FILTERS) | tools + @mkdir -p $(GEN) + @echo " PANDOC $$< -> $$@" + @$(PANDOC) $(PANDOC_FLAGS) --id-prefix=$(call chapter_name,$(1))- $$< -o $$@ +endef +$(foreach c,$(CHAPTERS),$(eval $(call chapter_rule,$(c)))) + +# Pandoc's syntax-highlighting macros, taken from the installed pandoc so the +# fragments and their macros always come from the same version. +$(GEN)/pandoc-highlighting.tex: $(BOOK_DIR)/pandoc/highlighting.latex | tools + @mkdir -p $(GEN) + @printf '```c\nx\n```\n' | $(PANDOC) -f gfm -t latex -s --template=$< -o $@ + +# Per-build facts the book prints: the commit every \datasource refers to, +# and which board appendix (if any) is included. +$(VAR_DIR)/meta.tex: FORCE + @mkdir -p $(VAR_DIR) + @{ \ + c=$$(git rev-parse --short=12 HEAD 2>/dev/null || echo unknown); \ + git diff --quiet HEAD -- 2>/dev/null || c="$$c (+ uncommitted changes)"; \ + printf '\\newcommand{\\bookcommit}{%s}\n' "$$c"; \ + printf '\\newcommand{\\bookdate}{%s}\n' "$$(date -u +%Y-%m-%d)"; \ + printf '\\def\\bookboard{%s}\n' "$(BOARD_NAME)"; \ + $(if $(BOARD),printf '\\newcommand{\\bookboardappendix}{board-%s}\n' "$(BOARD)";) \ + } > $@.tmp + @cmp -s $@.tmp $@ && rm -f $@.tmp || mv $@.tmp $@ + +FORCE: + +TEXINPUTS_BOOK := $(abspath $(VAR_DIR)):$(abspath $(GEN)):$(abspath $(BOOK_DIR)): + +$(PDF): $(BOOK_DIR)/main.tex $(FRAGMENTS) $(GEN)/pandoc-highlighting.tex $(VAR_DIR)/meta.tex | tools + @echo " LATEXMK $(BOOK_DIR)/main.tex -> $@" + @TEXINPUTS=$(TEXINPUTS_BOOK) $(LATEXMK) -xelatex -interaction=nonstopmode -halt-on-error \ + -file-line-error -outdir=$(VAR_DIR) $(BOOK_DIR)/main.tex > $(VAR_DIR)/latexmk.log 2>&1 || { \ + grep -A4 -E '^(.*:[0-9]+:|!)' $(VAR_DIR)/main.log | head -40; \ + echo "Error: LaTeX failed; full log: $(VAR_DIR)/main.log"; exit 1; } + @cp $(VAR_DIR)/main.pdf $@ + @echo " PDF $@" diff --git a/docs/book/README.md b/docs/book/README.md new file mode 100644 index 00000000..eedb4db7 --- /dev/null +++ b/docs/book/README.md @@ -0,0 +1,66 @@ +# docs/book/ + +`make docs` builds one PDF, `build/docs/LithosAnanke.pdf`, from `main.tex` with xelatex. +`make docs TARGET=` builds `build/docs/LithosAnanke-.pdf`: the same book with +`boards//README.md` added as an appendix. + +Tools: `sudo apt-get install -y pandoc latexmk texlive-xetex texlive-latex-extra texlive-pictures texlive-fonts-recommended fonts-dejavu fonts-dejavu-extra` + +Without root, a user-local TeX Live works too (this is how the book was first built): +TinyTeX (`curl -sL https://yihui.org/tinytex/install-bin-unix.sh | sh`) plus +`tlmgr install latexmk xetex fontspec pgf pgfplots booktabs multirow fancyvrb fvextra lineno upquote ulem enumitem newunicodechar bookmark hyperref geometry xcolor graphics tools etoolbox fancyhdr truncate amsfonts`, +and the pandoc release tarball unpacked into `~/.local`. + +The installed DejaVu decides italics: `fonts-dejavu-core` alone has no serif italic, so +`main.tex` falls back to a slanted upright face; `fonts-dejavu-extra` gives real italics. + +## How it fits together + +- `main.tex` is the master file. It sets the parts and the chapter order. +- Chapters that are still Markdown are listed in `Makefile` (`CHAPTERS`, as `name:source.md`). + At build time pandoc converts each one into `build/docs/gen/.tex`, and `main.tex` + includes it with `\input{}`. The Markdown stays the source until the chapter is + rewritten in LaTeX. At that point the `.tex` moves into this directory and the `CHAPTERS` + entry is removed. +- `pandoc/highlighting.latex` extracts the code-highlighting macros from the installed pandoc, + so the macros and the fragments always come from the same pandoc version. +- Two Lua filters run on every chapter. `pandoc/table-widths.lua` gives wide tables + proportional wrapping columns, because pandoc's gfm reader leaves column widths unset. + `pandoc/code-breaks.lua` lets long inline identifiers and paths break after `_ / . - :`. + Code blocks wrap through fvextra (`breaklines`). +- `build/docs//meta.tex` is written on every build. It records the commit (and + whether there were uncommitted changes), the date, and the board. + +## Rule for data + +Any figure or table that shows measured numbers is generated from the CSV when the book is +built. Numbers are never typed in by hand: + +```latex +\begin{tikzpicture} + \begin{axis}[xlabel=run, ylabel=K] + \addplot table[col sep=comma, x=run, y=K]{experiments//results.csv}; + \end{axis} +\end{tikzpicture} +\datasource{experiments//results.csv} +``` + +Use `\pgfplotstabletypeset[col sep=comma]{...}` for tables. `\datasource` prints the CSV path +and the commit, so a reader can find the exact file the figure was drawn from. CSV paths are +repo-relative, because xelatex runs from the repo root. + +## Older pipelines to fold in or retire + +These still exist and still have their own targets. Each one needs a decision during the +curation pass: move it into this book, or retire it. + +| Source | Current target | Produces | +|---|---|---| +| `docs/formal/vol1-vm-physics`, `vol2-kernel`, `vol3-research` | `make -C docs/formal vols` | three volume PDFs | +| `docs/formal/dev-guide`, `user-guide`, `cookbook` | `make -C docs/formal books` | three practitioner PDFs | +| `docs/formal/experiments`, `proofs`, `ssrn`, `patent` | `make -C docs/formal standalone` | four standalone PDFs | +| Doxygen (`Doxyfile`) | `make -C docs/formal doxygen` | API reference PDF | +| `scripts/generate-doxygen-appendix.sh` | `make -f v3/Makefile api-docs` | AsciiDoc API appendix | +| `docs/src/internal/formal/*.thy` | `make -f v3/Makefile docs-isabelle` | Isabelle report | +| `scripts/asciidoc-to-latex.sh` | `make -f v3/Makefile docs-latex` | `docs/latex/` | +| `docs/SSRN_companion/Math_Companion_SSRN.tex` | `make -f v3/Makefile math-companion` | SSRN math companion | diff --git a/docs/book/main.tex b/docs/book/main.tex new file mode 100644 index 00000000..5435e9dc --- /dev/null +++ b/docs/book/main.tex @@ -0,0 +1,161 @@ +% docs/book/main.tex -- master file of the single LithosAnanke book. +% +% Built by `make docs [TARGET=]` (docs/book/Makefile) with xelatex. +% Fragments named below (ontology, fabric-0, ...) are generated by pandoc +% from the Markdown listed in docs/book/Makefile's CHAPTERS into +% build/docs/gen/; meta.tex is generated per build. Neither is committed. +\documentclass[11pt,openany]{book} + +\usepackage{amsmath,amssymb} +\usepackage{fontspec} +% fonts-dejavu-core has no serif/sans italics (fonts-dejavu-extra does); when a +% shape is missing, slant the upright one rather than silently drop emphasis. +\setmainfont{DejaVu Serif}[AutoFakeSlant=0.2] +\setsansfont{DejaVu Sans}[AutoFakeSlant=0.2] +\setmonofont{DejaVu Sans Mono}[Scale=0.85] +\newfontfamily\symbolfont{DejaVu Sans} + +\usepackage[letterpaper,margin=1in]{geometry} +\usepackage{xcolor} +\usepackage{graphicx} +\usepackage{longtable,booktabs,array,calc,multirow} +\usepackage{fancyvrb} +\usepackage[normalem]{ulem} +\usepackage{enumitem} +\usepackage{newunicodechar} +\usepackage{pgfplots} +\usepackage{pgfplotstable} +\pgfplotsset{compat=1.18} +\usepackage[hidelinks]{hyperref} +\usepackage{bookmark} + +% --- what pandoc's LaTeX fragments expect (normally from its own template) +\providecommand{\tightlist}{\setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} +\providecommand{\pandocbounded}[1]{#1} +\providecommand{\st}[1]{\sout{#1}} +\newcounter{none} % pandoc: {\def\LTcaptype{none} ...} marks unnumbered tables +\usepackage{etoolbox} +\makeatletter +\def\fnum@table{\tablename~\thetable} +\patchcmd\longtable{\par}{\if@noskipsec\mbox{}\fi\par}{}{} +\makeatother +\usepackage{fvextra} +\input{pandoc-highlighting} +% Code and diagrams are wider than the page in places: wrap, never overflow. +\RecustomVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\},breaklines,breakanywhere,fontsize=\small} +\RecustomVerbatimEnvironment{verbatim}{Verbatim}{breaklines,breakanywhere,fontsize=\small} +\setlistdepth{9} +\renewlist{itemize}{itemize}{9} +\setlist[itemize]{label=\textbullet} +\renewlist{enumerate}{enumerate}{9} +\setlist[enumerate]{label=\arabic*.} +% Running heads: chapter on the left page, section on the right, both cut to +% the page width (several design-record titles are a full sentence long). +\usepackage{fancyhdr} +\usepackage[fit]{truncate} +\pagestyle{fancy} +\fancyhf{} +\renewcommand{\chaptermark}[1]{\markboth{#1}{}} +\renewcommand{\sectionmark}[1]{\markright{#1}} +\fancyhead[LE]{\small\truncate{\dimexpr\headwidth-3em}{\leftmark}} +\fancyhead[RO]{\small\truncate{\dimexpr\headwidth-3em}{\rightmark}} +\fancyhead[RE,LO]{\small\thepage} +\renewcommand{\headrulewidth}{0.4pt} +\setlength{\headheight}{14pt} +\fancypagestyle{plain}{\fancyhf{}\fancyfoot[C]{\small\thepage}\renewcommand{\headrulewidth}{0pt}} +\setlength{\emergencystretch}{3em} +\setlength{\parindent}{0pt} +\setlength{\parskip}{0.5em} + +% --- glyphs DejaVu Serif lacks: the status marks used across the docs +\newunicodechar{✅}{{\symbolfont ✔}} +\newunicodechar{✓}{{\symbolfont ✓}} +\newunicodechar{❌}{{\symbolfont ✘}} +\newunicodechar{✗}{{\symbolfont ✗}} +\newunicodechar{⬜}{{\symbolfont ☐}} +\newunicodechar{⭐}{{\symbolfont ★}} +\newunicodechar{🔶}{{\symbolfont ◆}} +\newunicodechar{⚠}{{\symbolfont ⚠}} +\newunicodechar{📋}{} +\newunicodechar{🐛}{[bug]} +\newunicodechar{🎯}{[goal]} +\newunicodechar{🟡}{{\symbolfont ●}} +\newunicodechar{📍}{{\symbolfont ▸}} +\newunicodechar{🔓}{[unlocked]} +\newunicodechar{❓}{?} +\newunicodechar{⟺}{\ensuremath{\Longleftrightarrow}} +\newunicodechar{⋯}{\ensuremath{\cdots}} +\newunicodechar{^^^^fe0f}{} + +% --- the documents number their own sections (§III.1, D-3, ...) +\setcounter{secnumdepth}{0} +\setcounter{tocdepth}{1} + +\input{meta} + +% \datasource{path/to/data.csv}: cite the data behind a figure or table. +% Every figure or table of measured numbers reads its CSV at build time +% (\addplot table / \pgfplotstabletypeset) and is followed by this line, so +% the reader can find the exact file at the exact commit. +\newcommand{\datasource}[1]{% + \par{\small Data: \texttt{\detokenize{#1}} at commit \texttt{\bookcommit}.}\par} + +\title{LithosAnanke and StarForth} +\author{} +\date{Built \bookdate{} from commit \texttt{\bookcommit}% + \ifx\bookboard\empty\else\\Board appendix: \bookboard\fi} + +\begin{document} +\frontmatter +\maketitle +\tableofcontents + +\chapter{About this book} +This book is generated from the repository by \texttt{make docs}. Each +chapter below is still maintained as the Markdown file named in the table and +converted at build time; a chapter moves into LaTeX source when it is +rewritten. Part~III is the design record: those documents are archival and +are reproduced as written, including their struck-through corrections. + +\begin{longtable}{@{}ll@{}} +\toprule +Chapter & Source \\ +\midrule +\endhead +Ontology & \texttt{docs/ONTOLOGY.md} \\ +Roadmap & \texttt{docs/ROADMAP.md} \\ +Boot targets & \texttt{boards/README.md} \\ +v4 justification & \texttt{docs/v4.0.0/JUSTIFICATION.md} \\ +v4 decomposition & \texttt{docs/v4.0.0/DECOMPOSITION.md} \\ +FABRIC-0 \dots{} FABRIC-4 & \texttt{docs/fabric/FABRIC-*.md} \\ +Board appendix (\texttt{TARGET=}) & \texttt{boards//README.md} \\ +\bottomrule +\end{longtable} + +\mainmatter + +\part{The system} +\input{ontology} +\input{roadmap} +\input{boards} + +\part{StarForth v4} +\input{justification} +\input{decomposition} + +\part{Design record (FABRIC series)} +\input{fabric-0} +\input{fabric-1} +\input{fabric-2} +\input{fabric-3} +\input{fabric-3-5} +\input{fabric-3-6} +\input{fabric-3-7} +\input{fabric-4} + +\ifdefined\bookboardappendix +\appendix +\input{\bookboardappendix} +\fi + +\end{document} diff --git a/docs/book/pandoc/code-breaks.lua b/docs/book/pandoc/code-breaks.lua new file mode 100644 index 00000000..ec8bc5f5 --- /dev/null +++ b/docs/book/pandoc/code-breaks.lua @@ -0,0 +1,29 @@ +-- docs/book/pandoc/code-breaks.lua +-- +-- Inline code in the design record is full of long identifiers and paths +-- (g_wirebind_attached_username, kernel/src/arch/riscv64/...), which LaTeX +-- cannot break, so they run into the margin. Emit inline code as \texttt +-- ourselves, escaped the same way pandoc does, with a break opportunity +-- after each separator character. + +local BREAK_AFTER = { ["_"] = true, ["/"] = true, ["."] = true, ["-"] = true, + [":"] = true, [","] = true, ["("] = true, ["="] = true } + +local ESCAPE = { + ["\\"] = "\\textbackslash{}", ["{"] = "\\{", ["}"] = "\\}", + ["$"] = "\\$", ["&"] = "\\&", ["#"] = "\\#", ["%"] = "\\%", ["_"] = "\\_", + ["^"] = "\\textasciicircum{}", ["~"] = "\\textasciitilde{}", + ["'"] = "\\textquotesingle{}", ["`"] = "\\textasciigrave{}", + [" "] = "\\ ", +} + +function Code(el) + if not FORMAT:match("latex") then return nil end + local out = {} + for _, cp in utf8.codes(el.text) do + local ch = utf8.char(cp) + out[#out + 1] = ESCAPE[ch] or ch + if BREAK_AFTER[ch] then out[#out + 1] = "\\allowbreak{}" end + end + return pandoc.RawInline("latex", "\\texttt{" .. table.concat(out) .. "}") +end diff --git a/docs/book/pandoc/highlighting.latex b/docs/book/pandoc/highlighting.latex new file mode 100644 index 00000000..c8427f53 --- /dev/null +++ b/docs/book/pandoc/highlighting.latex @@ -0,0 +1,3 @@ +$if(highlighting-macros)$ +$highlighting-macros$ +$endif$ diff --git a/docs/book/pandoc/table-widths.lua b/docs/book/pandoc/table-widths.lua new file mode 100644 index 00000000..4f74a020 --- /dev/null +++ b/docs/book/pandoc/table-widths.lua @@ -0,0 +1,55 @@ +-- docs/book/pandoc/table-widths.lua +-- +-- pandoc's gfm reader leaves every column width unset, so the LaTeX writer +-- emits `l` columns and a table with long cells runs off the page. For any +-- table wider than WIDE characters, give each column a width proportional +-- to its longest cell (clamped to [MIN_COL, MAX_COL] characters); the +-- writer then emits wrapping p{} columns that together fill \linewidth. + +local WIDE = 72 +local MIN_COL = 6 +local MAX_COL = 60 + +local stringify = pandoc.utils.stringify + +local function measure(rows, widths) + for _, row in ipairs(rows) do + local col = 1 + for _, cell in ipairs(row.cells) do + local span = cell.col_span or 1 + local len = utf8.len(stringify(cell.contents)) or #stringify(cell.contents) + local per = len / span + for c = col, col + span - 1 do + if per > (widths[c] or 0) then widths[c] = per end + end + col = col + span + end + end +end + +function Table(tbl) + local n = #tbl.colspecs + local widths = {} + for i = 1, n do widths[i] = 0 end + + measure(tbl.head.rows, widths) + for _, body in ipairs(tbl.bodies) do + measure(body.head, widths) + measure(body.body, widths) + end + measure(tbl.foot.rows, widths) + + local total = 0 + for i = 1, n do total = total + widths[i] end + if total <= WIDE then return nil end + + local sum = 0 + for i = 1, n do + widths[i] = math.max(MIN_COL, math.min(MAX_COL, widths[i])) + sum = sum + widths[i] + end + for i = 1, n do + tbl.colspecs[i] = { tbl.colspecs[i][1], widths[i] / sum } + end + return tbl +end diff --git a/FABRIC-0.md b/docs/fabric/FABRIC-0.md similarity index 100% rename from FABRIC-0.md rename to docs/fabric/FABRIC-0.md diff --git a/FABRIC-1.md b/docs/fabric/FABRIC-1.md similarity index 100% rename from FABRIC-1.md rename to docs/fabric/FABRIC-1.md diff --git a/FABRIC-2.md b/docs/fabric/FABRIC-2.md similarity index 100% rename from FABRIC-2.md rename to docs/fabric/FABRIC-2.md diff --git a/FABRIC-3.5.md b/docs/fabric/FABRIC-3.5.md similarity index 100% rename from FABRIC-3.5.md rename to docs/fabric/FABRIC-3.5.md diff --git a/FABRIC-3.6.md b/docs/fabric/FABRIC-3.6.md similarity index 100% rename from FABRIC-3.6.md rename to docs/fabric/FABRIC-3.6.md diff --git a/FABRIC-3.7.md b/docs/fabric/FABRIC-3.7.md similarity index 100% rename from FABRIC-3.7.md rename to docs/fabric/FABRIC-3.7.md diff --git a/FABRIC-3.md b/docs/fabric/FABRIC-3.md similarity index 100% rename from FABRIC-3.md rename to docs/fabric/FABRIC-3.md diff --git a/FABRIC-4.md b/docs/fabric/FABRIC-4.md similarity index 100% rename from FABRIC-4.md rename to docs/fabric/FABRIC-4.md diff --git a/Makefile.starkernel b/kernel/Makefile similarity index 84% rename from Makefile.starkernel rename to kernel/Makefile index ccb035d1..2ea15960 100644 --- a/Makefile.starkernel +++ b/kernel/Makefile @@ -1,13 +1,13 @@ # ============================================================================== -# Makefile.starkernel — StarKernel UEFI Build System +# kernel/Makefile — StarKernel UEFI Build System # Multi-architecture: amd64 (x86_64), aarch64 (ARM64), riscv64 (RISC-V 64) # # Quick start: -# make -f Makefile.starkernel — build for host arch -# make -f Makefile.starkernel ARCH=amd64 qemu — build + boot (x86_64) -# make -f Makefile.starkernel ARCH=aarch64 qemu — build + boot (aarch64) -# make -f Makefile.starkernel ARCH=riscv64 qemu — build + boot (riscv64) -# make -f Makefile.starkernel help — show all targets +# make -f kernel/Makefile — build for host arch +# make -f kernel/Makefile ARCH=amd64 qemu — build + boot (x86_64) +# make -f kernel/Makefile ARCH=aarch64 qemu — build + boot (aarch64) +# make -f kernel/Makefile ARCH=riscv64 qemu — build + boot (riscv64) +# make -f kernel/Makefile help — show all targets # ============================================================================== # ============================================================================== @@ -64,7 +64,7 @@ $(eval $(call kconfig_bool,STARFORTH_ENABLE_VM,1)) MONOLITHIC ?= 1 # Parallel build — use all available cores when not cleaning -# (adding -j when 'clean' is also a goal causes a race on include/version.h) +# (adding -j when 'clean' is also a goal causes a race on v3/include/version.h) NPROC := $(shell nproc 2>/dev/null || echo 4) ifeq ($(filter clean,$(MAKECMDGOALS)),) MAKEFLAGS += -j$(NPROC) @@ -106,9 +106,9 @@ KERNEL_OBJ_DIR := $(OBJ_DIR)/kernel LOADER_EFI := $(BUILD_DIR)/starkernel_loader.efi KERNEL_ELF := $(BUILD_DIR)/starkernel_kernel.elf -KERNEL_SRC := src/starkernel -KERNEL_INC := include/starkernel -STARFORTH_CONFIG_HEADER := include/starforth_config.h +KERNEL_SRC := kernel/src +KERNEL_INC := kernel/include/starkernel +STARFORTH_CONFIG_HEADER := v3/include/starforth_config.h QEMU_LOG_DIR := logs QEMU_ISO := $(BUILD_DIR)/starkernel.iso @@ -129,17 +129,17 @@ ARTDISK ?= disk/artemis.img # headroom above the current 9-device identity roster (Zuse + 8 minted identities) # rather than matching it exactly, per Bob's standing ruling against hardcoding a bound # to today's scale (FABRIC-3.md §VII.4). Override if a future test needs more, e.g. -# `make -f Makefile.starkernel qemu XHCI_PORTS=32`. +# `make -f kernel/Makefile qemu XHCI_PORTS=32`. XHCI_PORTS ?= 16 # ZUSEDISK -- Zuse's own minted USB thumbdrive, attached by default so a # plain `make qemu` lands already authenticated into the Zuse identity # (Captain Bob, 2026-08-28). Attached at QEMU launch time via -drive/ # -device on the qemu-xhci controller each arch's qemu target already -# creates; xhci_bringup()'s initial port scan (src/starkernel/usb/xhci.c) +# creates; xhci_bringup()'s initial port scan (kernel/src/usb/xhci.c) # is what makes an already-connected-at-launch device visible at all -- # xhci_poll_events() alone is purely hotplug-event-driven and would never # see a device present before controller reset. Override to "" (empty) to -# boot without Zuse attached, e.g. `make -f Makefile.starkernel qemu ZUSEDISK=`. +# boot without Zuse attached, e.g. `make -f kernel/Makefile qemu ZUSEDISK=`. ZUSEDISK ?= disk/thumbdrives/zuse-thumb-ident.img # Precomputed (not inlined as $(if ...,...)) because the drive/device specs # below are comma-heavy and GNU make's $(if) function splits its own @@ -153,10 +153,10 @@ else ZUSEDISK_QEMU_ARGS := endif MKCAPSULE_SRC = tools/mkcapsule.c tools/pkcs8_ed25519.c \ - src/starkernel/crypto/ed25519.c \ - src/starkernel/crypto/fe25519.c \ - src/starkernel/crypto/scalar25519.c \ - src/starkernel/crypto/sha512.c + kernel/src/crypto/ed25519.c \ + kernel/src/crypto/fe25519.c \ + kernel/src/crypto/scalar25519.c \ + kernel/src/crypto/sha512.c MKCAPSULE_BIN = $(BUILD_DIR)/tools/mkcapsule # Milestone 6 (Phase 8): the snakeoil intermediate's private key, generated # offline outside this repo entirely (see FABRIC-2.md's Phase 8 §Milestone 6 @@ -169,6 +169,28 @@ CAPSULE_GENERATED = $(BUILD_DIR)/capsule_generated.c CAPSULE_GENERATED_OBJ = $(BUILD_DIR)/capsule_generated.o CAPSULE_GENERATED_KOBJ = $(KERNEL_OBJ_DIR)/capsule_generated.o +# ============================================================================== +# BOARD (boot_image) +# ============================================================================== +# BOARD names a directory under boards/ (ser5, raspi, milkv, ...). Its +# board.mk sets BOARD_ARCH, BOARD_BOOT (how the firmware finds us) and +# BOARD_IMAGE (the single file written to the boot medium). The root +# Makefile's `make boot_image TARGET=` maps NAME to BOARD and passes +# ARCH=$(BOARD_ARCH); the kernel objects themselves are the ordinary +# build/$(ARCH)/kernel ones, shared with `make qemu`. +BOARD ?= +ifneq ($(strip $(BOARD)),) +ifeq ($(wildcard boards/$(BOARD)/board.mk),) + $(error Unknown BOARD='$(BOARD)': no boards/$(BOARD)/board.mk) +endif +include boards/$(BOARD)/board.mk +ifneq ($(BOARD_ARCH),$(ARCH)) + $(error BOARD=$(BOARD) is ARCH=$(BOARD_ARCH), but ARCH=$(ARCH) was requested) +endif +BOARD_OUT := build/boards/$(BOARD) +endif +BOOT_IMAGE_SIZE_MIB ?= 128 + # ============================================================================== # TOOLCHAIN # ============================================================================== @@ -195,8 +217,8 @@ ifeq ($(ARCH),amd64) # correctly. These flags come after COMMON_CFLAGS on the command line so # they win for amd64 only; riscv64/aarch64 keep -fPIC. ARCH_CFLAGS := -m64 -march=x86-64 -mno-red-zone -DARCH_AMD64 -fno-pic -fno-pie - LOADER_LINKER_SCRIPT := linker/starkernel-loader-amd64.ld - KERNEL_LINKER_SCRIPT := linker/starkernel-kernel-amd64.ld + LOADER_LINKER_SCRIPT := kernel/linker/starkernel-loader-amd64.ld + KERNEL_LINKER_SCRIPT := kernel/linker/starkernel-kernel-amd64.ld else ifeq ($(ARCH),aarch64) ifneq ($(shell which aarch64-linux-gnu-gcc 2>/dev/null),) @@ -211,14 +233,16 @@ else ifeq ($(ARCH),aarch64) $(error No ARM64 toolchain found. Install aarch64-linux-gnu-gcc or aarch64-none-elf-gcc) endif # aarch64 loader uses clang + lld-link (COFF target — GCC cannot produce aarch64 PE) - LOADER_CC := clang-18 - # Debian/Ubuntu package only installs the versioned lld-link-18 on PATH by - # default (unversioned lld-link lives under /usr/lib/llvm-18/bin, which + # Any clang with the aarch64 COFF backend works; the version is not + # pinned (Ubuntu 26.04 ships clang-21, older hosts clang-18). + LOADER_CC := $(shell which clang 2>/dev/null || ls /usr/bin/clang-[0-9]* 2>/dev/null | sort -V | tail -1 || echo clang) + # Debian/Ubuntu package only installs the versioned lld-link-NN on PATH by + # default (unversioned lld-link lives under /usr/lib/llvm-NN/bin, which # isn't on PATH unless explicitly prepended) — detect whichever resolves. - LOADER_LD := $(shell which lld-link 2>/dev/null || which lld-link-18 2>/dev/null || echo lld-link) + LOADER_LD := $(shell which lld-link 2>/dev/null || ls /usr/bin/lld-link-[0-9]* /usr/lib/llvm-*/bin/lld-link 2>/dev/null | sort -V | tail -1 || echo lld-link) ARCH_CFLAGS := -march=armv8-a -mcpu=cortex-a72 -DARCH_AARCH64 -mno-outline-atomics - LOADER_LINKER_SCRIPT := linker/starkernel-loader-aarch64.ld - KERNEL_LINKER_SCRIPT := linker/starkernel-kernel-aarch64.ld + LOADER_LINKER_SCRIPT := kernel/linker/starkernel-loader-aarch64.ld + KERNEL_LINKER_SCRIPT := kernel/linker/starkernel-kernel-aarch64.ld else ifeq ($(ARCH),riscv64) ifneq ($(shell which riscv64-unknown-elf-gcc 2>/dev/null),) @@ -233,8 +257,8 @@ else ifeq ($(ARCH),riscv64) $(error No RISC-V toolchain found. Install riscv64-unknown-elf-gcc or riscv64-linux-gnu-gcc) endif ARCH_CFLAGS := -march=rv64gc -mabi=lp64d -DARCH_RISCV64 - LOADER_LINKER_SCRIPT := linker/starkernel-loader-riscv64.ld - KERNEL_LINKER_SCRIPT := linker/starkernel-kernel-riscv64.ld + LOADER_LINKER_SCRIPT := kernel/linker/starkernel-loader-riscv64.ld + KERNEL_LINKER_SCRIPT := kernel/linker/starkernel-kernel-riscv64.ld endif # Default loader toolchain = kernel toolchain (overridden for aarch64 above) @@ -260,13 +284,13 @@ COMMON_CFLAGS := \ -ffreestanding -nostdlib -fno-builtin \ -fPIC -fvisibility=hidden -fno-stack-protector -fshort-wchar \ $(ARCH_CFLAGS) \ - -I$(KERNEL_INC) -Iinclude -Isrc \ + -I$(KERNEL_INC) -Iv3/include -Ikernel/include -Iv3/src \ -include $(STARFORTH_CONFIG_HEADER) \ -DPARITY_MODE=$(PARITY_MODE) VMCORE_CFLAGS_COMMON := \ $(filter-out -I$(KERNEL_INC),$(COMMON_CFLAGS)) \ - -Iinclude -I. -Isrc/word_source -Isrc/test_runner/include \ + -Iv3/include -Ikernel/include -I. -Iv3/src/word_source -Iv3/src/test_runner/include \ -Wno-error=unused-parameter -Wno-error=shift-negative-value \ -Wno-error=sign-compare -Wno-error=missing-field-initializers @@ -281,8 +305,8 @@ LOADER_BASE_CFLAGS := \ -mno-stack-arg-probe \ -march=armv8-a \ -DARCH_AARCH64 \ - -I$(KERNEL_INC) -Iinclude -Isrc \ - -Iinclude/starkernel/freestanding \ + -I$(KERNEL_INC) -Iv3/include -Ikernel/include -Iv3/src \ + -Ikernel/include/starkernel/freestanding \ -include $(STARFORTH_CONFIG_HEADER) \ -DPARITY_MODE=$(PARITY_MODE) \ -DPLATFORM_TIME_NO_INLINE @@ -308,7 +332,7 @@ ifeq ($(ARCH),aarch64) else ifeq ($(ARCH),riscv64) LOADER_LDFLAGS_PE := # ELF→objcopy pipeline in link rule else - LOADER_LINKER_SCRIPT_PE := linker/starkernel-loader-amd64-pe.ld + LOADER_LINKER_SCRIPT_PE := kernel/linker/starkernel-loader-amd64-pe.ld LOADER_LDFLAGS_PE := \ -T $(LOADER_LINKER_SCRIPT_PE) -m i386pep -nostdlib \ --enable-reloc-section --image-base 0 --subsystem 10 -e efi_main @@ -429,7 +453,7 @@ LOADER_CFLAGS += $(VM_FEATURE_OVERRIDES) endif # SK_CMD — optional startup FORTH script injected before the interactive REPL. -# Usage: make -f Makefile.starkernel qemu SK_CMD="TIME-TICKS . BYE" +# Usage: make -f kernel/Makefile qemu SK_CMD="TIME-TICKS . BYE" ifdef SK_CMD KERNEL_CFLAGS += -DSK_STARTUP_FORTH='"$(SK_CMD)"' LOADER_CFLAGS += -DSK_STARTUP_FORTH='"$(SK_CMD)"' @@ -439,7 +463,7 @@ endif # The loader reads this file from the EFI partition and parses it at boot. # Supported flags: --doe --log-level= # --stack=[MG] --heap=[MG] -# Usage: make -f Makefile.starkernel qemu KERNEL_ARGS="--doe --log-level=info" +# Usage: make -f kernel/Makefile qemu KERNEL_ARGS="--doe --log-level=info" KERNEL_ARGS ?= # ============================================================================== @@ -534,19 +558,19 @@ KERNEL_ASM := $(wildcard $(KERNEL_SRC)/arch/$(ARCH)/*.S) ifeq ($(STARFORTH_ENABLE_VM),1) VM_ALL_SRCS := \ - $(wildcard src/*.c) \ - $(wildcard src/word_source/*.c) \ - $(wildcard src/test_runner/*.c) \ - $(wildcard src/test_runner/modules/*.c) + $(wildcard v3/src/*.c) \ + $(wildcard v3/src/word_source/*.c) \ + $(wildcard v3/src/test_runner/*.c) \ + $(wildcard v3/src/test_runner/modules/*.c) VM_EXCLUDE := \ - src/main.c src/cli.c src/repl.c \ - src/platform/% \ - src/blkio_factory.c src/blkio_file.c \ - src/log.c src/doe_metrics.c \ - src/vm.c src/vm_core.c src/vm_bootstrap.c src/vm_runtime.c src/vm_time.c \ - src/word_source/q48_16_words.c \ - src/test_runner/modules/break_me_tests.c + v3/src/main.c v3/src/cli.c v3/src/repl.c \ + v3/src/platform/% \ + v3/src/blkio_factory.c v3/src/blkio_file.c \ + v3/src/log.c v3/src/doe_metrics.c \ + v3/src/vm.c v3/src/vm_core.c v3/src/vm_bootstrap.c v3/src/vm_runtime.c v3/src/vm_time.c \ + v3/src/word_source/q48_16_words.c \ + v3/src/test_runner/modules/break_me_tests.c VM_CORE_SRCS := $(filter-out $(VM_EXCLUDE),$(VM_ALL_SRCS)) @@ -569,8 +593,8 @@ LOADER_EXTRA_SRCS := \ KERNEL_EXTRA_SRCS := $(LOADER_EXTRA_SRCS) -LOADER_VM_OBJS := $(patsubst src/%.c,$(LOADER_OBJ_DIR)/vmcore/%.o,$(VM_CORE_SRCS)) -KERNEL_VM_OBJS := $(patsubst src/%.c,$(KERNEL_OBJ_DIR)/vmcore/%.o,$(VM_CORE_SRCS)) +LOADER_VM_OBJS := $(patsubst v3/src/%.c,$(LOADER_OBJ_DIR)/vmcore/%.o,$(VM_CORE_SRCS)) +KERNEL_VM_OBJS := $(patsubst v3/src/%.c,$(KERNEL_OBJ_DIR)/vmcore/%.o,$(VM_CORE_SRCS)) endif LOADER_SRCS := $(LOADER_SRCS_BASE) $(LOADER_EXTRA_SRCS) @@ -603,7 +627,7 @@ KERNEL_OBJS := \ # MAIN TARGETS # ============================================================================== -all: include/version.h $(CAPSULE_GENERATED_OBJ) $(CAPSULE_GENERATED_KOBJ) $(LOADER_EFI) $(KERNEL_ELF) +all: v3/include/version.h $(CAPSULE_GENERATED_OBJ) $(CAPSULE_GENERATED_KOBJ) $(LOADER_EFI) $(KERNEL_ELF) @echo "StarKernel built successfully for $(ARCH)" @echo " Loader: $(LOADER_EFI)" @echo " Kernel: $(KERNEL_ELF)" @@ -611,13 +635,13 @@ all: include/version.h $(CAPSULE_GENERATED_OBJ) $(CAPSULE_GENERATED_KOBJ) $(LOAD kernel: all kernel-all: - @$(MAKE) -f Makefile.starkernel ARCH=amd64 TARGET=$(TARGET) - @$(MAKE) -f Makefile.starkernel ARCH=aarch64 TARGET=$(TARGET) - @$(MAKE) -f Makefile.starkernel ARCH=riscv64 TARGET=$(TARGET) + @$(MAKE) -f kernel/Makefile ARCH=amd64 TARGET=$(TARGET) + @$(MAKE) -f kernel/Makefile ARCH=aarch64 TARGET=$(TARGET) + @$(MAKE) -f kernel/Makefile ARCH=riscv64 TARGET=$(TARGET) clean: rm -rf build/$(ARCH)/$(TARGET) - rm -f include/version.h + rm -f v3/include/version.h clean-kernel: @echo "Cleaning all StarKernel build artifacts..." @@ -636,8 +660,8 @@ FORCE: # here after a hosted `make` run silently reuses that stale/wrong-flavored file # and fails with "LITHOS_VERSION_STR undeclared" deep in kernel_main.c, instead # of regenerating its own correct version. -include/version.h: FORCE - @mkdir -p include +v3/include/version.h: FORCE + @mkdir -p v3/include @BUILD_TS=$$(date -Iseconds 2>/dev/null || echo "unknown"); \ printf '#ifndef STARFORTH_VERSION_H\n#define STARFORTH_VERSION_H\n\n' > $@; \ printf '#define STARFORTH_VERSION "%s"\n' "$(VERSION)" >> $@; \ @@ -653,7 +677,7 @@ include/version.h: FORCE $(MKCAPSULE_BIN): $(MKCAPSULE_SRC) @mkdir -p $(dir $@) @echo "HOSTCC $(MKCAPSULE_SRC)" - @cc -std=c99 -Wall -Wextra -O2 -Iinclude -Itools -o $@ $(MKCAPSULE_SRC) + @cc -std=c99 -Wall -Wextra -O2 -Iv3/include -Ikernel/include -Itools -o $@ $(MKCAPSULE_SRC) # Generate capsule_generated.c from capsules/ CAPSULE_SRCS := $(shell find $(CAPSULES_DIR) -type f ! -name '.*' 2>/dev/null) @@ -695,12 +719,12 @@ $(LOADER_OBJ_DIR)/%.o: $(KERNEL_SRC)/%.c | $(LOADER_OBJ_DIR) @$(LOADER_CC) $(LOADER_CFLAGS) -c $< -o $@ # Compile loader VM core sources -$(LOADER_OBJ_DIR)/vmcore/%.o: src/%.c include/version.h | $(LOADER_OBJ_DIR) +$(LOADER_OBJ_DIR)/vmcore/%.o: v3/src/%.c v3/include/version.h | $(LOADER_OBJ_DIR) @mkdir -p $(dir $@) @echo "CC (loader) $<" ifeq ($(ARCH),aarch64) @$(LOADER_CC) $(LOADER_CFLAGS) \ - -Iinclude -I. -Isrc/test_runner/include \ + -Iv3/include -Ikernel/include -I. -Iv3/src/test_runner/include \ -Wno-error=unused-parameter -Wno-error=shift-negative-value \ -Wno-error=sign-compare -Wno-error=missing-field-initializers \ -Wno-unused-function \ @@ -722,10 +746,10 @@ $(KERNEL_OBJ_DIR)/%.o: $(KERNEL_SRC)/%.c | $(KERNEL_OBJ_DIR) @$(CC) $(KERNEL_CFLAGS) -c $< -o $@ # Compile kernel VM core sources -$(KERNEL_OBJ_DIR)/vmcore/%.o: src/%.c include/version.h | $(KERNEL_OBJ_DIR) +$(KERNEL_OBJ_DIR)/vmcore/%.o: v3/src/%.c v3/include/version.h | $(KERNEL_OBJ_DIR) @mkdir -p $(dir $@) @echo "CC (kernel) $<" - @$(CC) $(VMCORE_CFLAGS_COMMON) $(filter-out -I$(KERNEL_INC),$(KERNEL_CFLAGS)) -Isrc/starkernel/vm -c $< -o $@ + @$(CC) $(VMCORE_CFLAGS_COMMON) $(filter-out -I$(KERNEL_INC),$(KERNEL_CFLAGS)) -Ikernel/src/vm -c $< -o $@ # Compile kernel assembly sources $(KERNEL_OBJ_DIR)/%.o: $(KERNEL_SRC)/%.S | $(KERNEL_OBJ_DIR) @@ -802,7 +826,7 @@ OVMF_CODE := /usr/share/OVMF/OVMF_CODE_4M.fd OVMF_VARS_RO := /usr/share/OVMF/OVMF_VARS_4M.fd # QEMU_DISPLAY — window backend for the framebuffer console (gtk/sdl/none/...). -# Usage: make -f Makefile.starkernel qemu QEMU_DISPLAY=none # headless/CI +# Usage: make -f kernel/Makefile qemu QEMU_DISPLAY=none # headless/CI QEMU_DISPLAY ?= gtk # QEMU_EXTRA — extra raw qemu-system-* args appended verbatim to every arch's @@ -1072,38 +1096,98 @@ else ifeq ($(ARCH),riscv64) # fallback boot path EFI/BOOT/BOOT.EFI. Storage on real hardware is the # USB BOT/xHCI path (already live), not virtio. thumbdrive: all - @mkdir -p $(BUILD_DIR) - @if ! which sgdisk >/dev/null 2>&1; then echo "Error: sgdisk not found. Install gdisk (apt-get install gdisk)."; exit 1; fi - @if ! which mkfs.fat >/dev/null 2>&1; then echo "Error: mkfs.fat not found. Install dosfstools (apt-get install dosfstools)."; exit 1; fi - @case "$(ARCH)" in \ - amd64) BOOTNAME="BOOTX64.EFI" ;; \ - aarch64) BOOTNAME="BOOTAA64.EFI" ;; \ - riscv64) BOOTNAME="BOOTRISCV64.EFI" ;; \ - *) echo "Error: no thumbdrive EFI boot name for ARCH=$(ARCH)"; exit 1 ;; \ - esac; \ - # Geometry: 128 MiB disk (262144 sectors), GPT partition 1 spans sectors \ - # 2048..262110 (the GPT last-usable sector for this disk size), i.e. \ - # 260063 sectors. The FAT32 ESP image MUST match the partition size \ - # exactly; a larger ESP overruns the disk (GPT grows corrupt) or \ - # spills past the partition end, both of which made earlier builds \ - # unbootable on hardware. \ - DISK=$(BUILD_DIR)/starkernel-thumbdrive.img; \ - ESP_SECTORS=260063; \ - rm -f $$DISK $(BUILD_DIR)/thumbdrive-esp.img; \ - dd if=/dev/zero of=$(BUILD_DIR)/thumbdrive-esp.img bs=512 count=$$ESP_SECTORS 2>/dev/null; \ - mkfs.fat -F 32 -n "STARKERNEL" $(BUILD_DIR)/thumbdrive-esp.img >/dev/null 2>&1; \ - mmd -i $(BUILD_DIR)/thumbdrive-esp.img ::/EFI; \ - mmd -i $(BUILD_DIR)/thumbdrive-esp.img ::/EFI/BOOT; \ - mcopy -i $(BUILD_DIR)/thumbdrive-esp.img $(LOADER_EFI) ::/EFI/BOOT/$$BOOTNAME; \ - printf 'FS0:\\EFI\\BOOT\\%s\r\n' "$$BOOTNAME" > $(BUILD_DIR)/thumbdrive-startup.nsh; \ - mcopy -i $(BUILD_DIR)/thumbdrive-esp.img $(BUILD_DIR)/thumbdrive-startup.nsh ::/startup.nsh; \ - dd if=/dev/zero of=$$DISK bs=1M count=128 2>/dev/null; \ - sgdisk -n 1:2048:0 -t 1:ef00 -c 1:"EFI System" $$DISK >/dev/null 2>&1; \ - dd if=$(BUILD_DIR)/thumbdrive-esp.img of=$$DISK bs=512 seek=2048 conv=notrunc 2>/dev/null; \ - rm -f $(BUILD_DIR)/thumbdrive-esp.img $(BUILD_DIR)/thumbdrive-startup.nsh; \ - echo "Thumbdrive image: $$DISK"; \ - echo "Write to a USB stick with: dd if=$$DISK of=/dev/sdX bs=4M status=progress" + @printf 'FS0:\\EFI\\BOOT\\%s\r\n' "$(EFI_BOOTNAME)" > $(BUILD_DIR)/thumbdrive-startup.nsh + @bash scripts/mkdiskimage.sh --out $(BUILD_DIR)/starkernel-thumbdrive.img --table gpt \ + --size-mib 128 --label STARKERNEL \ + $(LOADER_EFI):/EFI/BOOT/$(EFI_BOOTNAME) \ + $(BUILD_DIR)/thumbdrive-startup.nsh:/startup.nsh + @rm -f $(BUILD_DIR)/thumbdrive-startup.nsh + @echo "Write to a USB stick with: dd if=$(BUILD_DIR)/starkernel-thumbdrive.img of=/dev/sdX bs=4M status=progress" +# ============================================================================== +# BOOT IMAGES (one per board) +# ============================================================================== +# boot_image -- the single file written to a board's boot medium. Driven by +# BOARD (boards//board.mk); normally invoked from the repo root as +# make boot_image TARGET=SER5|RASPI|MILKV|ZYNQ7020 +# Output: build/boards//$(BOARD_IMAGE). +# +# BOARD_BOOT selects the recipe: +# uefi-esp -- GPT disk, one FAT32 EFI System Partition holding the +# monolithic loader as EFI/BOOT/BOOT.EFI (+ startup.nsh +# for the UEFI shell, + starforth.cfg when KERNEL_ARGS is set). +# Real UEFI firmware (SER5) and U-Boot's bootefi (Milk-V) both +# boot it through the removable-media fallback path. +# rpi-native -- MBR disk, one FAT32 (LBA) partition holding config.txt, +# kernel_2712.img (kernel relinked at 0x80000 and flattened) +# and the stock BCM2712 DTB (+ cmdline.txt, which firmware +# copies into /chosen/bootargs, when KERNEL_ARGS is set). +ifeq ($(ARCH),amd64) +EFI_BOOTNAME := BOOTX64.EFI +else ifeq ($(ARCH),aarch64) +EFI_BOOTNAME := BOOTAA64.EFI +else ifeq ($(ARCH),riscv64) +EFI_BOOTNAME := BOOTRISCV64.EFI +endif + +RPI5_NATIVE_LINKER_SCRIPT := kernel/linker/starkernel-native-rpi5.ld +RPI5_NATIVE_ELF := $(BUILD_DIR)/starkernel_rpi5.elf +RPI5_NATIVE_IMG := $(BUILD_DIR)/kernel_2712.img + +$(RPI5_NATIVE_ELF): $(KERNEL_OBJS) $(RPI5_NATIVE_LINKER_SCRIPT) | $(BUILD_DIR) + @echo "LD (rpi5 native) $@" + @$(LD) -T $(RPI5_NATIVE_LINKER_SCRIPT) -nostdlib --build-id=none \ + -e rpi5_native_start $(KERNEL_OBJS) -o $@ + +$(RPI5_NATIVE_IMG): $(RPI5_NATIVE_ELF) + @echo "OBJCOPY (raw) $@" + @$(OBJCOPY) -O binary $< $@ + +.PHONY: boot_image +ifeq ($(strip $(BOARD)),) +boot_image: + @echo "boot_image needs a board. From the repo root:" + @echo " make boot_image TARGET=SER5|RASPI|MILKV|ZYNQ7020" + @exit 1 +else ifeq ($(BOARD_BOOT),uefi-esp) +boot_image: all + @mkdir -p $(BOARD_OUT) + @printf 'FS0:\\EFI\\BOOT\\%s\r\n' "$(EFI_BOOTNAME)" > $(BOARD_OUT)/startup.nsh + @rm -f $(BOARD_OUT)/starforth.cfg + $(if $(KERNEL_ARGS),@printf '%s\n' '$(KERNEL_ARGS)' > $(BOARD_OUT)/starforth.cfg) + @bash scripts/mkdiskimage.sh --out $(BOARD_OUT)/$(BOARD_IMAGE) --table gpt \ + --size-mib $(BOOT_IMAGE_SIZE_MIB) --label LITHOS \ + $(LOADER_EFI):/EFI/BOOT/$(EFI_BOOTNAME) \ + $(BOARD_OUT)/startup.nsh:/startup.nsh \ + $(if $(KERNEL_ARGS),$(BOARD_OUT)/starforth.cfg:/starforth.cfg) + @echo "$(BOARD_DESC)" + @echo "Write with: dd if=$(BOARD_OUT)/$(BOARD_IMAGE) of=/dev/sdX bs=4M conv=fsync status=progress" +else ifeq ($(BOARD_BOOT),rpi-native) +$(RPI5_DTB): + @mkdir -p $(dir $@) + @echo " FETCH $(RPI5_DTB_URL)" + @curl -fsSL -o $@.tmp $(RPI5_DTB_URL) || { rm -f $@.tmp; \ + echo "Error: could not fetch the Pi 5 DTB. Copy bcm2712-rpi-5-b.dtb from a Raspberry Pi"; \ + echo "firmware release and pass RPI5_DTB=/path/to/bcm2712-rpi-5-b.dtb"; exit 1; } + @mv $@.tmp $@ + +boot_image: v3/include/version.h $(RPI5_NATIVE_IMG) $(RPI5_DTB) + @mkdir -p $(BOARD_OUT) + @rm -f $(BOARD_OUT)/cmdline.txt + $(if $(KERNEL_ARGS),@printf '%s\n' '$(KERNEL_ARGS)' > $(BOARD_OUT)/cmdline.txt) + @bash scripts/mkdiskimage.sh --out $(BOARD_OUT)/$(BOARD_IMAGE) --table mbr \ + --size-mib $(BOOT_IMAGE_SIZE_MIB) --label LITHOS \ + boards/$(BOARD)/config.txt:/config.txt \ + $(RPI5_NATIVE_IMG):/kernel_2712.img \ + $(RPI5_DTB):/bcm2712-rpi-5-b.dtb \ + $(if $(KERNEL_ARGS),$(BOARD_OUT)/cmdline.txt:/cmdline.txt) + @echo "$(BOARD_DESC)" + @echo "Write with: dd if=$(BOARD_OUT)/$(BOARD_IMAGE) of=/dev/mmcblkX bs=4M conv=fsync status=progress" +else +boot_image: + @echo "Error: BOARD=$(BOARD) has BOARD_BOOT='$(BOARD_BOOT)', which has no boot_image recipe" + @exit 1 +endif # iso-usb — build a PURE UEFI isohybrid ISO for the Iso Image Writer workflow # (GNOME Disks "Restore Disk Image...", or dd). Writes a single .iso to a USB @@ -1150,7 +1234,7 @@ iso-usb: all # yourself with Ctrl-A X or by closing the window). # amd64/aarch64: serial → stdio (bidirectional, you can type into the REPL); # riscv64: uses proper GPT (esp dir not supported) -qemu-esp: include/version.h $(LOADER_EFI) $(KERNEL_ELF) +qemu-esp: v3/include/version.h $(LOADER_EFI) $(KERNEL_ELF) ifeq ($(ARCH),amd64) @rm -rf $(BUILD_DIR)/esp @mkdir -p $(BUILD_DIR)/esp/EFI/BOOT @@ -1206,7 +1290,7 @@ else ifeq ($(ARCH),riscv64) endif # qemu-gdb — launch QEMU with GDB stub on port 1234 -qemu-gdb: include/version.h $(LOADER_EFI) $(KERNEL_ELF) +qemu-gdb: v3/include/version.h $(LOADER_EFI) $(KERNEL_ELF) ifeq ($(ARCH),amd64) @mkdir -p $(BUILD_DIR)/esp/EFI/BOOT @cp $(LOADER_EFI) $(BUILD_DIR)/esp/EFI/BOOT/BOOTX64.EFI @@ -1259,7 +1343,7 @@ help: @echo "StarKernel Build System" @echo "=======================" @echo "" - @echo "Usage: make -f Makefile.starkernel [ARCH=] [TARGET=] " + @echo "Usage: make -f kernel/Makefile [ARCH=] [TARGET=] " @echo "" @echo "Architectures (aliases accepted):" @echo " ARCH=amd64 / x86_64 — x86-64 (default on x86 host)" @@ -1289,8 +1373,8 @@ help: @echo " help — show this message" @echo "" @echo "Examples:" - @echo " make -f Makefile.starkernel ARCH=amd64 qemu" - @echo " make -f Makefile.starkernel ARCH=aarch64 clean qemu" - @echo " make -f Makefile.starkernel ARCH=riscv64 clean qemu" - @echo " make -f Makefile.starkernel ARCH=x86_64 qemu # alias works" - @echo " make -f Makefile.starkernel kernel-all" + @echo " make -f kernel/Makefile ARCH=amd64 qemu" + @echo " make -f kernel/Makefile ARCH=aarch64 clean qemu" + @echo " make -f kernel/Makefile ARCH=riscv64 clean qemu" + @echo " make -f kernel/Makefile ARCH=x86_64 qemu # alias works" + @echo " make -f kernel/Makefile kernel-all" diff --git a/include/starkernel/README.md b/kernel/include/starkernel/README.md similarity index 100% rename from include/starkernel/README.md rename to kernel/include/starkernel/README.md diff --git a/include/starkernel/apic.h b/kernel/include/starkernel/apic.h similarity index 100% rename from include/starkernel/apic.h rename to kernel/include/starkernel/apic.h diff --git a/include/starkernel/arch.h b/kernel/include/starkernel/arch.h similarity index 100% rename from include/starkernel/arch.h rename to kernel/include/starkernel/arch.h diff --git a/include/starkernel/artemis_sig.h b/kernel/include/starkernel/artemis_sig.h similarity index 100% rename from include/starkernel/artemis_sig.h rename to kernel/include/starkernel/artemis_sig.h diff --git a/include/starkernel/blkio_usb.h b/kernel/include/starkernel/blkio_usb.h similarity index 100% rename from include/starkernel/blkio_usb.h rename to kernel/include/starkernel/blkio_usb.h diff --git a/include/starkernel/boot_info_offsets.h b/kernel/include/starkernel/boot_info_offsets.h similarity index 100% rename from include/starkernel/boot_info_offsets.h rename to kernel/include/starkernel/boot_info_offsets.h diff --git a/include/starkernel/capsule.h b/kernel/include/starkernel/capsule.h similarity index 100% rename from include/starkernel/capsule.h rename to kernel/include/starkernel/capsule.h diff --git a/include/starkernel/capsule_birth.h b/kernel/include/starkernel/capsule_birth.h similarity index 100% rename from include/starkernel/capsule_birth.h rename to kernel/include/starkernel/capsule_birth.h diff --git a/include/starkernel/capsule_console.h b/kernel/include/starkernel/capsule_console.h similarity index 100% rename from include/starkernel/capsule_console.h rename to kernel/include/starkernel/capsule_console.h diff --git a/include/starkernel/capsule_generated.h b/kernel/include/starkernel/capsule_generated.h similarity index 100% rename from include/starkernel/capsule_generated.h rename to kernel/include/starkernel/capsule_generated.h diff --git a/include/starkernel/capsule_loader.h b/kernel/include/starkernel/capsule_loader.h similarity index 100% rename from include/starkernel/capsule_loader.h rename to kernel/include/starkernel/capsule_loader.h diff --git a/include/starkernel/capsule_mint.h b/kernel/include/starkernel/capsule_mint.h similarity index 100% rename from include/starkernel/capsule_mint.h rename to kernel/include/starkernel/capsule_mint.h diff --git a/include/starkernel/capsule_run.h b/kernel/include/starkernel/capsule_run.h similarity index 100% rename from include/starkernel/capsule_run.h rename to kernel/include/starkernel/capsule_run.h diff --git a/include/starkernel/capsule_runcap.h b/kernel/include/starkernel/capsule_runcap.h similarity index 100% rename from include/starkernel/capsule_runcap.h rename to kernel/include/starkernel/capsule_runcap.h diff --git a/include/starkernel/capsule_sig.h b/kernel/include/starkernel/capsule_sig.h similarity index 100% rename from include/starkernel/capsule_sig.h rename to kernel/include/starkernel/capsule_sig.h diff --git a/include/starkernel/capsule_vm_physics.h b/kernel/include/starkernel/capsule_vm_physics.h similarity index 100% rename from include/starkernel/capsule_vm_physics.h rename to kernel/include/starkernel/capsule_vm_physics.h diff --git a/include/starkernel/capsule_vm_switch_signal.h b/kernel/include/starkernel/capsule_vm_switch_signal.h similarity index 100% rename from include/starkernel/capsule_vm_switch_signal.h rename to kernel/include/starkernel/capsule_vm_switch_signal.h diff --git a/include/starkernel/capsule_wirebind.h b/kernel/include/starkernel/capsule_wirebind.h similarity index 100% rename from include/starkernel/capsule_wirebind.h rename to kernel/include/starkernel/capsule_wirebind.h diff --git a/include/starkernel/capsule_zuse_boot.h b/kernel/include/starkernel/capsule_zuse_boot.h similarity index 100% rename from include/starkernel/capsule_zuse_boot.h rename to kernel/include/starkernel/capsule_zuse_boot.h diff --git a/include/starkernel/cmdline.h b/kernel/include/starkernel/cmdline.h similarity index 100% rename from include/starkernel/cmdline.h rename to kernel/include/starkernel/cmdline.h diff --git a/include/starkernel/console.h b/kernel/include/starkernel/console.h similarity index 100% rename from include/starkernel/console.h rename to kernel/include/starkernel/console.h diff --git a/include/starkernel/doe_log.h b/kernel/include/starkernel/doe_log.h similarity index 100% rename from include/starkernel/doe_log.h rename to kernel/include/starkernel/doe_log.h diff --git a/include/starkernel/ed25519.h b/kernel/include/starkernel/ed25519.h similarity index 100% rename from include/starkernel/ed25519.h rename to kernel/include/starkernel/ed25519.h diff --git a/include/starkernel/elf64.h b/kernel/include/starkernel/elf64.h similarity index 100% rename from include/starkernel/elf64.h rename to kernel/include/starkernel/elf64.h diff --git a/include/starkernel/elf_loader.h b/kernel/include/starkernel/elf_loader.h similarity index 100% rename from include/starkernel/elf_loader.h rename to kernel/include/starkernel/elf_loader.h diff --git a/include/starkernel/fdt.h b/kernel/include/starkernel/fdt.h similarity index 100% rename from include/starkernel/fdt.h rename to kernel/include/starkernel/fdt.h diff --git a/include/starkernel/fe25519.h b/kernel/include/starkernel/fe25519.h similarity index 100% rename from include/starkernel/fe25519.h rename to kernel/include/starkernel/fe25519.h diff --git a/include/starkernel/framebuffer.h b/kernel/include/starkernel/framebuffer.h similarity index 100% rename from include/starkernel/framebuffer.h rename to kernel/include/starkernel/framebuffer.h diff --git a/include/starkernel/freestanding/README.md b/kernel/include/starkernel/freestanding/README.md similarity index 100% rename from include/starkernel/freestanding/README.md rename to kernel/include/starkernel/freestanding/README.md diff --git a/include/starkernel/freestanding/assert.h b/kernel/include/starkernel/freestanding/assert.h similarity index 100% rename from include/starkernel/freestanding/assert.h rename to kernel/include/starkernel/freestanding/assert.h diff --git a/include/starkernel/freestanding/ctype.h b/kernel/include/starkernel/freestanding/ctype.h similarity index 100% rename from include/starkernel/freestanding/ctype.h rename to kernel/include/starkernel/freestanding/ctype.h diff --git a/include/starkernel/freestanding/errno.h b/kernel/include/starkernel/freestanding/errno.h similarity index 100% rename from include/starkernel/freestanding/errno.h rename to kernel/include/starkernel/freestanding/errno.h diff --git a/include/starkernel/freestanding/inttypes.h b/kernel/include/starkernel/freestanding/inttypes.h similarity index 100% rename from include/starkernel/freestanding/inttypes.h rename to kernel/include/starkernel/freestanding/inttypes.h diff --git a/include/starkernel/freestanding/math.h b/kernel/include/starkernel/freestanding/math.h similarity index 100% rename from include/starkernel/freestanding/math.h rename to kernel/include/starkernel/freestanding/math.h diff --git a/include/starkernel/freestanding/sched.h b/kernel/include/starkernel/freestanding/sched.h similarity index 100% rename from include/starkernel/freestanding/sched.h rename to kernel/include/starkernel/freestanding/sched.h diff --git a/include/starkernel/freestanding/signal.h b/kernel/include/starkernel/freestanding/signal.h similarity index 100% rename from include/starkernel/freestanding/signal.h rename to kernel/include/starkernel/freestanding/signal.h diff --git a/include/starkernel/freestanding/stdio.h b/kernel/include/starkernel/freestanding/stdio.h similarity index 100% rename from include/starkernel/freestanding/stdio.h rename to kernel/include/starkernel/freestanding/stdio.h diff --git a/include/starkernel/freestanding/stdlib.h b/kernel/include/starkernel/freestanding/stdlib.h similarity index 100% rename from include/starkernel/freestanding/stdlib.h rename to kernel/include/starkernel/freestanding/stdlib.h diff --git a/include/starkernel/freestanding/string.h b/kernel/include/starkernel/freestanding/string.h similarity index 100% rename from include/starkernel/freestanding/string.h rename to kernel/include/starkernel/freestanding/string.h diff --git a/include/starkernel/freestanding/sys/README.md b/kernel/include/starkernel/freestanding/sys/README.md similarity index 100% rename from include/starkernel/freestanding/sys/README.md rename to kernel/include/starkernel/freestanding/sys/README.md diff --git a/include/starkernel/freestanding/sys/time.h b/kernel/include/starkernel/freestanding/sys/time.h similarity index 100% rename from include/starkernel/freestanding/sys/time.h rename to kernel/include/starkernel/freestanding/sys/time.h diff --git a/include/starkernel/freestanding/sys/types.h b/kernel/include/starkernel/freestanding/sys/types.h similarity index 100% rename from include/starkernel/freestanding/sys/types.h rename to kernel/include/starkernel/freestanding/sys/types.h diff --git a/include/starkernel/freestanding/time.h b/kernel/include/starkernel/freestanding/time.h similarity index 100% rename from include/starkernel/freestanding/time.h rename to kernel/include/starkernel/freestanding/time.h diff --git a/include/starkernel/hal/README.md b/kernel/include/starkernel/hal/README.md similarity index 100% rename from include/starkernel/hal/README.md rename to kernel/include/starkernel/hal/README.md diff --git a/include/starkernel/hal/hal.h b/kernel/include/starkernel/hal/hal.h similarity index 100% rename from include/starkernel/hal/hal.h rename to kernel/include/starkernel/hal/hal.h diff --git a/include/starkernel/hal_memory.h b/kernel/include/starkernel/hal_memory.h similarity index 100% rename from include/starkernel/hal_memory.h rename to kernel/include/starkernel/hal_memory.h diff --git a/include/starkernel/homeblocks_sig.h b/kernel/include/starkernel/homeblocks_sig.h similarity index 100% rename from include/starkernel/homeblocks_sig.h rename to kernel/include/starkernel/homeblocks_sig.h diff --git a/include/starkernel/i8042.h b/kernel/include/starkernel/i8042.h similarity index 100% rename from include/starkernel/i8042.h rename to kernel/include/starkernel/i8042.h diff --git a/include/starkernel/ioapic.h b/kernel/include/starkernel/ioapic.h similarity index 100% rename from include/starkernel/ioapic.h rename to kernel/include/starkernel/ioapic.h diff --git a/include/starkernel/kernel_args.h b/kernel/include/starkernel/kernel_args.h similarity index 100% rename from include/starkernel/kernel_args.h rename to kernel/include/starkernel/kernel_args.h diff --git a/include/starkernel/kmalloc.h b/kernel/include/starkernel/kmalloc.h similarity index 100% rename from include/starkernel/kmalloc.h rename to kernel/include/starkernel/kmalloc.h diff --git a/include/starkernel/log.h b/kernel/include/starkernel/log.h similarity index 100% rename from include/starkernel/log.h rename to kernel/include/starkernel/log.h diff --git a/include/starkernel/log_attrib.h b/kernel/include/starkernel/log_attrib.h similarity index 100% rename from include/starkernel/log_attrib.h rename to kernel/include/starkernel/log_attrib.h diff --git a/include/starkernel/log_region.h b/kernel/include/starkernel/log_region.h similarity index 100% rename from include/starkernel/log_region.h rename to kernel/include/starkernel/log_region.h diff --git a/include/starkernel/pci.h b/kernel/include/starkernel/pci.h similarity index 100% rename from include/starkernel/pci.h rename to kernel/include/starkernel/pci.h diff --git a/include/starkernel/plic.h b/kernel/include/starkernel/plic.h similarity index 100% rename from include/starkernel/plic.h rename to kernel/include/starkernel/plic.h diff --git a/include/starkernel/pmm.h b/kernel/include/starkernel/pmm.h similarity index 100% rename from include/starkernel/pmm.h rename to kernel/include/starkernel/pmm.h diff --git a/include/starkernel/q48_16.h b/kernel/include/starkernel/q48_16.h similarity index 100% rename from include/starkernel/q48_16.h rename to kernel/include/starkernel/q48_16.h diff --git a/include/starkernel/repl.h b/kernel/include/starkernel/repl.h similarity index 100% rename from include/starkernel/repl.h rename to kernel/include/starkernel/repl.h diff --git a/include/starkernel/rng.h b/kernel/include/starkernel/rng.h similarity index 100% rename from include/starkernel/rng.h rename to kernel/include/starkernel/rng.h diff --git a/include/starkernel/rpi5_dtb.h b/kernel/include/starkernel/rpi5_dtb.h similarity index 100% rename from include/starkernel/rpi5_dtb.h rename to kernel/include/starkernel/rpi5_dtb.h diff --git a/include/starkernel/rpi5_mailbox.h b/kernel/include/starkernel/rpi5_mailbox.h similarity index 100% rename from include/starkernel/rpi5_mailbox.h rename to kernel/include/starkernel/rpi5_mailbox.h diff --git a/include/starkernel/rpi5_native_boot.h b/kernel/include/starkernel/rpi5_native_boot.h similarity index 100% rename from include/starkernel/rpi5_native_boot.h rename to kernel/include/starkernel/rpi5_native_boot.h diff --git a/include/starkernel/rpi5_native_entry.h b/kernel/include/starkernel/rpi5_native_entry.h similarity index 100% rename from include/starkernel/rpi5_native_entry.h rename to kernel/include/starkernel/rpi5_native_entry.h diff --git a/include/starkernel/scalar25519.h b/kernel/include/starkernel/scalar25519.h similarity index 100% rename from include/starkernel/scalar25519.h rename to kernel/include/starkernel/scalar25519.h diff --git a/include/starkernel/session.h b/kernel/include/starkernel/session.h similarity index 100% rename from include/starkernel/session.h rename to kernel/include/starkernel/session.h diff --git a/include/starkernel/sha512.h b/kernel/include/starkernel/sha512.h similarity index 100% rename from include/starkernel/sha512.h rename to kernel/include/starkernel/sha512.h diff --git a/include/starkernel/timer.h b/kernel/include/starkernel/timer.h similarity index 100% rename from include/starkernel/timer.h rename to kernel/include/starkernel/timer.h diff --git a/include/starkernel/ttf.h b/kernel/include/starkernel/ttf.h similarity index 100% rename from include/starkernel/ttf.h rename to kernel/include/starkernel/ttf.h diff --git a/include/starkernel/uefi.h b/kernel/include/starkernel/uefi.h similarity index 100% rename from include/starkernel/uefi.h rename to kernel/include/starkernel/uefi.h diff --git a/include/starkernel/user_identity_seed.h b/kernel/include/starkernel/user_identity_seed.h similarity index 100% rename from include/starkernel/user_identity_seed.h rename to kernel/include/starkernel/user_identity_seed.h diff --git a/include/starkernel/virtio_blk.h b/kernel/include/starkernel/virtio_blk.h similarity index 100% rename from include/starkernel/virtio_blk.h rename to kernel/include/starkernel/virtio_blk.h diff --git a/include/starkernel/virtio_input.h b/kernel/include/starkernel/virtio_input.h similarity index 100% rename from include/starkernel/virtio_input.h rename to kernel/include/starkernel/virtio_input.h diff --git a/include/starkernel/virtio_rng.h b/kernel/include/starkernel/virtio_rng.h similarity index 100% rename from include/starkernel/virtio_rng.h rename to kernel/include/starkernel/virtio_rng.h diff --git a/include/starkernel/vm/README.md b/kernel/include/starkernel/vm/README.md similarity index 100% rename from include/starkernel/vm/README.md rename to kernel/include/starkernel/vm/README.md diff --git a/include/starkernel/vm/arena.h b/kernel/include/starkernel/vm/arena.h similarity index 100% rename from include/starkernel/vm/arena.h rename to kernel/include/starkernel/vm/arena.h diff --git a/include/starkernel/vm/bootstrap/README.md b/kernel/include/starkernel/vm/bootstrap/README.md similarity index 100% rename from include/starkernel/vm/bootstrap/README.md rename to kernel/include/starkernel/vm/bootstrap/README.md diff --git a/include/starkernel/vm/bootstrap/sk_vm_bootstrap.h b/kernel/include/starkernel/vm/bootstrap/sk_vm_bootstrap.h similarity index 100% rename from include/starkernel/vm/bootstrap/sk_vm_bootstrap.h rename to kernel/include/starkernel/vm/bootstrap/sk_vm_bootstrap.h diff --git a/include/starkernel/vm/kernel_hermes.h b/kernel/include/starkernel/vm/kernel_hermes.h similarity index 100% rename from include/starkernel/vm/kernel_hermes.h rename to kernel/include/starkernel/vm/kernel_hermes.h diff --git a/include/starkernel/vm/parity.h b/kernel/include/starkernel/vm/parity.h similarity index 100% rename from include/starkernel/vm/parity.h rename to kernel/include/starkernel/vm/parity.h diff --git a/include/starkernel/vm/stadium.h b/kernel/include/starkernel/vm/stadium.h similarity index 100% rename from include/starkernel/vm/stadium.h rename to kernel/include/starkernel/vm/stadium.h diff --git a/include/starkernel/vm/stadium_blocks.h b/kernel/include/starkernel/vm/stadium_blocks.h similarity index 100% rename from include/starkernel/vm/stadium_blocks.h rename to kernel/include/starkernel/vm/stadium_blocks.h diff --git a/include/starkernel/vm/stadium_words.h b/kernel/include/starkernel/vm/stadium_words.h similarity index 100% rename from include/starkernel/vm/stadium_words.h rename to kernel/include/starkernel/vm/stadium_words.h diff --git a/include/starkernel/vm/switch.h b/kernel/include/starkernel/vm/switch.h similarity index 100% rename from include/starkernel/vm/switch.h rename to kernel/include/starkernel/vm/switch.h diff --git a/include/starkernel/vm_identity.h b/kernel/include/starkernel/vm_identity.h similarity index 100% rename from include/starkernel/vm_identity.h rename to kernel/include/starkernel/vm_identity.h diff --git a/include/starkernel/vm_uuid.h b/kernel/include/starkernel/vm_uuid.h similarity index 100% rename from include/starkernel/vm_uuid.h rename to kernel/include/starkernel/vm_uuid.h diff --git a/include/starkernel/vmm.h b/kernel/include/starkernel/vmm.h similarity index 100% rename from include/starkernel/vmm.h rename to kernel/include/starkernel/vmm.h diff --git a/include/starkernel/vt100.h b/kernel/include/starkernel/vt100.h similarity index 100% rename from include/starkernel/vt100.h rename to kernel/include/starkernel/vt100.h diff --git a/include/starkernel/x509_ed25519.h b/kernel/include/starkernel/x509_ed25519.h similarity index 100% rename from include/starkernel/x509_ed25519.h rename to kernel/include/starkernel/x509_ed25519.h diff --git a/include/starkernel/xhci.h b/kernel/include/starkernel/xhci.h similarity index 100% rename from include/starkernel/xhci.h rename to kernel/include/starkernel/xhci.h diff --git a/include/starkernel/xhci_driver.h b/kernel/include/starkernel/xhci_driver.h similarity index 100% rename from include/starkernel/xhci_driver.h rename to kernel/include/starkernel/xhci_driver.h diff --git a/include/starkernel/xxhash64.h b/kernel/include/starkernel/xxhash64.h similarity index 100% rename from include/starkernel/xxhash64.h rename to kernel/include/starkernel/xxhash64.h diff --git a/include/starkernel/zuse_cert_devblock.h b/kernel/include/starkernel/zuse_cert_devblock.h similarity index 100% rename from include/starkernel/zuse_cert_devblock.h rename to kernel/include/starkernel/zuse_cert_devblock.h diff --git a/include/starkernel/zuse_eligibility.h b/kernel/include/starkernel/zuse_eligibility.h similarity index 100% rename from include/starkernel/zuse_eligibility.h rename to kernel/include/starkernel/zuse_eligibility.h diff --git a/include/starkernel/zuse_eligibility_list.h b/kernel/include/starkernel/zuse_eligibility_list.h similarity index 100% rename from include/starkernel/zuse_eligibility_list.h rename to kernel/include/starkernel/zuse_eligibility_list.h diff --git a/include/starkernel/zuse_genesis_marker.h b/kernel/include/starkernel/zuse_genesis_marker.h similarity index 100% rename from include/starkernel/zuse_genesis_marker.h rename to kernel/include/starkernel/zuse_genesis_marker.h diff --git a/linker/README.md b/kernel/linker/README.md similarity index 100% rename from linker/README.md rename to kernel/linker/README.md diff --git a/linker/starkernel-amd64.ld b/kernel/linker/starkernel-amd64.ld similarity index 100% rename from linker/starkernel-amd64.ld rename to kernel/linker/starkernel-amd64.ld diff --git a/linker/starkernel-kernel-aarch64.ld b/kernel/linker/starkernel-kernel-aarch64.ld similarity index 100% rename from linker/starkernel-kernel-aarch64.ld rename to kernel/linker/starkernel-kernel-aarch64.ld diff --git a/linker/starkernel-kernel-amd64.ld b/kernel/linker/starkernel-kernel-amd64.ld similarity index 100% rename from linker/starkernel-kernel-amd64.ld rename to kernel/linker/starkernel-kernel-amd64.ld diff --git a/linker/starkernel-kernel-riscv64.ld b/kernel/linker/starkernel-kernel-riscv64.ld similarity index 100% rename from linker/starkernel-kernel-riscv64.ld rename to kernel/linker/starkernel-kernel-riscv64.ld diff --git a/linker/starkernel-loader-aarch64-pe.ld b/kernel/linker/starkernel-loader-aarch64-pe.ld similarity index 100% rename from linker/starkernel-loader-aarch64-pe.ld rename to kernel/linker/starkernel-loader-aarch64-pe.ld diff --git a/linker/starkernel-loader-aarch64.ld b/kernel/linker/starkernel-loader-aarch64.ld similarity index 100% rename from linker/starkernel-loader-aarch64.ld rename to kernel/linker/starkernel-loader-aarch64.ld diff --git a/linker/starkernel-loader-amd64-pe.ld b/kernel/linker/starkernel-loader-amd64-pe.ld similarity index 100% rename from linker/starkernel-loader-amd64-pe.ld rename to kernel/linker/starkernel-loader-amd64-pe.ld diff --git a/linker/starkernel-loader-amd64.ld b/kernel/linker/starkernel-loader-amd64.ld similarity index 100% rename from linker/starkernel-loader-amd64.ld rename to kernel/linker/starkernel-loader-amd64.ld diff --git a/linker/starkernel-loader-riscv64.ld b/kernel/linker/starkernel-loader-riscv64.ld similarity index 100% rename from linker/starkernel-loader-riscv64.ld rename to kernel/linker/starkernel-loader-riscv64.ld diff --git a/kernel/linker/starkernel-native-rpi5.ld b/kernel/linker/starkernel-native-rpi5.ld new file mode 100644 index 00000000..7a9c6b9e --- /dev/null +++ b/kernel/linker/starkernel-native-rpi5.ld @@ -0,0 +1,74 @@ +/* Linker script for the Raspberry Pi 5 native (non-UEFI) kernel image. + * + * Linked from the same objects as the aarch64 kernel ELF, entered at + * rpi5_native_start (arch/aarch64/native_rpi5_entry.S, section + * .text.entry -- placed first so it sits at the load address), then + * flattened with `objcopy -O binary` into kernel_2712.img. + * + * Load address 0x80000 must match boards/raspi/config.txt's + * kernel_address=0x80000: Pi 5 firmware's own default for + * kernel_2712.img is 0x200000, so the address is pinned on both sides + * rather than left to the firmware default. + * + * __kernel_start/__kernel_end span the whole image including .bss so + * pmm_init() reserves every page the image occupies (aarch64 boot.S's + * zero-length substitutes are only correct for the UEFI loader path, + * where UEFI owns the image pages). __bss_start/__bss_end are 16-byte + * aligned for the entry stub's zeroing loop: firmware does not clear + * memory past the end of the file it loads. + */ + +OUTPUT_FORMAT("elf64-littleaarch64") +OUTPUT_ARCH(aarch64) +ENTRY(rpi5_native_start) + +SECTIONS +{ + . = 0x80000; + + __kernel_start = .; + + .text : { + __text_start = .; + KEEP(*(.text.entry)) + *(.text .text.*) + __text_end = .; + } + + .rodata : ALIGN(4K) { + __rodata_start = .; + *(.rodata .rodata.*) + __rodata_end = .; + } + + .data : ALIGN(4K) { + __data_start = .; + *(.data .data.*) + *(.got .got.*) + __data_end = .; + } + + .rela.dyn : ALIGN(8) { + *(.rela .rela.*) + } + + .bss (NOLOAD) : ALIGN(4K) { + __bss_start = .; + *(.bss .bss.*) + *(COMMON) + . = ALIGN(16); + __bss_end = .; + } + + . = ALIGN(4K); + __kernel_end = .; + + /DISCARD/ : { + *(.comment) + *(.note*) + *(.eh_frame) + *(.dynamic) + *(.dynsym) + *(.interp) + } +} diff --git a/src/starkernel/README.md b/kernel/src/README.md similarity index 100% rename from src/starkernel/README.md rename to kernel/src/README.md diff --git a/src/starkernel/arch/aarch64/README.md b/kernel/src/arch/aarch64/README.md similarity index 100% rename from src/starkernel/arch/aarch64/README.md rename to kernel/src/arch/aarch64/README.md diff --git a/src/starkernel/arch/aarch64/apic.c b/kernel/src/arch/aarch64/apic.c similarity index 100% rename from src/starkernel/arch/aarch64/apic.c rename to kernel/src/arch/aarch64/apic.c diff --git a/src/starkernel/arch/aarch64/arch.c b/kernel/src/arch/aarch64/arch.c similarity index 100% rename from src/starkernel/arch/aarch64/arch.c rename to kernel/src/arch/aarch64/arch.c diff --git a/src/starkernel/arch/aarch64/boot.S b/kernel/src/arch/aarch64/boot.S similarity index 100% rename from src/starkernel/arch/aarch64/boot.S rename to kernel/src/arch/aarch64/boot.S diff --git a/src/starkernel/arch/aarch64/interrupts.c b/kernel/src/arch/aarch64/interrupts.c similarity index 100% rename from src/starkernel/arch/aarch64/interrupts.c rename to kernel/src/arch/aarch64/interrupts.c diff --git a/src/starkernel/arch/aarch64/isr.S b/kernel/src/arch/aarch64/isr.S similarity index 100% rename from src/starkernel/arch/aarch64/isr.S rename to kernel/src/arch/aarch64/isr.S diff --git a/src/starkernel/arch/aarch64/native_rpi5_entry.S b/kernel/src/arch/aarch64/native_rpi5_entry.S similarity index 68% rename from src/starkernel/arch/aarch64/native_rpi5_entry.S rename to kernel/src/arch/aarch64/native_rpi5_entry.S index 728c443e..7260ce9a 100644 --- a/src/starkernel/arch/aarch64/native_rpi5_entry.S +++ b/kernel/src/arch/aarch64/native_rpi5_entry.S @@ -26,16 +26,19 @@ * exists only so this file's own control flow has somewhere defined to * go if that contract is ever violated. * - * Build-system note: `Makefile.starkernel`'s `KERNEL_ASM` wildcards every - * `*.S` file in this directory into the monolithic kernel ELF build (not - * the PE/COFF loader build -- that list is explicit, boot.S/isr.S only, - * see the Makefile), so this file *does* compile and link into the - * existing ARCH=aarch64 QEMU/UEFI acceptance build. Nothing there ever - * branches to `rpi5_native_start` -- it is dead code in that build by - * design, exactly like `rpi5_dtb.c`/`rpi5_mailbox.c` before it. A real, - * separately-linked Pi 5 native boot image (its own linker script placing - * this code at 0x80000) does not exist yet -- that is a build-system task, - * not scoped into this item. + * Build-system note: `kernel/Makefile`'s `KERNEL_ASM` wildcards every + * `*.S` file in this directory into the kernel ELF build (not the PE/COFF + * loader build -- that list is explicit, boot.S/isr.S/switch.S only), so + * this file links into the ARCH=aarch64 QEMU/UEFI kernel ELF as dead + * code, and is the entry point of the separately-linked Pi 5 native + * image (`make boot_image TARGET=RASPI`): + * `kernel/linker/starkernel-native-rpi5.ld` places `.text.entry` first + * at 0x80000 and the image is flattened to `kernel_2712.img`. + * + * Pi 5 firmware loads only the file's bytes; `.bss` (NOLOAD) is whatever + * was in RAM. It is zeroed here, before anything in it -- including + * `g_rpi5_dtb_ptr` and this stub's own stack -- is used. x0 (the DTB + * pointer) is preserved across the loop; only x4-x6 are touched. */ .section .bss @@ -51,7 +54,7 @@ g_rpi5_native_stack: * BSS stacks */ g_rpi5_native_stack_top: - .section .text + .section .text.entry, "ax" .global rpi5_native_start rpi5_native_start: /* Mask x0 to its documented 32-bit DTB-pointer range (§IV.1: the @@ -60,6 +63,19 @@ rpi5_native_start: mov x1, #0xffffffff and x0, x0, x1 + /* Zero .bss: [__bss_start, __bss_end), both 16-byte aligned by the + * native linker script. */ + adrp x4, __bss_start + add x4, x4, :lo12:__bss_start + adrp x5, __bss_end + add x5, x5, :lo12:__bss_end +.Lbss_zero: + cmp x4, x5 + b.hs .Lbss_done + stp xzr, xzr, [x4], #16 + b .Lbss_zero +.Lbss_done: + adrp x2, g_rpi5_dtb_ptr add x2, x2, :lo12:g_rpi5_dtb_ptr str x0, [x2] diff --git a/src/starkernel/arch/aarch64/rpi5_dtb.c b/kernel/src/arch/aarch64/rpi5_dtb.c similarity index 100% rename from src/starkernel/arch/aarch64/rpi5_dtb.c rename to kernel/src/arch/aarch64/rpi5_dtb.c diff --git a/src/starkernel/arch/aarch64/rpi5_mailbox.c b/kernel/src/arch/aarch64/rpi5_mailbox.c similarity index 100% rename from src/starkernel/arch/aarch64/rpi5_mailbox.c rename to kernel/src/arch/aarch64/rpi5_mailbox.c diff --git a/src/starkernel/arch/aarch64/rpi5_native_boot.c b/kernel/src/arch/aarch64/rpi5_native_boot.c similarity index 100% rename from src/starkernel/arch/aarch64/rpi5_native_boot.c rename to kernel/src/arch/aarch64/rpi5_native_boot.c diff --git a/src/starkernel/arch/aarch64/switch.S b/kernel/src/arch/aarch64/switch.S similarity index 100% rename from src/starkernel/arch/aarch64/switch.S rename to kernel/src/arch/aarch64/switch.S diff --git a/src/starkernel/arch/aarch64/timer.c b/kernel/src/arch/aarch64/timer.c similarity index 100% rename from src/starkernel/arch/aarch64/timer.c rename to kernel/src/arch/aarch64/timer.c diff --git a/src/starkernel/arch/amd64/README.md b/kernel/src/arch/amd64/README.md similarity index 100% rename from src/starkernel/arch/amd64/README.md rename to kernel/src/arch/amd64/README.md diff --git a/src/starkernel/arch/amd64/apic.c b/kernel/src/arch/amd64/apic.c similarity index 100% rename from src/starkernel/arch/amd64/apic.c rename to kernel/src/arch/amd64/apic.c diff --git a/src/starkernel/arch/amd64/arch.c b/kernel/src/arch/amd64/arch.c similarity index 100% rename from src/starkernel/arch/amd64/arch.c rename to kernel/src/arch/amd64/arch.c diff --git a/src/starkernel/arch/amd64/boot.S b/kernel/src/arch/amd64/boot.S similarity index 100% rename from src/starkernel/arch/amd64/boot.S rename to kernel/src/arch/amd64/boot.S diff --git a/src/starkernel/arch/amd64/i8042.c b/kernel/src/arch/amd64/i8042.c similarity index 100% rename from src/starkernel/arch/amd64/i8042.c rename to kernel/src/arch/amd64/i8042.c diff --git a/src/starkernel/arch/amd64/interrupts.c b/kernel/src/arch/amd64/interrupts.c similarity index 100% rename from src/starkernel/arch/amd64/interrupts.c rename to kernel/src/arch/amd64/interrupts.c diff --git a/src/starkernel/arch/amd64/ioapic.c b/kernel/src/arch/amd64/ioapic.c similarity index 100% rename from src/starkernel/arch/amd64/ioapic.c rename to kernel/src/arch/amd64/ioapic.c diff --git a/src/starkernel/arch/amd64/isr.S b/kernel/src/arch/amd64/isr.S similarity index 100% rename from src/starkernel/arch/amd64/isr.S rename to kernel/src/arch/amd64/isr.S diff --git a/src/starkernel/arch/amd64/kernel_entry.S b/kernel/src/arch/amd64/kernel_entry.S similarity index 100% rename from src/starkernel/arch/amd64/kernel_entry.S rename to kernel/src/arch/amd64/kernel_entry.S diff --git a/src/starkernel/arch/amd64/switch.S b/kernel/src/arch/amd64/switch.S similarity index 100% rename from src/starkernel/arch/amd64/switch.S rename to kernel/src/arch/amd64/switch.S diff --git a/src/starkernel/arch/amd64/timer.c b/kernel/src/arch/amd64/timer.c similarity index 100% rename from src/starkernel/arch/amd64/timer.c rename to kernel/src/arch/amd64/timer.c diff --git a/src/starkernel/arch/riscv64/README.md b/kernel/src/arch/riscv64/README.md similarity index 100% rename from src/starkernel/arch/riscv64/README.md rename to kernel/src/arch/riscv64/README.md diff --git a/src/starkernel/arch/riscv64/apic.c b/kernel/src/arch/riscv64/apic.c similarity index 100% rename from src/starkernel/arch/riscv64/apic.c rename to kernel/src/arch/riscv64/apic.c diff --git a/src/starkernel/arch/riscv64/arch.c b/kernel/src/arch/riscv64/arch.c similarity index 100% rename from src/starkernel/arch/riscv64/arch.c rename to kernel/src/arch/riscv64/arch.c diff --git a/src/starkernel/arch/riscv64/boot.S b/kernel/src/arch/riscv64/boot.S similarity index 100% rename from src/starkernel/arch/riscv64/boot.S rename to kernel/src/arch/riscv64/boot.S diff --git a/src/starkernel/arch/riscv64/interrupts.c b/kernel/src/arch/riscv64/interrupts.c similarity index 100% rename from src/starkernel/arch/riscv64/interrupts.c rename to kernel/src/arch/riscv64/interrupts.c diff --git a/src/starkernel/arch/riscv64/isr.S b/kernel/src/arch/riscv64/isr.S similarity index 100% rename from src/starkernel/arch/riscv64/isr.S rename to kernel/src/arch/riscv64/isr.S diff --git a/src/starkernel/arch/riscv64/kernel_entry.S b/kernel/src/arch/riscv64/kernel_entry.S similarity index 100% rename from src/starkernel/arch/riscv64/kernel_entry.S rename to kernel/src/arch/riscv64/kernel_entry.S diff --git a/src/starkernel/arch/riscv64/plic.c b/kernel/src/arch/riscv64/plic.c similarity index 100% rename from src/starkernel/arch/riscv64/plic.c rename to kernel/src/arch/riscv64/plic.c diff --git a/src/starkernel/arch/riscv64/switch.S b/kernel/src/arch/riscv64/switch.S similarity index 100% rename from src/starkernel/arch/riscv64/switch.S rename to kernel/src/arch/riscv64/switch.S diff --git a/src/starkernel/arch/riscv64/timer.c b/kernel/src/arch/riscv64/timer.c similarity index 100% rename from src/starkernel/arch/riscv64/timer.c rename to kernel/src/arch/riscv64/timer.c diff --git a/src/starkernel/artemis_sig.c b/kernel/src/artemis_sig.c similarity index 100% rename from src/starkernel/artemis_sig.c rename to kernel/src/artemis_sig.c diff --git a/src/starkernel/boot/README.md b/kernel/src/boot/README.md similarity index 100% rename from src/starkernel/boot/README.md rename to kernel/src/boot/README.md diff --git a/src/starkernel/boot/cmdline.c b/kernel/src/boot/cmdline.c similarity index 100% rename from src/starkernel/boot/cmdline.c rename to kernel/src/boot/cmdline.c diff --git a/src/starkernel/boot/elf_loader.c b/kernel/src/boot/elf_loader.c similarity index 100% rename from src/starkernel/boot/elf_loader.c rename to kernel/src/boot/elf_loader.c diff --git a/src/starkernel/boot/reloc.S b/kernel/src/boot/reloc.S similarity index 100% rename from src/starkernel/boot/reloc.S rename to kernel/src/boot/reloc.S diff --git a/src/starkernel/boot/reloc_stub.c b/kernel/src/boot/reloc_stub.c similarity index 100% rename from src/starkernel/boot/reloc_stub.c rename to kernel/src/boot/reloc_stub.c diff --git a/src/starkernel/boot/uefi_loader.c b/kernel/src/boot/uefi_loader.c similarity index 100% rename from src/starkernel/boot/uefi_loader.c rename to kernel/src/boot/uefi_loader.c diff --git a/src/starkernel/capsule/README.md b/kernel/src/capsule/README.md similarity index 100% rename from src/starkernel/capsule/README.md rename to kernel/src/capsule/README.md diff --git a/src/starkernel/capsule/capsule_birth.c b/kernel/src/capsule/capsule_birth.c similarity index 100% rename from src/starkernel/capsule/capsule_birth.c rename to kernel/src/capsule/capsule_birth.c diff --git a/src/starkernel/capsule/capsule_console.c b/kernel/src/capsule/capsule_console.c similarity index 100% rename from src/starkernel/capsule/capsule_console.c rename to kernel/src/capsule/capsule_console.c diff --git a/src/starkernel/capsule/capsule_find.c b/kernel/src/capsule/capsule_find.c similarity index 100% rename from src/starkernel/capsule/capsule_find.c rename to kernel/src/capsule/capsule_find.c diff --git a/src/starkernel/capsule/capsule_loader.c b/kernel/src/capsule/capsule_loader.c similarity index 100% rename from src/starkernel/capsule/capsule_loader.c rename to kernel/src/capsule/capsule_loader.c diff --git a/src/starkernel/capsule/capsule_mint.c b/kernel/src/capsule/capsule_mint.c similarity index 100% rename from src/starkernel/capsule/capsule_mint.c rename to kernel/src/capsule/capsule_mint.c diff --git a/src/starkernel/capsule/capsule_run.c b/kernel/src/capsule/capsule_run.c similarity index 100% rename from src/starkernel/capsule/capsule_run.c rename to kernel/src/capsule/capsule_run.c diff --git a/src/starkernel/capsule/capsule_runcap.c b/kernel/src/capsule/capsule_runcap.c similarity index 100% rename from src/starkernel/capsule/capsule_runcap.c rename to kernel/src/capsule/capsule_runcap.c diff --git a/src/starkernel/capsule/capsule_sig.c b/kernel/src/capsule/capsule_sig.c similarity index 100% rename from src/starkernel/capsule/capsule_sig.c rename to kernel/src/capsule/capsule_sig.c diff --git a/src/starkernel/capsule/capsule_validate.c b/kernel/src/capsule/capsule_validate.c similarity index 100% rename from src/starkernel/capsule/capsule_validate.c rename to kernel/src/capsule/capsule_validate.c diff --git a/src/starkernel/capsule/capsule_vm_hooks.c b/kernel/src/capsule/capsule_vm_hooks.c similarity index 100% rename from src/starkernel/capsule/capsule_vm_hooks.c rename to kernel/src/capsule/capsule_vm_hooks.c diff --git a/src/starkernel/capsule/capsule_vm_physics.c b/kernel/src/capsule/capsule_vm_physics.c similarity index 100% rename from src/starkernel/capsule/capsule_vm_physics.c rename to kernel/src/capsule/capsule_vm_physics.c diff --git a/src/starkernel/capsule/capsule_vm_switch_signal.c b/kernel/src/capsule/capsule_vm_switch_signal.c similarity index 100% rename from src/starkernel/capsule/capsule_vm_switch_signal.c rename to kernel/src/capsule/capsule_vm_switch_signal.c diff --git a/src/starkernel/capsule/capsule_wirebind.c b/kernel/src/capsule/capsule_wirebind.c similarity index 100% rename from src/starkernel/capsule/capsule_wirebind.c rename to kernel/src/capsule/capsule_wirebind.c diff --git a/src/starkernel/capsule/capsule_zuse_boot.c b/kernel/src/capsule/capsule_zuse_boot.c similarity index 100% rename from src/starkernel/capsule/capsule_zuse_boot.c rename to kernel/src/capsule/capsule_zuse_boot.c diff --git a/src/starkernel/capsule/mama_forth_words.c b/kernel/src/capsule/mama_forth_words.c similarity index 99% rename from src/starkernel/capsule/mama_forth_words.c rename to kernel/src/capsule/mama_forth_words.c index 900885f8..404cf5f2 100644 --- a/src/starkernel/capsule/mama_forth_words.c +++ b/kernel/src/capsule/mama_forth_words.c @@ -54,7 +54,7 @@ #include "starkernel/capsule_run.h" #include "starkernel/capsule_loader.h" #include "starkernel/capsule_vm_physics.h" -#include "starkernel/vm/vm_internal.h" +#include "../vm/vm_internal.h" #include "starkernel/vm/stadium.h" /* item 4.2 -- STADIUM-* words */ #include "starkernel/capsule_vm_switch_signal.h" /* FABRIC-3.md §XXVIII Stage 3 follow-on -- SWITCH-MARK-WORK */ #include "starkernel/vm/stadium_words.h" /* item 4.2 -- stadium_words_resident_heat() */ diff --git a/src/starkernel/capsule/vm_identity.c b/kernel/src/capsule/vm_identity.c similarity index 100% rename from src/starkernel/capsule/vm_identity.c rename to kernel/src/capsule/vm_identity.c diff --git a/src/starkernel/capsule/vm_uuid.c b/kernel/src/capsule/vm_uuid.c similarity index 100% rename from src/starkernel/capsule/vm_uuid.c rename to kernel/src/capsule/vm_uuid.c diff --git a/src/starkernel/capsule/zuse_eligibility.c b/kernel/src/capsule/zuse_eligibility.c similarity index 100% rename from src/starkernel/capsule/zuse_eligibility.c rename to kernel/src/capsule/zuse_eligibility.c diff --git a/src/starkernel/crypto/ed25519.c b/kernel/src/crypto/ed25519.c similarity index 100% rename from src/starkernel/crypto/ed25519.c rename to kernel/src/crypto/ed25519.c diff --git a/src/starkernel/crypto/fe25519.c b/kernel/src/crypto/fe25519.c similarity index 100% rename from src/starkernel/crypto/fe25519.c rename to kernel/src/crypto/fe25519.c diff --git a/src/starkernel/crypto/scalar25519.c b/kernel/src/crypto/scalar25519.c similarity index 100% rename from src/starkernel/crypto/scalar25519.c rename to kernel/src/crypto/scalar25519.c diff --git a/src/starkernel/crypto/sha512.c b/kernel/src/crypto/sha512.c similarity index 100% rename from src/starkernel/crypto/sha512.c rename to kernel/src/crypto/sha512.c diff --git a/src/starkernel/crypto/x509_ed25519.c b/kernel/src/crypto/x509_ed25519.c similarity index 100% rename from src/starkernel/crypto/x509_ed25519.c rename to kernel/src/crypto/x509_ed25519.c diff --git a/src/starkernel/doe_log.c b/kernel/src/doe_log.c similarity index 100% rename from src/starkernel/doe_log.c rename to kernel/src/doe_log.c diff --git a/src/starkernel/hal/README.md b/kernel/src/hal/README.md similarity index 100% rename from src/starkernel/hal/README.md rename to kernel/src/hal/README.md diff --git a/src/starkernel/hal/console.c b/kernel/src/hal/console.c similarity index 100% rename from src/starkernel/hal/console.c rename to kernel/src/hal/console.c diff --git a/src/starkernel/hal/fdt.c b/kernel/src/hal/fdt.c similarity index 100% rename from src/starkernel/hal/fdt.c rename to kernel/src/hal/fdt.c diff --git a/src/starkernel/hal/font_8x16.c b/kernel/src/hal/font_8x16.c similarity index 100% rename from src/starkernel/hal/font_8x16.c rename to kernel/src/hal/font_8x16.c diff --git a/src/starkernel/hal/framebuffer.c b/kernel/src/hal/framebuffer.c similarity index 100% rename from src/starkernel/hal/framebuffer.c rename to kernel/src/hal/framebuffer.c diff --git a/src/starkernel/hal/hal.c b/kernel/src/hal/hal.c similarity index 100% rename from src/starkernel/hal/hal.c rename to kernel/src/hal/hal.c diff --git a/src/starkernel/hal/host_services.c b/kernel/src/hal/host_services.c similarity index 100% rename from src/starkernel/hal/host_services.c rename to kernel/src/hal/host_services.c diff --git a/src/starkernel/hal/memory.c b/kernel/src/hal/memory.c similarity index 100% rename from src/starkernel/hal/memory.c rename to kernel/src/hal/memory.c diff --git a/src/starkernel/hal/ttf.c b/kernel/src/hal/ttf.c similarity index 100% rename from src/starkernel/hal/ttf.c rename to kernel/src/hal/ttf.c diff --git a/src/starkernel/hal/vt100.c b/kernel/src/hal/vt100.c similarity index 100% rename from src/starkernel/hal/vt100.c rename to kernel/src/hal/vt100.c diff --git a/src/starkernel/hash/README.md b/kernel/src/hash/README.md similarity index 100% rename from src/starkernel/hash/README.md rename to kernel/src/hash/README.md diff --git a/src/starkernel/hash/xxhash64.c b/kernel/src/hash/xxhash64.c similarity index 100% rename from src/starkernel/hash/xxhash64.c rename to kernel/src/hash/xxhash64.c diff --git a/src/starkernel/heartbeat.c b/kernel/src/heartbeat.c similarity index 100% rename from src/starkernel/heartbeat.c rename to kernel/src/heartbeat.c diff --git a/src/starkernel/homeblocks_sig.c b/kernel/src/homeblocks_sig.c similarity index 100% rename from src/starkernel/homeblocks_sig.c rename to kernel/src/homeblocks_sig.c diff --git a/src/starkernel/kernel_main.c b/kernel/src/kernel_main.c similarity index 100% rename from src/starkernel/kernel_main.c rename to kernel/src/kernel_main.c diff --git a/src/starkernel/log_region.c b/kernel/src/log_region.c similarity index 100% rename from src/starkernel/log_region.c rename to kernel/src/log_region.c diff --git a/src/starkernel/math/README.md b/kernel/src/math/README.md similarity index 100% rename from src/starkernel/math/README.md rename to kernel/src/math/README.md diff --git a/src/starkernel/math/q48_16.c b/kernel/src/math/q48_16.c similarity index 100% rename from src/starkernel/math/q48_16.c rename to kernel/src/math/q48_16.c diff --git a/src/starkernel/memory/README.md b/kernel/src/memory/README.md similarity index 100% rename from src/starkernel/memory/README.md rename to kernel/src/memory/README.md diff --git a/src/starkernel/memory/kmalloc.c b/kernel/src/memory/kmalloc.c similarity index 100% rename from src/starkernel/memory/kmalloc.c rename to kernel/src/memory/kmalloc.c diff --git a/src/starkernel/memory/pmm.c b/kernel/src/memory/pmm.c similarity index 100% rename from src/starkernel/memory/pmm.c rename to kernel/src/memory/pmm.c diff --git a/src/starkernel/memory/vmm.c b/kernel/src/memory/vmm.c similarity index 100% rename from src/starkernel/memory/vmm.c rename to kernel/src/memory/vmm.c diff --git a/src/starkernel/pci/README.md b/kernel/src/pci/README.md similarity index 100% rename from src/starkernel/pci/README.md rename to kernel/src/pci/README.md diff --git a/src/starkernel/pci/pci.c b/kernel/src/pci/pci.c similarity index 100% rename from src/starkernel/pci/pci.c rename to kernel/src/pci/pci.c diff --git a/src/starkernel/repl.c b/kernel/src/repl.c similarity index 100% rename from src/starkernel/repl.c rename to kernel/src/repl.c diff --git a/src/starkernel/rng/rng.c b/kernel/src/rng/rng.c similarity index 100% rename from src/starkernel/rng/rng.c rename to kernel/src/rng/rng.c diff --git a/src/starkernel/usb/blkio_usb.c b/kernel/src/usb/blkio_usb.c similarity index 100% rename from src/starkernel/usb/blkio_usb.c rename to kernel/src/usb/blkio_usb.c diff --git a/src/starkernel/usb/xhci.c b/kernel/src/usb/xhci.c similarity index 100% rename from src/starkernel/usb/xhci.c rename to kernel/src/usb/xhci.c diff --git a/src/starkernel/virtio/README.md b/kernel/src/virtio/README.md similarity index 100% rename from src/starkernel/virtio/README.md rename to kernel/src/virtio/README.md diff --git a/src/starkernel/virtio/virtio_blk.c b/kernel/src/virtio/virtio_blk.c similarity index 100% rename from src/starkernel/virtio/virtio_blk.c rename to kernel/src/virtio/virtio_blk.c diff --git a/src/starkernel/virtio/virtio_input.c b/kernel/src/virtio/virtio_input.c similarity index 100% rename from src/starkernel/virtio/virtio_input.c rename to kernel/src/virtio/virtio_input.c diff --git a/src/starkernel/virtio/virtio_rng.c b/kernel/src/virtio/virtio_rng.c similarity index 100% rename from src/starkernel/virtio/virtio_rng.c rename to kernel/src/virtio/virtio_rng.c diff --git a/src/starkernel/vm/README.md b/kernel/src/vm/README.md similarity index 100% rename from src/starkernel/vm/README.md rename to kernel/src/vm/README.md diff --git a/src/starkernel/vm/alloc_kernel.c b/kernel/src/vm/alloc_kernel.c similarity index 100% rename from src/starkernel/vm/alloc_kernel.c rename to kernel/src/vm/alloc_kernel.c diff --git a/src/starkernel/vm/arena.c b/kernel/src/vm/arena.c similarity index 100% rename from src/starkernel/vm/arena.c rename to kernel/src/vm/arena.c diff --git a/src/starkernel/vm/bootstrap/README.md b/kernel/src/vm/bootstrap/README.md similarity index 100% rename from src/starkernel/vm/bootstrap/README.md rename to kernel/src/vm/bootstrap/README.md diff --git a/src/starkernel/vm/bootstrap/sk_vm_bootstrap.c b/kernel/src/vm/bootstrap/sk_vm_bootstrap.c similarity index 100% rename from src/starkernel/vm/bootstrap/sk_vm_bootstrap.c rename to kernel/src/vm/bootstrap/sk_vm_bootstrap.c diff --git a/src/starkernel/vm/host/README.md b/kernel/src/vm/host/README.md similarity index 100% rename from src/starkernel/vm/host/README.md rename to kernel/src/vm/host/README.md diff --git a/src/starkernel/vm/host/shim.c b/kernel/src/vm/host/shim.c similarity index 100% rename from src/starkernel/vm/host/shim.c rename to kernel/src/vm/host/shim.c diff --git a/src/starkernel/vm/kernel_hermes.c b/kernel/src/vm/kernel_hermes.c similarity index 100% rename from src/starkernel/vm/kernel_hermes.c rename to kernel/src/vm/kernel_hermes.c diff --git a/src/starkernel/vm/parity.c b/kernel/src/vm/parity.c similarity index 100% rename from src/starkernel/vm/parity.c rename to kernel/src/vm/parity.c diff --git a/src/starkernel/vm/q48_stubs.c b/kernel/src/vm/q48_stubs.c similarity index 100% rename from src/starkernel/vm/q48_stubs.c rename to kernel/src/vm/q48_stubs.c diff --git a/src/starkernel/vm/session.c b/kernel/src/vm/session.c similarity index 100% rename from src/starkernel/vm/session.c rename to kernel/src/vm/session.c diff --git a/src/starkernel/vm/stadium.c b/kernel/src/vm/stadium.c similarity index 100% rename from src/starkernel/vm/stadium.c rename to kernel/src/vm/stadium.c diff --git a/src/starkernel/vm/stadium_blocks.c b/kernel/src/vm/stadium_blocks.c similarity index 100% rename from src/starkernel/vm/stadium_blocks.c rename to kernel/src/vm/stadium_blocks.c diff --git a/src/starkernel/vm/stadium_words.c b/kernel/src/vm/stadium_words.c similarity index 100% rename from src/starkernel/vm/stadium_words.c rename to kernel/src/vm/stadium_words.c diff --git a/src/starkernel/vm/switch.c b/kernel/src/vm/switch.c similarity index 100% rename from src/starkernel/vm/switch.c rename to kernel/src/vm/switch.c diff --git a/src/starkernel/vm/vm_bootstrap.c b/kernel/src/vm/vm_bootstrap.c similarity index 96% rename from src/starkernel/vm/vm_bootstrap.c rename to kernel/src/vm/vm_bootstrap.c index 961bd192..2c2f0ec5 100644 --- a/src/starkernel/vm/vm_bootstrap.c +++ b/kernel/src/vm/vm_bootstrap.c @@ -44,14 +44,14 @@ * vm_bootstrap.c - VM initialization and bootstrap logic */ -#include "../include/vm.h" -#include "../include/log.h" -#include "../include/word_registry.h" -#include "../include/vm_debug.h" -#include "../include/physics_hotwords_cache.h" -#include "../include/rolling_window_of_truth.h" -#include "../include/dictionary_heat_optimization.h" -#include "../include/ssm_jacquard.h" +#include "../../../v3/include/vm.h" +#include "../../../v3/include/log.h" +#include "../../../v3/include/word_registry.h" +#include "../../../v3/include/vm_debug.h" +#include "../../../v3/include/physics_hotwords_cache.h" +#include "../../../v3/include/rolling_window_of_truth.h" +#include "../../../v3/include/dictionary_heat_optimization.h" +#include "../../../v3/include/ssm_jacquard.h" #include "word_source/include/vocabulary_words.h" #include "vm_internal.h" #ifdef __STARKERNEL__ diff --git a/src/starkernel/vm/vm_core.c b/kernel/src/vm/vm_core.c similarity index 98% rename from src/starkernel/vm/vm_core.c rename to kernel/src/vm/vm_core.c index 238c2a75..c8debd2c 100644 --- a/src/starkernel/vm/vm_core.c +++ b/kernel/src/vm/vm_core.c @@ -40,20 +40,20 @@ */ -#include "../include/vm.h" -#include "../include/inference_engine.h" -#include "../include/log.h" -#include "../include/word_registry.h" -#include "../include/vm_debug.h" -#include "../include/profiler.h" -#include "../include/platform_time.h" -#include "../include/physics_metadata.h" -#include "../include/physics_hotwords_cache.h" -#include "../include/physics_pipelining_metrics.h" -#include "../include/rolling_window_of_truth.h" -#include "../include/dictionary_heat_optimization.h" -#include "../include/ssm_jacquard.h" -#include "../include/vm_host.h" +#include "../../../v3/include/vm.h" +#include "../../../v3/include/inference_engine.h" +#include "../../../v3/include/log.h" +#include "../../../v3/include/word_registry.h" +#include "../../../v3/include/vm_debug.h" +#include "../../../v3/include/profiler.h" +#include "../../../v3/include/platform_time.h" +#include "../../../v3/include/physics_metadata.h" +#include "../../../v3/include/physics_hotwords_cache.h" +#include "../../../v3/include/physics_pipelining_metrics.h" +#include "../../../v3/include/rolling_window_of_truth.h" +#include "../../../v3/include/dictionary_heat_optimization.h" +#include "../../../v3/include/ssm_jacquard.h" +#include "../../../v3/include/vm_host.h" #ifdef __STARKERNEL__ #include "starkernel/vm/arena.h" #include "starkernel/log_attrib.h" /* vm_log_attributed_vm() */ diff --git a/src/starkernel/vm/vm_internal.h b/kernel/src/vm/vm_internal.h similarity index 97% rename from src/starkernel/vm/vm_internal.h rename to kernel/src/vm/vm_internal.h index 29dd1bf8..24504bdf 100644 --- a/src/starkernel/vm/vm_internal.h +++ b/kernel/src/vm/vm_internal.h @@ -43,8 +43,8 @@ #ifndef VM_INTERNAL_H #define VM_INTERNAL_H -#include "../include/vm.h" -#include "../include/vm_host.h" +#include "../../../v3/include/vm.h" +#include "../../../v3/include/vm_host.h" #ifndef PARITY_MODE #define PARITY_MODE 0 diff --git a/src/starkernel/vm/vm_runtime.c b/kernel/src/vm/vm_runtime.c similarity index 98% rename from src/starkernel/vm/vm_runtime.c rename to kernel/src/vm/vm_runtime.c index 04a8d11b..a6cb8b7a 100644 --- a/src/starkernel/vm/vm_runtime.c +++ b/kernel/src/vm/vm_runtime.c @@ -40,15 +40,15 @@ */ -#include "../include/vm.h" -#include "../include/log.h" -#include "../include/rolling_window_of_truth.h" -#include "../include/dictionary_heat_optimization.h" -#include "../include/inference_engine.h" -#include "../include/physics_metadata.h" -#include "../include/physics_hotwords_cache.h" +#include "../../../v3/include/vm.h" +#include "../../../v3/include/log.h" +#include "../../../v3/include/rolling_window_of_truth.h" +#include "../../../v3/include/dictionary_heat_optimization.h" +#include "../../../v3/include/inference_engine.h" +#include "../../../v3/include/physics_metadata.h" +#include "../../../v3/include/physics_hotwords_cache.h" #include "starkernel/doe_log.h" -#include "../include/ssm_jacquard.h" +#include "../../../v3/include/ssm_jacquard.h" #include "vm_internal.h" #include "starkernel/capsule_vm_physics.h" #include "starkernel/timer.h" diff --git a/lfs/amd64/starforth b/lfs/amd64/starforth index 979d248ba6e7af25351e7d4378e0eefa8a81807b..4ca07ddefeed6885955f7cb8ca98be7ab9b2d4db 100755 GIT binary patch delta 205513 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�?z~1wQa30P_^ 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 N61JGVE@+yV{{w&tNJ0Pr delta 203924 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 diff --git a/logs2/.gitkeep b/logs2/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/logs2/README.md b/logs2/README.md deleted file mode 100644 index 8af4e21f..00000000 --- a/logs2/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# logs2/ - -A second, flatter archive of QEMU serial captures and screenshots (159 -loose files: `qemu-amd64-*.log`, `qemu-aarch64-*.log`, -`qemu-riscv64-*.log`, `qemu-screenshot-*`), predating or running parallel -to the timestamped-subdirectory convention used in `logs/`. Historical — -no per-file index; browse by timestamp in the filename. diff --git a/logs2/qemu-aarch64-20260609-192112.log b/logs2/qemu-aarch64-20260609-192112.log deleted file mode 100644 index 2f7c953a..00000000 --- a/logs2/qemu-aarch64-20260609-192112.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:83592610388794eaebdb48599b9b5029fc05031283d56ee3842f86a4c9ddefa6 -size 445259 diff --git a/logs2/qemu-aarch64-20260611-002443.log b/logs2/qemu-aarch64-20260611-002443.log deleted file mode 100644 index 63e80052..00000000 --- a/logs2/qemu-aarch64-20260611-002443.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3bfe27c8e32cd3e1af32ebc053f858ba75eca8c160b960aec6a2ca7e5425f2a6 -size 453599 diff --git a/logs2/qemu-aarch64-20260611-024456.log b/logs2/qemu-aarch64-20260611-024456.log deleted file mode 100644 index 0e82fb19..00000000 --- a/logs2/qemu-aarch64-20260611-024456.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2dc5080cfa9bfa8451cc868393e2db67d7c8660a5b7c923575e4b493229d2b8a -size 5286367 diff --git a/logs2/qemu-aarch64-20260611-173737.log b/logs2/qemu-aarch64-20260611-173737.log deleted file mode 100644 index d75f8f63..00000000 --- a/logs2/qemu-aarch64-20260611-173737.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cd881909023f366709be8dbc472f2242b036e3b525e36f444f2bd46b3c81eb7c -size 2860321 diff --git a/logs2/qemu-aarch64-20260611-174951.log b/logs2/qemu-aarch64-20260611-174951.log deleted file mode 100644 index db0d847f..00000000 --- a/logs2/qemu-aarch64-20260611-174951.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2600af8c22e63034d608813b31c8e26dfb591126f41f5024668b5ca53a5f815c -size 444849 diff --git a/logs2/qemu-aarch64-20260611-175257.log b/logs2/qemu-aarch64-20260611-175257.log deleted file mode 100644 index 69556556..00000000 --- a/logs2/qemu-aarch64-20260611-175257.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:548df876d4fd35678a1635f035134aabd50bfc4f94834c7f1954b32ca43ebd6a -size 444396 diff --git a/logs2/qemu-aarch64-20260611-190822.log b/logs2/qemu-aarch64-20260611-190822.log deleted file mode 100644 index db0f610d..00000000 --- a/logs2/qemu-aarch64-20260611-190822.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1e3a8fe80891d91d4969965414f9ac788d7a39bf85374f62f9c385f6f88e01d1 -size 24550579 diff --git a/logs2/qemu-aarch64-20260611-202955.log b/logs2/qemu-aarch64-20260611-202955.log deleted file mode 100644 index 56e2d5c1..00000000 --- a/logs2/qemu-aarch64-20260611-202955.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2ec3b597aef2c9c692b9825ef822d77b61bad209aae74e9d4a730c5c012c392e -size 2860331 diff --git a/logs2/qemu-aarch64-20260612-132412.log b/logs2/qemu-aarch64-20260612-132412.log deleted file mode 100644 index 369178ef..00000000 --- a/logs2/qemu-aarch64-20260612-132412.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b7bcfd56a593b7dc7e94f1ee546ab482c2b7a0d6b0ef6031b52e2ab7591bdb9b -size 24547039 diff --git a/logs2/qemu-aarch64-20260612-141722.log b/logs2/qemu-aarch64-20260612-141722.log deleted file mode 100644 index dbebd8ea..00000000 --- a/logs2/qemu-aarch64-20260612-141722.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b049b883a58d66c646e20df02e5d931477901339ddf27c2d0d00ec73f62a0b48 -size 24571257 diff --git a/logs2/qemu-aarch64-20260612-160132.log b/logs2/qemu-aarch64-20260612-160132.log deleted file mode 100644 index 9d0e760c..00000000 --- a/logs2/qemu-aarch64-20260612-160132.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c1543e8f781c0ffda150e68a473b436ef0611ae8ec0c3c57e838d82fbda99c5 -size 24557311 diff --git a/logs2/qemu-aarch64-20260614-164017.log b/logs2/qemu-aarch64-20260614-164017.log deleted file mode 100644 index c613be51..00000000 --- a/logs2/qemu-aarch64-20260614-164017.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e9f0a5be56112b6e6ccdc6760c3e0cfff35a1575f76dbd8481b0943b38a1e3e5 -size 445798 diff --git a/logs2/qemu-aarch64-20260614-164043.log b/logs2/qemu-aarch64-20260614-164043.log deleted file mode 100644 index 7155bc6c..00000000 --- a/logs2/qemu-aarch64-20260614-164043.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:59c913bd5cafa83a930be572322946d54250f3e627ed3c7bb98479f0fbc073f7 -size 445830 diff --git a/logs2/qemu-aarch64-20260614-182154.log b/logs2/qemu-aarch64-20260614-182154.log deleted file mode 100644 index 5b14e80b..00000000 --- a/logs2/qemu-aarch64-20260614-182154.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:74fd6eab5924ba58deb1530223267a70316d651420709eeedbeae1ba5c09a780 -size 445940 diff --git a/logs2/qemu-aarch64-20260614-190109.log b/logs2/qemu-aarch64-20260614-190109.log deleted file mode 100644 index c3579842..00000000 --- a/logs2/qemu-aarch64-20260614-190109.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec60bcb52390ce385697baa07c4188630be60227d606edf5f5df3281071443e1 -size 446081 diff --git a/logs2/qemu-aarch64-20260614-230803.log b/logs2/qemu-aarch64-20260614-230803.log deleted file mode 100644 index c02c03fd..00000000 --- a/logs2/qemu-aarch64-20260614-230803.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e785237ae55ff3327eb7f68aa262abada47614704f06be316c069d0b1a71da6b -size 24762825 diff --git a/logs2/qemu-aarch64-20260615-003908.log b/logs2/qemu-aarch64-20260615-003908.log deleted file mode 100644 index 0b81ce4f..00000000 --- a/logs2/qemu-aarch64-20260615-003908.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b00954cc3f39dcc4cdd8133baaa20f71e9b4a708138b41f2243a79e0c83759b4 -size 24791976 diff --git a/logs2/qemu-aarch64-20260615-005301.log b/logs2/qemu-aarch64-20260615-005301.log deleted file mode 100644 index 7c0dfa2b..00000000 --- a/logs2/qemu-aarch64-20260615-005301.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6fef1dd6edd20ac9f32396e449be401579be2165840d5a17df8763a880de1f78 -size 24810271 diff --git a/logs2/qemu-aarch64-20260615-020020.log b/logs2/qemu-aarch64-20260615-020020.log deleted file mode 100644 index 2f385fe3..00000000 --- a/logs2/qemu-aarch64-20260615-020020.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6809d86a1b7eae40c2c8ad42c10854e3e22ac96ccb2f8b50cc7d07da3d196ea1 -size 24798283 diff --git a/logs2/qemu-aarch64-20260615-103253.log b/logs2/qemu-aarch64-20260615-103253.log deleted file mode 100644 index b47ff0cb..00000000 --- a/logs2/qemu-aarch64-20260615-103253.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c79dd37830259c5988c36de5fc6d3cb0be96efe405b8bfb215685558aa69acd8 -size 446176 diff --git a/logs2/qemu-aarch64-20260615-103655.log b/logs2/qemu-aarch64-20260615-103655.log deleted file mode 100644 index 70cfd266..00000000 --- a/logs2/qemu-aarch64-20260615-103655.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d752ffb4307e3b822788f64f55ce959a72de251ab0a8a35870ee32b47ce5402 -size 446096 diff --git a/logs2/qemu-aarch64-20260615-121103.log b/logs2/qemu-aarch64-20260615-121103.log deleted file mode 100644 index 7d342f68..00000000 --- a/logs2/qemu-aarch64-20260615-121103.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9398bee6c2494a07c23d1250814427236cbfe72881cf79387f1360b5105d2f97 -size 39524558 diff --git a/logs2/qemu-aarch64-20260615-123814.log b/logs2/qemu-aarch64-20260615-123814.log deleted file mode 100644 index 551b18a5..00000000 --- a/logs2/qemu-aarch64-20260615-123814.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b69188e7704e3f2dda83ae30f72220aa3b6edb6940c26e5d9f901263bfa3e859 -size 40407590 diff --git a/logs2/qemu-aarch64-20260615-160204.log b/logs2/qemu-aarch64-20260615-160204.log deleted file mode 100644 index 7a3317e0..00000000 --- a/logs2/qemu-aarch64-20260615-160204.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8702707f3ff9558294139bbeeee25e1a1993c2cafdecaa81b8c621611af5e0aa -size 40382353 diff --git a/logs2/qemu-aarch64-20260615-183010.log b/logs2/qemu-aarch64-20260615-183010.log deleted file mode 100644 index 311e1b25..00000000 --- a/logs2/qemu-aarch64-20260615-183010.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:af8042f75f58308aeefcaaeac464b0b571b27b6ba559923fd2df35693e76e37a -size 445915 diff --git a/logs2/qemu-aarch64-20260615-192747.log b/logs2/qemu-aarch64-20260615-192747.log deleted file mode 100644 index 45d7e8dc..00000000 --- a/logs2/qemu-aarch64-20260615-192747.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a62df6904fff8e5a31790475d2121d91cf09ae1483122a9b237dde6ad6f0d8e9 -size 25720612 diff --git a/logs2/qemu-aarch64-20260615-194133.log b/logs2/qemu-aarch64-20260615-194133.log deleted file mode 100644 index e0d37b7a..00000000 --- a/logs2/qemu-aarch64-20260615-194133.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c9e78c199ae0dc052016a86c4478e7194d7ed2a26a400de58e37812fc300c7ca -size 25728577 diff --git a/logs2/qemu-aarch64-20260615-204232.log b/logs2/qemu-aarch64-20260615-204232.log deleted file mode 100644 index d81bd935..00000000 --- a/logs2/qemu-aarch64-20260615-204232.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a97c07ff0ad676c5d59b9b724ea6f3be785fec5167f06950be5107a2b47391bf -size 25730370 diff --git a/logs2/qemu-aarch64-20260615-223549.log b/logs2/qemu-aarch64-20260615-223549.log deleted file mode 100644 index 86841a74..00000000 --- a/logs2/qemu-aarch64-20260615-223549.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f10800135a26e0131326a9831d55315ad39ef194d912e4ce046d1519f9dd7fcb -size 446759 diff --git a/logs2/qemu-aarch64-20260615-235720.log b/logs2/qemu-aarch64-20260615-235720.log deleted file mode 100644 index 1109cfa0..00000000 --- a/logs2/qemu-aarch64-20260615-235720.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4df71446c9efe65f799d14f42672542570cd5f305e2b212fde2693e0347e1509 -size 24826180 diff --git a/logs2/qemu-aarch64-20260616-000920.log b/logs2/qemu-aarch64-20260616-000920.log deleted file mode 100644 index 4ea3f40b..00000000 --- a/logs2/qemu-aarch64-20260616-000920.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3e93a8ca1550f57abc3f7622bef06944de1c10fece7671a58a64d6086f86885b -size 24826961 diff --git a/logs2/qemu-aarch64-20260616-011049.log b/logs2/qemu-aarch64-20260616-011049.log deleted file mode 100644 index d96286e9..00000000 --- a/logs2/qemu-aarch64-20260616-011049.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:27a0cf152b499f395d50627028ea0e7d4d1a8a79a14794d46952c0eed7bcbd52 -size 24818835 diff --git a/logs2/qemu-aarch64-20260616-112907.log b/logs2/qemu-aarch64-20260616-112907.log deleted file mode 100644 index de788d20..00000000 --- a/logs2/qemu-aarch64-20260616-112907.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ba61d2da7c79df29001522ad883f89013c4ee6fd2456f6aadacb44be1b95c022 -size 2861725 diff --git a/logs2/qemu-aarch64-20260616-155223.log b/logs2/qemu-aarch64-20260616-155223.log deleted file mode 100644 index e93447d2..00000000 --- a/logs2/qemu-aarch64-20260616-155223.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c3e133f3d8863c737ed9a9122c5dec2d5b0550795fa364646801c60d44e5588d -size 2861637 diff --git a/logs2/qemu-aarch64-20260616-175845.log b/logs2/qemu-aarch64-20260616-175845.log deleted file mode 100644 index 29bd15a6..00000000 --- a/logs2/qemu-aarch64-20260616-175845.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3fade9151f59cbd3268d1ce00f2e82dfb8e593b42000f95a5ce854a92d954f4f -size 446777 diff --git a/logs2/qemu-aarch64-20260620-222449.log b/logs2/qemu-aarch64-20260620-222449.log deleted file mode 100644 index f0931a54..00000000 --- a/logs2/qemu-aarch64-20260620-222449.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:33a2129c7b81183f63e83709fedfabb6918611e3c6af7cc5315da0ab8af952e0 -size 446938 diff --git a/logs2/qemu-aarch64-20260621-004736.log b/logs2/qemu-aarch64-20260621-004736.log deleted file mode 100644 index 8417c1d8..00000000 --- a/logs2/qemu-aarch64-20260621-004736.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3cb60e03b9837f6f4301668c98abf9ec5b6c87d953531e4bdd3a92913d892599 -size 455373 diff --git a/logs2/qemu-amd64-20260609-184750.log b/logs2/qemu-amd64-20260609-184750.log deleted file mode 100644 index 395e0868..00000000 --- a/logs2/qemu-amd64-20260609-184750.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:de8b3b76a479fdd3b80d8e678b3ffeacfbee6bceba39458889c7a59ef83d496d -size 124750043 diff --git a/logs2/qemu-amd64-20260609-193717.log b/logs2/qemu-amd64-20260609-193717.log deleted file mode 100644 index 49eac741..00000000 --- a/logs2/qemu-amd64-20260609-193717.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:264da04e9961b71db4ec4f41a6142b7a91dbe652c5a77b363a4b5ba42c9444f4 -size 452546 diff --git a/logs2/qemu-amd64-20260611-002301.log b/logs2/qemu-amd64-20260611-002301.log deleted file mode 100644 index fcf1c42a..00000000 --- a/logs2/qemu-amd64-20260611-002301.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:700b82c28e7871cc91e2dcaff02bfc8f9067671293e4d56c20e7eefa18fb0c15 -size 459031 diff --git a/logs2/qemu-amd64-20260611-012412.log b/logs2/qemu-amd64-20260611-012412.log deleted file mode 100644 index 2dd16200..00000000 --- a/logs2/qemu-amd64-20260611-012412.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7a0aacf2887944ca026af06807220dc950c8d451bbd1c3a3d315e6a062e29558 -size 25304213 diff --git a/logs2/qemu-amd64-20260611-013401.log b/logs2/qemu-amd64-20260611-013401.log deleted file mode 100644 index a54d891d..00000000 --- a/logs2/qemu-amd64-20260611-013401.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cc7c9205fb2fcba2a3d4b7816189e092234c6becf5061962fe8e1ce777dd1da9 -size 51847478 diff --git a/logs2/qemu-amd64-20260611-023023.log b/logs2/qemu-amd64-20260611-023023.log deleted file mode 100644 index dfe07389..00000000 --- a/logs2/qemu-amd64-20260611-023023.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:36ad81e9c25263496226870600ec7045a634709bfe34d559fa19c2bfa79af1f9 -size 1229048 diff --git a/logs2/qemu-amd64-20260611-023818.log b/logs2/qemu-amd64-20260611-023818.log deleted file mode 100644 index e33dfe25..00000000 --- a/logs2/qemu-amd64-20260611-023818.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c6c8f18746be9320b887e647aa718665b93cdabc7a83cbcd1e4f5652e36ea51c -size 5437912 diff --git a/logs2/qemu-amd64-20260611-172713.log b/logs2/qemu-amd64-20260611-172713.log deleted file mode 100644 index 657bfaa9..00000000 --- a/logs2/qemu-amd64-20260611-172713.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bb922c9a54f2652ce1a583e77094458e60c65b6df3b30ef478f3ea371be1835a -size 2986532 diff --git a/logs2/qemu-amd64-20260611-174904.log b/logs2/qemu-amd64-20260611-174904.log deleted file mode 100644 index 8eb20203..00000000 --- a/logs2/qemu-amd64-20260611-174904.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ea16d957689e30ecff83b93f8596d1b87e784fd735971db3ef84ce7f14eb0b4c -size 452793 diff --git a/logs2/qemu-amd64-20260611-175217.log b/logs2/qemu-amd64-20260611-175217.log deleted file mode 100644 index 4836f432..00000000 --- a/logs2/qemu-amd64-20260611-175217.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a6cbf185529b069e76b4a803facc6d7f8c7ed86426d0687d893253434186d76a -size 452229 diff --git a/logs2/qemu-amd64-20260611-180750.log b/logs2/qemu-amd64-20260611-180750.log deleted file mode 100644 index 6ad85163..00000000 --- a/logs2/qemu-amd64-20260611-180750.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:026efae6d5ee2af7ff980b45aae7a7b01ac8ef65aee9da7e5c4c44cd904e48d9 -size 16809778 diff --git a/logs2/qemu-amd64-20260611-192015.log b/logs2/qemu-amd64-20260611-192015.log deleted file mode 100644 index 70ce7925..00000000 --- a/logs2/qemu-amd64-20260611-192015.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b4ca1094d0b8b819711a348159ea1a222192972985780b432f3ab235c8008cd2 -size 15873920 diff --git a/logs2/qemu-amd64-20260611-201951.log b/logs2/qemu-amd64-20260611-201951.log deleted file mode 100644 index 28de5f03..00000000 --- a/logs2/qemu-amd64-20260611-201951.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8b9481705be52280fa8bd2462de213c82813f0898e04944b51856ed6d7f1fc20 -size 2990826 diff --git a/logs2/qemu-amd64-20260611-204126.log b/logs2/qemu-amd64-20260611-204126.log deleted file mode 100644 index bf608125..00000000 --- a/logs2/qemu-amd64-20260611-204126.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:600a1199e2c4d87ff564082bdcbbb2a2e34a54c6d1bfc4e2656ae42dfb3937c6 -size 16994750 diff --git a/logs2/qemu-amd64-20260611-223613.log b/logs2/qemu-amd64-20260611-223613.log deleted file mode 100644 index 47e14582..00000000 --- a/logs2/qemu-amd64-20260611-223613.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:53fd8da927e76fbc0c15b0596bab99a09f7e301e5f057428020c3a11dad67972 -size 24296628 diff --git a/logs2/qemu-amd64-20260612-110212.log b/logs2/qemu-amd64-20260612-110212.log deleted file mode 100644 index 4594ee43..00000000 --- a/logs2/qemu-amd64-20260612-110212.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:58d2f47e95d24705ddef7fea8c8ea34b522141e60b0a4c029d88d5a982654247 -size 26655843 diff --git a/logs2/qemu-amd64-20260612-142323.log b/logs2/qemu-amd64-20260612-142323.log deleted file mode 100644 index 6db15b98..00000000 --- a/logs2/qemu-amd64-20260612-142323.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:76a6a7af9c49d54a4ff812ff4cbd0d61ccd3d9444d093d4e23474669b9002082 -size 26814590 diff --git a/logs2/qemu-amd64-20260612-160656.log b/logs2/qemu-amd64-20260612-160656.log deleted file mode 100644 index d4c37437..00000000 --- a/logs2/qemu-amd64-20260612-160656.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:11f3c49d85895d547add1cd1a465479103b82d46bee48784e0f11ea7126fb167 -size 26787619 diff --git a/logs2/qemu-amd64-20260614-163853.log b/logs2/qemu-amd64-20260614-163853.log deleted file mode 100644 index a2f3714a..00000000 --- a/logs2/qemu-amd64-20260614-163853.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79768405c5684fdbe3a37a0a20d10455f9a71689b2de19747bfc2a4e2f96ecdc -size 452449 diff --git a/logs2/qemu-amd64-20260614-182034.log b/logs2/qemu-amd64-20260614-182034.log deleted file mode 100644 index f7033f5d..00000000 --- a/logs2/qemu-amd64-20260614-182034.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:91ab796a2962f55f083225ec016df2d993a157f4c7ffdff0297e8fdca96f44dc -size 454035 diff --git a/logs2/qemu-amd64-20260614-182119.log b/logs2/qemu-amd64-20260614-182119.log deleted file mode 100644 index 1601438f..00000000 --- a/logs2/qemu-amd64-20260614-182119.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d575a3d5e65e08e83dd9ffafe823afbe6461397944c87fe550d0894639428e24 -size 454035 diff --git a/logs2/qemu-amd64-20260614-183302.log b/logs2/qemu-amd64-20260614-183302.log deleted file mode 100644 index f0638900..00000000 --- a/logs2/qemu-amd64-20260614-183302.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:28b0858d6ff05c8c7e3f43bac46abc1c999e89d341ab81cc54a8995be8731b5b -size 454084 diff --git a/logs2/qemu-amd64-20260614-185942.log b/logs2/qemu-amd64-20260614-185942.log deleted file mode 100644 index 9d69ae2e..00000000 --- a/logs2/qemu-amd64-20260614-185942.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4f528c79f5107275bd0e1a4e4d7dfbea814e12d52ad1c664e596bde47f99df11 -size 454111 diff --git a/logs2/qemu-amd64-20260614-190244.log b/logs2/qemu-amd64-20260614-190244.log deleted file mode 100644 index ee25f576..00000000 --- a/logs2/qemu-amd64-20260614-190244.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d703df3557bdd25026e54230a3d91e47849001f78331b09754e00eecd8b132c8 -size 454093 diff --git a/logs2/qemu-amd64-20260614-212929.log b/logs2/qemu-amd64-20260614-212929.log deleted file mode 100644 index 83deedb1..00000000 --- a/logs2/qemu-amd64-20260614-212929.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d3d625ea9b5712bb569182f6e69be834d944ddc4c337d160a948131c8be94ba8 -size 26750601 diff --git a/logs2/qemu-amd64-20260614-233623.log b/logs2/qemu-amd64-20260614-233623.log deleted file mode 100644 index 727f18bf..00000000 --- a/logs2/qemu-amd64-20260614-233623.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c64cef6aa7612c046f55596d4303cd93f52def9b229c1978db686eb3ac0c68a6 -size 26653964 diff --git a/logs2/qemu-amd64-20260615-005725.log b/logs2/qemu-amd64-20260615-005725.log deleted file mode 100644 index dfe9b396..00000000 --- a/logs2/qemu-amd64-20260615-005725.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:535c12b23a1d1f555475283784ee3a80442379752c946ebe391e8e179aa18a6b -size 26678736 diff --git a/logs2/qemu-amd64-20260615-020446.log b/logs2/qemu-amd64-20260615-020446.log deleted file mode 100644 index b99dbe33..00000000 --- a/logs2/qemu-amd64-20260615-020446.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:951797fcd00093a2ff1f9aaff10cacbb0697d83ad33bdd4052aa59b716b2d8f7 -size 26669147 diff --git a/logs2/qemu-amd64-20260615-103154.log b/logs2/qemu-amd64-20260615-103154.log deleted file mode 100644 index 8bce7da7..00000000 --- a/logs2/qemu-amd64-20260615-103154.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:36244198d4ea8df9153d36bf317aa460b9891a1a8f23a112c04e3a96596cc419 -size 454240 diff --git a/logs2/qemu-amd64-20260615-103619.log b/logs2/qemu-amd64-20260615-103619.log deleted file mode 100644 index 34078166..00000000 --- a/logs2/qemu-amd64-20260615-103619.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c0b7c167eed3efb9c6eddd434dbf34f42599c62c2229af469ad6c1841b293f7 -size 453990 diff --git a/logs2/qemu-amd64-20260615-103843.log b/logs2/qemu-amd64-20260615-103843.log deleted file mode 100644 index cfe6e37f..00000000 --- a/logs2/qemu-amd64-20260615-103843.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:391f8438be7e7d8db94a27aa2206c508310ec96c6d8c445f218ea8bcae2cf026 -size 26759728 diff --git a/logs2/qemu-amd64-20260615-124956.log b/logs2/qemu-amd64-20260615-124956.log deleted file mode 100644 index 9dcdaa58..00000000 --- a/logs2/qemu-amd64-20260615-124956.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e5d57b7581a046460ad6f7916b572f88e908f9f255a9736f7ef64243ceea8d8b -size 1310694 diff --git a/logs2/qemu-amd64-20260615-125017.log b/logs2/qemu-amd64-20260615-125017.log deleted file mode 100644 index b4176e99..00000000 --- a/logs2/qemu-amd64-20260615-125017.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:862d1ae1c84781c78ccd637761c22065a9277d104b3e48a1de18dc648f29b2e8 -size 1220938 diff --git a/logs2/qemu-amd64-20260615-125335.log b/logs2/qemu-amd64-20260615-125335.log deleted file mode 100644 index 1f089ad3..00000000 --- a/logs2/qemu-amd64-20260615-125335.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6206230729075784373806c4e194ae45c46af6dbef4807f1603b40c91d7fd962 -size 26459082 diff --git a/logs2/qemu-amd64-20260615-142839.log b/logs2/qemu-amd64-20260615-142839.log deleted file mode 100644 index 6fa32cc6..00000000 --- a/logs2/qemu-amd64-20260615-142839.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7cdd0225e3eb4516a7cba323664b95aff5f00bb070d207e3e4dc3cffa1fd441b -size 26804029 diff --git a/logs2/qemu-amd64-20260615-161023.log b/logs2/qemu-amd64-20260615-161023.log deleted file mode 100644 index 492cc9bd..00000000 --- a/logs2/qemu-amd64-20260615-161023.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0cd6e72e44a976d342e13c7b20c84a9a25386a29e2ede68facdf1facc5d45b8c -size 26781098 diff --git a/logs2/qemu-amd64-20260615-180252.log b/logs2/qemu-amd64-20260615-180252.log deleted file mode 100644 index 293121b9..00000000 --- a/logs2/qemu-amd64-20260615-180252.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3f60516570b2de42393232c7129e0db94bd02985109b9cff0315c34a5ab8c1f0 -size 1155561 diff --git a/logs2/qemu-amd64-20260615-182339.log b/logs2/qemu-amd64-20260615-182339.log deleted file mode 100644 index e8bde4e7..00000000 --- a/logs2/qemu-amd64-20260615-182339.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:04957e8778b0b4160143b83865d21cfc79e0a8d9b97095fb040b1a93a18e68e5 -size 2977576 diff --git a/logs2/qemu-amd64-20260615-182946.log b/logs2/qemu-amd64-20260615-182946.log deleted file mode 100644 index 0e0ee3c8..00000000 --- a/logs2/qemu-amd64-20260615-182946.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:39b1c2e88bba99a54b4473eeb1c24281cadea9376a03f575f76386d541bf1dba -size 138597 diff --git a/logs2/qemu-amd64-20260615-183023.log b/logs2/qemu-amd64-20260615-183023.log deleted file mode 100644 index a2ad21ec..00000000 --- a/logs2/qemu-amd64-20260615-183023.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:28de2fff2c4e0103afa17e382b11c09587de7634766887f9bd2fb1cbbc1f24b2 -size 26627477 diff --git a/logs2/qemu-amd64-20260615-194545.log b/logs2/qemu-amd64-20260615-194545.log deleted file mode 100644 index 710af523..00000000 --- a/logs2/qemu-amd64-20260615-194545.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0ae003125d32ae45ace427117fc72799ca3265e38e22a4bb87c500aba471bddc -size 26619977 diff --git a/logs2/qemu-amd64-20260615-204632.log b/logs2/qemu-amd64-20260615-204632.log deleted file mode 100644 index d23880c1..00000000 --- a/logs2/qemu-amd64-20260615-204632.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a2315ce9165ed63d041be4f69fbfad30ed01bddc156ef34ee8ffac498a21291b -size 26624536 diff --git a/logs2/qemu-amd64-20260615-223531.log b/logs2/qemu-amd64-20260615-223531.log deleted file mode 100644 index e69de29b..00000000 diff --git a/logs2/qemu-amd64-20260615-223607.log b/logs2/qemu-amd64-20260615-223607.log deleted file mode 100644 index 35ff0116..00000000 --- a/logs2/qemu-amd64-20260615-223607.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:74ce1bcfe28e9f9a7dc2b4f2059822b646d668eb87ed8a603eff66c08c888c69 -size 6149285 diff --git a/logs2/qemu-amd64-20260615-230419.log b/logs2/qemu-amd64-20260615-230419.log deleted file mode 100644 index d3e06b9b..00000000 --- a/logs2/qemu-amd64-20260615-230419.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:975395f039c9cf72a8e4345f52eb4ad1b460f12ac9e590aa18a4b28c86f2a1d3 -size 26585196 diff --git a/logs2/qemu-amd64-20260616-001614.log b/logs2/qemu-amd64-20260616-001614.log deleted file mode 100644 index d85fec71..00000000 --- a/logs2/qemu-amd64-20260616-001614.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fdca033d07fb2060c65d6b5fee3d6f0d561be8851a23aa269f574915a599b73a -size 26589065 diff --git a/logs2/qemu-amd64-20260616-011447.log b/logs2/qemu-amd64-20260616-011447.log deleted file mode 100644 index fa1b717f..00000000 --- a/logs2/qemu-amd64-20260616-011447.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8663beb8f2d885ff9230f7a33acd87bec353bc8ab9aae0d6cf9024eec4aba54f -size 26594760 diff --git a/logs2/qemu-amd64-20260616-111913.log b/logs2/qemu-amd64-20260616-111913.log deleted file mode 100644 index a2bb3131..00000000 --- a/logs2/qemu-amd64-20260616-111913.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:54e64439fc6838e884e5963c225eaf596e1ef297e4b1e915e0aac0e569269de7 -size 2989365 diff --git a/logs2/qemu-amd64-20260616-154608.log b/logs2/qemu-amd64-20260616-154608.log deleted file mode 100644 index 95c95fa6..00000000 --- a/logs2/qemu-amd64-20260616-154608.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a925f3e693496963a135dd0a26bff73f96b9d52748b7789e1163291ba3d20f61 -size 2979714 diff --git a/logs2/qemu-amd64-20260616-175829.log b/logs2/qemu-amd64-20260616-175829.log deleted file mode 100644 index 6045e214..00000000 --- a/logs2/qemu-amd64-20260616-175829.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:748ec87f38fe3ee754e56f64c2d35d1a1fa52fe9c7363a260431765117c60fc8 -size 454128 diff --git a/logs2/qemu-amd64-20260620-222036.log b/logs2/qemu-amd64-20260620-222036.log deleted file mode 100644 index 7d0d760e..00000000 --- a/logs2/qemu-amd64-20260620-222036.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f2d88a222232a42b27d41bef5852ac44351f2a076625b495a2b6c747edda11e7 -size 454888 diff --git a/logs2/qemu-amd64-20260621-002830.log b/logs2/qemu-amd64-20260621-002830.log deleted file mode 100644 index 4cd23e23..00000000 --- a/logs2/qemu-amd64-20260621-002830.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b48635e970f3d19331d075386cd793bbc2069cd073ed962d272970cb1fd290c6 -size 463427 diff --git a/logs2/qemu-amd64-20260621-004710.log b/logs2/qemu-amd64-20260621-004710.log deleted file mode 100644 index f385ef3d..00000000 --- a/logs2/qemu-amd64-20260621-004710.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60a9c348ace7155d195ad47acabbbfc314fc20b2a353435423f7f0bedc79cd87 -size 463389 diff --git a/logs2/qemu-riscv64-20260609-192223.log b/logs2/qemu-riscv64-20260609-192223.log deleted file mode 100644 index f3f5113a..00000000 --- a/logs2/qemu-riscv64-20260609-192223.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:13265fd92a595a4ecf253c4bb6461d5ae284b31c6565e6d9053d85f38a110082 -size 454533 diff --git a/logs2/qemu-riscv64-20260611-002548.log b/logs2/qemu-riscv64-20260611-002548.log deleted file mode 100644 index 81ed5b7e..00000000 --- a/logs2/qemu-riscv64-20260611-002548.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c3a24074ce39f43c81052c2ce1cddf0794d8ceec07b3195cd96acad9b6d5a7d7 -size 3656 diff --git a/logs2/qemu-riscv64-20260611-003502.log b/logs2/qemu-riscv64-20260611-003502.log deleted file mode 100644 index 5c4fa2a2..00000000 --- a/logs2/qemu-riscv64-20260611-003502.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1982b748e57fe8c302c83fe804e55e6437e505e748405e5c7d32cb7b710b4c3e -size 3656 diff --git a/logs2/qemu-riscv64-20260611-003801.log b/logs2/qemu-riscv64-20260611-003801.log deleted file mode 100644 index 276d9df0..00000000 --- a/logs2/qemu-riscv64-20260611-003801.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5d39b719c48058e3d903bc92d121ac446772f177d05bdbf3a9bfa519e30da119 -size 461796 diff --git a/logs2/qemu-riscv64-20260611-024624.log b/logs2/qemu-riscv64-20260611-024624.log deleted file mode 100644 index e1099f32..00000000 --- a/logs2/qemu-riscv64-20260611-024624.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3a8ad9c1bb22efb837c9a7b9646832a688cca6710177155f3ee7a8f4c96699ea -size 5246437 diff --git a/logs2/qemu-riscv64-20260611-173903.log b/logs2/qemu-riscv64-20260611-173903.log deleted file mode 100644 index 19d4411f..00000000 --- a/logs2/qemu-riscv64-20260611-173903.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6e3bbd31797d0b4ad4f22622f4c15c9b2e4f2a0b68841b540a775d0ac1d6ea8d -size 2869662 diff --git a/logs2/qemu-riscv64-20260611-175348.log b/logs2/qemu-riscv64-20260611-175348.log deleted file mode 100644 index 472e8a1a..00000000 --- a/logs2/qemu-riscv64-20260611-175348.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b6379b501b237f23888354d49f01775a6361162af5c6cc3252a721ac4a1db1c4 -size 453754 diff --git a/logs2/qemu-riscv64-20260611-191335.log b/logs2/qemu-riscv64-20260611-191335.log deleted file mode 100644 index be5a74fb..00000000 --- a/logs2/qemu-riscv64-20260611-191335.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:424044bf92ab72748724fe3432e7cf09720cf64834dc0c9d4502b9daf0b18fd5 -size 24461243 diff --git a/logs2/qemu-riscv64-20260611-203104.log b/logs2/qemu-riscv64-20260611-203104.log deleted file mode 100644 index f39af689..00000000 --- a/logs2/qemu-riscv64-20260611-203104.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bdc8f152b9c1216ebfc5aaa3bddeefe53462485de887ba2bbc0109554905e0af -size 2869665 diff --git a/logs2/qemu-riscv64-20260612-135612.log b/logs2/qemu-riscv64-20260612-135612.log deleted file mode 100644 index 12487e24..00000000 --- a/logs2/qemu-riscv64-20260612-135612.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a6ba3e43f91ef13cbafe6d288930d2e7a9d1a065421403f6b12ed50ec9fbf489 -size 24461719 diff --git a/logs2/qemu-riscv64-20260612-141129.log b/logs2/qemu-riscv64-20260612-141129.log deleted file mode 100644 index 06ced14b..00000000 --- a/logs2/qemu-riscv64-20260612-141129.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fedc2623db6780b04521c478657f700f7eb6d5d2d46d86d718f602bbc8ba98d9 -size 24487550 diff --git a/logs2/qemu-riscv64-20260612-174414.log b/logs2/qemu-riscv64-20260612-174414.log deleted file mode 100644 index be3f2930..00000000 --- a/logs2/qemu-riscv64-20260612-174414.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:672ec58e1c3395a7c2ecd3324ff3772699b6423737576e37ce9fa651b6cb10cc -size 24470192 diff --git a/logs2/qemu-riscv64-20260614-164140.log b/logs2/qemu-riscv64-20260614-164140.log deleted file mode 100644 index 1f4d81c6..00000000 --- a/logs2/qemu-riscv64-20260614-164140.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:68de4275e8a5d79d049870690cb6ae80872a619176a724ff26189d27e2e43951 -size 3478 diff --git a/logs2/qemu-riscv64-20260614-165900.log b/logs2/qemu-riscv64-20260614-165900.log deleted file mode 100644 index ea6c6cf0..00000000 --- a/logs2/qemu-riscv64-20260614-165900.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e09f737f70ee5d08d85c4548cef334215b30c31d1b51938913eaa1737414a70 -size 3484 diff --git a/logs2/qemu-riscv64-20260614-170926.log b/logs2/qemu-riscv64-20260614-170926.log deleted file mode 100644 index c5aca9dd..00000000 --- a/logs2/qemu-riscv64-20260614-170926.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7bda12cfc05493e20f42ebba91e207d0ae1ae8190035f352617ebd59ac127f3f -size 4746 diff --git a/logs2/qemu-riscv64-20260614-171955.log b/logs2/qemu-riscv64-20260614-171955.log deleted file mode 100644 index 8de4f3ef..00000000 --- a/logs2/qemu-riscv64-20260614-171955.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a16185d8e5cdcb302637af85b6c8a66d73cbd7c8f983aba88cb73981957d02a0 -size 454514 diff --git a/logs2/qemu-riscv64-20260614-182235.log b/logs2/qemu-riscv64-20260614-182235.log deleted file mode 100644 index fa8d972a..00000000 --- a/logs2/qemu-riscv64-20260614-182235.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e545d0827cff65a7f125590a27583a163f248b484b0a333d3015cdd826db0b5f -size 455326 diff --git a/logs2/qemu-riscv64-20260614-190152.log b/logs2/qemu-riscv64-20260614-190152.log deleted file mode 100644 index 1cfdb783..00000000 --- a/logs2/qemu-riscv64-20260614-190152.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:94f39f57529b464ae62455f9df5d204b2fcb2a4b0f72efbd5b77d3d05681c064 -size 455396 diff --git a/logs2/qemu-riscv64-20260614-230220.log b/logs2/qemu-riscv64-20260614-230220.log deleted file mode 100644 index 308170f4..00000000 --- a/logs2/qemu-riscv64-20260614-230220.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a9252d099af5aae9ba861e96f4e28b52ed6acf1b36714883f5dc4b721084a3d4 -size 24721249 diff --git a/logs2/qemu-riscv64-20260615-004335.log b/logs2/qemu-riscv64-20260615-004335.log deleted file mode 100644 index 01f0508d..00000000 --- a/logs2/qemu-riscv64-20260615-004335.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3e266bf0ab69591c30071e90b59eb4f2394e7c75c54897a2ac78e4b1a78610cc -size 24715944 diff --git a/logs2/qemu-riscv64-20260615-004822.log b/logs2/qemu-riscv64-20260615-004822.log deleted file mode 100644 index 0ad56fcc..00000000 --- a/logs2/qemu-riscv64-20260615-004822.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:afa30fafd39d23078b484fd0a876e706307800c7e894a8e466595a1d58f856bd -size 24742087 diff --git a/logs2/qemu-riscv64-20260615-031059.log b/logs2/qemu-riscv64-20260615-031059.log deleted file mode 100644 index 209a8aaa..00000000 --- a/logs2/qemu-riscv64-20260615-031059.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b54e988ed8fff287a1ea4f2f6390a8ddf9bf1f08c7cb4a2f690d13a3039fc66b -size 24726338 diff --git a/logs2/qemu-riscv64-20260615-103741.log b/logs2/qemu-riscv64-20260615-103741.log deleted file mode 100644 index c199af61..00000000 --- a/logs2/qemu-riscv64-20260615-103741.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:889f022a9a9b4f835d8b1cb3b9a31aaf63982f43e871b569fec347a61ceea121 -size 455449 diff --git a/logs2/qemu-riscv64-20260615-122026.log b/logs2/qemu-riscv64-20260615-122026.log deleted file mode 100644 index 23990740..00000000 --- a/logs2/qemu-riscv64-20260615-122026.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ba68fb8c137c5db04ee89d8355a18dbccaf6cc533fc65f558ad339194aa2c69d -size 40469576 diff --git a/logs2/qemu-riscv64-20260615-122930.log b/logs2/qemu-riscv64-20260615-122930.log deleted file mode 100644 index d21ea928..00000000 --- a/logs2/qemu-riscv64-20260615-122930.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8cdaafbdc7baae96e6cc5e6f8f0522ee4dbef2a02692c6c3fc88bf276290bbf1 -size 40707313 diff --git a/logs2/qemu-riscv64-20260615-174420.log b/logs2/qemu-riscv64-20260615-174420.log deleted file mode 100644 index 3e92765a..00000000 --- a/logs2/qemu-riscv64-20260615-174420.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d8de0e7cfbdbe9f1b764778019095962bdb83961c18da79ec77c4bd12fce9f67 -size 40970797 diff --git a/logs2/qemu-riscv64-20260615-183017.log b/logs2/qemu-riscv64-20260615-183017.log deleted file mode 100644 index 35eadadf..00000000 --- a/logs2/qemu-riscv64-20260615-183017.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f7093abe9e9ebca406ca4ee0f13ab0c44c1aab6dd362162422c450c934866dd3 -size 454565 diff --git a/logs2/qemu-riscv64-20260615-193223.log b/logs2/qemu-riscv64-20260615-193223.log deleted file mode 100644 index 58e23cf5..00000000 --- a/logs2/qemu-riscv64-20260615-193223.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ab2d39c04e76e34ad66606adfb5cba94edad5f4268fe221f4186e02e90cf4b9 -size 25739252 diff --git a/logs2/qemu-riscv64-20260615-193711.log b/logs2/qemu-riscv64-20260615-193711.log deleted file mode 100644 index 8b2add39..00000000 --- a/logs2/qemu-riscv64-20260615-193711.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9a92d3d9d1dea81945339edfde95ea96fafd671adee5aff4fdcc5780956dc694 -size 25753142 diff --git a/logs2/qemu-riscv64-20260615-214335.log b/logs2/qemu-riscv64-20260615-214335.log deleted file mode 100644 index 544abeca..00000000 --- a/logs2/qemu-riscv64-20260615-214335.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f3fb8b4c9e3cd3d4c93c9a8edd5ff127f8c493bdc399f8daa90df213e62af36e -size 25766622 diff --git a/logs2/qemu-riscv64-20260615-223550.log b/logs2/qemu-riscv64-20260615-223550.log deleted file mode 100644 index 4273f514..00000000 --- a/logs2/qemu-riscv64-20260615-223550.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f12ca988cc5b7df213b9bc36d1ced1a3b972f26b6a6e5cb8c09ac585494a6727 -size 456148 diff --git a/logs2/qemu-riscv64-20260616-000114.log b/logs2/qemu-riscv64-20260616-000114.log deleted file mode 100644 index c8514038..00000000 --- a/logs2/qemu-riscv64-20260616-000114.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:583e5a555c3c47d551b5c310cd0efe7156b8510d40c6144da379a60f7b42adf0 -size 24732863 diff --git a/logs2/qemu-riscv64-20260616-000522.log b/logs2/qemu-riscv64-20260616-000522.log deleted file mode 100644 index 56e055d7..00000000 --- a/logs2/qemu-riscv64-20260616-000522.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:20003eacea2508d339b62eb1283943212bc1053424e2ccaea9cb6c7fde94bd9c -size 24740552 diff --git a/logs2/qemu-riscv64-20260616-021123.log b/logs2/qemu-riscv64-20260616-021123.log deleted file mode 100644 index 49c2f30f..00000000 --- a/logs2/qemu-riscv64-20260616-021123.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:22833409d3f85b78bfdd04dabff0178009ebdefea664c021c91940035fa5fe6f -size 24738045 diff --git a/logs2/qemu-riscv64-20260616-113103.log b/logs2/qemu-riscv64-20260616-113103.log deleted file mode 100644 index 0acf79db..00000000 --- a/logs2/qemu-riscv64-20260616-113103.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d8afb3224c857e35b36a733406c5582f0725b274d767e5c0755cd4a2d15e0a3c -size 2871138 diff --git a/logs2/qemu-riscv64-20260616-155324.log b/logs2/qemu-riscv64-20260616-155324.log deleted file mode 100644 index 35f42dad..00000000 --- a/logs2/qemu-riscv64-20260616-155324.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4ea73709d6cb5d9dd2c6917832a0f584a71a97aae402706a1d2ca542c3a3cc13 -size 2870243 diff --git a/logs2/qemu-riscv64-20260616-175915.log b/logs2/qemu-riscv64-20260616-175915.log deleted file mode 100644 index 57df4bc8..00000000 --- a/logs2/qemu-riscv64-20260616-175915.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d9b5fcaf0a7fc241170023df5cf64052b569eb43848b262d3fe3446925b6728 -size 456125 diff --git a/logs2/qemu-riscv64-20260620-231806.log b/logs2/qemu-riscv64-20260620-231806.log deleted file mode 100644 index e56f120b..00000000 --- a/logs2/qemu-riscv64-20260620-231806.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a5d8473c973399578f544e0570190d1ecf4b168a71ed9825338f071059d02334 -size 456336 diff --git a/logs2/qemu-riscv64-20260621-004843.log b/logs2/qemu-riscv64-20260621-004843.log deleted file mode 100644 index 57c4b485..00000000 --- a/logs2/qemu-riscv64-20260621-004843.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8094140433a197527fe5c462cb5d386f04d3acef87a1e690d8faf93b433ec45b -size 464944 diff --git a/logs2/qemu-screenshot-20260609-105458.png b/logs2/qemu-screenshot-20260609-105458.png deleted file mode 100644 index 47ebf0990c526825f7eb6df013bbd7d910b247af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1375 zcmds1{a4a=6#jsjrdda6x>=LjPS(=YR$}7IwnPmL-=eZqK+RL;n&!kIsF0D?P&~C1 zH%vR(3ma-_k%+I!CQUPsM@110d?{a0K`l_ekYg`@#qJOHx%WQjJm=hVpL4HAgazAJ zIa&b#Y_LZ$Q2>~mO0%7CQwE5DYxySFnRqk`2LRO>00t8Py=lal0f6iQz#ItxbQu5+ zY2~6wUlRdO2o1&nvxCg^Yo^X31B(l^nA^C?+S*NY2*CnigA9xL22UAT7{lGLi%CF7DSbmZkHiZ>Qg_%YiUw3+Mfz>NM8F+yo} zjxp^VtFxhP5N^`cIgyGq+Tpp<<CJS)JXdLCCT^krymMjAsj~_XfBPXTBE0#rMCvuJgGn8^8VGp72&~s``>vAJ#yR`<;sGlXnN^qJ zyO@(OJ1C}11u3GBr(CY09;CK5T)-_32JF`y!3v%_#>*wr%vbkL+30dKJn0m{Z=3S! z%-Tp|6LP;M^V30b(-~x0l#eW9yYeZUjNeNCd2W~KY^G>?e)!z<=vcVpo`BnaxylQu z_!?r{yH8LDxM`{Mi+QoJHHP^gAXr?Fv+Jyi<1cZ3F%-utJdy<{HDzZw@8O??$GcQ( zbnUDYj1Bqf_%|j!n%x^bVsieXx3tHvJ+i3KbHy;Iv zyKhUPI*_Q=X}9()w}6zEO&T8byC>eAYQGC!?Eurx#nTJr7a0PA`7oc|09))W;n;Zm zmT!w0yI((G>7j4sZSM?Ex!O3itrw&~75O25*Czt#W&FC!>D-rv!&2F0IYkJj`2 z5lb@l1cJ5hvqrofVvNC9A45N{bjZ15ziK^VSbuLKkGniVhiX#$%>Vf-|LOdXKof7U Xcvt;~lqZaS{`Xqgz%Weh5mMe?D9%DL diff --git a/logs2/qemu-screenshot-20260609-130717.png b/logs2/qemu-screenshot-20260609-130717.png deleted file mode 100644 index 88526cc4ae56f6c25514ff605fc165b9b6f3cf44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1375 zcmds1{a4a=6#jsjsgXx*x>*C;PS(`Q*2Kh@ZHXEhzD22NfSRYwHO+}bP$5IDsdQ=? zZkTqm7dF(=Lh;>Xlct%+qoRlgzLYPhpcW`!$g!8dqWi;r?!C`B&pG$p=iIAdA%O@B z2MYiI0(TS}0f4EoG;xF*GqCl$l5YgZgrgC70BBACFj)ZTj3eeO02DU>=E(qHN&&D> zEo%z*HWKjo;6N-eImAl4V(iS)ad>~T`OW4Cq`B*6?*ITcNpaY33DnWWar_M~X8Y!_ zkNm1x@g+r1EKUU6Jh?8kIgi@SG~=&5h5RlJH68TFS~3`D-%?{FrqN#>92EfBL|v$W~!; zmO0}Tt3}W^3C-2DNOG}SGctc`r7f1$%$2lWd!g$nVB3}Ix|+YX?(aRzB(@%atpb>ROk6v-hC` zIzvSu4}gk@!L1wzabeG`fx)isi&>?zEpK*;c*s}bX@gs#QqPBDUEP@|@CL0=R?Z54 zL%y<|xD7+b`7`JCb$n$(g10;tOFSmDFo^?K4FL}rvGCP?=RAtaFmLxxG-yGl6xODD zFJ;Hi4T-4J0rIHh$(Jf=hiGjL=kZHJe*4r%aDt}}aWb(alc26V5fVXT<4S=U(o{+hm&04=uzF5(}3##^Se%KMMMl! zOnDA($vDV$gBPu{b`R_9$To`md?`zSO*1cA|OfNS?Z-g{hx&nAnitEn) z`_^QdJ(*^idUMZ8D@blNSM#7h+zAJ0cDvwJ_At$S9HU5ffhi!Gj_}zHu%*5d4#MsC zd~59Z{kp*|Zn`$!j;_$;yvE_}eIOYs&(ChH^JrYw*}*ig*8;Cb8jVOg+(G=pyJn^A zS_U;st)U@%5`A?YQ^C4Pbc2fSGwf4S-agJ+EllZ5fz@AYubSiS%}?CXlek2mI2S#| z-9{%-Yh--(3{hB4pAc-cat1V=fy_!n7JWz)wSO_@w7eY+Z>dx9XO!~Q_`8?oP}8Uv z^d2D@MrEmF-Fp1qe&y*C4kE&&P!+39^q4>`-!16;&lYAVu+P3@w`Mu2-*{&vkGnj=1glf}P5=EX|Lc4}ppMg< Xy{&pp&J{*I`)4hje+ahb2s!s}t1UrE diff --git a/logs2/qemu-screenshot-20260609-181200.png b/logs2/qemu-screenshot-20260609-181200.png deleted file mode 100644 index 46748d8b174189838e6ae4eae14a3f22a95680ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1375 zcmeAS@N?(olHy`uVBq!ia0y~yU#6&t6Jtngdo zqD>48EH^z}978H@y}j!@X||OJTY#wZ+LolLJ)5~g-KK>7+#!@@#aFiX&#v2+%TJqa z^ql_Jm7_$^&+9|TR=wLHUUAz}wJYn_ysh)jjCyQ0eafSW)?Tx&*|=xCuX{F0X;-Fi z=DhEvpElor%6^T>M=;uoSx42iYkT|8{5sIyCpP2PvEBB97tf|Q#P82&Rp+;F!}nfaizi0&UVpM$yHWch`#=B7zy8j5U%|jIKj;e2bgARr zr>9-Ma_m%L&5YX|&twj-kh>RHbcN^l49n$rj-9HMXLx4z;Pv7cJ66iw6Mi_CQ7+N7 z;ic{Y6RvosJsXZ+Gk^G<@tV}^55F1A8RNR|>1nl=zW@75?CaqxTnVM!8%u27)h4~X zdbr|=+x>{(?8e1a##Q^aXZgOn>a6?0$#d%#sl?mIua%u!63+X*_QQ&6PvUGv9<;vr zc`JFhyzYlG*{g?lN6F6!vc6d&{a{O9X$XJ)%vXxQXaj=%2QAW{-?{5ArS3e}w(dce zS>oFG{a+-_3}+YQ*XK6H#H{`Eru;W!>{&IPm#?SW9bOhceR}qM1@pD%>$b~ZJeqSz z@Ig>?!|~D+Onb@cWxo!|M*>_(G+@*CmD zZ*ncKowYp>*xO_J`Olm4zuK94@^xe`E)`6u5>Ke&E|{YJX)iU3U%Rc(SUcb9Iu!eQ`h-wNqt{@JZNuZx^# z$o@UAt#$dCW?Z4adxjX+*KI69j{cB#X&}d7QKArlm`e8=o#}KPQU!^kbA@8zctlYzeVW1jgGy)-;8O`ruVC#zrO!DX;Jh2-@9&E|Nh5&?Yex; z``f4f_-b5y9UCfjIONfe_c7m7%^%8tT-1IDk~A2c&jeJQwalyc{B!@L-}?VecETTT zzJDa#{ond${9LcU(JtIRRtM*c*DetI!F}t`|F1yFVD0r*-XHQWvVzMMs5!%k`jGgC Y{mYuC2~9g94uZVp>FVdQ&MBb@0In56=Kufz diff --git a/logs2/qemu-screenshot-20260609-193724.log b/logs2/qemu-screenshot-20260609-193724.log deleted file mode 100644 index 58987244..00000000 --- a/logs2/qemu-screenshot-20260609-193724.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c9c87048a095a22f62092b734a48c0b27e41946f433f023132b6bae3dbda3ac8 -size 452582 diff --git a/logs2/qemu-screenshot-20260609-193724.png b/logs2/qemu-screenshot-20260609-193724.png deleted file mode 100644 index c0fa46396b3c351fd3b44b9d1e20b66c040ca8a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1375 zcmeAS@N?(olHy`uVBq!ia0y~yU#6&t6ps?w?r zOI#QjSZ;c{IEGZ*dVAM*(rhacwg6G*wJk|gdp2{0x=jiDxkD(+imz<%pIx^tm!CG< z=sEqbD@Tc-pVxHi$k6^SFvyQ53$>m#zgdH#}F1`OaI-vV-%(M!AIE58rOQn)Yd5 zOx5n$*Y@_G`E{VZPi)4oW4rAIFP=?rh~J;l$Uk+5 z+`?}ay(v6ioEW)$tIluVhVQ+;7Eg@kz5ZmicBA%1_J97DfBl{BzJh^ae$W-3=~BnL zPfxpi<=Cmhni;n_p2-|uA$KpZ=nBv88J5fM96MDh&+yFb!Ry5@cC3`UC;V_OqgD=#xBC&n*^P^hD)mit0ljqhgQi->ZUn@JeB%Jqq?S~cDp2XRTJZOFK z^H%b1dEF0XvR4o9j*_1dWPP(l`oWgI(h&aonXeRq(FO$j4_c%@zjN1LO5J&`ZQX+` zv&6OW`@cw<8O|=qug`6YiCO#SP5E!e*t2RnFJDi$JG?A@`tt;s7S{8BR)zqqry`|XLM_|3h^%Y>BQnw`42%(Tzo_v_Nv zTaQKb{jQjE>PPR#>Un=7{|7Yu?nsei?E7u=ef7l027C0ko8I=YI=}Oq*^MUu>Tq>AQC7w{lT`)!c(_V(`y__Fb{61nDqF*JZ z$h1bB@!PA!`kvdl4O`<_Z>;Xy&iL;9)akqitJ(xz?k?SQg~Q<2z7^8P{IgqkUKcsf zko|jJTkYOW<~u+B5@Y=K^oM(AI4~i`TO5efv|0CQPJdZN&4+JQa;H=6ejRx1{p*q0 z_V?Ac*KOC$+kdy^b9erse8z44``5f&q0yEqeLD4B^}~$F$FupW<15zPUfuURZpXap zhg<*eoqqY-A@_#Ge`~6*ev8n18y$OpzZuh>P48Dfe|`UR(xT@3zjxiT{{4^l+I9Jw z_qR{|@zuEaIyO}5aLA(_?_<8Fnm?5PxTyUQBxx`>p9!cqYnfN?`RD#gzxDr{?1Vqw zeE&$e`@i+i__uU#PagZtK>|6hTU!P@Jsyg%e$WCfQiP;-V6^&#;O Y`=LjPTIVbt%-`4ZHXBg-lEhrK+RL;nwNLPkaMysw#>iM__RfA>g{kNrC1_!F}{DV?_AmLep(`9<) za&}PSnJHiPoyl8Xfxn8q11>1DXK#Pjl!!|#(~#HdWHTmW_zBBsw2||E|MY=TAwq6+ zo-t=1qp_fE5tyoK>_~+w^~mDgwYC^)Ge_Kd^QE>Uk7Zq~?P~tovcLB{gV=uI%Fd$t zO0sfYOAs_XYqME_-F5893;gL=#Aw=5s_2K*x6ot=LH4ZSNMp?W+#>Jb+78nZb0_``CX@_JUp5q zBENvQWE|$W!V5N-`-ipGBrEwto`lKAq%1d0qj;f=oiVTMGdUq6O6Z&?jL=kqqr7q$ z>k7N)t77#?m^KQDxh&O<^Yjqii5-W510=q2T~}L#jD(PcPG7UZqr-I{W3In>}LJ&x{cRHH_6LgJSYQ%jdT#l1cqVTA>5>$;^rZ63TJ*?CX@ zLrW6XhD0?_x#O_b3X)n)Rb1!~H~b;0^*(r|4NSclOD~XKV(r2t=pcOIUAX`dOxr8KWhNLm!Xti&+qA2o$RmRC!0CG zh*gPl5|O{@wLvTm)JJ2?PoSTd+hpCderGKNwSel$7%~1NuSs diff --git a/logs2/qemu-screenshot-20260609-194812.png b/logs2/qemu-screenshot-20260609-194812.png deleted file mode 100644 index 0397151d78ec06a73aa8452c0ff913804a3e6a97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1375 zcmds1{a4a=6#jsjrCCR5xLFh1PTJCn*2Kh@ZHXEhzC~qefSRYwHO+}5P$46=sdQ>8 zZkTp5iw(83P<%Jpq-o~ys3@X=Z~1}>YC-aa9DDgIxk_$A$D?(sk2DI6Z|aZH*Q9tkO({0Pff}N4znmCIs*7{E!mM1( z2#P;5>BB9UxaAr6tJEvtf;!{%?avzH3Gt;m>dF(vw1pIY%q9|R=DOQ2rGG?>P@0`* z%{WErtQi|bn>95KlzfeLc)n<*HHzNEleXM^p>NOTAdB^#O<&ve^_*vs+b&$)R`|4% zs$SKTMD=y8c1y6Lz3th7Klz^;NnW@t`62rBL!m1~VCnJ+ho`ZjOQ%TQ+m+X6 z*G6KSQ2R8gpAL$f&Y+6JJ!L67lutQS;x^_l^SexEGez68!{=v4$3pC#eeZZ@C@*57 ztH^C{KEWL1B_%R1Wky9+85VwoU}t-rT<26=AMpb+mzz-L=w8*EQIG2T^ScfkWq2e@ zLVXTzPCdv&!}HeIyNC2himkFjAY%)0NsEnB7(pm&ThvRZG+xNC8an3zBQ=%~XfK^d zJHzh!XgJ+6ww+35rMT?IdwhWD!i~Yf0gBkLYN#zlML?*NOWw>Y9^c^C@7qeQNz7x7 zdw=GC92^&4K07MNU3{KQev%*i!1nV+Oqc9|8wU-ks48J+1P7v(biK=8W|SIFuZOar zoO2E^4&ju>3r?Rl`EBJ{z8w=(@A7 z!iGY(qtLCA3Y=G3KtjuA4Ilc$jd*~L+y$?+gK6iZnR)U{EFsB!Siq@=E%g?1t87gG9vkKJLwCr>Xnk4 zskAhWmhR9U=c8|*4AM_v>eUSIA@AzawlVf4z$!PUF$T2}`xhh6D%vpc=32F2Mx|Jdxpz$gHI8^f z@2#ans5G^_%Rt!Er#gGWUQC=2siSmp?&GNCd)XcTSp)dK2&MISe9y!i6n_OjTF>-B zEX&jrh}?D0HS(Q6VY>UBfH diff --git a/logs2/qemu-screenshot-20260609-222537.png b/logs2/qemu-screenshot-20260609-222537.png deleted file mode 100644 index fd5705ac3e137d03442ab93b8eea59b64681f60c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1375 zcmds1{a4a=6#jsjrkO`=xU@-aCv9nIYhvKbw!{<--=eZKK+RL;n&!k2sF0D?R5~>c zH%wdh!iHK}B)*$$(lqmUR1{Icm+}P>)Pm#-Ikxpz?EY|{d+&43bIv{YIrnO0c(9F? zlNA8K1{Z>j2Eg1@nr(xdGH?jIl4pW#i6PN=0BEiNFj)ZTO(W(k02D6(=E(qHN&#?8 zD{GAMGZFBFuwX1O+s8`3V(Kh1aQGmL`SlwRTReY7C#nEgC&gjEAy7wDWB40f%;xox z9|cyk5=sgmTOB!Ad~{W4e-^VTv&GOTLqF(7)#5nDAj=H9@K6mwut!D+B|c4Zzrd(c z<%A`lmY_6Iar5?S;NQpN%NhcQ$=x*Vl8JNoqTD(YEAC z6-B+GCkpGIwmL4tZtiN&5B>4rv61wJ^WyL0k3SH2KzOFE2)}>&i*n^Mrn=U>&*FVV zzus68%mbhzdSD~RNnFrwH$J%<}bC5zl2jDt%xhREmBu+Szph30|WV%F0>c zZ!Y5w6SrV4@j=YF-R)mmk>Jgb#1fwg9ZcfH)j+@pMl2ZLv+FWNZJbBE6%AOCDFw9| zev8=&bAux4^g(&d;gpM&w0*SJ`m^}O!NA>`131AGr+ArIlKJxPF&kaBh9{XO`fpZT zo?RVDY(nnVWPUOzYC3@|jrNshI4hp8DFj=_&-2?&XER0Hv;C)MM#mzY+yZa;=P1si z;;Tt*Z?>TJa??^7=W^rXstpT2K(LcNt{!trPJrk>iNi^$*ydB+n^TYM`}5llJ4JLX zQ%rddZ_eDy^@10!vUUvV5oCMCJ-(DBz^17hr&0V!rfu9y*DP+tuo^mrh7lXf@YI)X zqn%N=12pVzDa%nQwU(dv=05UdxN{P)aDXH_*x_r zx^l_|#)kZK{OeO*&7Sq%vJgyfgBCTM8hs}+sUBPV z?%9!Pj%1p3TCv-53rK0%py5G(coRHni0$wyN0@d#o>3?}#}p9FhxzP!*kW%9$HwdT zJUi^zy}AKQFMTV|xicc=a>LN(UXTKn=ViCl`7|u)5isqmcfnVWnT$x<-%kA8uV%UI zS|&A1qouiYCk5!+r^57;sCqTsf5^Y4ylsrNQjpq_3VV93t!j?9GcU=xJ86+Vapw3G zcN3jNt&#EBGeluIeL}F-!s*v`1T!m*S@c0|%pO(jNqHLz-dv~V&nV?933o2Zp~ewk z=)H|(2$`jpbs6wG`;;e-IEe_8LUo)j$!7w&bSJ;#KWl)%7m?H+^mh!LLH<|x!?oN1 zhb5_c(xG6@ca?N2)EJAkK7@Hz;h23J@y>e0u=dtO9(I3-3DczZng9D&KIr_9Kof7U XcvJO?oGXlZ_Rm_lpm1!>0dnr&w}wLL diff --git a/logs2/qemu-screenshot-20260609-225958.png b/logs2/qemu-screenshot-20260609-225958.png deleted file mode 100644 index 81a4b0d40777fde5e371e1f4532fc4519222a9c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1375 zcmds1`&ZI;82*5nsaeO%WV0rfJG7j=wbj6 z$t6u;-Ub356BK{}Mu(Xxd4|p;6^rvXS=?%h0HzD-eMbSs=_soXC>I!;CTC1)}>RHu`s>8DN{@YS5g9BA~{y`}|knlXt`5L`? zIWs8!{ERRA?(}W1z+c4P0hg7TZ|;276pxE9)sWYo%3hm@;U_I4(MB%&{8I(D2)Yei@;P>XHP0rsYe&@t+ho_n>pgvTQ9X8xh&gaZFlog%YnX23}XA`>pP2{ zRg;zLT7sbAc^hH{cF(CJH}J>fXU9^Ou8O{oK3Bzefp82>A@0cRm!*m|bWNS}fXRoD zL9M9#k!g(k@M?P zy;m|~7KVkC+2gW^Qwi70sfVd;4Oeh0!+r-;$FTfocF|IiIPKM=vlf~R6<0h<@Uf9+ z&u@&yHX{$H(mov)HlIfphkHp6 zAtJwkx1=57xWNlHnEOVwwj?Wg1y91{W0IGfW>LIQ#?Gi$4(XhbQ6+TI6Gmt%!BJj0 zj(3MW@Kv#TB}{}uVlKPt&UxZWcV@?6-~fqlT-VhXAtNBzOGy9*XF_tl3aEV zR9KRz2olvi`L5$yD@bTHRdJ!;-SMte+r98=1WdgcO)ropGWZ1JQ68%Sw$fk3ws89` z#}YG9Q9rcJP20xZ)g6+M-8f>?4-%l#oQ&3bkH%H4ElmCTeZbAL1|t%WbP&Gqu3am+ zl}1Tdsj2q8alYD)nIP>nszFKf8S$wtZJ%JS=O=X~!Jgl0uU_Ep&xzaB8@EE6x_oYi zvx7#Y)Jl1*If9^+HpSm;We=*m0vP4`blR{w;^1=R1z9@^-cqmR%_(H-F%NIZpr$b| z=!1oL1evas_ULf?2NV}h+X?a00%epY&SMI>`Y^ZaUuyurm!XtC&+q71o$Sxx$D3Kc z)~gcbv~~Wb*9P%^pgs~~eiGeThRAqe``&y^xB1RMo^pPS4pJoz82|HE{?qv%fht;O X^0xXlDN7L1`S)5_|6ok*F;doF0g*z) diff --git a/logs2/qemu-screenshot-20260609-232904.png b/logs2/qemu-screenshot-20260609-232904.png deleted file mode 100644 index 8a1a841f42aa9a1f9e225e9c95a32ef66d74b929..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1375 zcmeAS@N?(olHy`uVBq!ia0y~yU#6&t6xEMLdJ zI}HpBEH^z}978H@y}j!@X||OJTY#wZ+LolLJ)5~g-KK>7+#!@@#aFiX&#v2+%TJqa z^ql_Jm7_$^&+9|TR=wLHUUAz}wJYn_ysh)jjCyQ0eafSW)?Tx&*|=xCuX{F0X;-Fi z=DhEvpElor%6^T>M=;uoSx42iYkT|8{5sIyCpP2PvEBB97tf|Q#P82&Rp+;F!}nfaizi0&UVpM$yHWch`#=B7zy8j5U%|jIKj;e2bgARr zr>9-Ma_m%L&5YX|&twj-kh>RHbcN^l49n$rj-9HMXLx4z;Pv7cJ66iw6Mi_CQ7+N7 z;ic{Y6RvosJsXZ+Gk^G<@tV}^55F1A8RNR|>1nl=zW@75?CaqxTnVM!8%u27)h4~X zdbr|=+x>{(?8e1a##Q^aXZgOn>a6?0$#d%#sl?mIua%u!63+X*_QQ&6PvUGv9<;vr zc`JFhyzYlG*{g?lN6F6!vc6d&{a{O9X$XJ)%vXxQXaj=%2QAW{-?{5ArS3e}w(dce zS>oFG{a+-_3}+YQ*XK6H#H{`Eru;W!>{&IPm#?SW9bOhceR}qM1@pD%>$b~ZJeqSz z@Ig>?!|~D+Onb@cWxo!|M*>_(G+@*CmD zZ*ncKowYp>*xO_J`Olm4zuK94@^xe`E)`6u5>Ke&E|{YJX)iU3U%Rc(SUcb9Iu!eQ`h-wNqt{@JZNuZx^# z$o@UAt#$dCW?Z4adxjX+*KI69j{cB#X&}d7QKArlm`e8=o#}KPQU!^kbA@8zctlYzeVW1jgGy)-;8O`ruVC#zrO!DX;Jh2-@9&E|Nh5&?Yex; z``f4f_-b5y9UCfjIONfe_c7m7%^%8tT-1IDk~A2c&jeJQwalyc{B!@L-}?VecETTT zzJDa#{ond${9LcU(JtIRRtM*c*DetI!F}t`|F1yFVD0r*-XHQWvVzMMs5!%k`jGgC Y{mYuC2~9g94uZVp>FVdQ&MBb@0K9oag#Z8m diff --git a/logs2/qemu-screenshot-20260610-005734.png b/logs2/qemu-screenshot-20260610-005734.png deleted file mode 100644 index e9be55f6efdcfe8481542768ebf5fb29f2e7d9db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 282 zcmeAS@N?(olHy`uVBq!ia0y~yUa@a2CEqi4B`cIb_Lo1C76=D-CYOJbhi+U$Jp9Sn4ca zm39*-G{w`!F{I+w+k=K6D-JFA>YvM=zW~S_Fwk(F;k!Nq=LjPS(7)CMI6i5;HWsMQN#kn#asF&50vWAtSA+bZQxH zn0B%Y8)~Vcc)zeo)70ZpQA7hTrGg4-LGpzhyZjY`Zf zrA^^JMgkrm9EbrXhnVTtjh$Hr78hWq*ldn)bFNbyi3MPj1dI6wPZ?jD#NFngcWw^* z$iIpiUtCyce(Knr)9V7O3+U~ct@091GzlePT&#Q9Y-2SX78JAq9C9l@WUYm*GCoH4UCeHf;GKR*5)^d|1 z#+*Zp7D3x2*s89vCl#qRV~V@0Z86klj=1&aOI=4k%cexv-TbxXU|$l0*na-Xj^gK) zWYwCEAZVy>vt5SWb?nFw`texgc>3Zc(f4s@p75O^979`#J3RYknQ|3fRpT^h_91jg zXDAQk0#F_?yp3%qD(JmCG~C^DDXT=f<;`v(*Zx&_`tUZW#OujKch6-cc!QEFE9M2i z+P|`%x(Bn53t%j`bbMt_gtt5si9M&ZFtHs+4FOLWq2QIP<2AC%ps;x-95yGB3u-ca zmb2p*Mue2vW3s4|DOW0}hp2507jVlX{x0gHSpIXnIH^dS+5a#Sq0Lrv#j^z8o$_n* z>*EQ{NEdbHrz67Vv&fPNZ%M{3`EwQ-zk~j>Vz2RR#%S+6oHREv8EUuR|DJD-`~oVj zirD`46VyRYS}OfwZcI#-e(?tg7Tf3Gyr5+J2_F;L?3D67o>c=m4amVizU{JA-pWF>#ZlQ8+1w56t56fcaiBc|UWixWDgg3fut2u-CpO8@?e z?(qA5YF4j=X{(f2$S!$sp1IMT*zp)RK;j$M^tHvvCj-w^p_S;W$TY#= z_!IZzki_JQ`3YXZ(u;IrT~WegtIwBEJ(9;BEO$srR`R=}SP-SO=Y7!%t;}#{Ba8uE zKW7hPK|WgEtr_0Le zEHRUhYKOPD>)N=xx_2BvxaKJZ4Q(TK#u9fU7@s#i;I zW>T`$8mfJ7qMxo~CRjI(YEaR9M}4cy+9#Q71*u)Bu=<>*88Afv*NMH|sXxh_S=%Gy!zmRc2WPAOZ9e{fX>HH~{i z9}wbEWR^RK}jN6XK@@su*pe=M-|~L4Mc2)&Tx5!zg`T-_fyp*`Fa#H*)=~ zS0t)w>w*pMb>h7sLo~+X1iG`_Hv7KKdy8@X#ycZ<(&;HWSe-g(`p;kaPv?IG>NvgG X+sfCZTtQUl-)mt5LNL`wNx6RkKEp!< diff --git a/logs2/qemu-screenshot-20260610-145902.png b/logs2/qemu-screenshot-20260610-145902.png deleted file mode 100644 index 94f3cf5de83868e78f49636c2fa73db794c70d47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1375 zcmds1{a4a=6#jsjrJ+Y{x@nWzPS(=O*2KVJfSRYwIn9Y9P$46&sdQ>8 zZkTqm7dF(=B=Oy3lct%+qoRlkzU2!ls0GRwa_r@==>Bk@d+&43bIv{YIrnBrkUzrQ z!5jd9z#Yei0bpt@O?JYK8QA*X$Tq^x*yCY%0BFttFj)ZTj3eeO02DU>=E(qHiUF`s zE@=q$G7|8ZKz}SSIm}AAVeHIOad=*L~CY8=Plw$czk@Rma_6pK5Zs}pRkU^n7HotOYIvL*(yvf zFlU^jvfO8d%G_%Nv#*JS{2q- zP*kfrqOk6Hi~SO;XkS}Sz)#1{45uty7XJ_(@mSyr;hEZe{E?|IOO-2_%4(Nhv-iP$ zIzyR14}h|;{%srwac);pUw=pE<@93NmNz>@Jg2eHl>Ti{G5YaHN9PqJc!N?X%V&kZ zIgQzl--S6v`!VPCw|!+!f;T-COFYK4Fo^?K4FL}rF?a01zUvf~VczbYsNbAS$*oTH zTFQu-8xT>aj>*GMCR{D29j3L^UBWL7`0iI9#R+O1qGe)9+Uo~r5ZVkiPclXH-mbVl zyFMJ-h}^GE`*c9mcotb4<|$2eRMfI51S`fb^Sg{^Ge+x+BNt{yMuQ#p_}=x-R9r$u zSCU%aeu6s0O-^DYW<^C+>KA^5VCTA>UFVb>AJHQchm%mY)1$H{vkuw&=XdSaim*tg znDP?dly->g2G3h(?H<(Gk!=(Y`BIhuo4nXCh2n=Wt)gB#r*ngcRM2@ejMz|ur@r1Z z(h+*kN6qe%vh0;o3;AVt?$d(|7fuWo4v>WUReen%G8{slUh-yKL4SkWcwi&GCN_;V z?E9JbaZp@*`RoWkckyKk=~;g4Bb(0`QJvC9?rb+mNl^+q!r2hDq;oBQnO0q6^>^P>UUV|FS3XWZ{om@ynOS-+=Li6+7SM>`$x*T|3lIxD% zht_18J(*^aT(D=Q86-4sRr8=f+zAJ1cDvve_At$SG$T)z$P^GwhxqI|*iug+2jTX6 zwl#M2VNL%QH(d+Qu_HL)di~(`9*_W)W@j|lc+@ZJ>|mPdHUFDuj7B6KX(N8&Rkc!b zD~+12*3g`~;(T;%lYzPkRGo_MJ?LFk+B(Ww%}r`gf<3?0S~17ln;qxa6}LnmzZfye zwWO1%RWd$%hA1qhj|(=MIenUTe`dKMoj#xmKd=~iPTq=wH`S>4GfMet%>8R}sA1R> zdXJC{BGXl}PCb5aukzd}2N7XHsEX3Yd5j~M@8`7tXAR){DumjN{+@x;%l`^`vXSLu zyDU{r*ye6{u9NNt7$UJ2ConI{>@)7!tyv7~H{Kb^lP*s%f$F4Q(|`ZU|2iKKsH62} XZ!4zBS;Fua|Ez`c3&K_%C1?E&YJ5UI diff --git a/logs2/qemu-screenshot-20260610-213714.png b/logs2/qemu-screenshot-20260610-213714.png deleted file mode 100644 index f4694fbc674dc14a42b2affd0f14d41e3af84579..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1398 zcmds1{a4a=6#j%b(`c(%VOiPPS$2G3%;Q3QZ7qzP!`Eho<_p!dgp-OIr5JXoq#`#{ zv1r*+i<48yRMbR~N|sdA5nqr592gafnhGMK`*!*-c7M3{KF_`9`QhGsE-NYmzuIY& z698a!*gjkg0QOL7w+#k);Jl~k0u;6#*%w0q;EX!}3?={z5XE>0K+g97d`Jc$paKA7 z#?AKVAgBN%h2wF+&X<{01R;m)FhZ!qhcBGgZ{JjUNd}3*r^0Z%_tSnn+lPdzO!J@;GgH1&>#{evCB?!11KB=NsjOA!#-r`T)W9eU-_9oyedj`cXLD6iAm zI$M;en&WKc{L3*#x<&l+je#J1+NmUJ*ji{?I`#9d5 zpRyg5K4R_YL>f``ljmh1oNgj^@=NZ#E;G@_DbnfT#)$N$SB*h=sHCAG=3}fX&=`|= zuX*5jj>`<1V3?DAS-pa>D^8B!Y?54-miNhfdZW?LDRAo5lz$mJjF#Iv-bRxTHKL7O zHWLD#Q$&OK*Hu}(`JC@*9v7H9XaoTWA=0)fgmaUl13As@pr{C7!g3kf%|nB8->vqP!3T|0bedUdR~O~3E3h{ z>l;`(V#8}6M^$b;E9obTiCqQneaR%usA_2#-iD2brf)r0|C@99>|A(dN}o(BZI1k% zJCNEi;niM2z`_zvtm5zD*wZFRm=w6njAMBH+=k?@H8r&gW-~5hqCs?UELMK(spZ^4>DhfZTiNh=xk&E)7+zNXhn}tEbEV4*D-SDF>a>rkRUPriX_w3 z9J{g0r$F{lZCGBX3Hjzao}tCaY-Al4F*(rs%r(PkEvr<#pruH+}ehiWg{ItOGcdhS~N zMTt3!E}Er;(@Icv!ezJouxB_MR83xPPswkNtH>ivBlsz(k@C|Pd4bMTc6|IXbIKmPJOO$kgCv*TZ*|E1v7;C4as>{>5Z$G zNC#V>COUdEDm~#n-+W%*DEvS(o;S216Rll&ffRH;96Kx%q*96{HA($*#^$w}GI~;Q z(()}o=Piq>!G4v(>~%1yYg%~HYsT*{T*Ikfk0WAP+D@uMFv2|hguB(r?(=0JeD;h6 z>sxK^(}HXCjwR=XU!J5kJazM4%KfMgC|lqZZK%jTw|scEkf@1Fn^_+GRIKYTcz3Hq hkt;t-{NKDtI`6>C)-ltB@K0Y8goQ@n>VHZ;_aEopTUY=9 diff --git a/logs2/qemu-screenshot-20260611-002306.log b/logs2/qemu-screenshot-20260611-002306.log deleted file mode 100644 index aff53f54..00000000 --- a/logs2/qemu-screenshot-20260611-002306.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:199e9f695072ae75c77b893a73b6a7382fe94782bc78e1f32bdb67b9e97400ae -size 459201 diff --git a/logs2/qemu-screenshot-20260611-004156.log b/logs2/qemu-screenshot-20260611-004156.log deleted file mode 100644 index 7affce54..00000000 --- a/logs2/qemu-screenshot-20260611-004156.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ba128e200b7f3d691f1eeae1a924f37522f7ee162041716f383eef2b4d57af30 -size 459018 diff --git a/logs2/qemu-screenshot-20260611-012817.log b/logs2/qemu-screenshot-20260611-012817.log deleted file mode 100644 index 2347d6e7..00000000 --- a/logs2/qemu-screenshot-20260611-012817.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0712969ca14c5963b7499d5afa4252578f1fe78131f1a17fe405122c88895b08 -size 25304214 diff --git a/logs2/qemu-screenshot-20260611-023758.log b/logs2/qemu-screenshot-20260611-023758.log deleted file mode 100644 index 42970cdc..00000000 --- a/logs2/qemu-screenshot-20260611-023758.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7714a174fbb9793b69d1898fa5ac98ef9bcb6d48ec38cdea3c3a90e00f6f1565 -size 604233 diff --git a/logs2/qemu-screenshot-20260611-024401.log b/logs2/qemu-screenshot-20260611-024401.log deleted file mode 100644 index 7209e51f..00000000 --- a/logs2/qemu-screenshot-20260611-024401.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bebab938202d4aa165b10f57995cadf09381f0fccf7ec076fb9f3feb4f42d76a -size 2866250 diff --git a/logs2/qemu-screenshot-20260611-173657.log b/logs2/qemu-screenshot-20260611-173657.log deleted file mode 100644 index c60e60bd..00000000 --- a/logs2/qemu-screenshot-20260611-173657.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1c06d0476ea2356dce906c9d5fb6fb92bdd63d40449bef71fc56e4cf2e38c67c -size 452560 diff --git a/logs2/qemu-screenshot-20260611-174914.log b/logs2/qemu-screenshot-20260611-174914.log deleted file mode 100644 index 68fb3be5..00000000 --- a/logs2/qemu-screenshot-20260611-174914.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fa5498124fe32dfafdebf6357953bf0c984302be801c3de8a5892a5716212ac8 -size 452631 diff --git a/logs2/qemu-screenshot-20260611-175224.log b/logs2/qemu-screenshot-20260611-175224.log deleted file mode 100644 index 6ae2e0a1..00000000 --- a/logs2/qemu-screenshot-20260611-175224.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cee76955a92b5cb596c9b151127800e39a3e27014566c564c35938f4edee0abb -size 452264 diff --git a/logs2/qemu-screenshot-20260611-190757.log b/logs2/qemu-screenshot-20260611-190757.log deleted file mode 100644 index 8676f52f..00000000 --- a/logs2/qemu-screenshot-20260611-190757.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ccd417963fa0ba7df6837e024585f7cde5fd9d9590731566415396b40bab786a -size 452625 diff --git a/logs2/qemu-screenshot-20260611-202932.log b/logs2/qemu-screenshot-20260611-202932.log deleted file mode 100644 index 4318c6eb..00000000 --- a/logs2/qemu-screenshot-20260611-202932.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:39778c1b2c0305f5cca9a5721f32e6acfc62cc1061a045b211231e4ca984a81f -size 452591 diff --git a/logs2/qemu-screenshot-20260612-115354.log b/logs2/qemu-screenshot-20260612-115354.log deleted file mode 100644 index d2677734..00000000 --- a/logs2/qemu-screenshot-20260612-115354.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:70965feaf792b1c68be9ad045ab3927fb19761a6fb094cdd17b08fa737287e51 -size 450345 diff --git a/logs2/qemu-screenshot-20260612-160054.log b/logs2/qemu-screenshot-20260612-160054.log deleted file mode 100644 index 8ee35b46..00000000 --- a/logs2/qemu-screenshot-20260612-160054.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ab2fb5c928eccdaf8ffe880b56cc58e1d48b5c8cc1432ee86acf3c1716a226d0 -size 452714 diff --git a/logs2/qemu-screenshot-20260612-174331.log b/logs2/qemu-screenshot-20260612-174331.log deleted file mode 100644 index 93393887..00000000 --- a/logs2/qemu-screenshot-20260612-174331.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bfb85553d48568163408c013ad76dfe3d6b2ef633517a3bbcd0dc1366f0d5c78 -size 452712 diff --git a/logs2/qemu-screenshot-20260614-163902.log b/logs2/qemu-screenshot-20260614-163902.log deleted file mode 100644 index 7968ffa0..00000000 --- a/logs2/qemu-screenshot-20260614-163902.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9cfedb98dd49805599db38c2d8f7d974399c2adc4f18719d2514148369ad8d9c -size 452394 diff --git a/logs2/qemu-screenshot-20260614-182044.log b/logs2/qemu-screenshot-20260614-182044.log deleted file mode 100644 index e69de29b..00000000 diff --git a/logs2/qemu-screenshot-20260614-182127.log b/logs2/qemu-screenshot-20260614-182127.log deleted file mode 100644 index 89d3a041..00000000 --- a/logs2/qemu-screenshot-20260614-182127.log +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1105c2be14434743bc2ab87c17e362523c02be36ea29beaa2d66d49bcce1d076 -size 453849 diff --git a/mk/Kconfig.mk b/mk/Kconfig.mk index 4d2bfc08..a5575e78 100644 --- a/mk/Kconfig.mk +++ b/mk/Kconfig.mk @@ -1,5 +1,5 @@ # ============================================================================== -# mk/Kconfig.mk — shared Kconfig bridge for Makefile and Makefile.starkernel +# mk/Kconfig.mk — shared Kconfig bridge for Makefile and kernel/Makefile # ============================================================================== # # Included by both build systems, after each has finished resolving its own @@ -101,7 +101,7 @@ savedefconfig: $(KCONFIG_CONF) # dispatching any -jN jobs" behavior fully serializes "regenerate config" # before "compile anything" -- for free, with no hand-maintained # prerequisite list. Deliberately not the include/version.h-style -# order-only pattern (Makefile.starkernel:49-53/656-658), which needed its +# order-only pattern (kernel/Makefile:49-53/656-658), which needed its # own special-cased -j/clean workaround once already. # # Guarded on the config file already existing: until a developer opts in via diff --git a/mk/README.md b/mk/README.md index 98155bfe..74fd285f 100644 --- a/mk/README.md +++ b/mk/README.md @@ -1,7 +1,7 @@ # mk/ - `Kconfig.mk` — shared Kconfig bridge included by both `Makefile` and - `Makefile.starkernel`. Each Makefile canonicalizes its own `ARCH` and + `kernel/Makefile`. Each Makefile canonicalizes its own `ARCH` and sets `KCONFIG_ARCH_DIR` before including this file, since the hosted and kernel builds map `aarch64` to different object-directory names. Config lives per-architecture under `build/$(KCONFIG_ARCH_DIR)/` rather diff --git a/scripts/mkdiskimage.sh b/scripts/mkdiskimage.sh new file mode 100644 index 00000000..f0bb89c7 --- /dev/null +++ b/scripts/mkdiskimage.sh @@ -0,0 +1,91 @@ +#!/usr/bin/env bash +# mkdiskimage.sh -- build a single-partition FAT32 boot disk image. +# +# Used by `make boot_image TARGET=` (kernel/Makefile). One script for +# every board so the geometry rules live in one place: +# - partition 1 starts at 1 MiB (sector 2048) and runs to the last usable +# sector; the FAT32 filesystem is sized to the partition exactly (a +# larger filesystem overruns the partition -- the bug that made early +# SER5 thumbdrive images unbootable, see kernel/Makefile `thumbdrive`); +# - GPT tables reserve 33 sectors at the end of the disk for the backup +# header, MBR tables do not. +# +# Usage: +# mkdiskimage.sh --out IMG --table gpt|mbr --size-mib N --label LABEL \ +# SRC:DEST [SRC:DEST ...] +# +# --table gpt -> partition type "EFI System" (UEFI firmware, U-Boot bootefi) +# --table mbr -> partition type 0x0c FAT32 (LBA) (Raspberry Pi firmware) +# DEST is an absolute path inside the FAT filesystem; parent directories are +# created as needed. +# +# Needs only sfdisk (util-linux), mkfs.fat (dosfstools) and mtools -- no +# root, no loop devices. +set -euo pipefail + +OUT="" TABLE="" SIZE_MIB="" LABEL="" +while [ $# -gt 0 ]; do + case "$1" in + --out) OUT="$2"; shift 2 ;; + --table) TABLE="$2"; shift 2 ;; + --size-mib) SIZE_MIB="$2"; shift 2 ;; + --label) LABEL="$2"; shift 2 ;; + --) shift; break ;; + -*) echo "mkdiskimage.sh: unknown option $1" >&2; exit 2 ;; + *) break ;; + esac +done + +[ -n "$OUT" ] && [ -n "$TABLE" ] && [ -n "$SIZE_MIB" ] && [ -n "$LABEL" ] || { + echo "mkdiskimage.sh: --out, --table, --size-mib and --label are required" >&2; exit 2; } +[ $# -gt 0 ] || { echo "mkdiskimage.sh: no SRC:DEST files given" >&2; exit 2; } + +for tool in sfdisk mkfs.fat mmd mcopy; do + command -v "$tool" >/dev/null 2>&1 || PATH="$PATH:/usr/sbin:/sbin" + command -v "$tool" >/dev/null 2>&1 || { + echo "mkdiskimage.sh: $tool not found (install util-linux, dosfstools, mtools)" >&2; exit 1; } +done + +TOTAL_SECTORS=$(( SIZE_MIB * 2048 )) +START=2048 +case "$TABLE" in + gpt) LAST=$(( TOTAL_SECTORS - 34 )); PTYPE="C12A7328-F81F-11D2-BA4B-00A0C93EC93B" ;; + mbr) LAST=$(( TOTAL_SECTORS - 1 )); PTYPE="c" ;; + *) echo "mkdiskimage.sh: --table must be gpt or mbr" >&2; exit 2 ;; +esac +PART_SECTORS=$(( LAST - START + 1 )) + +ESP="$OUT.part1" +rm -f "$OUT" "$ESP" +mkdir -p "$(dirname "$OUT")" + +truncate -s $(( TOTAL_SECTORS * 512 )) "$OUT" +if [ "$TABLE" = gpt ]; then + printf 'label: gpt\nstart=%d, size=%d, type=%s, name="EFI System"\n' \ + "$START" "$PART_SECTORS" "$PTYPE" | sfdisk --quiet "$OUT" +else + printf 'label: dos\nstart=%d, size=%d, type=%s, bootable\n' \ + "$START" "$PART_SECTORS" "$PTYPE" | sfdisk --quiet "$OUT" +fi + +truncate -s $(( PART_SECTORS * 512 )) "$ESP" +mkfs.fat -F 32 -n "$LABEL" "$ESP" >/dev/null + +for spec in "$@"; do + src="${spec%%:*}" + dest="${spec#*:}" + [ -f "$src" ] || { echo "mkdiskimage.sh: missing input $src" >&2; rm -f "$OUT" "$ESP"; exit 1; } + dir="$(dirname "$dest")" + path="" + IFS=/ read -r -a parts <<< "${dir#/}" + for p in "${parts[@]}"; do + [ -n "$p" ] || continue + path="$path/$p" + mmd -D s -i "$ESP" "::$path" 2>/dev/null || true + done + mcopy -o -i "$ESP" "$src" "::$dest" +done + +dd if="$ESP" of="$OUT" bs=512 seek="$START" conv=notrunc status=none +rm -f "$ESP" +echo " IMAGE $OUT ($TABLE, ${SIZE_MIB} MiB, FAT32 '$LABEL')" diff --git a/scripts/perf-profile.sh b/scripts/perf-profile.sh index 4953aee7..c38c489d 100755 --- a/scripts/perf-profile.sh +++ b/scripts/perf-profile.sh @@ -50,7 +50,7 @@ ARGS=(--log-error --run-tests) # We need to run specific control word tests echo "[CLEAN]"; make clean echo "[BUILD performance w/ symbols for profiling]" -make CFLAGS="-std=c99 -O3 -g -fno-omit-frame-pointer -DSTARFORTH_PERFORMANCE -DNDEBUG -march=native -Wall -Werror -Iinclude -Isrc/word_source -Isrc/test_runner/include -DSTRICT_PTR=1" LDFLAGS="" +make -f v3/Makefile CFLAGS="-std=c99 -O3 -g -fno-omit-frame-pointer -DSTARFORTH_PERFORMANCE -DNDEBUG -march=native -Wall -Werror -Iv3/include -Ikernel/include -Iv3/src/word_source -Iv3/src/test_runner/include -DSTRICT_PTR=1" LDFLAGS="" [[ -x "$EXE" ]] || { echo "ERROR: $EXE missing/not executable"; exit 2; } diff --git a/scripts/perf-profile_control.sh b/scripts/perf-profile_control.sh index bc685855..7d6874e5 100755 --- a/scripts/perf-profile_control.sh +++ b/scripts/perf-profile_control.sh @@ -48,7 +48,7 @@ set -euo pipefail EXE="./build/starforth" echo "[CLEAN]"; make clean echo "[BUILD for control words profiling]" -make CFLAGS="-std=c99 -O3 -g -fno-omit-frame-pointer -DSTARFORTH_PERFORMANCE -DNDEBUG -march=native -Wall -Werror -Iinclude -Isrc/word_source -Isrc/test_runner/include -DSTRICT_PTR=1" LDFLAGS="" +make -f v3/Makefile CFLAGS="-std=c99 -O3 -g -fno-omit-frame-pointer -DSTARFORTH_PERFORMANCE -DNDEBUG -march=native -Wall -Werror -Iv3/include -Ikernel/include -Iv3/src/word_source -Iv3/src/test_runner/include -DSTRICT_PTR=1" LDFLAGS="" [[ -x "$EXE" ]] || { echo "ERROR: $EXE missing/not executable"; exit 2; } diff --git a/scripts/remove_loop_conditionals.sh b/scripts/remove_loop_conditionals.sh index 50c9e6bb..7070b0a0 100755 --- a/scripts/remove_loop_conditionals.sh +++ b/scripts/remove_loop_conditionals.sh @@ -50,9 +50,9 @@ echo "Removing ENABLE_LOOP conditional compilation directives..." # Files to process FILES=( - "src/vm.c" - "src/inference_engine.c" - "src/doe_metrics.c" + "v3/src/vm.c" + "v3/src/inference_engine.c" + "v3/src/doe_metrics.c" ) for file in "${FILES[@]}"; do diff --git a/tools/README.md b/tools/README.md index 2799879f..272fdd21 100644 --- a/tools/README.md +++ b/tools/README.md @@ -7,7 +7,7 @@ toolchain. | File | Purpose | |------|---------| -| `mkcapsule.c` | Assembles `.4th` capsule files into `capsule_generated.c` baked into the kernel image. Invoked automatically by `Makefile.starkernel`. | +| `mkcapsule.c` | Assembles `.4th` capsule files into `capsule_generated.c` baked into the kernel image. Invoked automatically by `kernel/Makefile`. | | `mkcapsule` | Compiled host binary (rebuilt on demand). | | `ttftest.c` | Host TTF glyph-rendering test — font rasterization unit tests, no QEMU needed. | | `pe_reloc_gen.py` | Generates PE32+ relocation tables for the UEFI loader. | @@ -21,7 +21,7 @@ toolchain. ```bash # Invoked automatically by the kernel build: -make -f Makefile.starkernel ARCH=amd64 clean qemu +make -f kernel/Makefile ARCH=amd64 clean qemu # Manual invocation (for inspection): ./tools/mkcapsule capsules/ build/amd64/kernel/capsule_generated.c @@ -33,5 +33,5 @@ type `(m)` to `init.4th` and `(p)` to everything else. ## See also - [`capsules/README.md`](../capsules/README.md) — capsule file format and block namespace -- [`Makefile.starkernel`](../Makefile.starkernel) — kernel build system +- [`kernel/Makefile`](../kernel/Makefile) — kernel build system - [Project root](../README.md) diff --git a/tools/ttftest.c b/tools/ttftest.c index 756298b3..ed93aabc 100644 --- a/tools/ttftest.c +++ b/tools/ttftest.c @@ -25,7 +25,7 @@ #include #include -#include "../include/starkernel/ttf.h" +#include "../kernel/include/starkernel/ttf.h" typedef struct { uint32_t codepoint; diff --git a/v3/Makefile b/v3/Makefile new file mode 100644 index 00000000..930d6253 --- /dev/null +++ b/v3/Makefile @@ -0,0 +1,1340 @@ +# ============================================================================== +# StarForth Build System - The Fastest Forth in the West! +# ============================================================================== +# +# Quick Start: +# make - Standard optimized build (auto ARCH, TARGET=standard) +# make TARGET=fastest - Maximum performance build +# make ARCH=arm64 TARGET=fastest - Build for arm64 (e.g., Raspberry Pi 4) +# make help - Show all available targets +# +# ============================================================================== + +# ============================================================================== +# CONFIGURATION +# ============================================================================== + +VERSION ?= 3.2.0 +CC = gcc + +# Isabelle configuration +# NOTE: Isabelle must be installed separately and available on PATH +# See docs/DEVELOPER.md for installation instructions +ISABELLE ?= isabelle + +# Architecture / target selection +ARCH ?= $(shell uname -m) +ARCH := $(strip $(ARCH)) +TARGET ?= standard +TARGET := $(strip $(TARGET)) + +# Friendly guardrail: 32-bit builds are not supported +unsupported_32bit_arches := i386 i486 i586 i686 x86 armv6 armv7 armv7l arm +ifneq ($(filter $(ARCH),$(unsupported_32bit_arches)),) + $(error StarForth targets 64-bit platforms only. ARCH='$(ARCH)' is unsupported. Please build on amd64/arm64/raspi/riscv64.) +endif + +# Canonical architecture normalization (x86_64→amd64, aarch64→arm64, etc.) +canon_arch = $(strip $(if $(filter x86_64,$1),amd64,$(if $(filter amd64,$1),amd64,$(if $(filter aarch64 arm64,$1),arm64,$(if $(filter riscv riscv64,$1),riscv64,$1))))) +ARCH_DIR := $(call canon_arch,$(ARCH)) +# Normalize ARCH for consistent ifeq matching +ARCH := $(call canon_arch,$(ARCH)) + +# Kconfig bridge (menuconfig/xconfig/config/oldconfig/*_defconfig). See +# mk/Kconfig.mk for why KCONFIG_ARCH_DIR must be set here, before include. +# .DEFAULT_GOAL is pinned explicitly because mk/Kconfig.mk's first rule +# would otherwise silently become Make's default goal, since it's included +# before this Makefile's own `all:` target is defined below. +.DEFAULT_GOAL := all +KCONFIG_ARCH_DIR := $(ARCH_DIR) +include mk/Kconfig.mk + +# Kconfig platform-mode choice (Phase 5): PLATFORM_DEFAULT/PLATFORM_MINIMAL +# in Kconfig.variant (PLATFORM_L4RE removed -- L4Re support is historical, +# see the "Platform support" section below). Must run this early -- before +# anything below that branches on MINIMAL -- since Make evaluates a Makefile +# top-to-bottom and a variable's value at the point an `ifdef` is reached is +# whatever it resolved to *so far*, not its final value. Only applies when a +# developer hasn't already set MINIMAL explicitly (command line or +# environment) -- `ifdef` in the "Platform support" section below cares +# about definedness, not value, so this can't reuse the kconfig_bool/ +# kconfig_int pattern (those always define their target variable once +# active). Checked with $(origin ...) so an explicit `make MINIMAL=1` (or +# unset) always wins over whatever .config says. +ifeq ($(KCONFIG_ACTIVE),1) +ifeq ($(origin MINIMAL),undefined) +ifeq ($(CONFIG_PLATFORM_MINIMAL),y) +MINIMAL := 1 +endif +endif +endif + +ifeq ($(ARCH),amd64) + ARCH_NAME = x86_64 + ARCH_FLAGS = -march=native + ARCH_DEFINES = -DARCH_X86_64=1 + ASM_SYNTAX = -masm=intel +else ifeq ($(ARCH),arm64) + ARCH_NAME = ARM64 + ARCH_FLAGS = -march=armv8-a+crc+simd -mtune=cortex-a72 + ARCH_DEFINES = -DARCH_ARM64=1 + ASM_SYNTAX = +else ifeq ($(ARCH),raspi) + ARCH_NAME = Raspberry Pi 4 (ARM64) + ARCH_FLAGS = -march=armv8-a+crc+simd -mtune=cortex-a72 + ARCH_DEFINES = -DARCH_ARM64=1 -DRASPBERRY_PI_BUILD=1 + ASM_SYNTAX = +else ifeq ($(ARCH),riscv64) + ARCH_NAME = RISC-V 64 (QEMU) + ARCH_FLAGS = -march=rv64gc -mabi=lp64d -mcmodel=medany + ARCH_DEFINES = -DARCH_RISCV64=1 + ASM_SYNTAX = +else ifeq ($(ARCH),riscv) + ARCH_NAME = RISC-V 64 (QEMU) + ARCH_FLAGS = -march=rv64gc -mabi=lp64d -mcmodel=medany + ARCH_DEFINES = -DARCH_RISCV64=1 + ASM_SYNTAX = +else + $(warning Unknown architecture: $(ARCH), using generic flags) + ARCH_NAME = generic + ARCH_FLAGS = + ARCH_DEFINES = + ASM_SYNTAX = +endif + +# Compiler flags +# Feature switches (default: enabled) +# Physics/SSM knob family: repointed through the Kconfig bridge (see +# mk/Kconfig.mk's kconfig_bool/kconfig_int) as of the Kconfig migration's +# Phase 3. Each call below is a drop-in replacement for a bare `?=`: when +# no build/$(ARCH)/.config exists (KCONFIG_ACTIVE unset), it's exactly +# `VAR ?= default`, identical to before; once a .config exists, the +# Kconfig-fed value takes over. `make VAR=x` on the command line always +# wins regardless of which branch fires. +# +# STRICT_PTR: VM memory bounds checking on every pointer access +# Default: 1 (enabled). Disable only for raw benchmarking comparisons. +$(eval $(call kconfig_bool,STRICT_PTR,1)) + +# ENABLE_HOTWORDS_CACHE: Physics-driven hot-words cache (1.78× speedup on dictionary lookups) +# Default: 1 (enabled - experiments show cache is optimal) +# Set ENABLE_HOTWORDS_CACHE=0 to disable (for research comparison only) +$(eval $(call kconfig_bool,ENABLE_HOTWORDS_CACHE,0)) + +# ENABLE_PIPELINING: Speculative execution via word transition prediction +# Default: 1 (enabled - experiments show pipelining is optimal) +# Set ENABLE_PIPELINING=0 to disable (for research comparison only) +# NOTE: As of 2025-11-19, all future experiments use both cache and pipelining enabled +$(eval $(call kconfig_bool,ENABLE_PIPELINING,0)) + +# EMERGENCY_CONSOLE_ENABLED: 1 = REPL recovers from errors and continues (interactive fallthrough) +# 0 = errors are non-recoverable; REPL exits and vm_fault_handler() is called instead +# Default: 1 (dev/recovery builds) +# Set EMERGENCY_CONSOLE_ENABLED=0 for production, embedded, or high-security builds +# where no interactive fallthrough surface should exist. +# Heartbeat family: repointed through the Kconfig bridge (Phase 4). Same +# drop-in-replacement-for-`?=` behavior as the physics/SSM family (Phase 3). +$(eval $(call kconfig_bool,EMERGENCY_CONSOLE_ENABLED,1)) + +# Heartbeat configuration +# HEARTBEAT_THREAD_ENABLED: 1 = run vm_tick() in background thread (OPTIMAL), 0 = inline (legacy) +# Default: 1 (experiments show threaded heartbeat is optimal for adaptive tuning) +# NOTE: As of 2025-11-19, all future experiments use heartbeat enabled +$(eval $(call kconfig_bool,HEARTBEAT_THREAD_ENABLED,1)) + +# HEARTBEAT_TICK_NS: Wake frequency for heartbeat thread (default 1ms) +$(eval $(call kconfig_int,HEARTBEAT_TICK_NS,10000)) + +# HEARTBEAT_CHECK_FREQUENCY / HEARTBEAT_WINDOW_TUNING_FREQUENCY / +# HEARTBEAT_SLOPE_VALIDATION_FREQUENCY: previously unwired in the hosted +# Makefile -- no `?=` and no -D forwarding existed for any of these three +# before Phase 4, so hosted builds always got starforth_config.h's bare +# defaults (256/1000/5000) with no override mechanism at all. The kernel +# Makefile has always had opt-in forwarding for them (VM_FEATURE_FLAG_VARS). +# Promoted here for parity, same treatment as Phase 3's SSM_* knobs. +$(eval $(call kconfig_int,HEARTBEAT_CHECK_FREQUENCY,256)) +$(eval $(call kconfig_int,HEARTBEAT_WINDOW_TUNING_FREQUENCY,1000)) +$(eval $(call kconfig_int,HEARTBEAT_SLOPE_VALIDATION_FREQUENCY,5000)) + +# HISTORICAL: L4Re had no pthreads, so this forced HEARTBEAT_THREAD_ENABLED +# off whenever L4RE=1 was set. L4Re support is no longer an active target; +# see "Platform support" below. +# ifeq ($(L4RE),1) +# HEARTBEAT_THREAD_ENABLED := 0 +# endif + +# Feedback Loop Toggle Switches (for systematic performance measurement) +# ============================================================================ +# These allow turning each feedback loop on/off to measure additive performance gains +# EXP_00-BASELINE: all loops OFF (plain FORTH-79) +# EXP_01: Loop #1 ON +# EXP_02: Loops #1-2 ON +# ... etc, building cumulatively to measure each loop's contribution + +# ============================================================================== +# SSM (Steady State Machine) Configuration - Data-Driven Architecture +# ============================================================================== +# Based on 2^7 DoE with 300 reps (128 configs, 38,400 runs). +# Top 5% analysis (speed + stability) reveals optimal loop combinations. +# +# Experimentally Validated Architecture: +# L1 (heat_tracking): DISABLED (harmful in 86% of top configs) +# L4 (pipelining_metrics): DISABLED (harmful in 100% of top configs) +# L7 (adaptive_heartrate): ALWAYS ON (beneficial in 71% of top configs) +# L2, L3, L5, L6: Runtime-controlled by L8 (workload-dependent) +# L8 (Jacquard): 4-bit mode selector (16 modes: C0-C15) +# +# L8 dynamically controls L2/L3/L5/L6 based on entropy, CV, and temporal metrics. +# Top 5% validated modes: C4, C7, C9, C11, C12 (see v3/src/ssm_jacquard.c) + +# Tuning Knobs (Physics-driven Optimization System) +# ============================================================================ +# Knob #7: ROLLING_WINDOW_SIZE (Initial execution history capture) +# - Default: 4096 (conservative, ensures statistical significance at cold start) +# - Usage: make ROLLING_WINDOW_SIZE=8192 (larger for complex workloads) +# or ROLLING_WINDOW_SIZE=2048 (smaller for memory constraints) +# - System AUTOMATICALLY shrinks during execution if diminishing returns detected +# - Window starts conservative, self-tunes down if pattern diversity plateaus +# - Window becomes "warm" (representative) after N executions, then adapts +$(eval $(call kconfig_int,ROLLING_WINDOW_SIZE,4096)) + +# Knob #6: TRANSITION_WINDOW_SIZE (Pipelining context depth) +# - Default: 8 (see starforth_config.h for the exact shipped value) +# - Usage: make TRANSITION_WINDOW_SIZE=1 (or 2, 4 for shallower context) +# - Empirically tuned via binary chop: 1 vs 2 vs 4 vs 8 +$(eval $(call kconfig_int,TRANSITION_WINDOW_SIZE,8)) + +# SPECULATION_THRESHOLD_Q48 / SPECULATION_DEPTH / MIN_SAMPLES_FOR_SPECULATION / +# MISPREDICTION_COST_Q48 / MINIMUM_PREFETCH_ROI: previously hardcoded, +# non-overridable #define in physics_pipelining_metrics.h -- no Makefile +# knob or -D forwarding existed for any of these five before Phase 5. +# Promoted here for parity, same treatment as Phase 3/4's other +# previously-unwired constants. All five are Q48.16-fixed-point or plain +# counts meaningful only when ENABLE_PIPELINING is on; see Kconfig.physics +# for the exact hex/decimal defaults. MINIMUM_PREFETCH_ROI's default was +# corrected from the long-shipped 0x11999A to 0x1199A (rev y) -- the +# former was ~17.6 in Q48.16, not the documented 1.10. +$(eval $(call kconfig_int,SPECULATION_THRESHOLD_Q48,0x8000)) +$(eval $(call kconfig_int,SPECULATION_DEPTH,1)) +$(eval $(call kconfig_int,MIN_SAMPLES_FOR_SPECULATION,10)) +$(eval $(call kconfig_int,MISPREDICTION_COST_Q48,0x190000)) +$(eval $(call kconfig_int,MINIMUM_PREFETCH_ROI,0x1199A)) + +# Knobs #8-11: Adaptive Window Shrinking Control +# ============================================================================ +# These control how aggressively the rolling window learns and adapts +# (NOT the initial window size - that's ROLLING_WINDOW_SIZE above) + +# Knob #8: ADAPTIVE_SHRINK_RATE (percentage to retain when shrinking) +# - Default: 50 (shrink to 50% = discard 50% each cycle) +# - Range: 50-95 (lower = more aggressive, higher = more conservative) +# - Usage: make ADAPTIVE_SHRINK_RATE=75 (slower learning) or 90 (slow learning) +$(eval $(call kconfig_int,ADAPTIVE_SHRINK_RATE,50)) + +# Knob #9: ADAPTIVE_MIN_WINDOW_SIZE (floor to prevent over-shrinking) +# - Default: 256 (never shrink below 256 word IDs) +# - Range: 64-1024 (smaller = leaner, larger = safer) +# - Usage: make ADAPTIVE_MIN_WINDOW_SIZE=512 (conservative) or 128 (lean) +$(eval $(call kconfig_int,ADAPTIVE_MIN_WINDOW_SIZE,256)) + +# Knob #10: ADAPTIVE_CHECK_FREQUENCY (how often to measure diversity) +# - Default: 512 (check after every 512 executions) +# - Range: 32-1024 (more = faster response, less = less overhead) +# - Usage: make ADAPTIVE_CHECK_FREQUENCY=128 (responsive) or 256 (default of comparable knobs) +$(eval $(call kconfig_int,ADAPTIVE_CHECK_FREQUENCY,512)) + +# Knob #11: ADAPTIVE_GROWTH_THRESHOLD (growth rate that signals saturation) +# - Default: 5 (shrink when growth < 5%) +# - Range: 0-10 (lower = eager shrinking, higher = cautious) +# - Usage: make ADAPTIVE_GROWTH_THRESHOLD=0 (aggressive) or 1 (less conservative) +$(eval $(call kconfig_int,ADAPTIVE_GROWTH_THRESHOLD,5)) + +# Knob #11a: INITIAL_DECAY_SLOPE_Q48 (Starting decay slope for inference engine) +# - Default: 21845 (1/3 in Q48.16 format, = 0.333... starting slope) +# - Range: 13107-43691 (0.2 to 0.67 in Q48.16) +# - Usage: make INITIAL_DECAY_SLOPE_Q48=13107 (0.2) or 32768 (0.5) or 43691 (0.67) +# - DoE: OPP #3 tests 0.2, 0.33, 0.5, 0.67 to find optimal starting point for convergence +# - Note: Inference engine adapts this value at runtime; this is just the cold-start value +$(eval $(call kconfig_int,INITIAL_DECAY_SLOPE_Q48,21845)) + +# Knob #11b: DECAY_MIN_INTERVAL (Minimum time before decay applies) +# - Default: 500 (nanoseconds) +# - Range: 500-5000 (balance between decay sensitivity and overhead) +# - Usage: make DECAY_MIN_INTERVAL=1000 (slower decay) or 2000 (slower still) +# - NOTE: as of the tick-based Loop #3 decay conversion (rev t, see +# docs/working/architecture/VM-FLEET-ATTRACTOR-DESIGN-20260705.md), +# Loop #3 no longer consults this value at all -- decay is gated on +# elapsed heartbeat ticks, not elapsed nanoseconds. Kept only because +# doe_metrics.c still reports it as a metrics field; informational, +# not load-bearing. +$(eval $(call kconfig_int,DECAY_MIN_INTERVAL,500)) + +# Knob #11d: HEARTBEAT_INFERENCE_FREQUENCY (How often to run inference engine) +# - Default: 1000 (ticks between inference runs) +# - Set VERY HIGH (999999) to effectively disable inference (static mode) +# - Set LOW for frequent inference (adaptive mode) +# - DoE: OPP #3 tests 999999 (static, no Loop #6) vs 1000 (adaptive, with Loop #6) +# - Measures: Inference engine cost vs benefit in optimized performance +$(eval $(call kconfig_int,HEARTBEAT_INFERENCE_FREQUENCY,1000)) + +# Knob #12: DECAY_RATE_PER_US_Q16 (Heat decay rate in Q16 fixed-point) +# - Default: 1 (1/65536 heat units decayed per microsecond) +# - Range: 0-65536 (0 = no decay, 65536 = 1 heat/µs) +# - Half-life: ~6.5 seconds at default (100-heat word → 50-heat in 6.5s) +# - Usage: make DECAY_RATE_PER_US_Q16=2 (faster decay) or 0 (no decay for baseline) +# - DoE: Vary this to measure impact of heat decay on performance +$(eval $(call kconfig_int,DECAY_RATE_PER_US_Q16,1)) + +# L8 Jacquard mode selector thresholds (ssm_jacquard.h). Previously unwired -- +# no Makefile knob or -D forwarding existed for these before the Kconfig +# migration's Phase 3; ssm_jacquard.h's own #ifndef fallback was the only +# place any of these five values lived. See Kconfig.physics for the +# rationale behind modeling the four float thresholds as Kconfig `string` +# symbols (Kconfig has no native float type). +$(eval $(call kconfig_int,SSM_ENTROPY_HIGH_THRESHOLD,0.75)) +$(eval $(call kconfig_int,SSM_CV_HIGH_THRESHOLD,0.15)) +$(eval $(call kconfig_int,SSM_TEMPORAL_DECAY_THRESHOLD,0.5)) +$(eval $(call kconfig_int,SSM_TEMPORAL_DECAY_LOW_THRESHOLD,0.3)) +$(eval $(call kconfig_int,SSM_HYSTERESIS_TICKS,5)) + +# Build the CFLAGS with tuning knobs +# L8 FINAL INTEGRATION: All experimental loop flags removed. +# L1-L7 are now always-on internal physics layers. +# L8 Jacquard mode selector is the sole policy engine. +BASE_CFLAGS = -std=c99 -Wall -Werror -Iv3/include -Ikernel/include -Iv3/src/word_source -Iv3/src/test_runner/include \ + -DSTRICT_PTR=$(STRICT_PTR) \ + -DENABLE_HOTWORDS_CACHE=$(ENABLE_HOTWORDS_CACHE) \ + -DENABLE_PIPELINING=$(ENABLE_PIPELINING) \ + -DROLLING_WINDOW_SIZE=$(ROLLING_WINDOW_SIZE) \ + -DTRANSITION_WINDOW_SIZE=$(TRANSITION_WINDOW_SIZE) \ + -DSPECULATION_THRESHOLD_Q48=$(SPECULATION_THRESHOLD_Q48) \ + -DSPECULATION_DEPTH=$(SPECULATION_DEPTH) \ + -DMIN_SAMPLES_FOR_SPECULATION=$(MIN_SAMPLES_FOR_SPECULATION) \ + -DMISPREDICTION_COST_Q48=$(MISPREDICTION_COST_Q48) \ + -DMINIMUM_PREFETCH_ROI=$(MINIMUM_PREFETCH_ROI) \ + -DADAPTIVE_SHRINK_RATE=$(ADAPTIVE_SHRINK_RATE) \ + -DADAPTIVE_MIN_WINDOW_SIZE=$(ADAPTIVE_MIN_WINDOW_SIZE) \ + -DADAPTIVE_CHECK_FREQUENCY=$(ADAPTIVE_CHECK_FREQUENCY) \ + -DADAPTIVE_GROWTH_THRESHOLD=$(ADAPTIVE_GROWTH_THRESHOLD) \ + -DINITIAL_DECAY_SLOPE_Q48=$(INITIAL_DECAY_SLOPE_Q48) \ + -DDECAY_RATE_PER_US_Q16=$(DECAY_RATE_PER_US_Q16) \ + -DHEARTBEAT_THREAD_ENABLED=$(HEARTBEAT_THREAD_ENABLED) \ + -DHEARTBEAT_TICK_NS=$(HEARTBEAT_TICK_NS) \ + -DHEARTBEAT_INFERENCE_FREQUENCY=$(HEARTBEAT_INFERENCE_FREQUENCY) \ + -DHEARTBEAT_CHECK_FREQUENCY=$(HEARTBEAT_CHECK_FREQUENCY) \ + -DHEARTBEAT_WINDOW_TUNING_FREQUENCY=$(HEARTBEAT_WINDOW_TUNING_FREQUENCY) \ + -DHEARTBEAT_SLOPE_VALIDATION_FREQUENCY=$(HEARTBEAT_SLOPE_VALIDATION_FREQUENCY) \ + -DEMERGENCY_CONSOLE_ENABLED=$(EMERGENCY_CONSOLE_ENABLED) \ + -DSSM_ENTROPY_HIGH_THRESHOLD=$(SSM_ENTROPY_HIGH_THRESHOLD) \ + -DSSM_CV_HIGH_THRESHOLD=$(SSM_CV_HIGH_THRESHOLD) \ + -DSSM_TEMPORAL_DECAY_THRESHOLD=$(SSM_TEMPORAL_DECAY_THRESHOLD) \ + -DSSM_TEMPORAL_DECAY_LOW_THRESHOLD=$(SSM_TEMPORAL_DECAY_LOW_THRESHOLD) \ + -DSSM_HYSTERESIS_TICKS=$(SSM_HYSTERESIS_TICKS) + +ifeq ($(HEARTBEAT_THREAD_ENABLED),1) +# HISTORICAL: this used to branch on L4RE (no pthreads there) -- +# THREAD_FLAGS := if L4RE else -pthread. L4Re support is no longer an +# active target; see "Platform support" below. +THREAD_FLAGS := -pthread +else +THREAD_FLAGS := +endif + +BASE_CFLAGS += $(THREAD_FLAGS) + +# Build profiles (TARGET values) +SUPPORTED_TARGETS := standard fast fastest turbo asan + +TARGET_DESCRIPTION_standard := Standard optimized build +TARGET_CFLAGS_standard := $(BASE_CFLAGS) $(ARCH_FLAGS) $(ARCH_DEFINES) -O2 -flto=auto -fuse-linker-plugin -DNDEBUG \ + -DUSE_ASM_OPT=1 \ + -ffunction-sections -fdata-sections -fomit-frame-pointer \ + -fno-asynchronous-unwind-tables -fno-unwind-tables -fno-strict-aliasing +TARGET_LDFLAGS_standard := -Wl,--gc-sections -s -flto=auto -fuse-linker-plugin -static $(THREAD_FLAGS) + +TARGET_DESCRIPTION_fast := Fast optimized build (no LTO, easier debugging) +TARGET_CFLAGS_fast := $(BASE_CFLAGS) $(ARCH_FLAGS) $(ARCH_DEFINES) -O3 -DUSE_ASM_OPT=1 -DUSE_DIRECT_THREADING=1 -DNDEBUG +TARGET_LDFLAGS_fast := -s $(THREAD_FLAGS) + +TARGET_DESCRIPTION_fastest := Maximum performance build (ASM + LTO + direct threading) +TARGET_CFLAGS_fastest := $(BASE_CFLAGS) $(ARCH_FLAGS) $(ARCH_DEFINES) -O3 -DUSE_ASM_OPT=1 -DUSE_DIRECT_THREADING=1 -DNDEBUG \ + -flto=auto -fuse-linker-plugin -funroll-loops -finline-functions -fomit-frame-pointer -fno-plt -fno-semantic-interposition +TARGET_LDFLAGS_fastest := -flto=auto -fuse-linker-plugin -s -Wl,--gc-sections $(THREAD_FLAGS) + +TARGET_DESCRIPTION_turbo := Assembly-optimized build (no direct threading) +TARGET_CFLAGS_turbo := $(BASE_CFLAGS) $(ARCH_FLAGS) $(ARCH_DEFINES) -O3 -DUSE_ASM_OPT=1 -DNDEBUG -flto +TARGET_LDFLAGS_turbo := -flto -s $(THREAD_FLAGS) + +TARGET_DESCRIPTION_asan := ASan/UBSan instrumented build for memory error detection +TARGET_CFLAGS_asan := $(BASE_CFLAGS) $(ARCH_FLAGS) $(ARCH_DEFINES) -O1 -g \ + -fsanitize=address,undefined -fno-omit-frame-pointer +TARGET_LDFLAGS_asan := -fsanitize=address,undefined $(THREAD_FLAGS) + +define TARGET_POST_fastest + @echo "" + @echo "🎯 You've built the FASTEST FORTH IN THE WEST!" + @echo "" + @echo "Quick-draw benchmark:" + @time -f " ⏱️ Time: %E seconds" ./$(BINARY) -c ": BENCH 1000000 0 DO 1 2 + DROP LOOP ; BENCH BYE" 2>/dev/null || true +endef + +TARGET_DESCRIPTION := $(TARGET_DESCRIPTION_$(TARGET)) +ifeq ($(strip $(TARGET_DESCRIPTION)),) + $(error Unknown TARGET '$(TARGET)'. Supported targets: $(SUPPORTED_TARGETS)) +endif + +TARGET_CFLAGS_SELECTED := $(TARGET_CFLAGS_$(TARGET)) +TARGET_LDFLAGS_SELECTED := $(TARGET_LDFLAGS_$(TARGET)) +TARGET_POST := $(or $(TARGET_POST_$(TARGET)),@:) + +CFLAGS ?= $(TARGET_CFLAGS_SELECTED) +LDFLAGS ?= $(TARGET_LDFLAGS_SELECTED) + +CFLAGS += $(EXTRA_CFLAGS) +LDFLAGS += $(EXTRA_LDFLAGS) + +USE_ASM_OPT := $(if $(findstring -DUSE_ASM_OPT=1,$(CFLAGS)),1,0) +USE_LTO := $(if $(or $(findstring -flto,$(CFLAGS)),$(findstring -flto,$(LDFLAGS))),1,0) + +# Platform support +# +# HISTORICAL: L4Re/Fiasco.OC was a supported platform target (`make L4RE=1`) +# through mid-2026. Removed as an active target; v3/src/platform/l4re/time.c +# is retained for reference but no longer wired into any build. To restore: +# reinstate the `else ifdef L4RE` branch below and the L4RE-conditional +# logic marked HISTORICAL elsewhere in this Makefile (search "L4RE"/"L4Re"). +# +# ifdef MINIMAL +# ... +# else ifdef L4RE +# CFLAGS += -D__l4__=1 +# PLATFORM_TIME_SRC = v3/src/platform/l4re/time.c v3/src/platform/platform_init.c +# PLATFORM_ALLOC_SRC = v3/src/platform/alloc_kernel.c +# else +# ... +# endif +ifdef MINIMAL +# DISABLED 2026-07-08: this was never a finished feature, not a small bug. +# v3/src/platform/starforth_minimal.c (referenced below) does not exist +# anywhere in the repo, and only 5 of ~90 source files under v3/src/ have any +# STARFORTH_MINIMAL awareness despite -nostdlib -ffreestanding applying to +# the entire tree. Confirmed by trying it: even a throwaway empty stub for +# the missing file lets the build report "success" while linking a binary +# with no _start entry point (this build's specific -nostdlib/-static/ +# -pthread/-flto flag combination doesn't actually exclude libc, so most +# calls silently resolve anyway -- the illusion of success is the trap). +# Reviving this needs an actual freestanding platform layer written from +# scratch, not a quick fix -- failing loudly here instead of letting +# anyone hit a confusing compile error or, worse, a binary that "builds" +# but can't run. See .claude/CLAUDE.md's punch list for status. +$(error MINIMAL=1 build is disabled: incomplete freestanding platform layer, not currently supported. See the comment immediately above this line for why) +CFLAGS += -DSTARFORTH_MINIMAL=1 -nostdlib -ffreestanding +LDFLAGS += -nostdlib +PLATFORM_SRC = v3/src/platform/starforth_minimal.c +PLATFORM_ALLOC_SRC = v3/src/platform/alloc_kernel.c +else +PLATFORM_TIME_SRC = v3/src/platform/linux/time.c v3/src/platform/linux/io.c v3/src/platform/platform_init.c +PLATFORM_ALLOC_SRC = v3/src/platform/alloc_host.c +endif + +PLATFORM_COMMON_SRC = v3/src/platform/threading.c $(PLATFORM_ALLOC_SRC) + +# Source and object files +SRC = $(wildcard v3/src/*.c v3/src/word_source/*.c v3/src/test_runner/*.c v3/src/test_runner/modules/*.c) $(PLATFORM_SRC) $(PLATFORM_TIME_SRC) $(PLATFORM_COMMON_SRC) +BUILD_ROOT ?= build +build_dir = $(BUILD_ROOT)/$(call canon_arch,$(or $2,$(ARCH)))/$1 +binary_path = $(call build_dir,$1,$2)/starforth +BUILD_DIR = $(call build_dir,$(TARGET),$(ARCH)) +BINARY = $(call binary_path,$(TARGET),$(ARCH)) +OBJ = $(patsubst v3/src/%.c,$(BUILD_DIR)/%.o,$(SRC)) +ASM_FILES = $(patsubst v3/src/%.c,$(BUILD_DIR)/%.s,$(SRC)) + +# Profiler support for test targets +PROFILE_LEVEL := $(strip $(PROFILE)) +ifeq ($(PROFILE_LEVEL),) +PROFILE_ARGS := +else +PROFILE_ARGS := --profile $(PROFILE_LEVEL) +PROFILE_REPORT ?= 1 +ifneq ($(strip $(PROFILE_REPORT)),0) +PROFILE_ARGS += --profile-report +endif +endif + +# Installation directories +PREFIX ?= . +BINDIR = $(PREFIX)/bin +MANDIR = $(PREFIX)/share/man/man1 +INFODIR = $(PREFIX)/share/info +DOCDIR = $(PREFIX)/share/doc/starforth +CONFDIR = $(PREFIX)/etc/starforth + +# ============================================================================== +# PHONY TARGETS +# ============================================================================== + +.PHONY: all banner help clean clean-obj clean-docs starkernel mkcapsule capsule-gen capsule-manifest +.PHONY: fastest fast turbo +.PHONY: rpi4 rpi4-cross rpi4-fastest riscv64-clang +.PHONY: minimal debug profile performance +.PHONY: test bench benchmark +.PHONY: asm sbom +.PHONY: docs api-docs docs-latex docs-isabelle isabelle-build isabelle-check info math-companion math-companion-clean +.PHONY: refinement-status refinement-init refinement-phase1 verify-defect refinement-annotate-check refinement-report +.PHONY: install uninstall package deb rpm +.PHONY: quality compile_commands clang_tidy cppcheck gcc_analyzer +.PHONY: FORCE version-info build-manifest + +# ============================================================================== +# MAIN TARGETS +# ============================================================================== + +all: banner $(BINARY) + @echo "" + @echo "✓ Build complete: $(BINARY)" + @echo " Architecture: $(ARCH_NAME)" + @echo " Profile: $(TARGET_DESCRIPTION) ($(TARGET))" + @echo " Output directory: $(BUILD_DIR)" + @echo " Optimizations: $(if $(findstring USE_ASM_OPT,$(CFLAGS)),Enabled,Disabled)" + @echo " Direct Threading: $(if $(findstring USE_DIRECT_THREADING,$(CFLAGS)),Enabled,Disabled)" + @mkdir -p lfs/$(ARCH_DIR) + @cp $(BINARY) lfs/$(ARCH_DIR)/starforth + @echo " LFS copy: lfs/$(ARCH_DIR)/starforth" + $(TARGET_POST) + +banner: + @echo "════════════════════════════════════════════════════════════" + @echo " ⚡ Building the Fastest Forth in the West! ⚡" + @echo "════════════════════════════════════════════════════════════" + @echo " Target Architecture: $(ARCH_NAME) ($(ARCH_DIR))" + @echo " Build Profile: $(TARGET_DESCRIPTION) ($(TARGET))" + @echo "" + +# ============================================================================== +# OPTIMIZATION BUILDS - The Fastest in the West +# ============================================================================== + +# Maximum performance - no compromises +fastest: + @echo "🏆 Building FASTEST configuration..." + @echo " - Architecture: $(ARCH_NAME)" + @echo " - Assembly optimizations: ENABLED" + @echo " - Direct threading: ENABLED" + @echo "" + @$(MAKE) -f v3/Makefile TARGET=fastest all + +# Fast without LTO (easier debugging) +fast: + @echo "⚡ Building FAST configuration (no LTO for debugging)..." + @$(MAKE) -f v3/Makefile TARGET=fast all + +# Assembly optimizations only (no direct threading) +turbo: + @echo "🚀 Building TURBO configuration (ASM only)..." + @$(MAKE) -f v3/Makefile TARGET=turbo all + +# ============================================================================== +# PLATFORM-SPECIFIC BUILDS +# ============================================================================== + +# Raspberry Pi 4 - native build +rpi4: + @echo "🥧 Building for Raspberry Pi 4 (native)..." + @$(MAKE) -f v3/Makefile ARCH=raspi TARGET=fastest CFLAGS="$(BASE_CFLAGS) -march=armv8-a+crc+simd -mtune=cortex-a72 -DARCH_ARM64=1 -O3 -DUSE_ASM_OPT=1 -DUSE_DIRECT_THREADING=1 -DNDEBUG -flto" LDFLAGS="-flto -s" all + @echo "✓ Raspberry Pi build ready: $(call binary_path,fastest,raspi)" + +# Raspberry Pi 4 - cross-compile from x86_64 +rpi4-cross: + @echo "🥧 Cross-compiling for Raspberry Pi 4..." + @$(MAKE) -f v3/Makefile ARCH=raspi TARGET=fastest CC=aarch64-linux-gnu-gcc \ + CFLAGS="$(BASE_CFLAGS) -march=armv8-a+crc+simd -mtune=cortex-a72 -DARCH_ARM64=1 -O3 -DUSE_ASM_OPT=1 -DUSE_DIRECT_THREADING=1 -DNDEBUG -flto -static" \ + LDFLAGS="-flto -s -static" \ + all + @echo "✓ Cross-compiled binary ready: $(call binary_path,fastest,raspi)" + @echo " Copy to RPi4: scp $(call binary_path,fastest,raspi) pi@raspberrypi.local:~/" + +# Raspberry Pi 4 - maximum optimization +rpi4-fastest: + @echo "🥧⚡ Building FASTEST for Raspberry Pi 4..." + @$(MAKE) -f v3/Makefile ARCH=raspi TARGET=fastest CC=aarch64-linux-gnu-gcc \ + CFLAGS="$(BASE_CFLAGS) -march=armv8-a+crc+simd+crypto -mtune=cortex-a72 -DARCH_ARM64=1 -O3 -DUSE_ASM_OPT=1 -DUSE_DIRECT_THREADING=1 -DNDEBUG -flto -funroll-loops -finline-functions" \ + LDFLAGS="-flto -s -static" \ + all + @echo "✓ Raspberry Pi FASTEST build ready: $(call binary_path,fastest,raspi)" + +# RISC-V 64 - cross-compile via clang (GCC fails to build this tree under +# -std=c99: a nanosleep visibility failure, not yet root-caused — see +# docs/lithosananke/hosted-acceptance-test/README.md and +# docs/working/archive/session-logs/2026-07-24-punch-list.md item #3). +# CFLAGS deliberately does NOT reuse $(BASE_CFLAGS): BASE_CFLAGS hardcodes +# -std=c99, and clang needs -std=c11 -pthread here. This mirrors the exact +# recipe verified in the hosted-acceptance-test doc, kept in sync with it. +riscv64-clang: + @echo "🦀 Cross-compiling for RISC-V 64 (clang)..." + @$(MAKE) -f v3/Makefile ARCH=riscv64 TARGET=fastest \ + CC="clang-18 --target=riscv64-linux-gnu --sysroot=/usr/riscv64-linux-gnu" \ + CFLAGS="-std=c11 -pthread -Wall -Werror -Iv3/include -Ikernel/include -Iv3/src/word_source -Iv3/src/test_runner/include -DSTRICT_PTR=1 -march=rv64gc -mabi=lp64d -mcmodel=medany -DARCH_RISCV64=1 -O3 -DUSE_ASM_OPT=1 -DUSE_DIRECT_THREADING=1 -DNDEBUG -flto -static" \ + LDFLAGS="-flto -s -static -fuse-ld=lld" \ + all + @echo "✓ Cross-compiled binary ready: $(call binary_path,fastest,riscv64)" + @echo " Run: qemu-riscv64 $(call binary_path,fastest,riscv64)" + +# Minimal/embedded build +minimal: + $(MAKE) -f v3/Makefile MINIMAL=1 + +# HISTORICAL: L4Re support removed as an active target (see "Platform +# support" above). This target cross-compiled a minimal build with the +# L4Re toolchain (l4-gcc) for smoke-testing without real L4Re headers. +# fake-l4re: +# $(MAKE) -f v3/Makefile MINIMAL=1 CC=l4-gcc CFLAGS="$(BASE_CFLAGS) -DL4RE_TARGET=1" + +# ============================================================================== +# DEBUG & DEVELOPMENT BUILDS +# ============================================================================== + +# Debug build with symbols +debug: banner + @echo "🐛 Building DEBUG configuration..." + $(MAKE) -f v3/Makefile CFLAGS="$(BASE_CFLAGS) -O0 -g -DDEBUG" LDFLAGS="" $(BINARY) + +# Build with profiler support +profile: + $(MAKE) -f v3/Makefile CFLAGS="$(BASE_CFLAGS) -g -O1" $(BINARY) + +# Performance build (legacy alias - redirects to 'fastest') +performance: fastest + +# ============================================================================== +# BUILD RULES +# ============================================================================== + +# Generate version header from Makefile VERSION, ARCH, TARGET, and timestamp +v3/include/version.h: FORCE + @mkdir -p v3/include + @echo "Generating version header..." + @BUILD_TS=$$(date -Iseconds 2>/dev/null || echo "unknown"); \ + printf '#ifndef STARFORTH_VERSION_H\n#define STARFORTH_VERSION_H\n\n' > $@; \ + printf '#define STARFORTH_VERSION "%s"\n' "$(VERSION)" >> $@; \ + printf '#define STARFORTH_ARCH "%s"\n' "$(ARCH_NAME)" >> $@; \ + printf '#define STARFORTH_TARGET "%s"\n' "$(TARGET)" >> $@; \ + printf '#define STARFORTH_TIMESTAMP "%s"\n' "$$BUILD_TS" >> $@; \ + printf '#define STARFORTH_VERSION_FULL "StarForth v%s %s %s %s"\n\n' "$(VERSION)" "$(ARCH_NAME)" "$(TARGET)" "$$BUILD_TS" >> $@; \ + printf '#endif /* STARFORTH_VERSION_H */\n' >> $@ + +# Ensure version.h exists and is up-to-date before compilation +FORCE: + +# ============================================================================== +# CAPSULE SUBSYSTEM +# ============================================================================== + +CAPSULES_DIR ?= capsules +MKCAPSULE_SRC = tools/mkcapsule.c +MKCAPSULE_BIN = $(BUILD_DIR)/tools/mkcapsule +CAPSULE_GENERATED = $(BUILD_DIR)/capsule_generated.c +CAPSULE_GENERATED_OBJ = $(BUILD_DIR)/capsule_generated.o +CAPSULE_MANIFEST = $(CAPSULES_DIR)/MANIFEST_AUTO.md + +# Build the mkcapsule host tool +$(MKCAPSULE_BIN): $(MKCAPSULE_SRC) + @mkdir -p $(dir $@) + @echo " HOSTCC $<" + @$(CC) -O2 -Wall -o $@ $< + +# Run mkcapsule to generate the capsule directory C source +$(CAPSULE_GENERATED): $(MKCAPSULE_BIN) $(CAPSULES_DIR) + @mkdir -p $(dir $@) + @echo " MKCAP $(CAPSULES_DIR) -> $@" + @$(MKCAPSULE_BIN) $(CAPSULES_DIR) $@ + +# Compile the generated capsule directory +$(CAPSULE_GENERATED_OBJ): $(CAPSULE_GENERATED) | v3/include/version.h + @mkdir -p $(dir $@) + @echo " CC $<" + @$(CC) $(CFLAGS) -c $< -o $@ + +.PHONY: mkcapsule capsule-gen capsule-manifest +mkcapsule: $(MKCAPSULE_BIN) +capsule-manifest: $(MKCAPSULE_BIN) + @echo " MANIFEST $(CAPSULES_DIR) -> $(CAPSULE_MANIFEST)" + @$(MKCAPSULE_BIN) --manifest $(CAPSULES_DIR) $(CAPSULE_MANIFEST) +capsule-gen: $(CAPSULE_GENERATED) capsule-manifest + +# starkernel: full capsule-aware build +# 1. Build mkcapsule tool +# 2. Generate capsule_generated.c from capsules/ +# 3. Compile StarForth with __STARKERNEL__ and capsule_generated.o linked in +starkernel: $(MKCAPSULE_BIN) $(CAPSULE_GENERATED_OBJ) + @$(MAKE) -f v3/Makefile $(BINARY) \ + EXTRA_CFLAGS="-D__STARKERNEL__=1 -Iv3/include -Ikernel/include" \ + EXTRA_OBJ="$(CAPSULE_GENERATED_OBJ)" + +# ============================================================================== +# Main executable +$(BINARY): $(OBJ) $(EXTRA_OBJ) + @echo "🔗 Linking $(BINARY)..." + @mkdir -p $(dir $@) + $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) + +# Pattern rule for all C files (consolidates 5 repetitive rules) +# Order-only dependency: version.h must exist before compilation, but changes don't trigger rebuild +$(BUILD_DIR)/%.o: v3/src/%.c | v3/include/version.h + @mkdir -p $(dir $@) + @echo " CC $<" + @$(CC) $(CFLAGS) -c $< -o $@ +ifdef ASM + @$(CC) $(CFLAGS) -S $(ASM_SYNTAX) $< -o $(patsubst %.o,%.s,$@) +endif + +# Files that include version.h - rebuild when timestamp changes +$(BUILD_DIR)/main.o: v3/include/version.h +$(BUILD_DIR)/cli.o: v3/include/version.h +$(BUILD_DIR)/word_source/starforth_words.o: v3/include/version.h + +# ============================================================================== +# TESTING & BENCHMARKING +# ============================================================================== + +# Quick benchmark +bench: $(BINARY) + @echo "" + @echo "🏇 Running quick-draw benchmark..." + @echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + @echo "Test: 1 million stack operations" + @time -f "Time: %E seconds" ./$(BINARY) -c ": BENCH 1000000 0 DO 1 2 + DROP LOOP ; BENCH BYE" 2>/dev/null || echo "Benchmark complete" + @echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + +# Full benchmark suite +benchmark: $(BINARY) + @echo "" + @echo "🎯 Full Benchmark Suite - Fastest Forth in the West" + @echo "════════════════════════════════════════════════════════════" + @echo "" + @echo "📊 Stack Operations (1M iterations):" + @time -f " ⏱️ %E seconds" ./$(BINARY) -c ": BENCH-STACK 1000000 0 DO 1 2 3 DROP DROP DROP LOOP ; BENCH-STACK BYE" 2>/dev/null || true + @echo "" + @echo "📊 Arithmetic Operations (1M iterations):" + @time -f " ⏱️ %E seconds" ./$(BINARY) -c ": BENCH-MATH 1000000 0 DO 10 20 + 5 * 100 / DROP LOOP ; BENCH-MATH BYE" 2>/dev/null || true + @echo "" + @echo "📊 Logic Operations (1M iterations):" + @time -f " ⏱️ %E seconds" ./$(BINARY) -c ": BENCH-LOGIC 1000000 0 DO 255 DUP AND DUP OR XOR DROP LOOP ; BENCH-LOGIC BYE" 2>/dev/null || true + @echo "" + @echo "════════════════════════════════════════════════════════════" + +# ============================================================================== +# ASSEMBLY OUTPUT & ANALYSIS +# ============================================================================== + +# Generate assembly files for inspection +asm: banner + @echo "📝 Generating assembly output..." + @echo " Cleaning to force rebuild..." + @$(MAKE) -f v3/Makefile clean-obj > /dev/null 2>&1 + $(MAKE) -f v3/Makefile ASM=1 CFLAGS="$(BASE_CFLAGS) $(ARCH_FLAGS) $(ARCH_DEFINES) -O3 -DUSE_ASM_OPT=1 -DUSE_DIRECT_THREADING=1" LDFLAGS="" $(BINARY) + @echo "✓ Assembly files generated in $(BUILD_DIR)/" + @echo " Files generated: $$(find $(BUILD_DIR) -name '*.s' | wc -l)" + @echo " Example: less $(BUILD_DIR)/stack_management.s" + +# Generate Software Bill of Materials (SBOM) in SPDX format +sbom: + @echo "📋 Generating SBOM (Software Bill of Materials)..." + @if ! which syft >/dev/null 2>&1; then \ + echo "Error: syft not found. Install from https://github.com/anchore/syft"; \ + exit 1; \ + fi + @syft dir:. -o spdx-json=sbom.spdx.json -o spdx=sbom.spdx \ + --source-name LithosAnanke \ + --source-version $(VERSION) \ + --exclude './build/**' --exclude './tools/**' --exclude './.git/**' + @echo "✅ SBOM generated:" + @echo " SPDX JSON: sbom.spdx.json" + @echo " SPDX: sbom.spdx" + @echo " Version: $(VERSION)" + +# ============================================================================== +# DOCUMENTATION +# ============================================================================== + +# Generate API documentation (Doxygen XML → AsciiDoc) +api-docs: + @echo "📚 Generating API documentation from Doxygen..." + @if [ ! -f scripts/generate-doxygen-appendix.sh ]; then \ + echo "Error: scripts/generate-doxygen-appendix.sh not found"; \ + exit 1; \ + fi + @./scripts/generate-doxygen-appendix.sh + @echo "✅ API documentation generated: docs/src/appendix/" + +# ---------------------------------------------------------------------------- +# Math companion to the SSRN paper. +# Builds docs/SSRN_companion/Math_Companion_SSRN.pdf from the LaTeX source. +# Requires: pdflatex (texlive-latex-base, texlive-latex-extra, texlive-science). +# ---------------------------------------------------------------------------- +math-companion: + @echo "Building SSRN math companion (docs/SSRN_companion/Math_Companion_SSRN.pdf)..." + @if ! command -v pdflatex >/dev/null 2>&1; then \ + echo "Error: pdflatex not found."; \ + echo " Install with: apt-get install texlive-latex-base texlive-latex-extra texlive-science"; \ + exit 1; \ + fi + @cd docs/SSRN_companion && \ + pdflatex -interaction=nonstopmode -halt-on-error Math_Companion_SSRN.tex >/dev/null && \ + pdflatex -interaction=nonstopmode -halt-on-error Math_Companion_SSRN.tex >/dev/null && \ + pdflatex -interaction=nonstopmode -halt-on-error Math_Companion_SSRN.tex >/dev/null + @echo "Built: docs/SSRN_companion/Math_Companion_SSRN.pdf" + @cd docs/SSRN_companion && ls -lh Math_Companion_SSRN.pdf | awk '{print " Size:", $$5, " Pages: see pdfinfo"}' + +math-companion-clean: + @rm -f docs/SSRN_companion/Math_Companion_SSRN.{aux,log,out,toc,lof,lot,nav,snm,vrb} + @rm -f docs/SSRN_companion/Math_Companion_SSRN.pdf + @echo "Cleaned math companion build artifacts." + +# Convert all AsciiDoc to LaTeX +docs-latex: + @echo "📄 Converting AsciiDoc to LaTeX..." + @if [ ! -f scripts/asciidoc-to-latex.sh ]; then \ + echo "Error: scripts/asciidoc-to-latex.sh not found"; \ + exit 1; \ + fi + @./scripts/asciidoc-to-latex.sh + @echo "✅ LaTeX files generated: docs/latex/" + +# Build and verify Isabelle theories +isabelle-build: + @echo "🔬 Building Isabelle formal verification theories..." + @if ! command -v $(ISABELLE) >/dev/null 2>&1; then \ + echo "Error: Isabelle not found: $(ISABELLE)"; \ + echo " Install Isabelle or set ISABELLE variable"; \ + exit 1; \ + fi + @echo " Using: $$(command -v $(ISABELLE))" + @echo " Building StarForth_Formal session (VM + Physics)..." + @cd docs/src/internal/formal && $(ISABELLE) build -v -d . StarForth_Formal + @echo "✅ Isabelle theories verified successfully" + +# Quick check of Isabelle theories (faster than full build) +isabelle-check: + @echo "🔬 Quick-checking Isabelle theories..." + @if ! command -v $(ISABELLE) >/dev/null 2>&1; then \ + echo "Error: Isabelle not found: $(ISABELLE)"; \ + exit 1; \ + fi + @cd docs/src/internal/formal && \ + for thy in *.thy; do \ + echo " Checking $$thy..."; \ + $(ISABELLE) process -T "$$thy" 2>&1 | head -5; \ + done + @echo "✅ Quick check complete" + +# Generate comprehensive Isabelle documentation (for auditing & CI/CD) +# This generates documentation and verification reports regardless of proof status +# Suitable for Jenkinsfile pipelines - shows complete state including errors +docs-isabelle: + @echo "📚 Generating comprehensive Isabelle documentation (audit mode)..." + @mkdir -p docs/src/isabelle + @echo "" + @echo "Step 1: Attempting to verify Isabelle theories..." + @echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + @cd docs/src/internal/formal && \ + if $(ISABELLE) build -v -d . StarForth_Formal > "$(CURDIR)/docs/src/isabelle/build.log" 2>&1; then \ + echo "✅ All theories verified successfully"; \ + else \ + echo "⚠️ Some theories have incomplete proofs (see build.log for details)"; \ + fi + @echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + @echo "" + @echo "Step 2: Generating documentation from theory source..." + @if [ ! -f scripts/isabelle-to-adoc.sh ]; then \ + echo "⚠️ Warning: scripts/isabelle-to-adoc.sh not found"; \ + echo " Creating default script..."; \ + mkdir -p scripts; \ + echo '#!/bin/bash' > scripts/isabelle-to-adoc.sh; \ + echo 'echo "Generating Isabelle theory reports to AsciiDoc..."' >> scripts/isabelle-to-adoc.sh; \ + echo 'cd docs/src/internal/formal' >> scripts/isabelle-to-adoc.sh; \ + echo 'for thy in *.thy; do' >> scripts/isabelle-to-adoc.sh; \ + echo ' base=$$(basename "$$thy" .thy)' >> scripts/isabelle-to-adoc.sh; \ + echo ' echo "= $$base Theory" > "../../../isabelle/$$base.adoc"' >> scripts/isabelle-to-adoc.sh; \ + echo ' echo "" >> "../../../isabelle/$$base.adoc"' >> scripts/isabelle-to-adoc.sh; \ + echo ' echo "Formal verification theory for StarForth VM." >> "../../../isabelle/$$base.adoc"' >> scripts/isabelle-to-adoc.sh; \ + echo ' echo "" >> "../../../isabelle/$$base.adoc"' >> scripts/isabelle-to-adoc.sh; \ + echo ' echo "== Theory Source" >> "../../../isabelle/$$base.adoc"' >> scripts/isabelle-to-adoc.sh; \ + echo ' echo "" >> "../../../isabelle/$$base.adoc"' >> scripts/isabelle-to-adoc.sh; \ + echo ' echo "[source,isabelle]" >> "../../../isabelle/$$base.adoc"' >> scripts/isabelle-to-adoc.sh; \ + echo ' echo "----" >> "../../../isabelle/$$base.adoc"' >> scripts/isabelle-to-adoc.sh; \ + echo ' cat "$$thy" >> "../../../isabelle/$$base.adoc"' >> scripts/isabelle-to-adoc.sh; \ + echo ' echo "----" >> "../../../isabelle/$$base.adoc"' >> scripts/isabelle-to-adoc.sh; \ + echo 'done' >> scripts/isabelle-to-adoc.sh; \ + chmod +x scripts/isabelle-to-adoc.sh; \ + fi + @bash scripts/isabelle-to-adoc.sh + @echo "" + @echo "Step 3: Creating audit summary..." + @echo "✅ Comprehensive Isabelle documentation generated: docs/src/isabelle/" + @echo "" + @echo "📂 Documentation includes:" + @echo " • index.adoc - Master index of all theories" + @echo " • VERIFICATION_REPORT.adoc - Audit report" + @echo " • .adoc - Individual theory documentation with source" + @echo " • build.log - Isabelle build output (verification status)" + +# ============================================================================== +# REFINEMENT VERIFICATION (C ⊑ Isabelle) +# ============================================================================== + +# Refinement status dashboard +refinement-status: + @echo "════════════════════════════════════════════════════════════" + @echo " StarForth C ⊑ Isabelle Refinement Status" + @echo "════════════════════════════════════════════════════════════" + @echo "" + @if [ ! -f docs/REFINEMENT_CAPA.adoc ]; then \ + echo "⚠️ No REFINEMENT_CAPA.adoc found. Initialize with: make refinement-init"; \ + echo ""; \ + echo "Refinement infrastructure status: UNINITIALIZED"; \ + else \ + echo "📋 Defect Summary:"; \ + echo ""; \ + echo -n " Total Defects: "; grep -c "^== DEFECT-" docs/REFINEMENT_CAPA.adoc || echo "0"; \ + echo -n " OPEN: "; grep "| OPEN" docs/REFINEMENT_CAPA.adoc | wc -l; \ + echo -n " IN-PROGRESS: "; grep "| IN-PROGRESS" docs/REFINEMENT_CAPA.adoc | wc -l; \ + echo -n " CLOSED: "; grep "| CLOSED" docs/REFINEMENT_CAPA.adoc | wc -l; \ + fi + @echo "" + @echo "🏆 Phase Status:" + @echo " Phase 1: vm.c core .............. NOT STARTED" + @echo " Phase 2: Root utilities ......... NOT STARTED" + @echo " Phase 3: Test harness .......... NOT STARTED" + @echo " Phase 4: Primitive dictionary .. NOT STARTED" + @echo " Phase 5: VM expansion .......... NOT STARTED" + @echo "" + @echo "📂 Documentation:" + @echo " • docs/REFINEMENT_CAPA.adoc - Defect tracking" + @echo " • docs/REFINEMENT_ANNOTATIONS.adoc - Code annotation guide" + @echo "" + @echo "Next steps: make refinement-phase1 (to start Phase 1 proofs)" + @echo "════════════════════════════════════════════════════════════" + +# Initialize refinement tracking +refinement-init: + @echo "Initializing refinement tracking..." + @if [ -f docs/REFINEMENT_CAPA.adoc ]; then \ + echo "✅ docs/REFINEMENT_CAPA.adoc already exists"; \ + else \ + echo "📋 Creating REFINEMENT_CAPA.adoc"; \ + fi + @if [ -f docs/REFINEMENT_ANNOTATIONS.adoc ]; then \ + echo "✅ docs/REFINEMENT_ANNOTATIONS.adoc already exists"; \ + else \ + echo "📋 Creating REFINEMENT_ANNOTATIONS.adoc"; \ + fi + @echo "✅ Refinement infrastructure ready" + @echo "" + @echo "Next: Review docs/REFINEMENT_ANNOTATIONS.adoc" + @echo " Then: make refinement-phase1" + +# Phase 1: VM Core refinement +refinement-phase1: + @echo "════════════════════════════════════════════════════════════" + @echo " ⚙️ PHASE 1: VM Core Refinement (C ⊑ Isabelle)" + @echo "════════════════════════════════════════════════════════════" + @echo "" + @echo "Building refinement proofs for:" + @echo " • stack_push / stack_pop (DEFECT-001, DEFECT-002)" + @echo " • execute_call / execute_return (DEFECT-002)" + @echo " • instruction_dispatch (DEFECT-003)" + @echo "" + @echo "Proof target: StarForth_Refinement (Isabelle theory)" + @if ! command -v $(ISABELLE) >/dev/null 2>&1; then \ + echo "Error: Isabelle not found. Install or set ISABELLE variable"; \ + exit 1; \ + fi + @echo "" + @echo "Step 1: Creating StarForth_Refinement.thy if needed..." + @if [ ! -f docs/src/internal/formal/StarForth_Refinement.thy ]; then \ + echo "Creating template..."; \ + mkdir -p docs/src/internal/formal; \ + touch docs/src/internal/formal/StarForth_Refinement.thy; \ + echo "TODO: Add refinement proofs here" > docs/src/internal/formal/StarForth_Refinement.thy; \ + fi + @echo "" + @echo "Step 2: Attempting to build refinement proofs..." + @echo "(This will fail until proofs are written)" + @cd docs/src/internal/formal && \ + $(ISABELLE) build -v -d . StarForth_Formal 2>&1 | tail -20 + @echo "" + @echo "📋 Next steps:" + @echo " 1. Review open defects: grep 'OPEN' docs/REFINEMENT_CAPA.adoc" + @echo " 2. Start working on DEFECT-001 (stack_push)" + @echo " 3. Add refinement proofs to StarForth_Refinement.thy" + @echo " 4. Run: make verify-defect DEFECT=001" + +# Verify specific defect resolution +verify-defect: + @if [ -z "$(DEFECT)" ]; then \ + echo "Usage: make verify-defect DEFECT=001"; \ + echo ""; \ + echo "Available defects:"; \ + grep "== DEFECT-" docs/REFINEMENT_CAPA.adoc | sed 's/== / /'; \ + exit 1; \ + fi + @echo "════════════════════════════════════════════════════════════" + @echo " 🔍 Verifying Resolution: $(DEFECT)" + @echo "════════════════════════════════════════════════════════════" + @echo "" + @if ! grep -q "== DEFECT-$(DEFECT):" docs/REFINEMENT_CAPA.adoc; then \ + echo "❌ DEFECT-$(DEFECT) not found in REFINEMENT_CAPA.adoc"; \ + exit 1; \ + fi + @echo "Defect Details:" + @grep -A 30 "== DEFECT-$(DEFECT):" docs/REFINEMENT_CAPA.adoc | head -35 + @echo "" + @echo "Next: Implement corrective action, then run this again" + +# Check code annotation coverage +refinement-annotate-check: + @echo "════════════════════════════════════════════════════════════" + @echo " 📝 Checking Code Annotation Coverage" + @echo "════════════════════════════════════════════════════════════" + @echo "" + @echo "Phase 1 target functions:" + @echo "" + @for func in stack_push stack_pop execute_instruction execute_call execute_return; do \ + if grep -q "REFINEMENT.*$$func\|void $$func" v3/src/vm.c; then \ + if grep -q "REFINEMENT:" v3/src/vm.c | grep -q "$$func"; then \ + echo " ✅ $$func - ANNOTATED"; \ + else \ + echo " ❌ $$func - MISSING ANNOTATION"; \ + fi; \ + else \ + echo " ⚠️ $$func - NOT FOUND"; \ + fi; \ + done + @echo "" + @echo "Guide: docs/REFINEMENT_ANNOTATIONS.adoc" + +# Generate refinement report +refinement-report: + @echo "🔄 Generating refinement status report..." + @mkdir -p docs/reports + @echo "# StarForth Refinement Status" > docs/reports/refinement-status.md + @echo "" >> docs/reports/refinement-status.md + @echo "Generated: $$(date)" >> docs/reports/refinement-status.md + @echo "" >> docs/reports/refinement-status.md + @echo "## Summary" >> docs/reports/refinement-status.md + @echo "" >> docs/reports/refinement-status.md + @grep -c "== DEFECT-" docs/REFINEMENT_CAPA.adoc | xargs -I {} echo "Total Defects: {}" >> docs/reports/refinement-status.md + @echo "" >> docs/reports/refinement-status.md + @echo "See docs/REFINEMENT_CAPA.adoc for details" >> docs/reports/refinement-status.md + @echo "✅ Report: docs/reports/refinement-status.md" + +# Generate GNU info documentation +docs/starforth.info: + @if [ ! -f docs/starforth.texi ]; then \ + echo "⚠️ Skipping info docs: docs/starforth.texi not present"; \ + touch docs/starforth.info; \ + else \ + echo "📖 Building GNU info documentation..."; \ + if ! command -v makeinfo >/dev/null 2>&1; then \ + echo "Warning: makeinfo not found. Install with: sudo apt-get install texinfo"; \ + touch docs/starforth.info; \ + else \ + makeinfo docs/starforth.texi -o docs/starforth.info && \ + echo "✅ Info documentation: docs/starforth.info"; \ + fi; \ + fi + +# Generate all documentation +docs: api-docs docs-isabelle + @echo "✅ All documentation generated!" + @echo "" + @echo "📂 Documentation locations:" + @echo " • API docs: docs/src/appendix/" + @echo " • Isabelle docs: docs/src/isabelle/" + @echo " • LaTeX: docs/latex/" + +# Clean generated documentation +clean-docs: + @echo "🗑️ Cleaning generated documentation..." + @rm -rf docs/src/appendix/ docs/latex/ docs/src/isabelle/ + @echo "✅ Documentation cleaned" + +# ============================================================================== +# INSTALLATION +# ============================================================================== + +install: $(BINARY) + @echo "📦 Installing StarForth to $(PREFIX)..." + @install -d $(BINDIR) + @install -m 755 $(BINARY) $(BINDIR)/starforth + @echo " ✓ Binary installed: $(BINDIR)/starforth" + @if [ -f capsules/init.4th ]; then \ + install -d $(CONFDIR); \ + install -m 644 capsules/init.4th $(CONFDIR)/init.4th; \ + echo " ✓ Config installed: $(CONFDIR)/init.4th"; \ + fi + @if [ -f man/starforth.1 ]; then \ + install -d $(MANDIR); \ + install -m 644 man/starforth.1 $(MANDIR)/starforth.1; \ + echo " ✓ Man page installed: $(MANDIR)/starforth.1"; \ + fi + @if [ -f docs/starforth.info ]; then \ + install -d $(INFODIR); \ + install -m 644 docs/starforth.info $(INFODIR)/starforth.info; \ + install-info --info-dir=$(INFODIR) $(INFODIR)/starforth.info 2>/dev/null || true; \ + echo " ✓ Info docs installed: $(INFODIR)/starforth.info"; \ + fi + @install -d $(DOCDIR) + @if [ -f README.md ]; then install -m 644 README.md $(DOCDIR)/; fi + @if [ -f QUICKSTART.md ]; then install -m 644 QUICKSTART.md $(DOCDIR)/; fi + @if ls docs/*.md >/dev/null 2>&1; then install -m 644 docs/*.md $(DOCDIR)/ 2>/dev/null || true; fi + @echo " ✓ Documentation installed: $(DOCDIR)/" + @echo "✅ Installation complete!" + +uninstall: + @echo "🗑️ Uninstalling StarForth from $(PREFIX)..." + @rm -f $(BINDIR)/starforth + @rm -f $(MANDIR)/starforth.1 + @install-info --delete --info-dir=$(INFODIR) $(INFODIR)/starforth.info 2>/dev/null || true + @rm -f $(INFODIR)/starforth.info + @rm -rf $(DOCDIR) + @rm -rf $(CONFDIR) + @echo "✅ Uninstall complete!" + +# ============================================================================== +# PACKAGING +# ============================================================================== + +# Build Debian package +deb: $(BINARY) + @echo "📦 Building Debian package..." + @if ! command -v fpm >/dev/null 2>&1; then \ + echo "Error: fpm not found. Install with: gem install fpm"; \ + echo " or: sudo apt-get install ruby-dev && gem install fpm"; \ + exit 1; \ + fi + @mkdir -p package/deb + @fpm -s dir -t deb \ + -n starforth \ + -v $(VERSION) \ + -a native \ + --description "StarForth - The Fastest Forth in the West" \ + --url "https://github.com/yourusername/starforth" \ + --maintainer "StarForth Team" \ + --license "MIT" \ + --category "devel" \ + --package package/deb/ \ + --deb-compression xz \ + $(BINARY)=/usr/bin/starforth \ + capsules/init.4th=/etc/starforth/init.4th \ + README.md=/usr/share/doc/starforth/README.md + @echo "✅ Debian package created: package/deb/starforth_$(VERSION)_*.deb" + +# Build RPM package +rpm: $(BINARY) + @echo "📦 Building RPM package..." + @if ! command -v fpm >/dev/null 2>&1; then \ + echo "Error: fpm not found. Install with: gem install fpm"; \ + exit 1; \ + fi + @mkdir -p package/rpm + @fpm -s dir -t rpm \ + -n starforth \ + -v $(VERSION) \ + -a native \ + --description "StarForth - The Fastest Forth in the West" \ + --url "https://github.com/yourusername/starforth" \ + --maintainer "StarForth Team" \ + --license "MIT" \ + --category "Development/Languages" \ + --package package/rpm/ \ + $(BINARY)=/usr/bin/starforth \ + capsules/init.4th=/etc/starforth/init.4th \ + README.md=/usr/share/doc/starforth/README.md + @echo "✅ RPM package created: package/rpm/starforth-$(VERSION)-*.rpm" + +# Build all packages +package: deb rpm + @echo "" + @echo "✅ All packages built successfully!" + @echo " Debian: package/deb/" + @echo " RPM: package/rpm/" + +# ============================================================================== +# VERSIONING & BUILD MANIFEST (Workflow/Governance Integration) +# ============================================================================== + +# Parse version from v3/include/version.h +GET_VERSION = $(shell grep "define STARFORTH_VERSION" v3/include/version.h | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+' | head -1) + +.PHONY: version-info +version-info: + @echo "Current Version: $(GET_VERSION)" + @grep "STARFORTH_VERSION" v3/include/version.h | grep define + +.PHONY: build-manifest +build-manifest: $(BINARY) + @echo "📋 Generating BUILD_MANIFEST.json..." + @mkdir -p builds/manifest + @VERSION=$$(grep "STARFORTH_VERSION_STRING" v3/include/version.h | grep -o '"[^"]*"' | tr -d '"'); \ + GIT_HASH=$$(git rev-parse --short HEAD 2>/dev/null || echo "0000000"); \ + GIT_BRANCH=$$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "unknown"); \ + BUILD_TIME=$$(date -Iseconds); \ + BINARY_PATH="$(BINARY)"; \ + if [ -f "$$BINARY_PATH" ]; then \ + BINARY_SHA256=$$(sha256sum "$$BINARY_PATH" | awk '{print $$1}'); \ + else \ + BINARY_SHA256="not-built"; \ + fi; \ + cat > builds/manifest/BUILD_MANIFEST.json << EOF; \ +{ \ + "version": "$$VERSION", \ + "timestamp": "$$BUILD_TIME", \ + "git": { \ + "commit_hash": "$$GIT_HASH", \ + "branch": "$$GIT_BRANCH", \ + "tag": "v$$VERSION" \ + }, \ + "build": { \ + "timestamp": "$$BUILD_TIME", \ + "compiler": "$$(gcc --version | head -1)", \ + "compiler_flags": "$(CFLAGS) $(ARCH_FLAGS)", \ + "target_architecture": "$(ARCH_NAME)", \ + "use_asm_opt": $(USE_ASM_OPT), \ + "use_lto": $(USE_LTO) \ + }, \ + "testing": { \ + "total_tests": 936, \ + "passed_tests": 0, \ + "failed_tests": 0, \ + "code_coverage_percent": 0, \ + "smoke_test_result": "N/A" \ + }, \ + "binary": { \ + "path": "$$BINARY_PATH", \ + "sha256": "$$BINARY_SHA256" \ + }, \ + "signatures": { \ + "builder": "jenkins-agent", \ + "approval_timestamp": "$(shell date -Iseconds)" \ + } \ +} \ +EOF + @echo "✓ BUILD_MANIFEST created: builds/manifest/BUILD_MANIFEST.json" + @cat builds/manifest/BUILD_MANIFEST.json | head -20 + +# ============================================================================== +# CLEANUP +# ============================================================================== + +clean: + @echo "🧹 Cleaning build artifacts..." + @rm -rfv build/* + @rm -f v3/src/*.gcda v3/src/word_source/*.gcda v3/src/*.gcno v3/src/word_source/*.gcno + @echo "✓ Clean complete" + +clean-obj: + @echo "🧹 Cleaning object files..." + @find build -name "*.o" -type f -delete 2>/dev/null || true + @echo "✓ Object files cleaned" + +# ============================================================================== +# HELP +# ============================================================================== + +help: + @echo "════════════════════════════════════════════════════════════" + @echo " ⚡ StarForth Build System - Fastest in the West! ⚡" + @echo "════════════════════════════════════════════════════════════" + @echo "" + @echo "🛠️ Variables:" + @echo " ARCH= (default: $(ARCH); canonical directory: $(ARCH_DIR))" + @echo " TARGET= (standard | fast | fastest | turbo)" + @echo "" + @echo "🏆 OPTIMIZATION BUILDS:" + @echo " fastest - Maximum performance (ASM + direct threading + LTO)" + @echo " fast - Fast without LTO (easier debugging)" + @echo " turbo - Assembly optimizations only" + @echo "" + @echo "🥧 PLATFORM-SPECIFIC BUILDS:" + @echo " rpi4 - Native build on Raspberry Pi 4" + @echo " rpi4-cross - Cross-compile from x86_64" + @echo " rpi4-fastest - Maximum optimization for RPi4" + @echo " riscv64-clang - Cross-compile for RISC-V 64 via clang (GCC fails here)" + @echo " minimal - Minimal/embedded build" + @echo "" + @echo "🔧 DEBUG & DEVELOPMENT:" + @echo " all - Standard optimized build (default)" + @echo " debug - Debug build with symbols (-g -O0)" + @echo " profile - Build with profiling support" + @echo " performance - Legacy performance build (use 'fastest')" + @echo "" + @echo "🧪 TESTING & BENCHMARKING:" + @echo " test - Run full test suite" + @echo " bench - Quick benchmark" + @echo " benchmark - Full benchmark suite" + @echo "" + @echo "📝 ANALYSIS & DOCUMENTATION:" + @echo " asm - Generate assembly output" + @echo " sbom - Generate SBOM (Software Bill of Materials, SPDX)" + @echo " docs - Generate all documentation" + @echo " api-docs - Generate API docs (Doxygen → AsciiDoc)" + @echo " docs-latex - Convert AsciiDoc to LaTeX" + @echo " docs-isabelle - Generate Isabelle documentation for auditing (includes build log)" + @echo " isabelle-build - Build and verify Isabelle formal theories (strict verification)" + @echo " isabelle-check - Quick-check Isabelle theories" + @echo " info - Build GNU info documentation" + @echo "" + @echo "🔬 REFINEMENT VERIFICATION (C ⊑ Isabelle):" + @echo " refinement-init - Initialize refinement tracking (CAPA + annotations)" + @echo " refinement-status - Show refinement defect summary and phase status" + @echo " refinement-phase1 - Build Phase 1 refinement proofs (vm.c core)" + @echo " verify-defect - Verify specific defect (Usage: make verify-defect DEFECT=001)" + @echo " refinement-annotate-check - Check code annotation coverage" + @echo " refinement-report - Generate refinement status report" + @echo "" + @echo "📦 INSTALLATION & PACKAGING:" + @echo " install - Install to PREFIX (default: .)" + @echo " uninstall - Uninstall from PREFIX" + @echo " deb - Build Debian package" + @echo " rpm - Build RPM package" + @echo " package - Build all packages" + @echo "" + @echo "🧹 CLEANUP:" + @echo " clean - Remove all build artifacts" + @echo " clean-obj - Remove object files only" + @echo " clean-docs - Remove generated documentation" + @echo "" + @echo "⚙️ CONFIGURATION VARIABLES:" + @echo " CC - Compiler (default: gcc)" + @echo " CFLAGS - Compiler flags (override defaults)" + @echo " LDFLAGS - Linker flags (override defaults)" + @echo " PREFIX - Install prefix (default: .)" + @echo " MINIMAL=1 - Minimal build mode (DISABLED -- incomplete, errors out)" + @echo " ASM=1 - Generate assembly files during build" + @echo "" + @echo "📋 EXAMPLES:" + @echo " make fastest # Fastest build for current platform" + @echo " make rpi4-cross # Cross-compile for Raspberry Pi 4" + @echo " make riscv64-clang # Cross-compile for RISC-V 64 (clang)" + @echo " make asm # Generate assembly for inspection" + @echo " make debug # Debug build" + @echo " make PREFIX=/usr/local install # Install system-wide" + @echo "" + @echo "🌟 CURRENT PLATFORM: $(ARCH_NAME)" + @echo "════════════════════════════════════════════════════════════" + +quality: compile_commands clang_tidy cppcheck gcc_analyzer + +compile_commands: + bear --output build/compile_commands.json -- make -j$(nproc) + +clang_tidy: + clang-tidy -p build $(shell find src -name '*.c' -o -name '*.h') | tee build/clang-tidy.txt + +cppcheck: + cppcheck --enable=all --inconclusive --std=c99 src 2> build/cppcheck.txt || true + +gcc_analyzer: + $(MAKE) -f v3/Makefile clean + CFLAGS="$(CFLAGS) -fanalyzer -Wall -Wextra" $(MAKE) -f v3/Makefile all 2>&1 | tee build/gcc-analyzer.txt diff --git a/include/README.md b/v3/include/README.md similarity index 100% rename from include/README.md rename to v3/include/README.md diff --git a/include/arch_detect.h b/v3/include/arch_detect.h similarity index 100% rename from include/arch_detect.h rename to v3/include/arch_detect.h diff --git a/include/blkcfg.h b/v3/include/blkcfg.h similarity index 100% rename from include/blkcfg.h rename to v3/include/blkcfg.h diff --git a/include/blkio.h b/v3/include/blkio.h similarity index 100% rename from include/blkio.h rename to v3/include/blkio.h diff --git a/include/blkio_factory.h b/v3/include/blkio_factory.h similarity index 100% rename from include/blkio_factory.h rename to v3/include/blkio_factory.h diff --git a/include/block_subsystem.h b/v3/include/block_subsystem.h similarity index 100% rename from include/block_subsystem.h rename to v3/include/block_subsystem.h diff --git a/include/cli.h b/v3/include/cli.h similarity index 100% rename from include/cli.h rename to v3/include/cli.h diff --git a/include/compudynamics.h b/v3/include/compudynamics.h similarity index 100% rename from include/compudynamics.h rename to v3/include/compudynamics.h diff --git a/include/dictionary_heat_optimization.h b/v3/include/dictionary_heat_optimization.h similarity index 100% rename from include/dictionary_heat_optimization.h rename to v3/include/dictionary_heat_optimization.h diff --git a/include/dictionary_management.h b/v3/include/dictionary_management.h similarity index 100% rename from include/dictionary_management.h rename to v3/include/dictionary_management.h diff --git a/include/doe_metrics.h b/v3/include/doe_metrics.h similarity index 100% rename from include/doe_metrics.h rename to v3/include/doe_metrics.h diff --git a/include/inference_engine.h b/v3/include/inference_engine.h similarity index 100% rename from include/inference_engine.h rename to v3/include/inference_engine.h diff --git a/include/io.h b/v3/include/io.h similarity index 100% rename from include/io.h rename to v3/include/io.h diff --git a/include/log.h b/v3/include/log.h similarity index 100% rename from include/log.h rename to v3/include/log.h diff --git a/include/math_portable.h b/v3/include/math_portable.h similarity index 100% rename from include/math_portable.h rename to v3/include/math_portable.h diff --git a/include/memory_management.h b/v3/include/memory_management.h similarity index 100% rename from include/memory_management.h rename to v3/include/memory_management.h diff --git a/include/physics_execution_hooks.h b/v3/include/physics_execution_hooks.h similarity index 100% rename from include/physics_execution_hooks.h rename to v3/include/physics_execution_hooks.h diff --git a/include/physics_hotwords_cache.h b/v3/include/physics_hotwords_cache.h similarity index 100% rename from include/physics_hotwords_cache.h rename to v3/include/physics_hotwords_cache.h diff --git a/include/physics_metadata.h b/v3/include/physics_metadata.h similarity index 100% rename from include/physics_metadata.h rename to v3/include/physics_metadata.h diff --git a/include/physics_pipelining_metrics.h b/v3/include/physics_pipelining_metrics.h similarity index 100% rename from include/physics_pipelining_metrics.h rename to v3/include/physics_pipelining_metrics.h diff --git a/include/physics_runtime.h b/v3/include/physics_runtime.h similarity index 100% rename from include/physics_runtime.h rename to v3/include/physics_runtime.h diff --git a/include/platform_alloc.h b/v3/include/platform_alloc.h similarity index 100% rename from include/platform_alloc.h rename to v3/include/platform_alloc.h diff --git a/include/platform_io.h b/v3/include/platform_io.h similarity index 100% rename from include/platform_io.h rename to v3/include/platform_io.h diff --git a/include/platform_lock.h b/v3/include/platform_lock.h similarity index 100% rename from include/platform_lock.h rename to v3/include/platform_lock.h diff --git a/include/platform_time.h b/v3/include/platform_time.h similarity index 100% rename from include/platform_time.h rename to v3/include/platform_time.h diff --git a/include/profiler.h b/v3/include/profiler.h similarity index 100% rename from include/profiler.h rename to v3/include/profiler.h diff --git a/include/q48_16.h b/v3/include/q48_16.h similarity index 100% rename from include/q48_16.h rename to v3/include/q48_16.h diff --git a/include/repl.h b/v3/include/repl.h similarity index 100% rename from include/repl.h rename to v3/include/repl.h diff --git a/include/rolling_window_knobs.h b/v3/include/rolling_window_knobs.h similarity index 100% rename from include/rolling_window_knobs.h rename to v3/include/rolling_window_knobs.h diff --git a/include/rolling_window_of_truth.h b/v3/include/rolling_window_of_truth.h similarity index 100% rename from include/rolling_window_of_truth.h rename to v3/include/rolling_window_of_truth.h diff --git a/include/ssm_jacquard.h b/v3/include/ssm_jacquard.h similarity index 100% rename from include/ssm_jacquard.h rename to v3/include/ssm_jacquard.h diff --git a/include/starforth_config.h b/v3/include/starforth_config.h similarity index 100% rename from include/starforth_config.h rename to v3/include/starforth_config.h diff --git a/include/startup.h b/v3/include/startup.h similarity index 100% rename from include/startup.h rename to v3/include/startup.h diff --git a/v3/include/version.h b/v3/include/version.h new file mode 100644 index 00000000..6603a0b5 --- /dev/null +++ b/v3/include/version.h @@ -0,0 +1,10 @@ +#ifndef STARFORTH_VERSION_H +#define STARFORTH_VERSION_H + +#define STARFORTH_VERSION "3.2.0" +#define STARFORTH_ARCH "x86_64" +#define STARFORTH_TARGET "standard" +#define STARFORTH_TIMESTAMP "2026-10-01T15:21:25-04:00" +#define STARFORTH_VERSION_FULL "StarForth v3.2.0 x86_64 standard 2026-10-01T15:21:25-04:00" + +#endif /* STARFORTH_VERSION_H */ diff --git a/include/vm.h b/v3/include/vm.h similarity index 100% rename from include/vm.h rename to v3/include/vm.h diff --git a/include/vm_api.h b/v3/include/vm_api.h similarity index 100% rename from include/vm_api.h rename to v3/include/vm_api.h diff --git a/include/vm_asm_opt.h b/v3/include/vm_asm_opt.h similarity index 100% rename from include/vm_asm_opt.h rename to v3/include/vm_asm_opt.h diff --git a/include/vm_asm_opt_arm64.h b/v3/include/vm_asm_opt_arm64.h similarity index 100% rename from include/vm_asm_opt_arm64.h rename to v3/include/vm_asm_opt_arm64.h diff --git a/include/vm_asm_opt_riscv64.h b/v3/include/vm_asm_opt_riscv64.h similarity index 100% rename from include/vm_asm_opt_riscv64.h rename to v3/include/vm_asm_opt_riscv64.h diff --git a/include/vm_debug.h b/v3/include/vm_debug.h similarity index 100% rename from include/vm_debug.h rename to v3/include/vm_debug.h diff --git a/include/vm_host.h b/v3/include/vm_host.h similarity index 100% rename from include/vm_host.h rename to v3/include/vm_host.h diff --git a/include/vm_inner_interp_arm64.h b/v3/include/vm_inner_interp_arm64.h similarity index 100% rename from include/vm_inner_interp_arm64.h rename to v3/include/vm_inner_interp_arm64.h diff --git a/include/vm_inner_interp_asm.h b/v3/include/vm_inner_interp_asm.h similarity index 100% rename from include/vm_inner_interp_asm.h rename to v3/include/vm_inner_interp_asm.h diff --git a/include/vm_inner_interp_riscv64.h b/v3/include/vm_inner_interp_riscv64.h similarity index 100% rename from include/vm_inner_interp_riscv64.h rename to v3/include/vm_inner_interp_riscv64.h diff --git a/include/word_registry.h b/v3/include/word_registry.h similarity index 100% rename from include/word_registry.h rename to v3/include/word_registry.h diff --git a/src/README.md b/v3/src/README.md similarity index 100% rename from src/README.md rename to v3/src/README.md diff --git a/src/blkio_factory.c b/v3/src/blkio_factory.c similarity index 100% rename from src/blkio_factory.c rename to v3/src/blkio_factory.c diff --git a/src/blkio_file.c b/v3/src/blkio_file.c similarity index 100% rename from src/blkio_file.c rename to v3/src/blkio_file.c diff --git a/src/blkio_ram.c b/v3/src/blkio_ram.c similarity index 100% rename from src/blkio_ram.c rename to v3/src/blkio_ram.c diff --git a/src/block_subsystem.c b/v3/src/block_subsystem.c similarity index 100% rename from src/block_subsystem.c rename to v3/src/block_subsystem.c diff --git a/src/cli.c b/v3/src/cli.c similarity index 100% rename from src/cli.c rename to v3/src/cli.c diff --git a/src/compudynamics.c b/v3/src/compudynamics.c similarity index 100% rename from src/compudynamics.c rename to v3/src/compudynamics.c diff --git a/src/dictionary_heat_optimization.c b/v3/src/dictionary_heat_optimization.c similarity index 100% rename from src/dictionary_heat_optimization.c rename to v3/src/dictionary_heat_optimization.c diff --git a/src/dictionary_management.c b/v3/src/dictionary_management.c similarity index 100% rename from src/dictionary_management.c rename to v3/src/dictionary_management.c diff --git a/src/doe_metrics.c b/v3/src/doe_metrics.c similarity index 100% rename from src/doe_metrics.c rename to v3/src/doe_metrics.c diff --git a/src/heartbeat_export.c b/v3/src/heartbeat_export.c similarity index 100% rename from src/heartbeat_export.c rename to v3/src/heartbeat_export.c diff --git a/src/inference_engine.c b/v3/src/inference_engine.c similarity index 100% rename from src/inference_engine.c rename to v3/src/inference_engine.c diff --git a/src/io.c b/v3/src/io.c similarity index 100% rename from src/io.c rename to v3/src/io.c diff --git a/src/log.c b/v3/src/log.c similarity index 100% rename from src/log.c rename to v3/src/log.c diff --git a/src/main.c b/v3/src/main.c similarity index 100% rename from src/main.c rename to v3/src/main.c diff --git a/src/math_portable.c b/v3/src/math_portable.c similarity index 100% rename from src/math_portable.c rename to v3/src/math_portable.c diff --git a/src/memory_management.c b/v3/src/memory_management.c similarity index 100% rename from src/memory_management.c rename to v3/src/memory_management.c diff --git a/src/physics_execution_hooks.c b/v3/src/physics_execution_hooks.c similarity index 100% rename from src/physics_execution_hooks.c rename to v3/src/physics_execution_hooks.c diff --git a/src/physics_hotwords_cache.c b/v3/src/physics_hotwords_cache.c similarity index 100% rename from src/physics_hotwords_cache.c rename to v3/src/physics_hotwords_cache.c diff --git a/src/physics_metadata.c b/v3/src/physics_metadata.c similarity index 100% rename from src/physics_metadata.c rename to v3/src/physics_metadata.c diff --git a/src/physics_pipelining_metrics.c b/v3/src/physics_pipelining_metrics.c similarity index 100% rename from src/physics_pipelining_metrics.c rename to v3/src/physics_pipelining_metrics.c diff --git a/src/physics_runtime.c b/v3/src/physics_runtime.c similarity index 100% rename from src/physics_runtime.c rename to v3/src/physics_runtime.c diff --git a/src/platform/README.md b/v3/src/platform/README.md similarity index 100% rename from src/platform/README.md rename to v3/src/platform/README.md diff --git a/src/platform/alloc_host.c b/v3/src/platform/alloc_host.c similarity index 100% rename from src/platform/alloc_host.c rename to v3/src/platform/alloc_host.c diff --git a/src/platform/alloc_kernel.c b/v3/src/platform/alloc_kernel.c similarity index 100% rename from src/platform/alloc_kernel.c rename to v3/src/platform/alloc_kernel.c diff --git a/src/platform/l4re/README.md b/v3/src/platform/l4re/README.md similarity index 100% rename from src/platform/l4re/README.md rename to v3/src/platform/l4re/README.md diff --git a/src/platform/l4re/time.c b/v3/src/platform/l4re/time.c similarity index 100% rename from src/platform/l4re/time.c rename to v3/src/platform/l4re/time.c diff --git a/src/platform/linux/README.md b/v3/src/platform/linux/README.md similarity index 100% rename from src/platform/linux/README.md rename to v3/src/platform/linux/README.md diff --git a/src/platform/linux/io.c b/v3/src/platform/linux/io.c similarity index 100% rename from src/platform/linux/io.c rename to v3/src/platform/linux/io.c diff --git a/src/platform/linux/time.c b/v3/src/platform/linux/time.c similarity index 100% rename from src/platform/linux/time.c rename to v3/src/platform/linux/time.c diff --git a/src/platform/platform_init.c b/v3/src/platform/platform_init.c similarity index 100% rename from src/platform/platform_init.c rename to v3/src/platform/platform_init.c diff --git a/src/platform/threading.c b/v3/src/platform/threading.c similarity index 100% rename from src/platform/threading.c rename to v3/src/platform/threading.c diff --git a/src/profiler.c b/v3/src/profiler.c similarity index 100% rename from src/profiler.c rename to v3/src/profiler.c diff --git a/src/repl.c b/v3/src/repl.c similarity index 100% rename from src/repl.c rename to v3/src/repl.c diff --git a/src/rolling_window_of_truth.c b/v3/src/rolling_window_of_truth.c similarity index 100% rename from src/rolling_window_of_truth.c rename to v3/src/rolling_window_of_truth.c diff --git a/src/ssm_jacquard.c b/v3/src/ssm_jacquard.c similarity index 100% rename from src/ssm_jacquard.c rename to v3/src/ssm_jacquard.c diff --git a/src/stack_management.c b/v3/src/stack_management.c similarity index 100% rename from src/stack_management.c rename to v3/src/stack_management.c diff --git a/src/test_runner/README.md b/v3/src/test_runner/README.md similarity index 100% rename from src/test_runner/README.md rename to v3/src/test_runner/README.md diff --git a/src/test_runner/include/README.md b/v3/src/test_runner/include/README.md similarity index 100% rename from src/test_runner/include/README.md rename to v3/src/test_runner/include/README.md diff --git a/src/test_runner/include/test_common.h b/v3/src/test_runner/include/test_common.h similarity index 99% rename from src/test_runner/include/test_common.h rename to v3/src/test_runner/include/test_common.h index c6154902..aa8942ab 100644 --- a/src/test_runner/include/test_common.h +++ b/v3/src/test_runner/include/test_common.h @@ -50,8 +50,8 @@ #ifndef TEST_COMMON_H #define TEST_COMMON_H -#include "../include/vm.h" -#include "../include/log.h" +#include "../../../include/vm.h" +#include "../../../include/log.h" #include "test_contracts.h" /** @name Test Configuration diff --git a/src/test_runner/include/test_contracts.h b/v3/src/test_runner/include/test_contracts.h similarity index 100% rename from src/test_runner/include/test_contracts.h rename to v3/src/test_runner/include/test_contracts.h diff --git a/src/test_runner/include/test_runner.h b/v3/src/test_runner/include/test_runner.h similarity index 100% rename from src/test_runner/include/test_runner.h rename to v3/src/test_runner/include/test_runner.h diff --git a/src/test_runner/modules/README.md b/v3/src/test_runner/modules/README.md similarity index 100% rename from src/test_runner/modules/README.md rename to v3/src/test_runner/modules/README.md diff --git a/src/test_runner/modules/acl_words_test.c b/v3/src/test_runner/modules/acl_words_test.c similarity index 100% rename from src/test_runner/modules/acl_words_test.c rename to v3/src/test_runner/modules/acl_words_test.c diff --git a/src/test_runner/modules/arithmetic_words_test.c b/v3/src/test_runner/modules/arithmetic_words_test.c similarity index 100% rename from src/test_runner/modules/arithmetic_words_test.c rename to v3/src/test_runner/modules/arithmetic_words_test.c diff --git a/src/test_runner/modules/block_words_test.c b/v3/src/test_runner/modules/block_words_test.c similarity index 100% rename from src/test_runner/modules/block_words_test.c rename to v3/src/test_runner/modules/block_words_test.c diff --git a/src/test_runner/modules/break_me_tests.c b/v3/src/test_runner/modules/break_me_tests.c similarity index 100% rename from src/test_runner/modules/break_me_tests.c rename to v3/src/test_runner/modules/break_me_tests.c diff --git a/src/test_runner/modules/control_words_test.c b/v3/src/test_runner/modules/control_words_test.c similarity index 100% rename from src/test_runner/modules/control_words_test.c rename to v3/src/test_runner/modules/control_words_test.c diff --git a/src/test_runner/modules/defining_words_tests.c b/v3/src/test_runner/modules/defining_words_tests.c similarity index 100% rename from src/test_runner/modules/defining_words_tests.c rename to v3/src/test_runner/modules/defining_words_tests.c diff --git a/src/test_runner/modules/dictionary_manipulation_words_test.c b/v3/src/test_runner/modules/dictionary_manipulation_words_test.c similarity index 100% rename from src/test_runner/modules/dictionary_manipulation_words_test.c rename to v3/src/test_runner/modules/dictionary_manipulation_words_test.c diff --git a/src/test_runner/modules/dictionary_words_test.c b/v3/src/test_runner/modules/dictionary_words_test.c similarity index 100% rename from src/test_runner/modules/dictionary_words_test.c rename to v3/src/test_runner/modules/dictionary_words_test.c diff --git a/src/test_runner/modules/double_words_test.c b/v3/src/test_runner/modules/double_words_test.c similarity index 100% rename from src/test_runner/modules/double_words_test.c rename to v3/src/test_runner/modules/double_words_test.c diff --git a/src/test_runner/modules/format_words_test.c b/v3/src/test_runner/modules/format_words_test.c similarity index 100% rename from src/test_runner/modules/format_words_test.c rename to v3/src/test_runner/modules/format_words_test.c diff --git a/src/test_runner/modules/inference_words_test.c b/v3/src/test_runner/modules/inference_words_test.c similarity index 100% rename from src/test_runner/modules/inference_words_test.c rename to v3/src/test_runner/modules/inference_words_test.c diff --git a/src/test_runner/modules/integration_tests.c b/v3/src/test_runner/modules/integration_tests.c similarity index 100% rename from src/test_runner/modules/integration_tests.c rename to v3/src/test_runner/modules/integration_tests.c diff --git a/src/test_runner/modules/io_words_test.c b/v3/src/test_runner/modules/io_words_test.c similarity index 100% rename from src/test_runner/modules/io_words_test.c rename to v3/src/test_runner/modules/io_words_test.c diff --git a/src/test_runner/modules/logical_words_test.c b/v3/src/test_runner/modules/logical_words_test.c similarity index 100% rename from src/test_runner/modules/logical_words_test.c rename to v3/src/test_runner/modules/logical_words_test.c diff --git a/src/test_runner/modules/mama_forth_words_test.c b/v3/src/test_runner/modules/mama_forth_words_test.c similarity index 100% rename from src/test_runner/modules/mama_forth_words_test.c rename to v3/src/test_runner/modules/mama_forth_words_test.c diff --git a/src/test_runner/modules/memory_words_test.c b/v3/src/test_runner/modules/memory_words_test.c similarity index 100% rename from src/test_runner/modules/memory_words_test.c rename to v3/src/test_runner/modules/memory_words_test.c diff --git a/src/test_runner/modules/mixed_arithmetic_words_test.c b/v3/src/test_runner/modules/mixed_arithmetic_words_test.c similarity index 100% rename from src/test_runner/modules/mixed_arithmetic_words_test.c rename to v3/src/test_runner/modules/mixed_arithmetic_words_test.c diff --git a/src/test_runner/modules/physics_freeze_words_test.c b/v3/src/test_runner/modules/physics_freeze_words_test.c similarity index 100% rename from src/test_runner/modules/physics_freeze_words_test.c rename to v3/src/test_runner/modules/physics_freeze_words_test.c diff --git a/src/test_runner/modules/q48_words_test.c b/v3/src/test_runner/modules/q48_words_test.c similarity index 100% rename from src/test_runner/modules/q48_words_test.c rename to v3/src/test_runner/modules/q48_words_test.c diff --git a/src/test_runner/modules/return_stack_words_test.c b/v3/src/test_runner/modules/return_stack_words_test.c similarity index 100% rename from src/test_runner/modules/return_stack_words_test.c rename to v3/src/test_runner/modules/return_stack_words_test.c diff --git a/src/test_runner/modules/stack_words_test.c b/v3/src/test_runner/modules/stack_words_test.c similarity index 100% rename from src/test_runner/modules/stack_words_test.c rename to v3/src/test_runner/modules/stack_words_test.c diff --git a/src/test_runner/modules/starforth_words_test.c b/v3/src/test_runner/modules/starforth_words_test.c similarity index 100% rename from src/test_runner/modules/starforth_words_test.c rename to v3/src/test_runner/modules/starforth_words_test.c diff --git a/src/test_runner/modules/stress_tests.c b/v3/src/test_runner/modules/stress_tests.c similarity index 100% rename from src/test_runner/modules/stress_tests.c rename to v3/src/test_runner/modules/stress_tests.c diff --git a/src/test_runner/modules/string_words_test.c b/v3/src/test_runner/modules/string_words_test.c similarity index 100% rename from src/test_runner/modules/string_words_test.c rename to v3/src/test_runner/modules/string_words_test.c diff --git a/src/test_runner/modules/system_words_test.c b/v3/src/test_runner/modules/system_words_test.c similarity index 100% rename from src/test_runner/modules/system_words_test.c rename to v3/src/test_runner/modules/system_words_test.c diff --git a/src/test_runner/modules/vocabulary_words_test.c b/v3/src/test_runner/modules/vocabulary_words_test.c similarity index 100% rename from src/test_runner/modules/vocabulary_words_test.c rename to v3/src/test_runner/modules/vocabulary_words_test.c diff --git a/src/test_runner/test_common.c b/v3/src/test_runner/test_common.c similarity index 100% rename from src/test_runner/test_common.c rename to v3/src/test_runner/test_common.c diff --git a/src/test_runner/test_contracts.c b/v3/src/test_runner/test_contracts.c similarity index 100% rename from src/test_runner/test_contracts.c rename to v3/src/test_runner/test_contracts.c diff --git a/src/test_runner/test_runner.c b/v3/src/test_runner/test_runner.c similarity index 100% rename from src/test_runner/test_runner.c rename to v3/src/test_runner/test_runner.c diff --git a/src/vm.c b/v3/src/vm.c similarity index 100% rename from src/vm.c rename to v3/src/vm.c diff --git a/src/vm_api.c b/v3/src/vm_api.c similarity index 100% rename from src/vm_api.c rename to v3/src/vm_api.c diff --git a/src/vm_bootstrap.c b/v3/src/vm_bootstrap.c similarity index 99% rename from src/vm_bootstrap.c rename to v3/src/vm_bootstrap.c index b933918e..f0e7d0f3 100644 --- a/src/vm_bootstrap.c +++ b/v3/src/vm_bootstrap.c @@ -65,8 +65,8 @@ #include "word_source/include/vocabulary_words.h" #ifdef __STARKERNEL__ -#include "../include/starkernel/capsule_birth.h" -#include "../include/starkernel/capsule_run.h" +#include "starkernel/capsule_birth.h" +#include "starkernel/capsule_run.h" #endif #include diff --git a/src/vm_debug.c b/v3/src/vm_debug.c similarity index 100% rename from src/vm_debug.c rename to v3/src/vm_debug.c diff --git a/src/vm_internal.h b/v3/src/vm_internal.h similarity index 100% rename from src/vm_internal.h rename to v3/src/vm_internal.h diff --git a/src/vm_time.c b/v3/src/vm_time.c similarity index 100% rename from src/vm_time.c rename to v3/src/vm_time.c diff --git a/src/word_registry.c b/v3/src/word_registry.c similarity index 100% rename from src/word_registry.c rename to v3/src/word_registry.c diff --git a/src/word_source/README.md b/v3/src/word_source/README.md similarity index 100% rename from src/word_source/README.md rename to v3/src/word_source/README.md diff --git a/src/word_source/acl_words.c b/v3/src/word_source/acl_words.c similarity index 100% rename from src/word_source/acl_words.c rename to v3/src/word_source/acl_words.c diff --git a/src/word_source/arithmetic_words.c b/v3/src/word_source/arithmetic_words.c similarity index 100% rename from src/word_source/arithmetic_words.c rename to v3/src/word_source/arithmetic_words.c diff --git a/src/word_source/block_words.c b/v3/src/word_source/block_words.c similarity index 100% rename from src/word_source/block_words.c rename to v3/src/word_source/block_words.c diff --git a/src/word_source/control_words.c b/v3/src/word_source/control_words.c similarity index 100% rename from src/word_source/control_words.c rename to v3/src/word_source/control_words.c diff --git a/src/word_source/defer_words.c b/v3/src/word_source/defer_words.c similarity index 100% rename from src/word_source/defer_words.c rename to v3/src/word_source/defer_words.c diff --git a/src/word_source/defining_words.c b/v3/src/word_source/defining_words.c similarity index 100% rename from src/word_source/defining_words.c rename to v3/src/word_source/defining_words.c diff --git a/src/word_source/dictionary_heat_diagnostic_words.c b/v3/src/word_source/dictionary_heat_diagnostic_words.c similarity index 100% rename from src/word_source/dictionary_heat_diagnostic_words.c rename to v3/src/word_source/dictionary_heat_diagnostic_words.c diff --git a/src/word_source/dictionary_manipulation_words.c b/v3/src/word_source/dictionary_manipulation_words.c similarity index 100% rename from src/word_source/dictionary_manipulation_words.c rename to v3/src/word_source/dictionary_manipulation_words.c diff --git a/src/word_source/dictionary_words.c b/v3/src/word_source/dictionary_words.c similarity index 100% rename from src/word_source/dictionary_words.c rename to v3/src/word_source/dictionary_words.c diff --git a/src/word_source/double_words.c b/v3/src/word_source/double_words.c similarity index 100% rename from src/word_source/double_words.c rename to v3/src/word_source/double_words.c diff --git a/src/word_source/editor_words.c b/v3/src/word_source/editor_words.c similarity index 100% rename from src/word_source/editor_words.c rename to v3/src/word_source/editor_words.c diff --git a/src/word_source/format_words.c b/v3/src/word_source/format_words.c similarity index 100% rename from src/word_source/format_words.c rename to v3/src/word_source/format_words.c diff --git a/src/word_source/framebuffer_words.c b/v3/src/word_source/framebuffer_words.c similarity index 100% rename from src/word_source/framebuffer_words.c rename to v3/src/word_source/framebuffer_words.c diff --git a/src/word_source/include/README.md b/v3/src/word_source/include/README.md similarity index 100% rename from src/word_source/include/README.md rename to v3/src/word_source/include/README.md diff --git a/src/word_source/include/acl_words.h b/v3/src/word_source/include/acl_words.h similarity index 100% rename from src/word_source/include/acl_words.h rename to v3/src/word_source/include/acl_words.h diff --git a/src/word_source/include/arithmetic_words.h b/v3/src/word_source/include/arithmetic_words.h similarity index 100% rename from src/word_source/include/arithmetic_words.h rename to v3/src/word_source/include/arithmetic_words.h diff --git a/src/word_source/include/block_words.h b/v3/src/word_source/include/block_words.h similarity index 100% rename from src/word_source/include/block_words.h rename to v3/src/word_source/include/block_words.h diff --git a/src/word_source/include/control_words.h b/v3/src/word_source/include/control_words.h similarity index 100% rename from src/word_source/include/control_words.h rename to v3/src/word_source/include/control_words.h diff --git a/src/word_source/include/defer_words.h b/v3/src/word_source/include/defer_words.h similarity index 89% rename from src/word_source/include/defer_words.h rename to v3/src/word_source/include/defer_words.h index cc24580b..1015e3d0 100644 --- a/src/word_source/include/defer_words.h +++ b/v3/src/word_source/include/defer_words.h @@ -10,7 +10,7 @@ #ifndef DEFER_WORDS_H #define DEFER_WORDS_H -#include "../../include/vm.h" +#include "../../../include/vm.h" void register_defer_words(VM *vm); diff --git a/src/word_source/include/defining_words.h b/v3/src/word_source/include/defining_words.h similarity index 100% rename from src/word_source/include/defining_words.h rename to v3/src/word_source/include/defining_words.h diff --git a/src/word_source/include/dictionary_heat_diagnostic_words.h b/v3/src/word_source/include/dictionary_heat_diagnostic_words.h similarity index 100% rename from src/word_source/include/dictionary_heat_diagnostic_words.h rename to v3/src/word_source/include/dictionary_heat_diagnostic_words.h diff --git a/src/word_source/include/dictionary_manipulation_words.h b/v3/src/word_source/include/dictionary_manipulation_words.h similarity index 100% rename from src/word_source/include/dictionary_manipulation_words.h rename to v3/src/word_source/include/dictionary_manipulation_words.h diff --git a/src/word_source/include/dictionary_words.h b/v3/src/word_source/include/dictionary_words.h similarity index 100% rename from src/word_source/include/dictionary_words.h rename to v3/src/word_source/include/dictionary_words.h diff --git a/src/word_source/include/double_words.h b/v3/src/word_source/include/double_words.h similarity index 100% rename from src/word_source/include/double_words.h rename to v3/src/word_source/include/double_words.h diff --git a/src/word_source/include/editor_words.h b/v3/src/word_source/include/editor_words.h similarity index 100% rename from src/word_source/include/editor_words.h rename to v3/src/word_source/include/editor_words.h diff --git a/src/word_source/include/format_words.h b/v3/src/word_source/include/format_words.h similarity index 100% rename from src/word_source/include/format_words.h rename to v3/src/word_source/include/format_words.h diff --git a/src/word_source/include/framebuffer_words.h b/v3/src/word_source/include/framebuffer_words.h similarity index 100% rename from src/word_source/include/framebuffer_words.h rename to v3/src/word_source/include/framebuffer_words.h diff --git a/src/word_source/include/inference_words.h b/v3/src/word_source/include/inference_words.h similarity index 100% rename from src/word_source/include/inference_words.h rename to v3/src/word_source/include/inference_words.h diff --git a/src/word_source/include/io_words.h b/v3/src/word_source/include/io_words.h similarity index 100% rename from src/word_source/include/io_words.h rename to v3/src/word_source/include/io_words.h diff --git a/src/word_source/include/keyboard_words.h b/v3/src/word_source/include/keyboard_words.h similarity index 100% rename from src/word_source/include/keyboard_words.h rename to v3/src/word_source/include/keyboard_words.h diff --git a/src/word_source/include/log_words.h b/v3/src/word_source/include/log_words.h similarity index 100% rename from src/word_source/include/log_words.h rename to v3/src/word_source/include/log_words.h diff --git a/src/word_source/include/logical_words.h b/v3/src/word_source/include/logical_words.h similarity index 100% rename from src/word_source/include/logical_words.h rename to v3/src/word_source/include/logical_words.h diff --git a/src/word_source/include/mama_forth_words.h b/v3/src/word_source/include/mama_forth_words.h similarity index 100% rename from src/word_source/include/mama_forth_words.h rename to v3/src/word_source/include/mama_forth_words.h diff --git a/src/word_source/include/memory_words.h b/v3/src/word_source/include/memory_words.h similarity index 100% rename from src/word_source/include/memory_words.h rename to v3/src/word_source/include/memory_words.h diff --git a/src/word_source/include/mixed_arithmetic_words.h b/v3/src/word_source/include/mixed_arithmetic_words.h similarity index 100% rename from src/word_source/include/mixed_arithmetic_words.h rename to v3/src/word_source/include/mixed_arithmetic_words.h diff --git a/src/word_source/include/physics_benchmark_words.h b/v3/src/word_source/include/physics_benchmark_words.h similarity index 100% rename from src/word_source/include/physics_benchmark_words.h rename to v3/src/word_source/include/physics_benchmark_words.h diff --git a/src/word_source/include/physics_diagnostic_words.h b/v3/src/word_source/include/physics_diagnostic_words.h similarity index 100% rename from src/word_source/include/physics_diagnostic_words.h rename to v3/src/word_source/include/physics_diagnostic_words.h diff --git a/src/word_source/include/physics_freeze_words.h b/v3/src/word_source/include/physics_freeze_words.h similarity index 100% rename from src/word_source/include/physics_freeze_words.h rename to v3/src/word_source/include/physics_freeze_words.h diff --git a/src/word_source/include/physics_pipelining_diagnostic_words.h b/v3/src/word_source/include/physics_pipelining_diagnostic_words.h similarity index 100% rename from src/word_source/include/physics_pipelining_diagnostic_words.h rename to v3/src/word_source/include/physics_pipelining_diagnostic_words.h diff --git a/src/word_source/include/q48_words.h b/v3/src/word_source/include/q48_words.h similarity index 100% rename from src/word_source/include/q48_words.h rename to v3/src/word_source/include/q48_words.h diff --git a/src/word_source/include/return_stack_words.h b/v3/src/word_source/include/return_stack_words.h similarity index 100% rename from src/word_source/include/return_stack_words.h rename to v3/src/word_source/include/return_stack_words.h diff --git a/src/word_source/include/scroll_words.h b/v3/src/word_source/include/scroll_words.h similarity index 100% rename from src/word_source/include/scroll_words.h rename to v3/src/word_source/include/scroll_words.h diff --git a/src/word_source/include/stack_words.h b/v3/src/word_source/include/stack_words.h similarity index 100% rename from src/word_source/include/stack_words.h rename to v3/src/word_source/include/stack_words.h diff --git a/src/word_source/include/starforth_words.h b/v3/src/word_source/include/starforth_words.h similarity index 100% rename from src/word_source/include/starforth_words.h rename to v3/src/word_source/include/starforth_words.h diff --git a/src/word_source/include/string_words.h b/v3/src/word_source/include/string_words.h similarity index 100% rename from src/word_source/include/string_words.h rename to v3/src/word_source/include/string_words.h diff --git a/src/word_source/include/system_words.h b/v3/src/word_source/include/system_words.h similarity index 100% rename from src/word_source/include/system_words.h rename to v3/src/word_source/include/system_words.h diff --git a/src/word_source/include/ttf_words.h b/v3/src/word_source/include/ttf_words.h similarity index 100% rename from src/word_source/include/ttf_words.h rename to v3/src/word_source/include/ttf_words.h diff --git a/src/word_source/include/vocabulary_words.h b/v3/src/word_source/include/vocabulary_words.h similarity index 100% rename from src/word_source/include/vocabulary_words.h rename to v3/src/word_source/include/vocabulary_words.h diff --git a/src/word_source/inference_words.c b/v3/src/word_source/inference_words.c similarity index 100% rename from src/word_source/inference_words.c rename to v3/src/word_source/inference_words.c diff --git a/src/word_source/io_words.c b/v3/src/word_source/io_words.c similarity index 100% rename from src/word_source/io_words.c rename to v3/src/word_source/io_words.c diff --git a/src/word_source/keyboard_words.c b/v3/src/word_source/keyboard_words.c similarity index 100% rename from src/word_source/keyboard_words.c rename to v3/src/word_source/keyboard_words.c diff --git a/src/word_source/lifecycle_words_hosted.c b/v3/src/word_source/lifecycle_words_hosted.c similarity index 100% rename from src/word_source/lifecycle_words_hosted.c rename to v3/src/word_source/lifecycle_words_hosted.c diff --git a/src/word_source/log_words.c b/v3/src/word_source/log_words.c similarity index 100% rename from src/word_source/log_words.c rename to v3/src/word_source/log_words.c diff --git a/src/word_source/logical_words.c b/v3/src/word_source/logical_words.c similarity index 100% rename from src/word_source/logical_words.c rename to v3/src/word_source/logical_words.c diff --git a/src/word_source/memory_words.c b/v3/src/word_source/memory_words.c similarity index 100% rename from src/word_source/memory_words.c rename to v3/src/word_source/memory_words.c diff --git a/src/word_source/mixed_arithmetic_words.c b/v3/src/word_source/mixed_arithmetic_words.c similarity index 100% rename from src/word_source/mixed_arithmetic_words.c rename to v3/src/word_source/mixed_arithmetic_words.c diff --git a/src/word_source/physics_benchmark_words.c b/v3/src/word_source/physics_benchmark_words.c similarity index 100% rename from src/word_source/physics_benchmark_words.c rename to v3/src/word_source/physics_benchmark_words.c diff --git a/src/word_source/physics_diagnostic_words.c b/v3/src/word_source/physics_diagnostic_words.c similarity index 100% rename from src/word_source/physics_diagnostic_words.c rename to v3/src/word_source/physics_diagnostic_words.c diff --git a/src/word_source/physics_freeze_words.c b/v3/src/word_source/physics_freeze_words.c similarity index 100% rename from src/word_source/physics_freeze_words.c rename to v3/src/word_source/physics_freeze_words.c diff --git a/src/word_source/physics_pipelining_diagnostic_words.c b/v3/src/word_source/physics_pipelining_diagnostic_words.c similarity index 99% rename from src/word_source/physics_pipelining_diagnostic_words.c rename to v3/src/word_source/physics_pipelining_diagnostic_words.c index 662d9431..1e928c35 100644 --- a/src/word_source/physics_pipelining_diagnostic_words.c +++ b/v3/src/word_source/physics_pipelining_diagnostic_words.c @@ -50,9 +50,9 @@ */ -#include "../include/vm.h" -#include "../include/physics_pipelining_metrics.h" -#include "../include/word_registry.h" +#include "../../include/vm.h" +#include "../../include/physics_pipelining_metrics.h" +#include "../../include/word_registry.h" #include #include #include diff --git a/src/word_source/q48_16_words.c b/v3/src/word_source/q48_16_words.c similarity index 99% rename from src/word_source/q48_16_words.c rename to v3/src/word_source/q48_16_words.c index 0b0279b4..b6e5b190 100644 --- a/src/word_source/q48_16_words.c +++ b/v3/src/word_source/q48_16_words.c @@ -45,7 +45,7 @@ #include #include -#include "../include/q48_16.h" +#include "../../include/q48_16.h" /* ============================================================================ * Core Arithmetic: Multiply diff --git a/src/word_source/q48_words.c b/v3/src/word_source/q48_words.c similarity index 100% rename from src/word_source/q48_words.c rename to v3/src/word_source/q48_words.c diff --git a/src/word_source/return_stack_words.c b/v3/src/word_source/return_stack_words.c similarity index 100% rename from src/word_source/return_stack_words.c rename to v3/src/word_source/return_stack_words.c diff --git a/src/word_source/scroll_words.c b/v3/src/word_source/scroll_words.c similarity index 100% rename from src/word_source/scroll_words.c rename to v3/src/word_source/scroll_words.c diff --git a/src/word_source/stack_words.c b/v3/src/word_source/stack_words.c similarity index 100% rename from src/word_source/stack_words.c rename to v3/src/word_source/stack_words.c diff --git a/src/word_source/starforth_words.c b/v3/src/word_source/starforth_words.c similarity index 100% rename from src/word_source/starforth_words.c rename to v3/src/word_source/starforth_words.c diff --git a/src/word_source/string_words.c b/v3/src/word_source/string_words.c similarity index 100% rename from src/word_source/string_words.c rename to v3/src/word_source/string_words.c diff --git a/src/word_source/system_words.c b/v3/src/word_source/system_words.c similarity index 100% rename from src/word_source/system_words.c rename to v3/src/word_source/system_words.c diff --git a/src/word_source/ttf_words.c b/v3/src/word_source/ttf_words.c similarity index 100% rename from src/word_source/ttf_words.c rename to v3/src/word_source/ttf_words.c diff --git a/src/word_source/vocabulary_words.c b/v3/src/word_source/vocabulary_words.c similarity index 100% rename from src/word_source/vocabulary_words.c rename to v3/src/word_source/vocabulary_words.c diff --git a/v4/README.md b/v4/README.md new file mode 100644 index 00000000..d1beb6b1 --- /dev/null +++ b/v4/README.md @@ -0,0 +1,9 @@ +# v4/ + +StarForth v4: the 32-instruction F18-derived core. The design lives in +`docs/v4.0.0/JUSTIFICATION.md` (why) and `docs/v4.0.0/DECOMPOSITION.md` +(every v3 word mapped to a v4 fate). + +There is no code yet. The first deliverable is the hosted C99 golden model +(`JUSTIFICATION.md` §10, step 1). It must pass POST and hold K≡1.0 with +32- and 64-bit cells on all three host ISAs. -- 2.54.0 From 067f317c479ac2a98a2fafd4dea6997c3668b8c2 Mon Sep 17 00:00:00 2001 From: rajames Date: Fri, 2 Oct 2026 14:38:27 -0400 Subject: [PATCH 003/135] feat(v4.0.0): hosted golden model, single node First code for StarForth v4 (JUSTIFICATION.md section 10, step 1): one node of the 32-instruction core as a C99 model, with cell width as a build parameter. - Node: P, A, B, F18 circular stacks (10 and 9 deep, D-2), word-addressed memory (D-1), 5% guard bands on every bounded list. - Instruction word: six 5-bit slots in 32 bits at every cell width. - Executor: all 32 opcodes of DECOMPOSITION.md 1.3. Cell arithmetic wraps explicitly; no signed overflow or implementation-defined shift. - Heat: per-opcode and per-call-target counters and the anti-clock, driven by instruction retirement (1.4, D-6 interim). - Slot packer and runner for tests, and a reference unsigned multiply in plain C99 with no 128-bit type. Tests run at 32- and 64-bit cells, and under ASan and UBSan. They cover every opcode and execute the first section 4 definitions (NIP SWAP OR NEGATE ROT 0< 0= 2DUP - U<) against the C operation each stands for. UM* as written in section 4 is exact only while u1 <= 2^(n-2). Two known failing cases are pinned in test_foundation.c until it is rewritten. DECOMPOSITION.md: record D-9, the instruction word is 32 bits at every cell width (ruled 2026-10-02). Co-Authored-By: Claude Opus 5.5 --- docs/v4.0.0/DECOMPOSITION.md | 1 + v4/.gitignore | 2 + v4/Makefile | 105 +++++++++ v4/README.md | 12 +- v4/include/v4/asm.h | 68 ++++++ v4/include/v4/cell.h | 60 ++++++ v4/include/v4/exec.h | 56 +++++ v4/include/v4/guard.h | 92 ++++++++ v4/include/v4/heat.h | 79 +++++++ v4/include/v4/iword.h | 101 +++++++++ v4/include/v4/node.h | 114 ++++++++++ v4/include/v4/opcode.h | 64 ++++++ v4/include/v4/stack.h | 89 ++++++++ v4/include/v4/testcode.h | 19 ++ v4/include/v4/umul.h | 31 +++ v4/src/asm.c | 115 ++++++++++ v4/src/exec.c | 209 ++++++++++++++++++ v4/src/guard.c | 15 ++ v4/src/heat.c | 89 ++++++++ v4/src/iword.c | 74 +++++++ v4/src/node.c | 35 +++ v4/src/stack.c | 107 ++++++++++ v4/src/testcode.c | 20 ++ v4/src/umul.c | 27 +++ v4/tests/test_asm.c | 110 ++++++++++ v4/tests/test_exec.c | 339 +++++++++++++++++++++++++++++ v4/tests/test_foundation.c | 209 ++++++++++++++++++ v4/tests/test_guard.c | 213 +++++++++++++++++++ v4/tests/test_heat.c | 109 ++++++++++ v4/tests/test_iword.c | 400 +++++++++++++++++++++++++++++++++++ v4/tests/test_node.c | 266 +++++++++++++++++++++++ v4/tests/test_stack.c | 338 +++++++++++++++++++++++++++++ v4/tests/test_umul.c | 70 ++++++ 33 files changed, 3635 insertions(+), 3 deletions(-) create mode 100644 v4/.gitignore create mode 100644 v4/Makefile create mode 100644 v4/include/v4/asm.h create mode 100644 v4/include/v4/cell.h create mode 100644 v4/include/v4/exec.h create mode 100644 v4/include/v4/guard.h create mode 100644 v4/include/v4/heat.h create mode 100644 v4/include/v4/iword.h create mode 100644 v4/include/v4/node.h create mode 100644 v4/include/v4/opcode.h create mode 100644 v4/include/v4/stack.h create mode 100644 v4/include/v4/testcode.h create mode 100644 v4/include/v4/umul.h create mode 100644 v4/src/asm.c create mode 100644 v4/src/exec.c create mode 100644 v4/src/guard.c create mode 100644 v4/src/heat.c create mode 100644 v4/src/iword.c create mode 100644 v4/src/node.c create mode 100644 v4/src/stack.c create mode 100644 v4/src/testcode.c create mode 100644 v4/src/umul.c create mode 100644 v4/tests/test_asm.c create mode 100644 v4/tests/test_exec.c create mode 100644 v4/tests/test_foundation.c create mode 100644 v4/tests/test_guard.c create mode 100644 v4/tests/test_heat.c create mode 100644 v4/tests/test_iword.c create mode 100644 v4/tests/test_node.c create mode 100644 v4/tests/test_stack.c create mode 100644 v4/tests/test_umul.c diff --git a/docs/v4.0.0/DECOMPOSITION.md b/docs/v4.0.0/DECOMPOSITION.md index 8ae8e135..a08fb356 100644 --- a/docs/v4.0.0/DECOMPOSITION.md +++ b/docs/v4.0.0/DECOMPOSITION.md @@ -170,6 +170,7 @@ definition below depends on one, it says so. | **D-6** | Which heat structures exist in hardware: per-opcode counters only, or also per-call-target and word-to-word transition counters. | **Deferred** to step 2. The golden model implements per-opcode and per-call-target heat in the meantime. | | **D-7** | `ROLL` semantics. | **Moot.** `ROLL` is retired under D-2. | | **D-8** | Q48.16 signedness. | **Signed.** v3's unsigned comparisons and `Q.FROM-INT` clamping are retired. | +| **D-9** | Instruction word width on a 64-bit-cell host (ruled 2026-10-02). | **32 bits at every cell width.** Six 5-bit slots plus 2 spare bits, as in §1.2. On a 64-bit host the instruction word is the low 32 bits of the cell and the high half is ignored, so compiled code is identical at both widths. Only data and `@p` literals are a full cell wide. | **Consequences of D-2 that every definition must respect.** The data stack holds 10 items and the return stack 9, and every `call`, `FOR`, `DO` loop frame and `push` uses return-stack slots. Nesting diff --git a/v4/.gitignore b/v4/.gitignore new file mode 100644 index 00000000..e757b735 --- /dev/null +++ b/v4/.gitignore @@ -0,0 +1,2 @@ +# Build output. Regenerated by `make test` / `make sanitize`. +build/ diff --git a/v4/Makefile b/v4/Makefile new file mode 100644 index 00000000..bd8a2905 --- /dev/null +++ b/v4/Makefile @@ -0,0 +1,105 @@ +# v4/Makefile -- host golden model build. +# +# JUSTIFICATION.md section 5: the host node runs the same mesh-defined +# instruction set as the hardware, so the C99 model is the reference the +# hardware is compared against -- not a host-specific reimplementation. +# There is consequently nothing v4-specific in the architecture here; the +# build is plain hosted C99 and the ISA is defined in DECOMPOSITION.md. +# +# The two builds that matter are the two cell widths. v4/Makefile builds and +# runs the tests at both, because a width-dependent bug that only appears at +# 32 bits is exactly the failure mode the F18's 32-bit cells invite and +# exactly the one a 64-bit-only test run would miss. +# +# C99, warnings fatal. A warning here is a defect in a model whose only job +# is to be trusted. + +CC ?= cc +CSTD := -std=c99 +WARN := -Wall -Wextra -Wpedantic -Werror +OPT ?= -O2 -g +CFLAGS ?= $(CSTD) $(WARN) $(OPT) + +# Anchor everything to this Makefile's directory so the build behaves the same +# whether it is invoked as `make -C v4 test` or `make -f v4/Makefile test` +# from the repository root. Without this the wildcards below silently expand +# to nothing from the root and the build "succeeds" having compiled no tests. +HERE := $(patsubst %/,%,$(dir $(abspath $(lastword $(MAKEFILE_LIST))))) + +SRCS := $(wildcard $(HERE)/src/*.c) +TESTS := $(wildcard $(HERE)/tests/*.c) + +# Cell widths to build and verify. 32 is the F18/Zynq case, 64 the aarch64 +# host case; see DECOMPOSITION.md D-5. +WIDTHS := 32 64 + +BINDIR := $(HERE)/build + +.PHONY: all test sanitize clean $(addprefix test-,$(WIDTHS)) + +all: test + +# A build that finds no tests must fail loudly, not report a vacuous pass. A +# loop over an empty list exits 0 having run nothing, which in CI is +# indistinguishable from a green run -- the worst possible failure mode for a +# test harness, and one this Makefile has already produced once. +ifeq ($(strip $(TESTS)),) +$(error No test sources under $(HERE)/tests -- refusing to report success) +endif + +# One test binary per (width, test source) pair. The cell width is a +# preprocessor parameter rather than a runtime one, so the two widths are +# separate compilations -- which is the point: there is no single code path +# that could paper over a width assumption. +# +# `make test` builds optimised; `make sanitize` builds the same sources under +# AddressSanitizer and UndefinedBehaviorSanitizer at both widths and runs them. +# The optimized run catches logic errors, this one catches the out-of-bounds +# ring index and the width-dependent shift that a logic-only test cannot see. +define TEST_RULE +$(BINDIR)/$(1)-$(notdir $(2)): $(2) $$(SRCS) $$(wildcard $(HERE)/include/v4/*.h) + @mkdir -p $(BINDIR) + $$(CC) $$(CFLAGS) -I$(HERE)/include -DV4_CELL_BITS=$(1) \ + $(2) $$(SRCS) -o $$@ + +$(BINDIR)/san-$(1)-$(notdir $(2)): $(2) $$(SRCS) $$(wildcard $(HERE)/include/v4/*.h) + @mkdir -p $(BINDIR) + $$(CC) $$(CSTD) $$(WARN) -O1 -g -fno-omit-frame-pointer \ + -fsanitize=address,undefined -I$(HERE)/include -DV4_CELL_BITS=$(1) \ + $(2) $$(SRCS) -o $$@ +endef + +# One run target per (width, test) and one prerequisite line per width, so +# adding a test file cannot redefine a recipe and the run cannot skip the +# build. A shell loop over `$^` is avoided deliberately: `$^` is make syntax +# that does not survive the define/eval expansion, and a silently-empty loop +# list is exactly the vacuous-pass failure this file already made once. +define RUN_RULE +run-$(1)-$(notdir $(2)): $(BINDIR)/$(1)-$(notdir $(2)) + @echo " [V4_CELL_BITS=$(1) $$@]" + @$(BINDIR)/$(1)-$(notdir $(2)) + +test-$(1): run-$(1)-$(notdir $(2)) +endef + +# The same sources and the same assertions, under ASan+UBSan. +define SAN_RULE +san-$(1)-$(notdir $(2)): $(BINDIR)/san-$(1)-$(notdir $(2)) + @echo " [ASan+UBSan V4_CELL_BITS=$(1) $$@]" + @$(BINDIR)/san-$(1)-$(notdir $(2)) +endef + +$(foreach w,$(WIDTHS),$(foreach t,$(TESTS),$(eval $(call TEST_RULE,$(w),$(t))))) +$(foreach w,$(WIDTHS),$(foreach t,$(TESTS),$(eval $(call RUN_RULE,$(w),$(t))))) +$(foreach w,$(WIDTHS),$(foreach t,$(TESTS),$(eval $(call SAN_RULE,$(w),$(t))))) + +sanitize: $(foreach w,$(WIDTHS),$(foreach t,$(TESTS),san-$(w)-$(notdir $(t)))) + @echo "all v4 tests passed under ASan+UBSan" + +.PHONY: $(foreach w,$(WIDTHS),$(foreach t,$(TESTS),run-$(w)-$(notdir $(t)) san-$(w)-$(notdir $(t)))) + +test: $(addprefix test-,$(WIDTHS)) + @echo "all v4 tests passed" + +clean: + rm -rf $(BINDIR) diff --git a/v4/README.md b/v4/README.md index d1beb6b1..3b1251dd 100644 --- a/v4/README.md +++ b/v4/README.md @@ -4,6 +4,12 @@ StarForth v4: the 32-instruction F18-derived core. The design lives in `docs/v4.0.0/JUSTIFICATION.md` (why) and `docs/v4.0.0/DECOMPOSITION.md` (every v3 word mapped to a v4 fate). -There is no code yet. The first deliverable is the hosted C99 golden model -(`JUSTIFICATION.md` §10, step 1). It must pass POST and hold K≡1.0 with -32- and 64-bit cells on all three host ISAs. +The first deliverable is the hosted C99 golden model (`JUSTIFICATION.md` §10, +step 1). It must pass POST and hold K≡1.0 with 32- and 64-bit cells on all +three host ISAs. + +What exists so far is the single node: registers, circular stacks, memory, all +32 opcodes, and per-opcode and per-call-target heat. `make -C v4 test` builds +and runs the tests at both cell widths; `make -C v4 sanitize` repeats them +under ASan and UBSan. There is no compiler capsule, no POST and no K +measurement yet. diff --git a/v4/include/v4/asm.h b/v4/include/v4/asm.h new file mode 100644 index 00000000..619cd9d0 --- /dev/null +++ b/v4/include/v4/asm.h @@ -0,0 +1,68 @@ +/* asm.h -- slot packer for hand-assembled test programs. + * + * This is not the compiler capsule (JUSTIFICATION.md section 9). It exists so + * that tests can write a DECOMPOSITION.md definition opcode by opcode and have + * the slots, literals and branch targets laid out the way section 1.2 and + * section 2 require, instead of packing words by hand in every test. + * + * Layout rules it applies: + * + * - Opcodes fill slots 0..5 left to right; a full word is written out and a + * new one started. Unused slots are padded with `nop`. + * - A literal is `@p` in a slot plus its value in the word after the + * instruction word. Several literals in one word follow it in order. + * - `;` and `ex` close the word, since nothing after them executes. + * - A branch closes the word, since the bits to its right are its address. + * If the next free slot is 4 or 5 the word is closed first, because + * branches are legal in slots 0-3 only. + * - A branch target must lie in the same page as P at the time the branch + * executes, for the reach of the slot it landed in. Otherwise the + * assembler sets its error flag rather than emit a branch that goes + * somewhere else. + */ +#ifndef V4_ASM_H +#define V4_ASM_H + +#include "v4/iword.h" +#include "v4/node.h" + +typedef struct { + v4_node *n; + v4_cell here; /* address of the word being built */ + v4_iword cur; + unsigned slot; /* next free slot, 0..V4_SLOT_COUNT */ + v4_cell lit[V4_SLOT_COUNT]; /* literals owed after this word */ + unsigned nlit; + int error; +} v4_asm; + +/* A branch whose target is not known yet. */ +typedef struct { + v4_cell addr; /* the word holding the branch */ + unsigned slot; + v4_cell p; /* P when the branch executes */ +} v4_asm_ref; + +void v4_asm_begin(v4_asm *as, v4_node *n, v4_cell origin); + +/* Any opcode that is neither a branch nor `@p`. */ +void v4_asm_op(v4_asm *as, unsigned op); + +/* `@p` and its value. */ +void v4_asm_lit(v4_asm *as, v4_cell value); + +/* jump, call, next, if, -if to a known address. */ +void v4_asm_branch(v4_asm *as, unsigned op, v4_cell target); + +/* The same with the target supplied later by v4_asm_resolve. */ +v4_asm_ref v4_asm_branch_fwd(v4_asm *as, unsigned op); +void v4_asm_resolve(v4_asm *as, v4_asm_ref ref, v4_cell target); + +/* Close the word being built and return the address of the next one. This is + * how a label is taken: branch targets are word addresses. */ +v4_cell v4_asm_label(v4_asm *as); + +/* 1 if nothing went wrong so far. Closes the word being built. */ +int v4_asm_ok(v4_asm *as); + +#endif /* V4_ASM_H */ diff --git a/v4/include/v4/cell.h b/v4/include/v4/cell.h new file mode 100644 index 00000000..9f5286b2 --- /dev/null +++ b/v4/include/v4/cell.h @@ -0,0 +1,60 @@ +/* cell.h -- v4 cell width as a build parameter. + * + * DECOMPOSITION.md D-5: the host node's cell width matches the host CPU + * (32 on a Zynq-7000 Cortex-A9, 64 on an aarch64 host). JUSTIFICATION.md + * section 5 makes this the second invariance axis: if K==1.0 holds across + * cell widths as well as across ISAs, the conservation law is shown not to + * depend on word size. + * + * The compiler capsule is written width-independent against these types. + * Nothing in v4 may assume a particular V4_CELL_BITS; if you find yourself + * wanting to, the code belongs in the host node, not the mesh. + * + * JUSTIFICATION.md section 5 also fixes the split that matters for the + * physics: heat and K arithmetic stay 64-bit on every host regardless of + * cell width, because they must not lose precision when the cell shrinks. + * That is why this header defines a separate v4_heat_t rather than reusing + * v4_cell. + */ +#ifndef V4_CELL_H +#define V4_CELL_H + +#include + +#ifndef V4_CELL_BITS +#error "V4_CELL_BITS must be defined to 32 or 64 (e.g. -DV4_CELL_BITS=32)." +#endif + +#if V4_CELL_BITS == 32 +typedef int32_t v4_cell; +typedef uint32_t v4_ucell; +#elif V4_CELL_BITS == 64 +typedef int64_t v4_cell; +typedef uint64_t v4_ucell; +#else +#error "V4_CELL_BITS must be 32 or 64." +#endif + +/* Physics/heat arithmetic width. Fixed at 64 by JUSTIFICATION.md section 5: + * "Heat and K arithmetic remain 64-bit (int64_t in C99 on every host; double + * cells on a 32-bit node). Changing only the payload width keeps the + * experiment clean: any difference in K can be attributed to cell width and + * not to lost precision." The C side is therefore always 64-bit; the + * double-cell framing is the 32-bit node's problem, not this type's. */ +typedef int64_t v4_heat_t; +typedef uint64_t v4_uheat_t; + +/* MSB -- the cell-width top-bit constant. + * + * DECOMPOSITION.md section 5.5 (RSHIFT) and section 5.7 (D2/) both call for + * "MSB, the cell-width top-bit constant" but never define it, which leaves a + * bit-width-dependent constant to be invented mid-arithmetic. It is defined + * here once, as a value with exactly the cell's sign bit set and nothing + * else, so that the sign-test idioms in those two words are width-correct by + * construction at 32 and at 64. */ +#define V4_MSB (((v4_ucell)1) << (V4_CELL_BITS - 1)) + +/* All-ones, the width-correct "true". FORTH-79 uses -1 for TRUE. */ +#define V4_ALL_ONES ((v4_cell)-1) + +#endif /* V4_CELL_H */ diff --git a/v4/include/v4/exec.h b/v4/include/v4/exec.h new file mode 100644 index 00000000..e238ab4a --- /dev/null +++ b/v4/include/v4/exec.h @@ -0,0 +1,56 @@ +/* exec.h -- instruction execution for v4. + * + * DECOMPOSITION.md section 1.2: "Slots execute left to right." A branch + * (jump, call, next, if, -if) takes its target from all bits to the right of + * its slot and replaces the same low bits of P (page-relative). Branches are + * legal in slots 0-3 only. Nothing to the right of a branch executes, taken + * or not, because those bits are its address. + * + * Section 1.4: "Every retired instruction increments that opcode's heat counter + * and advances the anti-clock; every `call` increments the heat counter of its + * target. None of this costs an instruction." + * + * The node owns P, A, B, the stacks and memory; heat and the anti-clock are + * separate physics state (section 7 names them as registers). + * + * THREE POINTS THE SPEC LEAVES TO THE F18, and which this model takes from it: + * + * - `ex` ends the word, like `;`. P has been replaced, so the remaining + * slots belong to a word that is no longer the current one. + * - `unext` restarts the *already fetched* word at slot 0. It does not + * refetch and does not move P, so `@p` and `!p` inside a unext loop step + * through the words that follow the loop word. When R reaches 0 the loop + * ends and execution continues with the slot after `unext`. + * - `+*` shifts T arithmetically (sign bit kept). Section 1.3 says only + * "shift T:A right one bit"; D-3 says plain F18 semantics. + * + * A branch opcode in slot 4 or 5 is outside the spec. The model does not trap + * it: it applies the 7- or 2-bit target the layout formula gives. + */ +#ifndef V4_EXEC_H +#define V4_EXEC_H + +#include "v4/heat.h" +#include "v4/iword.h" +#include "v4/node.h" + +typedef struct { + v4_uheat_t anticlock; +} v4_exec_state; + +void v4_exec_reset(v4_exec_state *es); + +/* Execute one instruction word: fetch at P, advance P, run the slots left to + * right until the word ends. A unext loop runs to completion inside one call, + * so the call does not return while R is nonzero at a `unext`. Returns the + * number of instructions retired. */ +unsigned v4_exec_step_word(v4_node *n, v4_exec_state *es, v4_heat *h); + +/* Execute a single opcode. The branch opcodes read their target from `w` and + * `slot`; every other opcode ignores both. `unext` here only updates R; the + * restart is v4_exec_step_word's. A value above 31 does nothing and retires + * nothing. */ +void v4_exec_op(v4_node *n, v4_exec_state *es, v4_heat *h, + unsigned op, v4_iword w, unsigned slot); + +#endif /* V4_EXEC_H */ diff --git a/v4/include/v4/guard.h b/v4/include/v4/guard.h new file mode 100644 index 00000000..9e9b5058 --- /dev/null +++ b/v4/include/v4/guard.h @@ -0,0 +1,92 @@ +/* guard.h -- 5% safety boundaries at each end of every bounded list. + * + * The convention used throughout this project is that a bounded list carries a + * safety boundary at each end rather than trusting its own bounds. The kernel + * arena is the reference instance (kernel/src/vm/arena.c): + * + * #define SK_VM_GUARD_SIZE PMM_PAGE_SIZE + * #define SK_VM_GUARD_PATTERN_HEAD 0x5ac0ffeed0c0ffeeULL + * #define SK_VM_GUARD_PATTERN_TAIL 0x0bad0badf00df00dULL + * + * with a guard_fill / guard_check pair, and total size = payload + 2 * guard. + * Two properties of that instance are kept here deliberately: + * + * - HEAD and TAIL carry *different* patterns, so a check that fails can say + * which end was overrun. A single pattern tells you that something ran + * off the end and nothing about where. + * - the boundary is placed immediately adjacent to the payload, because a + * boundary separated from what it protects catches nothing. + * + * This header supplies the same facility at a size that scales with the list + * (5% at each end) rather than a fixed page, and reduces it to two helpers so + * that no list in v4 has to hand-roll the arithmetic. + * + * WHY THIS IS LOAD-BEARING HERE, NOT DECORATIVE. AddressSanitizer already + * catches a genuine out-of-struct access, so a guard band cannot be justified + * as "catching overflow" -- ASan does that. What ASan does *not* catch is an + * index that is wrong but still lands inside the same object, which is exactly + * the failure mode of a circular buffer driven by unsigned index arithmetic: + * + * head = (head + V4_DATA_RING - 1u) % V4_DATA_RING; correct + * head = (head + V4_DATA_RING - 1u) & (V4_DATA_RING - 1u); correct today + * + * The second line is identical today *only because 8 is a power of two*. It + * is the sort of "simplification" that gets made, it is right for the current + * depths, and it silently breaks the first time a ring size stops being a power + * of two. Both forms stay in range, so ASan stays quiet. A guard band with a + * 5% margin either side is what turns "the tests happened to cover it" into a + * check that fires. The tests in tests/test_stack.c exercise that directly: + * they index past each end on purpose and require the check to catch it. + * + * The boundary is sized with ceiling division and a floor of one element, so a + * short list still gets a real boundary. A 5% margin on a 3-element list + * rounds to 0, and a zero-width guard is not a guard -- it is a comment. + */ +#ifndef V4_GUARD_H +#define V4_GUARD_H + +#include "v4/cell.h" + +/* Fraction of the payload reserved as a boundary at each end. */ +#define V4_GUARD_PCT 5u + +/* Boundary width, in elements, for a payload of n elements: 5% rounded up, + * never less than one. Written as a macro so that a struct can size its own + * inline boundary at compile time -- the boundary has to be storage the object + * owns, not something a helper allocates later, because a mesh node has no + * heap to allocate it from. + * + * n = 8 -> 1 (5% = 0.4, rounds up) + * n = 32 -> 2 (5% = 1.6, rounds up) + * n = 100 -> 5 + * n = 1000 -> 50 + * n = 3 -> 1 (5% = 0.15, rounds up to 1 -- not 0) + */ +#define V4_GUARD_ELEMS(n) \ + (((n) * V4_GUARD_PCT + 99u) / 100u) + +/* The kernel arena's patterns, carried over so that a hex dump from a mesh + * node and one from the kernel can be read with the same key. Casting to + * v4_ucell truncates cleanly at 32-bit cells: the arena's own constants are + * 64-bit, and their low halves are as distinct as the full words -- + * 0xd0c0ffee against 0xf00df00d -- so "which end" stays answerable at both + * widths. */ +#define V4_GUARD_PATTERN_HEAD ((v4_ucell)0x5ac0ffeed0c0ffeeULL) +#define V4_GUARD_PATTERN_TAIL ((v4_ucell)0x0bad0badf00df00dULL) + +/* If these ever compare equal the boundary has stopped saying which end was + * overrun, which is half its purpose. C99 has no _Static_assert. */ +typedef char v4_guard_patterns_are_distinct + [(V4_GUARD_PATTERN_HEAD != V4_GUARD_PATTERN_TAIL) ? 1 : -1]; + +/* Write one boundary band. `band` is the start of the band, `n` its width in + * elements. */ +void v4_guard_fill(v4_cell *band, unsigned n, v4_ucell pattern); + +/* 1 if the whole band still holds `pattern`, else 0. Checks every element, not + * just the ends: the band is 5% wide precisely so there is something to check + * in it, and a single word is what the kernel arena can afford at page + * granularity. */ +int v4_guard_intact(const v4_cell *band, unsigned n, v4_ucell pattern); + +#endif /* V4_GUARD_H */ diff --git a/v4/include/v4/heat.h b/v4/include/v4/heat.h new file mode 100644 index 00000000..96d8832a --- /dev/null +++ b/v4/include/v4/heat.h @@ -0,0 +1,79 @@ +/* heat.h -- heat and anti-clock, not instructions themselves (1.4). + * + * DECOMPOSITION.md section 1.4 states: "Execution itself drives the physics. + * Every retired instruction increments that opcode's heat counter and advances + * the anti-clock; every `call` increments the heat counter of its target. None + * of this costs an instruction." + * + * D-6 is deferred to step 2, but the note immediately adds: "The golden model + * implements per-opcode and per-call-target heat in the meantime." The + * counters here are therefore a two-dimensional heat structure (op × target) + * on a per-call basis, with counts stored in 64-bit (because heat is + * accumulated and must not roll over at 32-bit). The "per-call-target" + * counter is indexed by the address of the called target -- on a word-addressed + * node, that is a cell value equal to the address `a` passed to `call a`. + * + * The anti-clock is a virtual tick driven by execution -- one tick per retired + * instruction -- and the rest of §7 refers to it via `ANTICLOCK`. It is not a + * wall-clock time, it is a function of the execution stream, as specified. + * + * The MM names in §7: `HEAT-OP[0..31]` (R), `HEAT-CALL[...]` (R/W) with a + * freeze bit (D-6). D-4 (memory map) is deferred, so the model does not + * materialize those MM addresses yet. This header defines the backing storage + * that a later MM layer will expose; it keeps the counts separate from the node + * itself because heat is physics data, not the instruction word stream, and it + * needs to be accessible to assertions such as K conservation tests later. + * + * Counts are 64-bit. Even for a short run a call-heavy word can heat up many + * times, and the golden model must run POST and remain monotonic and + * comparable. They are stored as `v4_uheat_t` (which is uint64_t by cell-width + * parameterisation) rather than cell-sized so that a 32-bit node's heat is not + * width-truncated in the model. (JUSTIFICATION.md §5 keeps heat arithmetic + * 64-bit regardless of cell width.) + */ +#ifndef V4_HEAT_H +#define V4_HEAT_H + +#include "v4/cell.h" +#include "v4/opcode.h" + +#define V4_HEAT_MAX_CALL_TARGETS 4096u + +typedef struct { + v4_uheat_t op[V4_OPCODE_COUNT]; /* HEAT-OP[0..31] */ + + /* Per-call-target heat. Indexed by target address. The table is fixed-size + * for the golden model; the actual hardware table size is deferred with D-6, + * but "in the meantime" the model must have a per-call-target structure. + * 4096 entries is small (32KB if using 64-bit per entry), enough to cover a + * typical test program's call targets without needing to allocate on-the-fly + * -- and since the node has boundaries, over-indexing is caught. */ + v4_uheat_t call[V4_HEAT_MAX_CALL_TARGETS]; + v4_ucell call_freeze_mask[V4_HEAT_MAX_CALL_TARGETS / (sizeof(v4_ucell) * 8u)]; + /* freeze bits: one per call-target entry (D-6). Stored as a bitmask. */ +} v4_heat; + +void v4_heat_reset(v4_heat *h); + +/* Every retired instruction: +1 to the opcode's heat and +1 to ANTICLOCK. */ +void v4_heat_on_retire(v4_heat *h, unsigned op, v4_uheat_t *anticlock); + +/* Every call: +1 to the call-target's heat. The target is the address passed + * to call (word address). If the target is outside the table range, the model + * must not silently wrap -- a boundary-style check is the conservative choice + * here, because the table size is a model parameter. */ +void v4_heat_on_call(v4_heat *h, v4_cell target); + +/* Read/write helpers for per-call-target heat (R/W). Freeze bits are set per + * target when D-6's freeze bit is asserted; writes to a frozen target should be + * ignored in a real implementation, but the MM layer is not defined yet. The + * golden model stores freeze bits and the accessor can enforce them later. */ +v4_uheat_t v4_heat_call_get(const v4_heat *h, v4_cell target); +int v4_heat_call_set(v4_heat *h, v4_cell target, v4_uheat_t val); + +/* Freeze control (D-6). */ +void v4_heat_call_freeze(v4_heat *h, v4_cell target); +void v4_heat_call_unfreeze(v4_heat *h, v4_cell target); +int v4_heat_call_is_frozen(const v4_heat *h, v4_cell target); + +#endif /* V4_HEAT_H */ diff --git a/v4/include/v4/iword.h b/v4/include/v4/iword.h new file mode 100644 index 00000000..cf75b7b1 --- /dev/null +++ b/v4/include/v4/iword.h @@ -0,0 +1,101 @@ +/* iword.h -- the 32-bit instruction word and its decode. + * + * DECOMPOSITION.md section 1.2: + * + * 31 27 26 22 21 17 16 12 11 7 6 2 1 0 + * +--------+--------+--------+--------+--------+--------+----+ + * | slot 0 | slot 1 | slot 2 | slot 3 | slot 4 | slot 5 | xx | + * +--------+--------+--------+--------+--------+--------+----+ + * + * "Slots execute left to right. A branch (jump, call, next, if, -if) takes + * its target from all bits to the right of its slot, and that target replaces + * the same low bits of P (page-relative, as in the F18). Branches are + * therefore legal in slots 0-3 only", with reach 27 / 22 / 17 / 12 bits. + * + * That reach column is not a separate rule, it falls out of the layout: slot k + * sits at bits [31-5k : 27-5k], so the bits to its right are [26-5k : 0], + * which is 27-5k bits -- 27, 22, 17, 12 for slots 0..3. This header derives + * the masks from that one formula rather than hard-coding four of them, so the + * decode cannot drift from the reach table. + * + * THE SPARE BITS ARE ADDRESS BITS. "Spare" means only that they are never + * *executed*: they are below every slot, so "all bits to the right of its + * slot" includes them, and they are the low bits of the address of a branch in + * any slot. They are inert for opcode decode and live in a branch target. + * This is easy to assume otherwise and get wrong -- an earlier revision of + * this header subtracted them from the branch width, which silently cost two + * address bits off every branch and was caught by tests/test_iword.c. They + * exist because 6*5 = 30 does not fill a 32-bit word, and on the F18 those low + * bits are simply the bottom of the address space. + * + * The consequence for the compiler is worth stating: a non-branch slot's low + * bits are free to carry a compressed argument, but a branch slot's are not, + * because they are address. + * + * NOTE ON WIDTH. The word format is 32 bits regardless of V4_CELL_BITS: the + * diagram is 32 bits wide and 6*5+2 = 32 exactly. D-5 makes the *cell* width + * a build parameter, but the instruction word is not a payload and does not + * follow the cell. At 32-bit cells a word is a cell. At 64-bit cells it is + * the low 32 bits of the cell and the high half is ignored (D-9), so compiled + * code is identical at both widths. The decode below operates on a distinct + * 32-bit type; the fetch in exec.c does the narrowing. + */ +#ifndef V4_IWORD_H +#define V4_IWORD_H + +#include + +#include "v4/cell.h" +#include "v4/opcode.h" + +/* The instruction word is 32 bits at every cell width. */ +typedef uint32_t v4_iword; + +#define V4_SLOT_COUNT 6u /* six 5-bit slots, DECOMPOSITION.md 1.1 */ +#define V4_SPARE_BITS 2u /* "plus 2 spare bits" */ + +/* C99 has no _Static_assert, so the "6*5+2 == 32" identity is enforced with + * the negative-array-size idiom. If the slot count, the spare-bit count or the + * word width ever stop adding up to 32, this fails to compile. */ +typedef char v4_iword_layout_is_exact + [((V4_SLOT_COUNT * 5u + V4_SPARE_BITS) == 32u) ? 1 : -1]; + +/* Bit range of slot k: high bit 31-5k, low bit 27-5k. */ +#define V4_SLOT_HIGH_BIT(k) (31u - 5u * (k)) +#define V4_SLOT_LOW_BIT(k) (27u - 5u * (k)) + +/* Number of address bits a branch in slot k carries: all bits to the right of + * the slot. Slot k's low bit is 27-5k, so the bits below it are 0..(26-5k), + * which is 27-5k bits -- equal to the slot's own low bit. This is the single + * source of the reach column, and it is why the spare bits are *not* subtracted + * here: see the note on the spare bits below. */ +#define V4_BRANCH_ADDR_BITS(k) (V4_SLOT_LOW_BIT(k)) + +/* Mask of the low address bits a branch in slot k replaces in P. */ +uint32_t v4_iword_slot_mask(unsigned slot); + +/* The 5-bit opcode in slot k, 0..31. */ +unsigned v4_iword_op(v4_iword w, unsigned slot); + +/* The 2 spare low bits. Never executed. */ +unsigned v4_iword_spare(v4_iword w); + +/* The branch target carried by a branch in slot k: all bits to the right of + * the slot, zero-extended. Meaningful only for the five branch opcodes. */ +v4_iword v4_iword_target(v4_iword w, unsigned slot); + +/* Assemble a word from six 5-bit opcodes and the 2 spare bits. Opcode values + * above 31 or spare bits above 3 are rejected, because a golden model must not + * paper over an out-of-range encoding. */ +v4_iword v4_iword_assemble(const unsigned op[V4_SLOT_COUNT], unsigned spare); + +/* Apply a branch: replace the low V4_BRANCH_ADDR_BITS(slot) bits of P with the + * target, preserving the bits above (page-relative, F18-style). */ +v4_cell v4_iword_branch(v4_cell p, v4_iword w, unsigned slot); + +/* Branches are legal in slots 0-3 only (section 1.2). Slots 4 and 5 have 7 and + * 2 address bits respectively, which is not a useful reach and is not + * sanctioned by the table. */ +int v4_iword_branch_legal(unsigned slot); + +#endif /* V4_IWORD_H */ diff --git a/v4/include/v4/node.h b/v4/include/v4/node.h new file mode 100644 index 00000000..f794c30d --- /dev/null +++ b/v4/include/v4/node.h @@ -0,0 +1,114 @@ +/* node.h -- the v4 node: registers, stacks, and word-addressed memory. + * + * DECOMPOSITION.md section 1.1: + * + * | Cell | 32 bits (mesh node). Host node's width is a build + * | parameter; see D-5. | + * | Addressing | Word-addressed (D-1). | + * | Registers | T (top of data stack), S (second), R (top of return + * | stack), P (program counter), A and B (address + * | registers). | + * | Stacks | F18 circular hardware stacks, not visible to code + * | (D-2) ... data stack 10 deep, return stack 9 deep. | + * | Instruction | Six 5-bit slots, plus 2 spare bits. | + * + * T, S and R are not fields here: they live inside v4_dstack and v4_rstack, + * because on the F18 they are the topmost slots of the circular stacks rather + * than registers that happen to shadow them, and the golden model has to model + * the mechanism and not just the values. P, A and B are genuinely separate + * registers and live here. + * + * MEMORY SIZE IS A BUILD PARAMETER, not a constant of the design. + * JUSTIFICATION.md section 10 names cell width, node count and node memory as + * the three parameters of the golden model, and no word count is fixed anywhere + * in DECOMPOSITION.md -- D-4, which is where a node memory map would be pinned + * down, is deferred to step 2. The default here is a round number that suits + * a host; the datapoint worth knowing is JUSTIFICATION.md section 4, that a + * GA144 node had 64 words of RAM and 64 of ROM. v4 keeps the same split -- + * dictionary and interpreter live in the compiler capsule on the host and are + * streamed to nodes, so node memory is not sized by capsule size. + */ +#ifndef V4_NODE_H +#define V4_NODE_H + +#include "v4/cell.h" +#include "v4/guard.h" +#include "v4/stack.h" + +/* Words of node memory. Overridable at build time. */ +#ifndef V4_NODE_WORDS +#define V4_NODE_WORDS 1024u +#endif + +/* 5% safety boundary at each end of node memory, per guard.h. Note the + * arithmetic: at 1024 words that is 52 words either side, 5.2% of memory + * spent on a boundary. That is the cost of the convention on a resource that + * is scarce by construction, and it is worth naming rather than discovering + * later -- on a real mesh node the memory is 32-bit words on silicon with no + * second chance. A deployment that cannot afford it sets V4_GUARD_PCT to 0 at + * build time, which is why the percentage is a macro and not baked in. */ +#define V4_MEM_BOUND V4_GUARD_ELEMS(V4_NODE_WORDS) + +typedef struct { + v4_cell p; /* P -- program counter */ + v4_cell a; /* A -- address register */ + v4_cell b; /* B -- address register */ + + v4_dstack ds; /* holds T and S */ + v4_rstack rs; /* holds R */ + + v4_cell mem_guard_head[V4_MEM_BOUND]; + v4_cell mem[V4_NODE_WORDS]; + v4_cell mem_guard_tail[V4_MEM_BOUND]; +} v4_node; + +/* Zero P, A and B, empty the stacks, and clear memory. Installs every + * boundary (memory and both stacks) and leaves the node in a defined state. */ +void v4_node_reset(v4_node *n); + +/* 1 if every boundary in the node is intact -- memory and both stacks -- else + * 0. This is the single call a caller needs to detect that an index went + * wrong somewhere; see guard.h for what it catches that AddressSanitizer + * cannot. */ +int v4_node_guards_intact(const v4_node *n); + +/* Read and write one word. D-1: word-addressed, so `addr` counts words and + * CELLS is a no-op. `addr` is a v4_cell because A, B and P are all v4_cells + * and a narrower parameter would put a conversion between the register and the + * access on every one of the eight memory opcodes. + * + * PRECONDITION: 0 <= addr < V4_NODE_WORDS. + * + * Out-of-range addressing is not defined by DECOMPOSITION.md. D-1 fixes word + * addressing and says nothing about an address outside the node's memory; a + * F18 has no such case because its address space is the memory. Whether a + * conforming model should wrap, saturate, or fault is a real open question and + * is raised as a gap rather than decided here, because each answer changes the + * ISA's observable behaviour and inventing one silently would bake a guess into + * every later test. + * + * WHAT THE BOUNDARY HERE DOES AND DOES NOT COVER, since it is easy to + * overclaim and the distinction decides whether out-of-range addresses are + * actually protected: + * + * - It DOES cover a linear index error. An access to mem[-1] or + * mem[V4_NODE_WORDS] lands in the 5% band, because the band is immediately + * adjacent (tests/test_node.c asserts the adjacency with offsetof rather + * than assuming it). That access is inside the struct, so AddressSanitizer + * stays silent about it and v4_node_guards_intact() is what reports it. + * + * - It does NOT cover an out-of-range *word address*. A v4_cell address of + * -1 casts to unsigned 0xFFFFFFFF, which is 16 GB past mem at 32-bit cells + * -- far outside the struct and outside the band. So a P, A or B that runs + * off the end of memory is caught by neither the band nor, in a production + * build without sanitizers, by anything else here. It is a precondition + * violation and the range check that would catch it is the open question + * above, not the band. + * + * The band is worth its 10.2% for the first case regardless. The second case + * is a hole, and it is closed by ruling on out-of-range addressing, not by + * widening the band. */ +v4_cell v4_node_load(const v4_node *n, v4_cell addr); +void v4_node_store(v4_node *n, v4_cell addr, v4_cell value); + +#endif /* V4_NODE_H */ diff --git a/v4/include/v4/opcode.h b/v4/include/v4/opcode.h new file mode 100644 index 00000000..cbe67810 --- /dev/null +++ b/v4/include/v4/opcode.h @@ -0,0 +1,64 @@ +/* opcode.h -- the 32 core opcodes. + * + * DECOMPOSITION.md section 1.3. "Opcode numbering follows the F18. Two names + * differ from Moore's: F18 `-` is renamed `inv` and F18 `or` (which is + * exclusive-or) is renamed `xor`, so instruction names never collide with + * FORTH-79 word names." + * + * Those two renames are load-bearing, not cosmetic: FORTH-79 has words named + * `-` and `OR`, and the DECOMPOSITION table would otherwise have two distinct + * meanings per name. The renames are therefore asserted against the FORTH + * name set in tests/test_iword.c, so a future edit that reintroduces a + * collision fails a test rather than silently producing an ambiguous table. + * + * Branch opcodes are marked because the instruction-word format depends on + * them: only these five take a target out of the low bits of their slot, and + * only they are legal outside the low four slots (section 1.2). + */ +#ifndef V4_OPCODE_H +#define V4_OPCODE_H + +typedef enum { + V4_OP_SEMI = 0x00, /* ; return */ + V4_OP_EX = 0x01, /* ex swap P and R */ + V4_OP_JUMP = 0x02, /* jump a */ + V4_OP_CALL = 0x03, /* call a */ + V4_OP_UNEXT = 0x04, /* unext */ + V4_OP_NEXT = 0x05, /* next a */ + V4_OP_IF = 0x06, /* if a */ + V4_OP_MINUS_IF = 0x07, /* -if a */ + V4_OP_FETCH_P = 0x08, /* @p literal */ + V4_OP_FETCH_INC= 0x09, /* @+ */ + V4_OP_FETCH_B = 0x0A, /* @b */ + V4_OP_FETCH_A = 0x0B, /* @ */ + V4_OP_STORE_P = 0x0C, /* !p */ + V4_OP_STORE_INC= 0x0D, /* !+ */ + V4_OP_STORE_B = 0x0E, /* !b */ + V4_OP_STORE_A = 0x0F, /* ! */ + V4_OP_MUL_STEP = 0x10, /* +* multiply step, D-3 */ + V4_OP_TWO_STAR = 0x11, /* 2* */ + V4_OP_TWO_SLASH= 0x12, /* 2/ */ + V4_OP_INV = 0x13, /* inv (F18 `-`) */ + V4_OP_ADD = 0x14, /* + */ + V4_OP_AND = 0x15, /* and */ + V4_OP_XOR = 0x16, /* xor (F18 `or`) */ + V4_OP_DROP = 0x17, /* drop */ + V4_OP_DUP = 0x18, /* dup */ + V4_OP_RPOP = 0x19, /* pop R to data stack */ + V4_OP_OVER = 0x1A, /* over */ + V4_OP_PUSH_A = 0x1B, /* a */ + V4_OP_NOP = 0x1C, /* nop */ + V4_OP_PUSH = 0x1D, /* push T to return stack */ + V4_OP_BANG_B = 0x1E, /* b! B <- T */ + V4_OP_BANG_A = 0x1F, /* a! A <- T */ + + V4_OPCODE_COUNT = 0x20 +} v4_opcode; + +/* True for the five opcodes that take a branch target from the low bits of + * their slot: jump, call, next, if, -if. Everything else ignores the low + * bits of its slot, which is what makes a non-branch slot's low bits + * free for the compiler to use as a compressed argument. */ +int v4_op_is_branch(unsigned op); + +#endif /* V4_OPCODE_H */ diff --git a/v4/include/v4/stack.h b/v4/include/v4/stack.h new file mode 100644 index 00000000..556e7143 --- /dev/null +++ b/v4/include/v4/stack.h @@ -0,0 +1,89 @@ +/* stack.h -- F18 circular hardware stacks (DECOMPOSITION.md D-2). + * + * D-2 rules these explicitly: "F18 circular stacks, hidden. Data stack 10 + * deep (T, S + 8 circular), return stack 9 deep (R + 8 circular), exactly as + * the F18. No stack pointer is visible to code, so DEPTH, PICK, ROLL, .S, + * SP@ and SP! are retired everywhere, host node included." + * + * Two consequences that the ISA and the capsule code must both respect: + * + * 1. There is no overflow or underflow detection, and there never will be. + * Pushing past the bottom silently overwrites the oldest entry. This is + * hardware behaviour, reproduced faithfully here rather than defended + * against: a golden model that trapped on overflow would diverge from + * the thing it is a model of, which is the whole point of the exercise. + * + * 2. Nesting is therefore shallow (10 and 9), and exceeding either depth + * corrupts silently rather than faulting. DECOMPOSITION.md section 3 + * calls this out as the constraint that "every CAP definition in section + * 4 and 5 must be re-checked against ... before it is accepted as a POST + * target; the hand traces so far assumed unbounded stacks." + * + * The T/S + 8-ring decomposition is the hardware shape, not an optimisation: + * T and S are architectural registers (section 1.1 lists them), and the ring + * is the circular part behind them. It is provably equivalent to a flat + * 10-deep circular buffer, which is what tests/test_stack.c checks it + * against -- see the equivalence argument in stack.c. + */ +#ifndef V4_STACK_H +#define V4_STACK_H + +#include "v4/cell.h" +#include "v4/guard.h" + +/* D-2: data stack is T, S + 8 circular = 10 deep. */ +#define V4_DATA_RING 8 +#define V4_DATA_DEPTH (V4_DATA_RING + 2) + +/* D-2: return stack is R + 8 circular = 9 deep. */ +#define V4_RET_RING 8 +#define V4_RET_DEPTH (V4_RET_RING + 1) + +/* 5% safety boundary at each end of each ring, per guard.h. The bands sit + * immediately either side of `ring` -- a boundary separated from the payload + * by another field catches nothing -- and are storage the struct owns, because + * a mesh node has no heap. Widths are 1 element each at the current ring + * sizes; V4_GUARD_ELEMS scales them if a ring size ever changes. */ +#define V4_DATA_BOUND V4_GUARD_ELEMS(V4_DATA_RING) +#define V4_RET_BOUND V4_GUARD_ELEMS(V4_RET_RING) + +typedef struct { + v4_cell t; /* T -- top of data stack (a register) */ + v4_cell s; /* S -- second (a register) */ + unsigned head; + + v4_cell guard_head[V4_DATA_BOUND]; + v4_cell ring[V4_DATA_RING]; + v4_cell guard_tail[V4_DATA_BOUND]; +} v4_dstack; + +typedef struct { + v4_cell r; /* R -- top of return stack (a register) */ + unsigned head; + + v4_cell guard_head[V4_RET_BOUND]; + v4_cell ring[V4_RET_RING]; + v4_cell guard_tail[V4_RET_BOUND]; +} v4_rstack; + +void v4_dstack_reset(v4_dstack *st); +void v4_dstack_push(v4_dstack *st, v4_cell x); +v4_cell v4_dstack_pop(v4_dstack *st); + +/* Read the top without disturbing the stack. T is a register on hardware, so + * this is a plain read and needs no ring access. */ +v4_cell v4_dstack_peek(const v4_dstack *st); +/* Read the second element without disturbing the stack. */ +v4_cell v4_dstack_peek2(const v4_dstack *st); + +void v4_rstack_reset(v4_rstack *st); +void v4_rstack_push(v4_rstack *st, v4_cell x); +v4_cell v4_rstack_pop(v4_rstack *st); +v4_cell v4_rstack_peek(const v4_rstack *st); + +/* 1 if both boundaries of the data stack are intact, else 0. See guard.h for + * what this catches that AddressSanitizer does not. */ +int v4_dstack_guards_intact(const v4_dstack *st); +int v4_rstack_guards_intact(const v4_rstack *st); + +#endif /* V4_STACK_H */ diff --git a/v4/include/v4/testcode.h b/v4/include/v4/testcode.h new file mode 100644 index 00000000..1a94a330 --- /dev/null +++ b/v4/include/v4/testcode.h @@ -0,0 +1,19 @@ +/* testcode.h -- run a word on a node, for tests. */ +#ifndef V4_TESTCODE_H +#define V4_TESTCODE_H + +#include "v4/exec.h" + +/* Where a word called by v4_test_call returns to. Nothing is executed there: + * arriving is the stop condition. */ +#define V4_TEST_HALT ((v4_cell)(V4_NODE_WORDS - 1u)) + +/* Call the word at `entry` as a caller would: push a return address, set P, + * and step instruction words until the word returns. The stacks and A, B are + * left as the caller set them, so arguments go on the data stack first. + * Returns the number of instruction words stepped, or -1 if the word had not + * returned after `max_words`. */ +long v4_test_call(v4_node *n, v4_exec_state *es, v4_heat *h, + v4_cell entry, long max_words); + +#endif /* V4_TESTCODE_H */ diff --git a/v4/include/v4/umul.h b/v4/include/v4/umul.h new file mode 100644 index 00000000..38d8f5f0 --- /dev/null +++ b/v4/include/v4/umul.h @@ -0,0 +1,31 @@ +/* umul.h -- unsigned multiply fixing UM* under D-3 constraints. + * + * DECOMPOSITION.md line 205-207: "NEEDS REVISION: written for the carry-keeping + * +* that D-3 rejected. With plain F18 +* the carry out of T is lost, so this + * is only correct when the partial sums never overflow T (operands below 2^31). + * A full-range UM* needs a correction step; to be rewritten and proven on the + * golden model." + * + * D-3 states: "Plain F18 semantics. The carry out of T is not kept." + * The +* defined in the F18 shifts T:A right; the add is T <- T+S when bit 0 + * of A was set, but any carry out of that addition is discarded (not shifted + * into the high part). That means UM* as written only works for inputs whose + * partial products don't generate a carry beyond T's width during the loop. + * + * We need a correct full-range unsigned multiply (u1*u2 -> ulo, uhi) that is + * correct for all cell-width values of u1,u2, expressed in terms of the v4 + * primitives or at least specified precisely for the golden model. Since + * we're building the golden model in C first, the canonical implementation is + * the width-correct C multiplication split into high/low halves at V4_CELL_BITS. + * This header provides both: a reference C implementation (for verification) + * and a documented form that matches D-3's +* constraint. + */ +#ifndef V4_UMUL_H +#define V4_UMUL_H + +#include "v4/cell.h" + +/* Unsigned multiply: (u1, u2) -> (ulo, uhi). Full range, width-correct. */ +void v4_umul(v4_ucell u1, v4_ucell u2, v4_ucell *ulo, v4_ucell *uhi); + +#endif /* V4_UMUL_H */ diff --git a/v4/src/asm.c b/v4/src/asm.c new file mode 100644 index 00000000..0a2c7378 --- /dev/null +++ b/v4/src/asm.c @@ -0,0 +1,115 @@ +/* asm.c -- slot packer for test programs. See asm.h. */ +#include "v4/asm.h" + +static void put(v4_asm *as, unsigned op) +{ + as->cur |= (v4_iword)(op & 0x1Fu) << V4_SLOT_LOW_BIT(as->slot); + as->slot++; +} + +static void emit(v4_asm *as, v4_cell value) +{ + if (as->here < 0 || (v4_ucell)as->here >= V4_NODE_WORDS) { + as->error = 1; + return; + } + v4_node_store(as->n, as->here, value); + as->here++; +} + +/* Write out the word being built, then the literals it owes. */ +static void flush(v4_asm *as) +{ + if (as->slot == 0) return; + while (as->slot < V4_SLOT_COUNT) put(as, V4_OP_NOP); + emit(as, (v4_cell)as->cur); + for (unsigned i = 0; i < as->nlit; i++) emit(as, as->lit[i]); + as->cur = 0; + as->slot = 0; + as->nlit = 0; +} + +/* 1 if a branch in `slot`, executing with P = p, can reach `target`. */ +static int reachable(v4_cell p, unsigned slot, v4_cell target) +{ + v4_ucell mask = (v4_ucell)v4_iword_slot_mask(slot); + return (((v4_ucell)p ^ (v4_ucell)target) & ~mask) == 0; +} + +void v4_asm_begin(v4_asm *as, v4_node *n, v4_cell origin) +{ + as->n = n; + as->here = origin; + as->cur = 0; + as->slot = 0; + as->nlit = 0; + as->error = 0; +} + +void v4_asm_op(v4_asm *as, unsigned op) +{ + if (op >= V4_OPCODE_COUNT || v4_op_is_branch(op) || op == V4_OP_FETCH_P) { + as->error = 1; + return; + } + put(as, op); + if (op == V4_OP_SEMI || op == V4_OP_EX || as->slot == V4_SLOT_COUNT) flush(as); +} + +void v4_asm_lit(v4_asm *as, v4_cell value) +{ + put(as, V4_OP_FETCH_P); + as->lit[as->nlit++] = value; + if (as->slot == V4_SLOT_COUNT) flush(as); +} + +v4_asm_ref v4_asm_branch_fwd(v4_asm *as, unsigned op) +{ + v4_asm_ref ref; + + if (!v4_op_is_branch(op)) as->error = 1; + if (!v4_iword_branch_legal(as->slot)) flush(as); + + ref.addr = as->here; + ref.slot = as->slot; + /* The word has been fetched and every literal before the branch consumed + * by the time the branch executes. */ + ref.p = as->here + 1 + (v4_cell)as->nlit; + + put(as, op); + as->slot = V4_SLOT_COUNT; /* the rest of the word is address */ + flush(as); + return ref; +} + +void v4_asm_resolve(v4_asm *as, v4_asm_ref ref, v4_cell target) +{ + v4_ucell mask = (v4_ucell)v4_iword_slot_mask(ref.slot); + v4_ucell word; + + if (as->error) return; + if (!reachable(ref.p, ref.slot, target)) { + as->error = 1; + return; + } + word = (v4_ucell)v4_node_load(as->n, ref.addr); + word = (word & ~mask) | ((v4_ucell)target & mask); + v4_node_store(as->n, ref.addr, (v4_cell)word); +} + +void v4_asm_branch(v4_asm *as, unsigned op, v4_cell target) +{ + v4_asm_resolve(as, v4_asm_branch_fwd(as, op), target); +} + +v4_cell v4_asm_label(v4_asm *as) +{ + flush(as); + return as->here; +} + +int v4_asm_ok(v4_asm *as) +{ + flush(as); + return !as->error; +} diff --git a/v4/src/exec.c b/v4/src/exec.c new file mode 100644 index 00000000..8c634d50 --- /dev/null +++ b/v4/src/exec.c @@ -0,0 +1,209 @@ +/* exec.c -- instruction execution. See exec.h. + * + * All cell arithmetic is done in v4_ucell and converted back. Signed overflow + * is undefined behaviour in C99 and a right shift of a negative value is + * implementation-defined, and a golden model cannot have either: the hardware + * wraps, so the model wraps, on every host and at every optimisation level. + */ +#include "v4/exec.h" + +static v4_cell add_wrap(v4_cell x, v4_cell y) +{ + return (v4_cell)((v4_ucell)x + (v4_ucell)y); +} + +/* Arithmetic shift right by one: the sign bit is kept. */ +static v4_cell asr1(v4_cell x) +{ + v4_ucell u = (v4_ucell)x; + return (v4_cell)((u >> 1) | (u & V4_MSB)); +} + +/* An instruction word occupies the low 32 bits of a cell at every cell width + * (DECOMPOSITION.md D-9). */ +static v4_iword fetch_iword(const v4_node *n, v4_cell addr) +{ + return (v4_iword)((v4_ucell)v4_node_load(n, addr) & 0xFFFFFFFFu); +} + +/* Opcodes after which no further slot of the word executes. The five branch + * opcodes end it because everything to their right is address, taken or not. + * `;` and `ex` end it because P has been replaced, as on the F18. `unext` is + * not in this set: when its loop finishes it falls through to the next slot. */ +static int ends_word(unsigned op) +{ + return v4_op_is_branch(op) || op == V4_OP_SEMI || op == V4_OP_EX; +} + +void v4_exec_reset(v4_exec_state *es) +{ + es->anticlock = 0; +} + +void v4_exec_op(v4_node *n, v4_exec_state *es, v4_heat *h, + unsigned op, v4_iword w, unsigned slot) +{ + v4_dstack *ds = &n->ds; + v4_rstack *rs = &n->rs; + v4_cell x; + + switch (op) { + case V4_OP_SEMI: + n->p = v4_rstack_pop(rs); + break; + case V4_OP_EX: + x = rs->r; + rs->r = n->p; + n->p = x; + break; + case V4_OP_JUMP: + n->p = v4_iword_branch(n->p, w, slot); + break; + case V4_OP_CALL: + x = v4_iword_branch(n->p, w, slot); + v4_rstack_push(rs, n->p); + v4_heat_on_call(h, x); + n->p = x; + break; + case V4_OP_UNEXT: + /* The restart at slot 0 is v4_exec_step_word's business; this is only + * the effect on R. */ + if (rs->r != 0) rs->r = add_wrap(rs->r, -1); + else (void)v4_rstack_pop(rs); + break; + case V4_OP_NEXT: + if (rs->r != 0) { + rs->r = add_wrap(rs->r, -1); + n->p = v4_iword_branch(n->p, w, slot); + } else { + (void)v4_rstack_pop(rs); + } + break; + case V4_OP_IF: /* does not pop T */ + if (ds->t == 0) n->p = v4_iword_branch(n->p, w, slot); + break; + case V4_OP_MINUS_IF: /* does not pop T */ + if (((v4_ucell)ds->t & V4_MSB) == 0) n->p = v4_iword_branch(n->p, w, slot); + break; + + case V4_OP_FETCH_P: + v4_dstack_push(ds, v4_node_load(n, n->p)); + n->p = add_wrap(n->p, 1); + break; + case V4_OP_FETCH_INC: + v4_dstack_push(ds, v4_node_load(n, n->a)); + n->a = add_wrap(n->a, 1); + break; + case V4_OP_FETCH_B: + v4_dstack_push(ds, v4_node_load(n, n->b)); + break; + case V4_OP_FETCH_A: + v4_dstack_push(ds, v4_node_load(n, n->a)); + break; + case V4_OP_STORE_P: + v4_node_store(n, n->p, v4_dstack_pop(ds)); + n->p = add_wrap(n->p, 1); + break; + case V4_OP_STORE_INC: + v4_node_store(n, n->a, v4_dstack_pop(ds)); + n->a = add_wrap(n->a, 1); + break; + case V4_OP_STORE_B: + v4_node_store(n, n->b, v4_dstack_pop(ds)); + break; + case V4_OP_STORE_A: + v4_node_store(n, n->a, v4_dstack_pop(ds)); + break; + + case V4_OP_MUL_STEP: + /* D-3, plain F18: the carry out of T+S is not kept. T:A then shifts + * right one bit, T keeping its sign bit and T's bit 0 entering the top + * of A. S is not consumed. */ + x = ds->t; + if ((v4_ucell)n->a & 1u) x = add_wrap(x, ds->s); + n->a = (v4_cell)(((v4_ucell)n->a >> 1) + | (((v4_ucell)x & 1u) << (V4_CELL_BITS - 1))); + ds->t = asr1(x); + break; + case V4_OP_TWO_STAR: + ds->t = (v4_cell)((v4_ucell)ds->t << 1); + break; + case V4_OP_TWO_SLASH: + ds->t = asr1(ds->t); + break; + case V4_OP_INV: + ds->t = (v4_cell)~(v4_ucell)ds->t; + break; + case V4_OP_ADD: + x = v4_dstack_pop(ds); /* old T; T is now old S */ + ds->t = add_wrap(ds->t, x); + break; + case V4_OP_AND: + x = v4_dstack_pop(ds); + ds->t = (v4_cell)((v4_ucell)ds->t & (v4_ucell)x); + break; + case V4_OP_XOR: + x = v4_dstack_pop(ds); + ds->t = (v4_cell)((v4_ucell)ds->t ^ (v4_ucell)x); + break; + case V4_OP_DROP: + (void)v4_dstack_pop(ds); + break; + case V4_OP_DUP: + v4_dstack_push(ds, ds->t); + break; + case V4_OP_RPOP: + v4_dstack_push(ds, v4_rstack_pop(rs)); + break; + case V4_OP_OVER: + v4_dstack_push(ds, ds->s); + break; + case V4_OP_PUSH_A: + v4_dstack_push(ds, n->a); + break; + case V4_OP_NOP: + break; + case V4_OP_PUSH: + v4_rstack_push(rs, v4_dstack_pop(ds)); + break; + case V4_OP_BANG_B: + n->b = v4_dstack_pop(ds); + break; + case V4_OP_BANG_A: + n->a = v4_dstack_pop(ds); + break; + default: + return; /* not an opcode: nothing retires */ + } + + v4_heat_on_retire(h, op, &es->anticlock); +} + +unsigned v4_exec_step_word(v4_node *n, v4_exec_state *es, v4_heat *h) +{ + v4_iword iw = fetch_iword(n, n->p); + unsigned executed = 0; + unsigned slot = 0; + + n->p = add_wrap(n->p, 1); + + while (slot < V4_SLOT_COUNT) { + unsigned op = v4_iword_op(iw, slot); + /* Decided before the opcode runs, because running it changes R. */ + int again = (op == V4_OP_UNEXT) && (n->rs.r != 0); + + v4_exec_op(n, es, h, op, iw, slot); + executed++; + + if (again) { + /* Same word, slot 0, no refetch and P untouched: an `@p` or `!p` + * inside a unext loop therefore walks the words that follow, as + * it does on the F18. */ + slot = 0; + continue; + } + if (ends_word(op)) break; + slot++; + } + return executed; +} diff --git a/v4/src/guard.c b/v4/src/guard.c new file mode 100644 index 00000000..c0bad815 --- /dev/null +++ b/v4/src/guard.c @@ -0,0 +1,15 @@ +/* guard.c -- 5% safety boundaries. See guard.h. */ +#include "v4/guard.h" + +void v4_guard_fill(v4_cell *band, unsigned n, v4_ucell pattern) +{ + for (unsigned i = 0; i < n; i++) band[i] = (v4_cell)pattern; +} + +int v4_guard_intact(const v4_cell *band, unsigned n, v4_ucell pattern) +{ + for (unsigned i = 0; i < n; i++) { + if ((v4_ucell)band[i] != pattern) return 0; + } + return 1; +} diff --git a/v4/src/heat.c b/v4/src/heat.c new file mode 100644 index 00000000..8d80b1ba --- /dev/null +++ b/v4/src/heat.c @@ -0,0 +1,89 @@ +/* heat.c -- heat and anti-clock. See heat.h. */ +#include "v4/heat.h" +#include + +void v4_heat_reset(v4_heat *h) +{ + memset(h->op, 0, sizeof(h->op)); + memset(h->call, 0, sizeof(h->call)); + memset(h->call_freeze_mask, 0, sizeof(h->call_freeze_mask)); +} + +void v4_heat_on_retire(v4_heat *h, unsigned op, v4_uheat_t *anticlock) +{ + if (op < V4_OPCODE_COUNT) { + h->op[op]++; + } + if (anticlock) (*anticlock)++; +} + +static unsigned call_index(v4_cell target) +{ + /* Index by target address. The table is a fixed-size cache for the model. + * A real hardware table is deferred; here we hash-mod or just take low bits? + * Or simply if in range use it. The spec says "per-call-target heat table" + * indexed by target. For golden model, targets are small (node memory). */ + unsigned idx = (unsigned)(v4_ucell)target; + if (idx >= V4_HEAT_MAX_CALL_TARGETS) { + /* Out of range: ignore for now? Or clamp? D-6 deferred; but heat must + * be recorded for actual call targets exercised. Many tests will have + * targets < 4096. This is a conservative model choice: if target is + * outside the modeled table, we do not increment a modeled slot (and + * we could log, but not specified). The boundary philosophy says detect + * rather than corrupt: for the model, we just don't record in the fixed + * table -- acceptable until D-4/D-6 pin sizes. */ + return (unsigned)-1; /* invalid */ + } + return idx; +} + +void v4_heat_on_call(v4_heat *h, v4_cell target) +{ + unsigned idx = call_index(target); + if (idx == (unsigned)-1) return; + if (v4_heat_call_is_frozen(h, target)) return; + h->call[idx]++; +} + +v4_uheat_t v4_heat_call_get(const v4_heat *h, v4_cell target) +{ + unsigned idx = call_index(target); + if (idx == (unsigned)-1) return 0; + return h->call[idx]; +} + +int v4_heat_call_set(v4_heat *h, v4_cell target, v4_uheat_t val) +{ + unsigned idx = call_index(target); + if (idx == (unsigned)-1) return 0; + if (v4_heat_call_is_frozen(h, target)) return 0; + h->call[idx] = val; + return 1; +} + +void v4_heat_call_freeze(v4_heat *h, v4_cell target) +{ + unsigned idx = call_index(target); + if (idx == (unsigned)-1) return; + unsigned word = idx / (8u * sizeof(v4_ucell)); + unsigned bit = idx % (8u * sizeof(v4_ucell)); + h->call_freeze_mask[word] |= ((v4_ucell)1u << bit); +} + +void v4_heat_call_unfreeze(v4_heat *h, v4_cell target) +{ + unsigned idx = call_index(target); + if (idx == (unsigned)-1) return; + unsigned word = idx / (8u * sizeof(v4_ucell)); + unsigned bit = idx % (8u * sizeof(v4_ucell)); + h->call_freeze_mask[word] &= ~((v4_ucell)1u << bit); +} + +int v4_heat_call_is_frozen(const v4_heat *h, v4_cell target) +{ + unsigned idx = call_index(target); + if (idx == (unsigned)-1) return 0; + unsigned word = idx / (8u * sizeof(v4_ucell)); + unsigned bit = idx % (8u * sizeof(v4_ucell)); + return (h->call_freeze_mask[word] & ((v4_ucell)1u << bit)) != 0; +} diff --git a/v4/src/iword.c b/v4/src/iword.c new file mode 100644 index 00000000..5f2b0a72 --- /dev/null +++ b/v4/src/iword.c @@ -0,0 +1,74 @@ +/* iword.c -- instruction-word decode. See iword.h for the layout. */ +#include "v4/iword.h" + +/* The five opcodes that consume a target from the low bits of their slot + * (section 1.2): jump, call, next, if, -if. A table rather than a switch so + * that the set is visible in one place and can be counted in the tests. */ +int v4_op_is_branch(unsigned op) +{ + return op == V4_OP_JUMP || op == V4_OP_CALL || op == V4_OP_NEXT + || op == V4_OP_IF || op == V4_OP_MINUS_IF; +} + +int v4_iword_branch_legal(unsigned slot) +{ + return slot < 4u; /* section 1.2: branches are legal in slots 0-3 only */ +} + +uint32_t v4_iword_slot_mask(unsigned slot) +{ + if (slot >= V4_SLOT_COUNT) return 0u; + /* 27-5k address bits, e.g. 0x07FFFFFF for slot 0 down to 0x00000FFF for + * slot 3. For slots 4 and 5 the formula still produces 7 and 2 bits; the + * legality check is separate because those slots are simply not usable. */ + return ((uint32_t)1u << V4_BRANCH_ADDR_BITS(slot)) - 1u; +} + +unsigned v4_iword_op(v4_iword w, unsigned slot) +{ + if (slot >= V4_SLOT_COUNT) return 0u; + return (unsigned)((w >> V4_SLOT_LOW_BIT(slot)) & 0x1Fu); +} + +unsigned v4_iword_spare(v4_iword w) +{ + return (unsigned)(w & ((1u << V4_SPARE_BITS) - 1u)); +} + +v4_iword v4_iword_target(v4_iword w, unsigned slot) +{ + if (slot >= V4_SLOT_COUNT) return 0u; + return w & v4_iword_slot_mask(slot); +} + +v4_iword v4_iword_assemble(const unsigned op[V4_SLOT_COUNT], unsigned spare) +{ + v4_iword w = 0u; + + for (unsigned k = 0; k < V4_SLOT_COUNT; k++) { + /* An opcode that does not fit in 5 bits is a bug in whoever built the + * word, not something to encode silently. Truncating here would let a + * malformed capsule execute as something else. */ + if (op[k] > 0x1Fu) return 0xFFFFFFFFu; + w |= (v4_iword)(op[k] & 0x1Fu) << V4_SLOT_LOW_BIT(k); + } + if (spare > ((1u << V4_SPARE_BITS) - 1u)) return 0xFFFFFFFFu; + w |= (v4_iword)(spare & ((1u << V4_SPARE_BITS) - 1u)); + + return w; +} + +v4_cell v4_iword_branch(v4_cell p, v4_iword w, unsigned slot) +{ + uint32_t mask = v4_iword_slot_mask(slot); + v4_ucell up = (v4_ucell)p; + + /* Page-relative, as in the F18: the target supplies the low + * V4_BRANCH_ADDR_BITS(slot) bits of P and the bits above them survive. The + * mask is computed in 32 bits and widened, so a 64-bit P keeps its high + * half -- which is the correct reading of "replaces the same low bits of P" + * at any cell width. */ + up = (up & ~(v4_ucell)mask) | (v4_ucell)(w & mask); + + return (v4_cell)up; +} diff --git a/v4/src/node.c b/v4/src/node.c new file mode 100644 index 00000000..d654f181 --- /dev/null +++ b/v4/src/node.c @@ -0,0 +1,35 @@ +/* node.c -- the v4 node. See node.h. */ +#include "v4/node.h" + +void v4_node_reset(v4_node *n) +{ + n->p = 0; + n->a = 0; + n->b = 0; + for (unsigned i = 0; i < V4_NODE_WORDS; i++) n->mem[i] = 0; + v4_guard_fill(n->mem_guard_head, V4_MEM_BOUND, V4_GUARD_PATTERN_HEAD); + v4_guard_fill(n->mem_guard_tail, V4_MEM_BOUND, V4_GUARD_PATTERN_TAIL); + v4_dstack_reset(&n->ds); + v4_rstack_reset(&n->rs); +} + +int v4_node_guards_intact(const v4_node *n) +{ + return v4_guard_intact(n->mem_guard_head, V4_MEM_BOUND, V4_GUARD_PATTERN_HEAD) + && v4_guard_intact(n->mem_guard_tail, V4_MEM_BOUND, V4_GUARD_PATTERN_TAIL) + && v4_dstack_guards_intact(&n->ds) + && v4_rstack_guards_intact(&n->rs); +} + +v4_cell v4_node_load(const v4_node *n, v4_cell addr) +{ + /* Precondition checked by the caller; see node.h. The unsigned compare is + * deliberate: `addr` is signed, and a negative address must not wrap into + * a large positive one and read the top of memory instead. */ + return n->mem[(unsigned)addr]; +} + +void v4_node_store(v4_node *n, v4_cell addr, v4_cell value) +{ + n->mem[(unsigned)addr] = value; +} diff --git a/v4/src/stack.c b/v4/src/stack.c new file mode 100644 index 00000000..e00c9f0e --- /dev/null +++ b/v4/src/stack.c @@ -0,0 +1,107 @@ +/* stack.c -- F18 circular hardware stacks. + * + * The two decompositions (T/S + 8-ring, R + 8-ring) are exactly equivalent to + * flat circular buffers of depth 10 and 9 respectively. The argument, since + * the ISA is specified in terms of the decomposition and the differential + * test in tests/test_stack.c is written against the flat form: + * + * Data stack, 10 deep. Read the stack top to bottom as + * + * T, S, ring[(head-1) mod 8], ring[(head-2) mod 8], ..., ring[head mod 8] + * + * -- that is, ring[(head-1) mod 8] sits immediately below S, and head names + * the oldest slot. push(x) does ring[head]=S; S=T; T=x; head=(head+1) mod 8, + * which appends at the top and rotates the oldest entry into the ring. + * pop() takes T, promotes S, and pulls ring[(head-1) mod 8] up into S while + * stepping head back one -- so the element that was third becomes second and + * the ring is re-seated one position earlier. That is a 10-slot circular + * buffer whose slot 0 is T and slot 1 is S, and the head arithmetic is + * bookkeeping for which ring slot is oldest. + * + * Return stack, 9 deep, same argument with one register instead of two: the + * stack reads R, ring[(head-1) mod 8], ..., ring[head mod 8]. + * + * "No overflow or underflow; pushing past the bottom silently overwrites the + * oldest entry" (D-2) is not an extra rule here -- it is what a fixed-depth + * circular buffer with no bounds check does on its own, once the pointer is + * allowed to wrap. Nothing below tests head against anything. + */ +#include "v4/stack.h" + +void v4_dstack_reset(v4_dstack *st) +{ + st->t = 0; + st->s = 0; + st->head = 0; + for (unsigned i = 0; i < V4_DATA_RING; i++) st->ring[i] = 0; + v4_guard_fill(st->guard_head, V4_DATA_BOUND, V4_GUARD_PATTERN_HEAD); + v4_guard_fill(st->guard_tail, V4_DATA_BOUND, V4_GUARD_PATTERN_TAIL); +} + +int v4_dstack_guards_intact(const v4_dstack *st) +{ + return v4_guard_intact(st->guard_head, V4_DATA_BOUND, V4_GUARD_PATTERN_HEAD) + && v4_guard_intact(st->guard_tail, V4_DATA_BOUND, V4_GUARD_PATTERN_TAIL); +} + +void v4_dstack_push(v4_dstack *st, v4_cell x) +{ + st->ring[st->head] = st->s; + st->s = st->t; + st->t = x; + st->head = (st->head + 1u) % V4_DATA_RING; +} + +v4_cell v4_dstack_pop(v4_dstack *st) +{ + v4_cell x = st->t; + st->t = st->s; + st->head = (st->head + V4_DATA_RING - 1u) % V4_DATA_RING; + st->s = st->ring[st->head]; + return x; +} + +v4_cell v4_dstack_peek(const v4_dstack *st) +{ + return st->t; +} + +v4_cell v4_dstack_peek2(const v4_dstack *st) +{ + return st->s; +} + +void v4_rstack_reset(v4_rstack *st) +{ + st->r = 0; + st->head = 0; + for (unsigned i = 0; i < V4_RET_RING; i++) st->ring[i] = 0; + v4_guard_fill(st->guard_head, V4_RET_BOUND, V4_GUARD_PATTERN_HEAD); + v4_guard_fill(st->guard_tail, V4_RET_BOUND, V4_GUARD_PATTERN_TAIL); +} + +int v4_rstack_guards_intact(const v4_rstack *st) +{ + return v4_guard_intact(st->guard_head, V4_RET_BOUND, V4_GUARD_PATTERN_HEAD) + && v4_guard_intact(st->guard_tail, V4_RET_BOUND, V4_GUARD_PATTERN_TAIL); +} + +void v4_rstack_push(v4_rstack *st, v4_cell x) +{ + st->ring[st->head] = st->r; + st->r = x; + st->head = (st->head + 1u) % V4_RET_RING; +} + +v4_cell v4_rstack_pop(v4_rstack *st) +{ + v4_cell x = st->r; + st->head = (st->head + V4_RET_RING - 1u) % V4_RET_RING; + st->r = st->ring[st->head]; + return x; +} + +v4_cell v4_rstack_peek(const v4_rstack *st) +{ + return st->r; +} diff --git a/v4/src/testcode.c b/v4/src/testcode.c new file mode 100644 index 00000000..90bda8f7 --- /dev/null +++ b/v4/src/testcode.c @@ -0,0 +1,20 @@ +/* testcode.c -- run a word on a node, for tests. See testcode.h. */ +#include "v4/testcode.h" + +long v4_test_call(v4_node *n, v4_exec_state *es, v4_heat *h, + v4_cell entry, long max_words) +{ + long words = 0; + + v4_rstack_push(&n->rs, V4_TEST_HALT); + n->p = entry; + while (n->p != V4_TEST_HALT) { + if (words >= max_words) return -1; + /* A golden model must not index outside its own memory on a runaway + * P; node.h leaves out-of-range addressing undefined. */ + if (n->p < 0 || (v4_ucell)n->p >= V4_NODE_WORDS) return -1; + (void)v4_exec_step_word(n, es, h); + words++; + } + return words; +} diff --git a/v4/src/umul.c b/v4/src/umul.c new file mode 100644 index 00000000..7acef151 --- /dev/null +++ b/v4/src/umul.c @@ -0,0 +1,27 @@ +/* umul.c -- reference unsigned multiply. See umul.h. + * + * Schoolbook multiplication on half-cells, in v4_ucell only. No wider type is + * used, so the same code is correct at both cell widths and builds on a host + * with no 128-bit integer (ARMv7 is one, and is a v4 host). + */ +#include "v4/umul.h" + +#define HALF_BITS (V4_CELL_BITS / 2) +#define HALF_MASK ((((v4_ucell)1) << HALF_BITS) - 1u) + +void v4_umul(v4_ucell u1, v4_ucell u2, v4_ucell *ulo, v4_ucell *uhi) +{ + v4_ucell a0 = u1 & HALF_MASK, a1 = u1 >> HALF_BITS; + v4_ucell b0 = u2 & HALF_MASK, b1 = u2 >> HALF_BITS; + + v4_ucell p00 = a0 * b0; + v4_ucell p10 = a1 * b0; + v4_ucell p01 = a0 * b1; + v4_ucell p11 = a1 * b1; + + /* Cannot overflow: at most (2^h - 1) + (2^h - 1) + (2^h - 1)^2 = 2^2h - 1. */ + v4_ucell mid = (p00 >> HALF_BITS) + (p10 & HALF_MASK) + p01; + + if (ulo) *ulo = (mid << HALF_BITS) | (p00 & HALF_MASK); + if (uhi) *uhi = p11 + (p10 >> HALF_BITS) + (mid >> HALF_BITS); +} diff --git a/v4/tests/test_asm.c b/v4/tests/test_asm.c new file mode 100644 index 00000000..b4d847f3 --- /dev/null +++ b/v4/tests/test_asm.c @@ -0,0 +1,110 @@ +/* test_asm.c -- the slot packer lays words out as asm.h says it does. */ +#include "v4/asm.h" +#include "v4/testcode.h" +#include + +static int failures = 0, checks = 0; +#define CHECK(c,...) do{checks++; if(!(c)){failures++; printf("FAIL %s:%d: ",__FILE__,__LINE__); printf(__VA_ARGS__); printf("\n");}}while(0) + +static v4_node n; +static v4_exec_state es; +static v4_heat h; +static v4_asm as; + +static void fresh(v4_cell origin) +{ + v4_node_reset(&n); + v4_exec_reset(&es); + v4_heat_reset(&h); + v4_asm_begin(&as, &n, origin); +} + +static v4_iword word_at(v4_cell addr) { return (v4_iword)(v4_ucell)n.mem[addr]; } + +int main(void) +{ + v4_asm_ref ref; + v4_cell loop, other; + + printf("v4 asm tests: V4_CELL_BITS=%d\n", V4_CELL_BITS); + + /* Six opcodes fill a word; the seventh starts the next, padded with nop. */ + fresh(0); + for (unsigned k = 0; k < 7; k++) v4_asm_op(&as, V4_OP_DUP); + CHECK(v4_asm_label(&as) == 2, "seven opcodes take two words"); + for (unsigned k = 0; k < 6; k++) CHECK(v4_iword_op(word_at(0), k) == V4_OP_DUP, "word 0 slot %u", k); + CHECK(v4_iword_op(word_at(1), 0) == V4_OP_DUP, "word 1 slot 0"); + for (unsigned k = 1; k < 6; k++) CHECK(v4_iword_op(word_at(1), k) == V4_OP_NOP, "word 1 pad %u", k); + + /* `;` closes the word. */ + fresh(0); + v4_asm_op(&as, V4_OP_DUP); v4_asm_op(&as, V4_OP_SEMI); + CHECK(v4_asm_label(&as) == 1, "; closes the word"); + + /* Literals follow the instruction word, in order, and the code runs. */ + fresh(0); + v4_asm_lit(&as, 30); v4_asm_lit(&as, 12); v4_asm_op(&as, V4_OP_ADD); v4_asm_op(&as, V4_OP_SEMI); + CHECK(v4_asm_ok(&as), "literal program assembles"); + CHECK(n.mem[1] == 30 && n.mem[2] == 12 && v4_asm_label(&as) == 3, "literal layout"); + CHECK(v4_test_call(&n, &es, &h, 0, 10) == 1 && n.ds.t == 42, "30 12 + ;"); + + /* A branch takes the next free slot when that slot is legal. */ + fresh(0); + v4_asm_op(&as, V4_OP_DUP); v4_asm_op(&as, V4_OP_DROP); + v4_asm_branch(&as, V4_OP_JUMP, 0x155); + CHECK(v4_iword_op(word_at(0), 2) == V4_OP_JUMP, "branch in slot 2"); + CHECK(v4_iword_target(word_at(0), 2) == 0x155, "branch target in slot 2"); + CHECK(v4_asm_label(&as) == 1, "a branch closes the word"); + + /* With slots 0-3 used, the branch moves to slot 0 of a new word. */ + fresh(0); + for (unsigned k = 0; k < 4; k++) v4_asm_op(&as, V4_OP_DUP); + v4_asm_branch(&as, V4_OP_JUMP, 0x155); + CHECK(v4_iword_op(word_at(0), 4) == V4_OP_NOP && v4_iword_op(word_at(0), 5) == V4_OP_NOP, + "word before the branch is padded"); + CHECK(v4_iword_op(word_at(1), 0) == V4_OP_JUMP && v4_iword_target(word_at(1), 0) == 0x155, + "branch moved to slot 0"); + + /* Forward reference, section 2's IF ... ELSE ... THEN with the flag left + * on the stack by `if`: if L1 drop 111 ; L1: drop 222 ; */ + fresh(0); + ref = v4_asm_branch_fwd(&as, V4_OP_IF); + v4_asm_op(&as, V4_OP_DROP); v4_asm_lit(&as, 111); v4_asm_op(&as, V4_OP_SEMI); + other = v4_asm_label(&as); + v4_asm_resolve(&as, ref, other); + v4_asm_op(&as, V4_OP_DROP); v4_asm_lit(&as, 222); v4_asm_op(&as, V4_OP_SEMI); + CHECK(v4_asm_ok(&as), "forward branch assembles"); + v4_dstack_push(&n.ds, 5); + CHECK(v4_test_call(&n, &es, &h, 0, 10) > 0 && n.ds.t == 111, "flag nonzero takes the first arm"); + v4_dstack_reset(&n.ds); v4_rstack_reset(&n.rs); + v4_dstack_push(&n.ds, 0); + CHECK(v4_test_call(&n, &es, &h, 0, 10) > 0 && n.ds.t == 222, "flag zero takes the second arm"); + + /* Backward reference: 4 FOR 1 + NEXT runs the body n+1 times. */ + fresh(0); + v4_asm_lit(&as, 4); v4_asm_op(&as, V4_OP_PUSH); + loop = v4_asm_label(&as); + v4_asm_lit(&as, 1); v4_asm_op(&as, V4_OP_ADD); + v4_asm_branch(&as, V4_OP_NEXT, loop); + v4_asm_op(&as, V4_OP_SEMI); + CHECK(v4_asm_ok(&as), "loop assembles"); + v4_dstack_push(&n.ds, 0); + CHECK(v4_test_call(&n, &es, &h, 0, 50) > 0 && n.ds.t == 5, "4 FOR 1 + NEXT"); + + /* Errors are reported, not encoded. */ + fresh(0); v4_asm_op(&as, V4_OP_JUMP); + CHECK(!v4_asm_ok(&as), "a branch through v4_asm_op is refused"); + fresh(0); v4_asm_op(&as, V4_OPCODE_COUNT); + CHECK(!v4_asm_ok(&as), "an out-of-range opcode is refused"); + fresh(0); + for (unsigned k = 0; k < 3; k++) v4_asm_op(&as, V4_OP_DUP); + v4_asm_branch(&as, V4_OP_JUMP, 5000); /* slot 3 reaches 4096 words */ + CHECK(!v4_asm_ok(&as), "a target outside the page is refused"); + fresh((v4_cell)(V4_NODE_WORDS - 1u)); + v4_asm_lit(&as, 1); v4_asm_op(&as, V4_OP_SEMI); + CHECK(!v4_asm_ok(&as), "running off the end of memory is refused"); + CHECK(v4_node_guards_intact(&n), "and does not touch the guard band"); + + printf(" %d checks, %d failures\n", checks, failures); + return failures ? 1 : 0; +} diff --git a/v4/tests/test_exec.c b/v4/tests/test_exec.c new file mode 100644 index 00000000..850670f1 --- /dev/null +++ b/v4/tests/test_exec.c @@ -0,0 +1,339 @@ +/* test_exec.c -- every opcode of DECOMPOSITION.md section 1.3, and the slot + * sequencing of section 1.2. + * + * Each expected value below is worked out from the table in section 1.3, not + * from the executor. Words are packed by hand with v4_iword_assemble so that + * this file does not depend on asm.c, which has its own test. + */ +#include "v4/exec.h" +#include + +static int failures = 0, checks = 0; +#define CHECK(c,...) do{checks++; if(!(c)){failures++; printf("FAIL %s:%d: ",__FILE__,__LINE__); printf(__VA_ARGS__); printf("\n");}}while(0) + +#define NOP V4_OP_NOP +#define MINC ((v4_cell)V4_MSB) /* most negative cell */ +#define MAXC ((v4_cell)(V4_MSB - 1u)) /* most positive cell */ + +static v4_node n; +static v4_exec_state es; +static v4_heat h; + +static void fresh(void) +{ + v4_node_reset(&n); + v4_exec_reset(&es); + v4_heat_reset(&h); +} + +static void dpush(v4_cell x) { v4_dstack_push(&n.ds, x); } +static void rpush(v4_cell x) { v4_rstack_push(&n.rs, x); } + +/* A word of six plain opcodes. */ +static v4_cell word6(unsigned a, unsigned b, unsigned c, + unsigned d, unsigned e, unsigned f) +{ + unsigned op[V4_SLOT_COUNT]; + op[0] = a; op[1] = b; op[2] = c; op[3] = d; op[4] = e; op[5] = f; + return (v4_cell)v4_iword_assemble(op, 0); +} + +/* A word with `npre` nops, then a branch in the next slot, then its target. */ +static v4_cell bword(unsigned npre, unsigned op, v4_iword target) +{ + v4_iword w = 0; + for (unsigned k = 0; k < npre; k++) w |= (v4_iword)NOP << V4_SLOT_LOW_BIT(k); + w |= (v4_iword)op << V4_SLOT_LOW_BIT(npre); + w |= target & v4_iword_slot_mask(npre); + return (v4_cell)w; +} + +/* Run one opcode, padded with nops, on the current stacks. Returns the count + * of instructions retired. */ +static unsigned run1(unsigned op) +{ + n.mem[0] = word6(op, NOP, NOP, NOP, NOP, NOP); + n.p = 0; + return v4_exec_step_word(&n, &es, &h); +} + +static void test_stack_ops(void) +{ + fresh(); dpush(1); dpush(2); run1(V4_OP_DUP); + CHECK(n.ds.t == 2 && n.ds.s == 2, "dup"); + (void)v4_dstack_pop(&n.ds); + CHECK(n.ds.t == 2 && n.ds.s == 1, "dup keeps what was below"); + + fresh(); dpush(1); dpush(2); run1(V4_OP_OVER); + CHECK(n.ds.t == 1 && n.ds.s == 2, "over"); + (void)v4_dstack_pop(&n.ds); + CHECK(n.ds.t == 2 && n.ds.s == 1, "over keeps what was below"); + + fresh(); dpush(1); dpush(2); dpush(3); run1(V4_OP_DROP); + CHECK(n.ds.t == 2 && n.ds.s == 1, "drop"); + + fresh(); dpush(1); dpush(2); CHECK(run1(NOP) == 6, "nop word retires six"); + CHECK(n.ds.t == 2 && n.ds.s == 1 && n.p == 1, "nop changes nothing but P"); +} + +static void test_alu(void) +{ + fresh(); dpush(9); dpush(3); dpush(4); run1(V4_OP_ADD); + CHECK(n.ds.t == 7 && n.ds.s == 9, "3 + 4, and 9 moves up to S"); + fresh(); dpush(MAXC); dpush(1); run1(V4_OP_ADD); + CHECK(n.ds.t == MINC, "+ wraps"); + + fresh(); dpush(9); dpush(12); dpush(10); run1(V4_OP_AND); + CHECK(n.ds.t == 8 && n.ds.s == 9, "and"); + fresh(); dpush(9); dpush(12); dpush(10); run1(V4_OP_XOR); + CHECK(n.ds.t == 6 && n.ds.s == 9, "xor"); + + fresh(); dpush(5); dpush(0); run1(V4_OP_INV); + CHECK(n.ds.t == -1 && n.ds.s == 5, "inv 0"); + fresh(); dpush(MAXC); run1(V4_OP_INV); + CHECK(n.ds.t == MINC, "inv max"); + + fresh(); dpush(3); run1(V4_OP_TWO_STAR); CHECK(n.ds.t == 6, "2* 3"); + fresh(); dpush(-1); run1(V4_OP_TWO_STAR); CHECK(n.ds.t == -2, "2* -1"); + fresh(); dpush(MINC); run1(V4_OP_TWO_STAR); CHECK(n.ds.t == 0, "2* drops the top bit"); + + fresh(); dpush(6); run1(V4_OP_TWO_SLASH); CHECK(n.ds.t == 3, "2/ 6"); + fresh(); dpush(-1); run1(V4_OP_TWO_SLASH); CHECK(n.ds.t == -1, "2/ -1 is -1, not 0"); + fresh(); dpush(-7); run1(V4_OP_TWO_SLASH); CHECK(n.ds.t == -4, "2/ -7 floors"); + fresh(); dpush(MINC); run1(V4_OP_TWO_SLASH); + CHECK((v4_ucell)n.ds.t == (V4_MSB | (V4_MSB >> 1)), "2/ keeps the sign bit"); +} + +static void test_mul_step(void) +{ + /* A even: no add. */ + fresh(); dpush(5); dpush(6); n.a = 4; run1(V4_OP_MUL_STEP); + CHECK(n.ds.t == 3 && n.ds.s == 5 && n.a == 2, "+* A even"); + + /* A odd: T+S = 11, shifted to 5, the 1 shifted out enters the top of A. */ + fresh(); dpush(5); dpush(6); n.a = 5; run1(V4_OP_MUL_STEP); + CHECK(n.ds.t == 5 && n.ds.s == 5, "+* A odd, T"); + CHECK((v4_ucell)n.a == (V4_MSB | 2u), "+* A odd, A"); + + fresh(); dpush(0); dpush(3); n.a = 0; run1(V4_OP_MUL_STEP); + CHECK(n.ds.t == 1 && (v4_ucell)n.a == V4_MSB, "+* T bit 0 enters A"); + + fresh(); dpush(0); dpush(-2); n.a = 0; run1(V4_OP_MUL_STEP); + CHECK(n.ds.t == -1 && n.a == 0, "+* keeps T's sign bit"); + + /* D-3: all-ones + 1 carries out of T and the carry is gone. */ + fresh(); dpush(1); dpush(-1); n.a = 1; run1(V4_OP_MUL_STEP); + CHECK(n.ds.t == 0 && n.a == 0, "+* does not keep the carry (D-3)"); +} + +static void test_registers_and_rstack(void) +{ + fresh(); dpush(4); dpush(5); run1(V4_OP_PUSH); + CHECK(n.rs.r == 5 && n.ds.t == 4, "push"); + run1(V4_OP_RPOP); + CHECK(n.ds.t == 5 && n.ds.s == 4, "pop"); + + fresh(); dpush(4); dpush(77); run1(V4_OP_BANG_A); + CHECK(n.a == 77 && n.ds.t == 4, "a!"); + run1(V4_OP_PUSH_A); + CHECK(n.ds.t == 77 && n.ds.s == 4 && n.a == 77, "a"); + + fresh(); dpush(4); dpush(88); run1(V4_OP_BANG_B); + CHECK(n.b == 88 && n.ds.t == 4 && n.a == 0, "b!"); +} + +static void test_memory(void) +{ + fresh(); n.a = 100; n.b = 101; n.mem[100] = 11; n.mem[101] = 22; + run1(V4_OP_FETCH_A); CHECK(n.ds.t == 11 && n.a == 100, "@"); + run1(V4_OP_FETCH_B); CHECK(n.ds.t == 22 && n.ds.s == 11 && n.b == 101, "@b"); + run1(V4_OP_FETCH_INC); CHECK(n.ds.t == 11 && n.a == 101, "@+ first"); + run1(V4_OP_FETCH_INC); CHECK(n.ds.t == 22 && n.a == 102, "@+ second"); + + fresh(); n.a = 100; n.b = 200; dpush(1); dpush(5); + run1(V4_OP_STORE_A); + CHECK(n.mem[100] == 5 && n.ds.t == 1 && n.a == 100, "!"); + dpush(6); run1(V4_OP_STORE_INC); + CHECK(n.mem[100] == 6 && n.ds.t == 1 && n.a == 101, "!+"); + dpush(7); run1(V4_OP_STORE_B); + CHECK(n.mem[200] == 7 && n.ds.t == 1 && n.b == 200, "!b"); + + /* @p takes the word after the instruction word and steps over it. */ + fresh(); n.mem[1] = (v4_cell)0x1122334455667788LL; + run1(V4_OP_FETCH_P); + CHECK(n.ds.t == n.mem[1] && n.p == 2, "@p is a full cell and advances P"); + + fresh(); dpush(1); dpush(9); run1(V4_OP_STORE_P); + CHECK(n.mem[1] == 9 && n.ds.t == 1 && n.p == 2, "!p"); + + /* Two literals in one word are the two words after it, in order. */ + fresh(); n.mem[0] = word6(V4_OP_FETCH_P, V4_OP_FETCH_P, V4_OP_ADD, NOP, NOP, NOP); + n.mem[1] = 30; n.mem[2] = 12; n.p = 0; + (void)v4_exec_step_word(&n, &es, &h); + CHECK(n.ds.t == 42 && n.p == 3, "two literals"); +} + +static void test_return_and_ex(void) +{ + fresh(); rpush(7); rpush(50); + n.mem[0] = word6(V4_OP_SEMI, V4_OP_DUP, V4_OP_DUP, V4_OP_DUP, V4_OP_DUP, V4_OP_DUP); + n.p = 0; + CHECK(v4_exec_step_word(&n, &es, &h) == 1, "; ends the word"); + CHECK(n.p == 50 && n.rs.r == 7, "; returns and pops R"); + CHECK(h.op[V4_OP_DUP] == 0 && es.anticlock == 1, "nothing after ; retires"); + + fresh(); rpush(7); rpush(50); + n.mem[20] = word6(V4_OP_EX, V4_OP_DUP, NOP, NOP, NOP, NOP); + n.p = 20; + CHECK(v4_exec_step_word(&n, &es, &h) == 1, "ex ends the word"); + CHECK(n.p == 50 && n.rs.r == 21, "ex swaps P and R"); + (void)v4_rstack_pop(&n.rs); + CHECK(n.rs.r == 7, "ex does not change the return stack depth"); +} + +static void test_branches(void) +{ + /* jump in each legal slot; the slots before it execute. */ + for (unsigned slot = 0; slot < 4; slot++) { + fresh(); n.mem[10] = bword(slot, V4_OP_JUMP, 300); n.p = 10; + CHECK(v4_exec_step_word(&n, &es, &h) == slot + 1, "jump slot %u count", slot); + CHECK(n.p == 300, "jump slot %u", slot); + CHECK(h.op[NOP] == slot && h.op[V4_OP_JUMP] == 1, "jump slot %u heat", slot); + } + + fresh(); rpush(7); n.mem[10] = bword(0, V4_OP_CALL, 200); n.p = 10; + (void)v4_exec_step_word(&n, &es, &h); + CHECK(n.p == 200 && n.rs.r == 11, "call pushes the return address"); + CHECK(v4_heat_call_get(&h, 200) == 1 && h.op[V4_OP_CALL] == 1, "call heats its target"); + (void)v4_rstack_pop(&n.rs); + CHECK(n.rs.r == 7, "call pushes exactly one"); + + fresh(); rpush(99); rpush(2); n.mem[5] = bword(0, V4_OP_NEXT, 40); n.p = 5; + (void)v4_exec_step_word(&n, &es, &h); + CHECK(n.p == 40 && n.rs.r == 1, "next, R nonzero"); + fresh(); rpush(99); rpush(0); n.mem[5] = bword(0, V4_OP_NEXT, 40); n.p = 5; + (void)v4_exec_step_word(&n, &es, &h); + CHECK(n.p == 6 && n.rs.r == 99, "next, R zero"); + + fresh(); dpush(8); dpush(0); n.mem[5] = bword(0, V4_OP_IF, 40); n.p = 5; + (void)v4_exec_step_word(&n, &es, &h); + CHECK(n.p == 40 && n.ds.t == 0 && n.ds.s == 8, "if, T zero: taken, T kept"); + /* The target bits 0x0FFFF would decode as opcodes if they were executed. */ + fresh(); dpush(8); dpush(5); n.mem[5] = bword(0, V4_OP_IF, 0x0FFFF); n.p = 5; + CHECK(v4_exec_step_word(&n, &es, &h) == 1, "if not taken still ends the word"); + CHECK(n.p == 6 && n.ds.t == 5 && n.ds.s == 8, "if, T nonzero: not taken, T kept"); + + fresh(); dpush(8); dpush(5); n.mem[5] = bword(0, V4_OP_MINUS_IF, 40); n.p = 5; + (void)v4_exec_step_word(&n, &es, &h); + CHECK(n.p == 40 && n.ds.t == 5 && n.ds.s == 8, "-if, T positive: taken"); + fresh(); dpush(0); n.mem[5] = bword(0, V4_OP_MINUS_IF, 40); n.p = 5; + (void)v4_exec_step_word(&n, &es, &h); + CHECK(n.p == 40, "-if, T zero: taken"); + fresh(); dpush(8); dpush(-1); n.mem[5] = bword(0, V4_OP_MINUS_IF, 40); n.p = 5; + (void)v4_exec_step_word(&n, &es, &h); + CHECK(n.p == 6 && n.ds.t == -1 && n.ds.s == 8, "-if, T negative: not taken"); +} + +static void test_unext(void) +{ + /* R = 3: the body runs four times, then the rest of the word runs once. */ + fresh(); dpush(1); rpush(99); rpush(3); + n.mem[0] = word6(V4_OP_TWO_STAR, V4_OP_UNEXT, NOP, NOP, NOP, NOP); n.p = 0; + CHECK(v4_exec_step_word(&n, &es, &h) == 12, "unext retire count"); + CHECK(n.ds.t == 16, "unext body ran R+1 times"); + CHECK(n.rs.r == 99, "unext pops R when done"); + CHECK(n.p == 1, "unext leaves P at the next word"); + CHECK(h.op[V4_OP_TWO_STAR] == 4 && h.op[V4_OP_UNEXT] == 4 && h.op[NOP] == 4, + "unext heat"); + CHECK(es.anticlock == 12, "unext anticlock"); + + fresh(); dpush(1); rpush(99); rpush(0); + n.mem[0] = word6(V4_OP_TWO_STAR, V4_OP_UNEXT, NOP, NOP, NOP, NOP); n.p = 0; + CHECK(v4_exec_step_word(&n, &es, &h) == 6, "unext with R zero runs once"); + CHECK(n.ds.t == 2 && n.rs.r == 99, "unext with R zero"); + + /* The word is not refetched and P is not rewound, so @p walks forward. */ + fresh(); rpush(99); rpush(2); n.a = 100; + n.mem[0] = word6(V4_OP_FETCH_P, V4_OP_STORE_INC, V4_OP_UNEXT, NOP, NOP, NOP); + n.mem[1] = 11; n.mem[2] = 22; n.mem[3] = 33; n.p = 0; + (void)v4_exec_step_word(&n, &es, &h); + CHECK(n.mem[100] == 11 && n.mem[101] == 22 && n.mem[102] == 33, + "@p in a unext loop copies successive words"); + CHECK(n.a == 103 && n.p == 4 && n.rs.r == 99, "@p in a unext loop, registers"); +} + +static void test_retirement(void) +{ + fresh(); + for (unsigned op = 0; op < V4_OPCODE_COUNT; op++) v4_exec_op(&n, &es, &h, op, 0, 0); + for (unsigned op = 0; op < V4_OPCODE_COUNT; op++) + CHECK(h.op[op] == 1, "opcode %u retires once", op); + CHECK(es.anticlock == V4_OPCODE_COUNT, "one anticlock tick per opcode"); + + v4_exec_op(&n, &es, &h, V4_OPCODE_COUNT, 0, 0); + CHECK(es.anticlock == V4_OPCODE_COUNT, "a non-opcode retires nothing"); +} + +#if V4_CELL_BITS == 64 +static void test_iword_in_wide_cell(void) +{ + /* D-9: the instruction word is the low 32 bits of the cell. The high half + * is not decoded and does not reach a branch target. */ + v4_cell junk = (v4_cell)0xA5A5A5A500000000ULL; + + fresh(); dpush(3); + n.mem[0] = junk | word6(V4_OP_DUP, V4_OP_ADD, NOP, NOP, NOP, NOP); n.p = 0; + CHECK(v4_exec_step_word(&n, &es, &h) == 6, "wide cell: six slots"); + CHECK(n.ds.t == 6, "wide cell: decode ignores the high half"); + + fresh(); n.mem[10] = junk | bword(0, V4_OP_JUMP, 300); n.p = 10; + (void)v4_exec_step_word(&n, &es, &h); + CHECK(n.p == 300, "wide cell: branch ignores the high half"); +} +#endif + +/* Many opcodes on arbitrary values. The point is the sanitizer build: no + * opcode may overflow a signed cell or shift out of range, whatever is on the + * stacks. Memory opcodes are left out because A, B and P would be arbitrary. */ +static void test_soak(void) +{ + static const unsigned safe[] = { + V4_OP_MUL_STEP, V4_OP_TWO_STAR, V4_OP_TWO_SLASH, V4_OP_INV, V4_OP_ADD, + V4_OP_AND, V4_OP_XOR, V4_OP_DROP, V4_OP_DUP, V4_OP_RPOP, V4_OP_OVER, + V4_OP_PUSH_A, V4_OP_NOP, V4_OP_PUSH, V4_OP_BANG_B, V4_OP_BANG_A + }; + uint64_t seed = 0x9E3779B97F4A7C15ULL; + const unsigned count = 200000; + + fresh(); + dpush(MINC); dpush(MAXC); dpush(-1); dpush(1); + for (unsigned i = 0; i < count; i++) { + seed = seed * 6364136223846793005ULL + 1442695040888963407ULL; + if ((seed >> 60) == 0) dpush((v4_cell)(seed >> 7)); + v4_exec_op(&n, &es, &h, safe[(seed >> 33) % (sizeof safe / sizeof safe[0])], 0, 0); + } + CHECK(es.anticlock == count, "soak retired every opcode"); + CHECK(v4_node_guards_intact(&n), "soak left the guards intact"); +} + +int main(void) +{ + printf("v4 exec tests: V4_CELL_BITS=%d\n", V4_CELL_BITS); + + test_stack_ops(); + test_alu(); + test_mul_step(); + test_registers_and_rstack(); + test_memory(); + test_return_and_ex(); + test_branches(); + test_unext(); + test_retirement(); +#if V4_CELL_BITS == 64 + test_iword_in_wide_cell(); +#endif + test_soak(); + + printf(" %d checks, %d failures\n", checks, failures); + return failures ? 1 : 0; +} diff --git a/v4/tests/test_foundation.c b/v4/tests/test_foundation.c new file mode 100644 index 00000000..6e288e09 --- /dev/null +++ b/v4/tests/test_foundation.c @@ -0,0 +1,209 @@ +/* test_foundation.c -- the first DECOMPOSITION.md definitions, executed. + * + * Section 4 says of its colon definitions that each "has been traced by hand, + * but none has been executed". This file assembles the helpers, the sign and + * zero tests, U< and UM* exactly as written there (plus 2DUP and - from + * section 5, which U< needs) and runs them on the golden model against the C + * operation each one stands for. + * + * Every call is made with a canary under the arguments, and the canary must + * still be directly under the results afterwards: a definition that leaves + * the right answer but an unbalanced stack is wrong. + */ +#include "v4/asm.h" +#include "v4/testcode.h" +#include "v4/umul.h" +#include + +static int failures = 0, checks = 0; +#define CHECK(c,...) do{checks++; if(!(c)){failures++; printf("FAIL %s:%d: ",__FILE__,__LINE__); printf(__VA_ARGS__); printf("\n");}}while(0) + +#define CANARY ((v4_cell)0x0C0FFEE5) +#define MAXU ((v4_ucell)~(v4_ucell)0) +#define FLAG(c) ((c) ? V4_ALL_ONES : (v4_cell)0) + +static v4_node n; +static v4_exec_state es; +static v4_heat h; +static v4_asm as; + +static v4_cell w_nip, w_swap, w_or, w_negate, w_rot, w_zless, w_zequal, + w_2dup, w_minus, w_uless, w_umstar; + +#define O(name) v4_asm_op(&as, V4_OP_##name) +#define LIT(v) v4_asm_lit(&as, (v4_cell)(v)) +#define CALL(w) v4_asm_branch(&as, V4_OP_CALL, (w)) + +static void build(void) +{ + v4_asm_ref ref; + + v4_node_reset(&n); + v4_asm_begin(&as, &n, 16); + + /* : NIP push drop pop ; */ + w_nip = v4_asm_label(&as); + O(PUSH); O(DROP); O(RPOP); O(SEMI); + + /* : SWAP over push push drop pop pop ; */ + w_swap = v4_asm_label(&as); + O(OVER); O(PUSH); O(PUSH); O(DROP); O(RPOP); O(RPOP); O(SEMI); + + /* : OR over inv and xor ; */ + w_or = v4_asm_label(&as); + O(OVER); O(INV); O(AND); O(XOR); O(SEMI); + + /* : NEGATE inv 1 + ; */ + w_negate = v4_asm_label(&as); + O(INV); LIT(1); O(ADD); O(SEMI); + + /* : ROT push SWAP pop SWAP ; */ + w_rot = v4_asm_label(&as); + O(PUSH); CALL(w_swap); O(RPOP); CALL(w_swap); O(SEMI); + + /* : 0< -if L1 drop -1 ; L1: drop 0 ; */ + w_zless = v4_asm_label(&as); + ref = v4_asm_branch_fwd(&as, V4_OP_MINUS_IF); + O(DROP); LIT(-1); O(SEMI); + v4_asm_resolve(&as, ref, v4_asm_label(&as)); + O(DROP); LIT(0); O(SEMI); + + /* : 0= if L1 drop 0 ; L1: drop -1 ; */ + w_zequal = v4_asm_label(&as); + ref = v4_asm_branch_fwd(&as, V4_OP_IF); + O(DROP); LIT(0); O(SEMI); + v4_asm_resolve(&as, ref, v4_asm_label(&as)); + O(DROP); LIT(-1); O(SEMI); + + /* : 2DUP over over ; (section 5.1) */ + w_2dup = v4_asm_label(&as); + O(OVER); O(OVER); O(SEMI); + + /* : - NEGATE + ; (section 5.4), NEGATE in line */ + w_minus = v4_asm_label(&as); + O(INV); LIT(1); O(ADD); O(ADD); O(SEMI); + + /* : U< 2DUP xor 0< IF NIP 0< ELSE - 0< THEN ; + * with section 2's IF: the flag is dropped on both arms. */ + w_uless = v4_asm_label(&as); + CALL(w_2dup); O(XOR); CALL(w_zless); + ref = v4_asm_branch_fwd(&as, V4_OP_IF); + O(DROP); CALL(w_nip); CALL(w_zless); O(SEMI); + v4_asm_resolve(&as, ref, v4_asm_label(&as)); + O(DROP); CALL(w_minus); CALL(w_zless); O(SEMI); + + /* : UM* a! 0 31 FOR +* UNEXT push drop a pop ; + * 31 is the cell width less one; written for a 32-bit cell in section 4. + * The loop body is the start of its own word so that unext restarts it. */ + w_umstar = v4_asm_label(&as); + O(BANG_A); LIT(0); LIT(V4_CELL_BITS - 1); O(PUSH); + (void)v4_asm_label(&as); + O(MUL_STEP); O(UNEXT); O(PUSH); O(DROP); O(PUSH_A); O(RPOP); + O(SEMI); + + CHECK(v4_asm_ok(&as), "foundation words assemble"); +} + +/* Call `word` with a canary and up to three arguments on fresh stacks. */ +static int call(v4_cell word, unsigned argc, v4_cell a, v4_cell b, v4_cell c) +{ + v4_dstack_reset(&n.ds); + v4_rstack_reset(&n.rs); + v4_exec_reset(&es); + v4_heat_reset(&h); + v4_dstack_push(&n.ds, CANARY); + if (argc > 0) v4_dstack_push(&n.ds, a); + if (argc > 1) v4_dstack_push(&n.ds, b); + if (argc > 2) v4_dstack_push(&n.ds, c); + return v4_test_call(&n, &es, &h, word, 1000) > 0; +} + +/* The results, top first, then the canary. */ +static int left1(v4_cell t) +{ + return n.ds.t == t && n.ds.s == CANARY; +} +static int left2(v4_cell s, v4_cell t) +{ + if (n.ds.t != t || n.ds.s != s) return 0; + (void)v4_dstack_pop(&n.ds); + return n.ds.s == CANARY; +} +static int left3(v4_cell third, v4_cell s, v4_cell t) +{ + if (n.ds.t != t) return 0; + (void)v4_dstack_pop(&n.ds); + return left2(third, s); +} + +static const v4_cell vec[] = { + 0, 1, 2, 3, -1, -2, 12345, -12345, + (v4_cell)(V4_MSB - 1u), (v4_cell)V4_MSB, (v4_cell)(V4_MSB + 1u), + (v4_cell)(V4_MSB >> 1), (v4_cell)((V4_MSB >> 1) - 1u), + (v4_cell)(MAXU / 3u), (v4_cell)(MAXU / 3u * 2u) +}; +#define NVEC (sizeof vec / sizeof vec[0]) + +/* Does UM* as written give the true product? */ +static int umstar_exact(v4_ucell u1, v4_ucell u2) +{ + v4_ucell lo, hi; + v4_umul(u1, u2, &lo, &hi); + return call(w_umstar, 2, (v4_cell)u1, (v4_cell)u2, 0) && left2((v4_cell)lo, (v4_cell)hi); +} + +int main(void) +{ + printf("v4 foundation tests: V4_CELL_BITS=%d\n", V4_CELL_BITS); + + build(); + + for (unsigned i = 0; i < NVEC; i++) { + v4_cell a = vec[i]; + v4_ucell ua = (v4_ucell)a; + + CHECK(call(w_negate, 1, a, 0, 0) && left1((v4_cell)(0u - ua)), "NEGATE [%u]", i); + CHECK(call(w_zless, 1, a, 0, 0) && left1(FLAG(ua & V4_MSB)), "0< [%u]", i); + CHECK(call(w_zequal, 1, a, 0, 0) && left1(FLAG(a == 0)), "0= [%u]", i); + + for (unsigned j = 0; j < NVEC; j++) { + v4_cell b = vec[j]; + v4_ucell ub = (v4_ucell)b; + + CHECK(call(w_nip, 2, a, b, 0) && left1(b), "NIP [%u,%u]", i, j); + CHECK(call(w_swap, 2, a, b, 0) && left2(b, a), "SWAP [%u,%u]", i, j); + CHECK(call(w_or, 2, a, b, 0) && left1((v4_cell)(ua | ub)), "OR [%u,%u]", i, j); + CHECK(call(w_2dup, 2, a, b, 0) && n.ds.t == b && n.ds.s == a + && (v4_dstack_pop(&n.ds), v4_dstack_pop(&n.ds), left2(a, b)), + "2DUP [%u,%u]", i, j); + CHECK(call(w_minus, 2, a, b, 0) && left1((v4_cell)(ua - ub)), "- [%u,%u]", i, j); + CHECK(call(w_uless, 2, a, b, 0) && left1(FLAG(ua < ub)), "U< [%u,%u]", i, j); + + for (unsigned k = 0; k < NVEC; k++) { + v4_cell c = vec[k]; + CHECK(call(w_rot, 3, a, b, c) && left3(b, c, a), "ROT [%u,%u,%u]", i, j, k); + } + + /* UM* as written is exact whenever the multiplicand (u1, which + * stays in S) is at most 2^(n-2): T is then always below S, so + * T+S stays below 2^(n-1) and neither the lost carry nor +*'s + * sign-keeping shift can touch the result. u2 is unrestricted. */ + if (ua <= (V4_MSB >> 1)) + CHECK(umstar_exact(ua, ub), "UM* [%u,%u]", i, j); + } + } + + /* KNOWN LIMITS of UM* as written, recorded so they cannot be forgotten. + * Section 4 marks UM* "NEEDS REVISION" and gives the limit as "operands + * below 2^31". The measured limit is tighter and is on u1 only. These + * two checks assert that the definition is still wrong where it is known + * to be wrong; when UM* is rewritten they must be turned into ordinary + * exactness checks. */ + CHECK(!umstar_exact(MAXU, MAXU), "UM* limit: carry out of T is lost (D-3)"); + CHECK(!umstar_exact(V4_MSB - 1u, 3u), "UM* limit: u1 below 2^(n-1) still fails"); + + CHECK(v4_node_guards_intact(&n), "guards intact"); + + printf(" %d checks, %d failures\n", checks, failures); + return failures ? 1 : 0; +} diff --git a/v4/tests/test_guard.c b/v4/tests/test_guard.c new file mode 100644 index 00000000..c7068c6a --- /dev/null +++ b/v4/tests/test_guard.c @@ -0,0 +1,213 @@ +/* test_guard.c -- the 5% safety boundary. + * + * A guard band whose only assertion is "the patterns still look right" has not + * been shown to catch anything. These tests therefore do three things a + * structural test cannot: + * + * 1. pin the sizing arithmetic, including the case that makes a 5% margin + * evaporate -- a short list, where 5% rounds down to zero elements and a + * zero-width guard is a comment rather than a boundary; + * 2. index past each end of a real stack on purpose, and require the check to + * fail, and require it to say *which* end was hit; + * 3. run the real push/pop paths and require the boundary to survive them, so + * a boundary that fires on ordinary use is caught as a false alarm rather + * than being tuned into uselessness. + */ +#include "v4/guard.h" +#include "v4/stack.h" + +#include +#include +#include + +static int failures = 0; +static int checks = 0; + +#define CHECK(cond, ...) \ + do { \ + checks++; \ + if (!(cond)) { \ + failures++; \ + printf(" FAIL %s:%d: ", __FILE__, __LINE__); \ + printf(__VA_ARGS__); \ + printf("\n"); \ + } \ + } while (0) + +static void test_sizing_rounds_up(void) +{ + /* 5% of each, rounded up. */ + CHECK(V4_GUARD_ELEMS(20) == 1, "5%% of 20 is 1, got %u", V4_GUARD_ELEMS(20)); + CHECK(V4_GUARD_ELEMS(40) == 2, "5%% of 40 is 2, got %u", V4_GUARD_ELEMS(40)); + CHECK(V4_GUARD_ELEMS(100) == 5, "5%% of 100 is 5, got %u", V4_GUARD_ELEMS(100)); + CHECK(V4_GUARD_ELEMS(1000) == 50, "5%% of 1000 is 50, got %u", V4_GUARD_ELEMS(1000)); + CHECK(V4_GUARD_ELEMS(2000) == 100, "5%% of 2000 is 100, got %u", V4_GUARD_ELEMS(2000)); +} + +static void test_sizing_never_zero(void) +{ + /* The case that matters. 5% of anything under 20 rounds to 0 by + * truncation, and a guard of zero elements catches nothing at all while + * still reading as "5% boundary" in the source. */ + for (unsigned n = 1; n < 20u; n++) { + unsigned g = V4_GUARD_ELEMS(n); + CHECK(g >= 1u, "a %u-element list got a %u-element boundary", n, g); + } + CHECK(V4_GUARD_ELEMS(1) == 1, "1-element list boundary"); + CHECK(V4_GUARD_ELEMS(3) == 1, "3-element list boundary"); + CHECK(V4_GUARD_ELEMS(8) == 1, "8-element list boundary"); + CHECK(V4_GUARD_ELEMS(19) == 1, "19-element list boundary"); + CHECK(V4_GUARD_ELEMS(V4_DATA_RING) == 1, "data ring boundary at depth 8"); + CHECK(V4_GUARD_ELEMS(V4_RET_RING) == 1, "return ring boundary at depth 8"); +} + +static void test_patterns_are_distinct_at_this_width(void) +{ + /* The compile-time assertion in guard.h covers this, but the point of + * distinct patterns is "which end", and that is only meaningful if it + * survives truncation to the cell width. */ + CHECK(V4_GUARD_PATTERN_HEAD != V4_GUARD_PATTERN_TAIL, + "head and tail patterns are equal at V4_CELL_BITS=%d", V4_CELL_BITS); + CHECK((v4_ucell)V4_GUARD_PATTERN_HEAD != 0u, "head pattern truncated to 0"); + CHECK((v4_ucell)V4_GUARD_PATTERN_TAIL != 0u, "tail pattern truncated to 0"); +} + +static void test_fill_and_intact(void) +{ + v4_cell band[7]; + v4_guard_fill(band, 7, V4_GUARD_PATTERN_HEAD); + CHECK(v4_guard_intact(band, 7, V4_GUARD_PATTERN_HEAD), "filled band intact"); + CHECK(!v4_guard_intact(band, 7, V4_GUARD_PATTERN_TAIL), + "a head-filled band must not read as a tail band"); + + /* Every element is checked, not just the ends. */ + for (unsigned i = 0; i < 7; i++) { + band[i] = 0; + CHECK(!v4_guard_intact(band, 7, V4_GUARD_PATTERN_HEAD), + "band intact after corrupting interior element %u", i); + v4_guard_fill(band, 7, V4_GUARD_PATTERN_HEAD); + } +} + +static void test_reset_installs_boundaries(void) +{ + v4_dstack d; + v4_rstack r; + + /* A struct that has never been reset holds whatever was on the stack, so + * the boundary cannot be assumed present. Poison both first: that the + * check fails before reset is the point, since it is what proves the + * check is reading the boundary and not returning a constant. */ + memset(&d, 0xA5, sizeof d); + memset(&r, 0xA5, sizeof r); + + CHECK(!v4_dstack_guards_intact(&d), + "data boundaries must not read as intact before reset"); + CHECK(!v4_rstack_guards_intact(&r), + "return boundaries must not read as intact before reset"); + + v4_dstack_reset(&d); + v4_rstack_reset(&r); + CHECK(v4_dstack_guards_intact(&d), "data boundaries intact after reset"); + CHECK(v4_rstack_guards_intact(&r), "return boundaries intact after reset"); +} + +static void test_head_overrun_is_detected(void) +{ + /* Deliberately index one element before the ring: exactly what a lost + * modulo or a sign error on the head arithmetic would do. */ + v4_dstack d; + v4_dstack_reset(&d); + CHECK(v4_dstack_guards_intact(&d), "intact before the deliberate overrun"); + + d.guard_head[0] = (v4_cell)V4_GUARD_PATTERN_TAIL; /* wrong pattern too */ + CHECK(!v4_dstack_guards_intact(&d), + "head overrun past the data ring was not detected"); + /* Which end is answerable because the two patterns differ. */ + CHECK((v4_ucell)d.guard_head[0] != V4_GUARD_PATTERN_HEAD, + "head boundary no longer holds its own pattern"); + + v4_dstack_reset(&d); + CHECK(v4_dstack_guards_intact(&d), "intact after re-reset"); +} + +static void test_tail_overrun_is_detected(void) +{ + v4_dstack d; + v4_dstack_reset(&d); + + d.guard_tail[0] = 0; + CHECK(!v4_dstack_guards_intact(&d), + "tail overrun past the data ring was not detected"); + + v4_dstack_reset(&d); + CHECK(v4_dstack_guards_intact(&d), "intact after re-reset"); +} + +static void test_return_stack_boundaries(void) +{ + v4_rstack r; + v4_rstack_reset(&r); + CHECK(v4_rstack_guards_intact(&r), "return boundaries intact after reset"); + + r.guard_head[0] = 0; + CHECK(!v4_rstack_guards_intact(&r), "return head overrun not detected"); + v4_rstack_reset(&r); + + r.guard_tail[V4_RET_BOUND - 1u] = 0; + CHECK(!v4_rstack_guards_intact(&r), "return tail overrun not detected"); + v4_rstack_reset(&r); + CHECK(v4_rstack_guards_intact(&r), "return intact after re-reset"); +} + +static void test_ordinary_use_never_touches_the_boundaries(void) +{ + /* The other half of the contract: a boundary that fires on legitimate use + * is worse than none, because it trains you to ignore it. Drive both + * stacks hard, well past their depths, and require the boundaries to + * survive every operation. */ + v4_dstack d; + v4_rstack r; + v4_dstack_reset(&d); + v4_rstack_reset(&r); + + uint64_t s = 0x243F6A8885A308D3ull; + for (int i = 0; i < 50000; i++) { + s ^= s << 13; s ^= s >> 7; s ^= s << 17; + + v4_dstack_push(&d, (v4_cell)s); + v4_rstack_push(&r, (v4_cell)(s >> 11)); + if (i & 1) { + (void)v4_dstack_pop(&d); + (void)v4_rstack_pop(&r); + } + } + CHECK(v4_dstack_guards_intact(&d), + "data boundary damaged by ordinary push/pop"); + CHECK(v4_rstack_guards_intact(&r), + "return boundary damaged by ordinary push/pop"); + + /* head must still be in range, which is the invariant the boundary exists + * to police. */ + CHECK(d.head < V4_DATA_RING, "data head %u out of range", d.head); + CHECK(r.head < V4_RET_RING, "return head %u out of range", r.head); +} + +int main(void) +{ + printf("v4 guard tests: V4_CELL_BITS=%d, data bound %d, return bound %d\n", + V4_CELL_BITS, V4_DATA_BOUND, V4_RET_BOUND); + + test_sizing_rounds_up(); + test_sizing_never_zero(); + test_patterns_are_distinct_at_this_width(); + test_fill_and_intact(); + test_reset_installs_boundaries(); + test_head_overrun_is_detected(); + test_tail_overrun_is_detected(); + test_return_stack_boundaries(); + test_ordinary_use_never_touches_the_boundaries(); + + printf(" %d checks, %d failures\n", checks, failures); + return failures ? 1 : 0; +} diff --git a/v4/tests/test_heat.c b/v4/tests/test_heat.c new file mode 100644 index 00000000..914934df --- /dev/null +++ b/v4/tests/test_heat.c @@ -0,0 +1,109 @@ +/* test_heat.c -- heat and anti-clock. */ +#include "v4/heat.h" +#include +#include +#include + +static int failures = 0; +static int checks = 0; + +#define CHECK(cond, ...) \ + do { \ + checks++; \ + if (!(cond)) { \ + failures++; \ + printf(" FAIL %s:%d: ", __FILE__, __LINE__); \ + printf(__VA_ARGS__); \ + printf("\n"); \ + } \ + } while (0) + +static void test_reset(void) +{ + v4_heat h; + memset(&h, 0xFF, sizeof h); + v4_heat_reset(&h); + + for (unsigned i = 0; i < V4_OPCODE_COUNT; i++) { + CHECK(h.op[i] == 0, "op %u heat non-zero after reset", i); + } + for (unsigned i = 0; i < V4_HEAT_MAX_CALL_TARGETS; i++) { + CHECK(h.call[i] == 0, "call target %u heat non-zero after reset", i); + CHECK(!v4_heat_call_is_frozen(&h, (v4_cell)i), + "call target %u frozen after reset", i); + } + v4_uheat_t ac = 999; + v4_heat_on_retire(&h, V4_OP_NOP, &ac); + CHECK(ac == 1000, "anticlock not advanced"); + CHECK(h.op[V4_OP_NOP] == 1, "nop heat"); +} + +static void test_retire_advances_anticlock_and_opcode(void) +{ + v4_heat h; + v4_heat_reset(&h); + v4_uheat_t ac = 0; + for (int i = 0; i < 100; i++) { + v4_heat_on_retire(&h, V4_OP_ADD, &ac); + } + CHECK(ac == 100, "anticlock"); + CHECK(h.op[V4_OP_ADD] == 100, "add heat"); + for (unsigned i = 0; i < V4_OPCODE_COUNT; i++) { + if (i == V4_OP_ADD) continue; + CHECK(h.op[i] == 0, "other op %u", i); + } +} + +static void test_call_advances_target(void) +{ + v4_heat h; + v4_heat_reset(&h); + v4_heat_on_call(&h, 10); + v4_heat_on_call(&h, 10); + v4_heat_on_call(&h, 5); + CHECK(v4_heat_call_get(&h, 10) == 2, "target 10"); + CHECK(v4_heat_call_get(&h, 5) == 1, "target 5"); + CHECK(v4_heat_call_get(&h, 1) == 0, "target 1"); +} + +static void test_freeze(void) +{ + v4_heat h; + v4_heat_reset(&h); + v4_heat_on_call(&h, 7); + v4_heat_call_freeze(&h, 7); + CHECK(v4_heat_call_is_frozen(&h, 7), "frozen"); + v4_heat_on_call(&h, 7); + CHECK(v4_heat_call_get(&h, 7) == 1, "still 1"); + CHECK(v4_heat_call_set(&h, 7, 100) == 0, "set returns 0 when frozen"); + CHECK(v4_heat_call_get(&h, 7) == 1, "unchanged"); + v4_heat_call_unfreeze(&h, 7); + CHECK(!v4_heat_call_is_frozen(&h, 7), "unfrozen"); + CHECK(v4_heat_call_set(&h, 7, 42) == 1, "set allowed"); + CHECK(v4_heat_call_get(&h, 7) == 42, "changed"); +} + +static void test_out_of_range_ignored(void) +{ + v4_heat h; + v4_heat_reset(&h); + v4_heat_on_call(&h, (v4_cell)V4_HEAT_MAX_CALL_TARGETS + 5); + CHECK(v4_heat_call_get(&h, (v4_cell)V4_HEAT_MAX_CALL_TARGETS + 5) == 0, + "out of range call ignored"); + CHECK(v4_heat_call_set(&h, (v4_cell)-1, 123) == 0, "set out of range"); + CHECK(v4_heat_call_is_frozen(&h, (v4_cell)-1) == 0, "frozen check"); +} + +int main(void) +{ + printf("v4 heat tests: V4_CELL_BITS=%d\n", V4_CELL_BITS); + + test_reset(); + test_retire_advances_anticlock_and_opcode(); + test_call_advances_target(); + test_freeze(); + test_out_of_range_ignored(); + + printf(" %d checks, %d failures\n", checks, failures); + return failures ? 1 : 0; +} diff --git a/v4/tests/test_iword.c b/v4/tests/test_iword.c new file mode 100644 index 00000000..7e87add7 --- /dev/null +++ b/v4/tests/test_iword.c @@ -0,0 +1,400 @@ +/* test_iword.c -- the instruction-word format. + * + * The properties pinned here are the ones the rest of the machine is built on + * and the ones most likely to be got wrong by a plausible-looking edit: + * + * - the six slots occupy the bit ranges the diagram in section 1.2 gives + * them, with slot 0 highest; + * - the reach column (27 / 22 / 17 / 12 for slots 0-3) is what the layout + * actually produces, rather than four independently-entered constants; + * - branches are illegal in slots 4 and 5; + * - the two spare bits are inert, so a word that differs only in them + * decodes identically; + * - a branch is page-relative: it replaces the low bits of P and preserves + * the rest; + * - no opcode name collides with a FORTH-79 word name, which is the stated + * reason for the `inv` and `xor` renames in section 1.3. + */ +#include "v4/iword.h" + +#include +#include + +static int failures = 0; +static int checks = 0; + +#define CHECK(cond, ...) \ + do { \ + checks++; \ + if (!(cond)) { \ + failures++; \ + printf(" FAIL %s:%d: ", __FILE__, __LINE__); \ + printf(__VA_ARGS__); \ + printf("\n"); \ + } \ + } while (0) + +static v4_iword word_of(const unsigned op[6], unsigned spare) +{ + return v4_iword_assemble(op, spare); +} + +static void test_slot_bit_ranges(void) +{ + /* The diagram's own boundaries, entered independently of the macros so the + * macros are checked rather than merely used. */ + static const unsigned want_high[6] = { 31, 26, 21, 16, 11, 6 }; + static const unsigned want_low[6] = { 27, 22, 17, 12, 7, 2 }; + + for (unsigned k = 0; k < 6; k++) { + CHECK(V4_SLOT_HIGH_BIT(k) == want_high[k], + "slot %u high bit: macro says %u, diagram says %u", k, + V4_SLOT_HIGH_BIT(k), want_high[k]); + CHECK(V4_SLOT_LOW_BIT(k) == want_low[k], + "slot %u low bit: macro says %u, diagram says %u", k, + V4_SLOT_LOW_BIT(k), want_low[k]); + } + + /* Each slot is 5 bits, and the six slots do not overlap. */ + for (unsigned k = 0; k < 6; k++) { + CHECK(V4_SLOT_HIGH_BIT(k) - V4_SLOT_LOW_BIT(k) == 4u, + "slot %u is not 5 bits wide", k); + } + CHECK(V4_SLOT_LOW_BIT(5) - V4_SPARE_BITS == 0u, + "slot 5 does not end just above the spare bits"); +} + +static void test_roundtrip_all_opcodes(void) +{ + /* Every one of the 32 opcodes, in every slot, survives assemble+decode. */ + for (unsigned op = 0; op < 32u; op++) { + for (unsigned k = 0; k < 6; k++) { + unsigned o[6]; + for (unsigned j = 0; j < 6; j++) o[j] = 0x1Du; /* distinct filler */ + o[k] = op; + v4_iword w = word_of(o, 0u); + CHECK(w != 0xFFFFFFFFu, "assemble rejected opcode %u", op); + CHECK(v4_iword_op(w, k) == op, + "opcode %u in slot %u decoded as %u", op, k, + v4_iword_op(w, k)); + /* And the other slots are undisturbed. */ + for (unsigned j = 0; j < 6; j++) { + if (j == k) continue; + CHECK(v4_iword_op(w, j) == 0x1Du, + "assembling %u into slot %u disturbed slot %u", op, k, j); + } + } + } +} + +static void test_slots_are_independent(void) +{ + /* All 32^6 words cannot be enumerated, but the packing is linear, so + * checking that each slot's bits land only in its own range is enough. */ + for (unsigned k = 0; k < 6; k++) { + unsigned o[6] = { 0, 0, 0, 0, 0, 0 }; + o[k] = 0x1Fu; /* all five bits set */ + v4_iword w = word_of(o, 0u); + v4_iword expect = (v4_iword)0x1Fu << V4_SLOT_LOW_BIT(k); + CHECK(w == expect, + "slot %u: word is %08lX, expected %08lX", k, + (unsigned long)w, (unsigned long)expect); + } +} + +static void test_spare_bits_are_inert_for_decode(void) +{ + /* The two spare low bits sit below every slot, so they are never executed. + * A word that differs only in them must decode to the same six opcodes -- + * otherwise the spare bits would have acquired decode meaning. */ + unsigned o[6] = { 2, 3, 5, 6, 7, 1 }; + v4_iword a = word_of(o, 0u); + v4_iword b = word_of(o, 3u); /* both spare patterns */ + + for (unsigned k = 0; k < 6; k++) { + CHECK(v4_iword_op(a, k) == v4_iword_op(b, k), + "spare bits changed the opcode in slot %u", k); + } + CHECK(v4_iword_spare(a) == 0u, "spare bits of word a"); + CHECK(v4_iword_spare(b) == 3u, "spare bits of word b"); +} + +static void test_spare_bits_are_branch_address_bits(void) +{ + /* The opposite property, and the one that is easy to get wrong: the spare + * bits are BELOW every slot, so "all bits to the right of its slot" -- the + * branch target, per section 1.2 -- includes them. They are the low bits + * of a branch address, not padding. Pinned here so that a later "cleanup" + * that treats them as unusable address bits fails a test instead of costing + * two bits of reach off every branch in the machine. */ + /* Only slot 0 is set, so every bit below it -- all 27 of them, spare bits + * included -- is zero and the branch target is the spare field alone. */ + unsigned o[6] = { 2, 0, 0, 0, 0, 0 }; + v4_iword a = word_of(o, 0u); + v4_iword b = word_of(o, 3u); /* both spare patterns */ + + CHECK(v4_iword_op(a, 0) == V4_OP_JUMP, "slot 0 should be jump"); + CHECK(v4_iword_target(a, 0u) == 0u, + "word a (spare 0) should have a zero low target field, got %u", + v4_iword_target(a, 0u)); + CHECK(v4_iword_target(b, 0u) == 3u, + "word b (spare 3) should carry 3 in the low address bits, got %u", + v4_iword_target(b, 0u)); + CHECK(v4_iword_branch((v4_cell)0, a, 0u) == 0, "branch with spare 0"); + CHECK(v4_iword_branch((v4_cell)0, b, 0u) == 3, + "branch with spare 3 should land on address 3, got %lld", + (long long)v4_iword_branch((v4_cell)0, b, 0u)); + + /* Every legal branch slot reaches bit 0, so the spare bits are address in + * all four of them. */ + for (unsigned k = 0; k < 4; k++) { + CHECK((v4_iword_slot_mask(k) & 3u) == 3u, + "slot %u branch target does not reach the spare bits", k); + } +} + +static void test_reach_column(void) +{ + /* The reach table from section 1.2, entered as literals. The + * implementation derives these from the layout; this asserts the two + * agree, which is the whole reason to derive rather than hard-code. */ + static const unsigned want_bits[4] = { 27, 22, 17, 12 }; + static const unsigned want_reach[4] = { + 0x8000000u, /* 2^27 words = whole address space */ + 0x400000u, /* 2^22 words = 4M words */ + 0x20000u, /* 2^17 words = 128K words */ + 0x1000u /* 2^12 words = 4K words */ + }; + + for (unsigned k = 0; k < 4; k++) { + CHECK(V4_BRANCH_ADDR_BITS(k) == want_bits[k], + "slot %u address bits: %u, spec says %u", k, + V4_BRANCH_ADDR_BITS(k), want_bits[k]); + CHECK(v4_iword_slot_mask(k) + 1u == want_reach[k], + "slot %u reach: %u words, spec table implies %u", k, + v4_iword_slot_mask(k) + 1u, want_reach[k]); + } +} + +static void test_branch_targets_take_all_low_bits(void) +{ + /* A target is every bit to the right of the slot, not just the low 5 or the + * low 12. Set a pattern of all-ones in the low region and confirm each + * slot recovers exactly its own low bits. */ + for (unsigned k = 0; k < 4; k++) { + v4_iword w = 0xFFFFFFFFu; /* every slot and spare bit set */ + uint32_t t = v4_iword_target(w, k); + uint32_t mask = v4_iword_slot_mask(k); + CHECK(t == mask, + "slot %u target from all-ones word is %08lX, expected %08lX", k, + (unsigned long)t, (unsigned long)mask); + + /* And the slot's own five bits must be excluded from its target. */ + unsigned op_in_slot = v4_iword_op(w, k); + CHECK(op_in_slot == 0x1Fu, "slot %u opcode from all-ones", k); + } +} + +static void test_branch_legality(void) +{ + for (unsigned k = 0; k < 4; k++) { + CHECK(v4_iword_branch_legal(k), "slot %u should allow branches", k); + } + for (unsigned k = 4; k < 6; k++) { + CHECK(!v4_iword_branch_legal(k), + "slot %u must not allow branches (section 1.2)", k); + } +} + +static void test_page_relative_branch(void) +{ + /* "That target replaces the same low bits of P (page-relative, as in the + * F18)." A branch inside one page must not disturb the bits above it, and + * must be able to reach every address in its page. */ + for (unsigned k = 0; k < 4; k++) { + uint32_t mask = v4_iword_slot_mask(k); + v4_ucell page = ~(v4_ucell)mask; /* a high value, low bits zero */ + v4_cell p = (v4_cell)page; + + for (uint32_t target = 0; target <= mask; target = target * 2u + 1u) { + v4_iword w = target; /* target lives in the low bits */ + v4_cell got = v4_iword_branch(p, w, k); + v4_ucell want = ((v4_ucell)page & ~(v4_ucell)mask) + | (v4_ucell)target; + CHECK((v4_ucell)got == want, + "slot %u: P=%lld target=%u gave %lld, expected %llu", k, + (long long)p, target, (long long)got, + (unsigned long long)want); + CHECK((v4_ucell)got == (v4_ucell)(page ^ target), + "slot %u: branch is not page-relative", k); + if (target > mask / 2u && target != mask) break; + } + } +} + +static void test_page_relative_branch_preserves_high_page(void) +{ + /* Same, from several distinct pages, to be sure nothing is hard-wired to + * page zero. */ + static const v4_ucell pages[] = { + (v4_ucell)0, + (v4_ucell)1, + (v4_ucell)0x80000000ull, + ~(v4_ucell)0 + }; + for (unsigned k = 0; k < 4; k++) { + uint32_t mask = v4_iword_slot_mask(k); + for (unsigned i = 0; i < sizeof(pages) / sizeof(pages[0]); i++) { + v4_cell p = (v4_cell)pages[i]; + v4_cell got = v4_iword_branch(p, 0u, k); + v4_ucell want = (pages[i] & ~(v4_ucell)mask); + CHECK((v4_ucell)got == want, + "slot %u: P=%llX with target 0 gave %llX, expected %llX", k, + (unsigned long long)pages[i], (unsigned long long)got, + (unsigned long long)want); + } + } +} + +static void test_branch_opcode_set(void) +{ + /* Exactly five opcodes take a target, and they are the five section 1.2 + * names. Everything else must not, so that a non-branch slot's low bits + * stay available to the compiler. */ + static const int want[32] = { + /* 0 */ 0, /* 1 */ 0, /* 2 jump */ 1, /* 3 call */ 1, /* 4 */ 0, + /* 5 next */ 1, /* 6 if */ 1, /* 7 -if */ 1, /* 8 */ 0, /* 9 */ 0, + /* A */ 0, /* B */ 0, /* C */ 0, /* D */ 0, /* E */ 0, /* F */ 0, + /* 10 */ 0, /* 11 */ 0, /* 12 */ 0, /* 13 */ 0, /* 14 */ 0, /* 15 */ 0, + /* 16 */ 0, /* 17 */ 0, /* 18 */ 0, /* 19 */ 0, /* 1A */ 0, + /* 1B */ 0, /* 1C */ 0, /* 1D */ 0, /* 1E */ 0, /* 1F */ 0 + }; + unsigned nbranch = 0; + for (unsigned op = 0; op < 32u; op++) { + int got = v4_op_is_branch(op); + CHECK(got == want[op], "opcode %02X: is_branch=%d, expected %d", op, + got, want[op]); + nbranch += (unsigned)got; + } + CHECK(nbranch == 5u, "expected exactly 5 branch opcodes, found %u", nbranch); +} + +static void test_opcode_enum_matches_spec_numbering(void) +{ + /* Each named opcode must carry the number section 1.3 gives it. Transposed + * or off-by-one enum entries are the classic way a 32-entry table rots. */ + CHECK(V4_OP_SEMI == 0x00, "opcode ;"); CHECK(V4_OP_EX == 0x01, "opcode ex"); + CHECK(V4_OP_JUMP == 0x02, "opcode jump"); CHECK(V4_OP_CALL == 0x03, "opcode call"); + CHECK(V4_OP_UNEXT == 0x04, "opcode unext"); CHECK(V4_OP_NEXT == 0x05, "opcode next"); + CHECK(V4_OP_IF == 0x06, "opcode if"); CHECK(V4_OP_MINUS_IF == 0x07, "opcode -if"); + CHECK(V4_OP_FETCH_P == 0x08, "opcode @p"); CHECK(V4_OP_FETCH_INC == 0x09, "opcode @+"); + CHECK(V4_OP_FETCH_B == 0x0A, "opcode @b"); CHECK(V4_OP_FETCH_A == 0x0B, "opcode @"); + CHECK(V4_OP_STORE_P == 0x0C, "opcode !p"); CHECK(V4_OP_STORE_INC == 0x0D, "opcode !+"); + CHECK(V4_OP_STORE_B == 0x0E, "opcode !b"); CHECK(V4_OP_STORE_A == 0x0F, "opcode !"); + CHECK(V4_OP_MUL_STEP == 0x10, "opcode +*"); CHECK(V4_OP_TWO_STAR == 0x11, "opcode 2*"); + CHECK(V4_OP_TWO_SLASH == 0x12, "opcode 2/"); CHECK(V4_OP_INV == 0x13, "opcode inv"); + CHECK(V4_OP_ADD == 0x14, "opcode +"); CHECK(V4_OP_AND == 0x15, "opcode and"); + CHECK(V4_OP_XOR == 0x16, "opcode xor"); CHECK(V4_OP_DROP == 0x17, "opcode drop"); + CHECK(V4_OP_DUP == 0x18, "opcode dup"); CHECK(V4_OP_RPOP == 0x19, "opcode pop"); + CHECK(V4_OP_OVER == 0x1A, "opcode over"); CHECK(V4_OP_PUSH_A == 0x1B, "opcode a"); + CHECK(V4_OP_NOP == 0x1C, "opcode nop"); CHECK(V4_OP_PUSH == 0x1D, "opcode push"); + CHECK(V4_OP_BANG_B == 0x1E, "opcode b!"); CHECK(V4_OP_BANG_A == 0x1F, "opcode a!"); + CHECK(V4_OPCODE_COUNT == 0x20, "opcode count"); +} + +static void test_ambiguous_f18_names_were_renamed(void) +{ + /* Section 1.3 says: "Opcode numbering follows the F18. Two names differ + * from Moore's: F18 `-` is renamed `inv` and F18 `or` (which is + * exclusive-or) is renamed `xor`, so instruction names never collide with + * FORTH-79 word names." + * + * The renames are the part that carries weight, and they are asserted here. + * `-` and `or` are exactly the dangerous case: Moore's F18 uses them with + * meanings that differ from the FORTH-79 words of the same name, so an + * instruction table containing either would be ambiguous rather than merely + * duplicated. `and` and `xor` are also FORTH-79 words, but `and` agrees + * with FORTH and `xor` is F18's spelling, so neither is ambiguous. + * + * NOTE: the trailing clause of that sentence is an overclaim, and the test + * deliberately does not assert it. `dup`, `drop`, `over`, `and`, `if` and + * `+` are all instruction names in section 1.3 and all FORTH-79 words, + * spelled identically and meaning the same thing. They coincide; they do + * not collide. What the renames prevent is a *divergent* meaning under a + * shared name, which is the property asserted above. Raised for the spec + * text rather than silently encoded here as if it were true. */ + static const char *opnames[32] = { + ";", "ex", "jump", "call", "unext", "next", "if", "-if", + "@p", "@+", "@b", "@", "!p", "!+", "!b", "!", + "+*", "2*", "2/", "inv", "+", "and", "xor", "drop", + "dup", "pop", "over", "a", "nop", "push", "b!", "a!" + }; + + CHECK(strcmp(opnames[V4_OP_INV], "inv") == 0, + "opcode 13 must be named inv, got \"%s\"", opnames[V4_OP_INV]); + CHECK(strcmp(opnames[V4_OP_XOR], "xor") == 0, + "opcode 16 must be named xor, got \"%s\"", opnames[V4_OP_XOR]); + + /* The two names the renames exist to remove must appear nowhere. */ + for (unsigned i = 0; i < 32u; i++) { + CHECK(strcmp(opnames[i], "-") != 0, + "F18 `-` must not survive as an instruction name (slot %u)", i); + CHECK(strcmp(opnames[i], "or") != 0, + "F18 `or` must not survive as an instruction name (slot %u)", i); + CHECK(strcmp(opnames[i], "OR") != 0, + "F18 `or` must not survive as an instruction name (slot %u)", i); + } + + /* The five branch opcodes, by the names section 1.2 lists. */ + CHECK(strcmp(opnames[V4_OP_JUMP], "jump") == 0, "opcode 2 name"); + CHECK(strcmp(opnames[V4_OP_CALL], "call") == 0, "opcode 3 name"); + CHECK(strcmp(opnames[V4_OP_NEXT], "next") == 0, "opcode 5 name"); + CHECK(strcmp(opnames[V4_OP_IF], "if") == 0, "opcode 6 name"); + CHECK(strcmp(opnames[V4_OP_MINUS_IF], "-if") == 0, "opcode 7 name"); +} + +static void test_assemble_rejects_out_of_range(void) +{ + unsigned o[6] = { 0, 0, 0, 0, 0, 0 }; + o[3] = 32u; /* will not fit in 5 bits */ + CHECK(v4_iword_assemble(o, 0u) == 0xFFFFFFFFu, + "assemble must reject a 6-bit opcode"); + o[3] = 0; + CHECK(v4_iword_assemble(o, 4u) == 0xFFFFFFFFu, + "assemble must reject spare bits above 3"); +} + +static void test_out_of_range_slots_are_inert(void) +{ + /* Slots past 5 do not exist. The decode must answer deterministically + * rather than shift by a nonsense amount. */ + v4_iword w = 0xFFFFFFFFu; + CHECK(v4_iword_op(w, 6u) == 0u, "op in slot 6 must be 0"); + CHECK(v4_iword_target(w, 6u) == 0u, "target in slot 6 must be 0"); + CHECK(v4_iword_slot_mask(6u) == 0u, "mask in slot 6 must be 0"); + CHECK(!v4_iword_branch_legal(6u), "slot 6 must not allow branches"); +} + +int main(void) +{ + printf("v4 iword tests: V4_CELL_BITS=%d\n", V4_CELL_BITS); + + test_slot_bit_ranges(); + test_roundtrip_all_opcodes(); + test_slots_are_independent(); + test_spare_bits_are_inert_for_decode(); + test_spare_bits_are_branch_address_bits(); + test_reach_column(); + test_branch_targets_take_all_low_bits(); + test_branch_legality(); + test_page_relative_branch(); + test_page_relative_branch_preserves_high_page(); + test_branch_opcode_set(); + test_opcode_enum_matches_spec_numbering(); + test_ambiguous_f18_names_were_renamed(); + test_assemble_rejects_out_of_range(); + test_out_of_range_slots_are_inert(); + + printf(" %d checks, %d failures\n", checks, failures); + return failures ? 1 : 0; +} diff --git a/v4/tests/test_node.c b/v4/tests/test_node.c new file mode 100644 index 00000000..6a750856 --- /dev/null +++ b/v4/tests/test_node.c @@ -0,0 +1,266 @@ +/* test_node.c -- the node: registers, memory, and the boundary on memory. + * + * The memory boundary does a job the stack boundaries do not: it is the landing + * place for a *linear* index error -- mem[-1], mem[V4_NODE_WORDS] -- which is + * inside the struct and therefore invisible to AddressSanitizer. + * + * It explicitly does NOT cover an out-of-range *word address*, where P, A or B + * has left the address space. That lands gigabytes away, outside any band. + * DECOMPOSITION.md does not say what such an access should do, so no policy is + * invented here; instead the limitation is measured and asserted, so the claim + * in node.h cannot rot. Closing that hole is a ruling on out-of-range + * addressing, not a wider band. + */ +#include "v4/node.h" + +#include +#include +#include +#include +#include + +static int failures = 0; +static int checks = 0; + +#define CHECK(cond, ...) \ + do { \ + checks++; \ + if (!(cond)) { \ + failures++; \ + printf(" FAIL %s:%d: ", __FILE__, __LINE__); \ + printf(__VA_ARGS__); \ + printf("\n"); \ + } \ + } while (0) + +static void test_geometry(void) +{ + /* The boundary is 5% of memory at each end, rounded up, never zero. */ + CHECK(V4_MEM_BOUND == V4_GUARD_ELEMS(V4_NODE_WORDS), + "memory boundary is not 5%% of %u words", V4_NODE_WORDS); + CHECK(V4_MEM_BOUND >= 1u, "memory boundary must be at least one word"); + CHECK((unsigned long)V4_MEM_BOUND * 100u + >= (unsigned long)V4_NODE_WORDS * V4_GUARD_PCT, + "memory boundary %u is less than %u%% of %u", V4_MEM_BOUND, + V4_GUARD_PCT, V4_NODE_WORDS); + + /* At the default size that is a real cost, and naming it here means the + * number is on the record rather than discovered from a memory report. */ + printf(" node: %u words + %u head + %u tail boundary " + "(%.1f%% overhead)\n", + V4_NODE_WORDS, V4_MEM_BOUND, V4_MEM_BOUND, + 100.0 * 2.0 * (double)V4_MEM_BOUND / (double)V4_NODE_WORDS); +} + +static void test_reset_state(void) +{ + v4_node n; + v4_node_reset(&n); + + CHECK(n.p == 0, "P after reset"); + CHECK(n.a == 0, "A after reset"); + CHECK(n.b == 0, "B after reset"); + CHECK(v4_node_guards_intact(&n), "all boundaries intact after reset"); + + /* T, S and R live in the stacks, so they are checked through the stack + * API rather than as node fields. */ + CHECK(v4_dstack_peek(&n.ds) == 0, "T after reset"); + CHECK(v4_dstack_peek2(&n.ds) == 0, "S after reset"); + CHECK(v4_rstack_peek(&n.rs) == 0, "R after reset"); +} + +static void test_guards_absent_before_reset(void) +{ + /* A node that has never been reset holds whatever was on the stack. The + * check must notice, which is what proves it reads the boundary rather than + * returning a constant. */ + v4_node *n = (v4_node *)malloc(sizeof *n); + if (n == NULL) { + failures++; + printf(" FAIL %s:%d: out of memory\n", __FILE__, __LINE__); + return; + } + memset(n, 0xA5, sizeof *n); + CHECK(!v4_node_guards_intact(n), + "boundaries must not read as intact before reset"); + v4_node_reset(n); + CHECK(v4_node_guards_intact(n), "boundaries intact after reset"); + free(n); +} + +static void test_load_store_roundtrip(void) +{ + v4_node n; + v4_node_reset(&n); + + /* Every word, not a sample: a stray boundary in the middle of memory would + * not be found by spot checks. */ + for (v4_cell i = 0; i < (v4_cell)V4_NODE_WORDS; i++) { + v4_node_store(&n, i, i * 3 + 1); + } + for (v4_cell i = 0; i < (v4_cell)V4_NODE_WORDS; i++) { + CHECK(v4_node_load(&n, i) == i * 3 + 1, + "word %lld: got %lld want %lld", (long long)i, + (long long)v4_node_load(&n, i), (long long)(i * 3 + 1)); + } + CHECK(v4_node_guards_intact(&n), "memory boundary survived a full sweep"); +} + +static void test_load_store_edges(void) +{ + /* The first and last words, which are the ones adjacent to the boundary. + * A boundary that is a word too wide would quietly steal word 0 or the + * last word, and the memory would still pass every interior test. */ + v4_node n; + v4_node_reset(&n); + + v4_node_store(&n, 0, 0x11111111); + v4_node_store(&n, (v4_cell)V4_NODE_WORDS - 1, 0x22222222); + CHECK(v4_node_load(&n, 0) == 0x11111111, "word 0 did not take its value"); + CHECK(v4_node_load(&n, (v4_cell)V4_NODE_WORDS - 1) == 0x22222222, + "last word did not take its value"); + CHECK(v4_node_guards_intact(&n), "edge writes disturbed the boundary"); +} + +static void test_boundary_is_adjacent_to_memory(void) +{ + /* The band only catches a linear index error if it is immediately next to + * mem, so adjacency is asserted rather than assumed -- the compiler is free + * to reorder struct members, and a band that drifted to the far end of the + * struct would silently stop catching anything. */ + CHECK(offsetof(v4_node, mem_guard_tail) + == offsetof(v4_node, mem) + sizeof(((v4_node *)0)->mem), + "tail boundary does not start immediately after memory"); + CHECK(offsetof(v4_node, mem_guard_head) + + sizeof(((v4_node *)0)->mem_guard_head) + == offsetof(v4_node, mem), + "head boundary does not end immediately before memory"); +} + +static void test_linear_overrun_low_is_caught(void) +{ + /* A linear index error -- the kind an off-by-one in a loop bound or a + * pointer step produces. It lands in the head boundary, it is inside the + * struct so AddressSanitizer says nothing about it, and the boundary check + * is what reports it. Written through the boundary array rather than as + * mem[-1], because mem[-1] is out of bounds of a declared array and the + * standard lets the compiler do anything with it; the offsetof test above + * establishes that this *is* the word mem[-1] resolves to. */ + v4_node n; + v4_node_reset(&n); + CHECK(v4_node_guards_intact(&n), "intact before the deliberate overrun"); + + n.mem_guard_head[V4_MEM_BOUND - 1u] = (v4_cell)0xDEADBEEF; + CHECK(!v4_node_guards_intact(&n), + "a linear access before mem was not detected"); + + v4_node_reset(&n); + CHECK(v4_node_guards_intact(&n), "intact after re-reset"); +} + +static void test_linear_overrun_high_is_caught(void) +{ + v4_node n; + v4_node_reset(&n); + + n.mem_guard_tail[0] = (v4_cell)0xDEADBEEF; + CHECK(!v4_node_guards_intact(&n), + "a linear access past the last word was not detected"); + + v4_node_reset(&n); + CHECK(v4_node_guards_intact(&n), "intact after re-reset"); +} + +static void test_out_of_range_word_address_is_not_covered_by_the_band(void) +{ + /* What the band does NOT catch, asserted so the limitation stays visible + * and cannot be quietly forgotten. + * + * An out-of-range *word address* is a different animal from a linear index + * error. A v4_cell address of -1 becomes unsigned 0xFFFFFFFF, which is + * 2^32 words past mem -- 16 GB at 32-bit cells. That is far outside the + * struct, so no boundary can see it. The band was briefly documented as + * catching this; it does not, and the protection is a range check whose + * policy DECOMPOSITION.md does not define. This test records the gap by + * measuring it, so the number in node.h stays true. */ + v4_cell neg = (v4_cell)-1; + uint64_t words_out = (uint64_t)(v4_ucell)neg; + uint64_t far = words_out * (uint64_t)sizeof(v4_cell); + printf(" out-of-range word address -1 lands %llu bytes past mem " + "(%.1f GB at this width): outside the band, as documented\n", + (unsigned long long)far, (double)far / 1073741824.0); + CHECK(far > (uint64_t)sizeof(v4_node), + "an out-of-range address should land outside the node"); + + /* The band is only V4_MEM_BOUND words, so even a modest overrun is caught + * only while it is within the band. Past that it is not, which is why the + * open question is a range check and not a wider band. */ + CHECK(V4_MEM_BOUND < V4_NODE_WORDS / 2u, + "if the band were most of memory, this reasoning would be wrong"); +} + +static void test_ends_are_distinguishable(void) +{ + /* The two boundaries carry different patterns precisely so that a failure + * says which end. Checked here on memory as well as in test_guard.c on the + * ring, because "which end" is the property that makes a report actionable. */ + v4_node n; + v4_node_reset(&n); + CHECK((v4_ucell)n.mem_guard_head[0] == V4_GUARD_PATTERN_HEAD, + "memory head boundary pattern"); + CHECK((v4_ucell)n.mem_guard_tail[0] == V4_GUARD_PATTERN_TAIL, + "memory tail boundary pattern"); + CHECK(V4_GUARD_PATTERN_HEAD != V4_GUARD_PATTERN_TAIL, + "head and tail patterns are equal at V4_CELL_BITS=%d", V4_CELL_BITS); +} + +static void test_workload_never_false_alarms(void) +{ + /* A boundary that fires on legitimate use is worse than no boundary. Drive + * a workload across the whole address space, through both address registers + * and the program counter, and require every boundary to survive. */ + v4_node n; + v4_node_reset(&n); + + uint64_t s = 0xB5026F5AA96619E9ull; + for (int i = 0; i < 200000; i++) { + s ^= s << 13; s ^= s >> 7; s ^= s << 17; + + v4_cell addr = (v4_cell)(s % (uint64_t)V4_NODE_WORDS); + v4_node_store(&n, addr, (v4_cell)s); + + n.a = addr; + n.b = (v4_cell)((addr + 1u) % V4_NODE_WORDS); + n.p = (v4_cell)((addr + 2u) % V4_NODE_WORDS); + + v4_dstack_push(&n.ds, (v4_cell)s); + v4_rstack_push(&n.rs, (v4_cell)(s >> 13)); + if (i & 1) { (void)v4_dstack_pop(&n.ds); (void)v4_rstack_pop(&n.rs); } + } + CHECK(v4_node_guards_intact(&n), + "a boundary fired during ordinary workload"); + CHECK(n.p < (v4_cell)V4_NODE_WORDS, "P left the address space"); + CHECK(n.a < (v4_cell)V4_NODE_WORDS, "A left the address space"); + CHECK(n.b < (v4_cell)V4_NODE_WORDS, "B left the address space"); +} + +int main(void) +{ + printf("v4 node tests: V4_CELL_BITS=%d, %u words\n", + V4_CELL_BITS, V4_NODE_WORDS); + + test_geometry(); + test_reset_state(); + test_guards_absent_before_reset(); + test_load_store_roundtrip(); + test_load_store_edges(); + test_boundary_is_adjacent_to_memory(); + test_linear_overrun_low_is_caught(); + test_linear_overrun_high_is_caught(); + test_out_of_range_word_address_is_not_covered_by_the_band(); + test_ends_are_distinguishable(); + test_workload_never_false_alarms(); + + printf(" %d checks, %d failures\n", checks, failures); + return failures ? 1 : 0; +} diff --git a/v4/tests/test_stack.c b/v4/tests/test_stack.c new file mode 100644 index 00000000..ba166f10 --- /dev/null +++ b/v4/tests/test_stack.c @@ -0,0 +1,338 @@ +/* test_stack.c -- the F18 circular stacks, checked against an independent + * model of the same semantics. + * + * The implementation in stack.c is specified in DECOMPOSITION.md as + * "T, S + 8 circular" / "R + 8 circular". This test does not take that + * decomposition on trust. It builds a second, deliberately dumb model of + * what D-2 describes -- a flat fixed-depth circular buffer with no bounds + * check at all -- and drives both with identical operation sequences, + * requiring them to agree after every single operation. If the register/ring + * bookkeeping in stack.c has a wrong pointer direction or an off-by-one in + * the wrap, this catches it; an inspection-only check would not. + * + * Depth, ordering, and the "silently overwrites the oldest entry" behaviour + * are additionally pinned with explicit cases, because those are the three + * properties the ISA's push-heavy words actually depend on. + * + * Built and run at both V4_CELL_BITS=32 and 64; see v4/Makefile. + */ +#include "v4/stack.h" + +#include +#include + +static int failures = 0; +static int checks = 0; + +#define CHECK(cond, ...) \ + do { \ + checks++; \ + if (!(cond)) { \ + failures++; \ + printf(" FAIL %s:%d: ", __FILE__, __LINE__); \ + printf(__VA_ARGS__); \ + printf("\n"); \ + } \ + } while (0) + +/* ---- the independent reference model --------------------------------------- + * A flat circular buffer of depth N with no overflow or underflow detection, + * which is exactly what D-2 describes. top indexes the newest element. */ + +typedef struct { + v4_cell buf[64]; + unsigned top; + unsigned depth; +} flat_t; + +static void flat_reset(flat_t *f, unsigned depth) +{ + f->depth = depth; + f->top = 0; + for (unsigned i = 0; i < 64; i++) f->buf[i] = 0; +} + +static void flat_push(flat_t *f, v4_cell x) +{ + f->top = (f->top + 1u) % f->depth; + f->buf[f->top] = x; +} + +static v4_cell flat_pop(flat_t *f) +{ + v4_cell x = f->buf[f->top]; + f->top = (f->top + f->depth - 1u) % f->depth; + return x; +} + +static v4_cell flat_peek(const flat_t *f) +{ + return f->buf[f->top]; +} + +/* ---- deterministic PRNG --------------------------------------------------- + * xorshift64, so a failure is reproducible from the seed alone. No rand(), + * whose sequence is implementation-defined and would make a failure on one + * host unreproducible on another. */ + +static uint64_t rng_state = 0x9E3779B97F4A7C15ull; + +static uint64_t rng_next(void) +{ + uint64_t x = rng_state; + x ^= x << 13; + x ^= x >> 7; + x ^= x << 17; + rng_state = x; + return x; +} + +/* ---- tests ---------------------------------------------------------------- */ + +static void test_reset_is_zero(void) +{ + v4_dstack d; + v4_rstack r; + v4_dstack_reset(&d); + v4_rstack_reset(&r); + CHECK(v4_dstack_peek(&d) == 0, "data stack peek after reset != 0"); + CHECK(v4_dstack_peek2(&d) == 0, "data stack peek2 after reset != 0"); + CHECK(v4_rstack_peek(&r) == 0, "return stack peek after reset != 0"); +} + +static void test_exact_depth_data(void) +{ + /* Fill to exactly V4_DATA_DEPTH, then drain and confirm the order. */ + v4_dstack d; + flat_t f; + v4_dstack_reset(&d); + flat_reset(&f, V4_DATA_DEPTH); + + for (unsigned i = 0; i < V4_DATA_DEPTH; i++) { + v4_cell v = (v4_cell)(i + 1); + v4_dstack_push(&d, v); + flat_push(&f, v); + } + CHECK(v4_dstack_peek(&d) == (v4_cell)V4_DATA_DEPTH, + "peek at full depth should be the last pushed value (%d)", + (int)V4_DATA_DEPTH); + + for (unsigned i = V4_DATA_DEPTH; i > 0; i--) { + v4_cell got = v4_dstack_pop(&d); + v4_cell exp = flat_pop(&f); + CHECK(got == exp, "drain at depth %u: got %lld want %lld", i, + (long long)got, (long long)exp); + CHECK(got == (v4_cell)i, "drain at depth %u: got %lld want %d", i, + (long long)got, (int)i); + } +} + +static void test_overflow_overwrites_oldest(void) +{ + /* D-2: "pushing past the bottom silently overwrites the oldest entry." + * Push one past depth: the very first value pushed must be gone, and the + * remaining V4_DATA_DEPTH-1 must come back newest-first. */ + v4_dstack d; + flat_t f; + v4_dstack_reset(&d); + flat_reset(&f, V4_DATA_DEPTH); + + for (unsigned i = 0; i < V4_DATA_DEPTH + 1u; i++) { + v4_cell v = (v4_cell)(i + 1); + v4_dstack_push(&d, v); + flat_push(&f, v); + } + CHECK(v4_dstack_peek(&d) == (v4_cell)(V4_DATA_DEPTH + 1u), + "peek after overflow should be the newest value"); + + for (unsigned i = 0; i < V4_DATA_DEPTH; i++) { + v4_cell got = v4_dstack_pop(&d); + v4_cell exp = flat_pop(&f); + CHECK(got == exp, "post-overflow drain %u: got %lld want %lld", i, + (long long)got, (long long)exp); + CHECK(got != 1, + "post-overflow drain %u: value 1 should have been overwritten", + i); + } +} + +static void test_exact_depth_return(void) +{ + v4_rstack r; + flat_t f; + v4_rstack_reset(&r); + flat_reset(&f, V4_RET_DEPTH); + + for (unsigned i = 0; i < V4_RET_DEPTH + 3u; i++) { + v4_cell v = (v4_cell)(i + 1); + v4_rstack_push(&r, v); + flat_push(&f, v); + } + for (unsigned i = 0; i < V4_RET_DEPTH; i++) { + v4_cell got = v4_rstack_pop(&r); + v4_cell exp = flat_pop(&f); + CHECK(got == exp, "return drain %u: got %lld want %lld", i, + (long long)got, (long long)exp); + } +} + +static void test_underflow_wraps_rather_than_trapping(void) +{ + /* D-2 says there is no underflow detection. Popping an "empty" stack must + * therefore return a defined (stale) value, not fault and not abort. The + * golden model must diverge from hardware in neither direction, so this is + * asserted rather than left to chance. */ + v4_dstack d; + flat_t f; + v4_dstack_reset(&d); + flat_reset(&f, V4_DATA_DEPTH); + + for (unsigned i = 0; i < 5; i++) { + v4_dstack_pop(&d); + flat_pop(&f); + } + CHECK(1, "popping past empty must not trap"); +} + +/* ---- live-depth-aware comparison ------------------------------------------ + * D-2 specifies what these stacks do while they hold live entries: LIFO order + * within the depth, and oldest-entry-overwritten past it. It explicitly does + * NOT specify the contents once the stack has been popped empty, because + * "no overflow or underflow" means the residue is whatever the physical + * register file happened to hold. Two independent models of a circular buffer + * will legitimately disagree down there -- it is not a semantic difference. + * + * So the differential test tracks how many live entries each stack holds and + * asserts agreement only where the spec makes a claim: the value a pop returns + * and the top peek while depth > 0, and the second element while depth > 1. + * The stale region is still exercised (the sequence runs right through it) and + * is still required not to trap, it is simply not required to agree. */ + +typedef struct { + v4_dstack hw; + flat_t model; + int live; +} pair_t; + +static void pair_reset(pair_t *p) +{ + v4_dstack_reset(&p->hw); + flat_reset(&p->model, V4_DATA_DEPTH); + p->live = 0; +} + +static void pair_step(pair_t *p, int push, v4_cell v, int step, const char *tag) +{ + if (push) { + v4_dstack_push(&p->hw, v); + flat_push(&p->model, v); + if (p->live < V4_DATA_DEPTH) p->live++; + } else { + v4_cell got = v4_dstack_pop(&p->hw); + v4_cell exp = flat_pop(&p->model); + if (p->live > 0) { + CHECK(got == exp, "%s op %d: pop got %lld want %lld (live=%d)", + tag, step, (long long)got, (long long)exp, p->live); + p->live--; + } + } + if (p->live > 0) { + CHECK(v4_dstack_peek(&p->hw) == flat_peek(&p->model), + "%s op %d: peek mismatch (live=%d)", tag, step, p->live); + } + if (p->live > 1) { + /* Second element of a depth-N circular buffer whose top is at `top` is + * N-1 further along the fill direction, i.e. (top-1) mod N. */ + v4_cell want = p->model.buf[(p->model.top + p->model.depth - 1u) + % p->model.depth]; + CHECK(v4_dstack_peek2(&p->hw) == want, + "%s op %d: peek2 got %lld want %lld (live=%d)", tag, step, + (long long)v4_dstack_peek2(&p->hw), (long long)want, p->live); + } +} + +static void test_exhaustive_sequences(void) +{ + /* Every push/pop sequence up to length 10 -- 2046 of them -- driven through + * both models. Exhaustive over short sequences rather than random, because + * a wrap-direction bug shows up in a handful of specific short patterns + * (notably push x N+1 then pop x N, which is the only sequence that ever + * overwrites the oldest entry) and a random driver finds those only by + * luck. This finds all of them, every run, deterministically. */ + enum { MAXLEN = 10 }; + int total = 0; + for (int len = 1; len <= MAXLEN; len++) total += 1 << len; + + for (int len = 1; len <= MAXLEN; len++) { + for (int bits = 0; bits < (1 << len); bits++) { + pair_t p; + pair_reset(&p); + for (int i = 0; i < len; i++) { + int push = (bits >> i) & 1; + /* Distinct, non-zero values so a slot mix-up is visible. */ + v4_cell v = (v4_cell)(100 + i * 7); + pair_step(&p, push, v, i, "exhaustive"); + } + } + } + printf(" exhaustive: %d sequences of length <= %d\n", total, MAXLEN); +} + +static void test_differential_random(void) +{ + /* Long random walk across the wrap points, both widths, both stacks. */ + enum { OPS = 200000 }; + pair_t dp; + v4_rstack r; + flat_t rf; + int rlive; + + pair_reset(&dp); + v4_rstack_reset(&r); + flat_reset(&rf, V4_RET_DEPTH); + rlive = 0; + + for (int i = 0; i < OPS; i++) { + uint64_t bits = rng_next(); + + pair_step(&dp, (int)(bits & 1u), (v4_cell)bits, i, "differential data"); + + if (bits & 2u) { + v4_cell v = (v4_cell)(bits >> 8); + v4_rstack_push(&r, v); + flat_push(&rf, v); + if (rlive < V4_RET_DEPTH) rlive++; + } else { + v4_cell got = v4_rstack_pop(&r); + v4_cell exp = flat_pop(&rf); + if (rlive > 0) { + CHECK(got == exp, + "differential ret op %d: pop got %lld want %lld (live=%d)", + i, (long long)got, (long long)exp, rlive); + rlive--; + } + } + if (rlive > 0) { + CHECK(v4_rstack_peek(&r) == flat_peek(&rf), + "differential ret op %d: peek mismatch (live=%d)", i, rlive); + } + } + printf(" differential: %d ops\n", OPS); +} + +int main(void) +{ + printf("v4 stack tests: V4_CELL_BITS=%d, data depth %d, return depth %d\n", + V4_CELL_BITS, V4_DATA_DEPTH, V4_RET_DEPTH); + + test_reset_is_zero(); + test_exact_depth_data(); + test_overflow_overwrites_oldest(); + test_exact_depth_return(); + test_underflow_wraps_rather_than_trapping(); + test_exhaustive_sequences(); + test_differential_random(); + + printf(" %d checks, %d failures\n", checks, failures); + return failures ? 1 : 0; +} diff --git a/v4/tests/test_umul.c b/v4/tests/test_umul.c new file mode 100644 index 00000000..2cec6aa4 --- /dev/null +++ b/v4/tests/test_umul.c @@ -0,0 +1,70 @@ +/* test_umul.c -- the reference unsigned multiply. + * + * v4_umul is what the capsule-level UM* is checked against, so it is checked + * here against things that do not depend on it: algebraic identities that hold + * at any width, and at 32-bit cells the host's own 64-bit product. + */ +#include "v4/umul.h" +#include + +static int failures = 0, checks = 0; +#define CHECK(c,...) do{checks++; if(!(c)){failures++; printf("FAIL %s:%d: ",__FILE__,__LINE__); printf(__VA_ARGS__); printf("\n");}}while(0) + +#define MAXU ((v4_ucell)~(v4_ucell)0) + +static const v4_ucell vec[] = { + 0u, 1u, 2u, 3u, 7u, 255u, 256u, 65535u, 65536u, 0x12345678u, + (v4_ucell)0x9E3779B97F4A7C15ULL, (v4_ucell)0xDEADBEEFCAFEF00DULL, + V4_MSB - 1u, V4_MSB, V4_MSB + 1u, MAXU - 1u, MAXU +}; +#define NVEC (sizeof vec / sizeof vec[0]) + +int main(void) +{ + v4_ucell lo, hi, lo2, hi2; + + printf("v4 umul tests: V4_CELL_BITS=%d\n", V4_CELL_BITS); + + v4_umul(3, 7, &lo, &hi); CHECK(lo == 21 && hi == 0, "3*7"); + /* (2^n - 1)^2 = 2^2n - 2^(n+1) + 1 */ + v4_umul(MAXU, MAXU, &lo, &hi); CHECK(lo == 1 && hi == MAXU - 1u, "max*max"); + /* 2^(n-1) * 2^(n-1) = 2^(2n-2) */ + v4_umul(V4_MSB, V4_MSB, &lo, &hi); + CHECK(lo == 0 && hi == (V4_MSB >> 1), "msb*msb"); + + for (unsigned i = 0; i < NVEC; i++) { + v4_ucell x = vec[i]; + + v4_umul(x, 0, &lo, &hi); CHECK(lo == 0 && hi == 0, "x*0 [%u]", i); + v4_umul(x, 1, &lo, &hi); CHECK(lo == x && hi == 0, "x*1 [%u]", i); + /* x * (2^n - 1) = x*2^n - x */ + v4_umul(x, MAXU, &lo, &hi); + CHECK(lo == (v4_ucell)(0u - x) && hi == (x ? x - 1u : 0u), "x*max [%u]", i); + + for (unsigned k = 0; k < V4_CELL_BITS; k++) { + /* x * 2^k is x shifted across the double cell */ + v4_umul(x, ((v4_ucell)1) << k, &lo, &hi); + CHECK(lo == (v4_ucell)(x << k), "x<<%u lo [%u]", k, i); + CHECK(hi == (k ? x >> (V4_CELL_BITS - k) : 0u), "x<<%u hi [%u]", k, i); + } + + for (unsigned j = 0; j < NVEC; j++) { + v4_ucell y = vec[j]; + + v4_umul(x, y, &lo, &hi); + v4_umul(y, x, &lo2, &hi2); + CHECK(lo == lo2 && hi == hi2, "commutes [%u,%u]", i, j); + CHECK(lo == (v4_ucell)(x * y), "low cell [%u,%u]", i, j); +#if V4_CELL_BITS == 32 + { + uint64_t p = (uint64_t)x * (uint64_t)y; + CHECK(lo == (uint32_t)p && hi == (uint32_t)(p >> 32), + "host product [%u,%u]", i, j); + } +#endif + } + } + + printf(" %d checks, %d failures\n", checks, failures); + return failures ? 1 : 0; +} -- 2.54.0 From 9a391eb0adf8c485f603609dfab7521aa2ee32fe Mon Sep 17 00:00:00 2001 From: rajames Date: Fri, 2 Oct 2026 19:21:17 -0400 Subject: [PATCH 004/135] feat(v4.0.0): full-range UM* under plain F18 +* (D-3) UM* as first written in DECOMPOSITION.md section 4 was exact only while u1 <= 2^(n-2): plain +* loses the carry out of T and its shift keeps T's sign bit, so the loop is exact only while S and T stay in [-2^(n-2), 2^(n-2)). The rewrite multiplies by s = u1 2/, which always lies in that range, starting T at t0 = u2 2/ when u1 is odd, so the loop yields hi:lo = t0 + s*u2 exactly. Then u1*u2 = 2*(hi:lo) + c_lo + c_hi*2^n c_lo = u1 & u2 & 1 c_hi = (u1<0 ? u2 : 0) + (u1 odd and u2<0 ? 1 : 0) restores the halved-away bits and the unsigned reading of both top bits. test_foundation.c runs the new definition against v4_umul over every pair of the edge vectors plus 20000 pseudo-random pairs, at 32- and 64-bit cells, optimised and under ASan+UBSan. The two pinned failing cases are now ordinary exactness checks. Two hand mutations of the correction step each fail more than 10000 checks at both widths. DECOMPOSITION.md: section 4 UM* replaced, D-3 ruling text updated. Co-Authored-By: Claude Opus 5.5 --- docs/v4.0.0/DECOMPOSITION.md | 25 +++++++++--- v4/include/v4/umul.h | 3 +- v4/tests/test_foundation.c | 73 ++++++++++++++++++++++++++---------- 3 files changed, 74 insertions(+), 27 deletions(-) diff --git a/docs/v4.0.0/DECOMPOSITION.md b/docs/v4.0.0/DECOMPOSITION.md index a08fb356..d331182f 100644 --- a/docs/v4.0.0/DECOMPOSITION.md +++ b/docs/v4.0.0/DECOMPOSITION.md @@ -164,7 +164,7 @@ definition below depends on one, it says so. | --- | --- | --- | | **D-1** | Word addressing (pure Moore) or byte addressing. | **Word addressing.** `C@`/`C!` are CAP; `CELLS` is a no-op. | | **D-2** | Stack depth, and whether the stacks are visible. | **F18 circular stacks, hidden.** Data stack 10 deep (`T`, `S` + 8 circular), return stack 9 deep (`R` + 8 circular), exactly as the F18. No stack pointer is visible to code, so `DEPTH`, `PICK`, `ROLL`, `.S`, `SP@` and `SP!` are **retired everywhere**, host node included. | -| **D-3** | Exact `+*` semantics at 32 bits: whether the add carries out of `T` into the shift. | **Plain F18 semantics.** The carry out of `T` is not kept. `UM*` in §4 must be revised accordingly (see the note there). | +| **D-3** | Exact `+*` semantics at 32 bits: whether the add carries out of `T` into the shift. | **Plain F18 semantics.** The carry out of `T` is not kept. `UM*` in §4 is written for this and is exact over the full range (revised and proven on the golden model, 2026-10-02). | | **D-4** | Node memory map, including port and register addresses. | **Deferred** to step 2. Symbolic names only for now (§6, §7). | | **D-5** | Host node cell width. | **Match the host CPU:** 32 on a Zynq-7000 (Cortex-A9), 64 on an aarch64 host. The compiler capsule is written width-independent. | | **D-6** | Which heat structures exist in hardware: per-opcode counters only, or also per-call-target and word-to-word transition counters. | **Deferred** to step 2. The golden model implements per-opcode and per-call-target heat in the meantime. | @@ -201,11 +201,24 @@ dependency order. : U< ( u1 u2 -- flag ) 2DUP xor 0< IF NIP 0< ELSE - 0< THEN ; \ ---- multiply (D-3) ----------------------------------------------------- -\ NEEDS REVISION: written for the carry-keeping +* that D-3 rejected. With -\ plain F18 +* the carry out of T is lost, so this is only correct when the -\ partial sums never overflow T (operands below 2^31). A full-range UM* -\ needs a correction step; to be rewritten and proven on the golden model. -: UM* ( u1 u2 -- ulo uhi ) a! 0 31 FOR +* UNEXT push drop a pop ; +\ Plain F18 +* loses the carry out of T, and its shift keeps T's sign bit, so +\ the loop is exact only while the multiplicand in S and the running T both +\ lie in [-2^(n-2), 2^(n-2)). UM* therefore multiplies by s = u1 2/, which +\ always does, starting T at t0 = u2 2/ when u1 is odd, and gets +\ hi:lo = t0 + s*u2. Then u1*u2 = 2*(hi:lo) + c_lo + c_hi*2^n, where +\ c_lo = u1 & u2 & 1 +\ c_hi = (u1<0 ? u2 : 0) + (u1 odd and u2<0 ? 1 : 0) +\ restore the bits the two halvings dropped and the unsigned reading of +\ both top bits. Exact over the full range; proven on the golden model. +: UM* ( u1 u2 -- ulo uhi ) + over 0< over and push \ R: u1<0 ? u2 : 0 + over over 0< and 1 and pop + push \ R: c_hi + over over and 1 and push \ R: c_hi c_lo + over 1 and NEGATE over 2/ and push \ R: c_hi c_lo t0 + a! 2/ pop \ s t0 A: u2 + 31 FOR +* UNEXT \ s hi A: lo + NIP a 2* pop + SWAP \ lo' hi + 2* a 0< NEGATE + pop + ; \ lo' hi' \ ---- divide: 32-step restoring division, divisor held in A -------------- : UM/MOD ( ulo uhi ud -- urem uquot ) diff --git a/v4/include/v4/umul.h b/v4/include/v4/umul.h index 38d8f5f0..382b7640 100644 --- a/v4/include/v4/umul.h +++ b/v4/include/v4/umul.h @@ -1,6 +1,7 @@ /* umul.h -- unsigned multiply fixing UM* under D-3 constraints. * - * DECOMPOSITION.md line 205-207: "NEEDS REVISION: written for the carry-keeping + * DECOMPOSITION.md section 4 first said of UM* (since rewritten to be exact over + * the full range; see test_foundation.c): "NEEDS REVISION: written for the carry-keeping * +* that D-3 rejected. With plain F18 +* the carry out of T is lost, so this * is only correct when the partial sums never overflow T (operands below 2^31). * A full-range UM* needs a correction step; to be rewritten and proven on the diff --git a/v4/tests/test_foundation.c b/v4/tests/test_foundation.c index 6e288e09..a72654f9 100644 --- a/v4/tests/test_foundation.c +++ b/v4/tests/test_foundation.c @@ -6,6 +6,10 @@ * section 5, which U< needs) and runs them on the golden model against the C * operation each one stands for. * + * UM* is the full-range version that section 4 gives under D-3, and is checked + * against the reference v4_umul over every pair of the edge vectors and 20000 + * pseudo-random pairs at each cell width. + * * Every call is made with a canary under the arguments, and the canary must * still be directly under the results afterwards: a definition that leaves * the right answer but an unbalanced stack is wrong. @@ -92,14 +96,32 @@ static void build(void) v4_asm_resolve(&as, ref, v4_asm_label(&as)); O(DROP); CALL(w_minus); CALL(w_zless); O(SEMI); - /* : UM* a! 0 31 FOR +* UNEXT push drop a pop ; - * 31 is the cell width less one; written for a 32-bit cell in section 4. - * The loop body is the start of its own word so that unext restarts it. */ + /* : UM* ( u1 u2 -- ulo uhi ) section 4, D-3 + * over 0< over and push R: m1 ? u2 : 0 + * over over 0< and 1 and pop + push R: c_hi + * over over and 1 and push R: c_hi c_lo + * over 1 and NEGATE over 2/ and push R: c_hi c_lo t0 + * a! 2/ pop s t0 A: u2 + * 31 FOR +* UNEXT s hi A: lo + * NIP a 2* pop + SWAP lo' hi + * 2* a 0< NEGATE + pop + ; lo' hi' + * NEGATE is placed in line. 31 is the cell width less one; the loop body + * is the start of its own word so that unext restarts it. */ w_umstar = v4_asm_label(&as); - O(BANG_A); LIT(0); LIT(V4_CELL_BITS - 1); O(PUSH); + O(OVER); CALL(w_zless); O(OVER); O(AND); O(PUSH); + O(OVER); O(OVER); CALL(w_zless); O(AND); LIT(1); O(AND); + O(RPOP); O(ADD); O(PUSH); + O(OVER); O(OVER); O(AND); LIT(1); O(AND); O(PUSH); + O(OVER); LIT(1); O(AND); O(INV); LIT(1); O(ADD); + O(OVER); O(TWO_SLASH); O(AND); O(PUSH); + O(BANG_A); O(TWO_SLASH); O(RPOP); + LIT(V4_CELL_BITS - 1); O(PUSH); (void)v4_asm_label(&as); - O(MUL_STEP); O(UNEXT); O(PUSH); O(DROP); O(PUSH_A); O(RPOP); - O(SEMI); + O(MUL_STEP); O(UNEXT); + CALL(w_nip); + O(PUSH_A); O(TWO_STAR); O(RPOP); O(ADD); CALL(w_swap); + O(TWO_STAR); O(PUSH_A); CALL(w_zless); O(INV); LIT(1); O(ADD); O(ADD); + O(RPOP); O(ADD); O(SEMI); CHECK(v4_asm_ok(&as), "foundation words assemble"); } @@ -184,23 +206,34 @@ int main(void) CHECK(call(w_rot, 3, a, b, c) && left3(b, c, a), "ROT [%u,%u,%u]", i, j, k); } - /* UM* as written is exact whenever the multiplicand (u1, which - * stays in S) is at most 2^(n-2): T is then always below S, so - * T+S stays below 2^(n-1) and neither the lost carry nor +*'s - * sign-keeping shift can touch the result. u2 is unrestricted. */ - if (ua <= (V4_MSB >> 1)) - CHECK(umstar_exact(ua, ub), "UM* [%u,%u]", i, j); + CHECK(umstar_exact(ua, ub), "UM* [%u,%u]", i, j); } } - /* KNOWN LIMITS of UM* as written, recorded so they cannot be forgotten. - * Section 4 marks UM* "NEEDS REVISION" and gives the limit as "operands - * below 2^31". The measured limit is tighter and is on u1 only. These - * two checks assert that the definition is still wrong where it is known - * to be wrong; when UM* is rewritten they must be turned into ordinary - * exactness checks. */ - CHECK(!umstar_exact(MAXU, MAXU), "UM* limit: carry out of T is lost (D-3)"); - CHECK(!umstar_exact(V4_MSB - 1u, 3u), "UM* limit: u1 below 2^(n-1) still fails"); + /* UM* over the full range: products of pseudo-random operands, and of + * operands chosen near the edges D-3 makes dangerous (top bit set, all + * ones, just under a power of two). */ + { + v4_ucell x = (v4_ucell)0x9E3779B9u; + for (unsigned i = 0; i < 20000; i++) { + v4_ucell u1, u2; + x ^= x << 13; x ^= x >> 7; x ^= x << 17; + u1 = x; + x ^= x << 13; x ^= x >> 7; x ^= x << 17; + u2 = x; + switch (i & 3u) { + case 1: u1 |= V4_MSB; break; + case 2: u1 |= V4_MSB; u2 |= V4_MSB; break; + case 3: u1 = MAXU - (u1 & 7u); break; + default: break; + } + CHECK(umstar_exact(u1, u2), "UM* random [%u]", i); + } + } + + /* The two cases that broke UM* as first written in section 4. */ + CHECK(umstar_exact(MAXU, MAXU), "UM* MAX*MAX: carry out of T (D-3)"); + CHECK(umstar_exact(V4_MSB - 1u, 3u), "UM* (2^(n-1)-1)*3"); CHECK(v4_node_guards_intact(&n), "guards intact"); -- 2.54.0 From 41f59afeb3c6f2fbeb99edebb265e7b50135f9a2 Mon Sep 17 00:00:00 2001 From: rajames Date: Fri, 2 Oct 2026 19:48:04 -0400 Subject: [PATCH 005/135] test(v4.0.0): execute UM/MOD on the golden model; measure stack headroom UM/MOD is assembled exactly as DECOMPOSITION.md section 4 gives it and needs no change: it is exact for every uhi < ud at 32- and 64-bit cells. It is checked against q*d + r = uhi:ulo with r < d through v4_umul, so no second C divider has to be trusted. Coverage: all edge-vector triples with uhi < ud plus 20000 pseudo-random cases (top-bit, small and near-maximum divisors), optimised and under ASan+UBSan. Two hand mutations each fail more than 15000 checks. New headroom probe: runs a word with marked cells under the canary and under its return address and reports how many survive, since the D-2 circular stacks overwrite silently instead of faulting. Measured: UM* 6 data cells under its args, 4 return entries under its return UM/MOD 3 data cells under its args, 3 return entries under its return DECOMPOSITION.md: UM/MOD marked executed, with its defined range and stack limits. Co-Authored-By: Claude Opus 5.5 --- docs/v4.0.0/DECOMPOSITION.md | 6 ++ v4/tests/test_foundation.c | 162 ++++++++++++++++++++++++++++++++++- 2 files changed, 165 insertions(+), 3 deletions(-) diff --git a/docs/v4.0.0/DECOMPOSITION.md b/docs/v4.0.0/DECOMPOSITION.md index d331182f..fd893f59 100644 --- a/docs/v4.0.0/DECOMPOSITION.md +++ b/docs/v4.0.0/DECOMPOSITION.md @@ -232,6 +232,12 @@ dependency order. IF a - SWAP 1 OR SWAP THEN NEXT SWAP ; +\ Executed on the golden model unchanged (2026-10-02): exact, q*d + r = uhi:ulo +\ with r < d, for every uhi < ud at 32- and 64-bit cells. Outside that range +\ (uhi >= ud, including ud = 0) the result is unspecified, as in FORTH-79; it +\ always terminates after 32 steps. Stack use (D-2): at most 3 data cells may +\ lie under the three arguments and at most 3 return-stack entries under its +\ return address. For UM* the same limits are 6 and 4. \ ---- signed division, truncating toward zero (v3 semantics) ------------- : SM/REM ( d n -- rem quot ) diff --git a/v4/tests/test_foundation.c b/v4/tests/test_foundation.c index a72654f9..b94fff3f 100644 --- a/v4/tests/test_foundation.c +++ b/v4/tests/test_foundation.c @@ -8,7 +8,10 @@ * * UM* is the full-range version that section 4 gives under D-3, and is checked * against the reference v4_umul over every pair of the edge vectors and 20000 - * pseudo-random pairs at each cell width. + * pseudo-random pairs at each cell width. UM/MOD is exactly as section 4 + * gives it, checked against q*d + r = uhi:ulo, r < d over the edge vectors and + * 20000 pseudo-random cases with uhi < ud. Both are also probed for how much + * of the 10- and 9-deep circular stacks (D-2) they leave to their caller. * * Every call is made with a canary under the arguments, and the canary must * still be directly under the results afterwards: a definition that leaves @@ -32,7 +35,7 @@ static v4_heat h; static v4_asm as; static v4_cell w_nip, w_swap, w_or, w_negate, w_rot, w_zless, w_zequal, - w_2dup, w_minus, w_uless, w_umstar; + w_2dup, w_minus, w_uless, w_umstar, w_ummod; #define O(name) v4_asm_op(&as, V4_OP_##name) #define LIT(v) v4_asm_lit(&as, (v4_cell)(v)) @@ -123,6 +126,41 @@ static void build(void) O(TWO_STAR); O(PUSH_A); CALL(w_zless); O(INV); LIT(1); O(ADD); O(ADD); O(RPOP); O(ADD); O(SEMI); + /* : UM/MOD ( ulo uhi ud -- urem uquot ) section 4 + * a! + * 31 FOR + * over 0< NEGATE push + * dup 0< push + * 2* pop pop SWAP push OR pop + * push SWAP 2* SWAP pop + * over a U< 0= OR + * IF a - SWAP 1 OR SWAP THEN + * NEXT + * SWAP ; + * NEGATE in line; IF as section 2 compiles it. */ + { + v4_cell loop; + v4_asm_ref skip, done; + + w_ummod = v4_asm_label(&as); + O(BANG_A); LIT(V4_CELL_BITS - 1); O(PUSH); + loop = v4_asm_label(&as); + O(OVER); CALL(w_zless); O(INV); LIT(1); O(ADD); O(PUSH); + O(DUP); CALL(w_zless); O(PUSH); + O(TWO_STAR); O(RPOP); O(RPOP); CALL(w_swap); O(PUSH); CALL(w_or); O(RPOP); + O(PUSH); CALL(w_swap); O(TWO_STAR); CALL(w_swap); O(RPOP); + O(OVER); O(PUSH_A); CALL(w_uless); CALL(w_zequal); CALL(w_or); + skip = v4_asm_branch_fwd(&as, V4_OP_IF); + O(DROP); O(PUSH_A); CALL(w_minus); + CALL(w_swap); LIT(1); CALL(w_or); CALL(w_swap); + done = v4_asm_branch_fwd(&as, V4_OP_JUMP); + v4_asm_resolve(&as, skip, v4_asm_label(&as)); + O(DROP); + v4_asm_resolve(&as, done, v4_asm_label(&as)); + v4_asm_branch(&as, V4_OP_NEXT, loop); + CALL(w_swap); O(SEMI); + } + CHECK(v4_asm_ok(&as), "foundation words assemble"); } @@ -137,7 +175,7 @@ static int call(v4_cell word, unsigned argc, v4_cell a, v4_cell b, v4_cell c) if (argc > 0) v4_dstack_push(&n.ds, a); if (argc > 1) v4_dstack_push(&n.ds, b); if (argc > 2) v4_dstack_push(&n.ds, c); - return v4_test_call(&n, &es, &h, word, 1000) > 0; + return v4_test_call(&n, &es, &h, word, 100000) > 0; } /* The results, top first, then the canary. */ @@ -174,6 +212,81 @@ static int umstar_exact(v4_ucell u1, v4_ucell u2) return call(w_umstar, 2, (v4_cell)u1, (v4_cell)u2, 0) && left2((v4_cell)lo, (v4_cell)hi); } +/* UM/MOD against the identity it must satisfy: q*d + r = uhi:ulo, r < d. + * Checked through v4_umul (itself tested in test_umul.c) rather than against + * a second division routine, so no C divider has to be trusted. */ +static int ummod_exact(v4_ucell lo, v4_ucell hi, v4_ucell d) +{ + v4_ucell r, q, plo, phi, slo; + if (!call(w_ummod, 3, (v4_cell)lo, (v4_cell)hi, (v4_cell)d)) return 0; + q = (v4_ucell)n.ds.t; + r = (v4_ucell)n.ds.s; + if (!left2((v4_cell)r, (v4_cell)q)) return 0; + v4_umul(q, d, &plo, &phi); + slo = plo + r; + phi += (slo < plo); + return r < d && slo == lo && phi == hi; +} + +/* Stack headroom. Run `word` with `dfill` marked cells under the canary and + * `rfill` marked cells under its return address, and report whether the + * results, the canary and every marked cell come back intact. The F18 stacks + * are circular (D-2), so a word that needs more depth than is free does not + * fault: it silently overwrites the oldest cells, and this is how that shows. */ +#define DFILL(i) ((v4_cell)(0x5A000000 + (i))) +#define RFILL(i) ((v4_cell)(0x6B000000 + (i))) + +static int fits(v4_cell word, unsigned argc, const v4_cell *arg, + unsigned nres, unsigned dfill, unsigned rfill) +{ + v4_cell want[3]; + unsigned i; + + v4_dstack_reset(&n.ds); + v4_rstack_reset(&n.rs); + v4_exec_reset(&es); + for (i = 0; i < argc; i++) v4_dstack_push(&n.ds, arg[i]); + if (v4_test_call(&n, &es, &h, word, 100000) <= 0) return 0; + for (i = 0; i < nres; i++) want[i] = v4_dstack_pop(&n.ds); + + v4_dstack_reset(&n.ds); + v4_rstack_reset(&n.rs); + v4_exec_reset(&es); + for (i = 0; i < dfill; i++) v4_dstack_push(&n.ds, DFILL(i)); + v4_dstack_push(&n.ds, CANARY); + for (i = 0; i < argc; i++) v4_dstack_push(&n.ds, arg[i]); + for (i = 0; i < rfill; i++) v4_rstack_push(&n.rs, RFILL(i)); + if (v4_test_call(&n, &es, &h, word, 100000) <= 0) return 0; + for (i = 0; i < nres; i++) if (v4_dstack_pop(&n.ds) != want[i]) return 0; + if (v4_dstack_pop(&n.ds) != CANARY) return 0; + for (i = dfill; i-- > 0; ) if (v4_dstack_pop(&n.ds) != DFILL(i)) return 0; + for (i = rfill; i-- > 0; ) if (v4_rstack_pop(&n.rs) != RFILL(i)) return 0; + return 1; +} + +/* The most marked cells that survive on each stack, over a set of argument + * tuples chosen to take every branch. The data figure counts cells below the + * canary, so the caller may hold canary + headroom cells under the arguments. */ +static void headroom(const char *name, v4_cell word, unsigned argc, + const v4_cell (*args)[3], unsigned nargs, unsigned nres, + int *dh, int *rh) +{ + int d, r; + unsigned k; + + for (d = 0; d < V4_DATA_DEPTH; d++) { + for (k = 0; k < nargs; k++) if (!fits(word, argc, args[k], nres, (unsigned)d + 1u, 0)) break; + if (k < nargs) break; + } + for (r = 0; r < V4_RET_DEPTH; r++) { + for (k = 0; k < nargs; k++) if (!fits(word, argc, args[k], nres, 0, (unsigned)r + 1u)) break; + if (k < nargs) break; + } + *dh = d; *rh = r; + printf(" %s headroom: data %d below canary, return %d below its return address\n", + name, d, r); +} + int main(void) { printf("v4 foundation tests: V4_CELL_BITS=%d\n", V4_CELL_BITS); @@ -235,6 +348,49 @@ int main(void) CHECK(umstar_exact(MAXU, MAXU), "UM* MAX*MAX: carry out of T (D-3)"); CHECK(umstar_exact(V4_MSB - 1u, 3u), "UM* (2^(n-1)-1)*3"); + /* UM/MOD over its defined range, uhi < ud. */ + for (unsigned i = 0; i < NVEC; i++) + for (unsigned j = 0; j < NVEC; j++) + for (unsigned k = 0; k < NVEC; k++) { + v4_ucell lo = (v4_ucell)vec[i], hi = (v4_ucell)vec[j], d = (v4_ucell)vec[k]; + if (hi < d) + CHECK(ummod_exact(lo, hi, d), "UM/MOD [%u,%u,%u]", i, j, k); + } + { + v4_ucell x = (v4_ucell)0x2545F491u; + for (unsigned i = 0; i < 20000; i++) { + v4_ucell lo, hi, d; + x ^= x << 13; x ^= x >> 7; x ^= x << 17; lo = x; + x ^= x << 13; x ^= x >> 7; x ^= x << 17; d = x; + x ^= x << 13; x ^= x >> 7; x ^= x << 17; hi = x; + switch (i & 3u) { + case 1: d |= V4_MSB; break; /* top bit of d set */ + case 2: d >>= (unsigned)(x & 31u); break; /* small divisors */ + case 3: d = MAXU - (d & 7u); break; /* d just under 2^n */ + default: break; + } + if (d == 0) d = 1; + hi %= d; /* uhi < ud */ + CHECK(ummod_exact(lo, hi, d), "UM/MOD random [%u]", i); + } + } + + /* Stack headroom of the two longest definitions. */ + { + static const v4_cell umstar_args[][3] = { + { 0, 0, 0 }, { -1, -1, 0 }, { 3, -1, 0 }, { -1, 3, 0 }, { 12345, -12345, 0 } + }; + static const v4_cell ummod_args[][3] = { + { 0, 0, 1 }, { -1, -2, -1 }, { 12345, 0, 7 }, { -1, 0x7FFF, 0x8000 }, + { 0, (v4_cell)(V4_MSB - 1u), (v4_cell)V4_MSB } + }; + int dh, rh; + headroom("UM*", w_umstar, 2, umstar_args, 5, 2, &dh, &rh); + CHECK(dh >= 0 && rh >= 0, "UM* runs at all"); + headroom("UM/MOD", w_ummod, 3, ummod_args, 5, 2, &dh, &rh); + CHECK(dh >= 0 && rh >= 0, "UM/MOD runs at all"); + } + CHECK(v4_node_guards_intact(&n), "guards intact"); printf(" %d checks, %d failures\n", checks, failures); -- 2.54.0 From 3b9d1e4337d41b03bc46ff756c0c3b18afbda92a Mon Sep 17 00:00:00 2001 From: rajames Date: Fri, 2 Oct 2026 22:35:49 -0400 Subject: [PATCH 006/135] feat(v4.0.0): call-free UM/MOD loop for D-2 stack headroom The first UM/MOD was exact but called 0<, U<, SWAP and OR inside its loop, so it left its caller only 3 return-stack entries. SM/REM pushes two signs before calling it, so under /MOD, M/MOD or */MOD the caller's return address would be silently overwritten (D-2 circular stacks). The loop now makes no calls. It branches on hi's top bit with -if, does the unsigned hi' >= d test as U< does but with in-line sign tests, subtracts with `inv a + inv`, and sets the quotient bit with `1 +` on an even lo'. The final SWAP is in line. Measured on the golden model at 32- and 64-bit cells: headroom data 3 -> 6 cells under args, return 3 -> 6 entries speed ~1355-1605 -> ~227-313 instruction words per call Still exact for every uhi < ud (edge-vector triples and 20000 random cases, optimised and ASan+UBSan). Retargeting each of the four in-loop branches to the wrong label fails more than 12000 checks each. DECOMPOSITION.md: section 4 UM/MOD replaced, with its derivation and stack limits. Co-Authored-By: Claude Opus 5.5 --- docs/v4.0.0/DECOMPOSITION.md | 44 +++++++++++------ v4/tests/test_foundation.c | 92 ++++++++++++++++++++++++++---------- 2 files changed, 96 insertions(+), 40 deletions(-) diff --git a/docs/v4.0.0/DECOMPOSITION.md b/docs/v4.0.0/DECOMPOSITION.md index fd893f59..2cfb4c70 100644 --- a/docs/v4.0.0/DECOMPOSITION.md +++ b/docs/v4.0.0/DECOMPOSITION.md @@ -221,23 +221,39 @@ dependency order. 2* a 0< NEGATE + pop + ; \ lo' hi' \ ---- divide: 32-step restoring division, divisor held in A -------------- +\ Each step shifts hi:lo left one bit and, when the shifted-out bit of hi was +\ set or hi' >= d, subtracts d from hi' and sets the new low bit of lo. The +\ unsigned compare is done by sign tests in line (as U< does), and x - d is +\ `inv a + inv`, so the loop body makes no calls: it needs one return-stack +\ entry beyond its own count. : UM/MOD ( ulo uhi ud -- urem uquot ) - a! - 31 FOR - over 0< NEGATE push \ R: lo's top bit (1/0) - dup 0< push \ R: hi's top bit (-1/0) - 2* pop pop SWAP push OR pop \ lo hi' t hi shifted, lo bit brought in - push SWAP 2* SWAP pop \ lo' hi' t - over a U< 0= OR \ lo' hi' flag t OR hi' >= d - IF a - SWAP 1 OR SWAP THEN + a! 31 FOR + -if L0 \ hi's top bit set: + 2* over -if L1 drop 1 + jump L2 \ hi' = 2hi + top bit of lo + L1: drop L2: push 2* pop \ lo' = 2lo + jump SUB \ true hi' >= 2^n > d + L0: + 2* over -if L3 drop 1 + jump L4 + L3: drop L4: push 2* pop + dup a xor -if L5 \ top bits of hi' and d differ: + drop -if NOSUB jump SUB \ hi' >= d iff hi' has it + L5: drop dup inv a + inv -if L6 \ same: hi' >= d iff hi'-d >= 0 + drop jump NOSUB + L6: push drop pop jump SETBIT + SUB: inv a + inv \ hi' - d + SETBIT: push 1 + pop \ lo' is even: + 1 sets bit 0 + NOSUB: NEXT - SWAP ; -\ Executed on the golden model unchanged (2026-10-02): exact, q*d + r = uhi:ulo -\ with r < d, for every uhi < ud at 32- and 64-bit cells. Outside that range + over push push drop pop pop ; \ SWAP in line +\ Executed on the golden model (2026-10-02): exact, q*d + r = uhi:ulo with +\ r < d, for every uhi < ud at 32- and 64-bit cells. Outside that range \ (uhi >= ud, including ud = 0) the result is unspecified, as in FORTH-79; it -\ always terminates after 32 steps. Stack use (D-2): at most 3 data cells may -\ lie under the three arguments and at most 3 return-stack entries under its -\ return address. For UM* the same limits are 6 and 4. +\ always terminates after 32 steps. Stack use (D-2): up to 6 data cells may +\ lie under the three arguments and up to 6 return-stack entries under its +\ return address. For UM* the same limits are 6 and 4. This replaces a +\ first version built on U<, 0<, SWAP and OR calls, which was also exact but +\ left only 3 and 3 (too few for SM/REM inside /MOD) and stepped about five +\ times as many instruction words. \ ---- signed division, truncating toward zero (v3 semantics) ------------- : SM/REM ( d n -- rem quot ) diff --git a/v4/tests/test_foundation.c b/v4/tests/test_foundation.c index b94fff3f..55401678 100644 --- a/v4/tests/test_foundation.c +++ b/v4/tests/test_foundation.c @@ -8,8 +8,8 @@ * * UM* is the full-range version that section 4 gives under D-3, and is checked * against the reference v4_umul over every pair of the edge vectors and 20000 - * pseudo-random pairs at each cell width. UM/MOD is exactly as section 4 - * gives it, checked against q*d + r = uhi:ulo, r < d over the edge vectors and + * pseudo-random pairs at each cell width. UM/MOD, the call-free version + * section 4 gives, checked against q*d + r = uhi:ulo, r < d over the edge vectors and * 20000 pseudo-random cases with uhi < ud. Both are also probed for how much * of the 10- and 9-deep circular stacks (D-2) they leave to their caller. * @@ -127,38 +127,78 @@ static void build(void) O(RPOP); O(ADD); O(SEMI); /* : UM/MOD ( ulo uhi ud -- urem uquot ) section 4 - * a! - * 31 FOR - * over 0< NEGATE push - * dup 0< push - * 2* pop pop SWAP push OR pop - * push SWAP 2* SWAP pop - * over a U< 0= OR - * IF a - SWAP 1 OR SWAP THEN + * a! 31 FOR + * -if L0 + * 2* over -if L1 drop 1 + jump L2 L1: drop L2: push 2* pop + * jump SUB + * L0: + * 2* over -if L3 drop 1 + jump L4 L3: drop L4: push 2* pop + * dup a xor -if L5 + * drop -if NOSUB jump SUB + * L5: drop dup inv a + inv -if L6 + * drop jump NOSUB + * L6: push drop pop jump SETBIT + * SUB: inv a + inv + * SETBIT: push 1 + pop + * NOSUB: * NEXT - * SWAP ; - * NEGATE in line; IF as section 2 compiles it. */ + * over push push drop pop pop ; + * No calls inside the loop, and SWAP is in line. */ { - v4_cell loop; - v4_asm_ref skip, done; + v4_cell loop, l_sub, l_setbit, l_nosub; + v4_asm_ref r0, r1, r2, r3, r4, r5, r6, to_sub1, to_sub2, to_nosub1, + to_nosub2, to_setbit; w_ummod = v4_asm_label(&as); O(BANG_A); LIT(V4_CELL_BITS - 1); O(PUSH); loop = v4_asm_label(&as); - O(OVER); CALL(w_zless); O(INV); LIT(1); O(ADD); O(PUSH); - O(DUP); CALL(w_zless); O(PUSH); - O(TWO_STAR); O(RPOP); O(RPOP); CALL(w_swap); O(PUSH); CALL(w_or); O(RPOP); - O(PUSH); CALL(w_swap); O(TWO_STAR); CALL(w_swap); O(RPOP); - O(OVER); O(PUSH_A); CALL(w_uless); CALL(w_zequal); CALL(w_or); - skip = v4_asm_branch_fwd(&as, V4_OP_IF); - O(DROP); O(PUSH_A); CALL(w_minus); - CALL(w_swap); LIT(1); CALL(w_or); CALL(w_swap); - done = v4_asm_branch_fwd(&as, V4_OP_JUMP); - v4_asm_resolve(&as, skip, v4_asm_label(&as)); + r0 = v4_asm_branch_fwd(&as, V4_OP_MINUS_IF); + /* hi's top bit was set: shift, then subtract regardless */ + O(TWO_STAR); O(OVER); + r1 = v4_asm_branch_fwd(&as, V4_OP_MINUS_IF); + O(DROP); LIT(1); O(ADD); + r2 = v4_asm_branch_fwd(&as, V4_OP_JUMP); + v4_asm_resolve(&as, r1, v4_asm_label(&as)); O(DROP); - v4_asm_resolve(&as, done, v4_asm_label(&as)); + v4_asm_resolve(&as, r2, v4_asm_label(&as)); + O(PUSH); O(TWO_STAR); O(RPOP); + to_sub1 = v4_asm_branch_fwd(&as, V4_OP_JUMP); + /* L0: top bit clear: shift, then compare hi' with d */ + v4_asm_resolve(&as, r0, v4_asm_label(&as)); + O(TWO_STAR); O(OVER); + r3 = v4_asm_branch_fwd(&as, V4_OP_MINUS_IF); + O(DROP); LIT(1); O(ADD); + r4 = v4_asm_branch_fwd(&as, V4_OP_JUMP); + v4_asm_resolve(&as, r3, v4_asm_label(&as)); + O(DROP); + v4_asm_resolve(&as, r4, v4_asm_label(&as)); + O(PUSH); O(TWO_STAR); O(RPOP); + O(DUP); O(PUSH_A); O(XOR); + r5 = v4_asm_branch_fwd(&as, V4_OP_MINUS_IF); + O(DROP); + to_nosub1 = v4_asm_branch_fwd(&as, V4_OP_MINUS_IF); + to_sub2 = v4_asm_branch_fwd(&as, V4_OP_JUMP); + v4_asm_resolve(&as, r5, v4_asm_label(&as)); /* L5 */ + O(DROP); O(DUP); O(INV); O(PUSH_A); O(ADD); O(INV); + r6 = v4_asm_branch_fwd(&as, V4_OP_MINUS_IF); + O(DROP); + to_nosub2 = v4_asm_branch_fwd(&as, V4_OP_JUMP); + v4_asm_resolve(&as, r6, v4_asm_label(&as)); /* L6 */ + O(PUSH); O(DROP); O(RPOP); + to_setbit = v4_asm_branch_fwd(&as, V4_OP_JUMP); + l_sub = v4_asm_label(&as); + O(INV); O(PUSH_A); O(ADD); O(INV); + l_setbit = v4_asm_label(&as); + O(PUSH); LIT(1); O(ADD); O(RPOP); + l_nosub = v4_asm_label(&as); v4_asm_branch(&as, V4_OP_NEXT, loop); - CALL(w_swap); O(SEMI); + O(OVER); O(PUSH); O(PUSH); O(DROP); O(RPOP); O(RPOP); O(SEMI); + + v4_asm_resolve(&as, to_sub1, l_sub); + v4_asm_resolve(&as, to_sub2, l_sub); + v4_asm_resolve(&as, to_setbit, l_setbit); + v4_asm_resolve(&as, to_nosub1, l_nosub); + v4_asm_resolve(&as, to_nosub2, l_nosub); } CHECK(v4_asm_ok(&as), "foundation words assemble"); -- 2.54.0 From 93d09840da5ea2275d968de14c5222abcbb4d52b Mon Sep 17 00:00:00 2001 From: rajames Date: Fri, 2 Oct 2026 22:44:04 -0400 Subject: [PATCH 007/135] feat(v4.0.0): SM/REM and DNEGATE call-free; execute /MOD and its section 5 words SM/REM as written in section 4 never returned correctly for a negative dividend. It holds three entries on the return stack and then calls DABS -> DNEGATE -> D+ -> U> -> SWAP/U<, which overflows the 9-deep circular return stack (D-2). DABS itself could not run: DNEGATE as written (inv SWAP inv SWAP 1 0 D+) left its caller no return entries. - DNEGATE: inv over if L1 drop push inv 1 + pop ; L1: drop 1 + ; i.e. ~d + 1, carrying into the high cell exactly when lo = 0. - SM/REM: sign tests are native -if (as in 0<) and NEGATE is in line; the only calls are DNEGATE and UM/MOD, both call-free inside. Executed on the golden model at 32- and 64-bit cells, optimised and under ASan+UBSan: - SM/REM on dividends built as q*n + r with |r| < |n| and r signed as d: every edge-vector q, n with r = 0 and r = +-(|n|-1), plus 20000 pseudo-random cases. - /MOD, U>, ABS, S>D, D+ and DABS as written in section 5, against C (D+ over all 50625 edge-vector quadruples). Mutations of DNEGATE's carry and of each SM/REM sign branch are caught. Headroom (data cells under args / return entries under return address): SM/REM 5/3, /MOD 5/2, DNEGATE 7/7, DABS 7/6, ABS 8/7, U> 6/5. D+ as written is exact but leaves only 1 return entry; recorded in DECOMPOSITION.md 5.7 as not yet revised. Co-Authored-By: Claude Opus 5.5 --- docs/v4.0.0/DECOMPOSITION.md | 38 ++++-- v4/tests/test_foundation.c | 248 +++++++++++++++++++++++++++++++++-- 2 files changed, 263 insertions(+), 23 deletions(-) diff --git a/docs/v4.0.0/DECOMPOSITION.md b/docs/v4.0.0/DECOMPOSITION.md index 2cfb4c70..6aaaf38a 100644 --- a/docs/v4.0.0/DECOMPOSITION.md +++ b/docs/v4.0.0/DECOMPOSITION.md @@ -256,15 +256,27 @@ dependency order. \ times as many instruction words. \ ---- signed division, truncating toward zero (v3 semantics) ------------- +\ The quotient takes the sign of d xor n, the remainder the sign of d. Sign +\ tests are native -if (as in 0<) and NEGATE is in line, so the only calls +\ are DNEGATE and UM/MOD, both call-free inside. : SM/REM ( d n -- rem quot ) - 2DUP xor push \ R: quotient sign - over push \ R: remainder sign (sign of dividend) - ABS push DABS pop UM/MOD - pop 0< IF push NEGATE pop THEN - pop 0< IF NEGATE THEN ; + over over xor push \ R: quotient sign (top bit) + over push \ R: + remainder sign (top bit of d) + -if L0 inv 1 + L0: push \ R: + |n| + -if L1 DNEGATE L1: \ |d| + pop UM/MOD \ urem uquot + pop -if L2 drop push inv 1 + pop jump L3 L2: drop L3: + pop -if L4 drop inv 1 + ; L4: drop ; +\ Executed on the golden model (2026-10-02): exact whenever the truncated +\ quotient fits a signed cell, at 32- and 64-bit cells. Stack use (D-2): up +\ to 5 data cells under the three arguments and 3 return-stack entries under +\ its return address; /MOD, one call further out, leaves 2. The first +\ version, built on ABS, DABS, 0< and NEGATE calls, overflowed the return +\ stack inside DABS -> DNEGATE -> D+ -> U> and never returned correctly for +\ a negative dividend. ``` -`2DUP`, `-`, `ABS`, and `DABS` are defined in §5; the compiler resolves forward references within the +`2DUP`, `-`, and `DNEGATE` are defined in §5; the compiler resolves forward references within the core capsule. --- @@ -341,7 +353,7 @@ Section numbers match the v3 primitive reference. | `1+` `1-` `2+` `2-` | IN | `1 +`, `-1 +`, `2 +`, `-2 +` | | `2*` | OP | `2*` | | `2/` | OP | `2/` | -| `ABS` | CAP | `dup 0< IF NEGATE THEN` | +| `ABS` | CAP | `dup 0< IF NEGATE THEN` — executed on the golden model (2026-10-02). | | `NEGATE` | CAP | §4 | | `MIN` | CAP | `2DUP > IF SWAP THEN drop` | | `MAX` | CAP | `2DUP < IF SWAP THEN drop` | @@ -367,7 +379,7 @@ Section numbers match the v3 primitive reference. | `<=` | CAP | `> 0=` | | `>=` | CAP | `< 0=` | | `U<` | CAP | §4 | -| `U>` | CAP | `SWAP U<` | +| `U>` | CAP | `SWAP U<` — executed on the golden model (2026-10-02). | | `WITHIN` | CAP | `over - push - pop U<` | | `TRUE` | IN | `-1` | | `FALSE` | IN | `0` | @@ -383,7 +395,7 @@ A double is two 32-bit cells on a mesh node. | `M*` | CAP | `2DUP xor push ABS SWAP ABS UM* pop 0< IF DNEGATE THEN` | | `M/MOD` | CAP | `SM/REM` | | `MOD` | CAP | `/MOD drop` | -| `/MOD` | CAP | `push S>D pop SM/REM` | +| `/MOD` | CAP | `push S>D pop SM/REM` — executed on the golden model (2026-10-02). | | `*/` | CAP | `*/MOD NIP` | | `*/MOD` | CAP | `push M* pop SM/REM` | @@ -391,11 +403,11 @@ A double is two 32-bit cells on a mesh node. | Word | Fate | v4 definition | | --- | --- | --- | -| `S>D` | CAP | `dup 0<` | -| `D+` | CAP | `push SWAP push over + 2DUP U> ROT drop NEGATE pop pop + +` | -| `DNEGATE` | CAP | `inv SWAP inv SWAP 1 0 D+` | +| `S>D` | CAP | `dup 0<` — executed on the golden model (2026-10-02). | +| `D+` | CAP | `push SWAP push over + 2DUP U> ROT drop NEGATE pop pop + +` — executed on the golden model and exact (2026-10-02), but leaves its caller only **1** return-stack entry (D-2): anything that calls a word that calls `D+` overwrites a return address. Not yet revised. | +| `DNEGATE` | CAP | `inv over if L1 drop push inv 1 + pop ; L1: drop 1 + ;` — call-free: `~d + 1`, carrying into the high cell exactly when the low cell is 0. Executed on the golden model (2026-10-02). Replaces `inv SWAP inv SWAP 1 0 D+`, which left a caller no return-stack room, so `DABS` could not run at all. | | `D-` | CAP | `DNEGATE D+` | -| `DABS` | CAP | `dup 0< IF DNEGATE THEN` | +| `DABS` | CAP | `dup 0< IF DNEGATE THEN` — executed on the golden model (2026-10-02). | | `D0=` | CAP | `OR 0=` | | `D0<` | CAP | `NIP 0<` | | `D=` | CAP | `D- D0=` | diff --git a/v4/tests/test_foundation.c b/v4/tests/test_foundation.c index 55401678..cd51d14f 100644 --- a/v4/tests/test_foundation.c +++ b/v4/tests/test_foundation.c @@ -6,12 +6,15 @@ * section 5, which U< needs) and runs them on the golden model against the C * operation each one stands for. * - * UM* is the full-range version that section 4 gives under D-3, and is checked + * UM* is the full-range version that section 4 gives under D-3, checked * against the reference v4_umul over every pair of the edge vectors and 20000 - * pseudo-random pairs at each cell width. UM/MOD, the call-free version - * section 4 gives, checked against q*d + r = uhi:ulo, r < d over the edge vectors and - * 20000 pseudo-random cases with uhi < ud. Both are also probed for how much - * of the 10- and 9-deep circular stacks (D-2) they leave to their caller. + * pseudo-random pairs at each cell width. UM/MOD is section 4's call-free + * version, checked against q*d + r = uhi:ulo, r < d over the edge vectors and + * 20000 pseudo-random cases with uhi < ud. SM/REM and DNEGATE are the + * call-free versions in sections 4 and 5.7; SM/REM is checked on dividends + * built as q*n + r. /MOD, U>, ABS, S>D, D+ and DABS are as written in + * section 5 and checked against C. Every one is also probed for how much of + * the 10- and 9-deep circular stacks (D-2) it leaves to its caller. * * Every call is made with a canary under the arguments, and the canary must * still be directly under the results afterwards: a definition that leaves @@ -35,12 +38,29 @@ static v4_heat h; static v4_asm as; static v4_cell w_nip, w_swap, w_or, w_negate, w_rot, w_zless, w_zequal, - w_2dup, w_minus, w_uless, w_umstar, w_ummod; + w_2dup, w_minus, w_uless, w_umstar, w_ummod, + w_ugreater, w_abs, w_s2d, w_dplus, w_dnegate, w_dabs, w_smrem, + w_slashmod; #define O(name) v4_asm_op(&as, V4_OP_##name) #define LIT(v) v4_asm_lit(&as, (v4_cell)(v)) #define CALL(w) v4_asm_branch(&as, V4_OP_CALL, (w)) +/* Section 2's capsule IF ... THEN: the flag is dropped on both paths. */ +static v4_asm_ref if_(void) +{ + v4_asm_ref r = v4_asm_branch_fwd(&as, V4_OP_IF); + v4_asm_op(&as, V4_OP_DROP); + return r; +} +static void then_(v4_asm_ref r) +{ + v4_asm_ref j = v4_asm_branch_fwd(&as, V4_OP_JUMP); + v4_asm_resolve(&as, r, v4_asm_label(&as)); + v4_asm_op(&as, V4_OP_DROP); + v4_asm_resolve(&as, j, v4_asm_label(&as)); +} + static void build(void) { v4_asm_ref ref; @@ -201,6 +221,79 @@ static void build(void) v4_asm_resolve(&as, to_nosub2, l_nosub); } + /* ---- section 5 words that SM/REM and /MOD rest on, as written there. */ + + /* : U> SWAP U< ; 5.5 */ + w_ugreater = v4_asm_label(&as); + CALL(w_swap); CALL(w_uless); O(SEMI); + + /* : ABS dup 0< IF NEGATE THEN ; 5.4 */ + w_abs = v4_asm_label(&as); + O(DUP); CALL(w_zless); ref = if_(); CALL(w_negate); then_(ref); O(SEMI); + + /* : S>D dup 0< ; 5.7 */ + w_s2d = v4_asm_label(&as); + O(DUP); CALL(w_zless); O(SEMI); + + /* : D+ push SWAP push over + 2DUP U> ROT drop NEGATE pop pop + + ; 5.7 */ + w_dplus = v4_asm_label(&as); + O(PUSH); CALL(w_swap); O(PUSH); O(OVER); O(ADD); O(OVER); O(OVER); + CALL(w_ugreater); CALL(w_rot); O(DROP); CALL(w_negate); + O(RPOP); O(RPOP); O(ADD); O(ADD); O(SEMI); + + /* : DNEGATE ( d -- -d ) 5.7, call-free + * inv over if L1 drop push inv 1 + pop ; + * L1: drop 1 + ; + * -d = ~d + 1: the + 1 carries into hi exactly when lo = 0. */ + w_dnegate = v4_asm_label(&as); + O(INV); O(OVER); ref = v4_asm_branch_fwd(&as, V4_OP_IF); + O(DROP); O(PUSH); O(INV); LIT(1); O(ADD); O(RPOP); O(SEMI); + v4_asm_resolve(&as, ref, v4_asm_label(&as)); + O(DROP); LIT(1); O(ADD); O(SEMI); + + /* : DABS dup 0< IF DNEGATE THEN ; 5.7 */ + w_dabs = v4_asm_label(&as); + O(DUP); CALL(w_zless); ref = if_(); CALL(w_dnegate); then_(ref); O(SEMI); + + /* : SM/REM ( d n -- rem quot ) section 4 + * over over xor push R: quotient sign (top bit) + * over push R: + remainder sign (of d) + * -if L0 inv 1 + L0: push R: + |n| + * -if L1 DNEGATE L1: |d| + * pop UM/MOD urem uquot + * pop -if L2 drop push inv 1 + pop jump L3 L2: drop L3: + * pop -if L4 drop inv 1 + ; L4: drop ; + * Sign tests are native -if, as in 0<; NEGATE is in line. */ + { + v4_asm_ref l0, l1, l2, l3, l4; + w_smrem = v4_asm_label(&as); + O(OVER); O(OVER); O(XOR); O(PUSH); O(OVER); O(PUSH); + l0 = v4_asm_branch_fwd(&as, V4_OP_MINUS_IF); + O(INV); LIT(1); O(ADD); + v4_asm_resolve(&as, l0, v4_asm_label(&as)); + O(PUSH); + l1 = v4_asm_branch_fwd(&as, V4_OP_MINUS_IF); + CALL(w_dnegate); + v4_asm_resolve(&as, l1, v4_asm_label(&as)); + O(RPOP); CALL(w_ummod); + O(RPOP); + l2 = v4_asm_branch_fwd(&as, V4_OP_MINUS_IF); + O(DROP); O(PUSH); O(INV); LIT(1); O(ADD); O(RPOP); + l3 = v4_asm_branch_fwd(&as, V4_OP_JUMP); + v4_asm_resolve(&as, l2, v4_asm_label(&as)); + O(DROP); + v4_asm_resolve(&as, l3, v4_asm_label(&as)); + O(RPOP); + l4 = v4_asm_branch_fwd(&as, V4_OP_MINUS_IF); + O(DROP); O(INV); LIT(1); O(ADD); O(SEMI); + v4_asm_resolve(&as, l4, v4_asm_label(&as)); + O(DROP); O(SEMI); + } + + /* : /MOD push S>D pop SM/REM ; 5.6 */ + w_slashmod = v4_asm_label(&as); + O(PUSH); CALL(w_s2d); O(RPOP); CALL(w_smrem); O(SEMI); + CHECK(v4_asm_ok(&as), "foundation words assemble"); } @@ -218,6 +311,20 @@ static int call(v4_cell word, unsigned argc, v4_cell a, v4_cell b, v4_cell c) return v4_test_call(&n, &es, &h, word, 100000) > 0; } +/* The same with four arguments. */ +static int call4(v4_cell word, v4_cell a, v4_cell b, v4_cell c, v4_cell d) +{ + v4_dstack_reset(&n.ds); + v4_rstack_reset(&n.rs); + v4_exec_reset(&es); + v4_dstack_push(&n.ds, CANARY); + v4_dstack_push(&n.ds, a); + v4_dstack_push(&n.ds, b); + v4_dstack_push(&n.ds, c); + v4_dstack_push(&n.ds, d); + return v4_test_call(&n, &es, &h, word, 100000) > 0; +} + /* The results, top first, then the canary. */ static int left1(v4_cell t) { @@ -268,6 +375,38 @@ static int ummod_exact(v4_ucell lo, v4_ucell hi, v4_ucell d) return r < d && slo == lo && phi == hi; } +/* Doubles in C, as (lo, hi) with hi the high cell, for the section 5.7 and + * SM/REM checks. */ +static void dadd(v4_ucell al, v4_ucell ah, v4_ucell bl, v4_ucell bh, + v4_ucell *rl, v4_ucell *rh) +{ + *rl = al + bl; + *rh = ah + bh + (*rl < al); +} +static void dneg(v4_ucell l, v4_ucell h, v4_ucell *rl, v4_ucell *rh) +{ + dadd(~l, ~h, 1u, 0u, rl, rh); +} +/* Signed q * n as a signed double. */ +static void smul(v4_cell q, v4_cell nn, v4_ucell *rl, v4_ucell *rh) +{ + v4_ucell uq = (v4_ucell)q, un = (v4_ucell)nn; + if (q < 0) uq = 0u - uq; + if (nn < 0) un = 0u - un; + v4_umul(uq, un, rl, rh); + if ((q < 0) != (nn < 0)) dneg(*rl, *rh, rl, rh); +} + +/* SM/REM on the dividend d = q*n + r, built so that (r, q) is the + * truncating answer: |r| < |n|, and r is zero or has the sign of d. */ +static int smrem_exact(v4_cell q, v4_cell nn, v4_cell r) +{ + v4_ucell pl, ph, dl, dh; + smul(q, nn, &pl, &ph); + dadd(pl, ph, (v4_ucell)r, r < 0 ? MAXU : 0u, &dl, &dh); + return call(w_smrem, 3, (v4_cell)dl, (v4_cell)dh, nn) && left2(r, q); +} + /* Stack headroom. Run `word` with `dfill` marked cells under the canary and * `rfill` marked cells under its return address, and report whether the * results, the canary and every marked cell come back intact. The F18 stacks @@ -279,7 +418,7 @@ static int ummod_exact(v4_ucell lo, v4_ucell hi, v4_ucell d) static int fits(v4_cell word, unsigned argc, const v4_cell *arg, unsigned nres, unsigned dfill, unsigned rfill) { - v4_cell want[3]; + v4_cell want[4]; unsigned i; v4_dstack_reset(&n.ds); @@ -308,7 +447,7 @@ static int fits(v4_cell word, unsigned argc, const v4_cell *arg, * tuples chosen to take every branch. The data figure counts cells below the * canary, so the caller may hold canary + headroom cells under the arguments. */ static void headroom(const char *name, v4_cell word, unsigned argc, - const v4_cell (*args)[3], unsigned nargs, unsigned nres, + const v4_cell (*args)[4], unsigned nargs, unsigned nres, int *dh, int *rh) { int d, r; @@ -415,12 +554,76 @@ int main(void) } } + /* Section 5 words under SM/REM and /MOD, against their C meaning. */ + for (unsigned i = 0; i < NVEC; i++) { + v4_cell a = vec[i]; + v4_ucell ua = (v4_ucell)a; + CHECK(call(w_abs, 1, a, 0, 0) && left1(a < 0 ? (v4_cell)(0u - ua) : a), "ABS [%u]", i); + CHECK(call(w_s2d, 1, a, 0, 0) && left2(a, FLAG(a < 0)), "S>D [%u]", i); + for (unsigned j = 0; j < NVEC; j++) { + v4_cell b = vec[j]; + v4_ucell ub = (v4_ucell)b, rl, rh; + CHECK(call(w_ugreater, 2, a, b, 0) && left1(FLAG(ua > ub)), "U> [%u,%u]", i, j); + dneg(ua, ub, &rl, &rh); + CHECK(call(w_dnegate, 2, a, b, 0) && left2((v4_cell)rl, (v4_cell)rh), "DNEGATE [%u,%u]", i, j); + if (b >= 0) { rl = ua; rh = ub; } + CHECK(call(w_dabs, 2, a, b, 0) && left2((v4_cell)rl, (v4_cell)rh), "DABS [%u,%u]", i, j); + for (unsigned k = 0; k < NVEC; k++) + for (unsigned l = 0; l < NVEC; l++) { + v4_ucell sl, sh; + dadd(ua, ub, (v4_ucell)vec[k], (v4_ucell)vec[l], &sl, &sh); + CHECK(call4(w_dplus, a, b, vec[k], vec[l]) + && left2((v4_cell)sl, (v4_cell)sh), "D+ [%u,%u,%u,%u]", i, j, k, l); + } + if (b != 0 && !(a == (v4_cell)V4_MSB && b == -1)) + CHECK(call(w_slashmod, 2, a, b, 0) && left2(a % b, a / b), "/MOD [%u,%u]", i, j); + } + } + + /* SM/REM: every quotient, divisor and in-range remainder sign drawn from + * the edge vectors, then pseudo-random. */ + for (unsigned i = 0; i < NVEC; i++) + for (unsigned j = 0; j < NVEC; j++) { + v4_cell q = vec[i], nn = vec[j]; + v4_ucell un = nn < 0 ? 0u - (v4_ucell)nn : (v4_ucell)nn; + int neg = (q < 0) != (nn < 0); + if (nn == 0) continue; + CHECK(smrem_exact(q, nn, 0), "SM/REM r=0 [%u,%u]", i, j); + if (un > 1u) { + v4_cell r = (v4_cell)(un - 1u); + if (q == 0) { + CHECK(smrem_exact(q, nn, r), "SM/REM r>0 q=0 [%u,%u]", i, j); + CHECK(smrem_exact(q, nn, (v4_cell)(0u - (v4_ucell)r)), "SM/REM r<0 q=0 [%u,%u]", i, j); + } else { + CHECK(smrem_exact(q, nn, neg ? (v4_cell)(0u - (v4_ucell)r) : r), + "SM/REM r=max [%u,%u]", i, j); + } + } + } + { + v4_ucell x = (v4_ucell)0x6C078965u; + for (unsigned i = 0; i < 20000; i++) { + v4_cell q, nn, r; + v4_ucell un, ur; + x ^= x << 13; x ^= x >> 7; x ^= x << 17; q = (v4_cell)x; + x ^= x << 13; x ^= x >> 7; x ^= x << 17; nn = (v4_cell)x; + x ^= x << 13; x ^= x >> 7; x ^= x << 17; ur = x; + if (i & 1u) nn = (v4_cell)((v4_ucell)nn >> (x & 31u)); /* small divisors */ + if (i & 2u) q = (v4_cell)((v4_ucell)q >> (x & 31u)); /* small quotients */ + if (nn == 0) nn = 1; + un = nn < 0 ? 0u - (v4_ucell)nn : (v4_ucell)nn; + r = (v4_cell)(ur % un); + if (q == 0 ? (x & 4u) : ((q < 0) != (nn < 0))) r = (v4_cell)(0u - (v4_ucell)r); + CHECK(smrem_exact(q, nn, r), "SM/REM random [%u]", i); + } + } + /* Stack headroom of the two longest definitions. */ { - static const v4_cell umstar_args[][3] = { + static const v4_cell umstar_args[][4] = { { 0, 0, 0 }, { -1, -1, 0 }, { 3, -1, 0 }, { -1, 3, 0 }, { 12345, -12345, 0 } }; - static const v4_cell ummod_args[][3] = { + static const v4_cell ummod_args[][4] = { { 0, 0, 1 }, { -1, -2, -1 }, { 12345, 0, 7 }, { -1, 0x7FFF, 0x8000 }, { 0, (v4_cell)(V4_MSB - 1u), (v4_cell)V4_MSB } }; @@ -429,6 +632,31 @@ int main(void) CHECK(dh >= 0 && rh >= 0, "UM* runs at all"); headroom("UM/MOD", w_ummod, 3, ummod_args, 5, 2, &dh, &rh); CHECK(dh >= 0 && rh >= 0, "UM/MOD runs at all"); + + { + static const v4_cell one_args[][4] = { { 5, 0, 0 }, { -5, 0, 0 }, { 0, 0, 0 } }; + static const v4_cell two_args[][4] = { + { 5, 0, 0 }, { 0, -1, 0 }, { -5, -1, 0 }, { -1, 5, 0 }, { 0, 0, 0 } + }; + static const v4_cell smrem_args[][4] = { + { 7, 0, 2 }, { -7, -1, 2 }, { 7, 0, -2 }, { -7, -1, -2 }, { 0, 0, -3 } + }; + static const v4_cell slashmod_args[][4] = { + { 7, 2, 0 }, { -7, 2, 0 }, { 7, -2, 0 }, { -7, -2, 0 } + }; + headroom("ABS", w_abs, 1, one_args, 3, 1, &dh, &rh); + headroom("U>", w_ugreater, 2, two_args, 5, 1, &dh, &rh); + static const v4_cell dplus_args[][4] = { + { -1, 0, 1, 0 }, { 5, 7, 9, 11 }, { -1, -1, -1, -1 }, { (v4_cell)V4_MSB, 0, 1, 0 } + }; + headroom("D+", w_dplus, 4, dplus_args, 4, 2, &dh, &rh); + headroom("DNEGATE", w_dnegate, 2, two_args, 5, 2, &dh, &rh); + headroom("DABS", w_dabs, 2, two_args, 5, 2, &dh, &rh); + headroom("SM/REM", w_smrem, 3, smrem_args, 5, 2, &dh, &rh); + CHECK(rh >= 1, "SM/REM leaves room for /MOD's return address"); + headroom("/MOD", w_slashmod, 2, slashmod_args, 4, 2, &dh, &rh); + CHECK(dh >= 0 && rh >= 0, "/MOD runs at all"); + } } CHECK(v4_node_guards_intact(&n), "guards intact"); -- 2.54.0 From 092036c97a2f343dde6cd5e3c6d50fdaa6a5c0cd Mon Sep 17 00:00:00 2001 From: rajames Date: Fri, 2 Oct 2026 22:46:11 -0400 Subject: [PATCH 008/135] feat(v4.0.0): call-free D+ (D-2 stack headroom) D+ as written in 5.7 was exact but kept two cells on the return stack while calling U> -> SWAP/U<, leaving its caller one return entry: any word calling a word that calls D+ (M+, D-, D=, Q.+, Q.-) would have a return address silently overwritten. The new D+ makes no calls. Both high cells wait on the return stack; the carry out of the low-cell add comes from sign tests -- if the low cells' top bits differ, there is a carry exactly when the sum's top bit is clear; if they match, exactly when both are set. Headroom (data cells under args / return entries): 4/1 -> 6/5. Checked against C over all 50625 edge-vector quadruples and 20000 pseudo-random pairs (weighted to top-bit cases and low sums wrapping to 0), at 32- and 64-bit cells, optimised and ASan+UBSan. Retargeting each of the four carry branches fails more than 13000 checks. Co-Authored-By: Claude Opus 5.5 --- docs/v4.0.0/DECOMPOSITION.md | 2 +- v4/tests/test_foundation.c | 67 +++++++++++++++++++++++++++++++----- 2 files changed, 59 insertions(+), 10 deletions(-) diff --git a/docs/v4.0.0/DECOMPOSITION.md b/docs/v4.0.0/DECOMPOSITION.md index 6aaaf38a..bf5985b5 100644 --- a/docs/v4.0.0/DECOMPOSITION.md +++ b/docs/v4.0.0/DECOMPOSITION.md @@ -404,7 +404,7 @@ A double is two 32-bit cells on a mesh node. | Word | Fate | v4 definition | | --- | --- | --- | | `S>D` | CAP | `dup 0<` — executed on the golden model (2026-10-02). | -| `D+` | CAP | `push SWAP push over + 2DUP U> ROT drop NEGATE pop pop + +` — executed on the golden model and exact (2026-10-02), but leaves its caller only **1** return-stack entry (D-2): anything that calls a word that calls `D+` overwrites a return address. Not yet revised. | +| `D+` | CAP | `push over push push drop pop over over xor -if L1 drop + -if C1 jump C0 L1: drop over -if L2 drop + jump C1 L2: drop + C0: pop pop + ; C1: pop pop + 1 + ;` — call-free. The carry out of the low cells is found by sign tests: if their top bits differ, there is a carry exactly when the sum's top bit is clear; if they match, exactly when both are set. Executed on the golden model (2026-10-02); leaves its caller 6 data cells under its arguments and 5 return entries. Replaces `push SWAP push over + 2DUP U> ROT drop NEGATE pop pop + +`, which was exact but left 1 return entry. | | `DNEGATE` | CAP | `inv over if L1 drop push inv 1 + pop ; L1: drop 1 + ;` — call-free: `~d + 1`, carrying into the high cell exactly when the low cell is 0. Executed on the golden model (2026-10-02). Replaces `inv SWAP inv SWAP 1 0 D+`, which left a caller no return-stack room, so `DABS` could not run at all. | | `D-` | CAP | `DNEGATE D+` | | `DABS` | CAP | `dup 0< IF DNEGATE THEN` — executed on the golden model (2026-10-02). | diff --git a/v4/tests/test_foundation.c b/v4/tests/test_foundation.c index cd51d14f..ecea80b0 100644 --- a/v4/tests/test_foundation.c +++ b/v4/tests/test_foundation.c @@ -12,8 +12,9 @@ * version, checked against q*d + r = uhi:ulo, r < d over the edge vectors and * 20000 pseudo-random cases with uhi < ud. SM/REM and DNEGATE are the * call-free versions in sections 4 and 5.7; SM/REM is checked on dividends - * built as q*n + r. /MOD, U>, ABS, S>D, D+ and DABS are as written in - * section 5 and checked against C. Every one is also probed for how much of + * built as q*n + r. D+ is the call-free version in 5.7, checked against C + * over every quadruple of the edge vectors and pseudo-random pairs. /MOD, + * U>, ABS, S>D and DABS are as written in section 5 and checked against C. Every one is also probed for how much of * the 10- and 9-deep circular stacks (D-2) it leaves to its caller. * * Every call is made with a canary under the arguments, and the canary must @@ -235,11 +236,41 @@ static void build(void) w_s2d = v4_asm_label(&as); O(DUP); CALL(w_zless); O(SEMI); - /* : D+ push SWAP push over + 2DUP U> ROT drop NEGATE pop pop + + ; 5.7 */ - w_dplus = v4_asm_label(&as); - O(PUSH); CALL(w_swap); O(PUSH); O(OVER); O(ADD); O(OVER); O(OVER); - CALL(w_ugreater); CALL(w_rot); O(DROP); CALL(w_negate); - O(RPOP); O(RPOP); O(ADD); O(ADD); O(SEMI); + /* : D+ ( d1 d2 -- d3 ) 5.7, call-free + * push over push push drop pop al bl R: bh ah + * over over xor -if L1 top bits of al, bl differ: + * drop + -if C1 jump C0 carry iff sum's top bit clear + * L1: drop over -if L2 same: carry iff both set + * drop + jump C1 + * L2: drop + + * C0: pop pop + ; + * C1: pop pop + 1 + ; */ + { + v4_asm_ref l1, l2, c1a, c1b, c0a; + v4_cell c0, c1; + + w_dplus = v4_asm_label(&as); + O(PUSH); O(OVER); O(PUSH); O(PUSH); O(DROP); O(RPOP); + O(OVER); O(OVER); O(XOR); + l1 = v4_asm_branch_fwd(&as, V4_OP_MINUS_IF); + O(DROP); O(ADD); + c1a = v4_asm_branch_fwd(&as, V4_OP_MINUS_IF); + c0a = v4_asm_branch_fwd(&as, V4_OP_JUMP); + v4_asm_resolve(&as, l1, v4_asm_label(&as)); + O(DROP); O(OVER); + l2 = v4_asm_branch_fwd(&as, V4_OP_MINUS_IF); + O(DROP); O(ADD); + c1b = v4_asm_branch_fwd(&as, V4_OP_JUMP); + v4_asm_resolve(&as, l2, v4_asm_label(&as)); + O(DROP); O(ADD); + c0 = v4_asm_label(&as); + O(RPOP); O(RPOP); O(ADD); O(SEMI); + c1 = v4_asm_label(&as); + O(RPOP); O(RPOP); O(ADD); LIT(1); O(ADD); O(SEMI); + v4_asm_resolve(&as, c0a, c0); + v4_asm_resolve(&as, c1a, c1); + v4_asm_resolve(&as, c1b, c1); + } /* : DNEGATE ( d -- -d ) 5.7, call-free * inv over if L1 drop push inv 1 + pop ; @@ -618,6 +649,21 @@ int main(void) } } + /* D+ on pseudo-random doubles, weighted toward low cells whose top bits + * decide the carry. */ + { + v4_ucell x = (v4_ucell)0x41C64E6Du, v[4], sl, sh; + for (unsigned i = 0; i < 20000; i++) { + for (unsigned k = 0; k < 4; k++) { x ^= x << 13; x ^= x >> 7; x ^= x << 17; v[k] = x; } + if (i & 1u) v[0] |= V4_MSB; + if (i & 2u) v[2] |= V4_MSB; + if (i & 4u) v[2] = 0u - v[0]; /* low sum wraps to 0 */ + dadd(v[0], v[1], v[2], v[3], &sl, &sh); + CHECK(call4(w_dplus, (v4_cell)v[0], (v4_cell)v[1], (v4_cell)v[2], (v4_cell)v[3]) + && left2((v4_cell)sl, (v4_cell)sh), "D+ random [%u]", i); + } + } + /* Stack headroom of the two longest definitions. */ { static const v4_cell umstar_args[][4] = { @@ -647,9 +693,12 @@ int main(void) headroom("ABS", w_abs, 1, one_args, 3, 1, &dh, &rh); headroom("U>", w_ugreater, 2, two_args, 5, 1, &dh, &rh); static const v4_cell dplus_args[][4] = { - { -1, 0, 1, 0 }, { 5, 7, 9, 11 }, { -1, -1, -1, -1 }, { (v4_cell)V4_MSB, 0, 1, 0 } + { -1, 0, 1, 0 }, { 5, 7, 9, 11 }, { -1, -1, -1, -1 }, + { (v4_cell)V4_MSB, 0, 1, 0 }, { (v4_cell)V4_MSB, 0, (v4_cell)V4_MSB, 0 }, + { 1, 0, 2, 0 } }; - headroom("D+", w_dplus, 4, dplus_args, 4, 2, &dh, &rh); + headroom("D+", w_dplus, 4, dplus_args, 6, 2, &dh, &rh); + CHECK(rh >= 5, "D+ leaves 5 return entries"); headroom("DNEGATE", w_dnegate, 2, two_args, 5, 2, &dh, &rh); headroom("DABS", w_dabs, 2, two_args, 5, 2, &dh, &rh); headroom("SM/REM", w_smrem, 3, smrem_args, 5, 2, &dh, &rh); -- 2.54.0 From 6a371b850ef057176df1286778b0e1a50373befe Mon Sep 17 00:00:00 2001 From: rajames Date: Fri, 2 Oct 2026 22:50:30 -0400 Subject: [PATCH 009/135] test(v4.0.0): execute M+, D-, D0= and D= on the golden model All four run exactly as written in DECOMPOSITION.md 5.6/5.7 and need no change now that D+ and DNEGATE are call-free. Checked against C at 32- and 64-bit cells, optimised and ASan+UBSan: every edge-vector combination (M+ over all triples, D- and D= over all 50625 quadruples, D0= over all pairs) plus 20000 pseudo-random cases weighted to equal low or high cells and low sums that wrap to 0. Mutations of D0= and M+ are caught. Headroom (data cells under args / return entries under return address): M+ 6/4, D- 5/4, D0= 7/7, D= 5/3. Co-Authored-By: Claude Opus 5.5 --- docs/v4.0.0/DECOMPOSITION.md | 8 ++-- v4/tests/test_foundation.c | 77 +++++++++++++++++++++++++++++++++++- 2 files changed, 79 insertions(+), 6 deletions(-) diff --git a/docs/v4.0.0/DECOMPOSITION.md b/docs/v4.0.0/DECOMPOSITION.md index bf5985b5..a2c96efd 100644 --- a/docs/v4.0.0/DECOMPOSITION.md +++ b/docs/v4.0.0/DECOMPOSITION.md @@ -390,7 +390,7 @@ A double is two 32-bit cells on a mesh node. | Word | Fate | v4 definition | | --- | --- | --- | -| `M+` | CAP | `S>D D+` | +| `M+` | CAP | `S>D D+` — executed on the golden model (2026-10-02). | | `M-` | CAP | `NEGATE M+` | | `M*` | CAP | `2DUP xor push ABS SWAP ABS UM* pop 0< IF DNEGATE THEN` | | `M/MOD` | CAP | `SM/REM` | @@ -406,11 +406,11 @@ A double is two 32-bit cells on a mesh node. | `S>D` | CAP | `dup 0<` — executed on the golden model (2026-10-02). | | `D+` | CAP | `push over push push drop pop over over xor -if L1 drop + -if C1 jump C0 L1: drop over -if L2 drop + jump C1 L2: drop + C0: pop pop + ; C1: pop pop + 1 + ;` — call-free. The carry out of the low cells is found by sign tests: if their top bits differ, there is a carry exactly when the sum's top bit is clear; if they match, exactly when both are set. Executed on the golden model (2026-10-02); leaves its caller 6 data cells under its arguments and 5 return entries. Replaces `push SWAP push over + 2DUP U> ROT drop NEGATE pop pop + +`, which was exact but left 1 return entry. | | `DNEGATE` | CAP | `inv over if L1 drop push inv 1 + pop ; L1: drop 1 + ;` — call-free: `~d + 1`, carrying into the high cell exactly when the low cell is 0. Executed on the golden model (2026-10-02). Replaces `inv SWAP inv SWAP 1 0 D+`, which left a caller no return-stack room, so `DABS` could not run at all. | -| `D-` | CAP | `DNEGATE D+` | +| `D-` | CAP | `DNEGATE D+` — executed on the golden model (2026-10-02). | | `DABS` | CAP | `dup 0< IF DNEGATE THEN` — executed on the golden model (2026-10-02). | -| `D0=` | CAP | `OR 0=` | +| `D0=` | CAP | `OR 0=` — executed on the golden model (2026-10-02). | | `D0<` | CAP | `NIP 0<` | -| `D=` | CAP | `D- D0=` | +| `D=` | CAP | `D- D0=` — executed on the golden model (2026-10-02). | | `D<` | CAP | `ROT 2DUP = IF 2DROP U< ELSE SWAP < NIP NIP THEN` | | `DMAX` | CAP | `2OVER 2OVER D< IF 2SWAP THEN 2DROP` | | `DMIN` | CAP | `2OVER 2OVER D< 0= IF 2SWAP THEN 2DROP` | diff --git a/v4/tests/test_foundation.c b/v4/tests/test_foundation.c index ecea80b0..d7ae7676 100644 --- a/v4/tests/test_foundation.c +++ b/v4/tests/test_foundation.c @@ -14,7 +14,8 @@ * call-free versions in sections 4 and 5.7; SM/REM is checked on dividends * built as q*n + r. D+ is the call-free version in 5.7, checked against C * over every quadruple of the edge vectors and pseudo-random pairs. /MOD, - * U>, ABS, S>D and DABS are as written in section 5 and checked against C. Every one is also probed for how much of + * U>, ABS, S>D, DABS, M+, D-, D0= and D= are as written in section 5 and + * checked against C. Every one is also probed for how much of * the 10- and 9-deep circular stacks (D-2) it leaves to its caller. * * Every call is made with a canary under the arguments, and the canary must @@ -41,7 +42,7 @@ static v4_asm as; static v4_cell w_nip, w_swap, w_or, w_negate, w_rot, w_zless, w_zequal, w_2dup, w_minus, w_uless, w_umstar, w_ummod, w_ugreater, w_abs, w_s2d, w_dplus, w_dnegate, w_dabs, w_smrem, - w_slashmod; + w_slashmod, w_mplus, w_dminus, w_d0equal, w_dequal; #define O(name) v4_asm_op(&as, V4_OP_##name) #define LIT(v) v4_asm_lit(&as, (v4_cell)(v)) @@ -325,6 +326,22 @@ static void build(void) w_slashmod = v4_asm_label(&as); O(PUSH); CALL(w_s2d); O(RPOP); CALL(w_smrem); O(SEMI); + /* : M+ S>D D+ ; 5.6 */ + w_mplus = v4_asm_label(&as); + CALL(w_s2d); CALL(w_dplus); O(SEMI); + + /* : D- DNEGATE D+ ; 5.7 */ + w_dminus = v4_asm_label(&as); + CALL(w_dnegate); CALL(w_dplus); O(SEMI); + + /* : D0= OR 0= ; 5.7 */ + w_d0equal = v4_asm_label(&as); + CALL(w_or); CALL(w_zequal); O(SEMI); + + /* : D= D- D0= ; 5.7 */ + w_dequal = v4_asm_label(&as); + CALL(w_dminus); CALL(w_d0equal); O(SEMI); + CHECK(v4_asm_ok(&as), "foundation words assemble"); } @@ -664,6 +681,50 @@ int main(void) } } + /* M+, D-, D0= and D= against C: every edge-vector combination, then + * pseudo-random doubles. */ + for (unsigned i = 0; i < NVEC; i++) + for (unsigned j = 0; j < NVEC; j++) { + v4_ucell ua = (v4_ucell)vec[i], ub = (v4_ucell)vec[j], rl, rh; + CHECK(call(w_d0equal, 2, vec[i], vec[j], 0) && left1(FLAG(ua == 0 && ub == 0)), + "D0= [%u,%u]", i, j); + for (unsigned k = 0; k < NVEC; k++) { + v4_cell c = vec[k]; + dadd(ua, ub, (v4_ucell)c, c < 0 ? MAXU : 0u, &rl, &rh); + CHECK(call(w_mplus, 3, vec[i], vec[j], c) && left2((v4_cell)rl, (v4_cell)rh), + "M+ [%u,%u,%u]", i, j, k); + for (unsigned l = 0; l < NVEC; l++) { + v4_ucell nl, nh; + dneg((v4_ucell)vec[k], (v4_ucell)vec[l], &nl, &nh); + dadd(ua, ub, nl, nh, &rl, &rh); + CHECK(call4(w_dminus, vec[i], vec[j], vec[k], vec[l]) + && left2((v4_cell)rl, (v4_cell)rh), "D- [%u,%u,%u,%u]", i, j, k, l); + CHECK(call4(w_dequal, vec[i], vec[j], vec[k], vec[l]) + && left1(FLAG(i == k && j == l)), "D= [%u,%u,%u,%u]", i, j, k, l); + } + } + } + { + v4_ucell x = (v4_ucell)0x5851F42Du, v[4], rl, rh, nl, nh; + for (unsigned i = 0; i < 20000; i++) { + for (unsigned k = 0; k < 4; k++) { x ^= x << 13; x ^= x >> 7; x ^= x << 17; v[k] = x; } + if (i & 1u) v[2] = v[0]; /* equal low cells */ + if (i & 2u) v[3] = v[1]; /* equal high cells */ + if (i & 4u) v[2] = 0u - v[0]; /* low sum wraps */ + dadd(v[0], v[1], v[2], (v4_cell)v[2] < 0 ? MAXU : 0u, &rl, &rh); + CHECK(call(w_mplus, 3, (v4_cell)v[0], (v4_cell)v[1], (v4_cell)v[2]) + && left2((v4_cell)rl, (v4_cell)rh), "M+ random [%u]", i); + dneg(v[2], v[3], &nl, &nh); + dadd(v[0], v[1], nl, nh, &rl, &rh); + CHECK(call4(w_dminus, (v4_cell)v[0], (v4_cell)v[1], (v4_cell)v[2], (v4_cell)v[3]) + && left2((v4_cell)rl, (v4_cell)rh), "D- random [%u]", i); + CHECK(call4(w_dequal, (v4_cell)v[0], (v4_cell)v[1], (v4_cell)v[2], (v4_cell)v[3]) + && left1(FLAG(v[0] == v[2] && v[1] == v[3])), "D= random [%u]", i); + CHECK(call(w_d0equal, 2, (v4_cell)(v[0] & v[2]), (v4_cell)(v[1] & v[3]), 0) + && left1(FLAG((v[0] & v[2]) == 0 && (v[1] & v[3]) == 0)), "D0= random [%u]", i); + } + } + /* Stack headroom of the two longest definitions. */ { static const v4_cell umstar_args[][4] = { @@ -701,6 +762,18 @@ int main(void) CHECK(rh >= 5, "D+ leaves 5 return entries"); headroom("DNEGATE", w_dnegate, 2, two_args, 5, 2, &dh, &rh); headroom("DABS", w_dabs, 2, two_args, 5, 2, &dh, &rh); + static const v4_cell mplus_args[][4] = { + { -1, 0, 1, 0 }, { 5, 7, -9, 0 }, { 0, 0, -1, 0 }, { (v4_cell)V4_MSB, 0, (v4_cell)V4_MSB, 0 } + }; + static const v4_cell dsub_args[][4] = { + { 0, 0, 1, 0 }, { 5, 7, 9, 11 }, { -1, -1, -1, -1 }, { 0, 1, 0, 1 }, + { (v4_cell)V4_MSB, 0, (v4_cell)V4_MSB, 0 }, { 1, 0, 2, 0 } + }; + headroom("M+", w_mplus, 3, mplus_args, 4, 2, &dh, &rh); + headroom("D-", w_dminus, 4, dsub_args, 6, 2, &dh, &rh); + headroom("D0=", w_d0equal, 2, two_args, 5, 1, &dh, &rh); + headroom("D=", w_dequal, 4, dsub_args, 6, 1, &dh, &rh); + CHECK(dh >= 0 && rh >= 0, "D= runs at all"); headroom("SM/REM", w_smrem, 3, smrem_args, 5, 2, &dh, &rh); CHECK(rh >= 1, "SM/REM leaves room for /MOD's return address"); headroom("/MOD", w_slashmod, 2, slashmod_args, 4, 2, &dh, &rh); -- 2.54.0 From 5ac52f19d6ab9e6458fa89eedac36e39a2fd1dd1 Mon Sep 17 00:00:00 2001 From: rajames Date: Fri, 2 Oct 2026 22:52:27 -0400 Subject: [PATCH 010/135] test(v4.0.0): execute Q.+ and Q.- against v3 Q48.16 DECOMPOSITION.md 5.26 makes Q.+ and Q.- the D+ and D- words. They are checked against v3's q48_add/q48_sub (uint64_t a + b, a - b, wrapping) on every pair of 15 edge Q values (0, ulp, 0.5, 1.0, 1.5, -1.0, -ulp, values across the 32-bit seam, Q max and min, +-12345.0) and 20000 pseudo-random pairs, 2682 of which overflow Q48.16. - 32-bit cells: bit-for-bit v3's result, overflow wrap included. - 64-bit cells, with a Q value as a sign-extended double: the low cell is v3's result; on overflow the high cell holds the true carry where v3 wraps. Whether a Q value is one cell or two on a 64-bit node is not ruled; recorded as open in 5.26. Co-Authored-By: Claude Opus 5.5 --- docs/v4.0.0/DECOMPOSITION.md | 2 +- v4/tests/test_foundation.c | 72 ++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 1 deletion(-) diff --git a/docs/v4.0.0/DECOMPOSITION.md b/docs/v4.0.0/DECOMPOSITION.md index a2c96efd..c85b7678 100644 --- a/docs/v4.0.0/DECOMPOSITION.md +++ b/docs/v4.0.0/DECOMPOSITION.md @@ -644,7 +644,7 @@ word. Per D-8, v4 Q values are signed. | Word | Fate | Notes | | --- | --- | --- | -| `Q.+` `Q.-` | CAP | `D+`, `D-` | +| `Q.+` `Q.-` | CAP | `D+`, `D-` — executed on the golden model (2026-10-02) against v3's `q48_add`/`q48_sub` (`uint64_t` wrapping). At 32-bit cells the result is bit-for-bit v3's, overflow included. **Open:** at 64-bit cells a Q value as a sign-extended double has the same low cell as v3, but on Q48.16 overflow the high cell holds the true carry where v3 wraps. Whether a Q value is one cell or two on a 64-bit node is not yet ruled. | | `Q.*` | CAP | 64×64 product from four `UM*` partial products, shifted right 16. | | `Q./` | CAP | Shifted long division. **Division by zero sets an error** (v3 returned 0 silently). | | `Q.ABS` `Q.NEG` | CAP | `DABS`, `DNEGATE` | diff --git a/v4/tests/test_foundation.c b/v4/tests/test_foundation.c index d7ae7676..299d4d8e 100644 --- a/v4/tests/test_foundation.c +++ b/v4/tests/test_foundation.c @@ -25,6 +25,7 @@ #include "v4/asm.h" #include "v4/testcode.h" #include "v4/umul.h" +#include #include static int failures = 0, checks = 0; @@ -455,6 +456,46 @@ static int smrem_exact(v4_cell q, v4_cell nn, v4_cell r) return call(w_smrem, 3, (v4_cell)dl, (v4_cell)dh, nn) && left2(r, q); } +/* Q48.16 (section 5.26). v3's Q.+ and Q.- are uint64_t a + b and a - b, + * wrapping (v3/include/q48_16.h). Here a Q value is a double: at 32-bit + * cells its two halves, at 64-bit cells the value sign-extended (D-8). */ +static void qcells(uint64_t q, v4_cell *lo, v4_cell *hi) +{ +#if V4_CELL_BITS == 32 + *lo = (v4_cell)(v4_ucell)(q & 0xFFFFFFFFu); + *hi = (v4_cell)(v4_ucell)(q >> 32); +#else + *lo = (v4_cell)(v4_ucell)q; + *hi = (q >> 63) ? V4_ALL_ONES : 0; +#endif +} + +/* Run Q.+ (the D+ word) or Q.- (the D- word) on a and b and compare with + * v3's 64-bit wrapping result. At 32-bit cells the double must equal v3's + * value bit for bit. At 64-bit cells the low cell must equal v3's value and + * the high cell must be the true sign of the unwrapped result. */ +static int q_matches_v3(v4_cell word, uint64_t a, uint64_t b, uint64_t v3) +{ + v4_cell al, ah, bl, bh, rl, rh; + qcells(a, &al, &ah); + qcells(b, &bl, &bh); + if (!call4(word, al, ah, bl, bh)) return 0; +#if V4_CELL_BITS == 32 + qcells(v3, &rl, &rh); + return left2(rl, rh); +#else + { + v4_ucell xl, xh, nl, nh; + if (word == w_dminus) { dneg((v4_ucell)bl, (v4_ucell)bh, &nl, &nh); } + else { nl = (v4_ucell)bl; nh = (v4_ucell)bh; } + dadd((v4_ucell)al, (v4_ucell)ah, nl, nh, &xl, &xh); + rl = (v4_cell)(v4_ucell)v3; + rh = (v4_cell)xh; + return (v4_ucell)rl == xl && left2(rl, rh); + } +#endif +} + /* Stack headroom. Run `word` with `dfill` marked cells under the canary and * `rfill` marked cells under its return address, and report whether the * results, the canary and every marked cell come back intact. The F18 stacks @@ -725,6 +766,37 @@ int main(void) } } + /* Q.+ and Q.- (section 5.26: the D+ and D- words) against v3. */ + { + static const uint64_t qv[] = { + 0, 1, 0x8000u, 0x10000u, 0x18000u, /* 0, ulp, 0.5, 1.0, 1.5 */ + (uint64_t)0 - 0x10000u, (uint64_t)0 - 1u, /* -1.0, -ulp */ + 0xFFFFu, 0x10001u, 0xFFFFFFFFu, 0x100000000u, /* across the 32-bit seam */ + ((uint64_t)1 << 63) - 1u, (uint64_t)1 << 63, /* Q max, Q min */ + (uint64_t)12345 << 16, (uint64_t)0 - ((uint64_t)12345 << 16) + }; + const unsigned nq = sizeof qv / sizeof qv[0]; + uint64_t x = 0x9E3779B97F4A7C15u; + unsigned over = 0; + + for (unsigned i = 0; i < nq; i++) + for (unsigned j = 0; j < nq; j++) { + CHECK(q_matches_v3(w_dplus, qv[i], qv[j], qv[i] + qv[j]), "Q.+ [%u,%u]", i, j); + CHECK(q_matches_v3(w_dminus, qv[i], qv[j], qv[i] - qv[j]), "Q.- [%u,%u]", i, j); + } + for (unsigned i = 0; i < 20000; i++) { + uint64_t a, b; + x ^= x << 13; x ^= x >> 7; x ^= x << 17; a = x; + x ^= x << 13; x ^= x >> 7; x ^= x << 17; b = x; + if (i & 1u) a >>= (unsigned)(x & 63u); /* mixed magnitudes */ + if (i & 2u) b = (uint64_t)0 - b; + if (((a + b) ^ a) & ((a + b) ^ b) & ((uint64_t)1 << 63)) over++; + CHECK(q_matches_v3(w_dplus, a, b, a + b), "Q.+ random [%u]", i); + CHECK(q_matches_v3(w_dminus, a, b, a - b), "Q.- random [%u]", i); + } + printf(" Q.+ random cases that overflow Q48.16: %u of 20000\n", over); + } + /* Stack headroom of the two longest definitions. */ { static const v4_cell umstar_args[][4] = { -- 2.54.0 From 4f493fa317adc852dbcfec639d7e59c104260aa6 Mon Sep 17 00:00:00 2001 From: rajames Date: Fri, 2 Oct 2026 22:52:54 -0400 Subject: [PATCH 011/135] test(v4.0.0): note Q.+/Q.- coverage in test_foundation.c header Co-Authored-By: Claude Opus 5.5 --- v4/tests/test_foundation.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/v4/tests/test_foundation.c b/v4/tests/test_foundation.c index 299d4d8e..4387b674 100644 --- a/v4/tests/test_foundation.c +++ b/v4/tests/test_foundation.c @@ -15,8 +15,10 @@ * built as q*n + r. D+ is the call-free version in 5.7, checked against C * over every quadruple of the edge vectors and pseudo-random pairs. /MOD, * U>, ABS, S>D, DABS, M+, D-, D0= and D= are as written in section 5 and - * checked against C. Every one is also probed for how much of - * the 10- and 9-deep circular stacks (D-2) it leaves to its caller. + * checked against C. Q.+ and Q.- (section 5.26: the D+ and D- words) are + * checked against v3's 64-bit wrapping q48_add and q48_sub. Every word is + * also probed for how much of the 10- and 9-deep circular stacks (D-2) it + * leaves to its caller. * * Every call is made with a canary under the arguments, and the canary must * still be directly under the results afterwards: a definition that leaves -- 2.54.0 From d948e0c1a3546acd81dd4eb797318ff20de1f35c Mon Sep 17 00:00:00 2001 From: rajames Date: Fri, 2 Oct 2026 22:54:40 -0400 Subject: [PATCH 012/135] test(v4.0.0): D-10 two-cell Q48.16; execute Q.ABS and Q.NEG against v3 D-10 (ruled 2026-10-02): a Q48.16 value is two cells at every cell width, so every Q word is the same double word on 32- and 64-bit nodes. Recorded in DECOMPOSITION.md section 3 and 5.26; the open note on the Q.+/Q.- row is resolved by it. Q.ABS and Q.NEG are the DABS and DNEGATE words. Checked against v3's q48_abs and 0 - q on the 15 edge Q values and 20000 pseudo-random values, at 32- and 64-bit cells, optimised and ASan+UBSan: - 32-bit cells: bit-for-bit v3, including v3's wrap of Q min to itself. - 64-bit cells: the low cell is v3's; the high cell is the true sign (so ABS and NEG of Q min give +2^63 rather than wrapping), per D-10. Breaking DNEGATE's carry fails Q.NEG, Q.ABS and Q.- checks. Co-Authored-By: Claude Opus 5.5 --- docs/v4.0.0/DECOMPOSITION.md | 7 +++--- v4/tests/test_foundation.c | 44 ++++++++++++++++++++++++++++++++++-- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/docs/v4.0.0/DECOMPOSITION.md b/docs/v4.0.0/DECOMPOSITION.md index c85b7678..e4e2340d 100644 --- a/docs/v4.0.0/DECOMPOSITION.md +++ b/docs/v4.0.0/DECOMPOSITION.md @@ -171,6 +171,7 @@ definition below depends on one, it says so. | **D-7** | `ROLL` semantics. | **Moot.** `ROLL` is retired under D-2. | | **D-8** | Q48.16 signedness. | **Signed.** v3's unsigned comparisons and `Q.FROM-INT` clamping are retired. | | **D-9** | Instruction word width on a 64-bit-cell host (ruled 2026-10-02). | **32 bits at every cell width.** Six 5-bit slots plus 2 spare bits, as in §1.2. On a 64-bit host the instruction word is the low 32 bits of the cell and the high half is ignored, so compiled code is identical at both widths. Only data and `@p` literals are a full cell wide. | +| **D-10** | Q48.16 width on a 64-bit-cell node (ruled 2026-10-02). | **Two cells at every cell width.** A Q value is a signed double on 32- and 64-bit nodes alike, so every Q word is the same double word at both widths. At 32-bit cells this is bit-for-bit v3's 64-bit Q. At 64-bit cells the low cell is v3's value, and where v3 wraps on Q48.16 overflow (a sum past Q max, `ABS` or `NEG` of Q min) the high cell carries the true result instead. | **Consequences of D-2 that every definition must respect.** The data stack holds 10 items and the return stack 9, and every `call`, `FOR`, `DO` loop frame and `push` uses return-stack slots. Nesting @@ -640,14 +641,14 @@ index should use them; they cost one instruction per iteration. ### 5.26 Q48.16 fixed-point math A Q48.16 value is 64 bits, so on a 32-bit node it occupies **two cells** and every Q word is a double -word. Per D-8, v4 Q values are signed. +word. Per D-10 it occupies two cells on a 64-bit node too. Per D-8, v4 Q values are signed. | Word | Fate | Notes | | --- | --- | --- | -| `Q.+` `Q.-` | CAP | `D+`, `D-` — executed on the golden model (2026-10-02) against v3's `q48_add`/`q48_sub` (`uint64_t` wrapping). At 32-bit cells the result is bit-for-bit v3's, overflow included. **Open:** at 64-bit cells a Q value as a sign-extended double has the same low cell as v3, but on Q48.16 overflow the high cell holds the true carry where v3 wraps. Whether a Q value is one cell or two on a 64-bit node is not yet ruled. | +| `Q.+` `Q.-` | CAP | `D+`, `D-` — executed on the golden model (2026-10-02) against v3's `q48_add`/`q48_sub` (`uint64_t` wrapping): bit-for-bit at 32-bit cells; at 64-bit cells the low cell is v3's, per D-10. | | `Q.*` | CAP | 64×64 product from four `UM*` partial products, shifted right 16. | | `Q./` | CAP | Shifted long division. **Division by zero sets an error** (v3 returned 0 silently). | -| `Q.ABS` `Q.NEG` | CAP | `DABS`, `DNEGATE` | +| `Q.ABS` `Q.NEG` | CAP | `DABS`, `DNEGATE` — executed on the golden model (2026-10-02) against v3's `q48_abs` and `0 - q`: bit-for-bit at 32-bit cells, including v3's wrap of Q min to itself; at 64-bit cells the low cell is v3's and the high cell is the true sign, per D-10. | | `Q.LOG` `Q.EXP` `Q.SQRT` `Q.SIN` `Q.COS` | CAP | Algorithms ported from `q48_words.c`; the hosted C versions are the golden model. | | `Q.FROM-INT` | CAP | `S>D` shifted left 16. Negative values are no longer clamped to 0. | | `Q.TO-INT` | CAP | Shift right 16, take the low cell. | diff --git a/v4/tests/test_foundation.c b/v4/tests/test_foundation.c index 4387b674..a8512021 100644 --- a/v4/tests/test_foundation.c +++ b/v4/tests/test_foundation.c @@ -15,8 +15,9 @@ * built as q*n + r. D+ is the call-free version in 5.7, checked against C * over every quadruple of the edge vectors and pseudo-random pairs. /MOD, * U>, ABS, S>D, DABS, M+, D-, D0= and D= are as written in section 5 and - * checked against C. Q.+ and Q.- (section 5.26: the D+ and D- words) are - * checked against v3's 64-bit wrapping q48_add and q48_sub. Every word is + * checked against C. Q.+, Q.-, Q.ABS and Q.NEG (section 5.26: the D+, D-, + * DABS and DNEGATE words) are checked against v3's 64-bit q48_add, q48_sub, + * q48_abs and 0 - q, with Q values two cells wide at both widths (D-10). Every word is * also probed for how much of the 10- and 9-deep circular stacks (D-2) it * leaves to its caller. * @@ -498,6 +499,28 @@ static int q_matches_v3(v4_cell word, uint64_t a, uint64_t b, uint64_t v3) #endif } +/* The same for the one-operand Q words: Q.ABS (the DABS word) and Q.NEG + * (the DNEGATE word). `wl`, `wh` is the exact double result, which at + * 64-bit cells may differ from v3 in the high cell only (D-10). */ +static int q1_matches_v3(v4_cell word, uint64_t a, uint64_t v3) +{ + v4_cell al, ah, rl, rh; + v4_ucell xl, xh; + qcells(a, &al, &ah); + if (!call(word, 2, al, ah, 0)) return 0; +#if V4_CELL_BITS == 32 + (void)xl; (void)xh; + qcells(v3, &rl, &rh); + return left2(rl, rh); +#else + if (word == w_dnegate || ah < 0) dneg((v4_ucell)al, (v4_ucell)ah, &xl, &xh); + else { xl = (v4_ucell)al; xh = (v4_ucell)ah; } + rl = (v4_cell)(v4_ucell)v3; + rh = (v4_cell)xh; + return (v4_ucell)rl == xl && left2(rl, rh); +#endif +} + /* Stack headroom. Run `word` with `dfill` marked cells under the canary and * `rfill` marked cells under its return address, and report whether the * results, the canary and every marked cell come back intact. The F18 stacks @@ -797,6 +820,23 @@ int main(void) CHECK(q_matches_v3(w_dminus, a, b, a - b), "Q.- random [%u]", i); } printf(" Q.+ random cases that overflow Q48.16: %u of 20000\n", over); + + /* Q.ABS and Q.NEG against v3's q48_abs and 0 - q. */ + for (unsigned i = 0; i < nq; i++) { + uint64_t q = qv[i]; + CHECK(q1_matches_v3(w_dabs, q, (q < ((uint64_t)1 << 63)) ? q : (uint64_t)0 - q), + "Q.ABS [%u]", i); + CHECK(q1_matches_v3(w_dnegate, q, (uint64_t)0 - q), "Q.NEG [%u]", i); + } + for (unsigned i = 0; i < 20000; i++) { + uint64_t q; + x ^= x << 13; x ^= x >> 7; x ^= x << 17; q = x; + if (i & 1u) q >>= (unsigned)(x & 63u); + if (i & 2u) q = (uint64_t)0 - q; + CHECK(q1_matches_v3(w_dabs, q, (q < ((uint64_t)1 << 63)) ? q : (uint64_t)0 - q), + "Q.ABS random [%u]", i); + CHECK(q1_matches_v3(w_dnegate, q, (uint64_t)0 - q), "Q.NEG random [%u]", i); + } } /* Stack headroom of the two longest definitions. */ -- 2.54.0 From 981f4180ced30a151bfa74fd7da23e64c4998c16 Mon Sep 17 00:00:00 2001 From: rajames Date: Fri, 2 Oct 2026 22:58:04 -0400 Subject: [PATCH 013/135] feat(v4.0.0): Q.FROM-INT and Q.TO-INT as +* double shifts DECOMPOSITION.md 5.26 described both words in prose only. They are now written out, call-free, on one observation: +* with S = 0 never adds, so each step is an exact arithmetic right shift of the double T:A. : Q.FROM-INT ( n -- q ) push 0 a! 0 pop 15 FOR +* UNEXT push drop a pop ; T:A = n:0 is n * 2^N; N-16 shifts leave n * 2^16 (count 15 at 32-bit cells, 47 at 64). : Q.TO-INT ( q -- n ) push a! 0 pop 15 FOR +* UNEXT drop drop a ; 16 shifts at every width; the low cell is left in A. Rounds toward minus infinity, as v3's arithmetic shift does. Both clobber A; added to the section 2 list. Checked at 32- and 64-bit cells, optimised and ASan+UBSan: - Q.FROM-INT against n * 2^16 for edge values and 20000 pseudo-random n, and against v3's q48_from_u64 for n >= 0 (low cell at 64-bit, D-10). - Q.TO-INT against v3's (int64_t)q >> 16 on the edge Q values and 20000 pseudo-random Q values, and against a C double shift on 20000 arbitrary doubles. - Round trip Q.TO-INT(Q.FROM-INT(n)) = n. Mutating either shift count or the S = 0 setup fails 40000+ checks. Note: make sanitize prints UBSan reports but does not fail on them. One was found here, in the test's own random shift amount (fixed); a grep of the full sanitize output now shows no runtime errors. Co-Authored-By: Claude Opus 5.5 --- docs/v4.0.0/DECOMPOSITION.md | 6 +-- v4/tests/test_foundation.c | 99 +++++++++++++++++++++++++++++++++++- 2 files changed, 100 insertions(+), 5 deletions(-) diff --git a/docs/v4.0.0/DECOMPOSITION.md b/docs/v4.0.0/DECOMPOSITION.md index e4e2340d..6d07a2f0 100644 --- a/docs/v4.0.0/DECOMPOSITION.md +++ b/docs/v4.0.0/DECOMPOSITION.md @@ -147,7 +147,7 @@ IF body1 ELSE body2 THEN → if L1 drop body1 jump L2 times, as on the F18. `FOR ... UNEXT` is the same but the body must fit in one instruction word. **Register conventions.** `A` and `B` are caller-saved. A word that uses them says so. Words in this -document that clobber `A`: `@ ! +! -! 2@ 2! C@ C! UM* * UM/MOD SEND RECV`. Words that clobber `B`: +document that clobber `A`: `@ ! +! -! 2@ 2! C@ C! UM* * UM/MOD Q.FROM-INT Q.TO-INT SEND RECV`. Words that clobber `B`: `SEND RECV`. **Return-stack words** (`>R R> R@ 2>R 2R> 2R@ I J UNLOOP` and the loop runtimes) are always IN. @@ -650,8 +650,8 @@ word. Per D-10 it occupies two cells on a 64-bit node too. Per D-8, v4 Q values | `Q./` | CAP | Shifted long division. **Division by zero sets an error** (v3 returned 0 silently). | | `Q.ABS` `Q.NEG` | CAP | `DABS`, `DNEGATE` — executed on the golden model (2026-10-02) against v3's `q48_abs` and `0 - q`: bit-for-bit at 32-bit cells, including v3's wrap of Q min to itself; at 64-bit cells the low cell is v3's and the high cell is the true sign, per D-10. | | `Q.LOG` `Q.EXP` `Q.SQRT` `Q.SIN` `Q.COS` | CAP | Algorithms ported from `q48_words.c`; the hosted C versions are the golden model. | -| `Q.FROM-INT` | CAP | `S>D` shifted left 16. Negative values are no longer clamped to 0. | -| `Q.TO-INT` | CAP | Shift right 16, take the low cell. | +| `Q.FROM-INT` | CAP | `push 0 a! 0 pop 15 FOR +* UNEXT push drop a pop` — `n * 2^16` as a signed double. `+*` with `S = 0` never adds, so each step is an exact arithmetic right shift of `T:A`; starting from `T:A = n:0` (that is, `n * 2^N`) and shifting `N-16` bits leaves `n * 2^16`. The count is `N-17`: 15 at 32-bit cells, 47 at 64. Negative values are no longer clamped to 0. Executed on the golden model (2026-10-02): matches v3's `q48_from_u64` for `n >= 0` (at 64-bit cells in the low cell, where v3 wraps for `n >= 2^47`, per D-10). Clobbers `A`. | +| `Q.TO-INT` | CAP | `push a! 0 pop 15 FOR +* UNEXT drop drop a` — the same `+*` shift, 16 bits at every cell width, leaving the low cell in `A`. Rounds toward minus infinity, as v3's arithmetic shift does (−1.5 gives −2). Executed on the golden model (2026-10-02): v3's `q48_to_u64` exactly at 64-bit cells, its low cell at 32. Clobbers `A`. | | `Q.1` `Q.0` `Q.SCALE` | IN | Double-cell constants. | | `Q.=` `Q.<` `Q.>` `Q.0=` `Q.MAX` `Q.MIN` | CAP | `D=`, `D<`, `SWAP D<` (for `Q.>`), `D0=`, `DMAX`, `DMIN`. Signed. | | `Q.PRINT` | CAP | Pictured output, five fractional digits. | diff --git a/v4/tests/test_foundation.c b/v4/tests/test_foundation.c index a8512021..da962186 100644 --- a/v4/tests/test_foundation.c +++ b/v4/tests/test_foundation.c @@ -17,7 +17,9 @@ * U>, ABS, S>D, DABS, M+, D-, D0= and D= are as written in section 5 and * checked against C. Q.+, Q.-, Q.ABS and Q.NEG (section 5.26: the D+, D-, * DABS and DNEGATE words) are checked against v3's 64-bit q48_add, q48_sub, - * q48_abs and 0 - q, with Q values two cells wide at both widths (D-10). Every word is + * q48_abs and 0 - q, with Q values two cells wide at both widths (D-10). + * Q.FROM-INT and Q.TO-INT are checked against n * 2^16 and q >> 16 in C and + * against v3's q48_from_u64 and q48_to_u64 where v4 keeps v3's meaning. Every word is * also probed for how much of the 10- and 9-deep circular stacks (D-2) it * leaves to its caller. * @@ -46,7 +48,8 @@ static v4_asm as; static v4_cell w_nip, w_swap, w_or, w_negate, w_rot, w_zless, w_zequal, w_2dup, w_minus, w_uless, w_umstar, w_ummod, w_ugreater, w_abs, w_s2d, w_dplus, w_dnegate, w_dabs, w_smrem, - w_slashmod, w_mplus, w_dminus, w_d0equal, w_dequal; + w_slashmod, w_mplus, w_dminus, w_d0equal, w_dequal, + w_qfromint, w_qtoint; #define O(name) v4_asm_op(&as, V4_OP_##name) #define LIT(v) v4_asm_lit(&as, (v4_cell)(v)) @@ -346,6 +349,31 @@ static void build(void) w_dequal = v4_asm_label(&as); CALL(w_dminus); CALL(w_d0equal); O(SEMI); + /* +* with S = 0 never adds: each step is an exact arithmetic right shift + * of the double T:A by one bit. Both words below are built on that. */ + + /* : Q.FROM-INT ( n -- q ) 5.26 + * push 0 a! 0 pop 15 FOR +* UNEXT push drop a pop ; + * T:A = n:0 is n * 2^N; shifted right N-16 bits it is n * 2^16. 15 is + * N-17 at 32-bit cells (47 at 64). Clobbers A. */ + w_qfromint = v4_asm_label(&as); + O(PUSH); LIT(0); O(BANG_A); LIT(0); O(RPOP); + LIT(V4_CELL_BITS - 17); O(PUSH); + (void)v4_asm_label(&as); + O(MUL_STEP); O(UNEXT); + O(PUSH); O(DROP); O(PUSH_A); O(RPOP); O(SEMI); + + /* : Q.TO-INT ( q -- n ) 5.26 + * push a! 0 pop 15 FOR +* UNEXT drop drop a ; + * T:A = q shifted right 16 bits; the low cell is A. 15 at every cell + * width. Clobbers A. */ + w_qtoint = v4_asm_label(&as); + O(PUSH); O(BANG_A); LIT(0); O(RPOP); + LIT(15); O(PUSH); + (void)v4_asm_label(&as); + O(MUL_STEP); O(UNEXT); + O(DROP); O(DROP); O(PUSH_A); O(SEMI); + CHECK(v4_asm_ok(&as), "foundation words assemble"); } @@ -521,6 +549,21 @@ static int q1_matches_v3(v4_cell word, uint64_t a, uint64_t v3) #endif } +/* x shifted right `k` bits, arithmetic, without C's implementation-defined + * right shift of a negative value. */ +static v4_ucell asr_u(v4_ucell x, unsigned k) +{ + v4_ucell r = x >> k; + if (k && (x & V4_MSB)) r |= ~(MAXU >> k); + return r; +} +static uint64_t asr64(uint64_t x, unsigned k) +{ + uint64_t r = x >> k; + if (k && (x >> 63)) r |= ~((~(uint64_t)0) >> k); + return r; +} + /* Stack headroom. Run `word` with `dfill` marked cells under the canary and * `rfill` marked cells under its return address, and report whether the * results, the canary and every marked cell come back intact. The F18 stacks @@ -821,6 +864,58 @@ int main(void) } printf(" Q.+ random cases that overflow Q48.16: %u of 20000\n", over); + /* Q.FROM-INT: n * 2^16 as a signed double. v3 clamps n < 0 to 0 + * (section 5.26 retires that) and wraps at 64 bits, so v3's value is + * checked only for n >= 0, and at 64-bit cells only in the low cell + * (D-10). */ + for (unsigned i = 0; i < NVEC + 20000u; i++) { + v4_cell nn, el, eh; + if (i < NVEC) nn = vec[i]; + else { + x ^= x << 13; x ^= x >> 7; x ^= x << 17; + nn = (v4_cell)(v4_ucell)x; + if (i & 1u) nn = (v4_cell)asr_u((v4_ucell)nn, (unsigned)(x >> 58) % V4_CELL_BITS); + } + el = (v4_cell)((v4_ucell)nn << 16); + eh = (v4_cell)asr_u((v4_ucell)nn, V4_CELL_BITS - 16); + CHECK(call(w_qfromint, 1, nn, 0, 0) && left2(el, eh), "Q.FROM-INT [%u]", i); + if (nn >= 0) { + uint64_t v3 = (uint64_t)(v4_ucell)nn << 16; + v4_cell vl, vh; + qcells(v3, &vl, &vh); + CHECK(call(w_qfromint, 1, nn, 0, 0) && n.ds.s == vl + && (V4_CELL_BITS == 64 || n.ds.t == vh), "Q.FROM-INT v3 [%u]", i); + } + /* and back */ + CHECK(call(w_qfromint, 1, nn, 0, 0) + && (v4_test_call(&n, &es, &h, w_qtoint, 100000) > 0) && left1(nn), + "Q.TO-INT Q.FROM-INT [%u]", i); + } + + /* Q.TO-INT: v3's (int64_t)q >> 16, arithmetic. At 32-bit cells the + * result is its low cell; at 64-bit cells it is v3's value exactly. */ + for (unsigned i = 0; i < nq + 20000u; i++) { + uint64_t q; + v4_cell ql, qh; + if (i < nq) q = qv[i]; + else { + x ^= x << 13; x ^= x >> 7; x ^= x << 17; q = x; + if (i & 1u) q = asr64(q, (unsigned)(x >> 58)); + } + qcells(q, &ql, &qh); + CHECK(call(w_qtoint, 2, ql, qh, 0) && left1((v4_cell)(v4_ucell)asr64(q, 16)), + "Q.TO-INT v3 [%u]", i); + } + /* and on any double, not only sign-extended ones */ + for (unsigned i = 0; i < 20000; i++) { + v4_ucell lo, hi; + x ^= x << 13; x ^= x >> 7; x ^= x << 17; lo = (v4_ucell)x; + x ^= x << 13; x ^= x >> 7; x ^= x << 17; hi = (v4_ucell)x; + CHECK(call(w_qtoint, 2, (v4_cell)lo, (v4_cell)hi, 0) + && left1((v4_cell)((lo >> 16) | (hi << (V4_CELL_BITS - 16)))), + "Q.TO-INT double [%u]", i); + } + /* Q.ABS and Q.NEG against v3's q48_abs and 0 - q. */ for (unsigned i = 0; i < nq; i++) { uint64_t q = qv[i]; -- 2.54.0 From 167fdc3973b429b63b9056d83de879c9accb4eaa Mon Sep 17 00:00:00 2001 From: rajames Date: Fri, 2 Oct 2026 22:59:50 -0400 Subject: [PATCH 014/135] build(v4): make UBSan reports fatal in make sanitize Without -fno-sanitize-recover=all, UBSan prints a report and the run carries on to "all v4 tests passed". The sanitize build now aborts on the first report. Verified by rebuilding the test-side shift bug found in 981f4180 with these flags: the run exits 1 at the report. Both test binaries now also depend on v4/Makefile, so a flag change rebuilds them instead of leaving stale binaries in place. Co-Authored-By: Claude Opus 5.5 --- v4/Makefile | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/v4/Makefile b/v4/Makefile index bd8a2905..cfee95fa 100644 --- a/v4/Makefile +++ b/v4/Makefile @@ -56,16 +56,20 @@ endif # AddressSanitizer and UndefinedBehaviorSanitizer at both widths and runs them. # The optimized run catches logic errors, this one catches the out-of-bounds # ring index and the width-dependent shift that a logic-only test cannot see. +# -fno-sanitize-recover=all makes every UBSan report fatal: without it UBSan +# prints the report and carries on, and the run still says "passed". +# +# Both binaries depend on this Makefile, so a flag change rebuilds them. define TEST_RULE -$(BINDIR)/$(1)-$(notdir $(2)): $(2) $$(SRCS) $$(wildcard $(HERE)/include/v4/*.h) +$(BINDIR)/$(1)-$(notdir $(2)): $(2) $$(SRCS) $$(wildcard $(HERE)/include/v4/*.h) $(HERE)/Makefile @mkdir -p $(BINDIR) $$(CC) $$(CFLAGS) -I$(HERE)/include -DV4_CELL_BITS=$(1) \ $(2) $$(SRCS) -o $$@ -$(BINDIR)/san-$(1)-$(notdir $(2)): $(2) $$(SRCS) $$(wildcard $(HERE)/include/v4/*.h) +$(BINDIR)/san-$(1)-$(notdir $(2)): $(2) $$(SRCS) $$(wildcard $(HERE)/include/v4/*.h) $(HERE)/Makefile @mkdir -p $(BINDIR) $$(CC) $$(CSTD) $$(WARN) -O1 -g -fno-omit-frame-pointer \ - -fsanitize=address,undefined -I$(HERE)/include -DV4_CELL_BITS=$(1) \ + -fsanitize=address,undefined -fno-sanitize-recover=all -I$(HERE)/include -DV4_CELL_BITS=$(1) \ $(2) $$(SRCS) -o $$@ endef -- 2.54.0 From d0accdbb88b80159bf845628ccda70677e5f1f54 Mon Sep 17 00:00:00 2001 From: rajames Date: Fri, 2 Oct 2026 23:06:25 -0400 Subject: [PATCH 015/135] feat(v4.0.0): D< and Q comparisons; call-free (D<), DMAX, DMIN, 2SWAP Executed on the golden model as written, and correct: <, =, D<, 2OVER, and Q.=, Q.<, Q.0= (the D=, D<, D0= words). Fixed, because they could not work under D-2 or were wrong: - DMAX, DMIN: 2OVER 2OVER D< needs 8 data cells plus D<'s 2, the whole 10-deep data stack, so both failed on every case once the caller held anything. Rewritten on a new call-free helper (D<) ( d1 d2 -- d1 d2 flag ) which compares copies of the high cells, then the low cells unsigned on a tie, with in-line sign tests; DMAX and DMIN then drop the loser. - 2SWAP: ROT and SWAP written in line. Return headroom 2 -> 4, which also lifts 2OVER 1 -> 3 and Q.> 1 -> 2. - Q.>: section 5.26 gave SWAP D<, which swaps single cells; it was wrong in 11702 of 20169 cases. Now 2SWAP D<. Checked at 32- and 64-bit cells, optimised and ASan+UBSan: every edge-vector quadruple (50625) for D<, (D<), 2SWAP, 2OVER, DMAX and DMIN; Q comparisons on every pair of 13 edge Q values plus 20000 pseudo-random pairs weighted to ties and one-bit differences, signed (D-8) and against v3's unsigned comparisons where both values have the same sign. Mutating any (D<) branch or subtraction fails 700+ checks. The new fatal-UBSan setting caught a test-side array overflow in the headroom probe (results buffer sized 4, six needed); fixed. Co-Authored-By: Claude Opus 5.5 --- docs/v4.0.0/DECOMPOSITION.md | 17 +-- v4/tests/test_foundation.c | 261 ++++++++++++++++++++++++++++++++++- 2 files changed, 267 insertions(+), 11 deletions(-) diff --git a/docs/v4.0.0/DECOMPOSITION.md b/docs/v4.0.0/DECOMPOSITION.md index 6d07a2f0..a3aa3a51 100644 --- a/docs/v4.0.0/DECOMPOSITION.md +++ b/docs/v4.0.0/DECOMPOSITION.md @@ -373,9 +373,9 @@ Section numbers match the v3 primitive reference. | `0=` `0<` | CAP | §4 | | `0<>` | CAP | `0= 0=` | | `0>` | CAP | `dup 0< SWAP 0= OR 0=` (correct for the most negative number) | -| `=` | CAP | `xor 0=` | +| `=` | CAP | `xor 0=` — executed on the golden model (2026-10-02). | | `<>` | CAP | `xor 0<>` | -| `<` | CAP | `2DUP xor 0< IF drop 0< ELSE - 0< THEN` (overflow-safe) | +| `<` | CAP | `2DUP xor 0< IF drop 0< ELSE - 0< THEN` (overflow-safe) — executed on the golden model (2026-10-02). | | `>` | CAP | `SWAP <` | | `<=` | CAP | `> 0=` | | `>=` | CAP | `< 0=` | @@ -412,15 +412,16 @@ A double is two 32-bit cells on a mesh node. | `D0=` | CAP | `OR 0=` — executed on the golden model (2026-10-02). | | `D0<` | CAP | `NIP 0<` | | `D=` | CAP | `D- D0=` — executed on the golden model (2026-10-02). | -| `D<` | CAP | `ROT 2DUP = IF 2DROP U< ELSE SWAP < NIP NIP THEN` | -| `DMAX` | CAP | `2OVER 2OVER D< IF 2SWAP THEN 2DROP` | -| `DMIN` | CAP | `2OVER 2OVER D< 0= IF 2SWAP THEN 2DROP` | +| `D<` | CAP | `ROT 2DUP = IF 2DROP U< ELSE SWAP < NIP NIP THEN` — executed on the golden model (2026-10-02). | +| `(D<)` | CAP | `( d1 d2 -- d1 d2 flag )`, call-free; internal to `DMAX` and `DMIN`. Copies of the high cells go on top; if they differ the flag comes from them, else from the low cells unsigned. The value tested always has its top bit set exactly when `d1 < d2`: `ah` (high signs differ), `ah - bh` (agree), `bl` (low top bits differ), `al - bl` (agree); `x - y` with `y` on top is `push inv pop + inv`. `dup push push over pop over over xor if TIE drop over over xor -if HS drop drop jump S1 HS: drop push inv pop + inv S1: -if N1 drop -1 jump D1 N1: drop 0 D1: pop SWAP ; TIE: drop drop drop dup push push over pop over over xor -if LS drop NIP jump S2 LS: drop push inv pop + inv S2: -if N2 drop -1 jump D2 N2: drop 0 D2: pop pop ROT ;` with `SWAP`, `NIP` and `ROT` in line. Executed on the golden model (2026-10-02). | +| `DMAX` | CAP | `(D<) if L drop push push drop drop pop pop ; L: drop drop drop ;` Executed on the golden model (2026-10-02). Replaces `2OVER 2OVER D< IF 2SWAP THEN 2DROP`, which needs 8 data cells plus `D<`'s 2: the whole 10-deep data stack, so it failed whenever the caller held anything at all (D-2). | +| `DMIN` | CAP | `(D<) if L drop drop drop ; L: drop push push drop drop pop pop ;` Executed on the golden model (2026-10-02); replaces `2OVER 2OVER D< 0= IF 2SWAP THEN 2DROP` for the same reason as `DMAX`. | | `D2*` | CAP | `2* over 0< NEGATE OR SWAP 2* SWAP` | | `D2/` | CAP | `dup 1 and push 2/ SWAP 1 RSHIFT pop IF MSB OR THEN SWAP` | | `2DROP` | IN | `drop drop` | | `2DUP` | IN | `over over` | -| `2SWAP` | CAP | `ROT push ROT pop` | -| `2OVER` | CAP | `push push 2DUP pop pop 2SWAP` | +| `2SWAP` | CAP | `ROT push ROT pop`, with `ROT` and `SWAP` in line so it makes no calls. Executed on the golden model (2026-10-02). Called, `ROT` and `SWAP` left its caller 2 return entries; in line, 4. | +| `2OVER` | CAP | `push push 2DUP pop pop 2SWAP` — executed on the golden model (2026-10-02). | | `2ROT` | CAP | `2>R 2SWAP 2R> 2SWAP` | | `2>R` | IN | `SWAP push push` | | `2R>` | IN | `pop pop SWAP` | @@ -653,7 +654,7 @@ word. Per D-10 it occupies two cells on a 64-bit node too. Per D-8, v4 Q values | `Q.FROM-INT` | CAP | `push 0 a! 0 pop 15 FOR +* UNEXT push drop a pop` — `n * 2^16` as a signed double. `+*` with `S = 0` never adds, so each step is an exact arithmetic right shift of `T:A`; starting from `T:A = n:0` (that is, `n * 2^N`) and shifting `N-16` bits leaves `n * 2^16`. The count is `N-17`: 15 at 32-bit cells, 47 at 64. Negative values are no longer clamped to 0. Executed on the golden model (2026-10-02): matches v3's `q48_from_u64` for `n >= 0` (at 64-bit cells in the low cell, where v3 wraps for `n >= 2^47`, per D-10). Clobbers `A`. | | `Q.TO-INT` | CAP | `push a! 0 pop 15 FOR +* UNEXT drop drop a` — the same `+*` shift, 16 bits at every cell width, leaving the low cell in `A`. Rounds toward minus infinity, as v3's arithmetic shift does (−1.5 gives −2). Executed on the golden model (2026-10-02): v3's `q48_to_u64` exactly at 64-bit cells, its low cell at 32. Clobbers `A`. | | `Q.1` `Q.0` `Q.SCALE` | IN | Double-cell constants. | -| `Q.=` `Q.<` `Q.>` `Q.0=` `Q.MAX` `Q.MIN` | CAP | `D=`, `D<`, `SWAP D<` (for `Q.>`), `D0=`, `DMAX`, `DMIN`. Signed. | +| `Q.=` `Q.<` `Q.>` `Q.0=` `Q.MAX` `Q.MIN` | CAP | `D=`, `D<`, `2SWAP D<` (for `Q.>`), `D0=`, `DMAX`, `DMIN`. Signed (D-8); v3 compared unsigned, so v3 agrees only when both values have the same sign. Executed on the golden model (2026-10-02). `Q.>` was given here as `SWAP D<`, which swaps single cells, not Q values, and gave a wrong answer in 11702 of 20169 test cases. | | `Q.PRINT` | CAP | Pictured output, five fractional digits. | ### 5.27 Inference engine diff --git a/v4/tests/test_foundation.c b/v4/tests/test_foundation.c index da962186..239e9b06 100644 --- a/v4/tests/test_foundation.c +++ b/v4/tests/test_foundation.c @@ -19,7 +19,10 @@ * DABS and DNEGATE words) are checked against v3's 64-bit q48_add, q48_sub, * q48_abs and 0 - q, with Q values two cells wide at both widths (D-10). * Q.FROM-INT and Q.TO-INT are checked against n * 2^16 and q >> 16 in C and - * against v3's q48_from_u64 and q48_to_u64 where v4 keeps v3's meaning. Every word is + * against v3's q48_from_u64 and q48_to_u64 where v4 keeps v3's meaning. + * <, =, D<, 2OVER, the call-free (D<), DMAX, DMIN and 2SWAP, and the Q + * comparisons on them, are checked against C, signed (D-8), and against v3 + * where v3's unsigned Q comparisons agree. Every word is * also probed for how much of the 10- and 9-deep circular stacks (D-2) it * leaves to its caller. * @@ -49,7 +52,8 @@ static v4_cell w_nip, w_swap, w_or, w_negate, w_rot, w_zless, w_zequal, w_2dup, w_minus, w_uless, w_umstar, w_ummod, w_ugreater, w_abs, w_s2d, w_dplus, w_dnegate, w_dabs, w_smrem, w_slashmod, w_mplus, w_dminus, w_d0equal, w_dequal, - w_qfromint, w_qtoint; + w_qfromint, w_qtoint, w_less, w_equal, w_dless, w_2swap, w_2over, + w_dmax, w_dmin, w_qgt_doc, w_qgt, w_dltkeep; #define O(name) v4_asm_op(&as, V4_OP_##name) #define LIT(v) v4_asm_lit(&as, (v4_cell)(v)) @@ -374,6 +378,144 @@ static void build(void) O(MUL_STEP); O(UNEXT); O(DROP); O(DROP); O(PUSH_A); O(SEMI); + /* : = xor 0= ; 5.5 */ + w_equal = v4_asm_label(&as); + O(XOR); CALL(w_zequal); O(SEMI); + + /* : < 2DUP xor 0< IF drop 0< ELSE - 0< THEN ; 5.5 */ + w_less = v4_asm_label(&as); + O(OVER); O(OVER); O(XOR); CALL(w_zless); + ref = v4_asm_branch_fwd(&as, V4_OP_IF); + O(DROP); O(DROP); CALL(w_zless); + { + v4_asm_ref j = v4_asm_branch_fwd(&as, V4_OP_JUMP); + v4_asm_resolve(&as, ref, v4_asm_label(&as)); + O(DROP); CALL(w_minus); CALL(w_zless); + v4_asm_resolve(&as, j, v4_asm_label(&as)); + } + O(SEMI); + + /* : D< ROT 2DUP = IF 2DROP U< ELSE SWAP < NIP NIP THEN ; 5.7 */ + w_dless = v4_asm_label(&as); + CALL(w_rot); O(OVER); O(OVER); CALL(w_equal); + ref = v4_asm_branch_fwd(&as, V4_OP_IF); + O(DROP); O(DROP); O(DROP); CALL(w_uless); + { + v4_asm_ref j = v4_asm_branch_fwd(&as, V4_OP_JUMP); + v4_asm_resolve(&as, ref, v4_asm_label(&as)); + O(DROP); CALL(w_swap); CALL(w_less); CALL(w_nip); CALL(w_nip); + v4_asm_resolve(&as, j, v4_asm_label(&as)); + } + O(SEMI); + + /* : 2SWAP ROT push ROT pop ; 5.7, call-free + * with ROT (push SWAP pop SWAP) and SWAP (over push push drop pop pop) + * written in line: + * push over push push drop pop pop pop over push push drop pop pop + * push + * push over push push drop pop pop pop over push push drop pop pop + * pop ; */ +#define ROT_INLINE() do { O(PUSH); O(OVER); O(PUSH); O(PUSH); O(DROP); O(RPOP); O(RPOP); \ + O(RPOP); O(OVER); O(PUSH); O(PUSH); O(DROP); O(RPOP); O(RPOP); } while (0) + w_2swap = v4_asm_label(&as); + ROT_INLINE(); O(PUSH); ROT_INLINE(); O(RPOP); O(SEMI); +#undef ROT_INLINE + + /* : 2OVER push push 2DUP pop pop 2SWAP ; 5.7 */ + w_2over = v4_asm_label(&as); + O(PUSH); O(PUSH); O(OVER); O(OVER); O(RPOP); O(RPOP); CALL(w_2swap); O(SEMI); + + /* : (D<) ( d1 d2 -- d1 d2 flag ) 5.7, call-free + * Signed d1 < d2, leaving both doubles. Copies of ah and bh go on top; + * if they differ, flag comes from them, else from al U< bl. In every + * case the tested value has its top bit set exactly when d1 < d2: + * highs, signs differ: ah (d1 < d2 iff ah < 0) + * highs, signs agree: ah - bh (cannot overflow) + * lows, top bits differ: bl (al U< bl iff bl's is set) + * lows, top bits agree: al - bl + * x - y with y on top is `push inv pop + inv`. + * + * dup push push over pop al ah bl ah bh R: bh + * over over xor if TIE + * drop over over xor -if HS + * drop drop jump S1 al ah bl ah + * HS: drop push inv pop + inv al ah bl ah-bh + * S1: -if N1 drop -1 jump D1 N1: drop 0 + * D1: pop over push push drop pop pop ; al ah bl bh f + * TIE: drop drop drop al ah bl R: bh + * dup push push over pop al ah al bl R: bh bl + * over over xor -if LS + * drop push drop pop jump S2 al ah bl + * LS: drop push inv pop + inv al ah al-bl + * S2: -if N2 drop -1 jump D2 N2: drop 0 + * D2: pop pop al ah f bl bh + * push over push push drop pop pop pop over push push drop pop pop ; */ + { + v4_asm_ref tie, hs, s1a, n1, d1, ls, s2a, n2, d2; + w_dltkeep = v4_asm_label(&as); + O(DUP); O(PUSH); O(PUSH); O(OVER); O(RPOP); + O(OVER); O(OVER); O(XOR); + tie = v4_asm_branch_fwd(&as, V4_OP_IF); + O(DROP); O(OVER); O(OVER); O(XOR); + hs = v4_asm_branch_fwd(&as, V4_OP_MINUS_IF); + O(DROP); O(DROP); + s1a = v4_asm_branch_fwd(&as, V4_OP_JUMP); + v4_asm_resolve(&as, hs, v4_asm_label(&as)); + O(DROP); O(PUSH); O(INV); O(RPOP); O(ADD); O(INV); + v4_asm_resolve(&as, s1a, v4_asm_label(&as)); + n1 = v4_asm_branch_fwd(&as, V4_OP_MINUS_IF); + O(DROP); LIT(-1); + d1 = v4_asm_branch_fwd(&as, V4_OP_JUMP); + v4_asm_resolve(&as, n1, v4_asm_label(&as)); + O(DROP); LIT(0); + v4_asm_resolve(&as, d1, v4_asm_label(&as)); + O(RPOP); O(OVER); O(PUSH); O(PUSH); O(DROP); O(RPOP); O(RPOP); O(SEMI); + + v4_asm_resolve(&as, tie, v4_asm_label(&as)); + O(DROP); O(DROP); O(DROP); + O(DUP); O(PUSH); O(PUSH); O(OVER); O(RPOP); + O(OVER); O(OVER); O(XOR); + ls = v4_asm_branch_fwd(&as, V4_OP_MINUS_IF); + O(DROP); O(PUSH); O(DROP); O(RPOP); + s2a = v4_asm_branch_fwd(&as, V4_OP_JUMP); + v4_asm_resolve(&as, ls, v4_asm_label(&as)); + O(DROP); O(PUSH); O(INV); O(RPOP); O(ADD); O(INV); + v4_asm_resolve(&as, s2a, v4_asm_label(&as)); + n2 = v4_asm_branch_fwd(&as, V4_OP_MINUS_IF); + O(DROP); LIT(-1); + d2 = v4_asm_branch_fwd(&as, V4_OP_JUMP); + v4_asm_resolve(&as, n2, v4_asm_label(&as)); + O(DROP); LIT(0); + v4_asm_resolve(&as, d2, v4_asm_label(&as)); + O(RPOP); O(RPOP); + O(PUSH); O(OVER); O(PUSH); O(PUSH); O(DROP); O(RPOP); O(RPOP); + O(RPOP); O(OVER); O(PUSH); O(PUSH); O(DROP); O(RPOP); O(RPOP); O(SEMI); + } + + /* : DMAX ( d1 d2 -- d3 ) (D<) if L drop push push drop drop pop pop ; + * L: drop drop drop ; 5.7 */ + w_dmax = v4_asm_label(&as); + CALL(w_dltkeep); + ref = v4_asm_branch_fwd(&as, V4_OP_IF); + O(DROP); O(PUSH); O(PUSH); O(DROP); O(DROP); O(RPOP); O(RPOP); O(SEMI); + v4_asm_resolve(&as, ref, v4_asm_label(&as)); + O(DROP); O(DROP); O(DROP); O(SEMI); + + /* : DMIN ( d1 d2 -- d3 ) (D<) if L drop drop drop ; + * L: drop push push drop drop pop pop ; 5.7 */ + w_dmin = v4_asm_label(&as); + CALL(w_dltkeep); + ref = v4_asm_branch_fwd(&as, V4_OP_IF); + O(DROP); O(DROP); O(DROP); O(SEMI); + v4_asm_resolve(&as, ref, v4_asm_label(&as)); + O(DROP); O(PUSH); O(PUSH); O(DROP); O(DROP); O(RPOP); O(RPOP); O(SEMI); + + /* Q.> as 5.26 gives it, SWAP D<, and with 2SWAP. */ + w_qgt_doc = v4_asm_label(&as); + CALL(w_swap); CALL(w_dless); O(SEMI); + w_qgt = v4_asm_label(&as); + CALL(w_2swap); CALL(w_dless); O(SEMI); + CHECK(v4_asm_ok(&as), "foundation words assemble"); } @@ -564,6 +706,27 @@ static uint64_t asr64(uint64_t x, unsigned k) return r; } +/* The k results, given bottom first, then the canary under them. */ +static int leftk(const v4_cell *want, unsigned k) +{ + while (k-- > 0) + if (v4_dstack_pop(&n.ds) != want[k]) return 0; + return v4_dstack_pop(&n.ds) == CANARY; +} + +/* Signed double a < b, in C. */ +static int dlt(v4_ucell al, v4_ucell ah, v4_ucell bl, v4_ucell bh) +{ + if (ah != bh) return (v4_cell)ah < (v4_cell)bh; + return al < bl; +} + +/* Q48.16 as v4 reads it (D-8: signed). */ +static int64_t qs(uint64_t q) +{ + return (q >> 63) ? -(int64_t)(~q) - 1 : (int64_t)q; +} + /* Stack headroom. Run `word` with `dfill` marked cells under the canary and * `rfill` marked cells under its return address, and report whether the * results, the canary and every marked cell come back intact. The F18 stacks @@ -575,7 +738,7 @@ static uint64_t asr64(uint64_t x, unsigned k) static int fits(v4_cell word, unsigned argc, const v4_cell *arg, unsigned nres, unsigned dfill, unsigned rfill) { - v4_cell want[4]; + v4_cell want[V4_DATA_DEPTH]; unsigned i; v4_dstack_reset(&n.ds); @@ -583,6 +746,7 @@ static int fits(v4_cell word, unsigned argc, const v4_cell *arg, v4_exec_reset(&es); for (i = 0; i < argc; i++) v4_dstack_push(&n.ds, arg[i]); if (v4_test_call(&n, &es, &h, word, 100000) <= 0) return 0; + if (nres > V4_DATA_DEPTH) return 0; for (i = 0; i < nres; i++) want[i] = v4_dstack_pop(&n.ds); v4_dstack_reset(&n.ds); @@ -934,6 +1098,82 @@ int main(void) } } + /* <, =, D<, 2SWAP, 2OVER, DMAX and DMIN as written in section 5, against C. */ + for (unsigned i = 0; i < NVEC; i++) + for (unsigned j = 0; j < NVEC; j++) { + v4_cell a = vec[i], b = vec[j]; + CHECK(call(w_less, 2, a, b, 0) && left1(FLAG(a < b)), "< [%u,%u]", i, j); + CHECK(call(w_equal, 2, a, b, 0) && left1(FLAG(a == b)), "= [%u,%u]", i, j); + for (unsigned k = 0; k < NVEC; k++) + for (unsigned l = 0; l < NVEC; l++) { + v4_cell c = vec[k], d = vec[l]; + int lt = dlt((v4_ucell)a, (v4_ucell)b, (v4_ucell)c, (v4_ucell)d); + v4_cell sw[4], ov[6], mx[2], mn[2]; + sw[0] = c; sw[1] = d; sw[2] = a; sw[3] = b; + ov[0] = a; ov[1] = b; ov[2] = c; ov[3] = d; ov[4] = a; ov[5] = b; + mx[0] = lt ? c : a; mx[1] = lt ? d : b; + mn[0] = lt ? a : c; mn[1] = lt ? b : d; + CHECK(call4(w_dless, a, b, c, d) && left1(FLAG(lt)), "D< [%u,%u,%u,%u]", i, j, k, l); + { + v4_cell kp[5]; + kp[0] = a; kp[1] = b; kp[2] = c; kp[3] = d; kp[4] = FLAG(lt); + CHECK(call4(w_dltkeep, a, b, c, d) && leftk(kp, 5), "(D<) [%u,%u,%u,%u]", i, j, k, l); + } + CHECK(call4(w_2swap, a, b, c, d) && leftk(sw, 4), "2SWAP [%u,%u,%u,%u]", i, j, k, l); + CHECK(call4(w_2over, a, b, c, d) && leftk(ov, 6), "2OVER [%u,%u,%u,%u]", i, j, k, l); + CHECK(call4(w_dmax, a, b, c, d) && leftk(mx, 2), "DMAX [%u,%u,%u,%u]", i, j, k, l); + CHECK(call4(w_dmin, a, b, c, d) && leftk(mn, 2), "DMIN [%u,%u,%u,%u]", i, j, k, l); + } + } + + /* Q.=, Q.<, Q.>, Q.0=, Q.MAX, Q.MIN (section 5.26: D=, D<, 2SWAP D<, D0=, + * DMAX, DMIN) on Q values, signed (D-8). v3 compares Q values unsigned, + * so v3 agrees only when both have the same sign; that is checked too. */ + { + static const uint64_t qc[] = { + 0, 1, 0x8000u, 0x10000u, 0x18000u, + (uint64_t)0 - 0x10000u, (uint64_t)0 - 1u, (uint64_t)0 - 0x8000u, + 0xFFFFFFFFu, 0x100000000u, (uint64_t)0 - 0x100000000u, + ((uint64_t)1 << 63) - 1u, (uint64_t)1 << 63 + }; + const unsigned nc = sizeof qc / sizeof qc[0]; + uint64_t x = 0x2545F4914F6CDD1Du; + unsigned doc_wrong = 0, doc_runs = 0; + + for (unsigned i = 0; i < nc * nc + 20000u; i++) { + uint64_t a, b; + v4_cell al, ah, bl, bh, w[2]; + int lt, gt, eq; + if (i < nc * nc) { a = qc[i / nc]; b = qc[i % nc]; } + else { + x ^= x << 13; x ^= x >> 7; x ^= x << 17; a = x; + x ^= x << 13; x ^= x >> 7; x ^= x << 17; b = x; + if (i & 1u) b = a; /* ties */ + if (i & 2u) b ^= (uint64_t)1 << (x >> 58); /* near */ + } + qcells(a, &al, &ah); + qcells(b, &bl, &bh); + lt = qs(a) < qs(b); gt = qs(a) > qs(b); eq = a == b; + + CHECK(call4(w_dequal, al, ah, bl, bh) && left1(FLAG(eq)), "Q.= [%u]", i); + CHECK(call4(w_dless, al, ah, bl, bh) && left1(FLAG(lt)), "Q.< [%u]", i); + CHECK(call4(w_qgt, al, ah, bl, bh) && left1(FLAG(gt)), "Q.> [%u]", i); + CHECK(call(w_d0equal, 2, al, ah, 0) && left1(FLAG(a == 0)), "Q.0= [%u]", i); + w[0] = lt ? bl : al; w[1] = lt ? bh : ah; + CHECK(call4(w_dmax, al, ah, bl, bh) && leftk(w, 2), "Q.MAX [%u]", i); + w[0] = lt ? al : bl; w[1] = lt ? ah : bh; + CHECK(call4(w_dmin, al, ah, bl, bh) && leftk(w, 2), "Q.MIN [%u]", i); + if ((a >> 63) == (b >> 63)) { /* v3 agrees here */ + CHECK(lt == (a < b) && gt == (a > b), "Q compare v3 [%u]", i); + } + + /* Q.> as section 5.26 writes it, SWAP D<: count wrong answers. */ + doc_runs++; + if (!(call4(w_qgt_doc, al, ah, bl, bh) && left1(FLAG(gt)))) doc_wrong++; + } + printf(" Q.> as written (SWAP D<): %u wrong of %u\n", doc_wrong, doc_runs); + } + /* Stack headroom of the two longest definitions. */ { static const v4_cell umstar_args[][4] = { @@ -983,6 +1223,21 @@ int main(void) headroom("D0=", w_d0equal, 2, two_args, 5, 1, &dh, &rh); headroom("D=", w_dequal, 4, dsub_args, 6, 1, &dh, &rh); CHECK(dh >= 0 && rh >= 0, "D= runs at all"); + static const v4_cell cmp_args[][4] = { + { 0, 0, 0, 0 }, { 1, 0, 2, 0 }, { 2, 0, 1, 0 }, { 0, -1, 0, 1 }, { 0, 1, 0, -1 }, + { 0, 5, 0, 7 }, { 0, 7, 0, 5 }, { -1, 0, 1, 0 }, { 1, 0, -1, 0 } + }; + headroom("<", w_less, 2, two_args, 5, 1, &dh, &rh); + headroom("=", w_equal, 2, two_args, 5, 1, &dh, &rh); + headroom("D<", w_dless, 4, cmp_args, 9, 1, &dh, &rh); + headroom("(D<)", w_dltkeep, 4, cmp_args, 9, 5, &dh, &rh); + headroom("2SWAP", w_2swap, 4, cmp_args, 9, 4, &dh, &rh); + headroom("2OVER", w_2over, 4, cmp_args, 9, 6, &dh, &rh); + headroom("DMAX", w_dmax, 4, cmp_args, 9, 2, &dh, &rh); + CHECK(dh >= 2 && rh >= 2, "DMAX leaves room"); + headroom("DMIN", w_dmin, 4, cmp_args, 9, 2, &dh, &rh); + CHECK(dh >= 2 && rh >= 2, "DMIN leaves room"); + headroom("Q.> (2SWAP D<)", w_qgt, 4, cmp_args, 9, 1, &dh, &rh); headroom("SM/REM", w_smrem, 3, smrem_args, 5, 2, &dh, &rh); CHECK(rh >= 1, "SM/REM leaves room for /MOD's return address"); headroom("/MOD", w_slashmod, 2, slashmod_args, 4, 2, &dh, &rh); -- 2.54.0 From ab3b7085406b1eec2b77e3d5320a19e5cd3af339 Mon Sep 17 00:00:00 2001 From: rajames Date: Fri, 2 Oct 2026 23:27:57 -0400 Subject: [PATCH 016/135] feat(v4.0.0): Q.* from four UM* cell products Q.* is floor(a*b / 2^16), signed (D-8), cut to two cells. Cells 0..2 of the product come from the unsigned cell products a0*b0, a0*b1, a1*b0 and the low cell of a1*b1; reading a1 and b1 as signed takes (a1<0 ? b0 : 0) + (b1<0 ? a0 : 0) off cell 2. The result is cells 0..2 shifted right 16 with Q.TO-INT twice. Clobbers A. Checked at 32- and 64-bit cells, optimised and ASan+UBSan, on every pair of 17 edge Q values plus 20000 pseudo-random pairs: - against an independent reference (16-bit limbs, magnitudes multiplied schoolbook, negated, shifted), and - against v3's q48_mul for non-negative operands. The first draft applied only a1's sign correction; the reference caught the missing b1 term (9860 failures at 32-bit cells). v3 bug found, not fixed: q48_mul's portable branch (used where there is no __int128) returns (result_hi << 16) | (result_lo >> 16); the high part must move up 48, so it is wrong whenever the product passes bit 64, e.g. 0.5 * Q max gives 0000ffffffffffff instead of 3fffffffffffffff. The parity reference here is that branch with the shift corrected, which matches v3's __int128 branch. Stack use is tight: Q.* leaves its caller 2 data cells and 1 return entry, because UM* parks three values on the return stack. Recorded in 5.26; to be improved next. Co-Authored-By: Claude Opus 5.5 --- docs/v4.0.0/DECOMPOSITION.md | 4 +- v4/tests/test_foundation.c | 160 ++++++++++++++++++++++++++++++++++- 2 files changed, 160 insertions(+), 4 deletions(-) diff --git a/docs/v4.0.0/DECOMPOSITION.md b/docs/v4.0.0/DECOMPOSITION.md index a3aa3a51..64be66ee 100644 --- a/docs/v4.0.0/DECOMPOSITION.md +++ b/docs/v4.0.0/DECOMPOSITION.md @@ -147,7 +147,7 @@ IF body1 ELSE body2 THEN → if L1 drop body1 jump L2 times, as on the F18. `FOR ... UNEXT` is the same but the body must fit in one instruction word. **Register conventions.** `A` and `B` are caller-saved. A word that uses them says so. Words in this -document that clobber `A`: `@ ! +! -! 2@ 2! C@ C! UM* * UM/MOD Q.FROM-INT Q.TO-INT SEND RECV`. Words that clobber `B`: +document that clobber `A`: `@ ! +! -! 2@ 2! C@ C! UM* * UM/MOD Q.FROM-INT Q.TO-INT Q.* SEND RECV`. Words that clobber `B`: `SEND RECV`. **Return-stack words** (`>R R> R@ 2>R 2R> 2R@ I J UNLOOP` and the loop runtimes) are always IN. @@ -647,7 +647,7 @@ word. Per D-10 it occupies two cells on a 64-bit node too. Per D-8, v4 Q values | Word | Fate | Notes | | --- | --- | --- | | `Q.+` `Q.-` | CAP | `D+`, `D-` — executed on the golden model (2026-10-02) against v3's `q48_add`/`q48_sub` (`uint64_t` wrapping): bit-for-bit at 32-bit cells; at 64-bit cells the low cell is v3's, per D-10. | -| `Q.*` | CAP | 64×64 product from four `UM*` partial products, shifted right 16. | +| `Q.*` | CAP | `2OVER drop over 0< over and push over UM* pop - push push push over pop UM* drop pop pop push SWAP pop + push push over 0< over and pop pop push SWAP pop SWAP - push push over over UM* pop pop D+ push push push drop pop UM* 0 pop pop D+ push dup push Q.TO-INT pop pop Q.TO-INT` — `floor(a*b / 2^16)`, signed (D-8), cut to two cells. Cells 0–2 of the product come from the four unsigned cell products `a0*b0`, `a0*b1`, `a1*b0`, `a1*b1` (low cell only); reading `a1` and `b1` as signed takes `(a1<0 ? b0 : 0) + (b1<0 ? a0 : 0)` off cell 2; the result is cells 0–2 shifted right 16 with `Q.TO-INT` twice. Executed on the golden model (2026-10-02) against an independent limb-by-limb reference, and against v3's `q48_mul` for non-negative operands. **Stack use is tight:** it leaves its caller 2 data cells under its arguments and 1 return entry, because `UM*` itself parks three values on the return stack; to be improved. Clobbers `A`. | | `Q./` | CAP | Shifted long division. **Division by zero sets an error** (v3 returned 0 silently). | | `Q.ABS` `Q.NEG` | CAP | `DABS`, `DNEGATE` — executed on the golden model (2026-10-02) against v3's `q48_abs` and `0 - q`: bit-for-bit at 32-bit cells, including v3's wrap of Q min to itself; at 64-bit cells the low cell is v3's and the high cell is the true sign, per D-10. | | `Q.LOG` `Q.EXP` `Q.SQRT` `Q.SIN` `Q.COS` | CAP | Algorithms ported from `q48_words.c`; the hosted C versions are the golden model. | diff --git a/v4/tests/test_foundation.c b/v4/tests/test_foundation.c index 239e9b06..bc5aeef3 100644 --- a/v4/tests/test_foundation.c +++ b/v4/tests/test_foundation.c @@ -22,7 +22,8 @@ * against v3's q48_from_u64 and q48_to_u64 where v4 keeps v3's meaning. * <, =, D<, 2OVER, the call-free (D<), DMAX, DMIN and 2SWAP, and the Q * comparisons on them, are checked against C, signed (D-8), and against v3 - * where v3's unsigned Q comparisons agree. Every word is + * where v3's unsigned Q comparisons agree. Q.* is checked against an independent limb-by-limb + * reference, signed, and against v3's q48_mul for non-negative operands. Every word is * also probed for how much of the 10- and 9-deep circular stacks (D-2) it * leaves to its caller. * @@ -53,7 +54,7 @@ static v4_cell w_nip, w_swap, w_or, w_negate, w_rot, w_zless, w_zequal, w_ugreater, w_abs, w_s2d, w_dplus, w_dnegate, w_dabs, w_smrem, w_slashmod, w_mplus, w_dminus, w_d0equal, w_dequal, w_qfromint, w_qtoint, w_less, w_equal, w_dless, w_2swap, w_2over, - w_dmax, w_dmin, w_qgt_doc, w_qgt, w_dltkeep; + w_dmax, w_dmin, w_qgt_doc, w_qgt, w_dltkeep, w_qstar; #define O(name) v4_asm_op(&as, V4_OP_##name) #define LIT(v) v4_asm_lit(&as, (v4_cell)(v)) @@ -516,6 +517,42 @@ static void build(void) w_qgt = v4_asm_label(&as); CALL(w_2swap); CALL(w_dless); O(SEMI); + /* : Q.* ( a b -- c ) 5.26 + * a = a0 a1, b = b0 b1. Cells 0..2 of the signed product a*b, then + * shifted right 16. The cell products are unsigned; reading a1 and b1 + * as signed takes (a1<0 ? b0 : 0) + (b1<0 ? a0 : 0) off cell 2, the + * only cell above the unsigned product's that the result reaches. + * 2OVER drop over 0< over and push R: b1<0 ? a0 : 0 + * over UM* pop - a0 a1 b0 b1 l01 h01 a0*b1, corrected + * push push R: h01 l01 + * push over pop UM* drop a0 a1 b0 t3 a1*b1 low + * pop pop push SWAP pop + a0 a1 b0 x0 x1 + * push push over 0< over and a0 a1 b0 c R: x1 x0 + * pop pop push SWAP pop SWAP - a0 a1 b0 x0 x1-c + * push push over over UM* a0 a1 b0 l10 h10 a1*b0 + * pop pop D+ a0 a1 b0 X0 X1 + * push push push drop pop a0 b0 R: X1 X0 + * UM* 0 pop pop D+ c0 c1 c2 + * push dup push Q.TO-INT pop pop Q.TO-INT ; + * SWAP in line. Clobbers A. */ +#define SWAP_INLINE() do { O(OVER); O(PUSH); O(PUSH); O(DROP); O(RPOP); O(RPOP); } while (0) + w_qstar = v4_asm_label(&as); + CALL(w_2over); O(DROP); + O(OVER); CALL(w_zless); O(OVER); O(AND); O(PUSH); + O(OVER); CALL(w_umstar); O(RPOP); CALL(w_minus); + O(PUSH); O(PUSH); + O(PUSH); O(OVER); O(RPOP); CALL(w_umstar); O(DROP); + O(RPOP); O(RPOP); O(PUSH); SWAP_INLINE(); O(RPOP); O(ADD); + O(PUSH); O(PUSH); O(OVER); CALL(w_zless); O(OVER); O(AND); + O(RPOP); O(RPOP); O(PUSH); SWAP_INLINE(); O(RPOP); SWAP_INLINE(); CALL(w_minus); + O(PUSH); O(PUSH); O(OVER); O(OVER); CALL(w_umstar); + O(RPOP); O(RPOP); CALL(w_dplus); + O(PUSH); O(PUSH); O(PUSH); O(DROP); O(RPOP); + CALL(w_umstar); LIT(0); O(RPOP); O(RPOP); CALL(w_dplus); + O(PUSH); O(DUP); O(PUSH); CALL(w_qtoint); O(RPOP); O(RPOP); CALL(w_qtoint); + O(SEMI); +#undef SWAP_INLINE + CHECK(v4_asm_ok(&as), "foundation words assemble"); } @@ -727,6 +764,82 @@ static int64_t qs(uint64_t q) return (q >> 63) ? -(int64_t)(~q) - 1 : (int64_t)q; } +/* Reference Q.* for any cell width, by a different method from the FORTH: + * the Q values (two cells each) as signed integers in 16-bit limbs, the + * magnitudes multiplied schoolbook, the product negated if the signs differ, + * then shifted right 16 (one limb) and cut to two cells. Shifting the + * two's-complement product rounds toward minus infinity. */ +#define QLIMBS (2 * V4_CELL_BITS / 16) +static void q_to_limbs(v4_ucell lo, v4_ucell hi, uint32_t *l, int *neg) +{ + unsigned i; + *neg = (hi & V4_MSB) != 0; + if (*neg) dneg(lo, hi, &lo, &hi); + for (i = 0; i < QLIMBS / 2; i++) { + l[i] = (uint32_t)((lo >> (16 * i)) & 0xFFFFu); + l[i + QLIMBS / 2] = (uint32_t)((hi >> (16 * i)) & 0xFFFFu); + } +} +static void qmul_ref(v4_ucell al, v4_ucell ah, v4_ucell bl, v4_ucell bh, + v4_ucell *rl, v4_ucell *rh) +{ + uint32_t a[QLIMBS], b[QLIMBS], p[2 * QLIMBS]; + int an, bn; + unsigned i, j; + + q_to_limbs(al, ah, a, &an); + q_to_limbs(bl, bh, b, &bn); + for (i = 0; i < 2 * QLIMBS; i++) p[i] = 0; + for (i = 0; i < QLIMBS; i++) { + uint32_t carry = 0; + for (j = 0; j < QLIMBS; j++) { + uint32_t t = a[i] * b[j] + p[i + j] + carry; /* < 2^32 */ + p[i + j] = t & 0xFFFFu; + carry = t >> 16; + } + p[i + QLIMBS] = carry; + } + if (an != bn) { /* negate, 2's complement */ + uint32_t carry = 1; + for (i = 0; i < 2 * QLIMBS; i++) { + uint32_t t = (~p[i] & 0xFFFFu) + carry; + p[i] = t & 0xFFFFu; + carry = t >> 16; + } + } + *rl = 0; *rh = 0; /* limbs 1 .. QLIMBS */ + for (i = 0; i < QLIMBS / 2; i++) { + *rl |= (v4_ucell)p[1 + i] << (16 * i); + *rh |= (v4_ucell)p[1 + QLIMBS / 2 + i] << (16 * i); + } +} + +/* v3's q48_mul: unsigned (a * b) >> 16, cut to 64 bits, as its __int128 + * branch computes it on 64-bit gcc/clang hosts. This is the portable + * branch of v3/src/word_source/q48_16_words.c with its last line corrected: + * v3 returns (result_hi << 16) | (result_lo >> 16), which is wrong whenever + * the product reaches past bit 64 (the high cell must move up 48 bits, not + * 16). v3 uses that branch only on hosts without __int128. */ +static uint64_t v3_q48_mul(uint64_t a, uint64_t b) +{ + uint64_t a_hi = a >> 32; + uint64_t a_lo = a & 0xFFFFFFFFULL; + uint64_t b_hi = b >> 32; + uint64_t b_lo = b & 0xFFFFFFFFULL; + uint64_t p_ll = a_lo * b_lo; + uint64_t p_lh = a_lo * b_hi; + uint64_t p_hl = a_hi * b_lo; + uint64_t p_hh = a_hi * b_hi; + uint64_t carry = 0; + uint64_t mid = p_lh + p_hl; + uint64_t result_hi, result_lo; + if (mid < p_lh) carry++; + result_hi = p_hh + (mid >> 32) + (carry << 32); + result_lo = p_ll + ((mid & 0xFFFFFFFFULL) << 32); + if (result_lo < p_ll) result_hi++; + return (result_hi << 48) | (result_lo >> 16); +} + /* Stack headroom. Run `word` with `dfill` marked cells under the canary and * `rfill` marked cells under its return address, and report whether the * results, the canary and every marked cell come back intact. The F18 stacks @@ -1174,6 +1287,43 @@ int main(void) printf(" Q.> as written (SWAP D<): %u wrong of %u\n", doc_wrong, doc_runs); } + /* Q.* against the limb reference (signed, D-8), on edge Q values and + * pseudo-random ones, and against v3's q48_mul for non-negative + * operands, where v3's unsigned product agrees. */ + { + static const uint64_t qm[] = { + 0, 1, 0x8000u, 0x10000u, 0x18000u, 0x20000u, 0xFFFFu, + (uint64_t)0 - 0x10000u, (uint64_t)0 - 1u, (uint64_t)0 - 0x18000u, + 0xFFFFFFFFu, 0x100000000u, 0x7FFFFFFFu, (uint64_t)0 - 0x100000000u, + ((uint64_t)1 << 63) - 1u, (uint64_t)1 << 63, (uint64_t)1 << 47 + }; + const unsigned nm = sizeof qm / sizeof qm[0]; + uint64_t x = 0xD1B54A32D192ED03u; + for (unsigned i = 0; i < nm * nm + 20000u; i++) { + uint64_t a, b; + v4_cell al, ah, bl, bh; + v4_ucell rl, rh; + if (i < nm * nm) { a = qm[i / nm]; b = qm[i % nm]; } + else { + x ^= x << 13; x ^= x >> 7; x ^= x << 17; a = x; + x ^= x << 13; x ^= x >> 7; x ^= x << 17; b = x; + if (i & 1u) a = asr64(a, (unsigned)(x >> 58)); + if (i & 2u) b = asr64(b, (unsigned)(x >> 52) & 63u); + } + qcells(a, &al, &ah); + qcells(b, &bl, &bh); + qmul_ref((v4_ucell)al, (v4_ucell)ah, (v4_ucell)bl, (v4_ucell)bh, &rl, &rh); + CHECK(call4(w_qstar, al, ah, bl, bh) && left2((v4_cell)rl, (v4_cell)rh), + "Q.* [%u]", i); + if (!(a >> 63) && !(b >> 63)) { + v4_cell vl, vh; + qcells(v3_q48_mul(a, b), &vl, &vh); + CHECK(call4(w_qstar, al, ah, bl, bh) && n.ds.s == vl + && (V4_CELL_BITS == 64 || n.ds.t == vh), "Q.* v3 [%u]", i); + } + } + } + /* Stack headroom of the two longest definitions. */ { static const v4_cell umstar_args[][4] = { @@ -1238,6 +1388,12 @@ int main(void) headroom("DMIN", w_dmin, 4, cmp_args, 9, 2, &dh, &rh); CHECK(dh >= 2 && rh >= 2, "DMIN leaves room"); headroom("Q.> (2SWAP D<)", w_qgt, 4, cmp_args, 9, 1, &dh, &rh); + static const v4_cell qstar_args[][4] = { + { 0, 1, 0, 1 }, { -1, -1, -1, -1 }, { 0, -1, 0, 1 }, { 5, 7, 9, 11 }, + { (v4_cell)V4_MSB, -1, 3, (v4_cell)V4_MSB } + }; + headroom("Q.*", w_qstar, 4, qstar_args, 5, 2, &dh, &rh); + CHECK(dh >= 0 && rh >= 0, "Q.* runs at all"); headroom("SM/REM", w_smrem, 3, smrem_args, 5, 2, &dh, &rh); CHECK(rh >= 1, "SM/REM leaves room for /MOD's return address"); headroom("/MOD", w_slashmod, 2, slashmod_args, 4, 2, &dh, &rh); -- 2.54.0 From 54e1cdafb1d9eea6c079ff9cc707e03c5051a88a Mon Sep 17 00:00:00 2001 From: rajames Date: Fri, 2 Oct 2026 23:31:52 -0400 Subject: [PATCH 017/135] feat(v4.0.0): UM* corrections after the loop; return headroom 4 -> 6 UM* parked its three corrections (c_hi, c_lo, t0) on the return stack before the +* loop, leaving its caller 4 return entries. Now u1 and u2 wait on the data stack under the loop -- +* touches only T, S and A -- and the corrections are made after it, with -if in place of 0< calls. The return stack holds the loop count, then at most two temporaries. The loop count is pushed before s is made, so the data stack never holds more than four cells: data headroom is unchanged at 6. Headroom (data cells under args / return entries): 6/4 -> 6/6. Q.*, which calls UM* four times, goes from 2/1 to 2/2. Same checks as before at 32- and 64-bit cells, optimised and ASan+UBSan; breaking any of the four corrections fails 4900+ checks. Co-Authored-By: Claude Opus 5.5 --- docs/v4.0.0/DECOMPOSITION.md | 29 +++++++++----- v4/tests/test_foundation.c | 76 ++++++++++++++++++++++++------------ 2 files changed, 70 insertions(+), 35 deletions(-) diff --git a/docs/v4.0.0/DECOMPOSITION.md b/docs/v4.0.0/DECOMPOSITION.md index 64be66ee..835f669c 100644 --- a/docs/v4.0.0/DECOMPOSITION.md +++ b/docs/v4.0.0/DECOMPOSITION.md @@ -212,14 +212,23 @@ dependency order. \ restore the bits the two halvings dropped and the unsigned reading of \ both top bits. Exact over the full range; proven on the golden model. : UM* ( u1 u2 -- ulo uhi ) - over 0< over and push \ R: u1<0 ? u2 : 0 - over over 0< and 1 and pop + push \ R: c_hi - over over and 1 and push \ R: c_hi c_lo - over 1 and NEGATE over 2/ and push \ R: c_hi c_lo t0 - a! 2/ pop \ s t0 A: u2 - 31 FOR +* UNEXT \ s hi A: lo - NIP a 2* pop + SWAP \ lo' hi - 2* a 0< NEGATE + pop + ; \ lo' hi' + over 1 and inv 1 + over 2/ and \ u1 u2 t0 t0 = u2 2/ if u1 odd + over a! 31 push \ A: u2 R: loop count (FOR's push, early) + push over 2/ pop \ u1 u2 s t0 s = u1 2/ + L: +* unext \ u1 u2 s hi A: lo + push drop pop \ u1 u2 hi + 2* a -if L0 drop 1 + jump L1 L0: drop L1: push \ R: 2hi + top bit of lo + over -if L2 drop dup jump L3 L2: drop 0 L3: push \ R: + (u1<0 ? u2 : 0) + dup -if L4 drop over 1 and jump L5 L4: drop 0 L5: \ u2<0 ? u1&1 : 0 + pop + pop + push \ u1 u2 R: hi' + and 1 and a 2* + pop ; \ lo' hi' +\ u1 and u2 wait on the data stack under the loop (+* touches only T, S and +\ A), so the corrections are made after it, with -if in place of 0< calls, +\ and the return stack holds at most two temporaries. The loop count is +\ pushed before s is made, so the data stack never holds more than four. +\ Leaves its caller 6 data cells under its arguments and 6 return entries +\ (revised 2026-10-02; the first full-range version parked its three +\ corrections on the return stack and left 4). \ ---- divide: 32-step restoring division, divisor held in A -------------- \ Each step shifts hi:lo left one bit and, when the shifted-out bit of hi was @@ -251,7 +260,7 @@ dependency order. \ (uhi >= ud, including ud = 0) the result is unspecified, as in FORTH-79; it \ always terminates after 32 steps. Stack use (D-2): up to 6 data cells may \ lie under the three arguments and up to 6 return-stack entries under its -\ return address. For UM* the same limits are 6 and 4. This replaces a +\ return address. For UM* the same limits are 6 and 6. This replaces a \ first version built on U<, 0<, SWAP and OR calls, which was also exact but \ left only 3 and 3 (too few for SM/REM inside /MOD) and stepped about five \ times as many instruction words. @@ -647,7 +656,7 @@ word. Per D-10 it occupies two cells on a 64-bit node too. Per D-8, v4 Q values | Word | Fate | Notes | | --- | --- | --- | | `Q.+` `Q.-` | CAP | `D+`, `D-` — executed on the golden model (2026-10-02) against v3's `q48_add`/`q48_sub` (`uint64_t` wrapping): bit-for-bit at 32-bit cells; at 64-bit cells the low cell is v3's, per D-10. | -| `Q.*` | CAP | `2OVER drop over 0< over and push over UM* pop - push push push over pop UM* drop pop pop push SWAP pop + push push over 0< over and pop pop push SWAP pop SWAP - push push over over UM* pop pop D+ push push push drop pop UM* 0 pop pop D+ push dup push Q.TO-INT pop pop Q.TO-INT` — `floor(a*b / 2^16)`, signed (D-8), cut to two cells. Cells 0–2 of the product come from the four unsigned cell products `a0*b0`, `a0*b1`, `a1*b0`, `a1*b1` (low cell only); reading `a1` and `b1` as signed takes `(a1<0 ? b0 : 0) + (b1<0 ? a0 : 0)` off cell 2; the result is cells 0–2 shifted right 16 with `Q.TO-INT` twice. Executed on the golden model (2026-10-02) against an independent limb-by-limb reference, and against v3's `q48_mul` for non-negative operands. **Stack use is tight:** it leaves its caller 2 data cells under its arguments and 1 return entry, because `UM*` itself parks three values on the return stack; to be improved. Clobbers `A`. | +| `Q.*` | CAP | `2OVER drop over 0< over and push over UM* pop - push push push over pop UM* drop pop pop push SWAP pop + push push over 0< over and pop pop push SWAP pop SWAP - push push over over UM* pop pop D+ push push push drop pop UM* 0 pop pop D+ push dup push Q.TO-INT pop pop Q.TO-INT` — `floor(a*b / 2^16)`, signed (D-8), cut to two cells. Cells 0–2 of the product come from the four unsigned cell products `a0*b0`, `a0*b1`, `a1*b0`, `a1*b1` (low cell only); reading `a1` and `b1` as signed takes `(a1<0 ? b0 : 0) + (b1<0 ? a0 : 0)` off cell 2; the result is cells 0–2 shifted right 16 with `Q.TO-INT` twice. Executed on the golden model (2026-10-02) against an independent limb-by-limb reference, and against v3's `q48_mul` for non-negative operands. **Stack use is tight:** it leaves its caller 2 data cells under its arguments and 2 return entries (1 before `UM*` was revised); it holds all four input cells across its `UM*` calls. To be improved. Clobbers `A`. | | `Q./` | CAP | Shifted long division. **Division by zero sets an error** (v3 returned 0 silently). | | `Q.ABS` `Q.NEG` | CAP | `DABS`, `DNEGATE` — executed on the golden model (2026-10-02) against v3's `q48_abs` and `0 - q`: bit-for-bit at 32-bit cells, including v3's wrap of Q min to itself; at 64-bit cells the low cell is v3's and the high cell is the true sign, per D-10. | | `Q.LOG` `Q.EXP` `Q.SQRT` `Q.SIN` `Q.COS` | CAP | Algorithms ported from `q48_words.c`; the hosted C versions are the golden model. | diff --git a/v4/tests/test_foundation.c b/v4/tests/test_foundation.c index bc5aeef3..46171992 100644 --- a/v4/tests/test_foundation.c +++ b/v4/tests/test_foundation.c @@ -134,31 +134,57 @@ static void build(void) O(DROP); CALL(w_minus); CALL(w_zless); O(SEMI); /* : UM* ( u1 u2 -- ulo uhi ) section 4, D-3 - * over 0< over and push R: m1 ? u2 : 0 - * over over 0< and 1 and pop + push R: c_hi - * over over and 1 and push R: c_hi c_lo - * over 1 and NEGATE over 2/ and push R: c_hi c_lo t0 - * a! 2/ pop s t0 A: u2 - * 31 FOR +* UNEXT s hi A: lo - * NIP a 2* pop + SWAP lo' hi - * 2* a 0< NEGATE + pop + ; lo' hi' - * NEGATE is placed in line. 31 is the cell width less one; the loop body - * is the start of its own word so that unext restarts it. */ - w_umstar = v4_asm_label(&as); - O(OVER); CALL(w_zless); O(OVER); O(AND); O(PUSH); - O(OVER); O(OVER); CALL(w_zless); O(AND); LIT(1); O(AND); - O(RPOP); O(ADD); O(PUSH); - O(OVER); O(OVER); O(AND); LIT(1); O(AND); O(PUSH); - O(OVER); LIT(1); O(AND); O(INV); LIT(1); O(ADD); - O(OVER); O(TWO_SLASH); O(AND); O(PUSH); - O(BANG_A); O(TWO_SLASH); O(RPOP); - LIT(V4_CELL_BITS - 1); O(PUSH); - (void)v4_asm_label(&as); - O(MUL_STEP); O(UNEXT); - CALL(w_nip); - O(PUSH_A); O(TWO_STAR); O(RPOP); O(ADD); CALL(w_swap); - O(TWO_STAR); O(PUSH_A); CALL(w_zless); O(INV); LIT(1); O(ADD); O(ADD); - O(RPOP); O(ADD); O(SEMI); + * over 1 and inv 1 + over 2/ and u1 u2 t0 t0 = u2 2/ if u1 odd + * over a! 31 push R: loop count (FOR's push, early) + * push over 2/ pop u1 u2 s t0 A: u2, s = u1 2/ + * L: +* unext u1 u2 s hi A: lo + * push drop pop u1 u2 hi + * 2* a -if L0 drop 1 + jump L1 L0: drop L1: push R: 2hi + top bit of lo + * over -if L2 drop dup jump L3 L2: drop 0 L3: push R: + (u1<0 ? u2 : 0) + * dup -if L4 drop over 1 and jump L5 L4: drop 0 L5: u1 u2 (u2<0 ? u1&1 : 0) + * pop + pop + push u1 u2 R: hi' + * and 1 and a 2* + pop ; lo' hi' + * u1 and u2 wait on the data stack under the loop (+* touches only T, S + * and A), so the corrections are made afterwards and the return stack + * holds at most two temporaries. 31 is the cell width less one, pushed + * before s is made so the data stack never holds more than four; the loop + * body is the start of its own word so that unext restarts it. */ + { + v4_asm_ref l0, l1, l2, l3, l4, l5; + w_umstar = v4_asm_label(&as); + O(OVER); LIT(1); O(AND); O(INV); LIT(1); O(ADD); O(OVER); O(TWO_SLASH); O(AND); + O(OVER); O(BANG_A); LIT(V4_CELL_BITS - 1); O(PUSH); + O(PUSH); O(OVER); O(TWO_SLASH); O(RPOP); + (void)v4_asm_label(&as); + O(MUL_STEP); O(UNEXT); + O(PUSH); O(DROP); O(RPOP); + O(TWO_STAR); O(PUSH_A); + l0 = v4_asm_branch_fwd(&as, V4_OP_MINUS_IF); + O(DROP); LIT(1); O(ADD); + l1 = v4_asm_branch_fwd(&as, V4_OP_JUMP); + v4_asm_resolve(&as, l0, v4_asm_label(&as)); + O(DROP); + v4_asm_resolve(&as, l1, v4_asm_label(&as)); + O(PUSH); + O(OVER); + l2 = v4_asm_branch_fwd(&as, V4_OP_MINUS_IF); + O(DROP); O(DUP); + l3 = v4_asm_branch_fwd(&as, V4_OP_JUMP); + v4_asm_resolve(&as, l2, v4_asm_label(&as)); + O(DROP); LIT(0); + v4_asm_resolve(&as, l3, v4_asm_label(&as)); + O(PUSH); + O(DUP); + l4 = v4_asm_branch_fwd(&as, V4_OP_MINUS_IF); + O(DROP); O(OVER); LIT(1); O(AND); + l5 = v4_asm_branch_fwd(&as, V4_OP_JUMP); + v4_asm_resolve(&as, l4, v4_asm_label(&as)); + O(DROP); LIT(0); + v4_asm_resolve(&as, l5, v4_asm_label(&as)); + O(RPOP); O(ADD); O(RPOP); O(ADD); O(PUSH); + O(AND); LIT(1); O(AND); O(PUSH_A); O(TWO_STAR); O(ADD); O(RPOP); + O(SEMI); + } /* : UM/MOD ( ulo uhi ud -- urem uquot ) section 4 * a! 31 FOR -- 2.54.0 From 8f37e15f8ad3f504e0efe7e5032efcb9327f4291 Mon Sep 17 00:00:00 2001 From: rajames Date: Fri, 2 Oct 2026 23:33:57 -0400 Subject: [PATCH 018/135] feat(v4.0.0): repack Q.* so no UM* call holds all four inputs Q.* now forms its products in the order a1*b1 (low cell), a0*b1, a1*b0, a0*b0, dropping each input after its last use, with b0 waiting on the return stack. Each sign correction, (b1<0 ? a0 : 0) and (a1<0 ? b0 : 0), is folded into cell 2 as soon as its operands are adjacent, using -if rather than 0< calls. At most four live values sit under any UM* call. Headroom (data cells under args / return entries): 2/2 -> 3/3. Same checks as before at 32- and 64-bit cells, optimised and ASan+UBSan; dropping either sign correction fails about 9900 checks. Co-Authored-By: Claude Opus 5.5 --- docs/v4.0.0/DECOMPOSITION.md | 2 +- v4/tests/test_foundation.c | 72 ++++++++++++++++++++++-------------- 2 files changed, 45 insertions(+), 29 deletions(-) diff --git a/docs/v4.0.0/DECOMPOSITION.md b/docs/v4.0.0/DECOMPOSITION.md index 835f669c..1a160c5f 100644 --- a/docs/v4.0.0/DECOMPOSITION.md +++ b/docs/v4.0.0/DECOMPOSITION.md @@ -656,7 +656,7 @@ word. Per D-10 it occupies two cells on a 64-bit node too. Per D-8, v4 Q values | Word | Fate | Notes | | --- | --- | --- | | `Q.+` `Q.-` | CAP | `D+`, `D-` — executed on the golden model (2026-10-02) against v3's `q48_add`/`q48_sub` (`uint64_t` wrapping): bit-for-bit at 32-bit cells; at 64-bit cells the low cell is v3's, per D-10. | -| `Q.*` | CAP | `2OVER drop over 0< over and push over UM* pop - push push push over pop UM* drop pop pop push SWAP pop + push push over 0< over and pop pop push SWAP pop SWAP - push push over over UM* pop pop D+ push push push drop pop UM* 0 pop pop D+ push dup push Q.TO-INT pop pop Q.TO-INT` — `floor(a*b / 2^16)`, signed (D-8), cut to two cells. Cells 0–2 of the product come from the four unsigned cell products `a0*b0`, `a0*b1`, `a1*b0`, `a1*b1` (low cell only); reading `a1` and `b1` as signed takes `(a1<0 ? b0 : 0) + (b1<0 ? a0 : 0)` off cell 2; the result is cells 0–2 shifted right 16 with `Q.TO-INT` twice. Executed on the golden model (2026-10-02) against an independent limb-by-limb reference, and against v3's `q48_mul` for non-negative operands. **Stack use is tight:** it leaves its caller 2 data cells under its arguments and 2 return entries (1 before `UM*` was revised); it holds all four input cells across its `UM*` calls. To be improved. Clobbers `A`. | +| `Q.*` | CAP | `SWAP push over over UM* drop push push over pop -if L1 SWAP jump L2 L1: SWAP drop 0 L2: pop SWAP - push push over pop UM* pop + ROT pop dup push over -if L3 drop dup jump L4 L3: drop 0 L4: push UM* pop - D+ ROT pop UM* SWAP push 0 D+ pop push over pop SWAP Q.TO-INT push Q.TO-INT pop SWAP` (`SWAP` and `ROT` in line) — `floor(a*b / 2^16)`, signed (D-8), cut to two cells. Cells 0–2 of the product come from the unsigned cell products `a1*b1` (low cell), `a0*b1`, `a1*b0`, `a0*b0`, in that order, each input dropped after its last use and `b0` waiting on the return stack. Reading `a1` and `b1` as signed takes `(b1<0 ? a0 : 0)` and `(a1<0 ? b0 : 0)` off cell 2; each is folded in as soon as its operands are adjacent. The result is cells 0–2 shifted right 16 with `Q.TO-INT` twice. Executed on the golden model (2026-10-02) against an independent limb-by-limb reference, and against v3's `q48_mul` for non-negative operands. Leaves its caller 3 data cells under its arguments and 3 return entries. Clobbers `A`. | | `Q./` | CAP | Shifted long division. **Division by zero sets an error** (v3 returned 0 silently). | | `Q.ABS` `Q.NEG` | CAP | `DABS`, `DNEGATE` — executed on the golden model (2026-10-02) against v3's `q48_abs` and `0 - q`: bit-for-bit at 32-bit cells, including v3's wrap of Q min to itself; at 64-bit cells the low cell is v3's and the high cell is the true sign, per D-10. | | `Q.LOG` `Q.EXP` `Q.SQRT` `Q.SIN` `Q.COS` | CAP | Algorithms ported from `q48_words.c`; the hosted C versions are the golden model. | diff --git a/v4/tests/test_foundation.c b/v4/tests/test_foundation.c index 46171992..1bcabfa7 100644 --- a/v4/tests/test_foundation.c +++ b/v4/tests/test_foundation.c @@ -548,35 +548,51 @@ static void build(void) * shifted right 16. The cell products are unsigned; reading a1 and b1 * as signed takes (a1<0 ? b0 : 0) + (b1<0 ? a0 : 0) off cell 2, the * only cell above the unsigned product's that the result reaches. - * 2OVER drop over 0< over and push R: b1<0 ? a0 : 0 - * over UM* pop - a0 a1 b0 b1 l01 h01 a0*b1, corrected - * push push R: h01 l01 - * push over pop UM* drop a0 a1 b0 t3 a1*b1 low - * pop pop push SWAP pop + a0 a1 b0 x0 x1 - * push push over 0< over and a0 a1 b0 c R: x1 x0 - * pop pop push SWAP pop SWAP - a0 a1 b0 x0 x1-c - * push push over over UM* a0 a1 b0 l10 h10 a1*b0 - * pop pop D+ a0 a1 b0 X0 X1 - * push push push drop pop a0 b0 R: X1 X0 - * UM* 0 pop pop D+ c0 c1 c2 - * push dup push Q.TO-INT pop pop Q.TO-INT ; - * SWAP in line. Clobbers A. */ + * Products in the order a1*b1 (low cell), a0*b1, a1*b0, a0*b0, each + * input dropped after its last use; b0 waits on the return stack. + * SWAP push over over UM* drop a0 a1 b1 t3 R: b0 + * push push over pop a0 a1 a0 b1 R: b0 t3 + * -if L1 SWAP jump L2 L1: SWAP drop 0 L2: a0 a1 b1 c2 + * pop SWAP - push a0 a1 b1 R: b0 t3-c2 + * push over pop UM* pop + a0 a1 x0 x1 R: b0 + * ROT pop dup push a0 x0 x1 a1 b0 + * over -if L3 drop dup jump L4 L3: drop 0 L4: ... a1 b0 c1 + * push UM* pop - D+ a0 X0 X1 + * ROT pop UM* X0 X1 l00 h00 + * SWAP push 0 D+ pop c1 c2 c0 + * push over pop SWAP Q.TO-INT push Q.TO-INT pop SWAP ; + * SWAP and ROT in line. Clobbers A. */ #define SWAP_INLINE() do { O(OVER); O(PUSH); O(PUSH); O(DROP); O(RPOP); O(RPOP); } while (0) - w_qstar = v4_asm_label(&as); - CALL(w_2over); O(DROP); - O(OVER); CALL(w_zless); O(OVER); O(AND); O(PUSH); - O(OVER); CALL(w_umstar); O(RPOP); CALL(w_minus); - O(PUSH); O(PUSH); - O(PUSH); O(OVER); O(RPOP); CALL(w_umstar); O(DROP); - O(RPOP); O(RPOP); O(PUSH); SWAP_INLINE(); O(RPOP); O(ADD); - O(PUSH); O(PUSH); O(OVER); CALL(w_zless); O(OVER); O(AND); - O(RPOP); O(RPOP); O(PUSH); SWAP_INLINE(); O(RPOP); SWAP_INLINE(); CALL(w_minus); - O(PUSH); O(PUSH); O(OVER); O(OVER); CALL(w_umstar); - O(RPOP); O(RPOP); CALL(w_dplus); - O(PUSH); O(PUSH); O(PUSH); O(DROP); O(RPOP); - CALL(w_umstar); LIT(0); O(RPOP); O(RPOP); CALL(w_dplus); - O(PUSH); O(DUP); O(PUSH); CALL(w_qtoint); O(RPOP); O(RPOP); CALL(w_qtoint); - O(SEMI); +#define ROT_INLINE() do { O(PUSH); SWAP_INLINE(); O(RPOP); SWAP_INLINE(); } while (0) + { + v4_asm_ref l1, l2, l3, l4; + w_qstar = v4_asm_label(&as); + SWAP_INLINE(); O(PUSH); O(OVER); O(OVER); CALL(w_umstar); O(DROP); + O(PUSH); O(PUSH); O(OVER); O(RPOP); + l1 = v4_asm_branch_fwd(&as, V4_OP_MINUS_IF); + SWAP_INLINE(); + l2 = v4_asm_branch_fwd(&as, V4_OP_JUMP); + v4_asm_resolve(&as, l1, v4_asm_label(&as)); + SWAP_INLINE(); O(DROP); LIT(0); + v4_asm_resolve(&as, l2, v4_asm_label(&as)); + O(RPOP); SWAP_INLINE(); CALL(w_minus); O(PUSH); + O(PUSH); O(OVER); O(RPOP); CALL(w_umstar); O(RPOP); O(ADD); + ROT_INLINE(); O(RPOP); O(DUP); O(PUSH); + O(OVER); + l3 = v4_asm_branch_fwd(&as, V4_OP_MINUS_IF); + O(DROP); O(DUP); + l4 = v4_asm_branch_fwd(&as, V4_OP_JUMP); + v4_asm_resolve(&as, l3, v4_asm_label(&as)); + O(DROP); LIT(0); + v4_asm_resolve(&as, l4, v4_asm_label(&as)); + O(PUSH); CALL(w_umstar); O(RPOP); CALL(w_minus); CALL(w_dplus); + ROT_INLINE(); O(RPOP); CALL(w_umstar); + SWAP_INLINE(); O(PUSH); LIT(0); CALL(w_dplus); O(RPOP); + O(PUSH); O(OVER); O(RPOP); SWAP_INLINE(); CALL(w_qtoint); + O(PUSH); CALL(w_qtoint); O(RPOP); SWAP_INLINE(); + O(SEMI); + } +#undef ROT_INLINE #undef SWAP_INLINE CHECK(v4_asm_ok(&as), "foundation words assemble"); -- 2.54.0 From 9e03bdab192a7cc634fbf28689c3aced74199a8e Mon Sep 17 00:00:00 2001 From: rajames Date: Sat, 3 Oct 2026 00:17:11 -0400 Subject: [PATCH 019/135] feat(v4.0.0): Q./ under D-11, with (UQ/), D2*C and the (Q/) variable D-11 (ruled 2026-10-02): Q./ rounds toward zero, saturates to Q max / Q min on overflow, and on division by zero returns Q max / Q min by the dividend's sign (0 for 0/0) and sets the new NODE-ERROR register (7), which VM-ERROR? reads. - (UQ/): unsigned floor(a * 2^16 / b) for b != 0 and no overflow. Restoring division, 2N+16 steps, on one shifting register (quotient above remainder). Quotient register and divisor live in a 5-cell variable (Q/), like BASE and the hold buffer, so the stacks carry only the remainder, the quotient bit and the loop count. A first version kept the divisor on the return stack and overflowed it when called from Q./ (it never returned). - D2*C: double shift left with carry in and out. - Q./: zero-divisor handling, signs (kept in (Q/)), an overflow test that needs no division (|a| * 2^16 >= |b| * 2^(2N-1), possible only for |b| < 2^17), then (UQ/) and the sign. Checked at 32- and 64-bit cells, optimised and ASan+UBSan, against an independent limb-by-limb long division (including NODE-ERROR): every pair of 18 edge Q values, 13 width-native edge values (true Q max/min at either width), the overflow boundary, divisors in [2^(2N-2), 2^(2N-1)), and pseudo-random cases; and against v3's q48_div for non-negative a < 2^48. Q.* now also runs on the width-native edge values. Mutations of the compare paths, the take path, the error flag and the overflow mask are all caught (the mask matters only for Q min / -1.0). Headroom (data under args / return): Q./ 3/2. Co-Authored-By: Claude Opus 5.5 --- docs/v4.0.0/DECOMPOSITION.md | 11 +- v4/tests/test_foundation.c | 469 ++++++++++++++++++++++++++++++++++- 2 files changed, 475 insertions(+), 5 deletions(-) diff --git a/docs/v4.0.0/DECOMPOSITION.md b/docs/v4.0.0/DECOMPOSITION.md index 1a160c5f..a858a7a5 100644 --- a/docs/v4.0.0/DECOMPOSITION.md +++ b/docs/v4.0.0/DECOMPOSITION.md @@ -147,8 +147,8 @@ IF body1 ELSE body2 THEN → if L1 drop body1 jump L2 times, as on the F18. `FOR ... UNEXT` is the same but the body must fit in one instruction word. **Register conventions.** `A` and `B` are caller-saved. A word that uses them says so. Words in this -document that clobber `A`: `@ ! +! -! 2@ 2! C@ C! UM* * UM/MOD Q.FROM-INT Q.TO-INT Q.* SEND RECV`. Words that clobber `B`: -`SEND RECV`. +document that clobber `A`: `@ ! +! -! 2@ 2! C@ C! UM* * UM/MOD Q.FROM-INT Q.TO-INT Q.* Q./ SEND RECV`. Words that clobber `B`: +`Q./ SEND RECV`. **Return-stack words** (`>R R> R@ 2>R 2R> 2R@ I J UNLOOP` and the loop runtimes) are always IN. @@ -172,6 +172,7 @@ definition below depends on one, it says so. | **D-8** | Q48.16 signedness. | **Signed.** v3's unsigned comparisons and `Q.FROM-INT` clamping are retired. | | **D-9** | Instruction word width on a 64-bit-cell host (ruled 2026-10-02). | **32 bits at every cell width.** Six 5-bit slots plus 2 spare bits, as in §1.2. On a 64-bit host the instruction word is the low 32 bits of the cell and the high half is ignored, so compiled code is identical at both widths. Only data and `@p` literals are a full cell wide. | | **D-10** | Q48.16 width on a 64-bit-cell node (ruled 2026-10-02). | **Two cells at every cell width.** A Q value is a signed double on 32- and 64-bit nodes alike, so every Q word is the same double word at both widths. At 32-bit cells this is bit-for-bit v3's 64-bit Q. At 64-bit cells the low cell is v3's value, and where v3 wraps on Q48.16 overflow (a sum past Q max, `ABS` or `NEG` of Q min) the high cell carries the true result instead. | +| **D-11** | `Q./` semantics: division by zero, rounding, overflow (ruled 2026-10-02). | **Saturate and flag; round toward zero; saturate on overflow.** The quotient of `a * 2^16 / b` is rounded toward zero, like `SM/REM`. When it does not fit a Q value it is clamped to Q max or Q min by its sign. Division by zero returns Q max or Q min by the sign of the dividend (`0 / 0` gives 0) and sets the node's `NODE-ERROR` register (§7), which `VM-ERROR?` reads. v3 returned 0 on division by zero and saturated whenever the dividend was 2^48 or more, even when the quotient would have fit. | **Consequences of D-2 that every definition must respect.** The data stack holds 10 items and the return stack 9, and every `call`, `FOR`, `DO` loop frame and `push` uses return-stack slots. Nesting @@ -657,7 +658,10 @@ word. Per D-10 it occupies two cells on a 64-bit node too. Per D-8, v4 Q values | --- | --- | --- | | `Q.+` `Q.-` | CAP | `D+`, `D-` — executed on the golden model (2026-10-02) against v3's `q48_add`/`q48_sub` (`uint64_t` wrapping): bit-for-bit at 32-bit cells; at 64-bit cells the low cell is v3's, per D-10. | | `Q.*` | CAP | `SWAP push over over UM* drop push push over pop -if L1 SWAP jump L2 L1: SWAP drop 0 L2: pop SWAP - push push over pop UM* pop + ROT pop dup push over -if L3 drop dup jump L4 L3: drop 0 L4: push UM* pop - D+ ROT pop UM* SWAP push 0 D+ pop push over pop SWAP Q.TO-INT push Q.TO-INT pop SWAP` (`SWAP` and `ROT` in line) — `floor(a*b / 2^16)`, signed (D-8), cut to two cells. Cells 0–2 of the product come from the unsigned cell products `a1*b1` (low cell), `a0*b1`, `a1*b0`, `a0*b0`, in that order, each input dropped after its last use and `b0` waiting on the return stack. Reading `a1` and `b1` as signed takes `(b1<0 ? a0 : 0)` and `(a1<0 ? b0 : 0)` off cell 2; each is folded in as soon as its operands are adjacent. The result is cells 0–2 shifted right 16 with `Q.TO-INT` twice. Executed on the golden model (2026-10-02) against an independent limb-by-limb reference, and against v3's `q48_mul` for non-negative operands. Leaves its caller 3 data cells under its arguments and 3 return entries. Clobbers `A`. | -| `Q./` | CAP | Shifted long division. **Division by zero sets an error** (v3 returned 0 silently). | +| `Q./` | CAP | `over over OR if ZERO drop push over pop SWAP over xor (Q/) 4 + b! !b -if L1 DNEGATE L1: push push -if L2 DNEGATE L2: pop pop dup if CHK drop jump DIV CHK: drop over -131072 and if CHK2 drop jump DIV CHK2: drop push push dup pop dup push N-18 FOR 2* UNEXT over over xor -if SAME drop drop -if NOOV jump OV SAME: drop push inv pop + inv -if OV NOOV: drop pop pop jump DIV OV: drop drop drop pop pop drop drop (Q/) 4 + b! @b -if OVP drop 0 MSB ; OVP: drop -1 MAXHI ; DIV: (UQ/) (Q/) 4 + b! @b -if L3 drop DNEGATE ; L3: drop ; ZERO: drop drop drop NODE-ERROR b! -1 !b over over OR if Z0 drop -if ZP drop drop 0 MSB ; ZP: drop drop -1 MAXHI ; Z0: drop ;` — D-11: `a * 2^16 / b`, rounded toward zero; saturated to Q max / Q min on overflow; on division by zero, Q max / Q min by the dividend's sign (0 for `0 / 0`) and `NODE-ERROR` set. The sign of the result waits in `(Q/)`. Overflow needs no division: the quotient reaches `2^(2N-1)` exactly when `|a| * 2^16 >= |b| * 2^(2N-1)`, possible only for `|b| < 2^17`, where it is `a1 >= b0 << (N-17)` unsigned. `MSB` and `MAXHI` are the high cells of Q min and Q max. Executed on the golden model (2026-10-02) against an independent limb-by-limb reference (including `NODE-ERROR`), on width-native edge values, and against v3's `q48_div` for non-negative `a < 2^48`. Leaves its caller 3 data cells under its arguments and 2 return entries. Clobbers `A` and `B`. | +| `(UQ/)` | CAP | Internal to `Q./`: unsigned `floor(a * 2^16 / b)` for `b != 0` and no overflow. Restoring division, `2N+16` steps, on one shifting register — quotient (starting as `a`) above remainder — with the quotient and divisor in `(Q/)` so the stacks carry only the remainder, the quotient bit and the loop count. Each step's quotient bit enters at the next step's shift; with no overflow the bits leaving the quotient in the last 16 steps are zeros. Trial subtraction by in-line sign tests (`x - y` with `y` on top is `push inv pop + inv`). Executed on the golden model (2026-10-02). Clobbers `A` and `B`. | +| `D2*C` | CAP | `( lo hi cin -- lo' hi' cout )`: the double shifted left one bit, `cin` entering at the bottom and `cout` the bit leaving the top (both 0 or 1). `ROT dup -if L1 drop 1 jump L2 L1: drop 0 L2: push 2* + SWAP dup -if L3 drop 1 jump L4 L3: drop 0 L4: push 2* pop pop ROT + SWAP`, `ROT` and `SWAP` in line. Executed on the golden model (2026-10-02). | +| `(Q/)` | CAP | Variable, 5 cells: `Q./`'s quotient register, divisor and result sign. Like `BASE` and the hold buffer, it lives in node memory. | | `Q.ABS` `Q.NEG` | CAP | `DABS`, `DNEGATE` — executed on the golden model (2026-10-02) against v3's `q48_abs` and `0 - q`: bit-for-bit at 32-bit cells, including v3's wrap of Q min to itself; at 64-bit cells the low cell is v3's and the high cell is the true sign, per D-10. | | `Q.LOG` `Q.EXP` `Q.SQRT` `Q.SIN` `Q.COS` | CAP | Algorithms ported from `q48_words.c`; the hosted C versions are the golden model. | | `Q.FROM-INT` | CAP | `push 0 a! 0 pop 15 FOR +* UNEXT push drop a pop` — `n * 2^16` as a signed double. `+*` with `S = 0` never adds, so each step is an exact arithmetic right shift of `T:A`; starting from `T:A = n:0` (that is, `n * 2^N`) and shifting `N-16` bits leaves `n * 2^16`. The count is `N-17`: 15 at 32-bit cells, 47 at 64. Negative values are no longer clamped to 0. Executed on the golden model (2026-10-02): matches v3's `q48_from_u64` for `n >= 0` (at 64-bit cells in the low cell, where v3 wraps for `n >= 2^47`, per D-10). Clobbers `A`. | @@ -765,3 +769,4 @@ Addresses are assigned in the node memory map (D-4). Names only here. | `GOV-*` | R/W | Governor parameters and Jacquard selector state (`L8-*`, decay rate). | | `REC-ENABLE` | R/W | DoE recorder on/off (`HB-ON` / `HB-OFF`). | | `PORT-STATUS` | R | Per-port ready flags, for non-blocking polls. | +| `NODE-ERROR` | R/W | Arithmetic error flag: set to −1 by `Q./` on division by zero (D-11), cleared by writing 0. `VM-ERROR?` reads it. | diff --git a/v4/tests/test_foundation.c b/v4/tests/test_foundation.c index 1bcabfa7..5d9f94bb 100644 --- a/v4/tests/test_foundation.c +++ b/v4/tests/test_foundation.c @@ -23,7 +23,10 @@ * <, =, D<, 2OVER, the call-free (D<), DMAX, DMIN and 2SWAP, and the Q * comparisons on them, are checked against C, signed (D-8), and against v3 * where v3's unsigned Q comparisons agree. Q.* is checked against an independent limb-by-limb - * reference, signed, and against v3's q48_mul for non-negative operands. Every word is + * reference, signed, and against v3's q48_mul for non-negative operands. + * Q./ (D-11) and its core (UQ/) are checked against an independent + * limb-by-limb long division, including NODE-ERROR, on width-native edge + * values, and against v3's q48_div where v4 keeps v3's meaning. Every word is * also probed for how much of the 10- and 9-deep circular stacks (D-2) it * leaves to its caller. * @@ -41,6 +44,11 @@ static int failures = 0, checks = 0; #define CHECK(c,...) do{checks++; if(!(c)){failures++; printf("FAIL %s:%d: ",__FILE__,__LINE__); printf(__VA_ARGS__); printf("\n");}}while(0) #define CANARY ((v4_cell)0x0C0FFEE5) +/* NODE-ERROR (section 7); D-4 leaves its address open, so the test puts it + * in the word next to the halt address. */ +#define NODE_ERROR ((v4_cell)(V4_NODE_WORDS - 2u)) +/* (Q/), Q./'s 5-cell scratch variable: q0 q1 b0 b1 sign. */ +#define QS ((v4_cell)(V4_NODE_WORDS - 8u)) #define MAXU ((v4_ucell)~(v4_ucell)0) #define FLAG(c) ((c) ? V4_ALL_ONES : (v4_cell)0) @@ -54,7 +62,7 @@ static v4_cell w_nip, w_swap, w_or, w_negate, w_rot, w_zless, w_zequal, w_ugreater, w_abs, w_s2d, w_dplus, w_dnegate, w_dabs, w_smrem, w_slashmod, w_mplus, w_dminus, w_d0equal, w_dequal, w_qfromint, w_qtoint, w_less, w_equal, w_dless, w_2swap, w_2over, - w_dmax, w_dmin, w_qgt_doc, w_qgt, w_dltkeep, w_qstar; + w_dmax, w_dmin, w_qgt_doc, w_qgt, w_dltkeep, w_qstar, w_d2starc, w_uqdiv, w_qslash; #define O(name) v4_asm_op(&as, V4_OP_##name) #define LIT(v) v4_asm_lit(&as, (v4_cell)(v)) @@ -593,6 +601,225 @@ static void build(void) O(SEMI); } #undef ROT_INLINE +#undef SWAP_INLINE + + /* : D2*C ( lo hi cin -- lo' hi' cout ) 5.26, for Q./ + * The double shifted left one bit, cin (0 or 1) entering at the bottom, + * cout (0 or 1) the bit that left the top. + * ROT dup -if L1 drop 1 jump L2 L1: drop 0 L2: push hi cin lo R: m + * 2* + SWAP lo' hi + * dup -if L3 drop 1 jump L4 L3: drop 0 L4: push R: m cout + * 2* pop pop ROT + SWAP ; lo' hi' cout + * ROT and SWAP in line. */ +#define SWAP_INLINE() do { O(OVER); O(PUSH); O(PUSH); O(DROP); O(RPOP); O(RPOP); } while (0) +#define ROT_INLINE() do { O(PUSH); SWAP_INLINE(); O(RPOP); SWAP_INLINE(); } while (0) + { + v4_asm_ref l1, l2, l3, l4; + w_d2starc = v4_asm_label(&as); + ROT_INLINE(); O(DUP); + l1 = v4_asm_branch_fwd(&as, V4_OP_MINUS_IF); + O(DROP); LIT(1); + l2 = v4_asm_branch_fwd(&as, V4_OP_JUMP); + v4_asm_resolve(&as, l1, v4_asm_label(&as)); + O(DROP); LIT(0); + v4_asm_resolve(&as, l2, v4_asm_label(&as)); + O(PUSH); O(TWO_STAR); O(ADD); SWAP_INLINE(); + O(DUP); + l3 = v4_asm_branch_fwd(&as, V4_OP_MINUS_IF); + O(DROP); LIT(1); + l4 = v4_asm_branch_fwd(&as, V4_OP_JUMP); + v4_asm_resolve(&as, l3, v4_asm_label(&as)); + O(DROP); LIT(0); + v4_asm_resolve(&as, l4, v4_asm_label(&as)); + O(PUSH); O(TWO_STAR); O(RPOP); O(RPOP); ROT_INLINE(); O(ADD); SWAP_INLINE(); + O(SEMI); + } +#undef ROT_INLINE +#undef SWAP_INLINE + + /* : (UQ/) ( a0 a1 b0 b1 -- q0 q1 ) 5.26, core of Q./ + * Unsigned floor(a * 2^16 / b), for b != 0 and a quotient below + * 2^(2N-1) (Q./ checks both first). Restoring division, 2N+16 steps, + * on one shifting register: quotient q (starts as a) above remainder r. + * The bit leaving q's top enters r; each step's quotient bit enters q at + * the next step's shift, and a final shift takes in the last one. With + * no overflow the bits leaving q in the last 16 steps are zeros. + * q and b live in the scratch variable (Q/) = QS: q0 q1 b0 b1, so the + * stacks hold only r, the quotient bit and the loop count. + * QS 2 + a! SWAP !+ ! QS a! SWAP !+ ! 0 0 0 r0 r1 qb + * 2N+15 FOR + * QS a! @+ @ ROT D2*C r0 r1 q0 q1 c + * push SWAP QS a! !+ ! pop D2*C r0 r1 t + * if CMP drop jump TAKE + * CMP: drop QS 3 + b! @b r0 r1 b1 + * over over xor if EQH -if SAMEH + * drop drop -if NT1 jump TAKE NT1: jump NOTAKE + * SAMEH: drop over SWAP push inv pop + inv r0 r1 r1-b1 + * -if T2 drop jump NOTAKE T2: drop jump TAKE + * EQH: drop drop over QS 2 + b! @b r0 r1 r0 b0 + * over over xor -if SAMEL + * drop drop -if NT3 drop jump TAKEL NT3: drop jump NOTAKEL + * SAMEL: drop push inv pop + inv r0 r1 r0-b0 + * -if T4 drop jump NOTAKEL T4: drop jump TAKEL + * TAKEL: drop QS 2 + b! @b push inv pop + inv 0 1 jump END + * NOTAKEL: 0 jump END + * TAKE: QS 2 + a! @+ @ DNEGATE D+ 1 jump END + * NOTAKE: 0 + * END: + * NEXT + * QS a! @+ @ ROT D2*C drop push push drop drop pop pop ; + * x - y with y on top is push inv pop + inv. SWAP, ROT in line. + * Clobbers A and B. */ +#define SWAP_INLINE() do { O(OVER); O(PUSH); O(PUSH); O(DROP); O(RPOP); O(RPOP); } while (0) +#define ROT_INLINE() do { O(PUSH); SWAP_INLINE(); O(RPOP); SWAP_INLINE(); } while (0) +#define SUB_INLINE() do { O(PUSH); O(INV); O(RPOP); O(ADD); O(INV); } while (0) +#define FWD(op) v4_asm_branch_fwd(&as, V4_OP_##op) +#define HERE_(r) v4_asm_resolve(&as, (r), v4_asm_label(&as)) + { + v4_cell loop, l_take, l_notake, l_takel, l_notakel, l_end; + v4_asm_ref cmp, eqh, sameh, nt1, t2, samel, nt3, t4; + v4_asm_ref j_take[4], j_notake[3], j_takel[3], j_notakel[3], j_end[3]; + unsigned nt = 0, nn = 0, ntl = 0, nnl = 0, ne = 0, k; + + w_uqdiv = v4_asm_label(&as); + LIT(QS + 2); O(BANG_A); SWAP_INLINE(); O(STORE_INC); O(STORE_A); + LIT(QS); O(BANG_A); SWAP_INLINE(); O(STORE_INC); O(STORE_A); + LIT(0); LIT(0); LIT(0); + LIT(2 * V4_CELL_BITS + 15); O(PUSH); + loop = v4_asm_label(&as); + LIT(QS); O(BANG_A); O(FETCH_INC); O(FETCH_A); ROT_INLINE(); CALL(w_d2starc); + O(PUSH); SWAP_INLINE(); LIT(QS); O(BANG_A); O(STORE_INC); O(STORE_A); O(RPOP); + CALL(w_d2starc); + cmp = FWD(IF); + O(DROP); j_take[nt++] = FWD(JUMP); + HERE_(cmp); /* CMP */ + O(DROP); LIT(QS + 3); O(BANG_B); O(FETCH_B); + O(OVER); O(OVER); O(XOR); eqh = FWD(IF); + sameh = FWD(MINUS_IF); + O(DROP); O(DROP); nt1 = FWD(MINUS_IF); + j_take[nt++] = FWD(JUMP); + HERE_(nt1); j_notake[nn++] = FWD(JUMP); + HERE_(sameh); /* SAMEH */ + O(DROP); O(OVER); SWAP_INLINE(); SUB_INLINE(); t2 = FWD(MINUS_IF); + O(DROP); j_notake[nn++] = FWD(JUMP); + HERE_(t2); O(DROP); j_take[nt++] = FWD(JUMP); + HERE_(eqh); /* EQH */ + O(DROP); O(DROP); O(OVER); LIT(QS + 2); O(BANG_B); O(FETCH_B); + O(OVER); O(OVER); O(XOR); samel = FWD(MINUS_IF); + O(DROP); O(DROP); nt3 = FWD(MINUS_IF); + O(DROP); j_takel[ntl++] = FWD(JUMP); + HERE_(nt3); O(DROP); j_notakel[nnl++] = FWD(JUMP); + HERE_(samel); /* SAMEL */ + O(DROP); SUB_INLINE(); t4 = FWD(MINUS_IF); + O(DROP); j_notakel[nnl++] = FWD(JUMP); + HERE_(t4); O(DROP); j_takel[ntl++] = FWD(JUMP); + l_takel = v4_asm_label(&as); /* TAKEL */ + O(DROP); LIT(QS + 2); O(BANG_B); O(FETCH_B); SUB_INLINE(); LIT(0); LIT(1); + j_end[ne++] = FWD(JUMP); + l_notakel = v4_asm_label(&as); /* NOTAKEL */ + LIT(0); j_end[ne++] = FWD(JUMP); + l_take = v4_asm_label(&as); /* TAKE */ + LIT(QS + 2); O(BANG_A); O(FETCH_INC); O(FETCH_A); + CALL(w_dnegate); CALL(w_dplus); LIT(1); j_end[ne++] = FWD(JUMP); + l_notake = v4_asm_label(&as); /* NOTAKE */ + LIT(0); + l_end = v4_asm_label(&as); /* END */ + v4_asm_branch(&as, V4_OP_NEXT, loop); + LIT(QS); O(BANG_A); O(FETCH_INC); O(FETCH_A); ROT_INLINE(); CALL(w_d2starc); O(DROP); + O(PUSH); O(PUSH); O(DROP); O(DROP); O(RPOP); O(RPOP); O(SEMI); + + for (k = 0; k < nt; k++) v4_asm_resolve(&as, j_take[k], l_take); + for (k = 0; k < nn; k++) v4_asm_resolve(&as, j_notake[k], l_notake); + for (k = 0; k < ntl; k++) v4_asm_resolve(&as, j_takel[k], l_takel); + for (k = 0; k < nnl; k++) v4_asm_resolve(&as, j_notakel[k], l_notakel); + for (k = 0; k < ne; k++) v4_asm_resolve(&as, j_end[k], l_end); + } +#undef HERE_ +#undef FWD +#undef SUB_INLINE +#undef ROT_INLINE +#undef SWAP_INLINE + + /* : Q./ ( a b -- q ) 5.26, D-11 + * over over OR if ZERO drop + * push over pop SWAP over xor QS 4 + b! !b a0 a1 b0 b1 (Q/)+4: sign + * -if L1 DNEGATE L1: push push -if L2 DNEGATE L2: pop pop |a| |b| + * dup if CHK drop jump DIV b1 != 0: no overflow + * CHK: drop over -131072 and if CHK2 drop jump DIV b0 >= 2^17: none + * CHK2: drop push push dup pop dup push N-18 FOR 2* UNEXT + * over over xor -if SAME drop drop -if NOOV jump OV + * SAME: drop push inv pop + inv -if OV + * NOOV: drop pop pop jump DIV a0 a1 b0 0 + * OV: drop drop drop pop pop drop drop + * QS 4 + b! @b -if OVP drop 0 MSB ; OVP: drop -1 MAXHI ; + * DIV: (UQ/) QS 4 + b! @b -if L3 drop DNEGATE ; L3: drop ; + * ZERO: drop drop drop NODE-ERROR b! -1 !b + * over over OR if Z0 drop -if ZP drop drop 0 MSB ; + * ZP: drop drop -1 MAXHI ; Z0: drop ; + * MSB and MAXHI are the high cells of Q min and Q max. Clobbers A and B. */ +#define SWAP_INLINE() do { O(OVER); O(PUSH); O(PUSH); O(DROP); O(RPOP); O(RPOP); } while (0) +#define SUB_INLINE() do { O(PUSH); O(INV); O(RPOP); O(ADD); O(INV); } while (0) +#define FWD(op) v4_asm_branch_fwd(&as, V4_OP_##op) +#define HERE_(r) v4_asm_resolve(&as, (r), v4_asm_label(&as)) + { + v4_asm_ref zero, l1, l2, chk, chk2, same, noov1, ov1, ov2, ovp, l3, z0, zp; + v4_asm_ref d1, d2, d3; + v4_cell l_div, l_noov, l_ov; + + w_qslash = v4_asm_label(&as); + O(OVER); O(OVER); CALL(w_or); zero = FWD(IF); + O(DROP); + O(PUSH); O(OVER); O(RPOP); SWAP_INLINE(); O(OVER); O(XOR); + LIT(QS + 4); O(BANG_B); O(STORE_B); + l1 = FWD(MINUS_IF); CALL(w_dnegate); HERE_(l1); + O(PUSH); O(PUSH); + l2 = FWD(MINUS_IF); CALL(w_dnegate); HERE_(l2); + O(RPOP); O(RPOP); + O(DUP); chk = FWD(IF); + O(DROP); d1 = FWD(JUMP); + HERE_(chk); + O(DROP); O(OVER); LIT(-131072); O(AND); chk2 = FWD(IF); + O(DROP); d2 = FWD(JUMP); + HERE_(chk2); + O(DROP); O(PUSH); O(PUSH); O(DUP); O(RPOP); O(DUP); O(PUSH); + LIT(V4_CELL_BITS - 18); O(PUSH); + (void)v4_asm_label(&as); + O(TWO_STAR); O(UNEXT); + O(OVER); O(OVER); O(XOR); same = FWD(MINUS_IF); + O(DROP); O(DROP); noov1 = FWD(MINUS_IF); + ov1 = FWD(JUMP); + HERE_(same); + O(DROP); SUB_INLINE(); ov2 = FWD(MINUS_IF); + l_noov = v4_asm_label(&as); + O(DROP); O(RPOP); O(RPOP); d3 = FWD(JUMP); + l_ov = v4_asm_label(&as); + O(DROP); O(DROP); O(DROP); O(RPOP); O(RPOP); O(DROP); O(DROP); + LIT(QS + 4); O(BANG_B); O(FETCH_B); ovp = FWD(MINUS_IF); + O(DROP); LIT(0); LIT((v4_cell)V4_MSB); O(SEMI); + HERE_(ovp); O(DROP); LIT(-1); LIT((v4_cell)(MAXU >> 1)); O(SEMI); + l_div = v4_asm_label(&as); + CALL(w_uqdiv); LIT(QS + 4); O(BANG_B); O(FETCH_B); l3 = FWD(MINUS_IF); + O(DROP); CALL(w_dnegate); O(SEMI); + HERE_(l3); O(DROP); O(SEMI); + HERE_(zero); + O(DROP); O(DROP); O(DROP); + LIT(NODE_ERROR); O(BANG_B); LIT(-1); O(STORE_B); + O(OVER); O(OVER); CALL(w_or); z0 = FWD(IF); + O(DROP); zp = FWD(MINUS_IF); + O(DROP); O(DROP); LIT(0); LIT((v4_cell)V4_MSB); O(SEMI); + HERE_(zp); O(DROP); O(DROP); LIT(-1); LIT((v4_cell)(MAXU >> 1)); O(SEMI); + HERE_(z0); O(DROP); O(SEMI); + + v4_asm_resolve(&as, d1, l_div); + v4_asm_resolve(&as, d2, l_div); + v4_asm_resolve(&as, d3, l_div); + v4_asm_resolve(&as, noov1, l_noov); + v4_asm_resolve(&as, ov1, l_ov); + v4_asm_resolve(&as, ov2, l_ov); + } +#undef HERE_ +#undef FWD +#undef SUB_INLINE #undef SWAP_INLINE CHECK(v4_asm_ok(&as), "foundation words assemble"); @@ -882,6 +1109,69 @@ static uint64_t v3_q48_mul(uint64_t a, uint64_t b) return (result_hi << 48) | (result_lo >> 16); } +/* Reference Q./ (D-11), by a different method from the FORTH: magnitudes + * in 16-bit limbs, |a| * 2^16 divided by |b| one bit at a time, then the + * sign applied (rounding toward zero) and the result saturated to Q max or + * Q min. Division by zero gives Q max / Q min by the dividend's sign, 0 for + * 0 / 0, and *err = 1. */ +static void qdiv_ref(v4_ucell al, v4_ucell ah, v4_ucell bl, v4_ucell bh, + v4_ucell *rl, v4_ucell *rh, int *err) +{ + uint32_t a[QLIMBS], b[QLIMBS], num[QLIMBS + 1], quo[QLIMBS + 1], rem[QLIMBS + 1]; + int an, bn, neg, big = 0; + unsigned i, k; + + *err = 0; + if (bl == 0 && bh == 0) { + *err = 1; + if (al == 0 && ah == 0) { *rl = 0; *rh = 0; } + else if (ah & V4_MSB) { *rl = 0; *rh = V4_MSB; } + else { *rl = MAXU; *rh = MAXU >> 1; } + return; + } + q_to_limbs(al, ah, a, &an); + q_to_limbs(bl, bh, b, &bn); + neg = an != bn; + num[0] = 0; /* |a| * 2^16 */ + for (i = 0; i < QLIMBS; i++) num[i + 1] = a[i]; + for (i = 0; i <= QLIMBS; i++) { quo[i] = 0; rem[i] = 0; } + for (k = 16 * (QLIMBS + 1); k-- > 0; ) { + uint32_t bit = (num[k / 16] >> (k % 16)) & 1u, c = bit; + int ge = 1; + for (i = 0; i <= QLIMBS; i++) { /* rem = 2 rem + bit */ + uint32_t t = (rem[i] << 1) | c; + rem[i] = t & 0xFFFFu; + c = t >> 16; + } + for (i = QLIMBS + 1; i-- > 0; ) { /* rem >= |b| ? */ + uint32_t bv = i < QLIMBS ? b[i] : 0; + if (rem[i] != bv) { ge = rem[i] > bv; break; } + } + if (ge) { + uint32_t br = 0; + for (i = 0; i <= QLIMBS; i++) { + uint32_t bv = i < QLIMBS ? b[i] : 0; + uint32_t t = rem[i] - bv - br; + br = (t >> 16) & 1u; + rem[i] = t & 0xFFFFu; + } + quo[k / 16] |= 1u << (k % 16); + } + } + if (quo[QLIMBS] || (quo[QLIMBS - 1] & 0x8000u)) big = 1; /* >= 2^(2N-1) */ + if (big) { + if (neg) { *rl = 0; *rh = V4_MSB; } + else { *rl = MAXU; *rh = MAXU >> 1; } + return; + } + *rl = 0; *rh = 0; + for (i = 0; i < QLIMBS / 2; i++) { + *rl |= (v4_ucell)quo[i] << (16 * i); + *rh |= (v4_ucell)quo[QLIMBS / 2 + i] << (16 * i); + } + if (neg) dneg(*rl, *rh, rl, rh); +} + /* Stack headroom. Run `word` with `dfill` marked cells under the canary and * `rfill` marked cells under its return address, and report whether the * results, the canary and every marked cell come back intact. The F18 stacks @@ -1366,6 +1656,174 @@ int main(void) } } + /* (UQ/) against the Q./ reference, for non-negative a and b where the + * quotient fits (|a| * 2^16 < |b| * 2^(2N-1), i.e. not (b < 2^17 and + * a1 >= b0 << (N-17))). */ + { + uint64_t x = 0x94D049BB133111EBu; + unsigned ran = 0; + for (unsigned i = 0; i < 5000; i++) { + v4_ucell al, ah, bl, bh, rl, rh; + int err; + x ^= x << 13; x ^= x >> 7; x ^= x << 17; al = (v4_ucell)x; + x ^= x << 13; x ^= x >> 7; x ^= x << 17; ah = (v4_ucell)x >> 1; + x ^= x << 13; x ^= x >> 7; x ^= x << 17; bl = (v4_ucell)x; + x ^= x << 13; x ^= x >> 7; x ^= x << 17; bh = (v4_ucell)x >> 1; + switch (i & 7u) { + case 1: bh = 0; break; + case 2: bh = 0; bl >>= (unsigned)(x >> 59); break; + case 3: ah >>= (unsigned)(x >> 59) % V4_CELL_BITS; break; + case 4: bh >>= (unsigned)(x >> 58) % V4_CELL_BITS; break; + case 5: ah = 0; bh = 0; break; + case 6: al = bl; ah = bh; break; /* a = b */ + default: break; + } + if (bl == 0 && bh == 0) bl = 1; + if (bh == 0 && (bl >> 17) == 0 && ah >= (bl << (V4_CELL_BITS - 17))) continue; + qdiv_ref(al, ah, bl, bh, &rl, &rh, &err); + ran++; + CHECK(call4(w_uqdiv, (v4_cell)al, (v4_cell)ah, (v4_cell)bl, (v4_cell)bh) + && left2((v4_cell)rl, (v4_cell)rh), "(UQ/) [%u]", i); + } + /* Divisors in [2^(2N-2), 2^(2N-1)), where the remainder's and the + * divisor's top bits can differ. (Q./ passes magnitudes, so b never + * exceeds 2^(2N-1); that one value is covered through Q./.) */ + for (unsigned i = 0; i < 4000; i++) { + v4_ucell al, ah, bl, bh, rl, rh; + int err; + x ^= x << 13; x ^= x >> 7; x ^= x << 17; al = (v4_ucell)x; + x ^= x << 13; x ^= x >> 7; x ^= x << 17; ah = (v4_ucell)x >> 1; + x ^= x << 13; x ^= x >> 7; x ^= x << 17; bl = (v4_ucell)x; + x ^= x << 13; x ^= x >> 7; x ^= x << 17; bh = (v4_ucell)x; + bh = (bh >> 2) | (V4_MSB >> 1); /* b in [2^(2N-2), 2^(2N-1)) */ + if (i & 1u) bh |= (V4_MSB >> 1) - 1u; /* near the top of it */ + qdiv_ref(al, ah, bl, bh, &rl, &rh, &err); + ran++; + CHECK(call4(w_uqdiv, (v4_cell)al, (v4_cell)ah, (v4_cell)bl, (v4_cell)bh) + && left2((v4_cell)rl, (v4_cell)rh), "(UQ/) large b [%u]", i); + } + printf(" (UQ/) cases run: %u\n", ran); + } + /* D2*C against C. */ + for (unsigned i = 0; i < NVEC; i++) + for (unsigned j = 0; j < NVEC; j++) + for (unsigned c = 0; c < 2; c++) { + v4_ucell lo = (v4_ucell)vec[i], hi = (v4_ucell)vec[j]; + v4_cell w[3]; + w[0] = (v4_cell)((lo << 1) | c); + w[1] = (v4_cell)((hi << 1) | (lo >> (V4_CELL_BITS - 1))); + w[2] = (v4_cell)(hi >> (V4_CELL_BITS - 1)); + CHECK(call(w_d2starc, 3, vec[i], vec[j], (v4_cell)c) && leftk(w, 3), + "D2*C [%u,%u,%u]", i, j, c); + } + + /* Q./ against the reference (D-11), and NODE-ERROR set exactly on + * division by zero; against v3's q48_div for non-negative a < 2^48 and + * b != 0 where v3's quotient is below 2^63. */ + { + static const uint64_t qd[] = { + 0, 1, 3, 0x8000u, 0x10000u, 0x18000u, 0x30000u, 0xFFFFu, + (uint64_t)0 - 0x10000u, (uint64_t)0 - 1u, (uint64_t)0 - 0x30000u, + 0xFFFFFFFFu, 0x100000000u, (uint64_t)0 - 0x100000000u, + ((uint64_t)1 << 47) - 1u, (uint64_t)1 << 47, + ((uint64_t)1 << 63) - 1u, (uint64_t)1 << 63 + }; + const unsigned nd = sizeof qd / sizeof qd[0]; + uint64_t x = 0xBF58476D1CE4E5B9u; + for (unsigned i = 0; i < nd * nd + 5000u; i++) { + uint64_t a, b; + v4_cell al, ah, bl, bh; + v4_ucell rl, rh; + int err; + if (i < nd * nd) { a = qd[i / nd]; b = qd[i % nd]; } + else { + x ^= x << 13; x ^= x >> 7; x ^= x << 17; a = x; + x ^= x << 13; x ^= x >> 7; x ^= x << 17; b = x; + if (i & 1u) a = asr64(a, (unsigned)(x >> 58)); + if (i & 2u) b = asr64(b, (unsigned)(x >> 52) & 63u); + if ((i & 12u) == 12u) b = 0; + } + qcells(a, &al, &ah); + qcells(b, &bl, &bh); + qdiv_ref((v4_ucell)al, (v4_ucell)ah, (v4_ucell)bl, (v4_ucell)bh, &rl, &rh, &err); + v4_node_store(&n, NODE_ERROR, 0); + CHECK(call4(w_qslash, al, ah, bl, bh) && left2((v4_cell)rl, (v4_cell)rh), + "Q./ [%u]", i); + CHECK(v4_node_load(&n, NODE_ERROR) == (err ? -1 : 0), "Q./ NODE-ERROR [%u]", i); + if (!(a >> 63) && !(b >> 63) && b != 0 && a < ((uint64_t)1 << 48)) { + uint64_t v3 = (a << 16) / b; + if (!(v3 >> 63)) { + v4_cell vl, vh; + qcells(v3, &vl, &vh); + CHECK(call4(w_qslash, al, ah, bl, bh) && n.ds.s == vl + && (V4_CELL_BITS == 64 || n.ds.t == vh), "Q./ v3 [%u]", i); + } + } + } + } + + /* Q.* and Q./ on edge values built from cells, so that they are the true + * extremes at either cell width: 0, ulp, -ulp, 0.5, 1.0, -1.0, 2.0, Q max, + * Q max - ulp, Q min, Q min + ulp, and the largest Q below 1.0 * 2^(N-16). */ + { + v4_ucell ce[13][2]; + unsigned k = 0, ne; + ce[k][0] = 0; ce[k][1] = 0; k++; + ce[k][0] = 1; ce[k][1] = 0; k++; + ce[k][0] = MAXU; ce[k][1] = MAXU; k++; + ce[k][0] = 0x8000u; ce[k][1] = 0; k++; + ce[k][0] = 0x10000u; ce[k][1] = 0; k++; + ce[k][0] = (v4_ucell)0 - 0x10000u; ce[k][1] = MAXU; k++; + ce[k][0] = 0x20000u; ce[k][1] = 0; k++; + ce[k][0] = MAXU; ce[k][1] = MAXU >> 1; k++; + ce[k][0] = MAXU - 1u; ce[k][1] = MAXU >> 1; k++; + ce[k][0] = 0; ce[k][1] = V4_MSB; k++; + ce[k][0] = 1; ce[k][1] = V4_MSB; k++; + ce[k][0] = 0; ce[k][1] = 1; k++; + ce[k][0] = MAXU; ce[k][1] = 0; k++; + ne = k; + for (unsigned i = 0; i < ne; i++) + for (unsigned j = 0; j < ne; j++) { + v4_ucell rl, rh; + int err; + qmul_ref(ce[i][0], ce[i][1], ce[j][0], ce[j][1], &rl, &rh); + CHECK(call4(w_qstar, (v4_cell)ce[i][0], (v4_cell)ce[i][1], + (v4_cell)ce[j][0], (v4_cell)ce[j][1]) + && left2((v4_cell)rl, (v4_cell)rh), "Q.* cell edge [%u,%u]", i, j); + qdiv_ref(ce[i][0], ce[i][1], ce[j][0], ce[j][1], &rl, &rh, &err); + v4_node_store(&n, NODE_ERROR, 0); + CHECK(call4(w_qslash, (v4_cell)ce[i][0], (v4_cell)ce[i][1], + (v4_cell)ce[j][0], (v4_cell)ce[j][1]) + && left2((v4_cell)rl, (v4_cell)rh) + && v4_node_load(&n, NODE_ERROR) == (err ? -1 : 0), + "Q./ cell edge [%u,%u]", i, j); + } + } + + /* Q./ at the overflow boundary: |a| * 2^16 against |b| * 2^(2N-1), for + * divisors around 2^16 and 2^17, every sign. */ + { + static const v4_ucell bv[] = { 0x10000u, 0x10001u, 0x18000u, 0x1FFFFu, 0x20000u, 0x20001u, 0xFFFFu }; + for (unsigned i = 0; i < sizeof bv / sizeof bv[0]; i++) + for (unsigned j = 0; j < 4; j++) + for (unsigned sg = 0; sg < 4; sg++) { + v4_ucell thr = bv[i] << (V4_CELL_BITS - 17), al, ah, bl = bv[i], bh = 0, rl, rh; + int err; + switch (j) { + case 0: al = 0; ah = thr; break; /* at the threshold */ + case 1: al = MAXU; ah = thr - 1u; break; /* just below */ + case 2: al = 1; ah = thr; break; /* just above */ + default: al = MAXU; ah = thr; break; + } + if (ah & V4_MSB) continue; /* |a| must be a Q value */ + if (sg & 1u) dneg(al, ah, &al, &ah); + if (sg & 2u) dneg(bl, bh, &bl, &bh); + qdiv_ref(al, ah, bl, bh, &rl, &rh, &err); + CHECK(call4(w_qslash, (v4_cell)al, (v4_cell)ah, (v4_cell)bl, (v4_cell)bh) + && left2((v4_cell)rl, (v4_cell)rh), "Q./ boundary [%u,%u,%u]", i, j, sg); + } + } + /* Stack headroom of the two longest definitions. */ { static const v4_cell umstar_args[][4] = { @@ -1436,6 +1894,13 @@ int main(void) }; headroom("Q.*", w_qstar, 4, qstar_args, 5, 2, &dh, &rh); CHECK(dh >= 0 && rh >= 0, "Q.* runs at all"); + static const v4_cell qdiv_args[][4] = { + { 0, 1, 0, 1 }, { 0, 3, 0, 1 }, { 0, -1, 0, 1 }, { 5, 7, 9, 11 }, + { 0, 1, 0, 0 }, { 0, 0x7FFF, 1, 0 }, { -1, 0x7FFF, 0, -3 } + }; + headroom("(UQ/)", w_uqdiv, 4, qdiv_args, 2, 2, &dh, &rh); + headroom("Q./", w_qslash, 4, qdiv_args, 7, 2, &dh, &rh); + CHECK(dh >= 2 && rh >= 2, "Q./ leaves room"); headroom("SM/REM", w_smrem, 3, smrem_args, 5, 2, &dh, &rh); CHECK(rh >= 1, "SM/REM leaves room for /MOD's return address"); headroom("/MOD", w_slashmod, 2, slashmod_args, 4, 2, &dh, &rh); -- 2.54.0 From 29cf2688d21978c494709c96f239ba45571d129c Mon Sep 17 00:00:00 2001 From: rajames Date: Sat, 3 Oct 2026 00:26:36 -0400 Subject: [PATCH 020/135] feat(v4.0.0): Q.EXP bit for bit with v3; lighter D2*C and (UQ/) Q.EXP is v3's q48_exp_approx: the Taylor series to 10 terms on |q|, stopping below 50 ulp, 1.0 Q./ e^|q| for q < 0, e^0 = 1.0, and for |q| >= 16.0 either 0 or Q max (v3 returned all ones, which is -ulp read signed under D-8). x, term, sum, sign and term index live in a new 8-cell variable (QE). Checked bit for bit against v3's q48_exp_approx (ported into the test) on 23 edge values and 3000 pseudo-random q in (-16.0, 16.0), at both cell widths, optimised and ASan+UBSan; dropping a term, moving the 50-ulp stop or skipping the reciprocal all fail. Q.EXP calls Q./, which calls (UQ/), which calls D2*C, and at first it left its caller no return entries. Lightened along the chain: - D2*C takes cin in A and builds 2hi+m with `over + +`: no ROT, no SWAP. - (UQ/) parks the quotient bit instead of using ROT, stores q without SWAP, and does its full trial subtraction (with borrow) in line instead of calling DNEGATE D+. - Q.EXP keeps its term index in (QE) instead of a FOR count. Headroom (data under args / return): (UQ/) 4/3 -> 4/4, Q./ 3/2 -> 3/3, Q.EXP 3/2. Co-Authored-By: Claude Opus 5.5 --- docs/v4.0.0/DECOMPOSITION.md | 14 ++- v4/tests/test_foundation.c | 231 +++++++++++++++++++++++++++++++---- 2 files changed, 214 insertions(+), 31 deletions(-) diff --git a/docs/v4.0.0/DECOMPOSITION.md b/docs/v4.0.0/DECOMPOSITION.md index a858a7a5..74df7f25 100644 --- a/docs/v4.0.0/DECOMPOSITION.md +++ b/docs/v4.0.0/DECOMPOSITION.md @@ -147,8 +147,8 @@ IF body1 ELSE body2 THEN → if L1 drop body1 jump L2 times, as on the F18. `FOR ... UNEXT` is the same but the body must fit in one instruction word. **Register conventions.** `A` and `B` are caller-saved. A word that uses them says so. Words in this -document that clobber `A`: `@ ! +! -! 2@ 2! C@ C! UM* * UM/MOD Q.FROM-INT Q.TO-INT Q.* Q./ SEND RECV`. Words that clobber `B`: -`Q./ SEND RECV`. +document that clobber `A`: `@ ! +! -! 2@ 2! C@ C! UM* * UM/MOD Q.FROM-INT Q.TO-INT Q.* Q./ Q.EXP SEND RECV`. Words that clobber `B`: +`Q./ Q.EXP SEND RECV`. **Return-stack words** (`>R R> R@ 2>R 2R> 2R@ I J UNLOOP` and the loop runtimes) are always IN. @@ -658,12 +658,14 @@ word. Per D-10 it occupies two cells on a 64-bit node too. Per D-8, v4 Q values | --- | --- | --- | | `Q.+` `Q.-` | CAP | `D+`, `D-` — executed on the golden model (2026-10-02) against v3's `q48_add`/`q48_sub` (`uint64_t` wrapping): bit-for-bit at 32-bit cells; at 64-bit cells the low cell is v3's, per D-10. | | `Q.*` | CAP | `SWAP push over over UM* drop push push over pop -if L1 SWAP jump L2 L1: SWAP drop 0 L2: pop SWAP - push push over pop UM* pop + ROT pop dup push over -if L3 drop dup jump L4 L3: drop 0 L4: push UM* pop - D+ ROT pop UM* SWAP push 0 D+ pop push over pop SWAP Q.TO-INT push Q.TO-INT pop SWAP` (`SWAP` and `ROT` in line) — `floor(a*b / 2^16)`, signed (D-8), cut to two cells. Cells 0–2 of the product come from the unsigned cell products `a1*b1` (low cell), `a0*b1`, `a1*b0`, `a0*b0`, in that order, each input dropped after its last use and `b0` waiting on the return stack. Reading `a1` and `b1` as signed takes `(b1<0 ? a0 : 0)` and `(a1<0 ? b0 : 0)` off cell 2; each is folded in as soon as its operands are adjacent. The result is cells 0–2 shifted right 16 with `Q.TO-INT` twice. Executed on the golden model (2026-10-02) against an independent limb-by-limb reference, and against v3's `q48_mul` for non-negative operands. Leaves its caller 3 data cells under its arguments and 3 return entries. Clobbers `A`. | -| `Q./` | CAP | `over over OR if ZERO drop push over pop SWAP over xor (Q/) 4 + b! !b -if L1 DNEGATE L1: push push -if L2 DNEGATE L2: pop pop dup if CHK drop jump DIV CHK: drop over -131072 and if CHK2 drop jump DIV CHK2: drop push push dup pop dup push N-18 FOR 2* UNEXT over over xor -if SAME drop drop -if NOOV jump OV SAME: drop push inv pop + inv -if OV NOOV: drop pop pop jump DIV OV: drop drop drop pop pop drop drop (Q/) 4 + b! @b -if OVP drop 0 MSB ; OVP: drop -1 MAXHI ; DIV: (UQ/) (Q/) 4 + b! @b -if L3 drop DNEGATE ; L3: drop ; ZERO: drop drop drop NODE-ERROR b! -1 !b over over OR if Z0 drop -if ZP drop drop 0 MSB ; ZP: drop drop -1 MAXHI ; Z0: drop ;` — D-11: `a * 2^16 / b`, rounded toward zero; saturated to Q max / Q min on overflow; on division by zero, Q max / Q min by the dividend's sign (0 for `0 / 0`) and `NODE-ERROR` set. The sign of the result waits in `(Q/)`. Overflow needs no division: the quotient reaches `2^(2N-1)` exactly when `|a| * 2^16 >= |b| * 2^(2N-1)`, possible only for `|b| < 2^17`, where it is `a1 >= b0 << (N-17)` unsigned. `MSB` and `MAXHI` are the high cells of Q min and Q max. Executed on the golden model (2026-10-02) against an independent limb-by-limb reference (including `NODE-ERROR`), on width-native edge values, and against v3's `q48_div` for non-negative `a < 2^48`. Leaves its caller 3 data cells under its arguments and 2 return entries. Clobbers `A` and `B`. | -| `(UQ/)` | CAP | Internal to `Q./`: unsigned `floor(a * 2^16 / b)` for `b != 0` and no overflow. Restoring division, `2N+16` steps, on one shifting register — quotient (starting as `a`) above remainder — with the quotient and divisor in `(Q/)` so the stacks carry only the remainder, the quotient bit and the loop count. Each step's quotient bit enters at the next step's shift; with no overflow the bits leaving the quotient in the last 16 steps are zeros. Trial subtraction by in-line sign tests (`x - y` with `y` on top is `push inv pop + inv`). Executed on the golden model (2026-10-02). Clobbers `A` and `B`. | -| `D2*C` | CAP | `( lo hi cin -- lo' hi' cout )`: the double shifted left one bit, `cin` entering at the bottom and `cout` the bit leaving the top (both 0 or 1). `ROT dup -if L1 drop 1 jump L2 L1: drop 0 L2: push 2* + SWAP dup -if L3 drop 1 jump L4 L3: drop 0 L4: push 2* pop pop ROT + SWAP`, `ROT` and `SWAP` in line. Executed on the golden model (2026-10-02). | +| `Q./` | CAP | `over over OR if ZERO drop push over pop SWAP over xor (Q/) 4 + b! !b -if L1 DNEGATE L1: push push -if L2 DNEGATE L2: pop pop dup if CHK drop jump DIV CHK: drop over -131072 and if CHK2 drop jump DIV CHK2: drop push push dup pop dup push N-18 FOR 2* UNEXT over over xor -if SAME drop drop -if NOOV jump OV SAME: drop push inv pop + inv -if OV NOOV: drop pop pop jump DIV OV: drop drop drop pop pop drop drop (Q/) 4 + b! @b -if OVP drop 0 MSB ; OVP: drop -1 MAXHI ; DIV: (UQ/) (Q/) 4 + b! @b -if L3 drop DNEGATE ; L3: drop ; ZERO: drop drop drop NODE-ERROR b! -1 !b over over OR if Z0 drop -if ZP drop drop 0 MSB ; ZP: drop drop -1 MAXHI ; Z0: drop ;` — D-11: `a * 2^16 / b`, rounded toward zero; saturated to Q max / Q min on overflow; on division by zero, Q max / Q min by the dividend's sign (0 for `0 / 0`) and `NODE-ERROR` set. The sign of the result waits in `(Q/)`. Overflow needs no division: the quotient reaches `2^(2N-1)` exactly when `|a| * 2^16 >= |b| * 2^(2N-1)`, possible only for `|b| < 2^17`, where it is `a1 >= b0 << (N-17)` unsigned. `MSB` and `MAXHI` are the high cells of Q min and Q max. Executed on the golden model (2026-10-02) against an independent limb-by-limb reference (including `NODE-ERROR`), on width-native edge values, and against v3's `q48_div` for non-negative `a < 2^48`. Leaves its caller 3 data cells under its arguments and 3 return entries. Clobbers `A` and `B`. | +| `(UQ/)` | CAP | Internal to `Q./`: unsigned `floor(a * 2^16 / b)` for `b != 0` and no overflow. Restoring division, `2N+16` steps, on one shifting register — quotient (starting as `a`) above remainder — with the quotient and divisor in `(Q/)` so the stacks carry only the remainder, the quotient bit and the loop count. Each step's quotient bit enters at the next step's shift; with no overflow the bits leaving the quotient in the last 16 steps are zeros. Trial subtraction by in-line sign tests (`x - y` with `y` on top is `push inv pop + inv`), including the full double subtraction with its borrow, so the loop calls nothing but `D2*C`. Executed on the golden model (2026-10-02). Clobbers `A` and `B`. | +| `D2*C` | CAP | `( lo hi cin -- lo' hi' cout )`: the double shifted left one bit, `cin` entering at the bottom and `cout` the bit leaving the top (both 0 or 1). `a! dup -if L1 drop 1 jump L2 L1: drop 0 L2: push over -if L3 drop 1 jump L4 L3: drop 0 L4: over + + push 2* a + pop pop` — `cin` waits in `A`, and `2hi + m` is `over + +`, so it needs one return entry. Executed on the golden model (2026-10-02). Clobbers `A`. | | `(Q/)` | CAP | Variable, 5 cells: `Q./`'s quotient register, divisor and result sign. Like `BASE` and the hold buffer, it lives in node memory. | | `Q.ABS` `Q.NEG` | CAP | `DABS`, `DNEGATE` — executed on the golden model (2026-10-02) against v3's `q48_abs` and `0 - q`: bit-for-bit at 32-bit cells, including v3's wrap of Q min to itself; at 64-bit cells the low cell is v3's and the high cell is the true sign, per D-10. | -| `Q.LOG` `Q.EXP` `Q.SQRT` `Q.SIN` `Q.COS` | CAP | Algorithms ported from `q48_words.c`; the hosted C versions are the golden model. | +| `Q.LOG` `Q.SQRT` `Q.SIN` `Q.COS` | CAP | Algorithms ported from `q48_words.c`; the hosted C versions are the golden model. | +| `Q.EXP` | CAP | v3's `q48_exp_approx`: `1 + x + x^2/2! + …` to 10 terms on `x = |q|`, stopping once a term is below 50 ulp; `1.0 Q./ e^|q|` for `q < 0`; `e^0 = 1.0`; `|q| >= 16.0` gives 0 (`q < 0`) or **Q max** (v3 returned all ones, which reads as −ulp under D-8). `x`, the term, the sum, the sign and the term index live in the variable `(QE)`, so only `Q.*` and `Q./` arguments sit on the stacks. Executed on the golden model (2026-10-02): bit for bit v3's result for `|q| < 16.0` (at 64-bit cells as the same value, high cell 0). Leaves its caller 3 data cells under its argument and 2 return entries. Clobbers `A` and `B`. | +| `(QE)` | CAP | Variable, 8 cells: `Q.EXP`'s `x`, term, sum, sign and term index. | | `Q.FROM-INT` | CAP | `push 0 a! 0 pop 15 FOR +* UNEXT push drop a pop` — `n * 2^16` as a signed double. `+*` with `S = 0` never adds, so each step is an exact arithmetic right shift of `T:A`; starting from `T:A = n:0` (that is, `n * 2^N`) and shifting `N-16` bits leaves `n * 2^16`. The count is `N-17`: 15 at 32-bit cells, 47 at 64. Negative values are no longer clamped to 0. Executed on the golden model (2026-10-02): matches v3's `q48_from_u64` for `n >= 0` (at 64-bit cells in the low cell, where v3 wraps for `n >= 2^47`, per D-10). Clobbers `A`. | | `Q.TO-INT` | CAP | `push a! 0 pop 15 FOR +* UNEXT drop drop a` — the same `+*` shift, 16 bits at every cell width, leaving the low cell in `A`. Rounds toward minus infinity, as v3's arithmetic shift does (−1.5 gives −2). Executed on the golden model (2026-10-02): v3's `q48_to_u64` exactly at 64-bit cells, its low cell at 32. Clobbers `A`. | | `Q.1` `Q.0` `Q.SCALE` | IN | Double-cell constants. | diff --git a/v4/tests/test_foundation.c b/v4/tests/test_foundation.c index 5d9f94bb..3d229643 100644 --- a/v4/tests/test_foundation.c +++ b/v4/tests/test_foundation.c @@ -26,7 +26,8 @@ * reference, signed, and against v3's q48_mul for non-negative operands. * Q./ (D-11) and its core (UQ/) are checked against an independent * limb-by-limb long division, including NODE-ERROR, on width-native edge - * values, and against v3's q48_div where v4 keeps v3's meaning. Every word is + * values, and against v3's q48_div where v4 keeps v3's meaning. + * Q.EXP is checked bit for bit against v3's q48_exp_approx for |q| < 16.0. Every word is * also probed for how much of the 10- and 9-deep circular stacks (D-2) it * leaves to its caller. * @@ -49,6 +50,8 @@ static int failures = 0, checks = 0; #define NODE_ERROR ((v4_cell)(V4_NODE_WORDS - 2u)) /* (Q/), Q./'s 5-cell scratch variable: q0 q1 b0 b1 sign. */ #define QS ((v4_cell)(V4_NODE_WORDS - 8u)) +/* (QE), Q.EXP's 8-cell variable: x, term, sum (two cells each), sign, n. */ +#define QE ((v4_cell)(V4_NODE_WORDS - 16u)) #define MAXU ((v4_ucell)~(v4_ucell)0) #define FLAG(c) ((c) ? V4_ALL_ONES : (v4_cell)0) @@ -62,7 +65,7 @@ static v4_cell w_nip, w_swap, w_or, w_negate, w_rot, w_zless, w_zequal, w_ugreater, w_abs, w_s2d, w_dplus, w_dnegate, w_dabs, w_smrem, w_slashmod, w_mplus, w_dminus, w_d0equal, w_dequal, w_qfromint, w_qtoint, w_less, w_equal, w_dless, w_2swap, w_2over, - w_dmax, w_dmin, w_qgt_doc, w_qgt, w_dltkeep, w_qstar, w_d2starc, w_uqdiv, w_qslash; + w_dmax, w_dmin, w_qgt_doc, w_qgt, w_dltkeep, w_qstar, w_d2starc, w_uqdiv, w_qslash, w_qexp; #define O(name) v4_asm_op(&as, V4_OP_##name) #define LIT(v) v4_asm_lit(&as, (v4_cell)(v)) @@ -605,37 +608,34 @@ static void build(void) /* : D2*C ( lo hi cin -- lo' hi' cout ) 5.26, for Q./ * The double shifted left one bit, cin (0 or 1) entering at the bottom, - * cout (0 or 1) the bit that left the top. - * ROT dup -if L1 drop 1 jump L2 L1: drop 0 L2: push hi cin lo R: m - * 2* + SWAP lo' hi - * dup -if L3 drop 1 jump L4 L3: drop 0 L4: push R: m cout - * 2* pop pop ROT + SWAP ; lo' hi' cout - * ROT and SWAP in line. */ -#define SWAP_INLINE() do { O(OVER); O(PUSH); O(PUSH); O(DROP); O(RPOP); O(RPOP); } while (0) -#define ROT_INLINE() do { O(PUSH); SWAP_INLINE(); O(RPOP); SWAP_INLINE(); } while (0) + * cout (0 or 1) the bit that left the top. cin waits in A. + * a! dup -if L1 drop 1 jump L2 L1: drop 0 L2: push lo hi R: cout + * over -if L3 drop 1 jump L4 L3: drop 0 L4: lo hi m m: lo's top bit + * over + + lo 2hi+m + * push 2* a + pop pop ; lo' hi' cout + * Clobbers A. */ { v4_asm_ref l1, l2, l3, l4; w_d2starc = v4_asm_label(&as); - ROT_INLINE(); O(DUP); + O(BANG_A); O(DUP); l1 = v4_asm_branch_fwd(&as, V4_OP_MINUS_IF); O(DROP); LIT(1); l2 = v4_asm_branch_fwd(&as, V4_OP_JUMP); v4_asm_resolve(&as, l1, v4_asm_label(&as)); O(DROP); LIT(0); v4_asm_resolve(&as, l2, v4_asm_label(&as)); - O(PUSH); O(TWO_STAR); O(ADD); SWAP_INLINE(); - O(DUP); + O(PUSH); O(OVER); l3 = v4_asm_branch_fwd(&as, V4_OP_MINUS_IF); O(DROP); LIT(1); l4 = v4_asm_branch_fwd(&as, V4_OP_JUMP); v4_asm_resolve(&as, l3, v4_asm_label(&as)); O(DROP); LIT(0); v4_asm_resolve(&as, l4, v4_asm_label(&as)); - O(PUSH); O(TWO_STAR); O(RPOP); O(RPOP); ROT_INLINE(); O(ADD); SWAP_INLINE(); + O(OVER); O(ADD); O(ADD); + O(PUSH); O(TWO_STAR); O(PUSH_A); O(ADD); O(RPOP); O(RPOP); O(SEMI); } -#undef ROT_INLINE -#undef SWAP_INLINE + /* : (UQ/) ( a0 a1 b0 b1 -- q0 q1 ) 5.26, core of Q./ * Unsigned floor(a * 2^16 / b), for b != 0 and a quotient below @@ -648,8 +648,8 @@ static void build(void) * stacks hold only r, the quotient bit and the loop count. * QS 2 + a! SWAP !+ ! QS a! SWAP !+ ! 0 0 0 r0 r1 qb * 2N+15 FOR - * QS a! @+ @ ROT D2*C r0 r1 q0 q1 c - * push SWAP QS a! !+ ! pop D2*C r0 r1 t + * push QS a! @+ @ pop D2*C r0 r1 q0 q1 c + * push QS 1 + a! ! QS a! ! pop D2*C r0 r1 t * if CMP drop jump TAKE * CMP: drop QS 3 + b! @b r0 r1 b1 * over over xor if EQH -if SAMEH @@ -663,11 +663,15 @@ static void build(void) * -if T4 drop jump NOTAKEL T4: drop jump TAKEL * TAKEL: drop QS 2 + b! @b push inv pop + inv 0 1 jump END * NOTAKEL: 0 jump END - * TAKE: QS 2 + a! @+ @ DNEGATE D+ 1 jump END + * TAKE: push QS 2 + b! @b over over push inv pop + inv push r0 b0 R: r1 d0 + * over over xor -if SB drop NIP -if NB drop 1 jump BD NB: drop 0 jump BD + * SB: drop push inv pop + inv -if NB2 drop 1 jump BD NB2: drop 0 + * BD: pop pop QS 3 + b! @b push inv pop + inv borrow d0 r1-b1 + * push SWAP pop SWAP - 1 jump END d0 r1-b1-borrow 1 * NOTAKE: 0 * END: * NEXT - * QS a! @+ @ ROT D2*C drop push push drop drop pop pop ; + * push QS a! @+ @ pop D2*C drop push push drop drop pop pop ; * x - y with y on top is push inv pop + inv. SWAP, ROT in line. * Clobbers A and B. */ #define SWAP_INLINE() do { O(OVER); O(PUSH); O(PUSH); O(DROP); O(RPOP); O(RPOP); } while (0) @@ -687,8 +691,8 @@ static void build(void) LIT(0); LIT(0); LIT(0); LIT(2 * V4_CELL_BITS + 15); O(PUSH); loop = v4_asm_label(&as); - LIT(QS); O(BANG_A); O(FETCH_INC); O(FETCH_A); ROT_INLINE(); CALL(w_d2starc); - O(PUSH); SWAP_INLINE(); LIT(QS); O(BANG_A); O(STORE_INC); O(STORE_A); O(RPOP); + O(PUSH); LIT(QS); O(BANG_A); O(FETCH_INC); O(FETCH_A); O(RPOP); CALL(w_d2starc); + O(PUSH); LIT(QS + 1); O(BANG_A); O(STORE_A); LIT(QS); O(BANG_A); O(STORE_A); O(RPOP); CALL(w_d2starc); cmp = FWD(IF); O(DROP); j_take[nt++] = FWD(JUMP); @@ -719,13 +723,28 @@ static void build(void) l_notakel = v4_asm_label(&as); /* NOTAKEL */ LIT(0); j_end[ne++] = FWD(JUMP); l_take = v4_asm_label(&as); /* TAKE */ - LIT(QS + 2); O(BANG_A); O(FETCH_INC); O(FETCH_A); - CALL(w_dnegate); CALL(w_dplus); LIT(1); j_end[ne++] = FWD(JUMP); + { + v4_asm_ref sb, nb, bd, nb2, bd2; + O(PUSH); LIT(QS + 2); O(BANG_B); O(FETCH_B); + O(OVER); O(OVER); SUB_INLINE(); O(PUSH); + O(OVER); O(OVER); O(XOR); sb = FWD(MINUS_IF); + O(DROP); O(PUSH); O(DROP); O(RPOP); nb = FWD(MINUS_IF); + O(DROP); LIT(1); bd = FWD(JUMP); + HERE_(nb); O(DROP); LIT(0); bd2 = FWD(JUMP); + HERE_(sb); + O(DROP); SUB_INLINE(); nb2 = FWD(MINUS_IF); + O(DROP); LIT(1); j_end[ne] = FWD(JUMP); + HERE_(nb2); O(DROP); LIT(0); + HERE_(bd); HERE_(bd2); v4_asm_resolve(&as, j_end[ne], v4_asm_label(&as)); + O(RPOP); O(RPOP); LIT(QS + 3); O(BANG_B); O(FETCH_B); SUB_INLINE(); + O(PUSH); SWAP_INLINE(); O(RPOP); SWAP_INLINE(); CALL(w_minus); + LIT(1); j_end[ne++] = FWD(JUMP); + } l_notake = v4_asm_label(&as); /* NOTAKE */ LIT(0); l_end = v4_asm_label(&as); /* END */ v4_asm_branch(&as, V4_OP_NEXT, loop); - LIT(QS); O(BANG_A); O(FETCH_INC); O(FETCH_A); ROT_INLINE(); CALL(w_d2starc); O(DROP); + O(PUSH); LIT(QS); O(BANG_A); O(FETCH_INC); O(FETCH_A); O(RPOP); CALL(w_d2starc); O(DROP); O(PUSH); O(PUSH); O(DROP); O(DROP); O(RPOP); O(RPOP); O(SEMI); for (k = 0; k < nt; k++) v4_asm_resolve(&as, j_take[k], l_take); @@ -822,6 +841,101 @@ static void build(void) #undef SUB_INLINE #undef SWAP_INLINE + /* : Q.EXP ( q -- e ) 5.26, v3's q48_exp_approx + * e^q by the Taylor series 1 + x + x^2/2! + ... to 10 terms, stopping + * once a term is below 50 ulp, on x = |q|; for q < 0 the result is + * 1.0 Q./ e^|q|. e^0 = 1.0; |q| >= 16.0 gives 0 (q < 0) or Q max (v3 + * returned all ones, which is -ulp read signed, D-8). x, the term and + * the sum live in (QE), so only Q.* and Q./ arguments sit on the stack. + * over over OR if ONE drop + * dup QE 6 + b! !b -if L1 DNEGATE L1: x (QE)+6: sign + * over over -1048576 -1 D+ push drop pop -if BIG drop + * over over QE 2 + a! SWAP !+ ! over over QE a! SWAP !+ ! + * 65536 0 D+ QE 4 + a! SWAP !+ ! term = x, sum = 1 + x + * 2 QE 7 + b! !b (QE)+7: n + * LOOP: + * QE 2 + a! @+ @ QE a! @+ @ Q.* + * QE 7 + b! @b Q.FROM-INT Q./ term*x / n + * over over QE 2 + a! SWAP !+ ! + * QE 4 + a! @+ @ D+ QE 4 + a! SWAP !+ ! sum += term + * QE 2 + a! @+ @ if HI0 drop drop jump CONT + * HI0: drop -if SM drop jump CONT + * SM: -50 + -if CONT1 drop jump DONE term < 50: stop + * CONT1: drop + * CONT: QE 7 + b! @b 1 + dup !b -11 + -if DONE1 drop jump LOOP + * DONE1: drop after n = 10 + * DONE: QE 4 + a! @+ @ QE 6 + b! @b -if POS drop 65536 0 2SWAP Q./ ; + * POS: drop ; + * BIG: drop drop drop QE 6 + b! @b -if BIGP drop 0 0 ; BIGP: drop -1 MAXHI ; + * ONE: drop drop drop 65536 0 ; + * Clobbers A and B. */ +#define FWD(op) v4_asm_branch_fwd(&as, V4_OP_##op) +#define HERE_(r) v4_asm_resolve(&as, (r), v4_asm_label(&as)) +#define STORE2(addr) do { LIT(addr); O(BANG_A); O(OVER); O(PUSH); O(PUSH); O(DROP); O(RPOP); O(RPOP); \ + O(STORE_INC); O(STORE_A); } while (0) +#define FETCH2(addr) do { LIT(addr); O(BANG_A); O(FETCH_INC); O(FETCH_A); } while (0) + { + v4_asm_ref one, l1, big, hi0, sm, cont1, j_cont1, j_cont2, j_done, pos, bigp; + v4_cell loop, l_cont, l_done; + + w_qexp = v4_asm_label(&as); + O(OVER); O(OVER); CALL(w_or); one = FWD(IF); + O(DROP); + O(DUP); LIT(QE + 6); O(BANG_B); O(STORE_B); + l1 = FWD(MINUS_IF); CALL(w_dnegate); HERE_(l1); + O(OVER); O(OVER); LIT(-1048576); LIT(-1); CALL(w_dplus); + O(PUSH); O(DROP); O(RPOP); + big = FWD(MINUS_IF); + O(DROP); + O(OVER); O(OVER); STORE2(QE + 2); + O(OVER); O(OVER); STORE2(QE); + LIT(65536); LIT(0); CALL(w_dplus); STORE2(QE + 4); + LIT(2); LIT(QE + 7); O(BANG_B); O(STORE_B); + loop = v4_asm_label(&as); + FETCH2(QE + 2); FETCH2(QE); CALL(w_qstar); + LIT(QE + 7); O(BANG_B); O(FETCH_B); CALL(w_qfromint); CALL(w_qslash); + O(OVER); O(OVER); STORE2(QE + 2); + FETCH2(QE + 4); CALL(w_dplus); STORE2(QE + 4); + FETCH2(QE + 2); hi0 = FWD(IF); + O(DROP); O(DROP); j_cont1 = FWD(JUMP); + HERE_(hi0); + O(DROP); sm = FWD(MINUS_IF); + O(DROP); j_cont2 = FWD(JUMP); + HERE_(sm); + LIT(-50); O(ADD); cont1 = FWD(MINUS_IF); + O(DROP); j_done = FWD(JUMP); + HERE_(cont1); + O(DROP); + l_cont = v4_asm_label(&as); + LIT(QE + 7); O(BANG_B); O(FETCH_B); LIT(1); O(ADD); O(DUP); O(STORE_B); + LIT(-11); O(ADD); + { + v4_asm_ref fin = FWD(MINUS_IF); + O(DROP); v4_asm_branch(&as, V4_OP_JUMP, loop); + HERE_(fin); O(DROP); + } + l_done = v4_asm_label(&as); + FETCH2(QE + 4); LIT(QE + 6); O(BANG_B); O(FETCH_B); + pos = FWD(MINUS_IF); + O(DROP); LIT(65536); LIT(0); CALL(w_2swap); CALL(w_qslash); O(SEMI); + HERE_(pos); O(DROP); O(SEMI); + HERE_(big); + O(DROP); O(DROP); O(DROP); LIT(QE + 6); O(BANG_B); O(FETCH_B); + bigp = FWD(MINUS_IF); + O(DROP); LIT(0); LIT(0); O(SEMI); + HERE_(bigp); O(DROP); LIT(-1); LIT((v4_cell)(MAXU >> 1)); O(SEMI); + HERE_(one); + O(DROP); O(DROP); O(DROP); LIT(65536); LIT(0); O(SEMI); + + v4_asm_resolve(&as, j_cont1, l_cont); + v4_asm_resolve(&as, j_cont2, l_cont); + v4_asm_resolve(&as, j_done, l_done); + } +#undef FETCH2 +#undef STORE2 +#undef HERE_ +#undef FWD + CHECK(v4_asm_ok(&as), "foundation words assemble"); } @@ -1172,6 +1286,40 @@ static void qdiv_ref(v4_ucell al, v4_ucell ah, v4_ucell bl, v4_ucell bh, if (neg) dneg(*rl, *rh, rl, rh); } +/* v3's q48_div and q48_exp_approx (v3/src/word_source/q48_16_words.c), + * verbatim but for the names, as the parity reference for Q.EXP. They use + * v3_q48_mul above, which is v3's __int128 result. */ +static uint64_t v3_q48_div(uint64_t a, uint64_t b) +{ + if (b == 0) return 0; + if (a > 0x0000FFFFFFFFFFFFULL) return 0xFFFFFFFFFFFFFFFFULL; + return (a << 16) / b; +} +static uint64_t v3_q48_exp(uint64_t q) +{ + int64_t q_signed; + int is_negative, nn; + uint64_t x, result, term; + + if (q == 0) return 65536; + q_signed = (int64_t)q; + if (q_signed >= 1048576) return 0xFFFFFFFFFFFFFFFFULL; + if (q_signed <= -1048576) return 0; + is_negative = (q_signed < 0); + x = is_negative ? (uint64_t)(-q_signed) : q; + result = 65536; + term = x; + result = result + term; + for (nn = 2; nn <= 10; nn++) { + term = v3_q48_mul(term, x); + term = v3_q48_div(term, (uint64_t)nn << 16); + result = result + term; + if (term < 50) break; + } + if (is_negative) result = v3_q48_div(65536, result); + return result; +} + /* Stack headroom. Run `word` with `dfill` marked cells under the canary and * `rfill` marked cells under its return address, and report whether the * results, the canary and every marked cell come back intact. The F18 stacks @@ -1800,6 +1948,33 @@ int main(void) } } + /* Q.EXP against v3's q48_exp_approx for |q| < 16.0 (bit for bit at + * 32-bit cells; the same value, high cell 0, at 64), and the limits. */ + { + static const int64_t qx[] = { + 0, 1, -1, 0x8000, -0x8000, 0x10000, -0x10000, 0x18000, 0x20000, -0x20000, + 0x2B7E1, 0x50000, -0x50000, 0xA0000, -0xA0000, 0xFFFFF, -0xFFFFF, + 0x100000, -0x100000, 0x100001, -0x100001, 0x7FFFFFFF, -0x7FFFFFFF + }; + uint64_t x = 0x9FB21C651E98DF25u; + for (unsigned i = 0; i < sizeof qx / sizeof qx[0] + 3000u; i++) { + int64_t q; + uint64_t uq; + v4_cell ql, qh, el, eh; + if (i < sizeof qx / sizeof qx[0]) q = qx[i]; + else { + x ^= x << 13; x ^= x >> 7; x ^= x << 17; + q = (int64_t)(x % 0x200000u) - 0x100000; /* (-16.0, 16.0) */ + } + uq = (uint64_t)q; + qcells(uq, &ql, &qh); + if (q >= 0x100000) { el = V4_ALL_ONES; eh = (v4_cell)(MAXU >> 1); } + else if (q <= -0x100000) { el = 0; eh = 0; } + else qcells(v3_q48_exp(uq), &el, &eh); + CHECK(call(w_qexp, 2, ql, qh, 0) && left2(el, eh), "Q.EXP [%u] q=%lld", i, (long long)q); + } + } + /* Q./ at the overflow boundary: |a| * 2^16 against |b| * 2^(2N-1), for * divisors around 2^16 and 2^17, every sign. */ { @@ -1901,6 +2076,12 @@ int main(void) headroom("(UQ/)", w_uqdiv, 4, qdiv_args, 2, 2, &dh, &rh); headroom("Q./", w_qslash, 4, qdiv_args, 7, 2, &dh, &rh); CHECK(dh >= 2 && rh >= 2, "Q./ leaves room"); + static const v4_cell qexp_args[][4] = { + { 0, 0, 0, 0 }, { 0x10000, 0, 0, 0 }, { -0x10000, -1, 0, 0 }, + { 0x50000, 0, 0, 0 }, { 0x200000, 0, 0, 0 }, { -0x200000, -1, 0, 0 } + }; + headroom("Q.EXP", w_qexp, 2, qexp_args, 6, 2, &dh, &rh); + CHECK(dh >= 2 && rh >= 2, "Q.EXP leaves room"); headroom("SM/REM", w_smrem, 3, smrem_args, 5, 2, &dh, &rh); CHECK(rh >= 1, "SM/REM leaves room for /MOD's return address"); headroom("/MOD", w_slashmod, 2, slashmod_args, 4, 2, &dh, &rh); -- 2.54.0 From a2d21d5cdaa3a15fd2264108837a866a04616c9e Mon Sep 17 00:00:00 2001 From: rajames Date: Sat, 3 Oct 2026 09:07:30 -0400 Subject: [PATCH 021/135] feat(v4.0.0): Q.SQRT bit for bit with v3; D-12 domain errors D-12 (ruled 2026-10-02): Q.SQRT of a negative value and Q.LOG of zero or a negative value return 0 and set NODE-ERROR, as Q./ does on division by zero. Q.SQRT is v3's q48_sqrt_approx: Newton from x0 = q/2 + 0.25, up to 8 rounds of x' = (x + q/x) / 2, returning x once |x' - x| < 10 ulp; sqrt(0) = 0 and sqrt(1.0) = 1.0. q, x and the rounds left live in a 5-cell variable (QR). Checked bit for bit against v3's q48_sqrt_approx (ported into the test) on 19 edge values and 3000 pseudo-random q below 2^48, at both cell widths, optimised and ASan+UBSan. Above 2^48 v3's q48_div saturates and v4 divides correctly, so there is no parity there. Bug found and fixed on the way: the "< 10 ulp" test subtracted 10 from the step's low cell as a signed number, so at 32-bit cells a step of 2^31 or more read as small and the iteration stopped early. It now tests the low cell's top bit first, as Q.EXP does. The first test run missed it because `make build/32-test_foundation.c` rebuilds nothing (the Makefile's rules use absolute paths); the mutation runs, compiled from source, exposed it. Only `make test` is used from here. Headroom (data under arg / return): Q.SQRT 3/2. Co-Authored-By: Claude Opus 5.5 --- docs/v4.0.0/DECOMPOSITION.md | 11 ++- v4/tests/test_foundation.c | 140 ++++++++++++++++++++++++++++++++++- 2 files changed, 145 insertions(+), 6 deletions(-) diff --git a/docs/v4.0.0/DECOMPOSITION.md b/docs/v4.0.0/DECOMPOSITION.md index 74df7f25..2e81fb92 100644 --- a/docs/v4.0.0/DECOMPOSITION.md +++ b/docs/v4.0.0/DECOMPOSITION.md @@ -147,8 +147,8 @@ IF body1 ELSE body2 THEN → if L1 drop body1 jump L2 times, as on the F18. `FOR ... UNEXT` is the same but the body must fit in one instruction word. **Register conventions.** `A` and `B` are caller-saved. A word that uses them says so. Words in this -document that clobber `A`: `@ ! +! -! 2@ 2! C@ C! UM* * UM/MOD Q.FROM-INT Q.TO-INT Q.* Q./ Q.EXP SEND RECV`. Words that clobber `B`: -`Q./ Q.EXP SEND RECV`. +document that clobber `A`: `@ ! +! -! 2@ 2! C@ C! UM* * UM/MOD Q.FROM-INT Q.TO-INT Q.* Q./ Q.EXP Q.SQRT SEND RECV`. Words that clobber `B`: +`Q./ Q.EXP Q.SQRT SEND RECV`. **Return-stack words** (`>R R> R@ 2>R 2R> 2R@ I J UNLOOP` and the loop runtimes) are always IN. @@ -173,6 +173,7 @@ definition below depends on one, it says so. | **D-9** | Instruction word width on a 64-bit-cell host (ruled 2026-10-02). | **32 bits at every cell width.** Six 5-bit slots plus 2 spare bits, as in §1.2. On a 64-bit host the instruction word is the low 32 bits of the cell and the high half is ignored, so compiled code is identical at both widths. Only data and `@p` literals are a full cell wide. | | **D-10** | Q48.16 width on a 64-bit-cell node (ruled 2026-10-02). | **Two cells at every cell width.** A Q value is a signed double on 32- and 64-bit nodes alike, so every Q word is the same double word at both widths. At 32-bit cells this is bit-for-bit v3's 64-bit Q. At 64-bit cells the low cell is v3's value, and where v3 wraps on Q48.16 overflow (a sum past Q max, `ABS` or `NEG` of Q min) the high cell carries the true result instead. | | **D-11** | `Q./` semantics: division by zero, rounding, overflow (ruled 2026-10-02). | **Saturate and flag; round toward zero; saturate on overflow.** The quotient of `a * 2^16 / b` is rounded toward zero, like `SM/REM`. When it does not fit a Q value it is clamped to Q max or Q min by its sign. Division by zero returns Q max or Q min by the sign of the dividend (`0 / 0` gives 0) and sets the node's `NODE-ERROR` register (§7), which `VM-ERROR?` reads. v3 returned 0 on division by zero and saturated whenever the dividend was 2^48 or more, even when the quotient would have fit. | +| **D-12** | Q approximations outside their domain (ruled 2026-10-02). | **Return 0 and set `NODE-ERROR`.** `Q.SQRT` of a negative value and `Q.LOG` of zero or a negative value return 0 and set `NODE-ERROR` (§7), as `Q./` does on division by zero (D-11). v3 returned 0 for `ln(0)` without a flag and read negative arguments as large unsigned values. | **Consequences of D-2 that every definition must respect.** The data stack holds 10 items and the return stack 9, and every `call`, `FOR`, `DO` loop frame and `push` uses return-stack slots. Nesting @@ -663,7 +664,9 @@ word. Per D-10 it occupies two cells on a 64-bit node too. Per D-8, v4 Q values | `D2*C` | CAP | `( lo hi cin -- lo' hi' cout )`: the double shifted left one bit, `cin` entering at the bottom and `cout` the bit leaving the top (both 0 or 1). `a! dup -if L1 drop 1 jump L2 L1: drop 0 L2: push over -if L3 drop 1 jump L4 L3: drop 0 L4: over + + push 2* a + pop pop` — `cin` waits in `A`, and `2hi + m` is `over + +`, so it needs one return entry. Executed on the golden model (2026-10-02). Clobbers `A`. | | `(Q/)` | CAP | Variable, 5 cells: `Q./`'s quotient register, divisor and result sign. Like `BASE` and the hold buffer, it lives in node memory. | | `Q.ABS` `Q.NEG` | CAP | `DABS`, `DNEGATE` — executed on the golden model (2026-10-02) against v3's `q48_abs` and `0 - q`: bit-for-bit at 32-bit cells, including v3's wrap of Q min to itself; at 64-bit cells the low cell is v3's and the high cell is the true sign, per D-10. | -| `Q.LOG` `Q.SQRT` `Q.SIN` `Q.COS` | CAP | Algorithms ported from `q48_words.c`; the hosted C versions are the golden model. | +| `Q.LOG` `Q.SIN` `Q.COS` | CAP | Algorithms ported from `q48_words.c`; the hosted C versions are the golden model. | +| `Q.SQRT` | CAP | v3's `q48_sqrt_approx`: Newton from `x0 = q/2 + 0.25`, up to 8 rounds of `x' = (x + q/x) / 2`, returning `x` as soon as `|x' - x| < 10` ulp; `sqrt(0) = 0`, `sqrt(1.0) = 1.0`. `q < 0` returns 0 and sets `NODE-ERROR` (D-12). `q`, `x` and the rounds left live in the variable `(QR)`. The halving is a logical double shift, `push a! 0 pop +* MAXHI and push drop a pop`. Executed on the golden model (2026-10-02): bit for bit v3's result for `0 <= q < 2^48`; above that v3's `q48_div` saturates and v4 divides correctly, so they part. Leaves its caller 3 data cells under its argument and 2 return entries. Clobbers `A` and `B`. | +| `(QR)` | CAP | Variable, 5 cells: `Q.SQRT`'s `q`, `x` and rounds left. | | `Q.EXP` | CAP | v3's `q48_exp_approx`: `1 + x + x^2/2! + …` to 10 terms on `x = |q|`, stopping once a term is below 50 ulp; `1.0 Q./ e^|q|` for `q < 0`; `e^0 = 1.0`; `|q| >= 16.0` gives 0 (`q < 0`) or **Q max** (v3 returned all ones, which reads as −ulp under D-8). `x`, the term, the sum, the sign and the term index live in the variable `(QE)`, so only `Q.*` and `Q./` arguments sit on the stacks. Executed on the golden model (2026-10-02): bit for bit v3's result for `|q| < 16.0` (at 64-bit cells as the same value, high cell 0). Leaves its caller 3 data cells under its argument and 2 return entries. Clobbers `A` and `B`. | | `(QE)` | CAP | Variable, 8 cells: `Q.EXP`'s `x`, term, sum, sign and term index. | | `Q.FROM-INT` | CAP | `push 0 a! 0 pop 15 FOR +* UNEXT push drop a pop` — `n * 2^16` as a signed double. `+*` with `S = 0` never adds, so each step is an exact arithmetic right shift of `T:A`; starting from `T:A = n:0` (that is, `n * 2^N`) and shifting `N-16` bits leaves `n * 2^16`. The count is `N-17`: 15 at 32-bit cells, 47 at 64. Negative values are no longer clamped to 0. Executed on the golden model (2026-10-02): matches v3's `q48_from_u64` for `n >= 0` (at 64-bit cells in the low cell, where v3 wraps for `n >= 2^47`, per D-10). Clobbers `A`. | @@ -771,4 +774,4 @@ Addresses are assigned in the node memory map (D-4). Names only here. | `GOV-*` | R/W | Governor parameters and Jacquard selector state (`L8-*`, decay rate). | | `REC-ENABLE` | R/W | DoE recorder on/off (`HB-ON` / `HB-OFF`). | | `PORT-STATUS` | R | Per-port ready flags, for non-blocking polls. | -| `NODE-ERROR` | R/W | Arithmetic error flag: set to −1 by `Q./` on division by zero (D-11), cleared by writing 0. `VM-ERROR?` reads it. | +| `NODE-ERROR` | R/W | Arithmetic error flag: set to −1 by `Q./` on division by zero (D-11) and by `Q.SQRT` / `Q.LOG` outside their domain (D-12), cleared by writing 0. `VM-ERROR?` reads it. | diff --git a/v4/tests/test_foundation.c b/v4/tests/test_foundation.c index 3d229643..71ecc00a 100644 --- a/v4/tests/test_foundation.c +++ b/v4/tests/test_foundation.c @@ -27,7 +27,9 @@ * Q./ (D-11) and its core (UQ/) are checked against an independent * limb-by-limb long division, including NODE-ERROR, on width-native edge * values, and against v3's q48_div where v4 keeps v3's meaning. - * Q.EXP is checked bit for bit against v3's q48_exp_approx for |q| < 16.0. Every word is + * Q.EXP is checked bit for bit against v3's q48_exp_approx for |q| < 16.0. + * Q.SQRT is checked bit for bit against v3's q48_sqrt_approx for + * 0 <= q < 2^48, and for 0 with NODE-ERROR below zero (D-12). Every word is * also probed for how much of the 10- and 9-deep circular stacks (D-2) it * leaves to its caller. * @@ -52,6 +54,8 @@ static int failures = 0, checks = 0; #define QS ((v4_cell)(V4_NODE_WORDS - 8u)) /* (QE), Q.EXP's 8-cell variable: x, term, sum (two cells each), sign, n. */ #define QE ((v4_cell)(V4_NODE_WORDS - 16u)) +/* (QR), Q.SQRT's 5-cell variable: q, x (two cells each), rounds left. */ +#define QR ((v4_cell)(V4_NODE_WORDS - 24u)) #define MAXU ((v4_ucell)~(v4_ucell)0) #define FLAG(c) ((c) ? V4_ALL_ONES : (v4_cell)0) @@ -65,7 +69,7 @@ static v4_cell w_nip, w_swap, w_or, w_negate, w_rot, w_zless, w_zequal, w_ugreater, w_abs, w_s2d, w_dplus, w_dnegate, w_dabs, w_smrem, w_slashmod, w_mplus, w_dminus, w_d0equal, w_dequal, w_qfromint, w_qtoint, w_less, w_equal, w_dless, w_2swap, w_2over, - w_dmax, w_dmin, w_qgt_doc, w_qgt, w_dltkeep, w_qstar, w_d2starc, w_uqdiv, w_qslash, w_qexp; + w_dmax, w_dmin, w_qgt_doc, w_qgt, w_dltkeep, w_qstar, w_d2starc, w_uqdiv, w_qslash, w_qexp, w_qsqrt; #define O(name) v4_asm_op(&as, V4_OP_##name) #define LIT(v) v4_asm_lit(&as, (v4_cell)(v)) @@ -934,6 +938,86 @@ static void build(void) #undef FETCH2 #undef STORE2 #undef HERE_ +#undef FWD + + /* : Q.SQRT ( q -- r ) 5.26, v3's q48_sqrt_approx + * Newton: x0 = q/2 + 0.25, then up to 8 rounds of x' = (x + q/x) / 2, + * returning x as soon as |x' - x| < 10 ulp. sqrt(0) = 0, sqrt(1.0) = + * 1.0; q < 0 gives 0 and sets NODE-ERROR (D-12). q, x and the rounds + * left live in (QR). D2/ below is the logical double shift right, + * push a! 0 pop +* MAXHI and push drop a pop + * (one +* step with S = 0, the sign bit cleared). + * dup -if POS drop drop drop NODE-ERROR b! -1 !b 0 0 ; + * POS: drop over over OR if ZERO drop + * over 65536 xor over OR if ONE drop + * over over QR a! SWAP !+ ! D2/ 16384 0 D+ QR 2 + a! SWAP !+ ! + * 8 QR 4 + b! !b + * LOOP: QR a! @+ @ QR 2 + a! @+ @ Q./ QR 2 + a! @+ @ D+ D2/ x' + * over over QR 2 + a! @+ @ DNEGATE D+ -if L1 DNEGATE L1: x' |x'-x| + * if HI0 drop drop jump NEXT + * HI0: drop -if SM drop jump NEXT low cell >= 2^(N-1): not small + * SM: -10 + -if NEXT1 drop drop drop QR 2 + a! @+ @ ; + * NEXT1: drop + * NEXT: QR 2 + a! SWAP !+ ! + * QR 4 + b! @b -1 + dup !b if DONE drop jump LOOP + * DONE: drop QR 2 + a! @+ @ ; + * ZERO: drop ; ONE: drop ; + * Clobbers A and B. */ +#define FWD(op) v4_asm_branch_fwd(&as, V4_OP_##op) +#define HERE_(r) v4_asm_resolve(&as, (r), v4_asm_label(&as)) +#define STORE2(addr) do { LIT(addr); O(BANG_A); O(OVER); O(PUSH); O(PUSH); O(DROP); O(RPOP); O(RPOP); \ + O(STORE_INC); O(STORE_A); } while (0) +#define FETCH2(addr) do { LIT(addr); O(BANG_A); O(FETCH_INC); O(FETCH_A); } while (0) +#define D2SLASH() do { O(PUSH); O(BANG_A); LIT(0); O(RPOP); O(MUL_STEP); \ + LIT((v4_cell)(MAXU >> 1)); O(AND); O(PUSH); O(DROP); O(PUSH_A); O(RPOP); } while (0) + { + v4_asm_ref pos, zero, one, l1, hi0, next1, j_next, j_next2, done; + v4_cell loop, l_next; + + w_qsqrt = v4_asm_label(&as); + O(DUP); pos = FWD(MINUS_IF); + O(DROP); O(DROP); O(DROP); LIT(NODE_ERROR); O(BANG_B); LIT(-1); O(STORE_B); + LIT(0); LIT(0); O(SEMI); + HERE_(pos); + O(DROP); O(OVER); O(OVER); CALL(w_or); zero = FWD(IF); + O(DROP); O(OVER); LIT(65536); O(XOR); O(OVER); CALL(w_or); one = FWD(IF); + O(DROP); + O(OVER); O(OVER); STORE2(QR); + D2SLASH(); LIT(16384); LIT(0); CALL(w_dplus); STORE2(QR + 2); + LIT(8); LIT(QR + 4); O(BANG_B); O(STORE_B); + loop = v4_asm_label(&as); + FETCH2(QR); FETCH2(QR + 2); CALL(w_qslash); FETCH2(QR + 2); CALL(w_dplus); D2SLASH(); + O(OVER); O(OVER); FETCH2(QR + 2); CALL(w_dnegate); CALL(w_dplus); + l1 = FWD(MINUS_IF); CALL(w_dnegate); HERE_(l1); + hi0 = FWD(IF); + O(DROP); O(DROP); j_next = FWD(JUMP); + HERE_(hi0); + O(DROP); + { + v4_asm_ref sm = FWD(MINUS_IF); + O(DROP); j_next2 = FWD(JUMP); + HERE_(sm); + } + LIT(-10); O(ADD); next1 = FWD(MINUS_IF); + O(DROP); O(DROP); O(DROP); FETCH2(QR + 2); O(SEMI); + HERE_(next1); + O(DROP); + l_next = v4_asm_label(&as); + STORE2(QR + 2); + LIT(QR + 4); O(BANG_B); O(FETCH_B); LIT(-1); O(ADD); O(DUP); O(STORE_B); + done = FWD(IF); + O(DROP); v4_asm_branch(&as, V4_OP_JUMP, loop); + HERE_(done); + O(DROP); FETCH2(QR + 2); O(SEMI); + HERE_(zero); O(DROP); O(SEMI); + HERE_(one); O(DROP); O(SEMI); + v4_asm_resolve(&as, j_next, l_next); + v4_asm_resolve(&as, j_next2, l_next); + } +#undef D2SLASH +#undef FETCH2 +#undef STORE2 +#undef HERE_ #undef FWD CHECK(v4_asm_ok(&as), "foundation words assemble"); @@ -1320,6 +1404,24 @@ static uint64_t v3_q48_exp(uint64_t q) return result; } +/* v3's q48_sqrt_approx, verbatim but for the names. */ +static uint64_t v3_q48_sqrt(uint64_t q) +{ + uint64_t x; + int iter; + if (q == 0) return 0; + if (q == 65536) return 65536; + x = (q >> 1) + 16384; + for (iter = 0; iter < 8; iter++) { + uint64_t q_div_x = v3_q48_div(q, x); + uint64_t x_next = (x + q_div_x) >> 1; + uint64_t delta = (x_next > x) ? (x_next - x) : (x - x_next); + if (delta < 10) break; + x = x_next; + } + return x; +} + /* Stack headroom. Run `word` with `dfill` marked cells under the canary and * `rfill` marked cells under its return address, and report whether the * results, the canary and every marked cell come back intact. The F18 stacks @@ -1975,6 +2077,34 @@ int main(void) } } + /* Q.SQRT against v3's q48_sqrt_approx for 0 <= q < 2^48 (where v3's + * q48_div does not saturate), bit for bit; q < 0 gives 0 and NODE-ERROR. */ + { + static const int64_t qr[] = { + 0, 1, 2, 9, 0x4000, 0x8000, 0xFFFF, 0x10000, 0x10001, 0x20000, 0x40000, + 0x90000, 0x1000000, 0x7FFFFFFF, 0x100000000, ((int64_t)1 << 47) + 12345, + ((int64_t)1 << 48) - 1, -1, -0x10000 + }; + uint64_t x = 0xC2B2AE3D27D4EB4Fu; + for (unsigned i = 0; i < sizeof qr / sizeof qr[0] + 3000u; i++) { + int64_t q; + v4_cell ql, qh, el, eh; + if (i < sizeof qr / sizeof qr[0]) q = qr[i]; + else { + x ^= x << 13; x ^= x >> 7; x ^= x << 17; + q = (int64_t)(x >> (16 + (x & 31u))); /* 0 .. 2^48 */ + if (q >= ((int64_t)1 << 48)) q >>= 1; + } + qcells((uint64_t)q, &ql, &qh); + if (q < 0) { el = 0; eh = 0; } + else qcells(v3_q48_sqrt((uint64_t)q), &el, &eh); + v4_node_store(&n, NODE_ERROR, 0); + CHECK(call(w_qsqrt, 2, ql, qh, 0) && left2(el, eh) + && v4_node_load(&n, NODE_ERROR) == (q < 0 ? -1 : 0), + "Q.SQRT [%u] q=%lld", i, (long long)q); + } + } + /* Q./ at the overflow boundary: |a| * 2^16 against |b| * 2^(2N-1), for * divisors around 2^16 and 2^17, every sign. */ { @@ -2082,6 +2212,12 @@ int main(void) }; headroom("Q.EXP", w_qexp, 2, qexp_args, 6, 2, &dh, &rh); CHECK(dh >= 2 && rh >= 2, "Q.EXP leaves room"); + static const v4_cell qsqrt_args[][4] = { + { 0, 0, 0, 0 }, { 0x10000, 0, 0, 0 }, { 0x90000, 0, 0, 0 }, + { -1, 0x7FFF, 0, 0 }, { 5, -1, 0, 0 } + }; + headroom("Q.SQRT", w_qsqrt, 2, qsqrt_args, 5, 2, &dh, &rh); + CHECK(dh >= 2 && rh >= 2, "Q.SQRT leaves room"); headroom("SM/REM", w_smrem, 3, smrem_args, 5, 2, &dh, &rh); CHECK(rh >= 1, "SM/REM leaves room for /MOD's return address"); headroom("/MOD", w_slashmod, 2, slashmod_args, 4, 2, &dh, &rh); -- 2.54.0 From f4bfe7de02bf1a3e2c462c22bab8a7f766baee69 Mon Sep 17 00:00:00 2001 From: rajames Date: Sat, 3 Oct 2026 10:11:25 -0400 Subject: [PATCH 022/135] logs: three-architecture kernel acceptance baseline at a2d21d5c Baseline run for StarForth-v4.0.0 as it stands, before any further work. `make -f kernel/Makefile ARCH= clean qemu` for amd64, aarch64 and riscv64, one at a time, disk/artemis.img and disk/thumbdrives/zuse-thumb-ident.img restored to their committed state before each. All three reach `[zuse@Hera] ok>`, with zero UNKNOWN WORD, PARITY:OK, 1050 POST tests run and ALL IMPLEMENTED TESTS PASSED, stadium_conserved(Artemis)=true. dict_hash is identical across the three: Hera (PARITY:M7.1a, word_count=530) 0x08873e0f44b7cb2a dict_hash 0xe11082140cf86b05 dict_hash 0xb1256603f848e2b9 dict_hash 0xc791409ac1715690 QEMU was asked to quit over QMP once the prompt had appeared and the serial log had been quiet for 10 seconds. Co-Authored-By: Claude Opus 5.5 --- .../amd64/qemu-amd64-20261003-100613.log | 9143 ++++++++++++++++ .../aarch64/qemu-aarch64-20261003-100732.log | 9115 ++++++++++++++++ .../riscv64/qemu-riscv64-20261003-100941.log | 9187 +++++++++++++++++ 3 files changed, 27445 insertions(+) create mode 100644 logs/20261003-100613/amd64/qemu-amd64-20261003-100613.log create mode 100644 logs/20261003-100732/aarch64/qemu-aarch64-20261003-100732.log create mode 100644 logs/20261003-100941/riscv64/qemu-riscv64-20261003-100941.log diff --git a/logs/20261003-100613/amd64/qemu-amd64-20261003-100613.log b/logs/20261003-100613/amd64/qemu-amd64-20261003-100613.log new file mode 100644 index 00000000..dab3053c --- /dev/null +++ b/logs/20261003-100613/amd64/qemu-amd64-20261003-100613.log @@ -0,0 +1,9143 @@ +[=3hBdsDxe: loading Boot0002 "UEFI QEMU DVD-ROM QM00005 " from PciRoot(0x0)/Pci(0x1F,0x2)/Sata(0x2,0xFFFF,0x0) +BdsDxe: starting Boot0002 "UEFI QEMU DVD-ROM QM00005 " from PciRoot(0x0)/Pci(0x1F,0x2)/Sata(0x2,0xFFFF,0x0) +[=3hStarKernel UEFI Loader +Loading kernel from ESP... +[CKPT 001] Entered efi_main - ConOut live +RAW SERIAL UP +[CKPT 002] Serial (COM1) initialized +Monolithic build - kernel linked directly +Collecting boot information... +CmdLine: parsed OK +[CKPT 004] Command line parsed +[CKPT 005] Kernel stack allocation decided +[CKPT 006] Boot info collected (ACPI table located) +GOP: linear framebuffer found +[CKPT 007] GOP: linear framebuffer found +[CKPT 008] About to enter ExitBootServices retry loop +EBS... +EBS OK +Calling kernel_main (monolithic)... + + + _____ _ _ __ _ + / ____| | | |/ / | | + | (___ | |_ __ _ _ __| ' / ___ _ __ _ __ ___| | + \___ \| __/ _` | '__| < / _ \ '__| '_ \ / _ \ | + ____) | || (_| | | | . \ __/ | | | | | __/ | + |_____/ \__\__,_|_| |_|\_\___|_| |_| |_|\___|_| + +LithosAnanke v2.1.0 +Architecture: amd64 +Build: Oct 3 2026 10:05:48 + +UEFI BootServices: EXITED + +=== StarKernel Boot Information === +Memory map entries: 131 +Total memory: 1023 MB +Usable memory: 968 MB +=================================== + +PMM initialized. +PMM statistics: + Total pages: 249341 + Free pages : 247818 + Used pages : 1523 + Total MB : 973 + Free MB : 968 + Used MB : 5 + +VMM initialized (mapped RAM, CR3 switched) +VMM initialized (mapped RAM, CR3 switched) +VMM self-test: mapped OK at 0xffff800000000000 +VMM self-test complete. + +IDT installed. + +APIC: init... +APIC: IA32_APIC_BASE MSR=0x00000000fee00900 +APIC: stale-ISR drain: 0 EOI(s) issued +APIC: initialized (xAPIC MMIO, TPR=0, SIVR=0x1FF, EOI-clear) +APIC: init done + +I/O APIC: init... +I/O APIC: base=0xfec00000, gsi_base=0, overrides=5 + override: source=00 gsi=2 flags=0x0000 + override: source=05 gsi=5 flags=0x000d + override: source=09 gsi=9 flags=0x000d + override: source=0a gsi=10 flags=0x000d + override: source=0b gsi=11 flags=0x000d +i8042: keyboard ACKed enable-scanning +i8042: IRQ1 enabled in controller config byte +I/O APIC: keyboard IRQ1 routed (masked) + +Timer: init... +Timer: init start +Timer: PM_TMR_BLK discovered from FADT at port 1544 +Timer: VM mode detected (hypervisor present). +Timer: HPET calibration disabled (VM-exit MMIO would poison timing). +Timer: WARNING: invariant TSC not present under hypervisor. +Timer: continuing in RELATIVE mode (no determinism guarantees). +Timer: RDTSCP not present; using RDTSC (less serialized). +Timer: CPUID frequency unavailable; trying PM Timer... +Timer: trust=1 (0=NONE,1=REL,2=ABS), TSC=2100112755 Hz +Timer: init done + +Kernel heap initialized. +Heap statistics: + Total bytes: 536870872 + Free bytes: 536870872 + Used bytes: 0 + Peak bytes: 0 + Heap base addr: 24641536 + Heap end addr: 561512448 + +Heartbeat: init... +APIC Timer: calibrating... +APIC Timer: apic_hz=1006760626, tick_hz=100, initial_count=10067606 +APIC Timer: configured (masked, ready to start) +Heartbeat: init done +Kernel initialization complete. +Boot successful! + +Stadium: 83886 cells (5242 KB), 50 VM slots +Switch-signal: 50 slots +Kernel-Hermes: 50 channel slots +Kernel-Hermes: 50 pending-queue slots +VM: bootstrap parity... +VM arena allocated: 0xffff900000000000 + (5 MB) +[HADES][INFO ] [KRELTSC: 0] Registering FORTH-79 Standard word set... +[HADES][INFO ] [KRELTSC: 4238577] Registering FORTH-79 arithmetic words... +[HADES][INFO ] [KRELTSC: 63866880] FORTH-79 Standard word set registration complete +[Hera] POST: Running comprehensive test suite... +[Hera] [HADES][INFO ] [KRELTSC: 98325801] Starting comprehensive FORTH-79 modular test suite... +[Hera] [HADES][INFO ] [KRELTSC: 99126447] ============================================== +[Hera] [HADES][INFO ] [KRELTSC: 99925812] +[Hera] === Testing Module: Stack Words === +[Hera] [HADES][INFO ] [KRELTSC: 101150259] Running Stack Words Tests (Module 1: Foundation)... +[Hera] [HADES][TEST ] [KRELTSC: 102025476] ▶ Testing module: v3/src/test_runner/modules/stack_words_test +[Hera] [HADES][TEST ] [KRELTSC: 103039209] Testing word: DUP +[Hera] [HADES][TEST ] [KRELTSC: 103675278] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 104477709] Running DUP.basic: 5 DUP . . CR +[Hera] 5 5 +[Hera] [HADES][TEST ] [KRELTSC: 115584798] Test passed +[Hera] [HADES][TEST ] Testing DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 116777766] Expected: Should print: 5 5 +[Hera] 5 5 +[Hera] 5 5 +[Hera] 5 5 +[Hera] 5 5 +[Hera] 5 5 +[Hera] [HADES][TEST ] [KRELTSC: 119888160] Running DUP.zero: 0 DUP . . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 121044714] Test passed +[Hera] [HADES][TEST ] Testing DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 122692710] Expected: Should print: 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 125091078] Running DUP.negative: -42 DUP . . CR +[Hera] -42 -42 +[Hera] [HADES][TEST ] [KRELTSC: 126458535] Test passed +[Hera] [HADES][TEST ] Testing DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 127817634] Expected: Should print: -42 -42 +[Hera] -42 -42 +[Hera] -42 -42 +[Hera] -42 -42 +[Hera] -42 -42 +[Hera] -42 -42 +[Hera] [HADES][TEST ] [KRELTSC: 130473693] Running DUP.max_int: 2147483647 DUP . . CR +[Hera] 2147483647 2147483647 +[Hera] [HADES][TEST ] [KRELTSC: 131820171] Test passed +[Hera] [HADES][TEST ] Testing DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 133146720] Expected: Should duplicate max int +[Hera] 2147483647 2147483647 +[Hera] 2147483647 2147483647 +[Hera] 2147483647 2147483647 +[Hera] 2147483647 2147483647 +[Hera] 2147483647 2147483647 +[Hera] [HADES][TEST ] [KRELTSC: 136567998] Running DUP.min_int: -2147483648 DUP . . CR +[Hera] -2147483648 -2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 138023046] Test passed +[Hera] [HADES][TEST ] Testing DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 139356273] Expected: Should duplicate min int +[Hera] -2147483648 -2147483648 +[Hera] -2147483648 -2147483648 +[Hera] -2147483648 -2147483648 +[Hera] -2147483648 -2147483648 +[Hera] -2147483648 -2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 142559046] Running DUP.empty_stack: DUP +[Hera] [HADES][ERROR] [KRELTSC: 143450769] DUP: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 144248559] Expected error occurred +[Hera] [HADES][TEST ] Testing DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 145702032] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 147015351] DUP: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 148367226] ▶ Testing module: v3/src/test_runner/modules/stack_words_test +[Hera] [HADES][TEST ] [KRELTSC: 149636781] Testing word: DROP +[Hera] [HADES][TEST ] [KRELTSC: 150557358] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 151461702] Running DROP.basic: 5 7 DROP . CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 152920362] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 154525623] Expected: Should print: 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 157334058] Running DROP.zero: 42 0 DROP . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 158720604] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 160520682] Expected: Should drop zero, print 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 163405074] Running DROP.negative: 10 -5 DROP . CR +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 164915289] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 166549929] Expected: Should drop negative, print 10 +[Hera] 10 +[Hera] 10 +[Hera] 10 +[Hera] 10 +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 169508220] Running DROP.double_drop: 1 2 3 DROP DROP . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 171016986] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 172888863] Expected: Should print: 1 +[Hera] 1 +[Hera] [HADES][INFO ] [KRELTSC: 176228766] L8[TABLE]: Config 17 → 0 regime=2 score=26214 L1=0 L2=0 L3=0 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 179881884] Running DROP.triple_drop: 1 2 3 4 DROP DROP DROP . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 181464948] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 183085581] Expected: Should print: 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 186102672] Running DROP.sequential: 5 DROP 6 DROP 7 . CR +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 187608036] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 189239757] Expected: Should print: 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 192039141] Running DROP.single_item: 99 DROP DEPTH . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 193600470] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 195256446] Expected: Should empty stack, depth=0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 198365496] Running DROP.depth_change: DEPTH 1 2 DROP DEPTH SWAP - . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 200253795] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 201883605] Expected: Should change depth by 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 204937026] Running DROP.preserve_depth: DEPTH 5 6 DROP DROP DEPTH = . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 206708208] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 208330290] Expected: Should preserve net depth +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][INFO ] [KRELTSC: 211474956] L8[TABLE]: Config 0 → 1 regime=2 score=26214 L1=0 L2=0 L3=0 L +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 213206784] Running DROP.max_int: 2147483647 DROP DEPTH . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 214748142] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 216405462] Expected: Should drop max int +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 219245145] Running DROP.min_int: -2147483648 DROP DEPTH . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 220762311] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 222576984] Expected: Should drop min int +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 225546363] Running DROP.with_dup: 5 DUP DROP . CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 226970520] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 228633195] Expected: Should duplicate then drop +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 231541863] Running DROP.with_swap: 1 2 SWAP DROP . CR +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 233010372] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 234736005] Expected: Should swap then drop +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 237886740] Running DROP.complex: 1 2 3 ROT DROP SWAP DROP . CR +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 239637699] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 241268349] Expected: Should handle complex sequence +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 244383657] Running DROP.empty_stack: DROP +[Hera] [HADES][ERROR] [KRELTSC: 245538258] DROP: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 246466941] Expected error occurred +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 248421726] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 249530190] DROP: 15 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 250647978] ▶ Testing module: v3/src/test_runner/modules/stack_words_test +[Hera] [HADES][TEST ] [KRELTSC: 251968836] Testing word: SWAP +[Hera] [HADES][TEST ] [KRELTSC: 252922341] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 253857282] Running SWAP.basic: 5 7 SWAP . . CR +[Hera] 5 7 +[Hera] [HADES][TEST ] [KRELTSC: 255322368] Test passed +[Hera] [HADES][TEST ] Testing SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 256972359] Expected: Should print: 7 5 +[Hera] 5 7 +[Hera] 5 7 +[Hera] 5 7 +[Hera] 5 7 +[Hera] 5 7 +[Hera] [HADES][TEST ] [KRELTSC: 260153376] Running SWAP.same_values: 42 42 SWAP . . CR +[Hera] 42 42 +[Hera] [HADES][TEST ] [KRELTSC: 261653742] Test passed +[Hera] [HADES][TEST ] Testing SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 263253879] Expected: Should print: 42 42 +[Hera] 42 42 +[Hera] 42 42 +[Hera] 42 42 +[Hera] 42 42 +[Hera] 42 [HADES][INFO ] [KRELTSC: 266264733] L8[TABLE]: Config 1 → 2 regime=2 score=26214 L1=0 L2=0 L3=0 L +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 267773751] Running SWAP.zero_nonzero: 0 99 SWAP . . CR +[Hera] 0 99 +[Hera] [HADES][TEST ] [KRELTSC: 269316747] Test passed +[Hera] [HADES][TEST ] Testing SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 270989901] Expected: Should print: 99 0 +[Hera] 0 99 +[Hera] 0 99 +[Hera] 0 99 +[Hera] 0 99 +[Hera] 0 99 +[Hera] [HADES][TEST ] [KRELTSC: 274180767] Running SWAP.negative: -5 10 SWAP . . CR +[Hera] -5 10 +[Hera] [HADES][TEST ] [KRELTSC: 275665005] Test passed +[Hera] [HADES][TEST ] Testing SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 277303488] Expected: Should print: 10 -5 +[Hera] -5 10 +[Hera] -5 10 +[Hera] -5 10 +[Hera] -5 10 +[Hera] -5 10 +[Hera] [HADES][TEST ] [KRELTSC: 280310436] Running SWAP.one_item: 42 SWAP +[Hera] [HADES][ERROR] [KRELTSC: 281498049] SWAP: Insufficient stack items (need 2) +[Hera] [HADES][TEST ] [KRELTSC: 282391200] Expected error occurred +[Hera] [HADES][TEST ] Testing SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 283603446] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 284440632] Running SWAP.empty_stack: SWAP +[Hera] [HADES][ERROR] [KRELTSC: 285577950] SWAP: Insufficient stack items (need 2) +[Hera] [HADES][TEST ] [KRELTSC: 286412217] Expected error occurred +[Hera] [HADES][TEST ] Testing SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 287834652] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 288711696] SWAP: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 289632189] ▶ Testing module: v3/src/test_runner/modules/stack_words_test +[Hera] [HADES][TEST ] [KRELTSC: 290668602] Testing word: OVER +[Hera] [HADES][TEST ] [KRELTSC: 291366012] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 292118253] Running OVER.basic: 5 7 OVER . . . CR +[Hera] 5 7 5 +[Hera] [HADES][TEST ] [KRELTSC: 293503182] Test passed +[Hera] [HADES][TEST ] Testing OVER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 294838971] Expected: Should print: 5 7 5 +[Hera] 5 7 5 +[Hera] 5 7 5 +[Hera] 5 7 5 +[Hera] 5 7 5 +[Hera] 5 7 5 +[Hera] [HADES][TEST ] [KRELTSC: 297425037] Running OVER.zeros: 0 0 OVER . . . CR +[Hera] 0 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 298926684] Test passed +[Hera] [HADES][TEST ] Testing OVER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 300295191] Expected: Should print: 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 303036216] Running OVER.mixed: -1 42 OVER . . . CR +[Hera] -1 42 -1 +[Hera] [HADES][TEST ] [KRELTSC: 304545885] Test passed +[Hera] [HADES][TEST ] Testing OVER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 306085269] Expected: Should print: -1 42 -1 +[Hera] -1 42 -1 +[Hera] -1 42 -1 +[Hera] -1 42 -1 +[Hera] -1 42 -1 +[Hera] -1 42 -1 +[Hera] [HADES][TEST ] [KRELTSC: 309227415] Running OVER.one_item: 42 OVER +[Hera] [HADES][ERROR] [KRELTSC: 310573578] OVER: Insufficient stack items (need 2) +[Hera] [HADES][TEST ] [KRELTSC: 311628975] Expected error occurred +[Hera] [HADES][TEST ] Testing OVER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 313349820] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 314458011] Running OVER.empty_stack: OVER +[Hera] [HADES][ERROR] [KRELTSC: 315525672] OVER: Insufficient stack items (need 2) +[Hera] [HADES][TEST ] [KRELTSC: 316577499] Expected error occurred +[Hera] [HADES][TEST ] Testing OVER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 318307080] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 319402083] OVER: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 320515818] ▶ Testing module: v3/src/test_runner/modules/stack_words_test +[Hera] [HADES][TEST ] [KRELTSC: 321773844] Testing word: ROT +[Hera] [HADES][TEST ] [KRELTSC: 322802424] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 323781381] Running ROT.basic: 1 2 3 ROT . . . CR +[Hera] 1 3 2 +[Hera] [HADES][TEST ] [KRELTSC: 325347960] Test passed +[Hera] [HADES][TEST ] Testing ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 326962566] Expected: Should print: 2 3 1 +[Hera] 1 3 2 +[Hera] 1 3 2 +[Hera] 1 3 2 +[Hera] 1 3 2 +[Hera] 1 3 2 +[Hera] [HADES][TEST ] [KRELTSC: 330071952] Running ROT.zeros: 0 0 0 ROT . . . CR +[Hera] [HADES][INFO ] [KRELTSC: 331357236] L8[TABLE]: Config 2 → 3 regime=2 score=26214 L1=0 L2=0 L3=0 L +[Hera] 0 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 333111891] Test passed +[Hera] [HADES][TEST ] Testing ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 334696635] Expected: Should print: 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 337922697] Running ROT.mixed: -1 0 1 ROT . . . CR +[Hera] -1 1 0 +[Hera] [HADES][TEST ] [KRELTSC: 339375120] Test passed +[Hera] [HADES][TEST ] Testing ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 341019924] Expected: Should print: 0 1 -1 +[Hera] -1 1 0 +[Hera] -1 1 0 +[Hera] -1 1 0 +[Hera] -1 1 0 +[Hera] -1 1 0 +[Hera] [HADES][TEST ] [KRELTSC: 344146677] Running ROT.two_items: 1 2 ROT +[Hera] [HADES][ERROR] [KRELTSC: 345239013] ROT: Insufficient stack items (need 3) +[Hera] [HADES][TEST ] [KRELTSC: 346348884] Expected error occurred +[Hera] [HADES][TEST ] Testing ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 348244701] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 349325319] Running ROT.one_item: 42 ROT +[Hera] [HADES][ERROR] [KRELTSC: 350337834] ROT: Insufficient stack items (need 3) +[Hera] [HADES][TEST ] [KRELTSC: 351387120] Expected error occurred +[Hera] [HADES][TEST ] Testing ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 353099229] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 354265779] Running ROT.empty_stack: ROT +[Hera] [HADES][ERROR] [KRELTSC: 355253178] ROT: Insufficient stack items (need 3) +[Hera] [HADES][TEST ] [KRELTSC: 356334027] Expected error occurred +[Hera] [HADES][TEST ] Testing ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 358043868] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 359146389] ROT: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 360331839] ▶ Testing module: v3/src/test_runner/modules/stack_words_test +[Hera] [HADES][TEST ] [KRELTSC: 361721703] Testing word: DEPTH +[Hera] [HADES][TEST ] [KRELTSC: 362603472] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 363508782] Running DEPTH.empty: DEPTH . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 364857612] Test passed +[Hera] [HADES][TEST ] Testing DEPTH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 366449538] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 369230274] Running DEPTH.one_item: 42 DEPTH . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 370618038] Test passed +[Hera] [HADES][TEST ] Testing DEPTH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 372244194] Expected: Should print: 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 375143958] Running DEPTH.multiple: 1 2 3 DEPTH . CR +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 376580547] Test passed +[Hera] [HADES][TEST ] Testing DEPTH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 378198807] Expected: Should print: 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 380978010] DEPTH: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 382073412] ▶ Testing module: v3/src/test_runner/modules/stack_words_test +[Hera] [HADES][TEST ] [KRELTSC: 383421717] Testing word: PICK +[Hera] [HADES][TEST ] [KRELTSC: 384284565] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 385209006] Running PICK.pick_0: 1 2 3 0 PICK . CR +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 387083256] Test passed +[Hera] [HADES][TEST ] Testing PICK ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 388727031] Expected: Should print: 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 391479396] Running PICK.pick_1: 1 2 3 1 PICK . CR +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 392921550] Test passed +[Hera] [HADES][TEST ] Testing PICK ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 394573431] Expected: Should print: 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] [HADES][INFO ] [KRELTSC: 397063275] L8[TABLE]: Config 3 → 4 regime=2 score=26214 L1=0 L2=0 L3=0 L +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 399116676] Running PICK.pick_2: 1 2 3 2 PICK . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 400581804] Test passed +[Hera] [HADES][TEST ] Testing PICK ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 402218712] Expected: Should print: 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 404967318] PICK: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 406071645] ▶ Testing module: v3/src/test_runner/modules/stack_words_test +[Hera] [HADES][TEST ] [KRELTSC: 407324652] Testing word: ROLL +[Hera] [HADES][TEST ] [KRELTSC: 408171351] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 409097598] Running ROLL.roll_1: 1 2 3 1 ROLL . . . CR +[Hera] 1 3 2 +[Hera] [HADES][TEST ] [KRELTSC: 411040203] Test passed +[Hera] [HADES][TEST ] Testing ROLL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 412748532] Expected: Should print: 1 3 2 +[Hera] 1 3 2 +[Hera] 1 3 2 +[Hera] 1 3 2 +[Hera] 1 3 2 +[Hera] 1 3 2 +[Hera] [HADES][TEST ] [KRELTSC: 415831773] Running ROLL.roll_2: 1 2 3 2 ROLL . . . CR +[Hera] 2 3 1 +[Hera] [HADES][TEST ] [KRELTSC: 417339993] Test passed +[Hera] [HADES][TEST ] Testing ROLL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 419011698] Expected: Should print: 2 3 1 +[Hera] 2 3 1 +[Hera] 2 3 1 +[Hera] 2 3 1 +[Hera] 2 3 1 +[Hera] 2 3 1 +[Hera] [HADES][TEST ] [KRELTSC: 422060415] ROLL: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 423263358] ▶ Testing module: v3/src/test_runner/modules/stack_words_test +[Hera] [HADES][TEST ] [KRELTSC: 424558869] Testing word: ?DUP +[Hera] [HADES][TEST ] [KRELTSC: 425416824] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 426344709] Running ?DUP.nonzero: 42 ?DUP . . CR +[Hera] 42 42 +[Hera] [HADES][TEST ] [KRELTSC: 428796102] Test passed +[Hera] [HADES][TEST ] Testing ?DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 430792803] Expected: Should print: 42 42 +[Hera] 42 42 +[Hera] 42 42 +[Hera] 42 42 +[Hera] 42 42 +[Hera] 42 42 +[Hera] [HADES][TEST ] [KRELTSC: 433149675] Running ?DUP.negative: -5 ?DUP . . CR +[Hera] -5 -5 +[Hera] [HADES][TEST ] [KRELTSC: 434334159] Test passed +[Hera] [HADES][TEST ] Testing ?DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 435641073] Expected: Should print: -5 -5 +[Hera] -5 -5 +[Hera] -5 -5 +[Hera] -5 -5 +[Hera] -5 -5 +[Hera] -5 -5 +[Hera] [HADES][TEST ] [KRELTSC: 438323991] Running ?DUP.zero: 0 ?DUP DEPTH . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 439502133] Test passed +[Hera] [HADES][TEST ] Testing ?DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 440846028] Expected: Should not dup: depth 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 443176167] Running ?DUP.empty_stack: ?DUP +[Hera] [HADES][ERROR] [KRELTSC: 444054114] ?DUP: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 444815469] Expected error occurred +[Hera] [HADES][TEST ] Testing ?DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 446236854] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 447122571] ?DUP: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 448039851] ▶ Testing module: v3/src/test_runner/modules/stack_words_test +[Hera] [HADES][TEST ] [KRELTSC: 449261484] Testing word: -ROT +[Hera] [HADES][TEST ] [KRELTSC: 449967000] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 450737658] Running -ROT.basic: 1 2 3 -ROT . . . CR +[Hera] 2 1 3 +[Hera] [HADES][TEST ] [KRELTSC: 452066055] Test passed +[Hera] [HADES][TEST ] Testing -ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 453421920] Expected: Should print: 1 3 2 +[Hera] [HADES][INFO ] [KRELTSC: 454371183] L8[TABLE]: Config 4 → 5 regime=2 score=26214 L1=0 L2=0 L3=0 L +[Hera] 2 1 3 +[Hera] 2 1 3 +[Hera] 2 1 3 +[Hera] 2 1 3 +[Hera] 2 1 3 +[Hera] [HADES][TEST ] [KRELTSC: 457268112] Running -ROT.zeros: 0 0 0 -ROT . . . CR +[Hera] 0 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 458596551] Test passed +[Hera] [HADES][TEST ] Testing -ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 459959409] Expected: Should print: 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 462696381] Running -ROT.roundtrip: 1 2 3 -ROT ROT . . . CR +[Hera] 3 2 1 +[Hera] [HADES][TEST ] [KRELTSC: 464007264] Test passed +[Hera] [HADES][TEST ] Testing -ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 465339966] Expected: Should restore original order +[Hera] 3 2 1 +[Hera] 3 2 1 +[Hera] 3 2 1 +[Hera] 3 2 1 +[Hera] 3 2 1 +[Hera] [HADES][TEST ] [KRELTSC: 467939451] Running -ROT.two_items: 1 2 -ROT +[Hera] [HADES][ERROR] [KRELTSC: 468849381] -ROT: Insufficient stack items (need 3) +[Hera] [HADES][TEST ] [KRELTSC: 469758639] Expected error occurred +[Hera] [HADES][TEST ] Testing -ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 471144723] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 472067001] Running -ROT.empty_stack: -ROT +[Hera] [HADES][ERROR] [KRELTSC: 472901961] -ROT: Insufficient stack items (need 3) +[Hera] [HADES][TEST ] [KRELTSC: 473785767] Expected error occurred +[Hera] [HADES][TEST ] Testing -ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 475461336] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 476413203] -ROT: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 477399804] === Stack Words Summary: 0 passed, 0 failed, 0 skipped, 0 error +[Hera] [HADES][INFO ] [KRELTSC: 478550247] +[Hera] === Testing Module: Return Stack Words === +[Hera] [HADES][INFO ] [KRELTSC: 479757558] Running Return Stack Words Tests (Module 2)... +[Hera] [HADES][TEST ] [KRELTSC: 480766755] ▶ Testing module: v3/src/test_runner/modules/return_stack_wor +[Hera] [HADES][TEST ] [KRELTSC: 481884795] Testing word: >R +[Hera] [HADES][TEST ] [KRELTSC: 482626620] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 483390600] Running >R.basic: 42 >R R@ . R> . CR +[Hera] 42 42 +[Hera] [HADES][TEST ] [KRELTSC: 484985508] Test passed +[Hera] [HADES][TEST ] Testing >R ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 486568572] Expected: Should print: 42 42 +[Hera] 42 42 +[Hera] 42 42 +[Hera] 42 42 +[Hera] 42 42 +[Hera] 42 42 +[Hera] [HADES][TEST ] [KRELTSC: 489115515] Running >R.zero: 0 >R R@ . R> . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 490283619] Test passed +[Hera] [HADES][TEST ] Testing >R ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 491579739] Expected: Should print: 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 493978548] Running >R.negative: -123 >R R@ . R> . CR +[Hera] -123 -123 +[Hera] [HADES][TEST ] [KRELTSC: 495218829] Test passed +[Hera] [HADES][TEST ] Testing >R ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 496590129] Expected: Should print: -123 -123 +[Hera] -123 -123 +[Hera] -123 -123 +[Hera] -123 -123 [HADES][INFO ] [KRELTSC: 498849120] L8[TABLE]: Config 5 → 6 regime=2 score=26214 L1=0 L2=0 L3=0 L + +[Hera] -123 -123 +[Hera] -123 -123 +[Hera] [HADES][TEST ] [KRELTSC: 500606295] Running >R.multiple: 1 2 >R >R R@ . R> . R@ . R> . CR +[Hera] 1 1 2 2 +[Hera] [HADES][TEST ] [KRELTSC: 502120122] Test passed +[Hera] [HADES][TEST ] Testing >R ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 503483379] Expected: Should print: 2 2 1 1 +[Hera] 1 1 2 2 +[Hera] 1 1 2 2 +[Hera] 1 1 2 2 +[Hera] 1 1 2 2 +[Hera] 1 1 2 2 +[Hera] [HADES][TEST ] [KRELTSC: 506323104] Running >R.empty_stack: >R +[Hera] [HADES][ERROR] [KRELTSC: 507197523] >R: DSP underflow +[Hera] [HADES][TEST ] [KRELTSC: 507908079] Expected error occurred +[Hera] [HADES][TEST ] Testing >R ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 509338872] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 510224442] >R: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 511186158] ▶ Testing module: v3/src/test_runner/modules/return_stack_wor +[Hera] [HADES][TEST ] [KRELTSC: 512423457] Testing word: R> +[Hera] [HADES][TEST ] [KRELTSC: 513114777] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 513903306] Running R>.basic: 42 >R R> . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 515026449] Test passed +[Hera] [HADES][TEST ] Testing R> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 516380886] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 518694204] Running R>.lifo_order: 1 2 >R >R R> . R> . CR +[Hera] 1 2 +[Hera] [HADES][TEST ] [KRELTSC: 519968484] Test passed +[Hera] [HADES][TEST ] Testing R> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 521291001] Expected: Should print: 2 1 +[Hera] 1 2 +[Hera] 1 2 +[Hera] 1 2 +[Hera] 1 2 +[Hera] 1 2 +[Hera] [HADES][TEST ] [KRELTSC: 523741764] Running R>.empty_rstack: R> +[Hera] [HADES][ERROR] [KRELTSC: 524836179] R>: RSP underflow +[Hera] [HADES][TEST ] [KRELTSC: 525610428] Expected error occurred +[Hera] [HADES][TEST ] Testing R> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 527020410] Expected: Should cause return stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 527952936] R>: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 528848523] ▶ Testing module: v3/src/test_runner/modules/return_stack_wor +[Hera] [HADES][TEST ] [KRELTSC: 529944366] Testing word: R@ +[Hera] [HADES][TEST ] [KRELTSC: 530686947] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 531506367] Running R@.basic: 42 >R R@ . R> DROP CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 532813281] Test passed +[Hera] [HADES][TEST ] Testing R@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 534198714] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 536729025] Running R@.non_destructive: 99 >R R@ R@ = . R> DROP CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 538174014] Test passed +[Hera] [HADES][TEST ] Testing R@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 539494242] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 [HADES][INFO ] [KRELTSC: 541286844] L8[TABLE]: Config 6 → 7 regime=2 score=26214 L1=0 L2=0 L3=0 L + +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 542905440] Running R@.empty_rstack: R@ +[Hera] [HADES][ERROR] [KRELTSC: 543710475] R@: RSP underflow +[Hera] [HADES][TEST ] [KRELTSC: 544408977] Expected error occurred +[Hera] [HADES][TEST ] Testing R@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 545837334] Expected: Should cause return stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 546802200] R@: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 547724184] === Return Stack Words Summary: 0 passed, 0 failed, 0 skipped, +[Hera] [HADES][INFO ] [KRELTSC: 548780085] +[Hera] === Testing Module: Memory Words === +[Hera] [HADES][INFO ] [KRELTSC: 550093005] Running Memory Words Tests (Module 3)... +[Hera] [HADES][TEST ] [KRELTSC: 551024544] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 552089244] Testing word: ! +[Hera] [HADES][TEST ] [KRELTSC: 552775524] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 553544502] Running !.basic: 42 HERE ! HERE @ . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 554997912] Test passed +[Hera] [HADES][TEST ] Testing ! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 556280571] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 558759285] Running !.zero: 0 HERE ! HERE @ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 560026614] Test passed +[Hera] [HADES][TEST ] Testing ! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 561352848] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 564016152] Running !.negative: -999 HERE ! HERE @ . CR +[Hera] -999 +[Hera] [HADES][TEST ] [KRELTSC: 565340727] Test passed +[Hera] [HADES][TEST ] Testing ! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 566659716] Expected: Should print: -999 +[Hera] -999 +[Hera] -999 +[Hera] -999 +[Hera] -999 +[Hera] -999 +[Hera] [HADES][TEST ] [KRELTSC: 569110122] Running !.overwrite: 111 HERE ! 222 HERE ! HERE @ . CR +[Hera] 222 +[Hera] [HADES][TEST ] [KRELTSC: 570441354] Test passed +[Hera] [HADES][TEST ] Testing ! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 571763493] Expected: Should print: 222 +[Hera] 222 +[Hera] 222 +[Hera] 222 +[Hera] 222 +[Hera] 222 +[Hera] [HADES][TEST ] [KRELTSC: 574448784] Running !.max_int: 2147483647 HERE ! HERE @ . CR +[Hera] 2147483647 +[Hera] [HADES][TEST ] [KRELTSC: 575770797] Test passed +[Hera] [HADES][TEST ] Testing ! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 577096947] Expected: Should store max int +[Hera] 2147483647 +[Hera] 2147483647 +[Hera] 2147483647 +[Hera] 2147483647 +[Hera] 2147483647 +[Hera] [HADES][TEST ] [KRELTSC: 579806367] Running !.min_int: -2147483648 HERE ! HERE @ . CR +[Hera] -2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 581150157] Test passed +[Hera] [HADES][TEST ] Testing ! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 582476790] Expected: Should store min int +[Hera] [HADES][INFO ] [KRELTSC: 583417527] L8[TABLE]: Config 7 → 8 regime=2 score=6553 L1=0 L2=0 L3=0 L4 +[Hera] -2147483648 +[Hera] -2147483648 +[Hera] -2147483648 +[Hera] -2147483648 +[Hera] -2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 586464102] Running !.empty_stack: ! +[Hera] [HADES][TEST ] [KRELTSC: 587451501] Expected error occurred +[Hera] [HADES][TEST ] Testing ! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 588950565] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 589884582] Running !.one_item: 42 ! +[Hera] [HADES][TEST ] [KRELTSC: 590761899] Expected error occurred +[Hera] [HADES][TEST ] Testing ! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 592214805] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 593134647] !: 8 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 594125427] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 595212618] Testing word: @ +[Hera] [HADES][TEST ] [KRELTSC: 595885878] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 596669829] Running @.after_store: 123 HERE ! HERE @ . CR +[Hera] 123 +[Hera] [HADES][TEST ] [KRELTSC: 598016769] Test passed +[Hera] [HADES][TEST ] Testing @ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 599593953] Expected: Should print: 123 +[Hera] 123 +[Hera] 123 +[Hera] 123 +[Hera] 123 +[Hera] 123 +[Hera] [HADES][TEST ] [KRELTSC: 602147679] Running @.multiple_reads: 456 HERE ! HERE @ HERE @ = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 603591786] Test passed +[Hera] [HADES][TEST ] Testing @ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 604961028] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 607486173] Running @.empty_stack: @ +[Hera] [HADES][TEST ] [KRELTSC: 608393541] Expected error occurred +[Hera] [HADES][TEST ] Testing @ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 609853356] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 610752555] @: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 611670339] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 612948294] Testing word: C! +[Hera] [HADES][TEST ] [KRELTSC: 613634700] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 614390301] Running C!.basic: 65 HERE C! HERE C@ . CR +[Hera] 65 +[Hera] [HADES][TEST ] [KRELTSC: 616041909] Test passed +[Hera] [HADES][TEST ] Testing C! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 617374443] Expected: Should print: 65 +[Hera] 65 +[Hera] 65 +[Hera] 65 +[Hera] 65 +[Hera] 65 +[Hera] [HADES][TEST ] [KRELTSC: 620120529] Running C!.zero: 0 HERE C! HERE C@ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 621617010] Test passed +[Hera] [HADES][TEST ] Testing C! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 622929405] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 625559004] Running C!.high_byte: 255 HERE C! HERE C@ . CR +[Hera] 255 +[Hera] [HADES][TEST ] [KRELTSC: 626923269] Test passed +[Hera] [HADES][TEST ] Testing C! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 628279050] Expected: Should print: 255 +[Hera] 255 +[Hera] 255 +[Hera] 255 +[Hera] [HADES][INFO ] [KRELTSC: 630253386] L8[TABLE]: Config 8 → 9 regime=2 score=6553 L1=0 L2=0 L3=0 L4 +[Hera] 255 +[Hera] 255 +[Hera] [HADES][TEST ] [KRELTSC: 632239209] Running C!.truncation: 256 HERE C! HERE C@ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 633836091] Test passed +[Hera] [HADES][TEST ] Testing C! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 635460714] Expected: Should print: 0 (truncated) +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 638740914] C!: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 639661323] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 640704708] Testing word: C@ +[Hera] [HADES][TEST ] [KRELTSC: 641412387] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 642145623] Running C@.after_cstore: 97 HERE C! HERE C@ . CR +[Hera] 97 +[Hera] [HADES][TEST ] [KRELTSC: 643458816] Test passed +[Hera] [HADES][TEST ] Testing C@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 644787444] Expected: Should print: 97 +[Hera] 97 +[Hera] 97 +[Hera] 97 +[Hera] 97 +[Hera] 97 +[Hera] [HADES][TEST ] [KRELTSC: 647233335] Running C@.zero_byte: 0 HERE C! HERE C@ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 648580569] Test passed +[Hera] [HADES][TEST ] Testing C@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 650174049] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 652591191] C@: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 653524746] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 654604419] Testing word: , +[Hera] [HADES][TEST ] [KRELTSC: 655305924] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 656044389] Running ,.basic: 42 , HERE 8 - @ . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 657532281] Test passed +[Hera] [HADES][TEST ] Testing , ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 658958370] Expected: Should compile 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 661419297] Running ,.negative: -999 , HERE 8 - @ . CR +[Hera] -999 +[Hera] [HADES][TEST ] [KRELTSC: 662895912] Test passed +[Hera] [HADES][TEST ] Testing , ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 664250769] Expected: Should compile -999 +[Hera] -999 +[Hera] -999 +[Hera] -999 +[Hera] -999 +[Hera] -999 +[Hera] [HADES][TEST ] [KRELTSC: 666818019] ,: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 667723854] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 668751552] Testing word: C, +[Hera] [HADES][TEST ] [KRELTSC: 669462927] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 670189275] Running C,.basic: 65 C, HERE 1 - C@ . CR +[Hera] 65 +[Hera] [HADES][TEST ] [KRELTSC: 671606082] Test passed +[Hera] [HADES][TEST ] Testing C, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 672898065] Expected: Should compile byte 65 +[Hera] 65 +[Hera] 65 +[Hera] [HADES][INFO ] [KRELTSC: 674552634] L8[TABLE]: Config 9 → 10 regime=2 score=6553 L1=0 L2=0 L3=0 L +[Hera] 65 +[Hera] 65 +[Hera] 65 +[Hera] [HADES][TEST ] [KRELTSC: 677052012] Running C,.zero: 0 C, HERE 1 - C@ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 678274926] Test passed +[Hera] [HADES][TEST ] Testing C, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 679657944] Expected: Should compile byte 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 682130589] C,: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 683068428] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 684109923] Testing word: 2, +[Hera] [HADES][TEST ] [KRELTSC: 684802902] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 685567512] Running 2,.roundtrip: 12345 67890 2, HERE 16 - 2@ . . CR +[Hera] 67890 12345 +[Hera] [HADES][TEST ] [KRELTSC: 687625239] Test passed +[Hera] [HADES][TEST ] Testing 2, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 688928961] Expected: Should print: 67890 12345 +[Hera] 67890 12345 +[Hera] 67890 12345 +[Hera] 67890 12345 +[Hera] 67890 12345 +[Hera] 67890 12345 +[Hera] [HADES][TEST ] [KRELTSC: 691880532] Running 2,.save-and-verify: 12345 67890 2, HERE 16 - 2@ 67890 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 693429744] Test passed +[Hera] [HADES][TEST ] Testing 2, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 694766499] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 697359432] 2,: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 698263986] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 699338493] Testing word: HERE +[Hera] [HADES][TEST ] [KRELTSC: 700195692] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 700959126] Running HERE.basic: HERE HERE = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 702098460] Test passed +[Hera] [HADES][TEST ] Testing HERE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 703558380] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 706105029] Running HERE.after_comma: HERE 42 , HERE SWAP - 1 CELLS = 0 S +[Hera] [HADES][INFO ] [KRELTSC: 707335860] L8[TABLE]: Config 10 → 11 regime=2 score=6553 L1=0 L2=0 L3=0 +[Hera] [HADES][TEST ] [KRELTSC: 708853614] Test passed +[Hera] [HADES][TEST ] Testing HERE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 710213805] Expected: Asserts HERE advances by exactly 1 CELLS (8 bytes +[Hera] [HADES][TEST ] [KRELTSC: 711765411] HERE: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 712859763] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 713885403] Testing word: ALLOT +[Hera] [HADES][TEST ] [KRELTSC: 714614082] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 715341312] Running ALLOT.basic: HERE 10 ALLOT HERE SWAP - . CR +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 716773365] Test passed +[Hera] [HADES][TEST ] Testing ALLOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 718094202] Expected: Should print: 10 +[Hera] 10 +[Hera] 10 +[Hera] 10 +[Hera] 10 +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 720488538] Running ALLOT.zero: HERE 0 ALLOT HERE SWAP - . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 721873740] Test passed +[Hera] [HADES][TEST ] Testing ALLOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 723259824] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 725832366] Running ALLOT.negative: HERE -4 ALLOT HERE SWAP - . CR +[Hera] -4 +[Hera] [HADES][TEST ] [KRELTSC: 727142661] Test passed +[Hera] [HADES][TEST ] Testing ALLOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 728449533] Expected: Should print: -4 +[Hera] -4 +[Hera] -4 +[Hera] -4 +[Hera] -4 +[Hera] -4 +[Hera] [HADES][TEST ] [KRELTSC: 731011197] ALLOT: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 731972325] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 732964995] Testing word: PAD +[Hera] [HADES][TEST ] [KRELTSC: 733667865] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 734386149] Running PAD.basic: PAD PAD = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 735595728] Test passed +[Hera] [HADES][TEST ] Testing PAD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 736873725] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 739351221] Running PAD.different_from_here: PAD HERE = . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 740607882] Test passed +[Hera] [HADES][TEST ] Testing PAD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 741924603] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 [HADES][INFO ] [KRELTSC: 743551956] L8[TABLE]: Config 11 → 12 regime=2 score=6553 L1=0 L2=0 L3=0 + +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 745566486] PAD: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 746518710] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 747617472] Testing word: +! +[Hera] [HADES][TEST ] [KRELTSC: 748336596] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 749124663] Running +!.basic: 10 HERE ! 5 HERE +! HERE @ . CR +[Hera] 15 +[Hera] [HADES][TEST ] [KRELTSC: 750712998] Test passed +[Hera] [HADES][TEST ] Testing +! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 752006409] Expected: Should print: 15 +[Hera] 15 +[Hera] 15 +[Hera] 15 +[Hera] 15 +[Hera] 15 +[Hera] [HADES][TEST ] [KRELTSC: 754464270] Running +!.by_zero: 42 HERE ! 0 HERE +! HERE @ . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 755751927] Test passed +[Hera] [HADES][TEST ] Testing +! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 757083306] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 759617040] Running +!.negative: 10 HERE ! -3 HERE +! HERE @ . CR +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 761060223] Test passed +[Hera] [HADES][TEST ] Testing +! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 762338556] Expected: Should print: 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 764993985] Running +!.accumulate: 0 HERE ! 1 HERE +! 2 HERE +! 3 HERE +! +[Hera] 6 +[Hera] [HADES][TEST ] [KRELTSC: 766386600] Test passed +[Hera] [HADES][TEST ] Testing +! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 767618502] Expected: Should print: 6 +[Hera] 6 +[Hera] 6 +[Hera] [HADES][INFO ] [KRELTSC: 769266540] L8[TABLE]: Config 12 → 13 regime=2 score=6553 L1=0 L2=0 L3=0 +[Hera] 6 +[Hera] 6 +[Hera] 6 +[Hera] [HADES][TEST ] [KRELTSC: 771379581] Running +!.empty_stack: +! +[Hera] [HADES][TEST ] [KRELTSC: 772275042] Expected error occurred +[Hera] [HADES][TEST ] Testing +! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 773663016] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 774544995] +!: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 775600224] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 776857389] Testing word: -! +[Hera] [HADES][TEST ] [KRELTSC: 777533463] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 778260357] Running -!.basic: 10 HERE ! 3 HERE -! HERE @ . CR +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 779751105] Test passed +[Hera] [HADES][TEST ] Testing -! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 781092375] Expected: Should print: 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 783442989] Running -!.by_zero: 42 HERE ! 0 HERE -! HERE @ . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 784885143] Test passed +[Hera] [HADES][TEST ] Testing -! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 786245796] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 789076239] Running -!.negative: 10 HERE ! -5 HERE -! HERE @ . CR +[Hera] 15 +[Hera] [HADES][TEST ] [KRELTSC: 790508565] Test passed +[Hera] [HADES][TEST ] Testing -! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 791826672] Expected: Should print: 15 +[Hera] 15 +[Hera] 15 +[Hera] 15 +[Hera] 15 +[Hera] 15 +[Hera] [HADES][TEST ] [KRELTSC: 794309838] Running -!.empty_stack: -! +[Hera] [HADES][TEST ] [KRELTSC: 795228336] Expected error occurred +[Hera] [HADES][TEST ] Testing -! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 796565154] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 797470968] -!: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 798365631] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 799388604] Testing word: 2! +[Hera] [HADES][TEST ] [KRELTSC: 800063271] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 801087252] Running 2!.basic: 11 22 HERE 2! HERE @ . HERE 8 + @ . CR +[Hera] 11 22 +[Hera] [HADES][TEST ] [KRELTSC: 802765278] Test passed +[Hera] [HADES][TEST ] Testing 2! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 804115305] Expected: Should print: 22 11 +[Hera] 11 22 +[Hera] 11 22 [HADES][INFO ] [KRELTSC: 805752990] L8[TABLE]: Config 13 → 14 regime=2 score=6553 L1=0 L2=0 L3=0 + +[Hera] 11 22 +[Hera] 11 22 +[Hera] 11 22 +[Hera] [HADES][TEST ] [KRELTSC: 808036488] Running 2!.zeros: 0 0 HERE 2! HERE @ . HERE 8 + @ . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 809427738] Test passed +[Hera] [HADES][TEST ] Testing 2! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 810811890] Expected: Should print: 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 813560391] Running 2!.negative: -1 -2 HERE 2! HERE @ . HERE 8 + @ . CR +[Hera] -1 -2 +[Hera] [HADES][TEST ] [KRELTSC: 815109708] Test passed +[Hera] [HADES][TEST ] Testing 2! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 816474624] Expected: Should print: -2 -1 +[Hera] -1 -2 +[Hera] -1 -2 +[Hera] -1 -2 +[Hera] -1 -2 +[Hera] -1 -2 +[Hera] [HADES][TEST ] [KRELTSC: 819289002] Running 2!.empty_stack: 2! +[Hera] [HADES][TEST ] [KRELTSC: 820190511] Expected error occurred +[Hera] [HADES][TEST ] Testing 2! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 821725611] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 822625671] 2!: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 823586295] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 824648622] Testing word: FILL +[Hera] [HADES][TEST ] [KRELTSC: 825351261] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 826312074] Running FILL.basic: HERE 8 65 FILL HERE C@ . HERE 1+ C@ . CR +[Hera] 65 65 +[Hera] [HADES][TEST ] [KRELTSC: 828103521] Test passed +[Hera] [HADES][TEST ] Testing FILL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 829409217] Expected: Should print: 65 65 +[Hera] 65 65 +[Hera] 65 65 +[Hera] 65 65 +[Hera] 65 65 [HADES][INFO ] [KRELTSC: 831935832] L8[TABLE]: Config 14 → 15 regime=2 score=6553 L1=0 L2=0 L3=0 + +[Hera] 65 65 +[Hera] [HADES][TEST ] [KRELTSC: 833385105] Running FILL.zero_n: HERE 0 88 FILL +[Hera] [HADES][TEST ] [KRELTSC: 834321999] Test passed +[Hera] [HADES][TEST ] Testing FILL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 835679733] Expected: Should do nothing +[Hera] [HADES][TEST ] [KRELTSC: 836703462] Running FILL.zero_byte: HERE 4 0 FILL HERE C@ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 838073208] Test passed +[Hera] [HADES][TEST ] Testing FILL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 839607972] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 842100546] Running FILL.empty_stack: FILL +[Hera] [HADES][TEST ] [KRELTSC: 843005226] Expected error occurred +[Hera] [HADES][TEST ] Testing FILL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 844414347] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 845289459] FILL: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 846306237] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 847334544] Testing word: MOVE +[Hera] [HADES][TEST ] [KRELTSC: 848023365] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 848795955] Running MOVE.basic: HERE 65 OVER C! HERE 1+ 66 OVER C! HERE H +[Hera] 65 66 +[Hera] [HADES][TEST ] [KRELTSC: 850858470] Test passed +[Hera] [HADES][TEST ] Testing MOVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 852217254] Expected: Should print: 65 66 +[Hera] 65 66 +[Hera] 65 66 +[Hera] 65 66 +[Hera] 65 66 +[Hera] 65 66 +[Hera] [HADES][TEST ] [KRELTSC: 855351063] Running MOVE.zero_n: HERE HERE 8 + 0 MOVE +[Hera] [HADES][TEST ] [KRELTSC: 856318596] Test passed +[Hera] [HADES][TEST ] Testing MOVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 857641680] Expected: Should do nothing +[Hera] [HADES][INFO ] [KRELTSC: 858540942] L8[TABLE]: Config 15 → 16 regime=2 score=26214 L1=0 L2=0 L3=1 +[Hera] [HADES][TEST ] [KRELTSC: 859942797] Running MOVE.empty_stack: MOVE +[Hera] [HADES][TEST ] [KRELTSC: 860771646] Expected error occurred +[Hera] [HADES][TEST ] Testing MOVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 862178856] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 863105418] MOVE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 864390681] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 865508595] Testing word: ERASE +[Hera] [HADES][TEST ] [KRELTSC: 866248320] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 867024522] Running ERASE.basic: HERE 4 65 FILL HERE 4 ERASE HERE C@ . HE +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 868739970] Test passed +[Hera] [HADES][TEST ] Testing ERASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 870120993] Expected: Should print: 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 872824134] Running ERASE.zero_n: HERE 0 ERASE +[Hera] [HADES][TEST ] [KRELTSC: 873698070] Test passed +[Hera] [HADES][TEST ] Testing ERASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 875004228] Expected: Should do nothing +[Hera] [HADES][TEST ] [KRELTSC: 875964516] Running ERASE.empty_stack: ERASE +[Hera] [HADES][TEST ] [KRELTSC: 877091313] Expected error occurred +[Hera] [HADES][TEST ] Testing ERASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 878567340] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 879586953] ERASE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 880595478] === Memory Words Summary: 0 passed, 0 failed, 0 skipped, 0 erro +[Hera] [HADES][INFO ] [KRELTSC: 881694576] +[Hera] === Testing Module: Arithmetic Words === +[Hera] [HADES][INFO ] [KRELTSC: 882872949] Running Arithmetic Words Tests (Module 5)... +[Hera] [HADES][TEST ] [KRELTSC: 883871058] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 884988111] Testing word: + +[Hera] [HADES][TEST ] [KRELTSC: 885630270] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 886372305] Running +.basic: 5 7 + . CR +[Hera] 12 +[Hera] [HADES][TEST ] [KRELTSC: 887495028] Test passed +[Hera] [HADES][TEST ] Testing + ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 889018389] Expected: Should print: 12 +[Hera] 12 +[Hera] 12 +[Hera] 12 +[Hera] 12 +[Hera] 12 +[Hera] [HADES][TEST ] [KRELTSC: 891413313] Running +.zero_add: 42 0 + . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 892559766] Test passed +[Hera] [HADES][TEST ] Testing + ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 893932473] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 896229012] Running +.negative: -5 3 + . CR +[Hera] -2 +[Hera] [HADES][TEST ] [KRELTSC: 897357846] Test passed +[Hera] [HADES][TEST ] Testing + ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 898658229] Expected: Should print: -2 +[Hera] -2 +[Hera] -2 +[Hera] -2 +[Hera] -2 +[Hera] -2 +[Hera] [HADES][TEST ] [KRELTSC: 900826647] Running +.both_negative: -5 -3 + . CR +[Hera] -8 +[Hera] [HADES][TEST ] [KRELTSC: 902098638] Test passed +[Hera] [HADES][TEST ] Testing + ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 903390033] Expected: Should print: -8 +[Hera] -8 +[Hera] -8 +[Hera] -8 +[Hera] -8 +[Hera] [HADES][INFO ] [KRELTSC: 905552361] L8[TABLE]: Config 16 → 18 regime=2 score=26214 L1=0 L2=0 L3=1 +[Hera] -8 +[Hera] [HADES][TEST ] [KRELTSC: 906985821] Running +.overflow: 2147483647 1 + . CR +[Hera] 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 908220705] Test passed +[Hera] [HADES][TEST ] Testing + ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 909568023] Expected: Should overflow +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 912074268] Running +.underflow: -2147483648 -1 + . CR +[Hera] -2147483649 +[Hera] [HADES][TEST ] [KRELTSC: 913355142] Test passed +[Hera] [HADES][TEST ] Testing + ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 914873778] Expected: Should underflow +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] [HADES][TEST ] [KRELTSC: 917602602] Running +.empty_stack: + +[Hera] [HADES][ERROR] [KRELTSC: 918505623] +: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 919262505] Expected error occurred +[Hera] [HADES][TEST ] Testing + ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 920686221] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 921628218] Running +.one_item: 42 + +[Hera] [HADES][ERROR] [KRELTSC: 922460868] +: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 923201664] Expected error occurred +[Hera] [HADES][TEST ] Testing + ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 924629181] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 925499505] +: 8 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 926639637] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 927654693] Testing word: - +[Hera] [HADES][TEST ] [KRELTSC: 928364514] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 929111085] Running -.basic: 10 3 - . CR +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 930173496] Test passed +[Hera] [HADES][TEST ] Testing - ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 931460208] Expected: Should print: 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 933619386] Running -.zero_sub: 42 0 - . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 934729068] Test passed +[Hera] [HADES][TEST ] Testing - ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 936003852] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 938320320] Running -.from_zero: 0 5 - . CR +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 939533532] Test passed +[Hera] [HADES][TEST ] Testing - ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 940819992] Expected: Should print: -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 943011699] Running -.negative: 5 -3 - . CR +[Hera] 8 +[Hera] [HADES][TEST ] [KRELTSC: 944053719] Test passed +[Hera] [HADES][TEST ] Testing - ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 945346416] Expected: Should print: 8 +[Hera] 8 +[Hera] 8 +[Hera] 8 +[Hera] 8 +[Hera] 8 +[Hera] [HADES][TEST ] [KRELTSC: 947570736] Running -.same_values: 42 42 - . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 948779223] Test passed +[Hera] [HADES][TEST ] Testing - ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 950119023] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 952606578] Running -.overflow: -2147483648 1 - . CR +[Hera] -2147483649 +[Hera] [HADES][TEST ] [KRELTSC: 953920086] Test passed +[Hera] [HADES][TEST ] Testing - ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 955217046] Expected: Should underflow +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] [HADES][TEST ] [KRELTSC: 957816930] Running -.underflow: 2147483647 -1 - . CR +[Hera] 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 958987470] Test passed +[Hera] [HADES][TEST ] Testing - ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 960271998] Expected: Should overflow +[Hera] 2147483648 +[Hera] [HADES][INFO ] [KRELTSC: 961410660] L8[TABLE]: Config 18 → 19 regime=2 score=26214 L1=0 L2=0 L3=1 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 963930114] Running -.empty_stack: - +[Hera] [HADES][ERROR] [KRELTSC: 965167182] -: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 965845650] Expected error occurred +[Hera] [HADES][TEST ] Testing - ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 967154223] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 967991577] Running -.one_item: 42 - +[Hera] [HADES][ERROR] [KRELTSC: 968839536] -: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 969508638] Expected error occurred +[Hera] [HADES][TEST ] Testing - ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 970928616] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 971769204] -: 9 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 972646374] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 973665084] Testing word: * +[Hera] [HADES][TEST ] [KRELTSC: 974310855] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 975068346] Running *.basic: 6 7 * . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 976325469] Test passed +[Hera] [HADES][TEST ] Testing * ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 977926572] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 980240142] Running *.by_zero: 42 0 * . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 981332520] Test passed +[Hera] [HADES][TEST ] Testing * ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 982677486] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 984908904] Running *.by_one: 42 1 * . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 985996347] Test passed +[Hera] [HADES][TEST ] Testing * ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 987303912] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 989739954] Running *.by_negative: 6 -7 * . CR +[Hera] -42 +[Hera] [HADES][TEST ] [KRELTSC: 990872652] Test passed +[Hera] [HADES][TEST ] Testing * ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 992192943] Expected: Should print: -42 +[Hera] -42 +[Hera] -42 +[Hera] -42 +[Hera] -42 +[Hera] -42 +[Hera] [HADES][TEST ] [KRELTSC: 994558635] Running *.negative_negative: -6 -7 * . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 995765022] Test passed +[Hera] [HADES][TEST ] Testing * ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 997094175] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 999422403] Running *.large_numbers: 32767 2 * . CR +[Hera] 65534 +[Hera] [HADES][TEST ] [KRELTSC: 1000642083] Test passed +[Hera] [HADES][TEST ] Testing * ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1002189342] Expected: Should print: 65534 +[Hera] 65534 +[Hera] 65534 +[Hera] 65534 +[Hera] 65534 +[Hera] 65534 +[Hera] [HADES][TEST ] [KRELTSC: 1004622192] Running *.overflow: 65536 65536 * . CR +[Hera] 4294967296 +[Hera] [HADES][TEST ] [KRELTSC: 1005856782] Test passed +[Hera] [HADES][TEST ] Testing * ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1007161449] Expected: May overflow +[Hera] 4294967296 +[Hera] 4294967296 +[Hera] 4294967296 +[Hera] 4294967296 +[Hera] 4294967296 +[Hera] [HADES][TEST ] [KRELTSC: 1009719711] Running *.empty_stack: * +[Hera] [HADES][ERROR] [KRELTSC: 1010587599] *: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1011375456] Expected error occurred +[Hera] [HADES][TEST ] Testing * ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1012743942] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1013650596] Running *.one_item: 42 * +[Hera] [HADES][ERROR] [KRELTSC: 1014702780] *: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1015435869] Expected error occurred +[Hera] [HADES][TEST ] Testing * ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1016834742] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1017723567] *: 9 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1018603614] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 1019622114] Testing word: / +[Hera] [HADES][TEST ] [KRELTSC: 1020265512] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1021051542] Running /.basic: 15 3 / . CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 1022152740] Test passed +[Hera] [HADES][TEST ] Testing / ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1023431850] Expected: Should print: 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] [HADES][INFO ] [KRELTSC: 1025175732] L8[TABLE]: Config 19 → 20 regime=2 score=26214 L1=0 L2=0 L3=1 +[Hera] 5 +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 1027062561] Running /.by_one: 42 1 / . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 1028153280] Test passed +[Hera] [HADES][TEST ] Testing / ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1029477876] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 1031735229] Running /.negative_dividend: -15 3 / . CR +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 1032909318] Test passed +[Hera] [HADES][TEST ] Testing / ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1034208210] Expected: Should print: -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 1036488348] Running /.negative_divisor: 15 -3 / . CR +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 1037665860] Test passed +[Hera] [HADES][TEST ] Testing / ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1039015488] Expected: Should print: -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 1041578097] Running /.both_negative: -15 -3 / . CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 1042698993] Test passed +[Hera] [HADES][TEST ] Testing / ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1043937951] Expected: Should print: 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 1046132472] Running /.truncation: 7 3 / . CR +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 1047215337] Test passed +[Hera] [HADES][TEST ] Testing / ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1048557468] Expected: Should print: 2 (truncated) +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 1050914340] Running /.by_zero: 42 0 / +[Hera] [HADES][ERROR] [KRELTSC: 1051773870] /: Division by zero +[Hera] [HADES][TEST ] [KRELTSC: 1052738274] Expected error occurred +[Hera] [HADES][TEST ] Testing / ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1054161780] Expected: Should cause division by zero +[Hera] [HADES][TEST ] [KRELTSC: 1055268795] Running /.empty_stack: / +[Hera] [HADES][ERROR] [KRELTSC: 1056327909] /: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1057060998] Expected error occurred +[Hera] [HADES][TEST ] Testing / ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1058461761] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1059336411] Running /.one_item: 42 / +[Hera] [HADES][ERROR] [KRELTSC: 1060129812] /: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1060857483] Expected error occurred +[Hera] [HADES][TEST ] Testing / ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1062202218] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1063069917] /: 9 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1063893915] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 1065301797] Testing word: MOD +[Hera] [HADES][TEST ] [KRELTSC: 1065971067] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1066755039] Running MOD.basic: 17 5 MOD . CR +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 1068262083] Test passed +[Hera] [HADES][TEST ] Testing MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1069758102] Expected: Should print: 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 1072208172] Running MOD.exact_division: 15 3 MOD . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1073439339] Test passed +[Hera] [HADES][TEST ] Testing MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1074764229] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1077072528] Running MOD.by_one: 42 1 MOD . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1078547442] Test passed +[Hera] [HADES][TEST ] Testing MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1079893248] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1082201904] Running MOD.negative_dividend: -17 5 MOD . CR +[Hera] [HADES][INFO ] [KRELTSC: 1083224163] L8[TABLE]: Config 20 → 21 regime=2 score=26214 L1=0 L2=0 L3=1 +[Hera] -2 +[Hera] [HADES][TEST ] [KRELTSC: 1084847904] Test passed +[Hera] [HADES][TEST ] Testing MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1086206310] Expected: Should handle negative +[Hera] -2 +[Hera] -2 +[Hera] -2 +[Hera] -2 +[Hera] -2 +[Hera] [HADES][TEST ] [KRELTSC: 1088675406] Running MOD.negative_divisor: 17 -5 MOD . CR +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 1090067349] Test passed +[Hera] [HADES][TEST ] Testing MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1091273148] Expected: Should handle negative +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 1093581930] Running MOD.small_by_large: 3 7 MOD . CR +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 1094764461] Test passed +[Hera] [HADES][TEST ] Testing MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1096103841] Expected: Should print: 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 1098676383] Running MOD.by_zero: 42 0 MOD +[Hera] [HADES][ERROR] [KRELTSC: 1099708155] MOD: Division by zero +[Hera] [HADES][TEST ] [KRELTSC: 1100484420] Expected error occurred +[Hera] [HADES][TEST ] Testing MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1101875460] Expected: Should cause division by zero +[Hera] [HADES][TEST ] [KRELTSC: 1103061120] Running MOD.empty_stack: MOD +[Hera] [HADES][ERROR] [KRELTSC: 1103951688] MOD: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1104739230] Expected error occurred +[Hera] [HADES][TEST ] Testing MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1106171535] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1107066240] Running MOD.one_item: 42 MOD +[Hera] [HADES][ERROR] [KRELTSC: 1107899709] MOD: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1108752435] Expected error occurred +[Hera] [HADES][TEST ] Testing MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1110177285] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1111086165] MOD: 9 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1112023353] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 1113314643] Testing word: /MOD +[Hera] [HADES][TEST ] [KRELTSC: 1114226925] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1115349942] Running /MOD.basic: 17 5 /MOD . . CR +[Hera] 3 2 +[Hera] [HADES][TEST ] [KRELTSC: 1116838527] Test passed +[Hera] [HADES][TEST ] Testing /MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1118147751] Expected: Should print: 3 2 +[Hera] 3 2 +[Hera] 3 2 +[Hera] 3 2 +[Hera] 3 2 +[Hera] 3 2 +[Hera] [HADES][TEST ] [KRELTSC: 1120522074] Running /MOD.exact: 15 3 /MOD . . CR +[Hera] 5 0 +[Hera] [HADES][TEST ] [KRELTSC: 1121679111] Test passed +[Hera] [HADES][TEST ] Testing /MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1122986424] Expected: Should print: 5 0 +[Hera] 5 0 +[Hera] 5 0 +[Hera] 5 0 +[Hera] 5 0 +[Hera] 5 0 +[Hera] [HADES][TEST ] [KRELTSC: 1125433386] Running /MOD.negative: -17 5 /MOD . . CR +[Hera] -3 -2 +[Hera] [HADES][TEST ] [KRELTSC: 1126681668] Test passed +[Hera] [HADES][TEST ] Testing /MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1128343062] Expected: Should handle negative dividend +[Hera] -3 -2 +[Hera] -3 -2 +[Hera] -3 -2 +[Hera] -3 -2 +[Hera] -3 -2 +[Hera] [HADES][TEST ] [KRELTSC: 1130983623] Running /MOD.by_zero: 42 0 /MOD +[Hera] [HADES][ERROR] [KRELTSC: 1131945738] /MOD: Division by zero +[Hera] [HADES][TEST ] [KRELTSC: 1132720029] Expected error occurred +[Hera] [HADES][TEST ] Testing /MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1134119826] Expected: Should cause division by zero +[Hera] [HADES][TEST ] [KRELTSC: 1134957117] Running /MOD.empty_stack: /MOD +[Hera] [HADES][ERROR] [KRELTSC: 1135814568] /MOD: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1136572374] Expected error occurred +[Hera] [HADES][TEST ] Testing /MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1137908919] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1138764984] Running /MOD.one_item: 42 /MOD +[Hera] [HADES][ERROR] [KRELTSC: 1139575710] /MOD: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1140479256] Expected error occurred +[Hera] [HADES][TEST ] Testing /MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1141917798] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1143006102] /MOD: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1144016412] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 1145063367] Testing word: ABS +[Hera] [HADES][TEST ] [KRELTSC: 1145759517] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1146484185] Running ABS.positive: 42 ABS . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 1147839609] Test passed +[Hera] [HADES][TEST ] Testing ABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1149184701] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 1151384367] Running ABS.negative: -42 ABS . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 1152528405] Test passed +[Hera] [HADES][TEST ] Testing ABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1154024991] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 [HADES][INFO ] [KRELTSC: 1156341711] L8[TABLE]: Config 21 → 22 regime=2 score=26214 L1=0 L2=0 L3=1 + +[Hera] [HADES][TEST ] [KRELTSC: 1157575104] Running ABS.zero: 0 ABS . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1158680250] Test passed +[Hera] [HADES][TEST ] Testing ABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1159988991] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1162123830] Running ABS.min_int: -2147483648 ABS . CR +[Hera] 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 1163362179] Test passed +[Hera] [HADES][TEST ] Testing ABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1164640155] Expected: Should print: 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 1167534774] Running ABS.empty_stack: ABS +[Hera] [HADES][ERROR] [KRELTSC: 1168360641] ABS: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1169098455] Expected error occurred +[Hera] [HADES][TEST ] Testing ABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1170453354] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1171328025] ABS: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1172190537] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 1173177873] Testing word: NEGATE +[Hera] [HADES][TEST ] [KRELTSC: 1173876522] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1174663308] Running NEGATE.positive: 42 NEGATE . CR +[Hera] -42 +[Hera] [HADES][TEST ] [KRELTSC: 1175969718] Test passed +[Hera] [HADES][TEST ] Testing NEGATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1177299417] Expected: Should print: -42 +[Hera] -42 +[Hera] -42 +[Hera] -42 +[Hera] -42 +[Hera] -42 +[Hera] [HADES][TEST ] [KRELTSC: 1179660468] Running NEGATE.negative: -42 NEGATE . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 1180792830] Test passed +[Hera] [HADES][TEST ] Testing NEGATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1182110853] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 1184265264] Running NEGATE.zero: 0 NEGATE . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1185391872] Test passed +[Hera] [HADES][TEST ] Testing NEGATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1186702062] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1188856452] Running NEGATE.min_int: -2147483648 NEGATE . CR +[Hera] 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 1190163114] Test passed +[Hera] [HADES][TEST ] Testing NEGATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1191686496] Expected: Should print: 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 1194268929] Running NEGATE.empty_stack: NEGATE +[Hera] [HADES][ERROR] [KRELTSC: 1195207881] NEGATE: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1195971756] Expected error occurred +[Hera] [HADES][TEST ] Testing NEGATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1197346353] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1198232574] NEGATE: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1199182572] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 1200254601] Testing word: MIN +[Hera] [HADES][TEST ] [KRELTSC: 1200966186] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1201725336] Running MIN.basic: 5 3 MIN . CR +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 1203196344] Test passed +[Hera] [HADES][TEST ] Testing MIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1204500906] Expected: Should print: 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 1206780687] Running MIN.equal: 42 42 MIN . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 1207879239] Test passed +[Hera] [HADES][TEST ] Testing MIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1209173511] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 1211360241] Running MIN.negative: -5 -3 MIN . CR +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 1212527085] Test passed +[Hera] [HADES][TEST ] Testing MIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1213782234] Expected: Should print: -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 1216162941] Running MIN.mixed: -1 1 MIN . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1217242740] Test passed +[Hera] [HADES][TEST ] Testing MIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1218533568] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 [HADES][INFO ] [KRELTSC: 1220272452] L8[TABLE]: Config 22 → 23 regime=2 score=52428 L1=0 L2=0 L3=1 + +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1221842685] Running MIN.one_item: 42 MIN +[Hera] [HADES][ERROR] [KRELTSC: 1222692324] MIN: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1223407269] Expected error occurred +[Hera] [HADES][TEST ] Testing MIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1224866223] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1225728357] Running MIN.empty_stack: MIN +[Hera] [HADES][ERROR] [KRELTSC: 1226518482] MIN: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1227202263] Expected error occurred +[Hera] [HADES][TEST ] Testing MIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1228773777] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1229697714] MIN: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1230581373] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 1231588533] Testing word: MAX +[Hera] [HADES][TEST ] [KRELTSC: 1232308140] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1233025899] Running MAX.basic: 5 3 MAX . CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 1234312002] Test passed +[Hera] [HADES][TEST ] Testing MAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1235627148] Expected: Should print: 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 1237854072] Running MAX.equal: 42 42 MAX . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 1238967030] Test passed +[Hera] [HADES][TEST ] Testing MAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1240226085] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 1242686781] Running MAX.negative: -5 -3 MAX . CR +[Hera] -3 +[Hera] [HADES][TEST ] [KRELTSC: 1243803183] Test passed +[Hera] [HADES][TEST ] Testing MAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1245098526] Expected: Should print: -3 +[Hera] -3 +[Hera] -3 +[Hera] -3 +[Hera] -3 +[Hera] -3 +[Hera] [HADES][TEST ] [KRELTSC: 1247383011] Running MAX.mixed: -1 1 MAX . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 1248486645] Test passed +[Hera] [HADES][TEST ] Testing MAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1249778019] Expected: Should print: 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 1251942384] Running MAX.one_item: 42 MAX +[Hera] [HADES][ERROR] [KRELTSC: 1252759725] MAX: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1253658105] Expected error occurred +[Hera] [HADES][TEST ] Testing MAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1255061367] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1255958802] Running MAX.empty_stack: MAX +[Hera] [HADES][ERROR] [KRELTSC: 1256810961] MAX: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1257538653] Expected error occurred +[Hera] [HADES][TEST ] Testing MAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1258836285] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1259685168] MAX: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1260568785] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 1261573866] Testing word: 1+ +[Hera] [HADES][TEST ] [KRELTSC: 1262271234] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1262982798] Running 1+.basic: 5 1+ . CR +[Hera] 6 +[Hera] [HADES][TEST ] [KRELTSC: 1264072824] Test passed +[Hera] [HADES][TEST ] Testing 1+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1265360817] Expected: Should print: 6 +[Hera] 6 +[Hera] 6 +[Hera] 6 +[Hera] 6 +[Hera] 6 +[Hera] [HADES][TEST ] [KRELTSC: 1267719369] Running 1+.zero: 0 1+ . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 1268780058] Test passed +[Hera] [HADES][TEST ] Testing 1+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1270081386] Expected: Should print: 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 1272250287] Running 1+.negative: -1 1+ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1273274835] Test passed +[Hera] [HADES][TEST ] Testing 1+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1274547729] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1276754157] Running 1+.chain: 3 1+ 1+ 1+ . CR +[Hera] 6 +[Hera] [HADES][TEST ] [KRELTSC: 1277853108] Test passed +[Hera] [HADES][TEST ] Testing 1+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1279335813] Expected: Should print: 6 +[Hera] 6 +[Hera] 6 +[Hera] 6 +[Hera] 6 +[Hera] 6 +[Hera] [HADES][TEST ] [KRELTSC: 1281586845] Running 1+.overflow: 2147483647 1+ . CR +[Hera] 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 1282793799] Test passed +[Hera] [HADES][TEST ] Testing 1+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1284111990] Expected: Should overflow +[Hera] 2147483648 +[Hera] 2147483648 [HADES][INFO ] [KRELTSC: 1285595850] L8[TABLE]: Config 23 → 24 regime=2 score=6553 L1=0 L2=0 L3=1 + +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 1287626697] Running 1+.empty_stack: 1+ +[Hera] [HADES][ERROR] [KRELTSC: 1288473039] 1+: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1289178135] Expected error occurred +[Hera] [HADES][TEST ] Testing 1+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1290536037] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1291653132] 1+: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1292549622] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 1293580869] Testing word: 1- +[Hera] [HADES][TEST ] [KRELTSC: 1294242831] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1294954563] Running 1-.basic: 5 1- . CR +[Hera] 4 +[Hera] [HADES][TEST ] [KRELTSC: 1296128988] Test passed +[Hera] [HADES][TEST ] Testing 1- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1297445436] Expected: Should print: 4 +[Hera] 4 +[Hera] 4 +[Hera] 4 +[Hera] 4 +[Hera] 4 +[Hera] [HADES][TEST ] [KRELTSC: 1299698610] Running 1-.to_zero: 1 1- . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1300758816] Test passed +[Hera] [HADES][TEST ] Testing 1- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1302036372] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1304348892] Running 1-.to_negative: 0 1- . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1305439107] Test passed +[Hera] [HADES][TEST ] Testing 1- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1306704063] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1308933675] Running 1-.chain: 6 1- 1- 1- . CR +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 1309996842] Test passed +[Hera] [HADES][TEST ] Testing 1- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1311278892] Expected: Should print: 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 1313560059] Running 1-.underflow: -2147483648 1- . CR +[Hera] -2147483649 +[Hera] [HADES][TEST ] [KRELTSC: 1314851118] Test passed +[Hera] [HADES][TEST ] Testing 1- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1316212947] Expected: Should underflow +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] [HADES][TEST ] [KRELTSC: 1318901682] Running 1-.empty_stack: 1- +[Hera] [HADES][ERROR] [KRELTSC: 1319730132] 1-: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1320491487] Expected error occurred +[Hera] [HADES][TEST ] Testing 1- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1321816755] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1322718789] 1-: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1323604044] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 1324638063] Testing word: 2+ +[Hera] [HADES][TEST ] [KRELTSC: 1325353113] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1326068142] Running 2+.basic: 5 2+ . CR +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 1327252983] Test passed +[Hera] [HADES][TEST ] Testing 2+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1328521488] Expected: Should print: 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 1330898121] Running 2+.zero: 0 2+ . CR +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 1331957487] Test passed +[Hera] [HADES][TEST ] Testing 2+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1333232019] Expected: Should print: 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 1335380277] Running 2+.negative: -3 2+ . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1336477002] Test passed +[Hera] [HADES][TEST ] Testing 2+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1337811090] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1340125332] Running 2+.empty_stack: 2+ +[Hera] [HADES][ERROR] [KRELTSC: 1340956008] 2+: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1341881205] Expected error occurred +[Hera] [HADES][TEST ] Testing 2+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1343258805] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1344141771] 2+: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1345032969] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 1346059386] Testing word: 2- +[Hera] [HADES][TEST ] [KRELTSC: 1346761479] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1347495513] Running 2-.basic: 7 2- . CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 1348733841] Test passed +[Hera] [HADES][TEST ] Testing 2- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1349996844] Expected: Should print: 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 1352166753] Running 2-.zero: 2 2- . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1353148461] Test passed +[Hera] [HADES][TEST ] Testing 2- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1354603131] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][INFO ] [KRELTSC: 1356008850] L8[TABLE]: Config 24 → 25 regime=2 score=6553 L1=0 L2=0 L3=1 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1357941648] Running 2-.negative: 0 2- . CR +[Hera] -2 +[Hera] [HADES][TEST ] [KRELTSC: 1358992677] Test passed +[Hera] [HADES][TEST ] Testing 2- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1360256142] Expected: Should print: -2 +[Hera] -2 +[Hera] -2 +[Hera] -2 +[Hera] -2 +[Hera] -2 +[Hera] [HADES][TEST ] [KRELTSC: 1362528279] Running 2-.empty_stack: 2- +[Hera] [HADES][ERROR] [KRELTSC: 1363350891] 2-: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1364119638] Expected error occurred +[Hera] [HADES][TEST ] Testing 2- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1365503370] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1366340514] 2-: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1367340954] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 1368426381] Testing word: 2* +[Hera] [HADES][TEST ] [KRELTSC: 1369136055] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1369865070] Running 2*.basic: 5 2* . CR +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 1371071751] Test passed +[Hera] [HADES][TEST ] Testing 2* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1372361760] Expected: Should print: 10 +[Hera] 10 +[Hera] 10 +[Hera] 10 +[Hera] 10 +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 1374589125] Running 2*.zero: 0 2* . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1375681398] Test passed +[Hera] [HADES][TEST ] Testing 2* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1376958051] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1379362593] Running 2*.negative: -3 2* . CR +[Hera] -6 +[Hera] [HADES][TEST ] [KRELTSC: 1380434307] Test passed +[Hera] [HADES][TEST ] Testing 2* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1381741977] Expected: Should print: -6 +[Hera] -6 +[Hera] -6 +[Hera] -6 +[Hera] -6 +[Hera] -6 +[Hera] [HADES][TEST ] [KRELTSC: 1383976335] Running 2*.one: 1 2* . CR +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 1384978392] Test passed +[Hera] [HADES][TEST ] Testing 2* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1386245091] Expected: Should print: 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 1388386461] Running 2*.large: 1073741823 2* . CR +[Hera] 2147483646 +[Hera] [HADES][TEST ] [KRELTSC: 1389585960] Test passed +[Hera] [HADES][TEST ] Testing 2* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1390882143] Expected: Should print: 2147483646 +[Hera] 2147483646 +[Hera] 2147483646 +[Hera] 2147483646 +[Hera] 2147483646 +[Hera] 2147483646 +[Hera] [HADES][TEST ] [KRELTSC: 1393580643] Running 2*.empty_stack: 2* +[Hera] [HADES][ERROR] [KRELTSC: 1394455125] 2*: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1395204195] Expected error occurred +[Hera] [HADES][TEST ] Testing 2* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1396634148] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1397495757] 2*: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1398387564] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 1399400016] Testing word: 2/ +[Hera] [HADES][TEST ] [KRELTSC: 1400105994] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1400857941] Running 2/.basic: 10 2/ . CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 1402078440] Test passed +[Hera] [HADES][TEST ] Testing 2/ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1403344383] Expected: Should print: 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 1405689054] Running 2/.odd: 7 2/ . CR +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 1406689305] Test passed +[Hera] [HADES][TEST ] Testing 2/ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1407978873] Expected: Should print: 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 1410167934] Running 2/.zero: 0 2/ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1411245633] Test passed +[Hera] [HADES][TEST ] Testing 2/ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1412560170] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1414697865] Running 2/.negative_even: -10 2/ . CR +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 1415839887] Test passed +[Hera] [HADES][TEST ] Testing 2/ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1417358418] Expected: Should print: -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 1420073256] Running 2/.one: 1 2/ . CR +[Hera] [HADES][INFO ] [KRELTSC: 1421124852] L8[TABLE]: Config 25 → 26 regime=2 score=6553 L1=0 L2=0 L3=1 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1422794541] Test passed +[Hera] [HADES][TEST ] Testing 2/ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1424381952] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1427069658] Running 2/.empty_stack: 2/ +[Hera] [HADES][ERROR] [KRELTSC: 1428134106] 2/: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1429043805] Expected error occurred +[Hera] [HADES][TEST ] Testing 2/ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1430994075] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1432090212] 2/: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1433196702] === Arithmetic Words Summary: 0 passed, 0 failed, 0 skipped, 0 +[Hera] [HADES][INFO ] [KRELTSC: 1434498198] +[Hera] === Testing Module: Logical Words === +[Hera] [HADES][INFO ] [KRELTSC: 1435845138] Running Logical Words Tests (Module 8)... +[Hera] [HADES][TEST ] [KRELTSC: 1436965236] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 1438266144] Testing word: AND +[Hera] [HADES][TEST ] [KRELTSC: 1439125401] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1440058725] Running AND.both_true: -1 -1 AND . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1441505856] Test passed +[Hera] [HADES][TEST ] Testing AND ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1443283863] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1446094251] Running AND.first_false: 0 -1 AND . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1447359102] Test passed +[Hera] [HADES][TEST ] Testing AND ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1448663349] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1450791363] Running AND.second_false: -1 0 AND . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1451933196] Test passed +[Hera] [HADES][TEST ] Testing AND ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1453179273] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1455565902] Running AND.both_false: 0 0 AND . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1456696542] Test passed +[Hera] [HADES][TEST ] Testing AND ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1458024141] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1460191971] Running AND.bitwise: 85 51 AND . CR +[Hera] 17 +[Hera] [HADES][TEST ] [KRELTSC: 1461296487] Test passed +[Hera] [HADES][TEST ] Testing AND ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1462675746] Expected: Should print: 17 +[Hera] 17 +[Hera] 17 +[Hera] 17 +[Hera] 17 +[Hera] 17 +[Hera] [HADES][TEST ] [KRELTSC: 1464891330] Running AND.empty_stack: AND +[Hera] [HADES][ERROR] [KRELTSC: 1465755753] AND: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1466510913] Expected error occurred +[Hera] [HADES][TEST ] Testing AND ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1468077429] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1468942755] Running AND.one_item: 42 AND +[Hera] [HADES][ERROR] [KRELTSC: 1469762805] AND: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1470457800] Expected error occurred +[Hera] [HADES][TEST ] Testing AND ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1471881075] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1472800140] AND: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1473799026] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 1474719498] Testing word: OR +[Hera] [HADES][TEST ] [KRELTSC: 1475348805] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1476020868] Running OR.both_true: -1 -1 OR . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1477211589] Test passed +[Hera] [HADES][TEST ] Testing OR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1478443197] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1480834845] Running OR.first_false: 0 -1 OR . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1481994066] Test passed +[Hera] [HADES][TEST ] Testing OR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1483308624] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1485495312] Running OR.second_false: -1 0 OR . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1486598883] Test passed +[Hera] [HADES][TEST ] Testing OR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1487863650] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][INFO ] [KRELTSC: 1489548375] L8[TABLE]: Config 26 → 27 regime=2 score=6553 L1=0 L2=0 L3=1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1491261471] Running OR.both_false: 0 0 OR . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1492557549] Test passed +[Hera] [HADES][TEST ] Testing OR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1493834685] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1496038320] Running OR.bitwise: 85 51 OR . CR +[Hera] 119 +[Hera] [HADES][TEST ] [KRELTSC: 1497193467] Test passed +[Hera] [HADES][TEST ] Testing OR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1498534338] Expected: Should print: 119 +[Hera] 119 +[Hera] 119 +[Hera] 119 +[Hera] 119 +[Hera] 119 +[Hera] [HADES][TEST ] [KRELTSC: 1500822036] Running OR.empty_stack: OR +[Hera] [HADES][ERROR] [KRELTSC: 1501706787] OR: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1502454030] Expected error occurred +[Hera] [HADES][TEST ] Testing OR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1503892719] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1504817748] Running OR.one_item: 42 OR +[Hera] [HADES][ERROR] [KRELTSC: 1505877492] OR: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1506659448] Expected error occurred +[Hera] [HADES][TEST ] Testing OR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1507991184] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1508861697] OR: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1509713940] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 1510708164] Testing word: XOR +[Hera] [HADES][TEST ] [KRELTSC: 1511443584] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1512195741] Running XOR.both_true: -1 -1 XOR . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1513565046] Test passed +[Hera] [HADES][TEST ] Testing XOR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1514842665] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1517168415] Running XOR.first_false: 0 -1 XOR . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1518799926] Test passed +[Hera] [HADES][TEST ] Testing XOR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1520396682] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1523203584] Running XOR.second_false: -1 0 XOR . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1524637422] Test passed +[Hera] [HADES][TEST ] Testing XOR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1526258538] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1529054226] Running XOR.both_false: 0 0 XOR . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1530612720] Test passed +[Hera] [HADES][TEST ] Testing XOR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1532276991] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1535012094] Running XOR.bitwise: 85 51 XOR . CR +[Hera] 102 +[Hera] [HADES][TEST ] [KRELTSC: 1536411471] Test passed +[Hera] [HADES][TEST ] Testing XOR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1538037144] Expected: Should print: 102 +[Hera] 102 +[Hera] 102 +[Hera] 102 +[Hera] 102 +[Hera] 102 +[Hera] [HADES][TEST ] [KRELTSC: 1540807863] Running XOR.empty_stack: XOR +[Hera] [HADES][ERROR] [KRELTSC: 1541870694] XOR: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1542919623] Expected error occurred +[Hera] [HADES][TEST ] Testing XOR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1544652228] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1545722976] Running XOR.one_item: 42 XOR +[Hera] [HADES][ERROR] [KRELTSC: 1546761426] XOR: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1547617029] Expected error occurred +[Hera] [HADES][TEST ] Testing XOR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1549306290] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1550387811] XOR: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1551539703] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 1552843488] Testing word: NOT +[Hera] [HADES][TEST ] [KRELTSC: 1553688591] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1554641592] Running NOT.true: -1 NOT . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1556299290] Test passed +[Hera] [HADES][TEST ] Testing NOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1557944220] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1560655509] Running NOT.false: 0 NOT . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1561973112] Test passed +[Hera] [HADES][TEST ] Testing NOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1563518670] Expected: Should print: -1 +[Hera] [HADES][INFO ] [KRELTSC: 1564602375] L8[TABLE]: Config 27 → 28 regime=2 score=6553 L1=0 L2=0 L3=1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1567959120] Running NOT.positive: 42 NOT . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1569321894] Test passed +[Hera] [HADES][TEST ] Testing NOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1570938957] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1573612635] Running NOT.negative: -42 NOT . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1575004116] Test passed +[Hera] [HADES][TEST ] Testing NOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1576636278] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1579339125] Running NOT.empty_stack: NOT +[Hera] [HADES][ERROR] [KRELTSC: 1580537931] NOT: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1581474363] Expected error occurred +[Hera] [HADES][TEST ] Testing NOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1583203839] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1584311127] NOT: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1585410540] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 1586702082] Testing word: = +[Hera] [HADES][TEST ] [KRELTSC: 1587546597] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1588461798] Running =.equal: 42 42 = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1589822598] Test passed +[Hera] [HADES][TEST ] Testing = ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1591431198] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1593959073] Running =.not_equal: 42 43 = . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1595055987] Test passed +[Hera] [HADES][TEST ] Testing = ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1596351771] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1598467080] Running =.zero_equal: 0 0 = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1599730734] Test passed +[Hera] [HADES][TEST ] Testing = ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1601308842] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1604166669] Running =.negative_equal: -42 -42 = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1605836799] Test passed +[Hera] [HADES][TEST ] Testing = ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1607344200] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1610080584] Running =.negative_positive: -42 42 = . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1611541155] Test passed +[Hera] [HADES][TEST ] Testing = ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1613129637] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1615331298] Running =.empty_stack: = +[Hera] [HADES][ERROR] [KRELTSC: 1616187510] =: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1616923308] Expected error occurred +[Hera] [HADES][TEST ] Testing = ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1618531383] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1619430414] Running =.one_item: 42 = +[Hera] [HADES][ERROR] [KRELTSC: 1620218922] =: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1620907764] Expected error occurred +[Hera] [HADES][TEST ] Testing = ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1622266905] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1623149682] =: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1624021098] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 1625082900] Testing word: <> +[Hera] [HADES][TEST ] [KRELTSC: 1625765757] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1626558150] Running <>.not_equal: 42 43 <> . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1627914036] Test passed +[Hera] [HADES][TEST ] Testing <> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1629275508] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1631597268] Running <>.equal: 42 42 <> . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1632774612] Test passed +[Hera] [HADES][TEST ] Testing <> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1634072937] Expected: Should print: 0 +[Hera] [HADES][INFO ] [KRELTSC: 1634945970] L8[TABLE]: Config 28 → 29 regime=2 score=6553 L1=0 L2=0 L3=1 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1637605032] Running <>.zero_equal: 0 0 <> . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1638697620] Test passed +[Hera] [HADES][TEST ] Testing <> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1640025093] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1642273878] Running <>.negative: -42 42 <> . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1643620524] Test passed +[Hera] [HADES][TEST ] Testing <> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1644925254] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1647198420] Running <>.empty_stack: <> +[Hera] [HADES][ERROR] [KRELTSC: 1648046022] <>: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1648835286] Expected error occurred +[Hera] [HADES][TEST ] Testing <> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1650281367] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1651210470] Running <>.one_item: 42 <> +[Hera] [HADES][ERROR] [KRELTSC: 1652090559] <>: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1652812077] Expected error occurred +[Hera] [HADES][TEST ] Testing <> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1654231929] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1655142972] <>: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1656235749] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 1657287996] Testing word: < +[Hera] [HADES][TEST ] [KRELTSC: 1657960878] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1658700078] Running <.less_than: 5 7 < . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1659994917] Test passed +[Hera] [HADES][TEST ] Testing < ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1661276568] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1663498956] Running <.greater_than: 7 5 < . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1664691630] Test passed +[Hera] [HADES][TEST ] Testing < ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1666044786] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1668462432] Running <.equal: 5 5 < . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1669649226] Test passed +[Hera] [HADES][TEST ] Testing < ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1670965254] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1673202321] Running <.negative_positive: -5 5 < . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1674402996] Test passed +[Hera] [HADES][TEST ] Testing < ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1675670808] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1677927909] Running <.negative_negative: -7 -5 < . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1679114598] Test passed +[Hera] [HADES][TEST ] Testing < ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1680424557] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1683092061] Running <.empty_stack: < +[Hera] [HADES][ERROR] [KRELTSC: 1683963078] <: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1684753287] Expected error occurred +[Hera] [HADES][TEST ] Testing < ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1686192564] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1687122150] Running <.one_item: 42 < +[Hera] [HADES][ERROR] [KRELTSC: 1687915152] <: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1688643390] Expected error occurred +[Hera] [HADES][TEST ] Testing < ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1690044846] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1690938690] <: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1691849481] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 1692922707] Testing word: > +[Hera] [HADES][TEST ] [KRELTSC: 1693761321] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1694524356] Running >.greater_than: 7 5 > . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1695894963] Test passed +[Hera] [HADES][TEST ] Testing > ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1697212713] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][INFO ] [KRELTSC: 1698711588] L8[TABLE]: Config 29 → 30 regime=2 score=6553 L1=0 L2=0 L3=1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1700773368] Running >.less_than: 5 7 > . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1701938868] Test passed +[Hera] [HADES][TEST ] Testing > ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1703224425] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1705484823] Running >.equal: 5 5 > . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1706899614] Test passed +[Hera] [HADES][TEST ] Testing > ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1708195419] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1710403422] Running >.positive_negative: 5 -5 > . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1711544982] Test passed +[Hera] [HADES][TEST ] Testing > ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1712820669] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1715040579] Running >.negative_negative: -5 -7 > . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1716224139] Test passed +[Hera] [HADES][TEST ] Testing > ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1717521078] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1719957645] Running >.empty_stack: > +[Hera] [HADES][ERROR] [KRELTSC: 1720791576] >: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1721516769] Expected error occurred +[Hera] [HADES][TEST ] Testing > ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1722862638] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1723712067] Running >.one_item: 42 > +[Hera] [HADES][ERROR] [KRELTSC: 1724489403] >: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1725197544] Expected error occurred +[Hera] [HADES][TEST ] Testing > ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1726558617] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1727431734] >: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1728309975] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 1729377426] Testing word: 0= +[Hera] [HADES][TEST ] [KRELTSC: 1730076390] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1730860593] Running 0=.zero: 0 0= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1732189326] Test passed +[Hera] [HADES][TEST ] Testing 0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1733516610] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1735739418] Running 0=.positive: 42 0= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1736870961] Test passed +[Hera] [HADES][TEST ] Testing 0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1738175691] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1740376197] Running 0=.negative: -42 0= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1741484262] Test passed +[Hera] [HADES][TEST ] Testing 0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1743022218] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1745535414] Running 0=.empty_stack: 0= +[Hera] [HADES][ERROR] [KRELTSC: 1746359958] 0=: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1747111296] Expected error occurred +[Hera] [HADES][TEST ] Testing 0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1748466699] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1749391035] 0=: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1750309428] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 1751373687] Testing word: 0< +[Hera] [HADES][TEST ] [KRELTSC: 1752066603] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1752807168] Running 0<.negative: -42 0< . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1754041737] Test passed +[Hera] [HADES][TEST ] Testing 0< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1755291426] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1757751723] Running 0<.zero: 0 0< . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1758848784] Test passed +[Hera] [HADES][TEST ] Testing 0< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1760148075] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][INFO ] [KRELTSC: 1762071402] L8[TABLE]: Config 30 → 31 regime=2 score=6553 L1=0 L2=0 L3=1 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1763456814] Running 0<.positive: 42 0< . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1764559251] Test passed +[Hera] [HADES][TEST ] Testing 0< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1765900101] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1768080342] Running 0<.empty_stack: 0< +[Hera] [HADES][ERROR] [KRELTSC: 1769050878] 0<: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1769807928] Expected error occurred +[Hera] [HADES][TEST ] Testing 0< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1771197834] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1772082312] 0<: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1772996820] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 1774022964] Testing word: 0> +[Hera] [HADES][TEST ] [KRELTSC: 1774691226] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1775446428] Running 0>.positive: 42 0> . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1776636561] Test passed +[Hera] [HADES][TEST ] Testing 0> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1777940283] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1780161390] Running 0>.zero: 0 0> . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1781296524] Test passed +[Hera] [HADES][TEST ] Testing 0> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1782864741] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1785028098] Running 0>.negative: -42 0> . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1786149057] Test passed +[Hera] [HADES][TEST ] Testing 0> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1787441880] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1789620777] Running 0>.empty_stack: 0> +[Hera] [HADES][ERROR] [KRELTSC: 1790418294] 0>: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1791152685] Expected error occurred +[Hera] [HADES][TEST ] Testing 0> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1792563339] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1793458821] 0>: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1794580452] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 1795608801] Testing word: 0<> +[Hera] [HADES][TEST ] [KRELTSC: 1796292015] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1797046524] Running 0<>.nonzero_pos: 42 0<> . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1798312257] Test passed +[Hera] [HADES][TEST ] Testing 0<> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1799631876] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1801852941] Running 0<>.nonzero_neg: -1 0<> . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1802996328] Test passed +[Hera] [HADES][TEST ] Testing 0<> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1804289046] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1806504147] Running 0<>.zero: 0 0<> . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1807792392] Test passed +[Hera] [HADES][TEST ] Testing 0<> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1809107916] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1811292021] Running 0<>.empty_stack: 0<> +[Hera] [HADES][ERROR] [KRELTSC: 1812126855] 0<>: stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1812876009] Expected error occurred +[Hera] [HADES][TEST ] Testing 0<> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1814223117] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1815123408] 0<>: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1816054632] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 1817111856] Testing word: U< +[Hera] [HADES][TEST ] [KRELTSC: 1817776338] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1818537378] Running U<.less: 3 5 U< . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1819959582] Test passed +[Hera] [HADES][TEST ] Testing U< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1821273552] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1823529918] Running U<.equal: 5 5 U< . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1824615219] Test passed +[Hera] [HADES][TEST ] Testing U< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1825956867] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1828207647] Running U<.greater: 7 5 U< . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1829271549] Test passed +[Hera] [HADES][TEST ] Testing U< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1830559962] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][INFO ] [KRELTSC: 1832513634] L8[TABLE]: Config 31 → 32 regime=2 score=26214 L1=0 L2=1 L3=0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1834189476] Running U<.zero_one: 0 1 U< . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1835291892] Test passed +[Hera] [HADES][TEST ] Testing U< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1836584925] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1838803512] Running U<.empty_stack: U< +[Hera] [HADES][ERROR] [KRELTSC: 1839603612] U<: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1840375698] Expected error occurred +[Hera] [HADES][TEST ] Testing U< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1841739333] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1842615537] U<: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1843529856] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 1844751909] Testing word: U> +[Hera] [HADES][TEST ] [KRELTSC: 1845614043] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1846381425] Running U>.greater: 5 3 U> . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1847887986] Test passed +[Hera] [HADES][TEST ] Testing U> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1849182993] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1851443223] Running U>.equal: 5 5 U> . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1852558365] Test passed +[Hera] [HADES][TEST ] Testing U> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1853861184] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1856035944] Running U>.less: 3 5 U> . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1857351636] Test passed +[Hera] [HADES][TEST ] Testing U> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1858618356] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1860803679] Running U>.one_zero: 1 0 U> . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1861904877] Test passed +[Hera] [HADES][TEST ] Testing U> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1863249255] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1865467632] Running U>.empty_stack: U> +[Hera] [HADES][ERROR] [KRELTSC: 1866298686] U>: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1867012203] Expected error occurred +[Hera] [HADES][TEST ] Testing U> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1868425167] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1869268821] U>: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1870355571] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 1871415336] Testing word: WITHIN +[Hera] [HADES][TEST ] [KRELTSC: 1872145191] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1872912027] Running WITHIN.in_range: 3 1 5 WITHIN . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1874261067] Test passed +[Hera] [HADES][TEST ] Testing WITHIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1875716682] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1878129729] Running WITHIN.at_low: 1 1 5 WITHIN . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1879300731] Test passed +[Hera] [HADES][TEST ] Testing WITHIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1880636163] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1883019873] Running WITHIN.at_high: 5 1 5 WITHIN . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1884266769] Test passed +[Hera] [HADES][TEST ] Testing WITHIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1885605435] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][INFO ] [KRELTSC: 1887286359] L8[TABLE]: Config 32 → 33 regime=2 score=26214 L1=0 L2=1 L3=0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1888970328] Running WITHIN.below: 0 1 5 WITHIN . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1890113001] Test passed +[Hera] [HADES][TEST ] Testing WITHIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1891407609] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1893657885] Running WITHIN.above: 6 1 5 WITHIN . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1894956861] Test passed +[Hera] [HADES][TEST ] Testing WITHIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1896242376] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1898478120] Running WITHIN.empty_stack: WITHIN +[Hera] [HADES][ERROR] [KRELTSC: 1899437421] WITHIN: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1900244745] Expected error occurred +[Hera] [HADES][TEST ] Testing WITHIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1901674635] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1902565896] WITHIN: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1903502412] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 1904517531] Testing word: TRUE +[Hera] [HADES][TEST ] [KRELTSC: 1905235878] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1905985515] Running TRUE.value: TRUE . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1907221932] Test passed +[Hera] [HADES][TEST ] Testing TRUE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1908754722] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1910934459] Running TRUE.as_flag: TRUE 0= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1912050798] Test passed +[Hera] [HADES][TEST ] Testing TRUE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1913399754] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1915658598] Running TRUE.in_and: TRUE TRUE AND . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1916850075] Test passed +[Hera] [HADES][TEST ] Testing TRUE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1918176519] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1920623691] TRUE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1921519089] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 1922551302] Testing word: FALSE +[Hera] [HADES][TEST ] [KRELTSC: 1923241593] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1923992868] Running FALSE.value: FALSE . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1925168532] Test passed +[Hera] [HADES][TEST ] Testing FALSE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1926469713] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1928646867] Running FALSE.as_flag: FALSE 0= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1929802833] Test passed +[Hera] [HADES][TEST ] Testing FALSE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1931082174] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1933434279] Running FALSE.in_or: TRUE FALSE OR . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1934631909] Test passed +[Hera] [HADES][TEST ] Testing FALSE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1935914358] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1938165936] FALSE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1939077525] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 1940130948] Testing word: >= +[Hera] [HADES][TEST ] [KRELTSC: 1940849106] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1941605736] Running >=.less: 3 5 >= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1942799250] Test passed +[Hera] [HADES][TEST ] Testing >= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1944096399] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][INFO ] [KRELTSC: 1946227017] L8[TABLE]: Config 33 → 34 regime=2 score=26214 L1=0 L2=1 L3=0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1947664761] Running >=.greater: 5 3 >= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1948830471] Test passed +[Hera] [HADES][TEST ] Testing >= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1950114537] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1952313069] Running >=.equal: 3 3 >= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1953377013] Test passed +[Hera] [HADES][TEST ] Testing >= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1954659903] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1956871539] Running >=.negative: -1 0 >= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1958193090] Test passed +[Hera] [HADES][TEST ] Testing >= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1959523545] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1961757630] Running >=.neg_neg: -1 -2 >= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1962855930] Test passed +[Hera] [HADES][TEST ] Testing >= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1964183403] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1966379100] Running >=.underflow: >= +[Hera] [HADES][ERROR] [KRELTSC: 1967173803] >=: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1967905002] Expected error occurred +[Hera] [HADES][TEST ] Testing >= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1969315341] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1970367273] >=: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1971403959] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 1972593672] Testing word: <= +[Hera] [HADES][TEST ] [KRELTSC: 1973277915] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1974037800] Running <=.less: 3 5 <= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1975249227] Test passed +[Hera] [HADES][TEST ] Testing <= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1976565318] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1978784808] Running <=.greater: 5 3 <= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1979880798] Test passed +[Hera] [HADES][TEST ] Testing <= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1981160349] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1983517893] Running <=.equal: 3 3 <= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1984556112] Test passed +[Hera] [HADES][TEST ] Testing <= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1985886294] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1988119056] Running <=.negative: -1 0 <= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1989255723] Test passed +[Hera] [HADES][TEST ] Testing <= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1990574082] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1992815391] Running <=.neg_neg: -2 -1 <= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1993903212] Test passed +[Hera] [HADES][TEST ] Testing <= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1995313509] Expected: Should print: -1 +[Hera] -1 +[Hera] [HADES][INFO ] [KRELTSC: 1996536486] L8[TABLE]: Config 34 → 35 regime=2 score=52428 L1=0 L2=1 L3=0 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1998830463] Running <=.underflow: <= +[Hera] [HADES][ERROR] [KRELTSC: 1999699716] <=: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2000407794] Expected error occurred +[Hera] [HADES][TEST ] Testing <= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2001849696] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2002721532] <=: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2003673651] === Logical Words Summary: 0 passed, 0 failed, 0 skipped, 0 err +[Hera] [HADES][INFO ] [KRELTSC: 2004727641] +[Hera] === Testing Module: Mixed Arithmetic Words === +[Hera] [HADES][INFO ] [KRELTSC: 2005889256] Running Mixed Arithmetic Words Tests (Module 7)... +[Hera] [HADES][TEST ] [KRELTSC: 2006875206] ▶ Testing module: v3/src/test_runner/modules/mixed_arithmetic +[Hera] [HADES][TEST ] [KRELTSC: 2008160154] Testing word: */ +[Hera] [HADES][TEST ] [KRELTSC: 2008883877] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2009726418] Running */.basic: 6 7 4 */ . CR +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 2011003659] Test passed +[Hera] [HADES][TEST ] Testing */ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2012320086] Expected: Should print: 10 (6*7/4) +[Hera] [HADES][TEST ] [KRELTSC: 2013227328] Running */.exact_division: 12 5 3 */ . CR +[Hera] 20 +[Hera] [HADES][TEST ] [KRELTSC: 2014445181] Test passed +[Hera] [HADES][TEST ] Testing */ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2015755938] Expected: Should print: 20 (12*5/3) +[Hera] [HADES][TEST ] [KRELTSC: 2016605766] Running */.zero_multiply: 0 999 123 */ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2017795857] Test passed +[Hera] [HADES][TEST ] Testing */ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2019105879] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 2019868956] Running */.by_one: 42 5 1 */ . CR +[Hera] 210 +[Hera] [HADES][TEST ] [KRELTSC: 2021201490] Test passed +[Hera] [HADES][TEST ] Testing */ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2022560841] Expected: Should print: 210 (42*5/1) +[Hera] [HADES][TEST ] [KRELTSC: 2023399371] Running */.truncation: 7 3 2 */ . CR +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 2024584863] Test passed +[Hera] [HADES][TEST ] Testing */ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2025845157] Expected: Should print: 10 (21/2 truncated) +[Hera] [HADES][TEST ] [KRELTSC: 2026816953] Running */.negative_multiply: -6 7 4 */ . CR +[Hera] -10 +[Hera] [HADES][TEST ] [KRELTSC: 2028015024] Test passed +[Hera] [HADES][TEST ] Testing */ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2029299552] Expected: Should print: -10 +[Hera] [HADES][TEST ] [KRELTSC: 2030255661] Running */.negative_divisor: 6 7 -4 */ . CR +[Hera] -10 +[Hera] [HADES][TEST ] [KRELTSC: 2031504720] Test passed +[Hera] [HADES][TEST ] Testing */ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2032803045] Expected: Should print: -10 +[Hera] [HADES][TEST ] [KRELTSC: 2033821587] Running */.div_by_zero: 6 7 0 */ +[Hera] [HADES][ERROR] [KRELTSC: 2034730110] */: Division by zero +[Hera] [HADES][TEST ] [KRELTSC: 2035557678] Expected error occurred +[Hera] [HADES][TEST ] Testing */ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2036955585] Expected: Should cause division by zero +[Hera] [HADES][TEST ] [KRELTSC: 2037838026] Running */.empty_stack: */ +[Hera] [HADES][ERROR] [KRELTSC: 2038650453] */: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2039367582] Expected error occurred +[Hera] [HADES][TEST ] Testing */ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2040770256] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2041661223] Running */.two_items: 1 2 */ +[Hera] [HADES][ERROR] [KRELTSC: 2042527221] */: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2043260625] Expected error occurred +[Hera] [HADES][TEST ] Testing */ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2044649292] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2045640030] */: 10 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2046718863] ▶ Testing module: v3/src/test_runner/modules/mixed_arithmetic +[Hera] [HADES][TEST ] [KRELTSC: 2047750614] Testing word: */MOD +[Hera] [HADES][TEST ] [KRELTSC: 2048425323] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2049170151] Running */MOD.basic: 17 3 5 */MOD . . CR +[Hera] 10 1 +[Hera] [HADES][TEST ] [KRELTSC: 2050519065] Test passed +[Hera] [HADES][TEST ] Testing */MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2051842401] Expected: Should print: 1 10 (51/5 = 10 rem 1) +[Hera] [HADES][TEST ] [KRELTSC: 2052789627] Running */MOD.exact_division: 15 4 3 */MOD . . CR +[Hera] 20 0 +[Hera] [HADES][TEST ] [KRELTSC: 2054060862] Test passed +[Hera] [HADES][TEST ] Testing */MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2055362988] Expected: Should print: 0 20 (60/3 = 20 rem 0) +[Hera] [HADES][TEST ] [KRELTSC: 2056290663] Running */MOD.zero_multiply: 0 999 123 */MOD . . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 2057549172] Test passed +[Hera] [HADES][TEST ] Testing */MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2059185513] Expected: Should print: 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 2059982232] Running */MOD.by_one: 42 5 1 */MOD . . CR +[Hera] 210 0 +[Hera] [HADES][TEST ] [KRELTSC: 2061233790] Test passed +[Hera] [HADES][TEST ] Testing */MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2062530729] Expected: Should print: 0 210 +[Hera] [HADES][TEST ] [KRELTSC: 2063352291] Running */MOD.remainder: 7 8 5 */MOD . . CR +[Hera] 11 1 +[Hera] [HADES][TEST ] [KRELTSC: 2064588918] Test passed +[Hera] [HADES][TEST ] Testing */MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2065875315] Expected: Should print: 1 11 (56/5 = 11 rem 1) +[Hera] [HADES][TEST ] [KRELTSC: 2066839824] Running */MOD.negative: -7 3 4 */MOD . . CR +[Hera] -5 -1 +[Hera] [HADES][TEST ] [KRELTSC: 2068068030] Test passed +[Hera] [HADES][TEST ] Testing */MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2069366838] Expected: Should handle negative +[Hera] [HADES][TEST ] [KRELTSC: 2070173007] Running */MOD.div_by_zero: 6 7 0 */MOD +[Hera] [HADES][ERROR] [KRELTSC: 2071337142] */MOD: Division by zero +[Hera] [HADES][TEST ] [KRELTSC: 2072075943] Expected error occurred +[Hera] [HADES][TEST ] Testing */MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2073526182] Expected: Should cause division by zero +[Hera] [HADES][TEST ] [KRELTSC: 2074418472] Running */MOD.empty_stack: */MOD +[Hera] [HADES][ERROR] [KRELTSC: 2075328654] */MOD: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2076106158] Expected error occurred +[Hera] [HADES][TEST ] Testing */MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2077513914] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2078389992] */MOD: 8 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2079292341] ▶ Testing module: v3/src/test_runner/modules/mixed_arithmetic +[Hera] [HADES][TEST ] [KRELTSC: 2080323210] Testing word: M+ +[Hera] [HADES][TEST ] [KRELTSC: 2081021964] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2081769732] Running M+.basic: 0 100 200 M+ . . CR +[Hera] 300 0 +[Hera] [HADES][TEST ] [KRELTSC: 2083142355] Test passed +[Hera] [HADES][TEST ] Testing M+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2084669370] Expected: Should print: 200 100 +[Hera] [HADES][TEST ] [KRELTSC: 2085497778] Running M+.overflow: 0 2147483647 1 M+ . . CR +[Hera] 2147483648 0 +[Hera] [HADES][TEST ] [KRELTSC: 2086820715] Test passed +[Hera] [HADES][TEST ] Testing M+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2088210054] Expected: Should handle overflow +[Hera] [HADES][TEST ] [KRELTSC: 2089058496] Running M+.negative: 0 -100 50 M+ . . CR +[Hera] -50 0 +[Hera] [HADES][TEST ] [KRELTSC: 2090315409] Test passed +[Hera] [HADES][TEST ] Testing M+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2091639039] Expected: Should print: 50 -100 +[Hera] [HADES][TEST ] [KRELTSC: 2092502874] Running M+.zero_add: 0 42 0 M+ . . CR +[Hera] 42 0 +[Hera] [HADES][TEST ] [KRELTSC: 2093675031] Test passed +[Hera] [HADES][TEST ] Testing M+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2094957039] Expected: Should print: 0 42 +[Hera] [HADES][TEST ] [KRELTSC: 2095735740] Running M+.both_negative: 0 -100 -200 M+ . . CR +[Hera] -300 0 +[Hera] [HADES][TEST ] [KRELTSC: 2097340854] Test passed +[Hera] [HADES][TEST ] Testing M+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2098631220] Expected: Should print: -200 -100 +[Hera] [HADES][TEST ] [KRELTSC: 2099496504] Running M+.empty_stack: M+ +[Hera] [HADES][TEST ] [KRELTSC: 2100320922] Expected error occurred +[Hera] [HADES][TEST ] Testing M+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2101713159] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2102613177] Running M+.one_item: 42 M+ +[Hera] [HADES][TEST ] [KRELTSC: 2103444105] Expected error occurred +[Hera] [HADES][TEST ] Testing M+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2104814124] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2105697825] M+: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2106615924] ▶ Testing module: v3/src/test_runner/modules/mixed_arithmetic +[Hera] [HADES][TEST ] [KRELTSC: 2107640598] Testing word: M* +[Hera] [HADES][TEST ] [KRELTSC: 2108362809] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2109341535] Running M*.basic: 123 456 M* . . CR +[Hera] 0 56088 +[Hera] [HADES][TEST ] [KRELTSC: 2110650003] Test passed +[Hera] [HADES][TEST ] Testing M* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2111930520] Expected: Should print: 56088 0 +[Hera] [HADES][TEST ] [KRELTSC: 2112802251] Running M*.by_zero: 999 0 M* . . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 2113977663] Test passed +[Hera] [HADES][TEST ] Testing M* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2115232014] Expected: Should print: 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 2116046961] Running M*.by_one: 42 1 M* . . CR +[Hera] 0 42 +[Hera] [HADES][TEST ] [KRELTSC: 2117198958] Test passed +[Hera] [HADES][TEST ] Testing M* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2118477837] Expected: Should print: 42 0 +[Hera] [HADES][TEST ] [KRELTSC: 2119288185] Running M*.negative: -123 456 M* . . CR +[Hera] -1 -56088 +[Hera] [HADES][TEST ] [KRELTSC: 2120527647] Test passed +[Hera] [HADES][TEST ] Testing M* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2122104159] Expected: Should print: -56088 -1 +[Hera] [HADES][TEST ] [KRELTSC: 2122940799] Running M*.large_multiply: 65536 65536 M* . . CR +[Hera] 0 4294967296 +[Hera] [HADES][TEST ] [KRELTSC: 2124226272] Test passed +[Hera] [HADES][TEST ] Testing M* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2125501476] Expected: Should handle large result +[Hera] [HADES][TEST ] [KRELTSC: 2126381922] Running M*.both_negative: -100 -200 M* . . CR +[Hera] 0 20000 +[Hera] [HADES][TEST ] [KRELTSC: 2127641502] Test passed +[Hera] [HADES][TEST ] Testing M* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2128943901] Expected: Should print: 20000 0 +[Hera] [HADES][TEST ] [KRELTSC: 2129791650] Running M*.empty_stack: M* +[Hera] [HADES][TEST ] [KRELTSC: 2130652104] Expected error occurred +[Hera] [HADES][TEST ] Testing M* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2132061120] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2132930436] Running M*.one_item: 42 M* +[Hera] [HADES][TEST ] [KRELTSC: 2133833352] Expected error occurred +[Hera] [HADES][TEST ] Testing M* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2135243208] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2136077265] M*: 8 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2136992277] ▶ Testing module: v3/src/test_runner/modules/mixed_arithmetic +[Hera] [HADES][TEST ] [KRELTSC: 2138047422] Testing word: M/MOD +[Hera] [HADES][TEST ] [KRELTSC: 2138760813] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2139495246] Running M/MOD.basic: 0 1000 100 M/MOD . . CR +[Hera] 10 0 +[Hera] [HADES][TEST ] [KRELTSC: 2141110461] Test passed +[Hera] [HADES][TEST ] Testing M/MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2142469917] Expected: Should print: 0 10 (1000/100) +[Hera] [HADES][TEST ] [KRELTSC: 2143362186] Running M/MOD.with_remainder: 0 1234 100 M/MOD . . CR +[Hera] 12 34 +[Hera] [HADES][TEST ] [KRELTSC: 2144776809] Test passed +[Hera] [HADES][TEST ] Testing M/MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2146103589] Expected: Should handle remainder +[Hera] [HADES][TEST ] [KRELTSC: 2147226144] Running M/MOD.double_dividend: 5001 0 10 M/MOD . . CR +[Hera] 1844674407370955161 6 +[Hera] [HADES][TEST ] [KRELTSC: 2148629532] Test passed +[Hera] [HADES][TEST ] Testing M/MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2149950705] Expected: Should print: 1 500 (5001/10) +[Hera] [HADES][TEST ] [KRELTSC: 2150854965] Running M/MOD.by_one: 0 42 1 M/MOD . . CR +[Hera] 42 0 +[Hera] [HADES][TEST ] [KRELTSC: 2152037874] Test passed +[Hera] [HADES][TEST ] Testing M/MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2153374608] Expected: Should print: 0 42 +[Hera] [HADES][TEST ] [KRELTSC: 2154168849] Running M/MOD.negative_dividend: -1 1000 100 M/MOD . . CR +[Hera] -184467440737095506 -16 +[Hera] [HADES][TEST ] [KRELTSC: 2155742106] Test passed +[Hera] [HADES][TEST ] Testing M/MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2157112251] Expected: Should handle negative +[Hera] [HADES][TEST ] [KRELTSC: 2157953364] Running M/MOD.div_by_zero: 0 100 0 M/MOD +[Hera] [HADES][TEST ] [KRELTSC: 2159002776] Expected error occurred +[Hera] [HADES][TEST ] Testing M/MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2160485061] Expected: Should cause division by zero +[Hera] [HADES][TEST ] [KRELTSC: 2161414332] Running M/MOD.empty_stack: M/MOD +[Hera] [HADES][TEST ] [KRELTSC: 2162267856] Expected error occurred +[Hera] [HADES][TEST ] Testing M/MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2163725151] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2164594866] M/MOD: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2165572122] === Mixed Arithmetic Words Summary: 0 passed, 0 failed, 0 skipp +[Hera] [HADES][INFO ] [KRELTSC: 2166605952] +[Hera] === Testing Module: Double Words === +[Hera] [HADES][INFO ] [KRELTSC: 2167701984] Running Double Number Words Tests (Module 6)... +[Hera] [HADES][TEST ] [KRELTSC: 2168630814] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2169708009] Testing word: 2DROP +[Hera] [HADES][TEST ] [KRELTSC: 2170401765] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2171160558] Running 2DROP.basic: 1 2 3 4 2DROP . . CR +[Hera] 2 1 +[Hera] [HADES][TEST ] [KRELTSC: 2172721404] Test passed +[Hera] [HADES][TEST ] Testing 2DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2174060490] Expected: Should print: 1 2 +[Hera] [HADES][TEST ] [KRELTSC: 2174864811] Running 2DROP.zeros: 0 0 42 99 2DROP . . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 2176072920] Test passed +[Hera] [HADES][TEST ] Testing 2DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2177421288] Expected: Should print: 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 2178186318] Running 2DROP.negative: -1 -2 100 200 2DROP . . CR +[Hera] -2 -1 +[Hera] [HADES][INFO ] [KRELTSC: 2192513883] L8[TABLE]: Config 35 → 36 regime=2 score=26214 L1=0 L2=1 L3=0 +[Hera] [HADES][TEST ] [KRELTSC: 2193335739] Test passed +[Hera] [HADES][TEST ] Testing 2DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2194524948] Expected: Should print: -1 -2 +[Hera] [HADES][TEST ] [KRELTSC: 2195390463] Running 2DROP.exact_four: 10 20 30 40 2DROP DEPTH . CR +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 2196809370] Test passed +[Hera] [HADES][TEST ] Testing 2DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2198123907] Expected: Should print: 2 +[Hera] [HADES][TEST ] [KRELTSC: 2198944776] Running 2DROP.empty_stack: 2DROP +[Hera] [HADES][TEST ] [KRELTSC: 2199799644] Expected error occurred +[Hera] [HADES][TEST ] Testing 2DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2201225628] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2202194358] Running 2DROP.one_item: 42 2DROP +[Hera] [HADES][TEST ] [KRELTSC: 2203033749] Expected error occurred +[Hera] [HADES][TEST ] Testing 2DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2204425965] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2205345555] 2DROP: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2206316196] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2207376549] Testing word: 2DUP +[Hera] [HADES][TEST ] [KRELTSC: 2208070977] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2208819711] Running 2DUP.basic: 100 200 2DUP . . . . CR +[Hera] 200 100 200 100 +[Hera] [HADES][TEST ] [KRELTSC: 2210481903] Test passed +[Hera] [HADES][TEST ] Testing 2DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2211808641] Expected: Should print: 100 200 100 200 +[Hera] [HADES][TEST ] [KRELTSC: 2212679385] Running 2DUP.zeros: 0 0 2DUP . . . . CR +[Hera] 0 0 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 2213913156] Test passed +[Hera] [HADES][TEST ] Testing 2DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2215228701] Expected: Should print: 0 0 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 2216088000] Running 2DUP.negative: -100 -200 2DUP . . . . CR +[Hera] -200 -100 -200 -100 +[Hera] [HADES][TEST ] [KRELTSC: 2217488070] Test passed +[Hera] [HADES][TEST ] Testing 2DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2218812141] Expected: Should duplicate negatives +[Hera] [HADES][TEST ] [KRELTSC: 2219686182] Running 2DUP.depth_check: 10 20 2DUP DEPTH . CR +[Hera] 4 +[Hera] [HADES][TEST ] [KRELTSC: 2220911427] Test passed +[Hera] [HADES][TEST ] Testing 2DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2222428215] Expected: Should print: 4 +[Hera] [HADES][TEST ] [KRELTSC: 2223302214] Running 2DUP.empty_stack: 2DUP +[Hera] [HADES][TEST ] [KRELTSC: 2224159581] Expected error occurred +[Hera] [HADES][TEST ] Testing 2DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2225547702] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2226405216] Running 2DUP.one_item: 42 2DUP +[Hera] [HADES][TEST ] [KRELTSC: 2227240932] Expected error occurred +[Hera] [HADES][TEST ] Testing 2DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2228610699] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2229482640] 2DUP: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2230347441] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2231361153] Testing word: 2OVER +[Hera] [HADES][TEST ] [KRELTSC: 2232082377] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2232813513] Running 2OVER.basic: 10 20 30 40 2OVER . . . . . . CR +[Hera] 20 10 40 30 20 10 +[Hera] [HADES][TEST ] [KRELTSC: 2234547861] Test passed +[Hera] [HADES][TEST ] Testing 2OVER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2235866073] Expected: Should print: 10 20 30 40 10 20 +[Hera] [HADES][TEST ] [KRELTSC: 2236760148] Running 2OVER.zeros: 0 0 99 88 2OVER . . . . . . CR +[Hera] 0 0 88 99 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 2238082119] Test passed +[Hera] [HADES][TEST ] Testing 2OVER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2239395165] Expected: Should print: 0 0 99 88 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 2240230587] Running 2OVER.mixed: -1 2 -3 4 2OVER . . . . . . CR +[Hera] 2 -1 4 -3 2 -1 +[Hera] [HADES][TEST ] [KRELTSC: 2241566859] Test passed +[Hera] [HADES][TEST ] Testing 2OVER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2242853844] Expected: Should handle mixed signs +[Hera] [HADES][TEST ] [KRELTSC: 2243732988] Running 2OVER.depth_check: 1 2 3 4 2OVER DEPTH . CR +[Hera] 6 +[Hera] [HADES][TEST ] [KRELTSC: 2244992673] Test passed +[Hera] [HADES][TEST ] Testing 2OVER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2246300784] Expected: Should print: 6 +[Hera] [HADES][TEST ] [KRELTSC: 2247274575] Running 2OVER.three_items: 1 2 3 2OVER +[Hera] [HADES][TEST ] [KRELTSC: 2248248912] Expected error occurred +[Hera] [HADES][TEST ] Testing 2OVER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2249663892] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2250510171] Running 2OVER.empty_stack: 2OVER +[Hera] [HADES][TEST ] [KRELTSC: 2251349961] Expected error occurred +[Hera] [HADES][TEST ] Testing 2OVER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2252737032] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2253689046] 2OVER: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2254586145] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2255623860] Testing word: 2SWAP +[Hera] [HADES][TEST ] [KRELTSC: 2256363312] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2257087098] Running 2SWAP.basic: 10 20 30 40 2SWAP . . . . CR +[Hera] 20 10 40 30 +[Hera] [HADES][TEST ] [KRELTSC: 2258526165] Test passed +[Hera] [HADES][TEST ] Testing 2SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2260164438] Expected: Should print: 30 40 10 20 +[Hera] [HADES][TEST ] [KRELTSC: 2261028231] Running 2SWAP.zeros: 0 0 99 88 2SWAP . . . . CR +[Hera] 0 0 88 99 +[Hera] [HADES][TEST ] [KRELTSC: 2262317841] Test passed +[Hera] [HADES][TEST ] Testing 2SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2263699557] Expected: Should print: 99 88 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 2264497536] Running 2SWAP.same_pairs: 42 42 42 42 2SWAP . . . . CR +[Hera] 42 42 42 42 +[Hera] [HADES][TEST ] [KRELTSC: 2265863943] Test passed +[Hera] [HADES][TEST ] Testing 2SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2267134443] Expected: Should print: 42 42 42 42 +[Hera] [HADES][TEST ] [KRELTSC: 2268013671] Running 2SWAP.negative: -10 -20 30 40 2SWAP . . . . CR +[Hera] -20 -10 40 30 +[Hera] [HADES][TEST ] [KRELTSC: 2269358889] Test passed +[Hera] [HADES][TEST ] Testing 2SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2270693376] Expected: Should print: 30 40 -10 -20 +[Hera] [HADES][TEST ] [KRELTSC: 2271539109] Running 2SWAP.depth_check: 1 2 3 4 2SWAP DEPTH . CR +[Hera] 4 +[Hera] [HADES][TEST ] [KRELTSC: 2272994661] Test passed +[Hera] [HADES][TEST ] Testing 2SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2274319971] Expected: Should print: 4 +[Hera] [HADES][TEST ] [KRELTSC: 2275100604] Running 2SWAP.three_items: 1 2 3 2SWAP +[Hera] [HADES][TEST ] [KRELTSC: 2276016078] Expected error occurred +[Hera] [HADES][TEST ] Testing 2SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2277438765] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2278331790] Running 2SWAP.empty_stack: 2SWAP +[Hera] [HADES][TEST ] [KRELTSC: 2279160177] Expected error occurred +[Hera] [HADES][TEST ] Testing 2SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2280584292] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2281440504] 2SWAP: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2282353710] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2283405747] Testing word: 2ROT +[Hera] [HADES][TEST ] [KRELTSC: 2284087218] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2285062668] Running 2ROT.basic: 10 20 30 40 50 60 2ROT . . . . . . CR +[Hera] 20 10 60 50 40 30 +[Hera] [HADES][TEST ] [KRELTSC: 2286759090] Test passed +[Hera] [HADES][TEST ] Testing 2ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2288038410] Expected: Should print: 30 40 50 60 10 20 +[Hera] [HADES][TEST ] [KRELTSC: 2288951721] Running 2ROT.zeros: 0 0 1 1 2 2 2ROT . . . . . . CR +[Hera] 0 0 2 2 1 1 +[Hera] [HADES][TEST ] [KRELTSC: 2290281882] Test passed +[Hera] [HADES][TEST ] Testing 2ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2291586927] Expected: Should rotate with zeros +[Hera] [HADES][TEST ] [KRELTSC: 2292451644] Running 2ROT.negative: -1 -2 3 4 -5 -6 2ROT . . . . . . CR +[Hera] -2 -1 -6 -5 4 3 +[Hera] [HADES][TEST ] [KRELTSC: 2293916982] Test passed +[Hera] [HADES][TEST ] Testing 2ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2295204030] Expected: Should handle negatives +[Hera] [HADES][TEST ] [KRELTSC: 2296043862] Running 2ROT.depth_check: 1 2 3 4 5 6 2ROT DEPTH . CR +[Hera] 6 +[Hera] [HADES][TEST ] [KRELTSC: 2297561763] Test passed +[Hera] [HADES][TEST ] Testing 2ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2298832368] Expected: Should print: 6 +[Hera] [HADES][TEST ] [KRELTSC: 2299676820] Running 2ROT.five_items: 1 2 3 4 5 2ROT +[Hera] [HADES][TEST ] [KRELTSC: 2300564784] Expected error occurred +[Hera] [HADES][TEST ] Testing 2ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2301938835] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2302794186] Running 2ROT.empty_stack: 2ROT +[Hera] [HADES][TEST ] [KRELTSC: 2303617302] Expected error occurred +[Hera] [HADES][TEST ] Testing 2ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2304984591] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2305905357] 2ROT: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2306783871] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2307866526] Testing word: D+ +[Hera] [HADES][TEST ] [KRELTSC: 2308559421] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2309274240] Running D+.basic: 100 200 300 400 D+ . . CR +[Hera] 600 400 +[Hera] [HADES][TEST ] [KRELTSC: 2310895314] Test passed +[Hera] [HADES][TEST ] Testing D+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2312200947] Expected: Should print: 400 600 +[Hera] [HADES][TEST ] [KRELTSC: 2313061569] Running D+.zero_add: 42 99 0 0 D+ . . CR +[Hera] 99 42 +[Hera] [HADES][TEST ] [KRELTSC: 2314210248] Test passed +[Hera] [HADES][TEST ] Testing D+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2315490492] Expected: Should print: 42 99 +[Hera] [HADES][TEST ] [KRELTSC: 2316267534] Running D+.negative: -100 -200 50 75 D+ . . CR +[Hera] -125 -50 +[Hera] [HADES][TEST ] [KRELTSC: 2317599837] Test passed +[Hera] [HADES][TEST ] Testing D+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2318884260] Expected: Should handle negatives +[Hera] [HADES][TEST ] [KRELTSC: 2319721866] Running D+.carry: 2147483647 0 1 0 D+ . . CR +[Hera] 0 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 2320973235] Test passed +[Hera] [HADES][TEST ] Testing D+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2322526311] Expected: Should handle carry +[Hera] [HADES][TEST ] [KRELTSC: 2323427400] Running D+.both_negative: -100 -200 -300 -400 D+ . . CR +[Hera] -599 -400 +[Hera] [HADES][TEST ] [KRELTSC: 2324727972] Test passed +[Hera] [HADES][TEST ] Testing D+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2326032513] Expected: Should add negatives +[Hera] [HADES][TEST ] [KRELTSC: 2326875453] Running D+.three_items: 1 2 3 D+ +[Hera] [HADES][TEST ] [KRELTSC: 2327753316] Expected error occurred +[Hera] [HADES][TEST ] Testing D+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2329113675] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2330019174] Running D+.empty_stack: D+ +[Hera] [HADES][TEST ] [KRELTSC: 2330791995] Expected error occurred +[Hera] [HADES][TEST ] Testing D+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2332193472] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2333047458] D+: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2333963646] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2335133409] Testing word: D- +[Hera] [HADES][TEST ] [KRELTSC: 2335828845] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2336591628] Running D-.basic: 500 600 100 200 D- . . CR +[Hera] 400 [HADES][INFO ] [KRELTSC: 2337958245] L8[TABLE]: Config 36 → 37 regime=2 score=26214 L1=0 L2=1 L3=0 +[Hera] 400 +[Hera] [HADES][TEST ] [KRELTSC: 2339086596] Test passed +[Hera] [HADES][TEST ] Testing D- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2340402519] Expected: Should print: 400 400 +[Hera] [HADES][TEST ] [KRELTSC: 2341249197] Running D-.zero_sub: 42 99 0 0 D- . . CR +[Hera] 99 42 +[Hera] [HADES][TEST ] [KRELTSC: 2342449074] Test passed +[Hera] [HADES][TEST ] Testing D- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2343752418] Expected: Should print: 42 99 +[Hera] [HADES][TEST ] [KRELTSC: 2344555290] Running D-.from_zero: 0 0 100 200 D- . . CR +[Hera] -201 -100 +[Hera] [HADES][TEST ] [KRELTSC: 2345824992] Test passed +[Hera] [HADES][TEST ] Testing D- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2347132158] Expected: Should print: -100 -200 +[Hera] [HADES][TEST ] [KRELTSC: 2348083899] Running D-.negative: 100 200 -50 -75 D- . . CR +[Hera] 274 150 +[Hera] [HADES][TEST ] [KRELTSC: 2349559296] Test passed +[Hera] [HADES][TEST ] Testing D- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2350858524] Expected: Should handle negatives +[Hera] [HADES][TEST ] [KRELTSC: 2351704719] Running D-.borrow: 0 0 1 0 D- . . CR +[Hera] -1 -1 +[Hera] [HADES][TEST ] [KRELTSC: 2352849681] Test passed +[Hera] [HADES][TEST ] Testing D- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2354128035] Expected: Should handle borrow +[Hera] [HADES][TEST ] [KRELTSC: 2354954028] Running D-.same_values: 100 200 100 200 D- . . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 2356234839] Test passed +[Hera] [HADES][TEST ] Testing D- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2357478354] Expected: Should print: 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 2358293994] Running D-.three_items: 1 2 3 D- +[Hera] [HADES][TEST ] [KRELTSC: 2359148694] Expected error occurred +[Hera] [HADES][TEST ] Testing D- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2360701392] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2361595845] Running D-.empty_stack: D- +[Hera] [HADES][TEST ] [KRELTSC: 2362393803] Expected error occurred +[Hera] [HADES][TEST ] Testing D- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2363780811] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2364653214] D-: 8 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2365547394] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2366600880] Testing word: DNEGATE +[Hera] [HADES][TEST ] [KRELTSC: 2367303771] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2368062144] Running DNEGATE.positive: 100 200 DNEGATE . . CR +[Hera] -201 -100 +[Hera] [HADES][TEST ] [KRELTSC: 2369456859] Test passed +[Hera] [HADES][TEST ] Testing DNEGATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2370745314] Expected: Should negate positive double +[Hera] [HADES][TEST ] [KRELTSC: 2371674186] Running DNEGATE.negative: -100 -200 DNEGATE . . CR +[Hera] 199 100 +[Hera] [HADES][TEST ] [KRELTSC: 2373169029] Test passed +[Hera] [HADES][TEST ] Testing DNEGATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2374494339] Expected: Should negate negative double +[Hera] [HADES][TEST ] [KRELTSC: 2375521764] Running DNEGATE.zero: 0 0 DNEGATE . . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 2376649569] Test passed +[Hera] [HADES][TEST ] Testing DNEGATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2377995039] Expected: Should print: 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 2378807046] Running DNEGATE.max_positive: 2147483647 0 DNEGATE . . CR +[Hera] -1 -2147483647 +[Hera] [HADES][TEST ] [KRELTSC: 2380223370] Test passed +[Hera] [HADES][TEST ] Testing DNEGATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2381600298] Expected: Should negate max positive +[Hera] [HADES][TEST ] [KRELTSC: 2382455712] Running DNEGATE.one_item: 42 DNEGATE +[Hera] [HADES][TEST ] [KRELTSC: 2383344915] Expected error occurred +[Hera] [HADES][TEST ] Testing DNEGATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2384783541] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2385859791] Running DNEGATE.empty_stack: DNEGATE +[Hera] [HADES][TEST ] [KRELTSC: 2386714491] Expected error occurred +[Hera] [HADES][TEST ] Testing DNEGATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2388155196] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2389008930] DNEGATE: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2389979214] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2391012498] Testing word: DABS +[Hera] [HADES][TEST ] [KRELTSC: 2391739329] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2392457886] Running DABS.positive: 100 200 DABS . . CR +[Hera] 200 100 +[Hera] [HADES][TEST ] [KRELTSC: 2393771982] Test passed +[Hera] [HADES][TEST ] Testing DABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2395098174] Expected: Should print: 100 200 +[Hera] [HADES][TEST ] [KRELTSC: 2395934352] Running DABS.negative: -100 -200 DABS . . CR +[Hera] 199 100 +[Hera] [HADES][TEST ] [KRELTSC: 2397135426] Test passed +[Hera] [HADES][TEST ] Testing DABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2398820424] Expected: Should print: 100 200 +[Hera] [HADES][TEST ] [KRELTSC: 2399641734] Running DABS.zero: 0 0 DABS . . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 2400781887] Test passed +[Hera] [HADES][TEST ] Testing DABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2402082585] Expected: Should print: 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 2402902404] Running DABS.mixed_sign: 100 -1 DABS . . CR +[Hera] 0 -100 +[Hera] [HADES][TEST ] [KRELTSC: 2404117800] Test passed +[Hera] [HADES][TEST ] Testing DABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2405464425] Expected: Should handle mixed sign +[Hera] [HADES][TEST ] [KRELTSC: 2406307281] Running DABS.min_double: -2147483648 -1 DABS . . CR +[Hera] 0 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 2407677615] Test passed +[Hera] [HADES][TEST ] Testing DABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2408984844] Expected: Should handle min double +[Hera] [HADES][TEST ] [KRELTSC: 2409841476] Running DABS.one_item: 42 DABS +[Hera] [HADES][TEST ] [KRELTSC: 2410898385] Expected error occurred +[Hera] [HADES][TEST ] Testing DABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2412304272] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2413184718] Running DABS.empty_stack: DABS +[Hera] [HADES][TEST ] [KRELTSC: 2414016171] Expected error occurred +[Hera] [HADES][TEST ] Testing DABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2415407232] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2416281714] DABS: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2417209410] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2418236415] Testing word: DMIN +[Hera] [HADES][TEST ] [KRELTSC: 2418976602] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2419748730] Running DMIN.basic: 100 200 300 400 DMIN . . CR +[Hera] 200 100 +[Hera] [HADES][TEST ] [KRELTSC: 2421189603] Test passed +[Hera] [HADES][TEST ] Testing DMIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2422497336] Expected: Should print: 100 200 +[Hera] [HADES][TEST ] [KRELTSC: 2423587866] Running DMIN.equal: 42 99 42 99 DMIN . . CR +[Hera] 99 42 +[Hera] [HADES][TEST ] [KRELTSC: 2424862692] Test passed +[Hera] [HADES][TEST ] Testing DMIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2426195730] Expected: Should print: 42 99 +[Hera] [HADES][TEST ] [KRELTSC: 2427000702] Running DMIN.negative: -100 -200 -50 -75 DMIN . . CR +[Hera] -200 -100 +[Hera] [HADES][TEST ] [KRELTSC: 2428295856] Test passed +[Hera] [HADES][TEST ] Testing DMIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2429606067] Expected: Should find min negative +[Hera] [HADES][TEST ] [KRELTSC: 2430451611] Running DMIN.mixed: -100 -1 100 0 DMIN . . CR +[Hera] -1 -100 +[Hera] [HADES][TEST ] [KRELTSC: 2431703568] Test passed +[Hera] [HADES][TEST ] Testing DMIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2433071655] Expected: Should handle mixed signs +[Hera] [HADES][TEST ] [KRELTSC: 2433905817] Running DMIN.three_items: 1 2 3 DMIN +[Hera] [HADES][TEST ] [KRELTSC: 2434794201] Expected error occurred +[Hera] [HADES][TEST ] Testing DMIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2436509355] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2437416828] Running DMIN.empty_stack: DMIN +[Hera] [HADES][TEST ] [KRELTSC: 2438232174] Expected error occurred +[Hera] [HADES][TEST ] Testing DMIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2439659964] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2440520061] DMIN: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2441401956] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2442468840] Testing word: DMAX +[Hera] [HADES][TEST ] [KRELTSC: 2443142562] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2443890141] Running DMAX.basic: 100 200 300 400 DMAX . . CR +[Hera] 400 300 +[Hera] [HADES][TEST ] [KRELTSC: 2445329355] Test passed +[Hera] [HADES][TEST ] Testing DMAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2446652019] Expected: Should print: 300 400 +[Hera] [HADES][TEST ] [KRELTSC: 2447496450] Running DMAX.equal: 42 99 42 99 DMAX . . CR +[Hera] 99 42 +[Hera] [HADES][TEST ] [KRELTSC: 2449052592] Test passed +[Hera] [HADES][TEST ] Testing DMAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2450367255] Expected: Should print: 42 99 +[Hera] [HADES][TEST ] [KRELTSC: 2451194193] Running DMAX.negative: -300 -400 -100 -200 DMAX . . CR +[Hera] -200 -100 +[Hera] [HADES][TEST ] [KRELTSC: 2452587459] Test passed +[Hera] [HADES][TEST ] Testing DMAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2453914470] Expected: Should find max negative +[Hera] [HADES][TEST ] [KRELTSC: 2454738741] Running DMAX.mixed: -100 -1 100 0 DMAX . . CR +[Hera] 0 100 +[Hera] [HADES][TEST ] [KRELTSC: 2455983285] Test passed +[Hera] [HADES][TEST ] Testing DMAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2457267582] Expected: Should handle mixed signs +[Hera] [HADES][TEST ] [KRELTSC: 2458166361] Running DMAX.three_items: 1 2 3 DMAX +[Hera] [HADES][TEST ] [KRELTSC: 2459079315] Expected error occurred +[Hera] [HADES][TEST ] Testing DMAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2460732708] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2461761624] Running DMAX.empty_stack: DMAX +[Hera] [HADES][TEST ] [KRELTSC: 2462582934] Expected error occurred +[Hera] [HADES][TEST ] Testing DMAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2464030863] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2464964355] DMAX: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2465878212] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2466963912] Testing word: D= +[Hera] [HADES][TEST ] [KRELTSC: 2467639587] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2468401635] Running D=.equal: 100 200 100 200 D= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2469794796] Test passed +[Hera] [HADES][TEST ] Testing D= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2471089677] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 2471859810] Running D=.not_equal_low: 100 200 101 200 D= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2473405242] Test passed +[Hera] [HADES][TEST ] Testing D= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2474736768] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 2475488883] Running D=.not_equal_high: 100 200 100 201 D= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2476723956] Test passed +[Hera] [HADES][TEST ] Testing D= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2478017136] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 2478780003] Running D=.zero_equal: 0 0 0 0 D= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2479974294] Test passed +[Hera] [HADES][TEST ] Testing D= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2481210921] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 2482052034] Running D=.negative_equal: -100 -200 -100 -200 D= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2483321484] Test passed +[Hera] [HADES][TEST ] Testing D= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2484649482] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 2485429296] Running D=.three_items: 1 2 3 D= +[Hera] [HADES][TEST ] [KRELTSC: 2486618064] Expected error occurred +[Hera] [HADES][TEST ] Testing D= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2488008306] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2488886841] Running D=.empty_stack: D= +[Hera] [HADES][TEST ] [KRELTSC: 2489664639] Expected error occurred +[Hera] [HADES][TEST ] Testing D= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2491134576] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2491998663] D=: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2492894880] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2493966216] Testing word: D< +[Hera] [HADES][TEST ] [KRELTSC: 2494651992] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2495386551] Running D<.less_than: 100 200 300 400 D< . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2496795987] Test passed +[Hera] [HADES][TEST ] Testing D< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2498157522] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 2499251181] Running D<.greater_than: 300 400 100 200 D< . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2500529598] Test passed +[Hera] [HADES][TEST ] Testing D< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2501815512] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 2502621681] Running D<.equal: 100 200 100 200 D< . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2503856334] Test passed +[Hera] [HADES][TEST ] Testing D< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2505169401] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 2505981198] Running D<.negative_positive: -100 -1 100 0 D< . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2507240211] Test passed +[Hera] [HADES][TEST ] Testing D< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2508506091] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 2509324923] Running D<.negative_negative: -300 -1 -100 -1 D< . CR +[Hera] -1 +[Hera] [HADES][INFO ] [KRELTSC: 2510668629] L8[TABLE]: Config 37 → 38 regime=2 score=26214 L1=0 L2=1 L3=0 +[Hera] [HADES][TEST ] [KRELTSC: 2512047489] Test passed +[Hera] [HADES][TEST ] Testing D< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2513331912] Expected: Should compare negatives +[Hera] [HADES][TEST ] [KRELTSC: 2514197931] Running D<.high_word_diff: 100 200 100 300 D< . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2515539054] Test passed +[Hera] [HADES][TEST ] Testing D< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2516844372] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 2517674733] Running D<.three_items: 1 2 3 D< +[Hera] [HADES][TEST ] [KRELTSC: 2518556439] Expected error occurred +[Hera] [HADES][TEST ] Testing D< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2519952015] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2520860118] Running D<.empty_stack: D< +[Hera] [HADES][TEST ] [KRELTSC: 2521641738] Expected error occurred +[Hera] [HADES][TEST ] Testing D< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2523012534] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2524132779] D<: 8 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2525125764] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2526135717] Testing word: D0= +[Hera] [HADES][TEST ] [KRELTSC: 2526852342] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2527604226] Running D0=.zero: 0 0 D0= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2528809353] Test passed +[Hera] [HADES][TEST ] Testing D0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2530129707] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 2530931781] Running D0=.positive: 100 200 D0= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2532054756] Test passed +[Hera] [HADES][TEST ] Testing D0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2533382061] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 2534189049] Running D0=.negative: -100 -200 D0= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2535344490] Test passed +[Hera] [HADES][TEST ] Testing D0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2536881165] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 2537723874] Running D0=.zero_high: 0 100 D0= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2538885195] Test passed +[Hera] [HADES][TEST ] Testing D0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2540221530] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 2540990991] Running D0=.zero_low: 100 0 D0= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2542177113] Test passed +[Hera] [HADES][TEST ] Testing D0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2543487975] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 2544296643] Running D0=.one_item: 42 D0= +[Hera] [HADES][TEST ] [KRELTSC: 2545157181] Expected error occurred +[Hera] [HADES][TEST ] Testing D0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2546527137] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2547492612] Running D0=.empty_stack: D0= +[Hera] [HADES][TEST ] [KRELTSC: 2548267932] Expected error occurred +[Hera] [HADES][TEST ] Testing D0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2549883210] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2550746583] D0=: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2551658067] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2552669322] Testing word: D0< +[Hera] [HADES][TEST ] [KRELTSC: 2553365472] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2554136277] Running D0<.negative: -100 -1 D0< . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2555426223] Test passed +[Hera] [HADES][TEST ] Testing D0< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2556725430] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 2557553103] Running D0<.zero: 0 0 D0< . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2558662764] Test passed +[Hera] [HADES][TEST ] Testing D0< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2559980829] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 2560775028] Running D0<.positive: 100 0 D0< . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2562175056] Test passed +[Hera] [HADES][TEST ] Testing D0< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2563490202] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 2564288013] Running D0<.negative_high_only: 100 -1 D0< . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2565542343] Test passed +[Hera] [HADES][TEST ] Testing D0< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2566883823] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 2567694087] Running D0<.large_negative: -1 -1 D0< . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2568929664] Test passed +[Hera] [HADES][TEST ] Testing D0< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2570309973] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 2571092958] Running D0<.one_item: 42 D0< +[Hera] [HADES][TEST ] [KRELTSC: 2571990057] Expected error occurred +[Hera] [HADES][TEST ] Testing D0< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2573363289] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2574372675] Running D0<.empty_stack: D0< +[Hera] [HADES][TEST ] [KRELTSC: 2575202364] Expected error occurred +[Hera] [HADES][TEST ] Testing D0< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2576598717] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2577467277] D0<: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2578380861] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2579407677] Testing word: S>D +[Hera] [HADES][TEST ] [KRELTSC: 2580098892] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2580848088] Running S>D.positive: 5 S>D . . CR +[Hera] 0 5 +[Hera] [HADES][TEST ] [KRELTSC: 2582112015] Test passed +[Hera] [HADES][TEST ] Testing S>D ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2583388290] Expected: Should sign-extend positive: 0 5 +[Hera] [HADES][TEST ] [KRELTSC: 2584320207] Running S>D.negative: -5 S>D . . CR +[Hera] -1 -5 +[Hera] [HADES][TEST ] [KRELTSC: 2585448453] Test passed +[Hera] [HADES][TEST ] Testing S>D ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2586970428] Expected: Should sign-extend negative: -1 -5 +[Hera] [HADES][TEST ] [KRELTSC: 2587839828] Running S>D.zero: 0 S>D . . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 2589010242] Test passed +[Hera] [HADES][TEST ] Testing S>D ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2590292796] Expected: Should sign-extend zero: 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 2591183637] Running S>D.max_int: 2147483647 S>D . . CR +[Hera] 0 2147483647 +[Hera] [HADES][TEST ] [KRELTSC: 2592480261] Test passed +[Hera] [HADES][TEST ] Testing S>D ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2593826214] Expected: Should extend max int: 0 2147483647 +[Hera] [HADES][TEST ] [KRELTSC: 2594773440] Running S>D.min_int: -2147483648 S>D . . CR +[Hera] -1 -2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 2596122732] Test passed +[Hera] [HADES][TEST ] Testing S>D ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2597485296] Expected: Should extend min int: -1 -2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 2598457050] Running S>D.empty_stack: S>D +[Hera] [HADES][TEST ] [KRELTSC: 2599561419] Expected error occurred +[Hera] [HADES][TEST ] Testing S>D ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2600959641] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2601861381] S>D: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2602792710] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2603844516] Testing word: D2* +[Hera] [HADES][TEST ] [KRELTSC: 2604547659] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2605401435] Running D2*.basic: 5 0 D2* . . CR +[Hera] 0 10 +[Hera] [HADES][TEST ] [KRELTSC: 2606660994] Test passed +[Hera] [HADES][TEST ] Testing D2* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2607952935] Expected: Should double 5: 0 10 +[Hera] [HADES][TEST ] [KRELTSC: 2608798269] Running D2*.zero: 0 0 D2* . . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 2609966520] Test passed +[Hera] [HADES][TEST ] Testing D2* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2611299453] Expected: Should double zero: 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 2612385090] Running D2*.negative: -1 -1 D2* . . CR +[Hera] -1 -2 +[Hera] [HADES][TEST ] [KRELTSC: 2613597672] Test passed +[Hera] [HADES][TEST ] Testing D2* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2614903347] Expected: Should double -1: -1 -2 +[Hera] [HADES][TEST ] [KRELTSC: 2615751306] Running D2*.carry: 0 1 D2* . . CR +[Hera] 2 0 +[Hera] [HADES][TEST ] [KRELTSC: 2616883185] Test passed +[Hera] [HADES][TEST ] Testing D2* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2618184282] Expected: Should shift high cell: 0 2 +[Hera] [HADES][TEST ] [KRELTSC: 2619061158] Running D2*.empty_stack: D2* +[Hera] [HADES][TEST ] [KRELTSC: 2619919848] Expected error occurred +[Hera] [HADES][TEST ] Testing D2* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2621334765] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2622186294] D2*: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2623141626] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2624320230] Testing word: D2/ +[Hera] [HADES][TEST ] [KRELTSC: 2625347508] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2626123836] Running D2/.basic: 10 0 D2/ . . CR +[Hera] 0 5 +[Hera] [HADES][TEST ] [KRELTSC: 2627440200] Test passed +[Hera] [HADES][TEST ] Testing D2/ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2628776094] Expected: Should halve 10: 0 5 +[Hera] [HADES][TEST ] [KRELTSC: 2629598664] Running D2/.negative: -2 -1 D2/ . . CR +[Hera] -1 -1 +[Hera] [HADES][TEST ] [KRELTSC: 2630805807] Test passed +[Hera] [HADES][TEST ] Testing D2/ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2632176876] Expected: Should halve -2: -1 -1 +[Hera] [HADES][TEST ] [KRELTSC: 2633055306] Running D2/.zero: 0 0 D2/ . . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 2634153942] Test passed +[Hera] [HADES][TEST ] Testing D2/ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2635518312] Expected: Should halve zero: 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 2636355897] Running D2/.odd: 3 0 D2/ . . CR +[Hera] 0 1 +[Hera] [HADES][TEST ] [KRELTSC: 2637666003] Test passed +[Hera] [HADES][TEST ] Testing D2/ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2639003157] Expected: Should truncate toward zero: 0 1 +[Hera] [HADES][TEST ] [KRELTSC: 2639958363] Running D2/.empty_stack: D2/ +[Hera] [HADES][TEST ] [KRELTSC: 2640819237] Expected error occurred +[Hera] [HADES][TEST ] Testing D2/ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2642193960] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2643094860] D2/: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2643961887] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2645006322] Testing word: 2>R +[Hera] [HADES][TEST ] [KRELTSC: 2645705181] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2646439992] Running 2>R.roundtrip: 10 20 2>R 2R> . . CR +[Hera] 20 10 +[Hera] [HADES][TEST ] [KRELTSC: 2647941156] Test passed +[Hera] [HADES][TEST ] Testing 2>R ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2649361533] Expected: Should store and retrieve: 20 10 +[Hera] [HADES][TEST ] [KRELTSC: 2650276965] Running 2>R.depth_after: 1 2 2>R DEPTH . 2R> DROP DROP CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2651589738] Test passed +[Hera] [HADES][TEST ] Testing 2>R ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2652924582] Expected: Should empty data stack: 0 +[Hera] [HADES][TEST ] [KRELTSC: 2653825104] Running 2>R.empty_stack: 2>R +[Hera] [HADES][TEST ] [KRELTSC: 2654652231] Expected error occurred +[Hera] [HADES][TEST ] Testing 2>R ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2656044279] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2656933713] 2>R: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2657875605] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2658919641] Testing word: 2R> +[Hera] [HADES][TEST ] [KRELTSC: 2659615413] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2660373849] Running 2R>.roundtrip: 5 6 2>R 2R> . . CR +[Hera] 6 5 +[Hera] [HADES][TEST ] [KRELTSC: 2661573579] Test passed +[Hera] [HADES][TEST ] Testing 2R> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2663052798] Expected: Should retrieve double: 6 5 +[Hera] [HADES][TEST ] [KRELTSC: 2663928876] Running 2R>.depth: 9 8 2>R 2R> DEPTH . CR +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 2665124595] Test passed +[Hera] [HADES][TEST ] Testing 2R> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2666402298] Expected: Should push 2 items to data stack: 2 +[Hera] [HADES][TEST ] [KRELTSC: 2667346395] Running 2R>.empty_rstack: 2R> +[Hera] [HADES][TEST ] [KRELTSC: 2668198848] Expected error occurred +[Hera] [HADES][TEST ] Testing 2R> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2669604399] Expected: Should cause return stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2670561831] 2R>: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2671467918] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2672565861] Testing word: 2R@ +[Hera] [HADES][TEST ] [KRELTSC: 2673259176] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2674005180] Running 2R@.peek: 3 4 2>R 2R@ . . 2R> DROP DROP CR +[Hera] 4 3 +[Hera] [HADES][TEST ] [KRELTSC: 2675569365] Test passed +[Hera] [HADES][TEST ] Testing 2R@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2676851478] Expected: Should peek: 4 3 +[Hera] [HADES][TEST ] [KRELTSC: 2677641792] Running 2R@.non_destructive: 7 8 2>R 2R@ DROP DROP 2R> . . CR +[Hera] 8 7 +[Hera] [HADES][TEST ] [KRELTSC: 2679014898] Test passed +[Hera] [HADES][TEST ] Testing 2R@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2680343190] Expected: Should leave rstack intact +[Hera] [HADES][TEST ] [KRELTSC: 2681223006] Running 2R@.empty_rstack: 2R@ +[Hera] [HADES][TEST ] [KRELTSC: 2682059562] Expected error occurred +[Hera] [HADES][TEST ] Testing 2R@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2683502556] Expected: Should cause return stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2684412255] 2R@: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2685402006] === Double Number Words Summary: 0 passed, 0 failed, 0 skipped, +[Hera] [HADES][INFO ] [KRELTSC: 2686441779] +[Hera] === Testing Module: Format Words === +[Hera] [HADES][INFO ] [KRELTSC: 2687725845] Running Format Words Tests (Module 10)... +[Hera] [HADES][TEST ] [KRELTSC: 2688630000] ▶ Testing module: v3/src/test_runner/modules/format_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2689749741] Testing word: BASE +[Hera] [HADES][TEST ] [KRELTSC: 2690461473] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2691196158] Running BASE.decimal: DECIMAL 42 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 2692398639] Test passed +[Hera] [HADES][TEST ] Testing BASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2693715612] Expected: Should print: 42 +[Hera] [HADES][TEST ] [KRELTSC: 2694504561] Running BASE.hex: HEX FF . CR +[Hera] FF +[Hera] [HADES][TEST ] [KRELTSC: 2695639758] Test passed +[Hera] [HADES][TEST ] Testing BASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2696920590] Expected: Should print: FF +[Hera] [HADES][TEST ] [KRELTSC: 2697729846] Running BASE.octal: OCTAL 52 . CR +[Hera] 52 +[Hera] [HADES][TEST ] [KRELTSC: 2698895199] Test passed +[Hera] [HADES][TEST ] Testing BASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2700360306] Expected: Should print: 52 +[Hera] [HADES][TEST ] [KRELTSC: 2701180062] Running BASE.base_store: 16 BASE ! 255 . CR +[Hera] 723 +[Hera] [HADES][TEST ] [KRELTSC: 2702412342] Test passed +[Hera] [HADES][TEST ] Testing BASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2703736413] Expected: Should print: FF +[Hera] [HADES][TEST ] [KRELTSC: 2704528281] Running BASE.base_fetch: BASE @ . CR +[Hera] 16 +[Hera] [HADES][TEST ] [KRELTSC: 2705648316] Test passed +[Hera] [HADES][TEST ] Testing BASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2706969741] Expected: Should print current base +[Hera] [HADES][TEST ] [KRELTSC: 2707845168] BASE: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2708814675] ▶ Testing module: v3/src/test_runner/modules/format_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2709836241] Testing word: DECIMAL +[Hera] [HADES][TEST ] [KRELTSC: 2710553832] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2711256597] Running DECIMAL.from_hex: HEX FF DECIMAL . CR +[Hera] 255 +[Hera] [HADES][TEST ] [KRELTSC: 2712655092] Test passed +[Hera] [HADES][TEST ] Testing DECIMAL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2714008773] Expected: Should print: 255 +[Hera] [HADES][TEST ] [KRELTSC: 2714799465] Running DECIMAL.from_octal: OCTAL 52 DECIMAL . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 2716261317] Test passed +[Hera] [HADES][TEST ] Testing DECIMAL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2717911854] Expected: Should print: 42 +[Hera] [HADES][TEST ] [KRELTSC: 2718742929] Running DECIMAL.state_persist: DECIMAL 42 . CR 42 . CR HEX 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 2720734905] Test passed +[Hera] [HADES][TEST ] Testing DECIMAL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2722087620] Expected: Should maintain base +[Hera] [HADES][TEST ] [KRELTSC: 2722896813] DECIMAL: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2723863905] ▶ Testing module: v3/src/test_runner/modules/format_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2725040073] Testing word: HEX +[Hera] [HADES][TEST ] [KRELTSC: 2725756005] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2726520909] Running HEX.from_decimal: DECIMAL 255 HEX . CR +[Hera] FF +[Hera] [HADES][TEST ] [KRELTSC: 2727766986] Test passed +[Hera] [HADES][TEST ] Testing HEX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2729119407] Expected: Should print: FF +[Hera] [HADES][TEST ] [KRELTSC: 2729962431] Running HEX.from_octal: OCTAL 52 HEX . CR +[Hera] 2A +[Hera] [HADES][TEST ] [KRELTSC: 2731499505] Test passed +[Hera] [HADES][TEST ] Testing HEX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2733123057] Expected: Should print: 2A +[Hera] [HADES][TEST ] [KRELTSC: 2734120011] Running HEX.state_persist: HEX FF . CR DECIMAL 255 . CR +[Hera] FF +[Hera] [HADES][INFO ] [KRELTSC: 2735749800] L8[TABLE]: Config 38 → 39 regime=2 score=52428 L1=0 L2=1 L3=0 +[Hera] 255 +[Hera] [HADES][TEST ] [KRELTSC: 2737231350] Test passed +[Hera] [HADES][TEST ] Testing HEX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2738648241] Expected: Should maintain base +[Hera] [HADES][TEST ] [KRELTSC: 2739477972] HEX: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2740368897] ▶ Testing module: v3/src/test_runner/modules/format_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2741428473] Testing word: OCTAL +[Hera] [HADES][TEST ] [KRELTSC: 2742135459] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2742871341] Running OCTAL.from_decimal: DECIMAL 42 OCTAL . CR +[Hera] 52 +[Hera] [HADES][TEST ] [KRELTSC: 2744176323] Test passed +[Hera] [HADES][TEST ] Testing OCTAL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2745492981] Expected: Should print: 52 +[Hera] [HADES][TEST ] [KRELTSC: 2746314837] Running OCTAL.from_hex: HEX 2A OCTAL . CR +[Hera] 52 +[Hera] [HADES][TEST ] [KRELTSC: 2747569314] Test passed +[Hera] [HADES][TEST ] Testing OCTAL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2748864762] Expected: Should print: 52 +[Hera] [HADES][TEST ] [KRELTSC: 2749677525] Running OCTAL.state_persist: DECIMAL 42 . CR OCTAL 52 . CR +[Hera] 42 +[Hera] 52 +[Hera] [HADES][TEST ] [KRELTSC: 2751598269] Test passed +[Hera] [HADES][TEST ] Testing OCTAL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2752937943] Expected: Should maintain base +[Hera] [HADES][TEST ] [KRELTSC: 2753824101] OCTAL: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2754797409] ▶ Testing module: v3/src/test_runner/modules/format_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2755892958] Testing word: <# +[Hera] [HADES][TEST ] [KRELTSC: 2756585853] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2757310227] Running <#.basic: DECIMAL 42 S>D <# #S #> TYPE CR +[Hera] 774763251095801167872 +[Hera] [HADES][TEST ] [KRELTSC: 2759666238] Test passed +[Hera] [HADES][TEST ] Testing <# ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2760948708] Expected: Should format number +[Hera] [HADES][TEST ] [KRELTSC: 2761779132] Running <#.empty: 0 <# #> TYPE CR + +[Hera] [HADES][TEST ] [KRELTSC: 2762912712] Test passed +[Hera] [HADES][TEST ] Testing <# ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2764226052] Expected: Should handle zero +[Hera] [HADES][TEST ] [KRELTSC: 2765063091] Running <#.negative: -42 <# #S #> TYPE CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 2766310722] Test passed +[Hera] [HADES][TEST ] Testing <# ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2767607976] Expected: Should handle negative +[Hera] [HADES][TEST ] [KRELTSC: 2768452470] <#: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2769329388] ▶ Testing module: v3/src/test_runner/modules/format_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2770407822] Testing word: # +[Hera] [HADES][TEST ] [KRELTSC: 2771125119] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2771872635] Running #.single_digit: 15 <# # #> TYPE CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 2773213842] Test passed +[Hera] [HADES][TEST ] Testing # ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2774485224] Expected: Should print rightmost digit +[Hera] [HADES][TEST ] [KRELTSC: 2775550407] Running #.multiple: 15 <# # # #> TYPE CR +[Hera] 15 +[Hera] [HADES][TEST ] [KRELTSC: 2776772145] Test passed +[Hera] [HADES][TEST ] Testing # ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2778127842] Expected: Should print digits right to left +[Hera] [HADES][TEST ] [KRELTSC: 2779082334] Running #.zero_pad: 5 <# # 0 # #> TYPE CR +[Hera] 05 +[Hera] [HADES][TEST ] [KRELTSC: 2780228703] Test passed +[Hera] [HADES][TEST ] Testing # ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2781518397] Expected: Should handle zero padding +[Hera] [HADES][TEST ] [KRELTSC: 2782531311] #: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2783664387] ▶ Testing module: v3/src/test_runner/modules/format_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2784755211] Testing word: #S +[Hera] [HADES][TEST ] [KRELTSC: 2785461231] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2786228529] Running #S.basic: 42 <# #S #> TYPE CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 2787673434] Test passed +[Hera] [HADES][TEST ] Testing #S ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2788986543] Expected: Should convert all digits +[Hera] [HADES][TEST ] [KRELTSC: 2789868186] Running #S.zero: 0 <# #S #> TYPE CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2790978099] Test passed +[Hera] [HADES][TEST ] Testing #S ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2792312208] Expected: Should handle zero +[Hera] [HADES][TEST ] [KRELTSC: 2793109389] Running #S.large: 1234567890 <# #S #> TYPE CR +[Hera] 1234567890 +[Hera] [HADES][TEST ] [KRELTSC: 2794398600] Test passed +[Hera] [HADES][TEST ] Testing #S ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2795714586] Expected: Should handle large numbers +[Hera] [HADES][TEST ] [KRELTSC: 2796608388] #S: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2797505718] ▶ Testing module: v3/src/test_runner/modules/format_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2798549775] Testing word: SIGN +[Hera] [HADES][TEST ] [KRELTSC: 2799275409] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2800120050] Running SIGN.negative: -42 ABS <# #S SIGN #> TYPE CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 2801691354] Test passed +[Hera] [HADES][TEST ] Testing SIGN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2803038231] Expected: Should add minus +[Hera] [HADES][TEST ] [KRELTSC: 2803850175] Running SIGN.positive: 42 <# #S SIGN #> TYPE CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 2805099171] Test passed +[Hera] [HADES][TEST ] Testing SIGN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2806436703] Expected: Should not add sign +[Hera] [HADES][TEST ] [KRELTSC: 2807227101] Running SIGN.zero: 0 <# #S SIGN #> TYPE CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2808426600] Test passed +[Hera] [HADES][TEST ] Testing SIGN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2809744161] Expected: Should handle zero +[Hera] [HADES][TEST ] [KRELTSC: 2810595795] SIGN: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2811531954] ▶ Testing module: v3/src/test_runner/modules/format_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2812607763] Testing word: #> +[Hera] [HADES][TEST ] [KRELTSC: 2813586993] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2814364497] Running #>.normal: 42 <# #S #> TYPE CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 2815552740] Test passed +[Hera] [HADES][TEST ] Testing #> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2816941680] Expected: Should terminate formatting +[Hera] [HADES][TEST ] [KRELTSC: 2817828720] Running #>.empty: 0 <# #> TYPE CR + +[Hera] [HADES][TEST ] [KRELTSC: 2818763787] Test passed +[Hera] [HADES][TEST ] Testing #> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2820056253] Expected: Should handle empty format +[Hera] [HADES][TEST ] [KRELTSC: 2820925086] Running #>.stack_effect: 42 <# #S #> SWAP . . CR +[Hera] 24 2 +[Hera] [HADES][TEST ] [KRELTSC: 2822212596] Test passed +[Hera] [HADES][TEST ] Testing #> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2823542799] Expected: Should leave addr u +[Hera] [HADES][TEST ] [KRELTSC: 2824345335] #>: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2825326266] ▶ Testing module: v3/src/test_runner/modules/format_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2826517428] Testing word: HOLD +[Hera] [HADES][TEST ] [KRELTSC: 2827250055] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2828023485] Running HOLD.basic: 42 <# 46 HOLD #S #> TYPE CR +[Hera] 42. +[Hera] [HADES][TEST ] [KRELTSC: 2829329748] Test passed +[Hera] [HADES][TEST ] Testing HOLD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2830641093] Expected: Should insert dot +[Hera] [HADES][TEST ] [KRELTSC: 2831489808] Running HOLD.overflow: <# 257 HOLD #> +[Hera] [HADES][ERROR] [KRELTSC: 2832509610] HOLD: byte out of range (257) +[Hera] [HADES][TEST ] [KRELTSC: 2833537203] Expected error occurred +[Hera] [HADES][TEST ] Testing HOLD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2834981499] Expected: Should handle overflow +[Hera] [HADES][TEST ] [KRELTSC: 2835956571] HOLD: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2836909446] === Format Words Summary: 0 passed, 0 failed, 0 skipped, 0 erro +[Hera] [HADES][INFO ] [KRELTSC: 2838164973] +[Hera] === Testing Module: String Words === +[Hera] [HADES][INFO ] [KRELTSC: 2839259262] Running String Words Tests (Module 11)... +[Hera] [HADES][TEST ] [KRELTSC: 2840207118] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2841265938] Testing word: COUNT +[Hera] [HADES][TEST ] [KRELTSC: 2841996444] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2842713699] Running COUNT.basic: HERE S" Test" DROP COUNT . . CR +[Hera] 84 121 +[Hera] [HADES][TEST ] [KRELTSC: 2844554181] Test passed +[Hera] [HADES][TEST ] Testing COUNT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2845873695] Expected: Should show length and addr+1 +[Hera] [HADES][TEST ] [KRELTSC: 2846786187] Running COUNT.empty: HERE 0 OVER C! COUNT . . CR +[Hera] 0 126 +[Hera] [HADES][TEST ] [KRELTSC: 2848092996] Test passed +[Hera] [HADES][TEST ] Testing COUNT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2849402829] Expected: Should handle empty string +[Hera] [HADES][TEST ] [KRELTSC: 2850333843] Running COUNT.max_length: HERE 255 OVER C! COUNT . . CR +[Hera] 255 126 +[Hera] [HADES][TEST ] [KRELTSC: 2852116197] Test passed +[Hera] [HADES][TEST ] Testing COUNT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2853468807] Expected: Should handle max length +[Hera] [HADES][TEST ] [KRELTSC: 2854334931] Running COUNT.string_bounds: HERE COUNT SWAP 1- = . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2855704299] Test passed +[Hera] [HADES][TEST ] Testing COUNT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2857083033] Expected: Should increment address +[Hera] [HADES][TEST ] [KRELTSC: 2857937901] Running COUNT.empty_stack: COUNT +[Hera] [HADES][ERROR] [KRELTSC: 2858882292] COUNT: Data stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2859727416] Expected error occurred +[Hera] [HADES][TEST ] Testing COUNT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2861233221] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2862137292] COUNT: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2863304115] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2864343363] Testing word: -TRAILING +[Hera] [HADES][TEST ] [KRELTSC: 2865129036] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2865890139] Running -TRAILING.basic: HERE S" Test " -TRAILING TYPE CR +[Hera] Test +[Hera] [HADES][TEST ] [KRELTSC: 2867559597] Test passed +[Hera] [HADES][TEST ] Testing -TRAILING ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2868952800] Expected: Should trim spaces +[Hera] [HADES][TEST ] [KRELTSC: 2869750317] Running -TRAILING.all_spaces: HERE S" " -TRAILING TYPE CR + +[Hera] [HADES][TEST ] [KRELTSC: 2870909685] Test passed +[Hera] [HADES][TEST ] Testing -TRAILING ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2872260678] Expected: Should handle all spaces +[Hera] [HADES][TEST ] [KRELTSC: 2873098641] Running -TRAILING.no_spaces: HERE S" Test" -TRAILING TYPE CR +[Hera] Test +[Hera] [HADES][TEST ] [KRELTSC: 2874464502] Test passed +[Hera] [HADES][TEST ] Testing -TRAILING ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2876138139] Expected: Should handle no spaces +[Hera] [HADES][TEST ] [KRELTSC: 2877006342] Running -TRAILING.empty: HERE 0 -TRAILING TYPE CR + +[Hera] [HADES][TEST ] [KRELTSC: 2878094961] Test passed +[Hera] [HADES][TEST ] Testing -TRAILING ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2879406831] Expected: Should handle empty string +[Hera] [HADES][TEST ] [KRELTSC: 2880298365] -TRAILING: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2881237044] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2882286309] Testing word: CMOVE +[Hera] [HADES][TEST ] [KRELTSC: 2883016227] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2883785331] Running CMOVE.basic: HERE S" Test" DUP >R HERE 10 + SWAP CMOV + +[Hera] [HADES][TEST ] [KRELTSC: 2885294538] Test passed +[Hera] [HADES][TEST ] Testing CMOVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2886723189] Expected: Should copy string +[Hera] [HADES][TEST ] [KRELTSC: 2887565079] Running CMOVE.empty: HERE HERE 10 + 0 CMOVE +[Hera] [HADES][TEST ] [KRELTSC: 2888760609] Test passed +[Hera] [HADES][TEST ] Testing CMOVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2890146630] Expected: Should handle zero count +[Hera] [HADES][TEST ] [KRELTSC: 2891032200] Running CMOVE.overlap: HERE DUP 1+ 5 CMOVE +[Hera] [HADES][TEST ] [KRELTSC: 2891982198] Test passed +[Hera] [HADES][TEST ] Testing CMOVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2893381008] Expected: Should handle overlap +[Hera] [HADES][TEST ] [KRELTSC: 2894243058] Running CMOVE.bounds: HERE PAD 1000 CMOVE +[Hera] [HADES][ERROR] [KRELTSC: 2895275355] CMOVE: out-of-bounds (src=125 dst=5242368 n=1000) +[Hera] [HADES][TEST ] [KRELTSC: 2896178292] Expected error occurred +[Hera] [HADES][TEST ] Testing CMOVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2897576556] Expected: Should check bounds +[Hera] [HADES][TEST ] [KRELTSC: 2898404502] CMOVE: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2899287741] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2900365188] Testing word: CMOVE> +[Hera] [HADES][TEST ] [KRELTSC: 2901376905] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2902230891] Running CMOVE>.basic: HERE S" Test" DUP >R HERE 10 + SWAP CMO + +[Hera] [HADES][TEST ] [KRELTSC: 2903717796] Test passed +[Hera] [HADES][TEST ] Testing CMOVE> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2905097013] Expected: Should copy backward +[Hera] [HADES][TEST ] [KRELTSC: 2905933926] Running CMOVE>.empty: HERE HERE 10 + 0 CMOVE> +[Hera] [HADES][TEST ] [KRELTSC: 2906951880] Test passed +[Hera] [HADES][TEST ] Testing CMOVE> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2908307073] Expected: Should handle zero count +[Hera] [HADES][TEST ] [KRELTSC: 2909160072] Running CMOVE>.overlap: HERE DUP 1+ 5 CMOVE> +[Hera] [HADES][TEST ] [KRELTSC: 2910098121] Test passed +[Hera] [HADES][TEST ] Testing CMOVE> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2911400856] Expected: Should handle overlap +[Hera] [HADES][TEST ] [KRELTSC: 2912237202] Running CMOVE>.bounds: HERE PAD 1000 CMOVE> +[Hera] [HADES][ERROR] [KRELTSC: 2913339891] CMOVE>: out-of-bounds (src=125 dst=5242368 n=1000) +[Hera] [HADES][TEST ] [KRELTSC: 2914268154] Expected error occurred +[Hera] [HADES][TEST ] Testing CMOVE> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2915666712] Expected: Should check bounds +[Hera] [HADES][TEST ] [KRELTSC: 2916465636] CMOVE>: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2917440561] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2918495391] Testing word: COMPARE +[Hera] [HADES][TEST ] [KRELTSC: 2919227997] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2920023120] Running COMPARE.equal: HERE S" Test" HERE S" Test" COMPARE . +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2921717211] Test passed +[Hera] [HADES][TEST ] Testing COMPARE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2923045797] Expected: Should return 0 +[Hera] [HADES][TEST ] [KRELTSC: 2923846065] Running COMPARE.less: HERE S" Test1" HERE S" Test2" COMPARE . +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2925176373] Test passed +[Hera] [HADES][TEST ] Testing COMPARE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2926766997] Expected: Should return -1 +[Hera] [HADES][TEST ] [KRELTSC: 2927557416] Running COMPARE.greater: HERE S" Test2" HERE S" Test1" COMPAR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2928901500] Test passed +[Hera] [HADES][TEST ] Testing COMPARE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2930232648] Expected: Should return 1 +[Hera] [HADES][TEST ] [KRELTSC: 2931048834] Running COMPARE.different_lengths: HERE S" Test" HERE S" Test +[Hera] [HADES][INFO ] [KRELTSC: 2932216938] L8[TABLE]: Config 39 → 40 regime=2 score=6553 L1=0 L2=1 L3=0 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2933593950] Test passed +[Hera] [HADES][TEST ] Testing COMPARE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2934935199] Expected: Should handle lengths +[Hera] [HADES][TEST ] [KRELTSC: 2935789689] Running COMPARE.empty: HERE 0 HERE 0 COMPARE . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2937201330] Test passed +[Hera] [HADES][TEST ] Testing COMPARE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2938693443] Expected: Should handle empty +[Hera] [HADES][TEST ] [KRELTSC: 2939641551] COMPARE: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2940581931] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2941623846] Testing word: SEARCH +[Hera] [HADES][TEST ] [KRELTSC: 2942333226] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2943124002] Running SEARCH.found: HERE S" Testing" HERE S" Test" SEARCH . +[Hera] -1 15 120 +[Hera] [HADES][TEST ] [KRELTSC: 2945053041] Test passed +[Hera] [HADES][TEST ] Testing SEARCH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2946422850] Expected: Should find substring +[Hera] [HADES][TEST ] [KRELTSC: 2947256634] Running SEARCH.not_found: HERE S" Testing" HERE S" Xyz" SEARC +[Hera] -1 7 141 +[Hera] [HADES][TEST ] [KRELTSC: 2948741397] Test passed +[Hera] [HADES][TEST ] Testing SEARCH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2950049151] Expected: Should return false +[Hera] [HADES][TEST ] [KRELTSC: 2951106648] Running SEARCH.empty_pattern: HERE S" Test" HERE 0 SEARCH . . +[Hera] -1 4 145 +[Hera] [HADES][TEST ] [KRELTSC: 2952735933] Test passed +[Hera] [HADES][TEST ] Testing SEARCH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2954032599] Expected: Should handle empty pattern +[Hera] [HADES][TEST ] [KRELTSC: 2954895342] Running SEARCH.empty_string: HERE 0 HERE S" Test" SEARCH . . +[Hera] -1 30 120 +[Hera] [HADES][TEST ] [KRELTSC: 2956325337] Test passed +[Hera] [HADES][TEST ] Testing SEARCH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2957676981] Expected: Should handle empty string +[Hera] [HADES][TEST ] [KRELTSC: 2958568620] SEARCH: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2959505871] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2960519772] Testing word: SCAN +[Hera] [HADES][TEST ] [KRELTSC: 2961228606] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2961973203] Running SCAN.basic: HERE S" Test,Data" BL SCAN TYPE CR + +[Hera] [HADES][TEST ] [KRELTSC: 2963323839] Test passed +[Hera] [HADES][TEST ] Testing SCAN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2964969210] Expected: Should find space +[Hera] [HADES][TEST ] [KRELTSC: 2965770507] Running SCAN.not_found: HERE S" TestData" BL SCAN TYPE CR + +[Hera] [HADES][TEST ] [KRELTSC: 2966873805] Test passed +[Hera] [HADES][TEST ] Testing SCAN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2968175742] Expected: Should scan to end +[Hera] [HADES][TEST ] [KRELTSC: 2968974267] Running SCAN.empty: HERE 0 BL SCAN TYPE CR + +[Hera] [HADES][TEST ] [KRELTSC: 2969997261] Test passed +[Hera] [HADES][TEST ] Testing SCAN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2971296132] Expected: Should handle empty +[Hera] [HADES][TEST ] [KRELTSC: 2972117211] Running SCAN.all_delims: HERE S" " BL SCAN TYPE CR +[Hera] +[Hera] [HADES][TEST ] [KRELTSC: 2973458250] Test passed +[Hera] [HADES][TEST ] Testing SCAN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2974777113] Expected: Should handle all delims +[Hera] [HADES][TEST ] [KRELTSC: 2975685321] SCAN: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2976827238] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2977906575] Testing word: SKIP +[Hera] [HADES][TEST ] [KRELTSC: 2978611734] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2979330753] Running SKIP.basic: HERE S" Test" BL SKIP TYPE CR +[Hera] Test +[Hera] [HADES][TEST ] [KRELTSC: 2980905858] Test passed +[Hera] [HADES][TEST ] Testing SKIP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2982178038] Expected: Should skip spaces +[Hera] [HADES][TEST ] [KRELTSC: 2983015707] Running SKIP.no_delims: HERE S" Test" BL SKIP TYPE CR +[Hera] Test +[Hera] [HADES][TEST ] [KRELTSC: 2984342676] Test passed +[Hera] [HADES][TEST ] Testing SKIP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2985663660] Expected: Should not skip +[Hera] [HADES][TEST ] [KRELTSC: 2986471614] Running SKIP.empty: HERE 0 BL SKIP TYPE CR + +[Hera] [HADES][TEST ] [KRELTSC: 2987478081] Test passed +[Hera] [HADES][TEST ] Testing SKIP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2988921516] Expected: Should handle empty +[Hera] [HADES][TEST ] [KRELTSC: 2989712229] Running SKIP.all_delims: HERE S" " BL SKIP TYPE CR + +[Hera] [HADES][TEST ] [KRELTSC: 2990793099] Test passed +[Hera] [HADES][TEST ] Testing SKIP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2992138884] Expected: Should skip all +[Hera] [HADES][TEST ] [KRELTSC: 2993012211] SKIP: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2993914098] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 2994993498] Testing word: BLANK +[Hera] [HADES][TEST ] [KRELTSC: 2995721988] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2996446740] Running BLANK.basic: HERE 5 BLANK HERE 5 TYPE CR +[Hera] +[Hera] [HADES][TEST ] [KRELTSC: 2997996603] Test passed +[Hera] [HADES][TEST ] Testing BLANK ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2999316663] Expected: Should fill with spaces +[Hera] [HADES][TEST ] [KRELTSC: 3000201582] Running BLANK.zero: HERE 0 BLANK HERE 0 TYPE CR + +[Hera] [HADES][TEST ] [KRELTSC: 3001395789] Test passed +[Hera] [HADES][TEST ] Testing BLANK ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3002772948] Expected: Should handle zero count +[Hera] [HADES][TEST ] [KRELTSC: 3003621348] BLANK: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3004572690] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 3005609817] Testing word: S" +[Hera] [HADES][TEST ] [KRELTSC: 3006289797] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3007063605] Running S".interpret_len: S" hello" . CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 3008289837] Test passed +[Hera] [HADES][TEST ] Testing S" ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3009593118] Expected: Should print: 5 (length) +[Hera] [HADES][TEST ] [KRELTSC: 3010424067] Running S".interpret_type: S" hello" TYPE CR +[Hera] hello +[Hera] [HADES][TEST ] [KRELTSC: 3011620311] Test passed +[Hera] [HADES][TEST ] Testing S" ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3012864561] Expected: Should print: hello +[Hera] [HADES][TEST ] [KRELTSC: 3013693704] Running S".empty: S" " . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3015101460] Test passed +[Hera] [HADES][TEST ] Testing S" ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3016461042] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 3017249277] Running S".compile_type: : TSQ S" world" TYPE CR ; TSQ +[Hera] world +[Hera] [HADES][TEST ] [KRELTSC: 3021219558] Test passed +[Hera] [HADES][TEST ] Testing S" ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3022534431] Expected: Should print: world +[Hera] [HADES][TEST ] [KRELTSC: 3023340537] Running S".compile_len: : TSQ2 S" forth" SWAP DROP . CR ; TSQ +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 3024958818] Test passed +[Hera] [HADES][TEST ] Testing S" ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3026245656] Expected: Should print: 5 +[Hera] [HADES][TEST ] [KRELTSC: 3027238452] Running S".compile_twice: : TSQ3 S" ab" TYPE S" cd" TYPE CR ; +[Hera] abcd +[Hera] [HADES][TEST ] [KRELTSC: 3028904193] Test passed +[Hera] [HADES][TEST ] Testing S" ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3030167175] Expected: Should print: abcd +[Hera] [HADES][TEST ] [KRELTSC: 3030973953] S": 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3031881426] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 3032886780] Testing word: BL +[Hera] [HADES][TEST ] [KRELTSC: 3033572157] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3034337607] Running BL.value: BL . CR +[Hera] 32 +[Hera] [HADES][TEST ] [KRELTSC: 3035448990] Test passed +[Hera] [HADES][TEST ] Testing BL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3036770415] Expected: Should print: 32 +[Hera] [HADES][TEST ] [KRELTSC: 3037563816] Running BL.as_char: BL EMIT CR +[Hera] +[Hera] [HADES][TEST ] [KRELTSC: 3038754621] Test passed +[Hera] [HADES][TEST ] Testing BL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3040392390] Expected: Should emit a space +[Hera] [HADES][TEST ] [KRELTSC: 3041216052] Running BL.in_scan: HERE S" a b" BL SCAN SWAP DROP . CR +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 3042549321] Test passed +[Hera] [HADES][TEST ] Testing BL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3043805751] Expected: Should find space at offset 1 +[Hera] [HADES][TEST ] [KRELTSC: 3044692539] BL: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3045549570] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 3046597344] Testing word: SOURCE +[Hera] [HADES][TEST ] [KRELTSC: 3047315082] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3048053043] Running SOURCE.returns_pair: SOURCE SWAP DROP 0< NOT . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3049852974] Test passed +[Hera] [HADES][TEST ] Testing SOURCE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3051194727] Expected: Should return non-negative length +[Hera] [HADES][TEST ] [KRELTSC: 3052303338] Running SOURCE.has_addr: SOURCE DROP 0<> . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3053666784] Test passed +[Hera] [HADES][TEST ] Testing SOURCE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3054947322] Expected: Should return non-null address +[Hera] [HADES][TEST ] [KRELTSC: 3055880835] SOURCE: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3056790135] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 3057820710] Testing word: >IN +[Hera] [HADES][TEST ] [KRELTSC: 3058526667] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3059243397] Running >IN.initial: >IN @ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3060466710] Test passed +[Hera] [HADES][TEST ] Testing >IN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3061752519] Expected: Should return input offset +[Hera] [HADES][TEST ] [KRELTSC: 3062642121] Running >IN.advances: : TWIN >IN @ >IN @ - . CR ; TWIN +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3064413156] Test passed +[Hera] [HADES][TEST ] Testing >IN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3065777169] Expected: Should print: 0 (no advance inside compiled word) +[Hera] [HADES][TEST ] [KRELTSC: 3066963060] >IN: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3067843695] === String Words Summary: 0 passed, 0 failed, 0 skipped, 0 erro +[Hera] [HADES][INFO ] [KRELTSC: 3068892351] +[Hera] === Testing Module: I/O Words === +[Hera] [HADES][INFO ] [KRELTSC: 3069953124] Running I/O Words Tests (Module 9)... +[Hera] [HADES][TEST ] [KRELTSC: 3070819122] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 3071870991] Testing word: . +[Hera] [HADES][TEST ] [KRELTSC: 3072527682] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3073268142] Running ..positive: 42 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 3074380848] Test passed +[Hera] [HADES][TEST ] Testing . ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3075683982] Expected: Should print: 42 +[Hera] [HADES][TEST ] [KRELTSC: 3076537737] Running ..negative: -42 . CR +[Hera] -42 +[Hera] [HADES][TEST ] [KRELTSC: 3077831841] Test passed +[Hera] [HADES][TEST ] Testing . ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3079141905] Expected: Should print: -42 +[Hera] [HADES][TEST ] [KRELTSC: 3079932408] Running ..zero: 0 . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3080938077] Test passed +[Hera] [HADES][TEST ] Testing . ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3082232748] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 3083053890] Running ..max_int: 2147483647 . CR +[Hera] 2147483647 +[Hera] [HADES][TEST ] [KRELTSC: 3084228987] Test passed +[Hera] [HADES][TEST ] Testing . ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3085510113] Expected: Should print: 2147483647 +[Hera] [HADES][TEST ] [KRELTSC: 3086364771] Running ..min_int: -2147483648 . CR +[Hera] -2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 3087555786] Test passed +[Hera] [HADES][TEST ] Testing . ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3088817655] Expected: Should print: -2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 3089865072] Running ..multiple: 1 2 3 . . . CR +[Hera] 3 2 1 +[Hera] [HADES][TEST ] [KRELTSC: 3091395804] Test passed +[Hera] [HADES][TEST ] Testing . ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3092667312] Expected: Should print: 3 2 1 +[Hera] [HADES][TEST ] [KRELTSC: 3093485514] Running ..empty_stack: . +[Hera] [HADES][TEST ] [KRELTSC: 3094335909] Expected error occurred +[Hera] [HADES][TEST ] Testing . ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3095688834] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3096574236] .: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3097465707] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 3098498298] Testing word: CR +[Hera] [HADES][TEST ] [KRELTSC: 3099170949] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3099935559] Running CR.basic: 42 . CR 43 . CR +[Hera] 42 +[Hera] 43 +[Hera] [HADES][TEST ] [KRELTSC: 3101263221] Test passed +[Hera] [HADES][TEST ] Testing CR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3102775137] Expected: Should print on separate lines +[Hera] [HADES][TEST ] [KRELTSC: 3103631538] Running CR.multiple: CR CR CR + + + +[Hera] [HADES][TEST ] [KRELTSC: 3104567739] Test passed +[Hera] [HADES][TEST ] Testing CR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3105899559] Expected: Should print multiple newlines +[Hera] [HADES][TEST ] [KRELTSC: 3106765305] Running CR.no_stack_effect: DEPTH CR DEPTH = . CR + +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3108066801] Test passed +[Hera] [HADES][TEST ] Testing CR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3109303386] Expected: Should not affect stack +[Hera] [HADES][TEST ] [KRELTSC: 3110160942] Running CR.after_output: 1 2 3 . . . CR +[Hera] 3 2 1 +[Hera] [HADES][TEST ] [KRELTSC: 3111326211] Test passed +[Hera] [HADES][TEST ] Testing CR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3112626531] Expected: Should work after output +[Hera] [HADES][TEST ] [KRELTSC: 3113442423] CR: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3114315162] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 3115585893] Testing word: SPACE +[Hera] [HADES][TEST ] [KRELTSC: 3116450715] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3117185022] Running SPACE.basic: 42 . SPACE 43 . CR +[Hera] 42 43 +[Hera] [HADES][TEST ] [KRELTSC: 3118454136] Test passed +[Hera] [HADES][TEST ] Testing SPACE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3119787237] Expected: Should add space between numbers +[Hera] [HADES][TEST ] [KRELTSC: 3120671946] Running SPACE.multiple: SPACE SPACE SPACE +[Hera] [HADES][INFO ] [KRELTSC: 3122660163] L8[TABLE]: Config 40 → 0 regime=7 score=26214 L1=0 L2=0 L3=0 +[Hera] [HADES][TEST ] [KRELTSC: 3124009980] Test passed +[Hera] [HADES][TEST ] Testing SPACE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3125182599] Expected: Should print multiple spaces +[Hera] [HADES][TEST ] [KRELTSC: 3126077388] Running SPACE.no_stack_effect: DEPTH SPACE DEPTH = . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3127645647] Test passed +[Hera] [HADES][TEST ] Testing SPACE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3128980092] Expected: Should not affect stack +[Hera] [HADES][TEST ] [KRELTSC: 3129840357] Running SPACE.with_text: 65 EMIT SPACE 66 EMIT CR +[Hera] A B +[Hera] [HADES][TEST ] [KRELTSC: 3131157540] Test passed +[Hera] [HADES][TEST ] Testing SPACE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3132445323] Expected: Should space between chars +[Hera] [HADES][TEST ] [KRELTSC: 3133331439] SPACE: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3134244939] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 3135258336] Testing word: SPACES +[Hera] [HADES][TEST ] [KRELTSC: 3135973638] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3136735413] Running SPACES.zero: 0 SPACES +[Hera] [HADES][TEST ] [KRELTSC: 3137698326] Test passed +[Hera] [HADES][TEST ] Testing SPACES ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3139055724] Expected: Should print no spaces +[Hera] [HADES][TEST ] [KRELTSC: 3140132877] Running SPACES.one: 1 SPACES +[Hera] [HADES][TEST ] [KRELTSC: 3141220887] Test passed +[Hera] [HADES][TEST ] Testing SPACES ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3142359108] Expected: Should print one space +[Hera] [HADES][TEST ] [KRELTSC: 3143173509] Running SPACES.multiple: 5 SPACES +[Hera] [HADES][TEST ] [KRELTSC: 3144295140] Test passed +[Hera] [HADES][TEST ] Testing SPACES ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3145401588] Expected: Should print five spaces +[Hera] [HADES][TEST ] [KRELTSC: 3146247993] Running SPACES.large: 20 SPACES +[Hera] [HADES][TEST ] [KRELTSC: 3147509274] Test passed +[Hera] [HADES][TEST ] Testing SPACES ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3148653900] Expected: Should print twenty spaces +[Hera] [HADES][TEST ] [KRELTSC: 3149513472] Running SPACES.negative: -5 SPACES +[Hera] [HADES][TEST ] [KRELTSC: 3150394380] Test passed +[Hera] [HADES][TEST ] Testing SPACES ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3151719018] Expected: Should handle negative +[Hera] [HADES][TEST ] [KRELTSC: 3152817234] Running SPACES.with_output: 42 . 3 SPACES 43 . CR +[Hera] 42 43 +[Hera] [HADES][TEST ] [KRELTSC: 3154119549] Test passed +[Hera] [HADES][TEST ] Testing SPACES ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3155513634] Expected: Should space output +[Hera] [HADES][TEST ] [KRELTSC: 3156326838] Running SPACES.empty_stack: SPACES +[Hera] [HADES][TEST ] [KRELTSC: 3157274589] Expected error occurred +[Hera] [HADES][TEST ] Testing SPACES ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3158682744] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3159557331] SPACES: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3160482906] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 3161517534] Testing word: EMIT +[Hera] [HADES][TEST ] [KRELTSC: 3162201357] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3162916911] Running EMIT.letter_A: 65 EMIT CR +[Hera] A +[Hera] [HADES][TEST ] [KRELTSC: 3164031255] Test passed +[Hera] [HADES][TEST ] Testing EMIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3165730113] Expected: Should print: A +[Hera] [HADES][TEST ] [KRELTSC: 3166492959] Running EMIT.letter_Z: 90 EMIT CR +[Hera] Z +[Hera] [HADES][TEST ] [KRELTSC: 3167627001] Test passed +[Hera] [HADES][TEST ] Testing EMIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3168961950] Expected: Should print: Z +[Hera] [HADES][TEST ] [KRELTSC: 3169733595] Running EMIT.digit: 48 EMIT CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3170794452] Test passed +[Hera] [HADES][TEST ] Testing EMIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3172116864] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 3172881453] Running EMIT.space_char: 32 EMIT CR +[Hera] +[Hera] [HADES][TEST ] [KRELTSC: 3174000753] Test passed +[Hera] [HADES][TEST ] Testing EMIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3175339755] Expected: Should print space +[Hera] [HADES][TEST ] [KRELTSC: 3176145462] Running EMIT.newline: 10 EMIT + +[Hera] [HADES][TEST ] [KRELTSC: 3176972862] Test passed +[Hera] [HADES][TEST ] Testing EMIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3178404726] Expected: Should print newline +[Hera] [HADES][TEST ] [KRELTSC: 3179207367] Running EMIT.high_ascii: 127 EMIT CR +[Hera]  +[Hera] [HADES][TEST ] [KRELTSC: 3180345840] Test passed +[Hera] [HADES][TEST ] Testing EMIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3181858743] Expected: Should print DEL char +[Hera] [HADES][TEST ] [KRELTSC: 3182702040] Running EMIT.truncation: 321 EMIT CR +[Hera] A +[Hera] [HADES][TEST ] [KRELTSC: 3183841857] Test passed +[Hera] [HADES][TEST ] Testing EMIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3185240079] Expected: Should truncate to low byte +[Hera] [HADES][TEST ] [KRELTSC: 3186121890] Running EMIT.negative: -1 EMIT CR +[Hera] ÿ +[Hera] [HADES][TEST ] [KRELTSC: 3187242933] Test passed +[Hera] [HADES][TEST ] Testing EMIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3188589915] Expected: Should handle negative +[Hera] [HADES][TEST ] [KRELTSC: 3189455409] Running EMIT.sequence: 72 EMIT 73 EMIT 10 EMIT +[Hera] HI +[Hera] [HADES][TEST ] [KRELTSC: 3190787145] Test passed +[Hera] [HADES][TEST ] Testing EMIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3192109683] Expected: Should print: HI +[Hera] [HADES][TEST ] [KRELTSC: 3192913332] Running EMIT.empty_stack: EMIT +[Hera] [HADES][TEST ] [KRELTSC: 3193803039] Expected error occurred +[Hera] [HADES][TEST ] Testing EMIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3195210081] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3196126227] EMIT: 10 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3197020155] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 3198045690] Testing word: KEY +[Hera] [HADES][TEST ] [KRELTSC: 3198773193] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3199541961] KEY: 0 passed, 0 failed, 4 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3200403759] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 3201448299] Testing word: ?KEY +[Hera] [HADES][TEST ] [KRELTSC: 3202162740] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3203215659] ?KEY: 0 passed, 0 failed, 3 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3204123195] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 3205195644] Testing word: TYPE +[Hera] [HADES][TEST ] [KRELTSC: 3205911954] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3206680134] Running TYPE.basic_string: HERE S" Hello" DUP >R HERE SWAP CM +[Hera] Hello +[Hera] [HADES][TEST ] [KRELTSC: 3208185372] Test passed +[Hera] [HADES][TEST ] Testing TYPE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3209500308] Expected: Should print: Hello +[Hera] [HADES][TEST ] [KRELTSC: 3210330081] Running TYPE.empty_string: HERE 0 TYPE CR + +[Hera] [HADES][TEST ] [KRELTSC: 3211363197] Test passed +[Hera] [HADES][TEST ] Testing TYPE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3212678805] Expected: Should print nothing +[Hera] [HADES][TEST ] [KRELTSC: 3213512463] Running TYPE.single_char: HERE 65 OVER C! 1 TYPE CR +[Hera] A +[Hera] [HADES][TEST ] [KRELTSC: 3214785483] Test passed +[Hera] [HADES][TEST ] Testing TYPE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3216233601] Expected: Should print: A +[Hera] [HADES][TEST ] [KRELTSC: 3217028367] Running TYPE.numbers: HERE S" 12345" DUP >R HERE SWAP CMOVE H +[Hera] 12345 +[Hera] [HADES][TEST ] [KRELTSC: 3218468379] Test passed +[Hera] [HADES][TEST ] Testing TYPE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3219790287] Expected: Should print: 12345 +[Hera] [HADES][TEST ] [KRELTSC: 3220617288] Running TYPE.zero_length: PAD 0 TYPE +[Hera] [HADES][TEST ] [KRELTSC: 3221511216] Test passed +[Hera] [HADES][TEST ] Testing TYPE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3222829953] Expected: Should handle zero length +[Hera] [HADES][TEST ] [KRELTSC: 3223689777] Running TYPE.one_item: PAD TYPE +[Hera] [HADES][ERROR] [KRELTSC: 3224620413] TYPE: Data stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3225382440] Expected error occurred +[Hera] [HADES][TEST ] Testing TYPE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3226786269] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3227697606] Running TYPE.empty_stack: TYPE +[Hera] [HADES][ERROR] [KRELTSC: 3228820728] TYPE: Data stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3229589622] Expected error occurred +[Hera] [HADES][TEST ] Testing TYPE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3230958549] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3231830721] TYPE: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3232707513] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 3233758269] Testing word: COUNT +[Hera] [HADES][TEST ] [KRELTSC: 3234448791] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3235211868] Running COUNT.basic: HERE S" Test" DROP C@ HERE 1+ SWAP COUNT +[Hera] 0 85 +[Hera] [HADES][TEST ] [KRELTSC: 3236652888] Test passed +[Hera] [HADES][TEST ] Testing COUNT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3237953355] Expected: Should show length and addr+1 +[Hera] [HADES][TEST ] [KRELTSC: 3239007030] Running COUNT.empty: HERE 0 OVER C! COUNT . . CR +[Hera] 0 126 +[Hera] [HADES][TEST ] [KRELTSC: 3240506367] Test passed +[Hera] [HADES][TEST ] Testing COUNT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3241850493] Expected: Should handle empty string +[Hera] [HADES][TEST ] [KRELTSC: 3242766597] Running COUNT.max_length: HERE 255 OVER C! COUNT . . CR +[Hera] 255 126 +[Hera] [HADES][TEST ] [KRELTSC: 3244133046] Test passed +[Hera] [HADES][TEST ] Testing COUNT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3245483346] Expected: Should handle max length +[Hera] [HADES][TEST ] [KRELTSC: 3246334434] Running COUNT.zero_addr_plus_one: HERE COUNT SWAP 1- = . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3247686960] Test passed +[Hera] [HADES][TEST ] Testing COUNT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3249038667] Expected: Should increment address +[Hera] [HADES][TEST ] [KRELTSC: 3249860754] Running COUNT.empty_stack: COUNT +[Hera] [HADES][ERROR] [KRELTSC: 3250737966] COUNT: Data stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3251514567] Expected error occurred +[Hera] [HADES][TEST ] Testing COUNT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3253112268] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3254021820] COUNT: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3254971566] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 3256024527] Testing word: EXPECT +[Hera] [HADES][TEST ] [KRELTSC: 3256718157] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3257455215] Running EXPECT.zero_length: PAD 0 EXPECT +[Hera] [HADES][TEST ] [KRELTSC: 3258772881] Test passed +[Hera] [HADES][TEST ] Testing EXPECT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3260113773] Expected: Should handle zero length +[Hera] [HADES][TEST ] [KRELTSC: 3260946570] Running EXPECT.one_item: PAD EXPECT +[Hera] [HADES][TEST ] [KRELTSC: 3261908433] Expected error occurred +[Hera] [HADES][TEST ] Testing EXPECT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3263311926] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3264230193] Running EXPECT.empty_stack: EXPECT +[Hera] [HADES][TEST ] [KRELTSC: 3265049529] Expected error occurred +[Hera] [HADES][TEST ] Testing EXPECT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3266760714] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3267658422] EXPECT: 3 passed, 0 failed, 2 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3268577613] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 3269583156] Testing word: SPAN +[Hera] [HADES][TEST ] [KRELTSC: 3270307446] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3271030665] Running SPAN.zero_input: PAD 0 EXPECT SPAN @ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3272459169] Test passed +[Hera] [HADES][TEST ] Testing SPAN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3273748989] Expected: Should show zero +[Hera] [HADES][TEST ] [KRELTSC: 3274540311] Running SPAN.variable_test: SPAN @ SPAN @ = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3275846007] Test passed +[Hera] [HADES][TEST ] Testing SPAN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3277117368] Expected: Should be consistent +[Hera] [HADES][TEST ] [KRELTSC: 3278075640] Running SPAN.address_test: SPAN 0<> . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3279322641] Test passed +[Hera] [HADES][TEST ] Testing SPAN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3280602864] Expected: Should be valid address +[Hera] [HADES][TEST ] [KRELTSC: 3281435304] SPAN: 3 passed, 0 failed, 1 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3282362391] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 3283387506] Testing word: WORD +[Hera] [HADES][TEST ] [KRELTSC: 3284117592] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3284886234] Running WORD.empty_input: BL WORD COUNT . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3286558674] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3287910003] Expected: Should handle empty input +[Hera] [HADES][TEST ] [KRELTSC: 3288785682] Running WORD.space_delim: 32 WORD DROP +[Hera] [HADES][TEST ] [KRELTSC: 3289745025] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3291316560] Expected: Should use space as delimiter +[Hera] [HADES][TEST ] [KRELTSC: 3292224474] Running WORD.newline_delim: 10 WORD DROP +[Hera] [HADES][TEST ] [KRELTSC: 3293128629] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3294434535] Expected: Should use newline as delimiter +[Hera] [HADES][TEST ] [KRELTSC: 3295359816] Running WORD.tab_delim: 9 WORD DROP +[Hera] [HADES][TEST ] [KRELTSC: 3296288541] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3297585501] Expected: Should use tab as delimiter +[Hera] [HADES][TEST ] [KRELTSC: 3298448433] Running WORD.comma_delim: 44 WORD DROP +[Hera] [HADES][TEST ] [KRELTSC: 3299338539] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3300647133] Expected: Should use comma as delimiter +[Hera] [HADES][TEST ] [KRELTSC: 3301528398] Running WORD.skip_leading: BL WORD DROP +[Hera] [HADES][TEST ] [KRELTSC: 3302442486] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3304038381] Expected: Should skip leading spaces +[Hera] [HADES][TEST ] [KRELTSC: 3304913682] Running WORD.single_char: BL WORD COUNT . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3306149196] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3307460709] Expected: Should parse single character +[Hera] [HADES][TEST ] [KRELTSC: 3308341617] Running WORD.long_word: BL WORD COUNT 0 > . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3309512514] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3310804224] Expected: Should parse long word +[Hera] [HADES][TEST ] [KRELTSC: 3311642355] Running WORD.zero_delim: 0 WORD DROP +[Hera] [HADES][TEST ] [KRELTSC: 3312532986] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3313823541] Expected: Should handle null delimiter +[Hera] [HADES][TEST ] [KRELTSC: 3314720430] Running WORD.high_ascii: 127 WORD DROP +[Hera] [HADES][TEST ] [KRELTSC: 3315774000] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3317172936] Expected: Should handle DEL delimiter +[Hera] [HADES][TEST ] [KRELTSC: 3318077091] Running WORD.count_format: BL WORD C@ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3319251789] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3320536716] Expected: Should have count byte +[Hera] [HADES][TEST ] [KRELTSC: 3321379929] Running WORD.count_value: BL WORD COUNT SWAP DROP . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3322664751] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3323986827] Expected: Should return count +[Hera] [HADES][TEST ] [KRELTSC: 3324793773] Running WORD.empty_stack: WORD +[Hera] [HADES][TEST ] [KRELTSC: 3325702947] Expected error occurred +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3327140418] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3327988083] Running WORD.multi_delim: BL WORD DROP BL WORD DROP +[Hera] [HADES][TEST ] [KRELTSC: 3329514405] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3330830391] Expected: Should handle multiple parses +[Hera] [HADES][TEST ] [KRELTSC: 3331741329] WORD: 14 passed, 0 failed, 2 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3332644098] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 3333693993] Testing word: BASE_OUTPUT +[Hera] [HADES][TEST ] [KRELTSC: 3334422861] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3335147991] Running BASE_OUTPUT.decimal: 10 BASE ! 255 . CR +[Hera] 255 +[Hera] [HADES][TEST ] [KRELTSC: 3336406689] Test passed +[Hera] [HADES][TEST ] Testing BASE_OUTPUT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3337772718] Expected: Should print: 255 +[Hera] [HADES][TEST ] [KRELTSC: 3338613012] Running BASE_OUTPUT.hex: 16 BASE ! 255 . CR +[Hera] 597 +[Hera] [HADES][TEST ] [KRELTSC: 3339859929] Test passed +[Hera] [HADES][TEST ] Testing BASE_OUTPUT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3341475879] Expected: Should print: FF +[Hera] [HADES][TEST ] [KRELTSC: 3342300717] Running BASE_OUTPUT.octal: 8 BASE ! 64 . CR +[Hera] 52 +[Hera] [HADES][TEST ] [KRELTSC: 3343685688] Test passed +[Hera] [HADES][TEST ] Testing BASE_OUTPUT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3345084708] Expected: Should print: 100 +[Hera] [HADES][TEST ] [KRELTSC: 3345895056] Running BASE_OUTPUT.binary: 5 2 BASE ! . CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 3347063811] Test passed +[Hera] [HADES][TEST ] Testing BASE_OUTPUT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3348478413] Expected: Should print: 101 +[Hera] [HADES][TEST ] [KRELTSC: 3349263309] Running BASE_OUTPUT.base_restore: BASE @ DECIMAL 255 16 BA +[Hera] 255 +[Hera] [HADES][TEST ] [KRELTSC: 3350651619] Test passed +[Hera] [HADES][TEST ] Testing BASE_OUTPUT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3352012188] Expected: Should restore base +[Hera] [HADES][TEST ] [KRELTSC: 3352815354] BASE_OUTPUT: 5 passed, 0 failed, 1 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3354132663] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 3355185561] Testing word: FORMAT_COMBO +[Hera] [HADES][TEST ] [KRELTSC: 3356014158] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3356809113] Running FORMAT_COMBO.number_space_number: DECIMAL 42 . SPACE +[Hera] 42 [HADES][INFO ] [KRELTSC: 3358279386] L8[TABLE]: Config 0 → 1 regime=7 score=26214 L1=0 L2=0 L3=0 L +[Hera] 43 +[Hera] [HADES][TEST ] [KRELTSC: 3359439489] Test passed +[Hera] [HADES][TEST ] Testing FORMAT_COMBO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3360842205] Expected: Should format: 42 43 +[Hera] [HADES][TEST ] [KRELTSC: 3361631406] Running FORMAT_COMBO.multi_line: DECIMAL 1 . CR 2 . CR 3 . CR +[Hera] 1 +[Hera] 2 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 3363447570] Test passed +[Hera] [HADES][TEST ] Testing FORMAT_COMBO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3364826115] Expected: Should print on separate lines +[Hera] [HADES][TEST ] [KRELTSC: 3365718846] Running FORMAT_COMBO.indented: DECIMAL 5 SPACES 42 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 3367486206] Test passed +[Hera] [HADES][TEST ] Testing FORMAT_COMBO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3368919435] Expected: Should indent number +[Hera] [HADES][TEST ] [KRELTSC: 3369742488] Running FORMAT_COMBO.table_format: DECIMAL 1 . 3 SPACES 10 . +[Hera] 1 10 100 +[Hera] [HADES][TEST ] [KRELTSC: 3371195982] Test passed +[Hera] [HADES][TEST ] Testing FORMAT_COMBO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3372554367] Expected: Should format table +[Hera] [HADES][TEST ] [KRELTSC: 3373394094] FORMAT_COMBO: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3374441406] === I/O Words Summary: 0 passed, 0 failed, 0 skipped, 0 errors +[Hera] [HADES][INFO ] [KRELTSC: 3375470763] +[Hera] === Testing Module: Block Words === +[Hera] [HADES][INFO ] [KRELTSC: 3376618791] Running Block Words Tests (Module 16)... +[Hera] [HADES][TEST ] [KRELTSC: 3377486532] ▶ Testing module: v3/src/test_runner/modules/block_words_test +[Hera] [HADES][TEST ] [KRELTSC: 3378723642] Testing word: BLOCK +[Hera] [HADES][TEST ] [KRELTSC: 3379418112] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3380144439] Running BLOCK.basic: 1 BLOCK DUP . CR +[Hera] 5238784 +[Hera] [HADES][TEST ] [KRELTSC: 3382190763] Test passed +[Hera] [HADES][TEST ] Testing BLOCK ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3383530311] Expected: Should return block address +[Hera] [HADES][TEST ] [KRELTSC: 3384386985] Running BLOCK.zero_block: 0 BLOCK +[Hera] [HADES][TEST ] [KRELTSC: 3385324194] Expected error occurred +[Hera] [HADES][TEST ] Testing BLOCK ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3386688207] Expected: Should handle block 0 +[Hera] [HADES][TEST ] [KRELTSC: 3387496707] Running BLOCK.large_block: 65536 BLOCK +[Hera] [HADES][TEST ] [KRELTSC: 3388408296] Expected error occurred +[Hera] [HADES][TEST ] Testing BLOCK ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3389856015] Expected: Should handle large number +[Hera] [HADES][TEST ] [KRELTSC: 3390708573] Running BLOCK.negative: -1 BLOCK +[Hera] [HADES][TEST ] [KRELTSC: 3391767981] Expected error occurred +[Hera] [HADES][TEST ] Testing BLOCK ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3393183234] Expected: Should handle negative +[Hera] [HADES][TEST ] [KRELTSC: 3394009269] Running BLOCK.empty_stack: BLOCK +[Hera] [HADES][TEST ] [KRELTSC: 3394842591] Expected error occurred +[Hera] [HADES][TEST ] Testing BLOCK ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3396279033] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3397163175] BLOCK: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3398164350] ▶ Testing module: v3/src/test_runner/modules/block_words_test +[Hera] [HADES][TEST ] [KRELTSC: 3399193014] Testing word: BUFFER +[Hera] [HADES][TEST ] [KRELTSC: 3399933474] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3400684182] Running BUFFER.basic: 1 BUFFER DUP . CR +[Hera] 5238784 +[Hera] [HADES][TEST ] [KRELTSC: 3402411978] Test passed +[Hera] [HADES][TEST ] Testing BUFFER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3403996176] Expected: Should return buffer address +[Hera] [HADES][TEST ] [KRELTSC: 3404879310] Running BUFFER.zero_block: 0 BUFFER +[Hera] [HADES][TEST ] [KRELTSC: 3405793503] Expected error occurred +[Hera] [HADES][TEST ] Testing BUFFER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3407196240] Expected: Should handle block 0 +[Hera] [HADES][TEST ] [KRELTSC: 3408042687] Running BUFFER.flush_dirty: 2 BLOCK 1+ 2 BUFFER +[Hera] [HADES][TEST ] [KRELTSC: 3409077609] Test passed +[Hera] [HADES][TEST ] Testing BUFFER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3410396220] Expected: Should flush if dirty +[Hera] [HADES][TEST ] [KRELTSC: 3411272844] Running BUFFER.empty_stack: BUFFER +[Hera] [HADES][TEST ] [KRELTSC: 3412136910] Expected error occurred +[Hera] [HADES][TEST ] Testing BUFFER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3413519802] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3414451509] BUFFER: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3415338612] ▶ Testing module: v3/src/test_runner/modules/block_words_test +[Hera] [HADES][TEST ] [KRELTSC: 3416605437] Testing word: UPDATE +[Hera] [HADES][TEST ] [KRELTSC: 3417312150] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3418042845] Running UPDATE.basic: 1 BLOCK UPDATE +[Hera] [HADES][TEST ] [KRELTSC: 3419329326] Test passed +[Hera] [HADES][TEST ] Testing UPDATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3420658101] Expected: Should mark block dirty +[Hera] [HADES][TEST ] [KRELTSC: 3421531995] Running UPDATE.multiple: 1 BLOCK UPDATE UPDATE +[Hera] [HADES][TEST ] [KRELTSC: 3422516244] Test passed +[Hera] [HADES][TEST ] Testing UPDATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3423860391] Expected: Should handle multiple updates +[Hera] [HADES][TEST ] [KRELTSC: 3424780044] Running UPDATE.no_block: 0 SCR ! UPDATE +[Hera] [HADES][TEST ] [KRELTSC: 3425766372] Expected error occurred +[Hera] [HADES][TEST ] Testing UPDATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3427239333] Expected: Should error: blk=0 is invalid +[Hera] [HADES][TEST ] [KRELTSC: 3428121900] UPDATE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3429304200] ▶ Testing module: v3/src/test_runner/modules/block_words_test +[Hera] [HADES][TEST ] [KRELTSC: 3430397334] Testing word: SAVE-BUFFERS +[Hera] [HADES][TEST ] [KRELTSC: 3431138655] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3431904714] Running SAVE-BUFFERS.basic: SAVE-BUFFERS +[Hera] [HADES][TEST ] [KRELTSC: 3433100895] Test passed +[Hera] [HADES][TEST ] Testing SAVE-BUFFERS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3434427213] Expected: Should flush all buffers +[Hera] [HADES][TEST ] [KRELTSC: 3435308919] Running SAVE-BUFFERS.dirty_blocks: 1 BLOCK UPDATE SAVE-BUFFER +[Hera] [HADES][TEST ] [KRELTSC: 3436408626] Test passed +[Hera] [HADES][TEST ] Testing SAVE-BUFFERS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3437775936] Expected: Should save dirty blocks +[Hera] [HADES][TEST ] [KRELTSC: 3438628767] Running SAVE-BUFFERS.no_dirty: SAVE-BUFFERS +[Hera] [HADES][TEST ] [KRELTSC: 3439516521] Test passed +[Hera] [HADES][TEST ] Testing SAVE-BUFFERS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3440887905] Expected: Should handle no dirty blocks +[Hera] [HADES][TEST ] [KRELTSC: 3441933369] SAVE-BUFFERS: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3442914741] ▶ Testing module: v3/src/test_runner/modules/block_words_test +[Hera] [HADES][TEST ] [KRELTSC: 3443968521] Testing word: EMPTY-BUFFERS +[Hera] [HADES][TEST ] [KRELTSC: 3444707427] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3445490874] Running EMPTY-BUFFERS.basic: EMPTY-BUFFERS +[Hera] [HADES][TEST ] [KRELTSC: 3446532810] Test passed +[Hera] [HADES][TEST ] Testing EMPTY-BUFFERS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3447919587] Expected: Should invalidate all buffers +[Hera] [HADES][TEST ] [KRELTSC: 3448788987] Running EMPTY-BUFFERS.after_use: 1 BLOCK EMPTY-BUFFERS +[Hera] [HADES][TEST ] [KRELTSC: 3449808138] Test passed +[Hera] [HADES][TEST ] Testing EMPTY-BUFFERS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3451182273] Expected: Should invalidate used buffers +[Hera] [HADES][TEST ] [KRELTSC: 3452092077] Running EMPTY-BUFFERS.dirty_blocks: 1 BLOCK UPDATE EMPTY-BUFF +[Hera] [HADES][TEST ] [KRELTSC: 3453189117] Test passed +[Hera] [HADES][TEST ] Testing EMPTY-BUFFERS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3454704225] Expected: Should handle dirty blocks +[Hera] [HADES][TEST ] [KRELTSC: 3455553003] EMPTY-BUFFERS: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3456540591] ▶ Testing module: v3/src/test_runner/modules/block_words_test +[Hera] [HADES][TEST ] [KRELTSC: 3457599054] Testing word: FLUSH +[Hera] [HADES][TEST ] [KRELTSC: 3458321412] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3459079302] Running FLUSH.basic: FLUSH +[Hera] [HADES][TEST ] [KRELTSC: 3459892779] Test passed +[Hera] [HADES][TEST ] Testing FLUSH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3461232243] Expected: Should save and invalidate buffers +[Hera] [HADES][TEST ] [KRELTSC: 3462157272] Running FLUSH.dirty_blocks: 1 BLOCK UPDATE FLUSH +[Hera] [HADES][TEST ] [KRELTSC: 3463199880] Test passed +[Hera] [HADES][TEST ] Testing FLUSH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3464526303] Expected: Should flush dirty blocks +[Hera] [HADES][TEST ] [KRELTSC: 3465364224] Running FLUSH.after_empty: EMPTY-BUFFERS FLUSH +[Hera] [HADES][TEST ] [KRELTSC: 3466311702] Test passed +[Hera] [HADES][TEST ] Testing FLUSH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3467966775] Expected: Should handle empty buffers +[Hera] [HADES][TEST ] [KRELTSC: 3468890166] FLUSH: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3469807971] ▶ Testing module: v3/src/test_runner/modules/block_words_test +[Hera] [HADES][TEST ] [KRELTSC: 3470818470] Testing word: LOAD +[Hera] [HADES][TEST ] [KRELTSC: 3471550320] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3472308819] Running LOAD.basic: 1 LOAD +[Hera] [HADES][TEST ] [KRELTSC: 3473283702] Test passed +[Hera] [HADES][TEST ] Testing LOAD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3474575937] Expected: Should interpret block 1 +[Hera] [HADES][TEST ] [KRELTSC: 3475417785] Running LOAD.zero_block: 0 LOAD +[Hera] [HADES][TEST ] [KRELTSC: 3476265240] Expected error occurred +[Hera] [HADES][TEST ] Testing LOAD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3477678666] Expected: Should handle block 0 +[Hera] [HADES][TEST ] [KRELTSC: 3478505751] Running LOAD.nonexistent: 9999 LOAD +[Hera] [HADES][TEST ] [KRELTSC: 3479588259] Expected error occurred +[Hera] [HADES][TEST ] Testing LOAD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3481012500] Expected: Should handle missing block +[Hera] [HADES][TEST ] [KRELTSC: 3481857750] Running LOAD.empty_stack: LOAD +[Hera] [HADES][TEST ] [KRELTSC: 3482688594] Expected error occurred +[Hera] [HADES][TEST ] Testing LOAD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3484068252] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3484934103] LOAD: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3485831979] ▶ Testing module: v3/src/test_runner/modules/block_words_test +[Hera] [HADES][TEST ] [KRELTSC: 3486841344] Testing word: LIST +[Hera] [HADES][TEST ] [KRELTSC: 3487552194] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3488295699] Running LIST.basic: 1 LIST + +[Hera] Block 1 + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + + + +[Hera] [HADES][TEST ] [KRELTSC: 3505749282] Test passed +[Hera] [HADES][TEST ] Testing LIST ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3507073437] Expected: Should display block 1 +[Hera] [HADES][TEST ] [KRELTSC: 3507912513] Running LIST.zero_block: 0 LIST +[Hera] [HADES][TEST ] [KRELTSC: 3508766772] Expected error occurred +[Hera] [HADES][TEST ] Testing LIST ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3510163671] Expected: Should handle block 0 +[Hera] [HADES][TEST ] [KRELTSC: 3511023012] Running LIST.nonexistent: 9999 LIST +[Hera] [HADES][TEST ] [KRELTSC: 3511862256] Expected error occurred +[Hera] [HADES][TEST ] Testing LIST ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3513251973] Expected: Should handle missing block +[Hera] [HADES][TEST ] [KRELTSC: 3514125111] Running LIST.empty_stack: LIST +[Hera] [HADES][TEST ] [KRELTSC: 3514924518] Expected error occurred +[Hera] [HADES][TEST ] Testing LIST ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3516323874] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3517357368] LIST: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3518254761] ▶ Testing module: v3/src/test_runner/modules/block_words_test +[Hera] [HADES][TEST ] [KRELTSC: 3519269859] Testing word: SCR +[Hera] [HADES][TEST ] [KRELTSC: 3519972393] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3520725516] Running SCR.basic: SCR @ . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 3521812476] Test passed +[Hera] [HADES][TEST ] Testing SCR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3523110381] Expected: Should show current block +[Hera] [HADES][TEST ] [KRELTSC: 3523956513] Running SCR.after_list: 1 LIST SCR @ . CR + +[Hera] Block 1 + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + + + +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 3541455960] Test passed +[Hera] [HADES][TEST ] Testing SCR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3542959266] Expected: Should update after LIST +[Hera] [HADES][TEST ] [KRELTSC: 3543818901] Running SCR.after_load: 1 LOAD SCR @ . CR +[Hera] [HADES][TEST ] [KRELTSC: 3544786686] Test passed +[Hera] [HADES][TEST ] Testing SCR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3546121572] Expected: Should update after LOAD +[Hera] [HADES][TEST ] [KRELTSC: 3546983790] SCR: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3547868919] ▶ Testing module: v3/src/test_runner/modules/block_words_test +[Hera] [HADES][TEST ] [KRELTSC: 3548912010] Testing word: THRU +[Hera] [HADES][TEST ] [KRELTSC: 3549637203] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3550425669] Running THRU.single_block: 1 1 THRU +[Hera] [HADES][TEST ] [KRELTSC: 3551536821] Test passed +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3552850413] Expected: Should load single block (1-1) +[Hera] [HADES][TEST ] [KRELTSC: 3553739574] Running THRU.ascending: 1 3 THRU +[Hera] [HADES][TEST ] [KRELTSC: 3554810196] Test passed +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3556178493] Expected: Should load blocks 1-3 in order +[Hera] [HADES][TEST ] [KRELTSC: 3557077734] Running THRU.descending: 3 1 THRU +[Hera] [HADES][TEST ] [KRELTSC: 3557981994] Test passed +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3559271310] Expected: Should auto-swap and load 1-3 +[Hera] [HADES][TEST ] [KRELTSC: 3560147829] Running THRU.same_block: 2 2 THRU +[Hera] [HADES][TEST ] [KRELTSC: 3561065130] Test passed +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3562334517] Expected: Should load single block (2-2) +[Hera] [HADES][TEST ] [KRELTSC: 3563255430] Running THRU.zero_start: 0 3 THRU +[Hera] [HADES][TEST ] [KRELTSC: 3564124158] Expected error occurred +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3565505601] Expected: Should reject block 0 as start +[Hera] [HADES][TEST ] [KRELTSC: 3566423511] Running THRU.zero_end: 1 0 THRU +[Hera] [HADES][TEST ] [KRELTSC: 3567550644] Expected error occurred +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3568926228] Expected: Should reject block 0 as end +[Hera] [HADES][TEST ] [KRELTSC: 3569818245] Running THRU.both_zero: 0 0 THRU +[Hera] [HADES][TEST ] [KRELTSC: 3570688506] Expected error occurred +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3572130387] Expected: Should reject both blocks as 0 +[Hera] [HADES][TEST ] [KRELTSC: 3573042249] Running THRU.invalid_start: 9999 10000 THRU +[Hera] [HADES][TEST ] [KRELTSC: 3573992646] Expected error occurred +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3575403573] Expected: Should reject invalid start block +[Hera] [HADES][TEST ] [KRELTSC: 3576314028] Running THRU.invalid_end: 1 9999 THRU +[Hera] [HADES][TEST ] [KRELTSC: 3577176246] Expected error occurred +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3578572662] Expected: Should reject invalid end block +[Hera] [HADES][TEST ] [KRELTSC: 3579477552] Running THRU.both_invalid: 9998 9999 THRU +[Hera] [HADES][TEST ] [KRELTSC: 3580706010] Expected error occurred +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3582059460] Expected: Should reject both invalid blocks +[Hera] [HADES][TEST ] [KRELTSC: 3582959667] Running THRU.empty_stack: THRU +[Hera] [HADES][TEST ] [KRELTSC: 3583877577] Expected error occurred +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3585291549] Expected: Should cause stack underflow (no args) +[Hera] [HADES][TEST ] [KRELTSC: 3586272942] Running THRU.one_arg: 1 THRU +[Hera] [HADES][TEST ] [KRELTSC: 3587079552] Expected error occurred +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3588460323] Expected: Should cause stack underflow (one arg) +[Hera] [HADES][TEST ] [KRELTSC: 3589426491] Running THRU.small_range: 1 2 THRU +[Hera] [HADES][TEST ] [KRELTSC: 3590336778] Test passed +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3591680610] Expected: Should load 2-block range +[Hera] [HADES][TEST ] [KRELTSC: 3592885884] Running THRU.medium_range: 1 5 THRU +[Hera] [HADES][TEST ] [KRELTSC: 3593825718] Test passed +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3595158021] Expected: Should load 5-block range +[Hera] [HADES][TEST ] [KRELTSC: 3596042037] Running THRU.negative_start: -1 3 THRU +[Hera] [HADES][TEST ] [KRELTSC: 3596922777] Expected error occurred +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3598338870] Expected: Should handle negative start +[Hera] [HADES][TEST ] [KRELTSC: 3599239392] Running THRU.negative_end: 1 -3 THRU +[Hera] [HADES][TEST ] [KRELTSC: 3600111690] Expected error occurred +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3601522176] Expected: Should handle negative end +[Hera] [HADES][TEST ] [KRELTSC: 3602385717] Running THRU.both_negative: -3 -1 THRU +[Hera] [HADES][TEST ] [KRELTSC: 3603304824] Expected error occurred +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3604639689] Expected: Should handle both negative +[Hera] [HADES][TEST ] [KRELTSC: 3605736309] THRU: 17 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3606721734] === Block Words Summary: 0 passed, 0 failed, 0 skipped, 0 error +[Hera] [HADES][INFO ] [KRELTSC: 3607763628] +[Hera] === Testing Module: Dictionary Words === +[Hera] [HADES][INFO ] [KRELTSC: 3608893197] Running Dictionary Words Tests (Module 4)... +[Hera] [HADES][TEST ] [KRELTSC: 3609824883] Testing word: HERE +[Hera] [HADES][TEST ] [KRELTSC: 3610533486] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3611297865] Running HERE.basic: HERE HERE = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3612436590] Test passed +[Hera] [HADES][TEST ] Testing HERE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3613783467] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 3614601312] Running HERE.after_comma: HERE 42 , HERE SWAP - 1 CELLS = 0 S +[Hera] [HADES][TEST ] [KRELTSC: 3615797514] Test passed +[Hera] [HADES][TEST ] Testing HERE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3617086368] Expected: Asserts HERE advances by exactly 1 CELLS (8 bytes +[Hera] [HADES][TEST ] [KRELTSC: 3618359346] Running HERE.after_c_comma: HERE 65 C, HERE SWAP - . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 3619735392] Test passed +[Hera] [HADES][TEST ] Testing HERE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3621070467] Expected: Should print: 1 +[Hera] [HADES][TEST ] [KRELTSC: 3621850365] Running HERE.after_allot: HERE 10 ALLOT HERE SWAP - . CR +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 3623159232] Test passed +[Hera] [HADES][TEST ] Testing HERE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3624508209] Expected: Should print: 10 +[Hera] [HADES][TEST ] [KRELTSC: 3625330611] Running HERE.stability: HERE DUP HERE = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3626545230] Test passed +[Hera] [HADES][TEST ] Testing HERE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3627857730] Expected: Should be stable +[Hera] [HADES][TEST ] [KRELTSC: 3628661253] HERE: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3629636346] Testing word: ALLOT +[Hera] [HADES][TEST ] [KRELTSC: 3630520005] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3631305342] Running ALLOT.basic: HERE 10 ALLOT HERE SWAP - . CR +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 3632596443] Test passed +[Hera] [HADES][TEST ] Testing ALLOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3633929586] Expected: Should print: 10 +[Hera] [HADES][TEST ] [KRELTSC: 3634690731] Running ALLOT.zero: HERE 0 ALLOT HERE SWAP - . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3635953944] Test passed +[Hera] [HADES][TEST ] Testing ALLOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3637266150] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 3638101929] Running ALLOT.negative: HERE -4 ALLOT HERE SWAP - . CR +[Hera] -4 +[Hera] [HADES][TEST ] [KRELTSC: 3639451809] Test passed +[Hera] [HADES][TEST ] Testing ALLOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3640798434] Expected: Should print: -4 +[Hera] [HADES][TEST ] [KRELTSC: 3641652021] Running ALLOT.large: HERE 100 ALLOT HERE SWAP - . CR +[Hera] 100 +[Hera] [HADES][TEST ] [KRELTSC: 3643124541] Test passed +[Hera] [HADES][TEST ] Testing ALLOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3644493090] Expected: Should print: 100 +[Hera] [HADES][TEST ] [KRELTSC: 3645350835] Running ALLOT.after_use: ALIGN HERE 10 ALLOT 42 OVER ! @ . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 3646862331] Test passed +[Hera] [HADES][TEST ] Testing ALLOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3648256920] Expected: Should store and retrieve +[Hera] [HADES][TEST ] [KRELTSC: 3649160949] Running ALLOT.empty_stack: ALLOT +[Hera] [HADES][TEST ] [KRELTSC: 3650013885] Expected error occurred +[Hera] [HADES][TEST ] Testing ALLOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3651430482] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3652326930] ALLOT: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3653232072] Testing word: , +[Hera] [HADES][TEST ] [KRELTSC: 3653918394] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3654629748] Running ,.basic: 42 , HERE 1 CELLS - @ . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 3656061192] Test passed +[Hera] [HADES][TEST ] Testing , ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3657364662] Expected: Should compile 42 +[Hera] [HADES][TEST ] [KRELTSC: 3658191159] Running ,.negative: -999 , HERE 1 CELLS - @ . CR +[Hera] [HADES][INFO ] [KRELTSC: 3659230134] L8[TABLE]: Config 1 → 2 regime=7 score=26214 L1=0 L2=0 L3=0 L +[Hera] -999 +[Hera] [HADES][TEST ] [KRELTSC: 3660718887] Test passed +[Hera] [HADES][TEST ] Testing , ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3661990836] Expected: Should compile -999 +[Hera] [HADES][TEST ] [KRELTSC: 3662810403] Running ,.zero: 0 , HERE 1 CELLS - @ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3664003203] Test passed +[Hera] [HADES][TEST ] Testing , ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3665271939] Expected: Should compile 0 +[Hera] [HADES][TEST ] [KRELTSC: 3666099255] Running ,.max_int: 2147483647 , HERE 1 CELLS - @ . CR +[Hera] 2147483647 +[Hera] [HADES][TEST ] [KRELTSC: 3667429185] Test passed +[Hera] [HADES][TEST ] Testing , ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3668966448] Expected: Should compile max int +[Hera] [HADES][TEST ] [KRELTSC: 3669825096] Running ,.min_int: -2147483648 , HERE 1 CELLS - @ . CR +[Hera] -2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 3671160612] Test passed +[Hera] [HADES][TEST ] Testing , ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3672443565] Expected: Should compile min int +[Hera] [HADES][TEST ] [KRELTSC: 3673266177] Running ,.multiple: 10 , 20 , HERE 1 CELLS - @ . HERE 1 CELLS +[Hera] 20 20 +[Hera] [HADES][TEST ] [KRELTSC: 3674714400] Test passed +[Hera] [HADES][TEST ] Testing , ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3676057077] Expected: Should compile multiple +[Hera] [HADES][TEST ] [KRELTSC: 3676861461] Running ,.empty_stack: , +[Hera] [HADES][TEST ] [KRELTSC: 3677665677] Expected error occurred +[Hera] [HADES][TEST ] Testing , ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3679048023] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3679939347] ,: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3681011376] Testing word: C, +[Hera] [HADES][TEST ] [KRELTSC: 3681739068] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3682481649] Running C,.basic: 65 C, HERE 1 - C@ . CR +[Hera] 65 +[Hera] [HADES][TEST ] [KRELTSC: 3683648241] Test passed +[Hera] [HADES][TEST ] Testing C, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3684954462] Expected: Should compile byte 65 +[Hera] [HADES][TEST ] [KRELTSC: 3685781799] Running C,.zero: 0 C, HERE 1 - C@ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3686934468] Test passed +[Hera] [HADES][TEST ] Testing C, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3688252974] Expected: Should compile byte 0 +[Hera] [HADES][TEST ] [KRELTSC: 3689112147] Running C,.high_byte: 255 C, HERE 1 - C@ . CR +[Hera] 255 +[Hera] [HADES][TEST ] [KRELTSC: 3690360513] Test passed +[Hera] [HADES][TEST ] Testing C, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3691673937] Expected: Should compile byte 255 +[Hera] [HADES][TEST ] [KRELTSC: 3692508540] Running C,.truncation: 256 C, HERE 1 - C@ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3693918018] Test passed +[Hera] [HADES][TEST ] Testing C, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3695209224] Expected: Should truncate to 0 +[Hera] [HADES][TEST ] [KRELTSC: 3696054453] Running C,.negative: -1 C, HERE 1 - C@ . CR +[Hera] 255 +[Hera] [HADES][TEST ] [KRELTSC: 3697265439] Test passed +[Hera] [HADES][TEST ] Testing C, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3698559102] Expected: Should handle negative +[Hera] [HADES][TEST ] [KRELTSC: 3699459267] Running C,.multiple: 65 C, 66 C, HERE 2 - C@ . HERE 1 - C@ . +[Hera] 65 66 +[Hera] [HADES][TEST ] [KRELTSC: 3700874184] Test passed +[Hera] [HADES][TEST ] Testing C, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3702158145] Expected: Should compile multiple +[Hera] [HADES][TEST ] [KRELTSC: 3703004067] Running C,.empty_stack: C, +[Hera] [HADES][TEST ] [KRELTSC: 3703833693] Expected error occurred +[Hera] [HADES][TEST ] Testing C, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3705242415] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3706329333] C,: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3707199405] Testing word: 2, +[Hera] [HADES][TEST ] [KRELTSC: 3707903640] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3708654726] Running 2,.basic: 12345 67890 2, HERE 2 CELLS - 2@ . . CR +[Hera] 67890 12345 +[Hera] [HADES][TEST ] [KRELTSC: 3710070903] Test passed +[Hera] [HADES][TEST ] Testing 2, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3711360198] Expected: Should compile double +[Hera] [HADES][TEST ] [KRELTSC: 3712197405] Running 2,.zero: 0 0 2, HERE 2 CELLS - 2@ . . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 3713490606] Test passed +[Hera] [HADES][TEST ] Testing 2, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3714762681] Expected: Should compile zero double +[Hera] [HADES][TEST ] [KRELTSC: 3715620111] Running 2,.negative: -1000 -2000 2, HERE 2 CELLS - 2@ . . CR +[Hera] -2000 -1000 +[Hera] [HADES][TEST ] [KRELTSC: 3717111069] Test passed +[Hera] [HADES][TEST ] Testing 2, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3718591506] Expected: Should compile negative double +[Hera] [HADES][TEST ] [KRELTSC: 3719514372] Running 2,.large: 2147483647 -1 2, HERE 2 CELLS - 2@ . . CR +[Hera] -1 2147483647 +[Hera] [HADES][TEST ] [KRELTSC: 3720956253] Test passed +[Hera] [HADES][TEST ] Testing 2, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3722250924] Expected: Should compile large double +[Hera] [HADES][TEST ] [KRELTSC: 3723111168] Running 2,.one_item: 42 2, +[Hera] [HADES][TEST ] [KRELTSC: 3723907866] Expected error occurred +[Hera] [HADES][TEST ] Testing 2, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3725280342] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3726157260] Running 2,.empty_stack: 2, +[Hera] [HADES][TEST ] [KRELTSC: 3726927351] Expected error occurred +[Hera] [HADES][TEST ] Testing 2, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3728306022] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3729189471] 2,: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3730095201] Testing word: PAD +[Hera] [HADES][TEST ] [KRELTSC: 3730964622] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3731708253] Running PAD.basic: PAD PAD = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3732824613] Test passed +[Hera] [HADES][TEST ] Testing PAD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3734139801] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 3734942946] Running PAD.different_from_here: PAD HERE = . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3736201476] Test passed +[Hera] [HADES][TEST ] Testing PAD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3737464038] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 3738249207] Running PAD.stability: PAD DUP PAD = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3739448118] Test passed +[Hera] [HADES][TEST ] Testing PAD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3740727081] Expected: Should be stable +[Hera] [HADES][TEST ] [KRELTSC: 3741550617] Running PAD.usable: PAD 42 OVER ! @ . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 3742697343] Test passed +[Hera] [HADES][TEST ] Testing PAD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3744169128] Expected: Should be usable memory +[Hera] [HADES][TEST ] [KRELTSC: 3744988296] PAD: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3745929558] Testing word: SP@ +[Hera] [HADES][TEST ] [KRELTSC: 3746614683] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3747413523] Running SP@.depth_effect: 42 SP@ SWAP DROP SP@ = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3748806852] Test passed +[Hera] [HADES][TEST ] Testing SP@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3750134073] Expected: Should show stack effect +[Hera] [HADES][TEST ] [KRELTSC: 3751005489] Running SP@.empty_stack: DEPTH 0= SP@ AND . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3752239764] Test passed +[Hera] [HADES][TEST ] Testing SP@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3753548757] Expected: Should work on empty stack +[Hera] [HADES][TEST ] [KRELTSC: 3754393314] Running SP@.multiple_items: 1 2 3 SP@ SWAP DROP SWAP DROP SWA +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3756061134] Test passed +[Hera] [HADES][TEST ] Testing SP@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3757457928] Expected: Should track changes +[Hera] [HADES][TEST ] [KRELTSC: 3758268276] SP@: 3 passed, 0 failed, 1 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3759192885] Testing word: SP! +[Hera] [HADES][TEST ] [KRELTSC: 3759881832] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3760608978] Running SP!.basic_restore: 1 2 3 SP@ 4 5 6 DROP DROP DROP SP! +[Hera] 3 [HADES][TEST ] [KRELTSC: 3762116862] Test passed +[Hera] [HADES][TEST ] Testing SP! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3763196367] Expected: Should restore stack +[Hera] [HADES][TEST ] [KRELTSC: 3764065683] Running SP!.invalid_addr: 0 SP! +[Hera] [HADES][TEST ] [KRELTSC: 3764901357] Expected error occurred +[Hera] [HADES][TEST ] Testing SP! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3766325388] Expected: Should cause error +[Hera] [HADES][TEST ] [KRELTSC: 3767128575] Running SP!.empty_stack: SP! +[Hera] [HADES][TEST ] [KRELTSC: 3767953119] Expected error occurred +[Hera] [HADES][TEST ] Testing SP! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3769519719] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3770421144] SP!: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3771328344] Testing word: LATEST +[Hera] [HADES][TEST ] [KRELTSC: 3772015149] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3772774845] Running LATEST.basic: LATEST LATEST = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3773991900] Test passed +[Hera] [HADES][TEST ] Testing LATEST ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3775343901] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 3776112480] Running LATEST.stability: LATEST DUP LATEST = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3777431154] Test passed +[Hera] [HADES][TEST ] Testing LATEST ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3778867344] Expected: Should be stable +[Hera] [HADES][TEST ] [KRELTSC: 3779694744] LATEST: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3780636258] Testing word: COMPILATION +[Hera] [HADES][TEST ] [KRELTSC: 3781603434] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3782333625] Running COMPILATION.here_comma_sequence: HERE 10 , 20 , 30 , +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3783805473] Test passed +[Hera] [HADES][TEST ] Testing COMPILATION ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3785180553] Expected: Should advance HERE by 12 +[Hera] [HADES][TEST ] [KRELTSC: 3786039516] Running COMPILATION.mixed_compilation: HERE 42 , 65 C, 100 20 +[Hera] [HADES][INFO ] [KRELTSC: 3787535010] L8[TABLE]: Config 2 → 3 regime=7 score=26214 L1=0 L2=0 L3=0 L +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3788928549] Test passed +[Hera] [HADES][TEST ] Testing COMPILATION ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3790298232] Expected: Should advance correctly +[Hera] [HADES][TEST ] [KRELTSC: 3791175864] Running COMPILATION.allot_comma_combo: HERE 10 ALLOT 99 , HER +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3792633999] Test passed +[Hera] [HADES][TEST ] Testing COMPILATION ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3794233968] Expected: Should combine allot and comma +[Hera] [HADES][TEST ] [KRELTSC: 3795152067] Running COMPILATION.pad_isolation: PAD 999 OVER ! HERE 42 , P +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3796541532] Test passed +[Hera] [HADES][TEST ] Testing COMPILATION ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3797911656] Expected: PAD should be isolated +[Hera] [HADES][TEST ] [KRELTSC: 3798733155] COMPILATION: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3799708017] Testing word: STACK_MGMT +[Hera] [HADES][TEST ] [KRELTSC: 3800458389] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3801175917] Running STACK_MGMT.sp_round_trip: 42 43 SP@ >R 44 45 R> SP! . +[Hera] 43 42 +[Hera] [HADES][TEST ] [KRELTSC: 3802639764] Test passed +[Hera] [HADES][TEST ] Testing STACK_MGMT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3803983701] Expected: Should print: 43 42 +[Hera] [HADES][TEST ] [KRELTSC: 3804801651] Running STACK_MGMT.depth_preservation: 1 2 3 DEPTH >R SP@ >R +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3806335449] Test passed +[Hera] [HADES][TEST ] Testing STACK_MGMT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3807718446] Expected: Should preserve depth +[Hera] [HADES][TEST ] [KRELTSC: 3808602840] STACK_MGMT: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3809601558] === Dictionary Words Summary: 0 passed, 0 failed, 0 skipped, 0 +[Hera] [HADES][INFO ] [KRELTSC: 3810653595] +[Hera] === Testing Module: Dictionary Manipulation Words === +[Hera] [HADES][INFO ] [KRELTSC: 3811867353] Running Dictionary Manipulation Words Tests (Module 14)... +[Hera] [HADES][TEST ] [KRELTSC: 3812947782] ▶ Testing module: v3/src/test_runner/modules/dictionary_manip +[Hera] [HADES][TEST ] [KRELTSC: 3814070127] Testing word: CREATE +[Hera] [HADES][TEST ] [KRELTSC: 3814783161] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3815534772] Running CREATE.basic: CREATE test1 42 , test1 @ . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 3817542330] Test passed +[Hera] [HADES][TEST ] Testing CREATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3819075120] Expected: Should create and store +[Hera] [HADES][TEST ] [KRELTSC: 3819930156] Running CREATE.empty_name: CREATE +[Hera] [HADES][TEST ] [KRELTSC: 3820850502] Expected error occurred +[Hera] [HADES][TEST ] Testing CREATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3822240156] Expected: Should handle empty name +[Hera] [HADES][TEST ] [KRELTSC: 3823108695] Running CREATE.redefine_shadows: CREATE T 1 , CREATE T 2 , T +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 3825020220] Test passed +[Hera] [HADES][TEST ] Testing CREATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3826308738] Expected: Newest definition should win (prints 2) +[Hera] [HADES][TEST ] [KRELTSC: 3827298153] Running CREATE.duplicate: CREATE test2 CREATE test2 +[Hera] [HADES][TEST ] [KRELTSC: 3828776679] Test passed +[Hera] [HADES][TEST ] Testing CREATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3830079120] Expected: Should allow redefinition (latest shadows) +[Hera] [HADES][TEST ] [KRELTSC: 3831094869] CREATE: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3832247853] ▶ Testing module: v3/src/test_runner/modules/dictionary_manip +[Hera] [HADES][TEST ] [KRELTSC: 3833355036] Testing word: FORGET +[Hera] [HADES][TEST ] [KRELTSC: 3834093669] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3834847611] Running FORGET.basic: CREATE temp1 FORGET temp1 +[Hera] [HADES][TEST ] [KRELTSC: 3836835051] Test passed +[Hera] [HADES][TEST ] Testing FORGET ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3838127874] Expected: Should forget word +[Hera] [HADES][TEST ] [KRELTSC: 3838934589] Running FORGET.nonexistent: FORGET nonexistent +[Hera] [HADES][TEST ] [KRELTSC: 3840041142] Expected error occurred +[Hera] [HADES][TEST ] Testing FORGET ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3841443333] Expected: Should handle missing word +[Hera] [HADES][TEST ] [KRELTSC: 3842325123] Running FORGET.protected: FORGET FORGET +[Hera] [HADES][TEST ] [KRELTSC: 3843261639] Expected error occurred +[Hera] [HADES][TEST ] Testing FORGET ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3844848840] Expected: Should protect system words +[Hera] [HADES][TEST ] [KRELTSC: 3845731659] FORGET: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3846661833] ▶ Testing module: v3/src/test_runner/modules/dictionary_manip +[Hera] [HADES][TEST ] [KRELTSC: 3847668867] Testing word: FENCE +[Hera] [HADES][TEST ] [KRELTSC: 3848411406] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3849190905] Running FENCE.basic: CREATE fnc1 FENCE CREATE fnc2 FORGET fnc +[Hera] [HADES][TEST ] [KRELTSC: 3851037834] Test passed +[Hera] [HADES][TEST ] Testing FENCE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3852346491] Expected: Should forget a word defined after FENCE +[Hera] [HADES][TEST ] [KRELTSC: 3853326372] Running FENCE.protects_older: CREATE fnc3 CREATE fnc4 FENCE F +[Hera] [HADES][TEST ] [KRELTSC: 3854926908] Expected error occurred +[Hera] [HADES][TEST ] Testing FENCE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3856445754] Expected: Should refuse to forget a word defined before FEN +[Hera] [HADES][TEST ] [KRELTSC: 3857495124] Running FENCE.forget_latest_keeps_predecessor: CREATE fnc5 FE +[Hera] [HADES][TEST ] [KRELTSC: 3859424814] Test passed +[Hera] [HADES][TEST ] Testing FENCE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3860715999] Expected: Forgetting the newest word must not disturb an ol +[Hera] [HADES][TEST ] [KRELTSC: 3861741870] FENCE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3862653249] ▶ Testing module: v3/src/test_runner/modules/dictionary_manip +[Hera] [HADES][TEST ] [KRELTSC: 3863697159] Testing word: IMMEDIATE +[Hera] [HADES][TEST ] [KRELTSC: 3864458367] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3865207731] Running IMMEDIATE.basic: : test3 42 ; IMMEDIATE test3 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 3867190572] Test passed +[Hera] [HADES][TEST ] Testing IMMEDIATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3868537092] Expected: Should execute immediately +[Hera] [HADES][TEST ] [KRELTSC: 3869683503] Running IMMEDIATE.already_immediate: : test4 43 ; IMMEDIATE I +[Hera] [HADES][TEST ] [KRELTSC: 3871066521] Test passed +[Hera] [HADES][TEST ] Testing IMMEDIATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3872475096] Expected: Should handle double immediate +[Hera] [HADES][TEST ] [KRELTSC: 3873379797] IMMEDIATE: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3874326435] ▶ Testing module: v3/src/test_runner/modules/dictionary_manip +[Hera] [HADES][TEST ] [KRELTSC: 3875350605] Testing word: FIND +[Hera] [HADES][TEST ] [KRELTSC: 3876048834] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3876790050] Running FIND.existing: FIND DUP . CR +[Hera] 35784496 +[Hera] [HADES][TEST ] [KRELTSC: 3878134680] Test passed +[Hera] [HADES][TEST ] Testing FIND ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3879437940] Expected: Should find system word +[Hera] [HADES][TEST ] [KRELTSC: 3880275252] Running FIND.user_word: : test5 44 ; FIND test5 . CR +[Hera] 36118080 +[Hera] [HADES][TEST ] [KRELTSC: 3881935932] Test passed +[Hera] [HADES][TEST ] Testing FIND ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3883245366] Expected: Should find user word +[Hera] [HADES][TEST ] [KRELTSC: 3884086017] Running FIND.nonexistent: FIND nonexistent . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3885363909] Test passed +[Hera] [HADES][TEST ] Testing FIND ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3886656858] Expected: Should return 0 +[Hera] [HADES][TEST ] [KRELTSC: 3887415483] Running FIND.empty: FIND +[Hera] [HADES][TEST ] [KRELTSC: 3888253656] Expected error occurred +[Hera] [HADES][TEST ] Testing FIND ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3889610424] Expected: Should error (no token) +[Hera] [HADES][TEST ] [KRELTSC: 3890471235] FIND: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3891336918] ▶ Testing module: v3/src/test_runner/modules/dictionary_manip +[Hera] [HADES][TEST ] [KRELTSC: 3892372512] Testing word: DEFINITIONS +[Hera] [HADES][TEST ] [KRELTSC: 3893117424] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3893929872] Running DEFINITIONS.basic: FORTH DEFINITIONS +[Hera] [HADES][TEST ] [KRELTSC: 3895152870] Test passed +[Hera] [HADES][TEST ] Testing DEFINITIONS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3896518395] Expected: Should set current to context +[Hera] [HADES][TEST ] [KRELTSC: 3897409404] Running DEFINITIONS.multiple: FORTH DEFINITIONS DEFINITIONS +[Hera] [HADES][TEST ] [KRELTSC: 3898444641] Test passed +[Hera] [HADES][TEST ] Testing DEFINITIONS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3899815542] Expected: Should be idempotent +[Hera] [HADES][TEST ] [KRELTSC: 3900608523] DEFINITIONS: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3901572402] ▶ Testing module: v3/src/test_runner/modules/dictionary_manip +[Hera] [HADES][TEST ] [KRELTSC: 3902591364] Testing word: SMUDGE +[Hera] [HADES][TEST ] [KRELTSC: 3903305238] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3904049751] Running SMUDGE.during_def: : test6 SMUDGE 45 ; +[Hera] [HADES][TEST ] [KRELTSC: 3905315883] Test passed +[Hera] [HADES][TEST ] Testing SMUDGE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3906721014] Expected: Should hide incomplete def +[Hera] [HADES][TEST ] [KRELTSC: 3907684956] Running SMUDGE.outside_def: SMUDGE +[Hera] [HADES][TEST ] [KRELTSC: 3908605386] Expected error occurred +[Hera] [HADES][TEST ] Testing SMUDGE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3910008858] Expected: Should error outside def +[Hera] [HADES][TEST ] [KRELTSC: 3910861815] SMUDGE: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3911801670] ▶ Testing module: v3/src/test_runner/modules/dictionary_manip +[Hera] [HADES][TEST ] [KRELTSC: 3912826029] Testing word: LATEST +[Hera] [HADES][TEST ] [KRELTSC: 3913547442] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3914295420] Running LATEST.basic: LATEST @ . CR +[Hera] 35865920 +[Hera] [HADES][TEST ] [KRELTSC: 3915541140] Test passed +[Hera] [HADES][TEST ] Testing LATEST ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3916895661] Expected: Should show latest word +[Hera] [HADES][TEST ] [KRELTSC: 3917744649] Running LATEST.after_def: : test7 46 ; LATEST @ . CR +[Hera] 35905104 +[Hera] [HADES][TEST ] [KRELTSC: 3919628622] Test passed +[Hera] [HADES][TEST ] Testing LATEST ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3920948241] Expected: Should update after def +[Hera] [HADES][TEST ] [KRELTSC: 3921757707] Running LATEST.after_forget: CREATE test8 FORGET test8 LATEST +[Hera] 35905104 +[Hera] [HADES][TEST ] [KRELTSC: 3923507343] Test passed +[Hera] [HADES][TEST ] Testing LATEST ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3924850104] Expected: Should update after forget +[Hera] [HADES][TEST ] [KRELTSC: 3925722549] LATEST: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3926599992] ▶ Testing module: v3/src/test_runner/modules/dictionary_manip +[Hera] [HADES][TEST ] [KRELTSC: 3927651441] Testing word: >BODY +[Hera] [HADES][TEST ] [KRELTSC: 3928378272] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3929207646] Running >BODY.basic: CREATE test9 ' test9 >BODY . CR +[Hera] 36119592 +[Hera] [HADES][TEST ] [KRELTSC: 3931153485] Test passed +[Hera] [HADES][TEST ] Testing >BODY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3932686338] Expected: Should get param field +[Hera] [HADES][TEST ] [KRELTSC: 3933535704] Running >BODY.variable: VARIABLE var1 ' var1 >BODY . CR +[Hera] 36120056 +[Hera] [HADES][TEST ] [KRELTSC: 3935388093] Test passed +[Hera] [HADES][TEST ] Testing >BODY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3936735936] Expected: Should get var storage +[Hera] [HADES][TEST ] [KRELTSC: 3937581102] Running >BODY.nonexistent: ' NONEXISTENT >BODY +[Hera] [HADES][ERROR] [KRELTSC: 3938610018] ': word 'NONEXISTENT' not found +[Hera] [HADES][TEST ] [KRELTSC: 3939639207] Expected error occurred +[Hera] [HADES][TEST ] Testing >BODY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3941052213] Expected: Should handle missing word +[Hera] [HADES][TEST ] [KRELTSC: 3941915712] >BODY: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3942856596] ▶ Testing module: v3/src/test_runner/modules/dictionary_manip +[Hera] [HADES][TEST ] [KRELTSC: 3943882278] Testing word: HIDDEN +[Hera] [HADES][TEST ] [KRELTSC: 3944843742] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3945554655] Running HIDDEN.basic: : test10 HIDDEN 47 ; +[Hera] [HADES][TEST ] [KRELTSC: 3946967745] Test passed +[Hera] [HADES][TEST ] Testing HIDDEN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3948295365] Expected: Should hide word +[Hera] [HADES][TEST ] [KRELTSC: 3949143996] Running HIDDEN.outside_def: HIDDEN +[Hera] [HADES][TEST ] [KRELTSC: 3950072343] Expected error occurred +[Hera] [HADES][TEST ] Testing HIDDEN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3951513258] Expected: Should error outside def +[Hera] [HADES][TEST ] [KRELTSC: 3952372746] HIDDEN: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3953363358] === Dictionary Manipulation Words Summary: 0 passed, 0 failed, +[Hera] [HADES][INFO ] [KRELTSC: 3954380850] +[Hera] === Testing Module: Vocabulary Words === +[Hera] [HADES][INFO ] [KRELTSC: 3955507668] Running Vocabulary Words Tests (Module 15)... +[Hera] [HADES][TEST ] [KRELTSC: 3956429148] ▶ Testing module: v3/src/test_runner/modules/vocabulary_words +[Hera] [HADES][TEST ] [KRELTSC: 3957774450] Testing word: VOCABULARY +[Hera] [HADES][TEST ] [KRELTSC: 3958501953] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3959258583] Running VOCABULARY.basic: VOCABULARY TEST-VOC1 TEST-VOC1 DEFI +[Hera] [HADES][TEST ] [KRELTSC: 3964605561] Test passed +[Hera] [HADES][TEST ] Testing VOCABULARY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3965872659] Expected: Should create vocabulary +[Hera] [HADES][TEST ] [KRELTSC: 3966673662] Running VOCABULARY.create_and_switch: VOCABULARY MYVOC MYVOC +[Hera] 36124576 +[Hera] [HADES][TEST ] [KRELTSC: 3971929962] Test passed +[Hera] [HADES][TEST ] Testing VOCABULARY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3973221777] Expected: Should create and switch +[Hera] [HADES][TEST ] [KRELTSC: 3974054133] Running VOCABULARY.word_isolation: VOCABULARY ISOLATED ISOLAT +[Hera] [HADES][TEST ] [KRELTSC: 3982259673] Test passed +[Hera] [HADES][TEST ] Testing VOCABULARY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3983338317] Expected: Should create word in isolated vocab +[Hera] [HADES][TEST ] [KRELTSC: 3984177351] Running VOCABULARY.cross_vocab_access: VOCABULARY V1 V1 DEFIN +[Hera] 11 +[Hera] [HADES][TEST ] [KRELTSC: 3992355066] Test passed +[Hera] [HADES][TEST ] Testing VOCABULARY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3993661791] Expected: Should access word across vocabs +[Hera] [HADES][TEST ] [KRELTSC: 3994427157] Running VOCABULARY.multiple_vocabs: VOCABULARY VA VOCABULARY +[Hera] [HADES][TEST ] [KRELTSC: 3999820881] Test passed +[Hera] [HADES][TEST ] Testing VOCABULARY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4001076912] Expected: Should create multiple vocabs +[Hera] [HADES][TEST ] [KRELTSC: 4001880603] Running VOCABULARY.duplicate: VOCABULARY TESTVOC VOCABULARY T +[Hera] [HADES][ERROR] [KRELTSC: 4003291929] VOCABULARY: duplicate 'TESTVOC' +[Hera] [HADES][TEST ] [KRELTSC: 4004092470] Expected error occurred +[Hera] [HADES][TEST ] Testing VOCABULARY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4005504069] Expected: Should handle duplicate +[Hera] [HADES][TEST ] [KRELTSC: 4006374540] Running VOCABULARY.empty_name: VOCABULARY +[Hera] [HADES][ERROR] [KRELTSC: 4007524290] VOCABULARY: missing name +[Hera] [HADES][TEST ] [KRELTSC: 4008303096] Expected error occurred +[Hera] [HADES][TEST ] Testing VOCABULARY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4009754238] Expected: Should handle empty name +[Hera] [HADES][TEST ] [KRELTSC: 4010591613] VOCABULARY: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4011595014] ▶ Testing module: v3/src/test_runner/modules/vocabulary_words +[Hera] [HADES][TEST ] [KRELTSC: 4012624749] Testing word: FORTH +[Hera] [HADES][TEST ] [KRELTSC: 4013339106] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4014073287] Running FORTH.basic: FORTH DEFINITIONS +[Hera] [HADES][TEST ] [KRELTSC: 4017813555] Test passed +[Hera] [HADES][TEST ] Testing FORTH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4019096760] Expected: Should select FORTH vocab +[Hera] [HADES][TEST ] [KRELTSC: 4020146172] Running FORTH.persistence: FORTH : TEST1 42 ; TEST1 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 4021806621] Test passed +[Hera] [HADES][TEST ] Testing FORTH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4023091023] Expected: Should find word in FORTH +[Hera] [HADES][TEST ] [KRELTSC: 4023940893] Running FORTH.from_other: VOCABULARY OTHER-VOC OTHER-VOC FORT +[Hera] [HADES][TEST ] [KRELTSC: 4028833137] Test passed +[Hera] [HADES][TEST ] Testing FORTH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4030127115] Expected: Should return to FORTH +[Hera] [HADES][TEST ] [KRELTSC: 4030990488] FORTH: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4031873979] ▶ Testing module: v3/src/test_runner/modules/vocabulary_words +[Hera] [HADES][TEST ] [KRELTSC: 4033136730] Testing word: DEFINITIONS +[Hera] [HADES][TEST ] [KRELTSC: 4033874544] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4034665404] Running DEFINITIONS.basic: FORTH DEFINITIONS +[Hera] [HADES][TEST ] [KRELTSC: 4038415857] Test passed +[Hera] [HADES][TEST ] Testing DEFINITIONS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4039711536] Expected: Should set current vocabulary +[Hera] [HADES][TEST ] [KRELTSC: 4040599731] Running DEFINITIONS.new_vocab: VOCABULARY TEST-VOC6 TEST-VOC6 +[Hera] [HADES][TEST ] [KRELTSC: 4045563228] Test passed +[Hera] [HADES][TEST ] Testing DEFINITIONS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4046948010] Expected: Should set new current +[Hera] [HADES][TEST ] [KRELTSC: 4047814554] Running DEFINITIONS.word_creation: VOCABULARY TEST-VOC7 TEST- +[Hera] [HADES][TEST ] [KRELTSC: 4053099435] Test passed +[Hera] [HADES][TEST ] Testing DEFINITIONS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4054455552] Expected: Should create in correct vocab +[Hera] [HADES][TEST ] [KRELTSC: 4055375541] DEFINITIONS: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4056353721] ▶ Testing module: v3/src/test_runner/modules/vocabulary_words +[Hera] [HADES][TEST ] [KRELTSC: 4057377954] Testing word: CONTEXT +[Hera] [HADES][TEST ] [KRELTSC: 4058347251] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4059094578] Running CONTEXT.basic: CONTEXT @ . CR +[Hera] 36130560 +[Hera] [HADES][TEST ] [KRELTSC: 4060349475] Test passed +[Hera] [HADES][TEST ] Testing CONTEXT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4061685537] Expected: Should show current context +[Hera] [HADES][TEST ] [KRELTSC: 4062509850] Running CONTEXT.modify: CONTEXT @ 1+ CONTEXT ! +[Hera] [HADES][TEST ] [KRELTSC: 4063597608] Test passed +[Hera] [HADES][TEST ] Testing CONTEXT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4064925879] Expected: Should allow modification (impl-defined effect) +[Hera] [HADES][TEST ] [KRELTSC: 4065978252] Running CONTEXT.initial: FORTH CONTEXT @ . CR +[Hera] 35875728 +[Hera] [HADES][TEST ] [KRELTSC: 4070353644] Test passed +[Hera] [HADES][TEST ] Testing CONTEXT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4071674040] Expected: Should show FORTH vocab +[Hera] [HADES][TEST ] [KRELTSC: 4072554675] CONTEXT: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4073484870] ▶ Testing module: v3/src/test_runner/modules/vocabulary_words +[Hera] [HADES][TEST ] [KRELTSC: 4074570423] Testing word: CURRENT +[Hera] [HADES][TEST ] [KRELTSC: 4075277178] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4076051931] Running CURRENT.basic: CURRENT @ . CR +[Hera] 36130560 +[Hera] [HADES][TEST ] [KRELTSC: 4077355905] Test passed +[Hera] [HADES][TEST ] Testing CURRENT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4078697847] Expected: Should show current vocab +[Hera] [HADES][TEST ] [KRELTSC: 4079556495] Running CURRENT.after_def: VOCABULARY TEST-VOC8 TEST-VOC8 DEF +[Hera] 36127264 +[Hera] [HADES][TEST ] [KRELTSC: 4084854711] Test passed +[Hera] [HADES][TEST ] Testing CURRENT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4086106143] Expected: Should show new vocab +[Hera] [HADES][TEST ] [KRELTSC: 4086875856] Running CURRENT.protect: CURRENT @ 1+ CURRENT ! +[Hera] [HADES][INFO ] [KRELTSC: 4087889463] L8[TABLE]: Config 3 → 4 regime=7 score=26214 L1=0 L2=0 L3=0 L +[Hera] [HADES][TEST ] [KRELTSC: 4089033396] Test passed +[Hera] [HADES][TEST ] Testing CURRENT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4090367736] Expected: Should allow modification (impl-defined effect) +[Hera] [HADES][TEST ] [KRELTSC: 4091396127] CURRENT: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4092302823] ▶ Testing module: v3/src/test_runner/modules/vocabulary_words +[Hera] [HADES][TEST ] [KRELTSC: 4093343814] Testing word: ORDER +[Hera] [HADES][TEST ] [KRELTSC: 4094041560] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4094786346] Running ORDER.basic: ORDER +[Hera] Search order: +[Hera] + + +[Hera] Current: + + +[Hera] [HADES][TEST ] [KRELTSC: 4097077572] Test passed +[Hera] [HADES][TEST ] Testing ORDER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4098411429] Expected: Should list search order +[Hera] [HADES][TEST ] [KRELTSC: 4099279380] Running ORDER.multiple: VOCABULARY TEST-VOC9 TEST-VOC9 DEFINI +[Hera] Search order: +[Hera] + + +[Hera] Current: + + +[Hera] [HADES][TEST ] [KRELTSC: 4105142349] Test passed +[Hera] [HADES][TEST ] Testing ORDER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4106450271] Expected: Should show all vocabs +[Hera] [HADES][TEST ] [KRELTSC: 4107272778] Running ORDER.after_forth: TEST-VOC9 FORTH ORDER +[Hera] Search order: + + +[Hera] Current: + + +[Hera] [HADES][TEST ] [KRELTSC: 4111939272] Test passed +[Hera] [HADES][TEST ] Testing ORDER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4113200196] Expected: Should show FORTH only +[Hera] [HADES][TEST ] [KRELTSC: 4113930849] ORDER: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4114821396] === Vocabulary Words Summary: 0 passed, 0 failed, 0 skipped, 0 +[Hera] [HADES][INFO ] [KRELTSC: 4115854932] +[Hera] === Testing Module: System Words === +[Hera] [HADES][INFO ] [KRELTSC: 4117011234] Running System Words Tests (Module 18)... +[Hera] [HADES][WARN ] [KRELTSC: 4117929753] Some system tests marked as unimplemented due to system-level e +[Hera] [HADES][TEST ] [KRELTSC: 4119017427] ▶ Testing module: v3/src/test_runner/modules/system_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 4120063437] Testing word: QUIT +[Hera] [HADES][TEST ] [KRELTSC: 4121026791] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4121779263] Running QUIT.in_definition: : BAD-WORD QUIT ; +[Hera] [HADES][TEST ] [KRELTSC: 4123136262] Expected error occurred +[Hera] [HADES][TEST ] Testing QUIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4124553321] Expected: Should prevent compilation +[Hera] [HADES][TEST ] [KRELTSC: 4125424863] QUIT: 1 passed, 0 failed, 1 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4126363647] ▶ Testing module: v3/src/test_runner/modules/system_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 4127368854] Testing word: ABORT +[Hera] [HADES][TEST ] [KRELTSC: 4128101775] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4128850614] Running ABORT.basic: ABORT +[Hera] [HADES][TEST ] [KRELTSC: 4129733202] Test passed +[Hera] [HADES][TEST ] Testing ABORT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4131085770] Expected: Should clear stacks and return to QUIT +[Hera] [HADES][TEST ] [KRELTSC: 4132025709] Running ABORT.with_data: 1 2 3 ABORT DEPTH . CR +[Hera] [HADES][TEST ] [KRELTSC: 4133184972] Test passed +[Hera] [HADES][TEST ] Testing ABORT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4134489576] Expected: Should clear stack +[Hera] [HADES][TEST ] [KRELTSC: 4135318467] Running ABORT.in_definition_runtime: : BAD-WORD ABORT ; 123 +[Hera] [HADES][TEST ] [KRELTSC: 4136735421] Test passed +[Hera] [HADES][TEST ] Testing ABORT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4138061067] Expected: ABORT may appear in a definition; when executed i +[Hera] [HADES][TEST ] [KRELTSC: 4139086791] ABORT: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4140026856] ▶ Testing module: v3/src/test_runner/modules/system_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 4141062555] Testing word: ABORT" +[Hera] [HADES][TEST ] [KRELTSC: 4141787811] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4142544525] Running ABORT".condition_true: -1 ABORT" Error" + +[Hera] [HADES][TEST ] [KRELTSC: 4143897156] Test passed +[Hera] [HADES][TEST ] Testing ABORT" ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4145227926] Expected: Should abort with message (no error; stacks clear +[Hera] [HADES][TEST ] [KRELTSC: 4146480261] Running ABORT".condition_false: 0 ABORT" Error" +[Hera] [HADES][TEST ] [KRELTSC: 4147469319] Test passed +[Hera] [HADES][TEST ] Testing ABORT" ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4148794944] Expected: Should not abort +[Hera] [HADES][TEST ] [KRELTSC: 4149550314] Running ABORT".empty_stack: ABORT" +[Hera] [HADES][TEST ] [KRELTSC: 4150437921] Expected error occurred +[Hera] [HADES][TEST ] Testing ABORT" ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4151858676] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4152719298] ABORT": 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4153665222] ▶ Testing module: v3/src/test_runner/modules/system_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 4154727360] Testing word: BYE +[Hera] [HADES][TEST ] [KRELTSC: 4155394824] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4156225752] BYE: 0 passed, 0 failed, 1 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4157131608] ▶ Testing module: v3/src/test_runner/modules/system_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 4158424053] Testing word: COLD +[Hera] [HADES][TEST ] [KRELTSC: 4159168587] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4159931475] COLD: 0 passed, 0 failed, 1 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4160853648] ▶ Testing module: v3/src/test_runner/modules/system_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 4161890208] Testing word: WARM +[Hera] [HADES][TEST ] [KRELTSC: 4162604229] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4163349225] WARM: 0 passed, 0 failed, 1 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4164265875] === System Words Summary: 0 passed, 0 failed, 0 skipped, 0 erro +[Hera] [HADES][INFO ] [KRELTSC: 4165324947] +[Hera] === Testing Module: Defining Words === +[Hera] [HADES][INFO ] [KRELTSC: 4166420097] Running Defining Words Tests (Module 13)... +[Hera] [HADES][TEST ] [KRELTSC: 4167383010] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 4168384206] Testing word: : +[Hera] [HADES][TEST ] [KRELTSC: 4169106333] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4169846415] Running :.basic: : TEST1 42 ; TEST1 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 4171778835] Test passed +[Hera] [HADES][TEST ] Testing : ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4173080856] Expected: Should define and execute +[Hera] [HADES][TEST ] [KRELTSC: 4173959601] Running :.empty_name: : +[Hera] [HADES][TEST ] [KRELTSC: 4174760205] Expected error occurred +[Hera] [HADES][TEST ] Testing : ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4176126654] Expected: Should handle empty definition +[Hera] [HADES][TEST ] [KRELTSC: 4177057584] Running :.nested: : TEST3 : ; +[Hera] [HADES][ERROR] [KRELTSC: 4178145111] Nested ':' inside a definition is not allowed +[Hera] [HADES][TEST ] [KRELTSC: 4179059766] Expected error occurred +[Hera] [HADES][TEST ] Testing : ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4180430058] Expected: Should prevent nested definition +[Hera] [HADES][TEST ] [KRELTSC: 4181320815] :: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4182253677] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 4183367391] Testing word: ; +[Hera] [HADES][TEST ] [KRELTSC: 4184179608] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4184899677] Running ;.alone: ; +[Hera] [HADES][TEST ] [KRELTSC: 4185738480] Expected error occurred +[Hera] [HADES][TEST ] Testing ; ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4187107575] Expected: Should error outside definition +[Hera] [HADES][TEST ] [KRELTSC: 4187991213] Running ;.immediate: : TEST4 42 ; IMMEDIATE TEST4 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 4189614723] Test passed +[Hera] [HADES][TEST ] Testing ; ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4190865735] Expected: Should handle immediate +[Hera] [HADES][TEST ] [KRELTSC: 4191714408] ;: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4192590171] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 4193624652] Testing word: CONSTANT +[Hera] [HADES][TEST ] [KRELTSC: 4194348711] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4195064139] Running CONSTANT.basic: 42 CONSTANT MEANING MEANING . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 4197175857] Test passed +[Hera] [HADES][TEST ] Testing CONSTANT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4198519080] Expected: Should create constant +[Hera] [HADES][TEST ] [KRELTSC: 4199347908] Running CONSTANT.zero: 0 CONSTANT ZERO ZERO . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 4200829332] Test passed +[Hera] [HADES][TEST ] Testing CONSTANT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4202177406] Expected: Should handle zero +[Hera] [HADES][TEST ] [KRELTSC: 4202981013] Running CONSTANT.negative: -1 CONSTANT MINUS MINUS . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 4204650429] Test passed +[Hera] [HADES][TEST ] Testing CONSTANT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4205968284] Expected: Should handle negative +[Hera] [HADES][TEST ] [KRELTSC: 4206846546] Running CONSTANT.empty_stack: CONSTANT +[Hera] [HADES][TEST ] [KRELTSC: 4207789341] Expected error occurred +[Hera] [HADES][TEST ] Testing CONSTANT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4209466968] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4210358733] CONSTANT: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4211317257] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 4212387144] Testing word: VARIABLE +[Hera] [HADES][TEST ] [KRELTSC: 4213119540] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4213865229] Running VARIABLE.basic: VARIABLE VAR1 42 VAR1 ! VAR1 @ . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 4215968547] Test passed +[Hera] [HADES][TEST ] Testing VARIABLE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4217371935] Expected: Should create variable +[Hera] [HADES][TEST ] [KRELTSC: 4218210150] Running VARIABLE.multiple: VARIABLE VAR2 VARIABLE VAR3 +[Hera] [HADES][TEST ] [KRELTSC: 4219752369] Test passed +[Hera] [HADES][TEST ] Testing VARIABLE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4221268464] Expected: Should create multiple +[Hera] [HADES][TEST ] [KRELTSC: 4222111740] Running VARIABLE.store_fetch: VARIABLE VAR4 -99 VAR4 ! VAR4 @ +[Hera] -99 +[Hera] [HADES][TEST ] [KRELTSC: 4223735670] Test passed +[Hera] [HADES][TEST ] Testing VARIABLE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4225058607] Expected: Should store/fetch +[Hera] [HADES][TEST ] [KRELTSC: 4225889703] VARIABLE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4226786382] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 4227867966] Testing word: CREATE +[Hera] [HADES][TEST ] [KRELTSC: 4228560504] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4229307180] Running CREATE.basic: CREATE OBJ1 +[Hera] [HADES][TEST ] [KRELTSC: 4230491097] Test passed +[Hera] [HADES][TEST ] Testing CREATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4231774638] Expected: Should create word +[Hera] [HADES][TEST ] [KRELTSC: 4232624298] Running CREATE.with_data: CREATE OBJ2 42 , OBJ2 @ . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 4234323009] Test passed +[Hera] [HADES][TEST ] Testing CREATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4235647584] Expected: Should allow data +[Hera] [HADES][TEST ] [KRELTSC: 4236427755] Running CREATE.empty_name: CREATE +[Hera] [HADES][TEST ] [KRELTSC: 4237293459] Expected error occurred +[Hera] [HADES][TEST ] Testing CREATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4238719338] Expected: Should handle empty name +[Hera] [HADES][TEST ] [KRELTSC: 4239548439] CREATE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4240457235] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 4241497218] Testing word: DOES> +[Hera] [HADES][TEST ] [KRELTSC: 4242191751] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4242957264] Running DOES>.basic: : CONST CREATE , DOES> @ ; 42 CONST MEAN +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 4245956400] Test passed +[Hera] [HADES][TEST ] Testing DOES> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4247527032] Expected: Should define behavior +[Hera] [HADES][TEST ] [KRELTSC: 4248349308] Running DOES>.multiple: : ARRAY CREATE DOES> SWAP CELLS + ; C +[Hera] [HADES][TEST ] [KRELTSC: 4250117214] Test passed +[Hera] [HADES][TEST ] Testing DOES> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4251388890] Expected: Should work with arrays +[Hera] [HADES][TEST ] [KRELTSC: 4252242456] Running DOES>.outside: DOES> +[Hera] [HADES][ERROR] [KRELTSC: 4253119374] DOES>: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 4253800782] Expected error occurred +[Hera] [HADES][TEST ] Testing DOES> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4255215510] Expected: Should error outside definition +[Hera] [HADES][TEST ] [KRELTSC: 4256133903] DOES>: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4257072456] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 4258121805] Testing word: [ +[Hera] [HADES][TEST ] [KRELTSC: 4258916004] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4259756424] Running [.basic: : TEST5 [ 42 ] LITERAL ; TEST5 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 4261614399] Test passed +[Hera] [HADES][TEST ] Testing [ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4262951385] Expected: Should enter interpret +[Hera] [HADES][TEST ] [KRELTSC: 4263793443] Running [.outside: [ +[Hera] [HADES][TEST ] [KRELTSC: 4264534491] Test passed +[Hera] [HADES][TEST ] Testing [ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4265833551] Expected: Should be allowed outside definition (no error) +[Hera] [HADES][TEST ] [KRELTSC: 4266866163] [: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4267786635] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 4268806626] Testing word: ] +[Hera] [HADES][TEST ] [KRELTSC: 4269516720] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4270247373] Running ].basic: [ 42 ] . CR +[Hera] [HADES][TEST ] [KRELTSC: 4271169210] Test passed +[Hera] [HADES][TEST ] Testing ] ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4272624636] Expected: Should resume compile +[Hera] [HADES][TEST ] [KRELTSC: 4273491516] Running ].nested: : TEST6 [ ] 42 ; TEST6 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 4275088272] Test passed +[Hera] [HADES][TEST ] Testing ] ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4276349196] Expected: Should handle nesting +[Hera] [HADES][TEST ] [KRELTSC: 4277166663] ]: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4278103179] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 4279124577] Testing word: DEFER +[Hera] [HADES][TEST ] [KRELTSC: 4279809891] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4280560326] Running DEFER.basic: DEFER DF1 : DF1W 42 . CR ; ' DF1W IS DF1 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 4283042925] Test passed +[Hera] [HADES][TEST ] Testing DEFER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4284613032] Expected: Should print: 42 +[Hera] [HADES][TEST ] [KRELTSC: 4285432809] Running DEFER.uninit: DEFER DF2 DF2 +[Hera] [HADES][ERROR] [KRELTSC: 4286660574] DEFER runtime: no target set for 'DF2' +[Hera] [HADES][TEST ] [KRELTSC: 4287492006] Expected error occurred +[Hera] [HADES][TEST ] Testing DEFER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4288921455] Expected: Should error: uninitialized deferred word +[Hera] [HADES][TEST ] [KRELTSC: 4289877921] DEFER: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4290786150] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 4291844487] Testing word: IS +[Hera] [HADES][TEST ] [KRELTSC: 4292549919] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4293291156] Running IS.basic: DEFER IS1 : IS1W 99 . CR ; ' IS1W IS IS1 IS +[Hera] 99 +[Hera] [HADES][TEST ] [KRELTSC: 4295318118] Test passed +[Hera] [HADES][TEST ] Testing IS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4296827073] Expected: Should print: 99 +[Hera] [HADES][TEST ] [KRELTSC: 4297611864] Running IS.not_defer: 42 IS DUP +[Hera] [HADES][ERROR] [KRELTSC: 4298516565] IS: 'DUP' was not created by DEFER +[Hera] [HADES][TEST ] [KRELTSC: 4299374100] Expected error occurred +[Hera] [HADES][TEST ] Testing IS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4300803234] Expected: Should error: DUP is not a DEFER word +[Hera] [HADES][TEST ] [KRELTSC: 4301777424] Running IS.not_found: 42 IS NOSUCH +[Hera] [HADES][ERROR] [KRELTSC: 4302702558] IS: word 'NOSUCH' not found +[Hera] [HADES][TEST ] [KRELTSC: 4303495392] Expected error occurred +[Hera] [HADES][TEST ] Testing IS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4304919927] Expected: Should error: word not found +[Hera] [HADES][TEST ] [KRELTSC: 4305799512] IS: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4306696296] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 4307773512] Testing word: DEFER@ +[Hera] [HADES][TEST ] [KRELTSC: 4308478503] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4309409517] Running DEFER@.basic: DEFER DFA1 : DFA1W 7 . CR ; ' DFA1W IS +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 4311786003] Test passed +[Hera] [HADES][TEST ] Testing DEFER@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4313073660] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 4313858514] Running DEFER@.not_found: DEFER@ NOSUCH2 +[Hera] [HADES][ERROR] [KRELTSC: 4314809940] DEFER@: word 'NOSUCH2' not found +[Hera] [HADES][TEST ] [KRELTSC: 4315662792] Expected error occurred +[Hera] [HADES][TEST ] Testing DEFER@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4317123804] Expected: Should error: word not found +[Hera] [HADES][TEST ] [KRELTSC: 4318018110] DEFER@: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4318913592] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 4319985957] Testing word: ['] +[Hera] [HADES][TEST ] [KRELTSC: 4320681750] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4321436049] Running ['].compile_xt: : BKT1 ['] DUP ; 77 BKT1 EXECUTE . . +[Hera] 77 77 +[Hera] [HADES][TEST ] [KRELTSC: 4324098051] Test passed +[Hera] [HADES][TEST ] Testing ['] ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4325431593] Expected: Should print: 77 77 +[Hera] [HADES][TEST ] [KRELTSC: 4326269262] Running ['].pin_like: : BKT2 ['] DROP ; 1 2 BKT2 EXECUTE . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 4327984710] Test passed +[Hera] [HADES][TEST ] Testing ['] ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4329313464] Expected: Should print: 1 +[Hera] [HADES][TEST ] [KRELTSC: 4330089645] Running ['].not_found: : BKT3 ['] NOSUCHWORD ; +[Hera] [HADES][ERROR] [KRELTSC: 4331320770] [']': word 'NOSUCHWORD' not found +[Hera] [HADES][TEST ] [KRELTSC: 4332251112] Expected error occurred +[Hera] [HADES][TEST ] Testing ['] ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4333648326] Expected: Should error: word not found +[Hera] [HADES][TEST ] [KRELTSC: 4334737890] [']: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4335695511] === Defining Words Summary: 0 passed, 0 failed, 0 skipped, 0 er +[Hera] [HADES][INFO ] [KRELTSC: 4336754247] +[Hera] === Testing Module: Control Words === +[Hera] [HADES][INFO ] [KRELTSC: 4337820606] Running Control Words Tests (Module 12)... +[Hera] [HADES][TEST ] [KRELTSC: 4338760944] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 4339803552] Testing word: IF +[Hera] [HADES][TEST ] [KRELTSC: 4340532399] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4341253098] Running IF.true: : TEST1 IF 42 ELSE 24 THEN ; -1 TEST1 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 4343789562] Test passed +[Hera] [HADES][TEST ] Testing IF ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4345079928] Expected: Should take true branch +[Hera] [HADES][TEST ] [KRELTSC: 4345904808] Running IF.false: : TEST2 IF 42 ELSE 24 THEN ; 0 TEST2 . CR +[Hera] 24 +[Hera] [HADES][TEST ] [KRELTSC: 4347924987] Test passed +[Hera] [HADES][TEST ] Testing IF ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4349206554] Expected: Should take false branch +[Hera] [HADES][TEST ] [KRELTSC: 4350063312] Running IF.nested: : TEST3 IF IF 1 ELSE 2 THEN ELSE 3 THEN ; +[Hera] [HADES][INFO ] [KRELTSC: 4364767722] L8[TABLE]: Config 4 → 5 regime=7 score=26214 L1=0 L2=0 L3=0 L +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 4365916254] Test passed +[Hera] [HADES][TEST ] Testing IF ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4367156598] Expected: Should handle nesting +[Hera] [HADES][TEST ] [KRELTSC: 4367985405] Running IF.no_else: : TEST4 IF 42 THEN ; -1 TEST4 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 4369554252] Test passed +[Hera] [HADES][TEST ] Testing IF ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4370812278] Expected: Should work without ELSE +[Hera] [HADES][TEST ] [KRELTSC: 4371689742] Running IF.empty_stack: IF +[Hera] [HADES][ERROR] [KRELTSC: 4372806123] IF: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 4373482701] Expected error occurred +[Hera] [HADES][TEST ] Testing IF ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4374871221] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4375770693] IF: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4376674869] Testing word: IF +[Hera] [HADES][TEST ] [KRELTSC: 4377359196] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4378113075] Running IF.true: : TEST1 IF 42 ELSE 24 THEN ; -1 TEST1 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 4379872560] Test passed +[Hera] [HADES][TEST ] Testing IF ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4381163892] Expected: Should take true branch +[Hera] [HADES][TEST ] [KRELTSC: 4382013531] Running IF.false: : TEST2 IF 42 ELSE 24 THEN ; 0 TEST2 . CR +[Hera] 24 +[Hera] [HADES][TEST ] [KRELTSC: 4383733431] Test passed +[Hera] [HADES][TEST ] Testing IF ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4385204712] Expected: Should take false branch +[Hera] [HADES][TEST ] [KRELTSC: 4386020541] Running IF.nested: : TEST3 IF IF 1 ELSE 2 THEN ELSE 3 THEN ; +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 4387799871] Test passed +[Hera] [HADES][TEST ] Testing IF ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4389102459] Expected: Should handle nesting +[Hera] [HADES][TEST ] [KRELTSC: 4390007391] Running IF.no_else: : TEST4 IF 42 THEN ; -1 TEST4 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 4391711310] Test passed +[Hera] [HADES][TEST ] Testing IF ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4393017552] Expected: Should work without ELSE +[Hera] [HADES][TEST ] [KRELTSC: 4393842096] Running IF.empty_stack: IF +[Hera] [HADES][ERROR] [KRELTSC: 4394652654] IF: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 4395382782] Expected error occurred +[Hera] [HADES][TEST ] Testing IF ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4396748202] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4397856561] IF: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4398849630] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 4399939362] Testing word: ELSE +[Hera] [HADES][TEST ] [KRELTSC: 4400645865] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4401433995] Running ELSE.alone: ELSE +[Hera] [HADES][ERROR] [KRELTSC: 4402367151] ELSE: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 4403050575] Expected error occurred +[Hera] [HADES][TEST ] Testing ELSE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4404471897] Expected: Should error outside IF +[Hera] [HADES][TEST ] [KRELTSC: 4405306773] Running ELSE.double: : BAD IF 1 ELSE ELSE 2 THEN ; +[Hera] [HADES][ERROR] [KRELTSC: 4406793258] ELSE: missing IF +[Hera] [HADES][TEST ] [KRELTSC: 4407462948] Expected error occurred +[Hera] [HADES][TEST ] Testing ELSE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4408868709] Expected: Should prevent double ELSE +[Hera] [HADES][TEST ] [KRELTSC: 4409975535] ELSE: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4410916902] Testing word: ELSE +[Hera] [HADES][TEST ] [KRELTSC: 4411631007] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4412365335] Running ELSE.alone: ELSE +[Hera] [HADES][ERROR] [KRELTSC: 4413269805] ELSE: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 4413972759] Expected error occurred +[Hera] [HADES][TEST ] Testing ELSE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4415396139] Expected: Should error outside IF +[Hera] [HADES][TEST ] [KRELTSC: 4416277656] Running ELSE.double: : BAD IF 1 ELSE ELSE 2 THEN ; +[Hera] [HADES][ERROR] [KRELTSC: 4417699944] ELSE: missing IF +[Hera] [HADES][TEST ] [KRELTSC: 4418369781] Expected error occurred +[Hera] [HADES][TEST ] Testing ELSE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4419778398] Expected: Should prevent double ELSE +[Hera] [HADES][TEST ] [KRELTSC: 4420654644] ELSE: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4421557728] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 4422951414] Testing word: THEN +[Hera] [HADES][TEST ] [KRELTSC: 4423679589] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4424463876] Running THEN.alone: THEN +[Hera] [HADES][ERROR] [KRELTSC: 4425591702] THEN: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 4426262904] Expected error occurred +[Hera] [HADES][TEST ] Testing THEN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4427680761] Expected: Should error outside IF +[Hera] [HADES][TEST ] [KRELTSC: 4428501021] Running THEN.extra: : BAD IF 1 THEN THEN ; +[Hera] [HADES][ERROR] [KRELTSC: 4429857117] CF: underflow +[Hera] [HADES][ERROR] [KRELTSC: 4430529390] THEN: unmatched +[Hera] [HADES][TEST ] [KRELTSC: 4431204666] Expected error occurred +[Hera] [HADES][TEST ] Testing THEN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4432639344] Expected: Should prevent extra THEN +[Hera] [HADES][TEST ] [KRELTSC: 4433582202] THEN: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4434477075] Testing word: THEN +[Hera] [HADES][TEST ] [KRELTSC: 4435406472] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4436132820] Running THEN.alone: THEN +[Hera] [HADES][ERROR] [KRELTSC: 4437074187] THEN: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 4437746439] Expected error occurred +[Hera] [HADES][TEST ] Testing THEN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4439154258] Expected: Should error outside IF +[Hera] [HADES][TEST ] [KRELTSC: 4439990877] Running THEN.extra: : BAD IF 1 THEN THEN ; +[Hera] [HADES][ERROR] [KRELTSC: 4441310475] CF: underflow +[Hera] [HADES][ERROR] [KRELTSC: 4441958577] THEN: unmatched +[Hera] [HADES][TEST ] [KRELTSC: 4442601261] Expected error occurred +[Hera] [HADES][TEST ] Testing THEN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4444041525] Expected: Should prevent extra THEN +[Hera] [HADES][TEST ] [KRELTSC: 4444856493] THEN: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4445799393] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 4446801387] Testing word: BEGIN +[Hera] [HADES][TEST ] [KRELTSC: 4447749537] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4448504991] Running BEGIN.until: : TEST5 0 BEGIN 1+ DUP 5 = UNTIL ; TEST5 +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 4450855080] Test passed +[Hera] [HADES][TEST ] Testing BEGIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4452202881] Expected: Should loop until true +[Hera] [HADES][TEST ] [KRELTSC: 4453062726] Running BEGIN.while: : TEST6 0 BEGIN DUP 5 < WHILE 1+ REPEAT +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 4455426675] Test passed +[Hera] [HADES][TEST ] Testing BEGIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4456753434] Expected: Should loop while true +[Hera] [HADES][TEST ] [KRELTSC: 4457613447] Running BEGIN.alone: BEGIN +[Hera] [HADES][ERROR] [KRELTSC: 4458463023] BEGIN: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 4459180152] Expected error occurred +[Hera] [HADES][TEST ] Testing BEGIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4460838774] Expected: Should error outside definition +[Hera] [HADES][TEST ] [KRELTSC: 4461739065] BEGIN: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4462711008] Testing word: BEGIN +[Hera] [HADES][TEST ] [KRELTSC: 4463420199] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4464186867] Running BEGIN.until: : TEST5 0 BEGIN 1+ DUP 5 = UNTIL ; TEST5 +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 4466305347] Test passed +[Hera] [HADES][TEST ] Testing BEGIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4467637314] Expected: Should loop until true +[Hera] [HADES][TEST ] [KRELTSC: 4468504404] Running BEGIN.while: : TEST6 0 BEGIN DUP 5 < WHILE 1+ REPEAT +[Hera] [HADES][INFO ] [KRELTSC: 4470385584] L8[TABLE]: Config 5 → 6 regime=7 score=26214 L1=0 L2=0 L3=0 L +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 4471931457] Test passed +[Hera] [HADES][TEST ] Testing BEGIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4473540603] Expected: Should loop while true +[Hera] [HADES][TEST ] [KRELTSC: 4474361283] Running BEGIN.alone: BEGIN +[Hera] [HADES][ERROR] [KRELTSC: 4475158653] BEGIN: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 4475879646] Expected error occurred +[Hera] [HADES][TEST ] Testing BEGIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4477289544] Expected: Should error outside definition +[Hera] [HADES][TEST ] [KRELTSC: 4478196534] BEGIN: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4479133512] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 4480153314] Testing word: UNTIL +[Hera] [HADES][TEST ] [KRELTSC: 4480869918] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4481616027] Running UNTIL.basic: : TEST8 BEGIN DUP 1- DUP 0= UNTIL ; 5 TE +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 4483753113] Test passed +[Hera] [HADES][TEST ] Testing UNTIL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4485296361] Expected: Should count down +[Hera] [HADES][TEST ] [KRELTSC: 4486174707] Running UNTIL.immediate: : TEST9 BEGIN 1 UNTIL ; IMMEDIATE +[Hera] [HADES][TEST ] [KRELTSC: 4487685426] Test passed +[Hera] [HADES][TEST ] Testing UNTIL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4488980937] Expected: Should be immediate +[Hera] [HADES][TEST ] [KRELTSC: 4489845549] Running UNTIL.no_begin: UNTIL +[Hera] [HADES][ERROR] [KRELTSC: 4490805270] UNTIL: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 4491582333] Expected error occurred +[Hera] [HADES][TEST ] Testing UNTIL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4492991412] Expected: Should error without BEGIN +[Hera] [HADES][TEST ] [KRELTSC: 4493878011] UNTIL: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4494795858] Testing word: UNTIL +[Hera] [HADES][TEST ] [KRELTSC: 4495512210] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4496285598] Running UNTIL.basic: : TEST8 BEGIN DUP 1- DUP 0= UNTIL ; 5 TE +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 4498478271] Test passed +[Hera] [HADES][TEST ] Testing UNTIL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4499777394] Expected: Should count down +[Hera] [HADES][TEST ] [KRELTSC: 4500597801] Running UNTIL.immediate: : TEST9 BEGIN 1 UNTIL ; IMMEDIATE +[Hera] [HADES][TEST ] [KRELTSC: 4501992453] Test passed +[Hera] [HADES][TEST ] Testing UNTIL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4503309489] Expected: Should be immediate +[Hera] [HADES][TEST ] [KRELTSC: 4504132122] Running UNTIL.no_begin: UNTIL +[Hera] [HADES][ERROR] [KRELTSC: 4505038377] UNTIL: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 4505726211] Expected error occurred +[Hera] [HADES][TEST ] Testing UNTIL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4507216182] Expected: Should error without BEGIN +[Hera] [HADES][TEST ] [KRELTSC: 4508070903] UNTIL: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4509009981] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 4510033458] Testing word: WHILE +[Hera] [HADES][TEST ] [KRELTSC: 4510988265] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4511735340] Running WHILE.basic: : TEST10 BEGIN DUP 5 < WHILE 1+ REPEAT ; +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 4513857957] Test passed +[Hera] [HADES][TEST ] Testing WHILE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4515169974] Expected: Should count up +[Hera] [HADES][TEST ] [KRELTSC: 4515929145] Running WHILE.zero_times: : TEST11 BEGIN DUP 0< WHILE 1+ REPE +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 4517785125] Test passed +[Hera] [HADES][TEST ] Testing WHILE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4519170495] Expected: Should handle zero iterations +[Hera] [HADES][TEST ] [KRELTSC: 4520110938] Running WHILE.no_begin: WHILE +[Hera] [HADES][ERROR] [KRELTSC: 4521043065] WHILE: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 4521742953] Expected error occurred +[Hera] [HADES][TEST ] Testing WHILE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4523427174] Expected: Should error without BEGIN +[Hera] [HADES][TEST ] [KRELTSC: 4524302286] WHILE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4525262826] Testing word: WHILE +[Hera] [HADES][TEST ] [KRELTSC: 4525978380] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4526711595] Running WHILE.basic: : TEST10 BEGIN DUP 5 < WHILE 1+ REPEAT ; +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 4528834695] Test passed +[Hera] [HADES][TEST ] Testing WHILE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4530151122] Expected: Should count up +[Hera] [HADES][TEST ] [KRELTSC: 4530948345] Running WHILE.zero_times: : TEST11 BEGIN DUP 0< WHILE 1+ REPE +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 4532664864] Test passed +[Hera] [HADES][TEST ] Testing WHILE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4533971673] Expected: Should handle zero iterations +[Hera] [HADES][TEST ] [KRELTSC: 4534873203] Running WHILE.no_begin: WHILE +[Hera] [HADES][ERROR] [KRELTSC: 4535925240] WHILE: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 4536632856] Expected error occurred +[Hera] [HADES][TEST ] Testing WHILE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4538034816] Expected: Should error without BEGIN +[Hera] [HADES][TEST ] [KRELTSC: 4538898525] WHILE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4539784431] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 4540838799] Testing word: REPEAT +[Hera] [HADES][TEST ] [KRELTSC: 4541540493] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4542281898] Running REPEAT.basic: : TEST12 BEGIN DUP 5 < WHILE 1+ REPEAT +[Hera] [HADES][INFO ] [KRELTSC: 4543870170] L8[TABLE]: Config 6 → 7 regime=7 score=26214 L1=0 L2=0 L3=0 L +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 4545430533] Test passed +[Hera] [HADES][TEST ] Testing REPEAT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4546751139] Expected: Should terminate loop +[Hera] [HADES][TEST ] [KRELTSC: 4547569551] Running REPEAT.no_while: REPEAT +[Hera] [HADES][ERROR] [KRELTSC: 4548834129] REPEAT: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 4549524777] Expected error occurred +[Hera] [HADES][TEST ] Testing REPEAT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4550981379] Expected: Should error without WHILE +[Hera] [HADES][TEST ] [KRELTSC: 4551810522] REPEAT: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4552731288] Testing word: REPEAT +[Hera] [HADES][TEST ] [KRELTSC: 4553462298] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4554187260] Running REPEAT.basic: : TEST12 BEGIN DUP 5 < WHILE 1+ REPEAT +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 4556109684] Test passed +[Hera] [HADES][TEST ] Testing REPEAT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4557439635] Expected: Should terminate loop +[Hera] [HADES][TEST ] [KRELTSC: 4558336944] Running REPEAT.no_while: REPEAT +[Hera] [HADES][ERROR] [KRELTSC: 4559184609] REPEAT: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 4559903901] Expected error occurred +[Hera] [HADES][TEST ] Testing REPEAT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4561567416] Expected: Should error without WHILE +[Hera] [HADES][TEST ] [KRELTSC: 4562539359] REPEAT: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4563458235] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 4564466403] Testing word: DO +[Hera] [HADES][TEST ] [KRELTSC: 4565188488] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4565929494] Running DO.basic: : TEST13 5 0 DO I . LOOP ; TEST13 CR +[Hera] 0 1 2 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 4568583453] Test passed +[Hera] [HADES][TEST ] Testing DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4569880959] Expected: Should count 0 to 4 +[Hera] [HADES][TEST ] [KRELTSC: 4570724529] Running DO.negative: : TEST14 -1 -5 DO I . LOOP ; TEST14 CR +[Hera] -5 -4 -3 -2 +[Hera] [HADES][TEST ] [KRELTSC: 4572530067] Test passed +[Hera] [HADES][TEST ] Testing DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4573986396] Expected: Should handle negative +[Hera] [HADES][TEST ] [KRELTSC: 4574798046] Running DO.empty: : TEST15 0 0 DO LOOP ; +[Hera] [HADES][TEST ] [KRELTSC: 4576106073] Test passed +[Hera] [HADES][TEST ] Testing DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4577398770] Expected: Should handle empty range +[Hera] [HADES][TEST ] [KRELTSC: 4578269661] Running DO.nested: : TEST16 3 0 DO 3 0 DO J I + . LOOP LOOP ; +[Hera] 0 1 2 1 2 3 2 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 4580448705] Test passed +[Hera] [HADES][TEST ] Testing DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4581760512] Expected: Should handle nesting +[Hera] [HADES][TEST ] [KRELTSC: 4582557483] DO: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4583450067] Testing word: DO +[Hera] [HADES][TEST ] [KRELTSC: 4584140337] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4584869142] Running DO.basic: : TEST13 5 0 DO I . LOOP ; TEST13 CR +[Hera] 0 1 2 3 [HADES][INFO ] [KRELTSC: 4587138885] L8[TABLE]: Config 7 → 8 regime=7 score=6553 L1=0 L2=0 L3=0 L4 +[Hera] 4 +[Hera] [HADES][TEST ] [KRELTSC: 4588323033] Test passed +[Hera] [HADES][TEST ] Testing DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4589635701] Expected: Should count 0 to 4 +[Hera] [HADES][TEST ] [KRELTSC: 4590502581] Running DO.negative: : TEST14 -1 -5 DO I . LOOP ; TEST14 CR +[Hera] -5 -4 -3 -2 +[Hera] [HADES][TEST ] [KRELTSC: 4592436618] Test passed +[Hera] [HADES][TEST ] Testing DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4593711045] Expected: Should handle negative +[Hera] [HADES][TEST ] [KRELTSC: 4594560957] Running DO.empty: : TEST15 0 0 DO LOOP ; +[Hera] [HADES][TEST ] [KRELTSC: 4595796030] Test passed +[Hera] [HADES][TEST ] Testing DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4597073691] Expected: Should handle empty range +[Hera] [HADES][TEST ] [KRELTSC: 4597924443] Running DO.nested: : TEST16 3 0 DO 3 0 DO J I + . LOOP LOOP ; +[Hera] 0 1 2 1 2 3 2 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 4600355256] Test passed +[Hera] [HADES][TEST ] Testing DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4601665362] Expected: Should handle nesting +[Hera] [HADES][TEST ] [KRELTSC: 4602525501] DO: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4603430895] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 4604494818] Testing word: ?DO +[Hera] [HADES][TEST ] [KRELTSC: 4605215916] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4605972840] Running ?DO.basic: : TEST17 5 0 ?DO I . LOOP ; TEST17 CR +[Hera] 0 1 2 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 4608314403] Test passed +[Hera] [HADES][TEST ] Testing ?DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4609666614] Expected: Should count 0 to 4 +[Hera] [HADES][TEST ] [KRELTSC: 4610483409] Running ?DO.skip: : TEST18 1 1 ?DO I . LOOP ; +[Hera] [HADES][TEST ] [KRELTSC: 4612059270] Test passed +[Hera] [HADES][TEST ] Testing ?DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4613377356] Expected: Should skip when equal +[Hera] [HADES][TEST ] [KRELTSC: 4614213156] Running ?DO.nested: : TEST19 3 0 ?DO 3 I ?DO J I + . LOOP LOO +[Hera] 0 1 2 2 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 4616206707] Test passed +[Hera] [HADES][TEST ] Testing ?DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4617514902] Expected: Should handle nesting +[Hera] [HADES][TEST ] [KRELTSC: 4618346397] ?DO: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4619270061] Testing word: ?DO +[Hera] [HADES][TEST ] [KRELTSC: 4620058170] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4620817719] Running ?DO.basic: : TEST17 5 0 ?DO I . LOOP ; TEST17 CR +[Hera] 0 1 2 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 4622649276] Test passed +[Hera] [HADES][TEST ] Testing ?DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4624229925] Expected: Should count 0 to 4 +[Hera] [HADES][TEST ] [KRELTSC: 4625065683] Running ?DO.skip: : TEST18 1 1 ?DO I . LOOP ; +[Hera] [HADES][TEST ] [KRELTSC: 4626396621] Test passed +[Hera] [HADES][TEST ] Testing ?DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4627687008] Expected: Should skip when equal +[Hera] [HADES][TEST ] [KRELTSC: 4628524677] Running ?DO.nested: : TEST19 3 0 ?DO 3 I ?DO J I + . LOOP LOO +[Hera] [HADES][INFO ] [KRELTSC: 4630053540] L8[TABLE]: Config 8 → 9 regime=7 score=6553 L1=0 L2=0 L3=0 L4 +[Hera] 0 1 2 2 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 4631791983] Test passed +[Hera] [HADES][TEST ] Testing ?DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4633079367] Expected: Should handle nesting +[Hera] [HADES][TEST ] [KRELTSC: 4633953366] ?DO: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4634856366] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 4636034487] Testing word: LOOP +[Hera] [HADES][TEST ] [KRELTSC: 4636842399] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4637618832] Running LOOP.basic: : TEST20 5 0 DO I . LOOP ; TEST20 CR +[Hera] 0 1 2 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 4639594617] Test passed +[Hera] [HADES][TEST ] Testing LOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4640935824] Expected: Should increment by 1 +[Hera] [HADES][TEST ] [KRELTSC: 4641773598] Running LOOP.no_do: LOOP +[Hera] [HADES][ERROR] [KRELTSC: 4642712172] LOOP: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 4643399355] Expected error occurred +[Hera] [HADES][TEST ] Testing LOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4644820782] Expected: Should error without DO +[Hera] [HADES][TEST ] [KRELTSC: 4645691043] LOOP: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4646639088] Testing word: LOOP +[Hera] [HADES][TEST ] [KRELTSC: 4647338661] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4648128912] Running LOOP.basic: : TEST20 5 0 DO I . LOOP ; TEST20 CR +[Hera] 0 1 2 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 4650294894] Test passed +[Hera] [HADES][TEST ] Testing LOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4651695405] Expected: Should increment by 1 +[Hera] [HADES][TEST ] [KRELTSC: 4652527404] Running LOOP.no_do: LOOP +[Hera] [HADES][ERROR] [KRELTSC: 4653322737] LOOP: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 4654019517] Expected error occurred +[Hera] [HADES][TEST ] Testing LOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4655405601] Expected: Should error without DO +[Hera] [HADES][TEST ] [KRELTSC: 4656255114] LOOP: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4657194024] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 4658201919] Testing word: +LOOP +[Hera] [HADES][TEST ] [KRELTSC: 4658952270] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4659721605] Running +LOOP.basic: : TEST21 10 0 DO I . 2 +LOOP ; TEST21 CR +[Hera] 0 2 4 6 8 +[Hera] [HADES][TEST ] [KRELTSC: 4662263088] Test passed +[Hera] [HADES][TEST ] Testing +LOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4663594677] Expected: Should count by 2 +[Hera] [HADES][TEST ] [KRELTSC: 4664356704] Running +LOOP.negative: : TEST22 0 10 DO I . -1 +LOOP ; TEST2 +[Hera] 10 9 8 7 6 5 4 3 2 1 0 +[Hera] [HADES][TEST ] [KRELTSC: 4666418589] Test passed +[Hera] [HADES][TEST ] Testing +LOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4667742618] Expected: Should count down +[Hera] [HADES][TEST ] [KRELTSC: 4668535977] Running +LOOP.variable: : TEST23 10 0 DO I . DUP +LOOP ; 3 TE +[Hera] 0 3 6 9 +[Hera] [HADES][TEST ] [KRELTSC: 4670446809] Test passed +[Hera] [HADES][TEST ] Testing +LOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4671774114] Expected: Should use stack value +[Hera] [HADES][TEST ] [KRELTSC: 4672614597] +LOOP: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4673497584] Testing word: +LOOP +[Hera] [HADES][TEST ] [KRELTSC: 4674393213] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4675149612] Running +LOOP.basic: : TEST21 10 0 DO I . 2 +LOOP ; TEST21 CR +[Hera] [HADES][INFO ] [KRELTSC: 4676925624] L8[TABLE]: Config 9 → 10 regime=7 score=6553 L1=0 L2=0 L3=0 L +[Hera] 0 2 4 6 8 +[Hera] [HADES][TEST ] [KRELTSC: 4678528533] Test passed +[Hera] [HADES][TEST ] Testing +LOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4679841663] Expected: Should count by 2 +[Hera] [HADES][TEST ] [KRELTSC: 4680701865] Running +LOOP.negative: : TEST22 0 10 DO I . -1 +LOOP ; TEST2 +[Hera] 10 9 8 7 6 5 4 3 2 1 0 +[Hera] [HADES][TEST ] [KRELTSC: 4682888154] Test passed +[Hera] [HADES][TEST ] Testing +LOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4684211637] Expected: Should count down +[Hera] [HADES][TEST ] [KRELTSC: 4685016966] Running +LOOP.variable: : TEST23 10 0 DO I . DUP +LOOP ; 3 TE +[Hera] 0 3 6 9 +[Hera] [HADES][TEST ] [KRELTSC: 4686980172] Test passed +[Hera] [HADES][TEST ] Testing +LOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4688313231] Expected: Should use stack value +[Hera] [HADES][TEST ] [KRELTSC: 4689160812] +LOOP: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4690069272] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 4691125152] Testing word: I +[Hera] [HADES][TEST ] [KRELTSC: 4691825229] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4692597987] Running I.basic: : TI 4 0 DO I . LOOP CR ; TI +[Hera] 0 1 2 3 +[Hera] [HADES][TEST ] [KRELTSC: 4694338992] Test passed +[Hera] [HADES][TEST ] Testing I ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4695639795] Expected: Should print: 0 1 2 3 +[Hera] [HADES][TEST ] [KRELTSC: 4696524231] Running I.single: : TI1 1 0 DO I . LOOP CR ; TI1 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 4698246000] Test passed +[Hera] [HADES][TEST ] Testing I ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4699779462] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 4700598357] Running I.offset: : TI2 5 3 DO I . LOOP CR ; TI2 +[Hera] 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 4702322961] Test passed +[Hera] [HADES][TEST ] Testing I ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4703609379] Expected: Should print: 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 4704406707] Running I.in_expr: : TI3 3 0 DO I 2 * . LOOP CR ; TI3 +[Hera] 0 2 4 +[Hera] [HADES][TEST ] [KRELTSC: 4706242464] Test passed +[Hera] [HADES][TEST ] Testing I ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4707613071] Expected: Should print: 0 2 4 +[Hera] [HADES][TEST ] [KRELTSC: 4708440765] I: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4709339418] Testing word: I +[Hera] [HADES][TEST ] [KRELTSC: 4710032964] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4710815634] Running I.basic: : TI 4 0 DO I . LOOP CR ; TI +[Hera] 0 1 2 3 +[Hera] [HADES][TEST ] [KRELTSC: 4713040710] Test passed +[Hera] [HADES][TEST ] Testing I ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4714309194] Expected: Should print: 0 1 2 3 +[Hera] [HADES][TEST ] [KRELTSC: 4715166813] Running I.single: : TI1 1 0 DO I . LOOP CR ; TI1 +[Hera] 0 +[Hera] [HADES][INFO ] [KRELTSC: 4716971196] L8[TABLE]: Config 10 → 11 regime=7 score=6553 L1=0 L2=0 L3=0 +[Hera] [HADES][TEST ] [KRELTSC: 4718039067] Test passed +[Hera] [HADES][TEST ] Testing I ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4719315762] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 4720082913] Running I.offset: : TI2 5 3 DO I . LOOP CR ; TI2 +[Hera] 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 4721766273] Test passed +[Hera] [HADES][TEST ] Testing I ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4723045950] Expected: Should print: 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 4723848360] Running I.in_expr: : TI3 3 0 DO I 2 * . LOOP CR ; TI3 +[Hera] 0 2 4 +[Hera] [HADES][TEST ] [KRELTSC: 4725863226] Test passed +[Hera] [HADES][TEST ] Testing I ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4727105019] Expected: Should print: 0 2 4 +[Hera] [HADES][TEST ] [KRELTSC: 4727915997] I: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4728783801] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 4729853016] Testing word: J +[Hera] [HADES][TEST ] [KRELTSC: 4730548284] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4731259512] Running J.basic: : TJ 2 0 DO 3 0 DO J . LOOP LOOP CR ; TJ +[Hera] 0 0 0 1 1 1 +[Hera] [HADES][TEST ] [KRELTSC: 4733278200] Test passed +[Hera] [HADES][TEST ] Testing J ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4734575328] Expected: Should print: 0 0 0 1 1 1 +[Hera] [HADES][TEST ] [KRELTSC: 4735493637] Running J.paired: : TJ2 2 0 DO 2 0 DO J I + . LOOP LOOP CR ; +[Hera] 0 1 1 2 +[Hera] [HADES][TEST ] [KRELTSC: 4737596010] Test passed +[Hera] [HADES][TEST ] Testing J ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4738844943] Expected: Should print: 0 1 1 2 +[Hera] [HADES][TEST ] [KRELTSC: 4739671755] J: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4740536325] Testing word: J +[Hera] [HADES][TEST ] [KRELTSC: 4741199757] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4741957878] Running J.basic: : TJ 2 0 DO 3 0 DO J . LOOP LOOP CR ; TJ +[Hera] 0 0 0 1 1 1 +[Hera] [HADES][TEST ] [KRELTSC: 4743950337] Test passed +[Hera] [HADES][TEST ] Testing J ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4745233878] Expected: Should print: 0 0 0 1 1 1 +[Hera] [HADES][TEST ] [KRELTSC: 4746075264] Running J.paired: : TJ2 2 0 DO 2 0 DO J I + . LOOP LOOP CR ; +[Hera] 0 1 1 2 +[Hera] [HADES][TEST ] [KRELTSC: 4747977864] Test passed +[Hera] [HADES][TEST ] Testing J ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4749398556] Expected: Should print: 0 1 1 2 +[Hera] [HADES][TEST ] [KRELTSC: 4750249665] J: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4751101824] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 4752169905] Testing word: EXIT +[Hera] [HADES][TEST ] [KRELTSC: 4752895833] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4753655256] Running EXIT.early_return: : TEX 5 EXIT 99 ; TEX . CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 4755325911] Test passed +[Hera] [HADES][TEST ] Testing EXIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4756651473] Expected: Should print: 5 +[Hera] [HADES][TEST ] [KRELTSC: 4757438700] Running EXIT.cond_exit_pos: : TEX2 DUP 0> IF EXIT THEN NEGATE +[Hera] [HADES][INFO ] [KRELTSC: 4759010424] L8[TABLE]: Config 11 → 12 regime=7 score=6553 L1=0 L2=0 L3=0 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 4760413266] Test passed +[Hera] [HADES][TEST ] Testing EXIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4761851850] Expected: Should print: 3 +[Hera] [HADES][TEST ] [KRELTSC: 4762764762] Running EXIT.cond_exit_neg: : TEX2 DUP 0> IF EXIT THEN NEGATE +[Hera] 4 +[Hera] [HADES][TEST ] [KRELTSC: 4764525696] Test passed +[Hera] [HADES][TEST ] Testing EXIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4765858671] Expected: Should print: 4 +[Hera] [HADES][TEST ] [KRELTSC: 4766639052] Running EXIT.no_skipped: : TEX3 1 2 EXIT 3 ; TEX3 . . CR +[Hera] 2 1 +[Hera] [HADES][TEST ] [KRELTSC: 4768323063] Test passed +[Hera] [HADES][TEST ] Testing EXIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4769609964] Expected: Should print: 2 1 +[Hera] [HADES][TEST ] [KRELTSC: 4770424407] EXIT: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4771333413] Testing word: EXIT +[Hera] [HADES][TEST ] [KRELTSC: 4772061273] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4772845980] Running EXIT.early_return: : TEX 5 EXIT 99 ; TEX . CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 4774666953] Test passed +[Hera] [HADES][TEST ] Testing EXIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4776015069] Expected: Should print: 5 +[Hera] [HADES][TEST ] [KRELTSC: 4776814161] Running EXIT.cond_exit_pos: : TEX2 DUP 0> IF EXIT THEN NEGATE +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 4778608086] Test passed +[Hera] [HADES][TEST ] Testing EXIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4779916659] Expected: Should print: 3 +[Hera] [HADES][TEST ] [KRELTSC: 4780714890] Running EXIT.cond_exit_neg: : TEX2 DUP 0> IF EXIT THEN NEGATE +[Hera] 4 +[Hera] [HADES][TEST ] [KRELTSC: 4782437058] Test passed +[Hera] [HADES][TEST ] Testing EXIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4783747605] Expected: Should print: 4 +[Hera] [HADES][TEST ] [KRELTSC: 4784579184] Running EXIT.no_skipped: : TEX3 1 2 EXIT 3 ; TEX3 . . CR +[Hera] 2 1 +[Hera] [HADES][TEST ] [KRELTSC: 4786386486] Test passed +[Hera] [HADES][TEST ] Testing EXIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4787967240] Expected: Should print: 2 1 +[Hera] [HADES][TEST ] [KRELTSC: 4788797517] EXIT: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4789737624] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 4790801694] Testing word: LEAVE +[Hera] [HADES][TEST ] [KRELTSC: 4791557001] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4792381104] Running LEAVE.basic: : TLV 0 5 0 DO I 3 = IF LEAVE THEN 1+ LO +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 4794940752] Test passed +[Hera] [HADES][TEST ] Testing LEAVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4796307600] Expected: Should print: 3 +[Hera] [HADES][TEST ] [KRELTSC: 4797095541] Running LEAVE.at_start: : TLV2 0 5 0 DO LEAVE 1+ LOOP ; TLV2 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 4798971996] Test passed +[Hera] [HADES][TEST ] Testing LEAVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4800575010] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 4801383342] Running LEAVE.qdloop: : TLV3 0 5 0 ?DO I 2 = IF LEAVE THEN 1+ +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 4803317085] Test passed +[Hera] [HADES][TEST ] Testing LEAVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4804644789] Expected: Should print: 2 +[Hera] [HADES][TEST ] [KRELTSC: 4805424645] LEAVE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4806339048] Testing word: LEAVE +[Hera] [HADES][TEST ] [KRELTSC: 4807045110] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4807803147] Running LEAVE.basic: : TLV 0 5 0 DO I 3 = IF LEAVE THEN 1+ LO +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 4809783258] Test passed +[Hera] [HADES][TEST ] Testing LEAVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4811095653] Expected: Should print: 3 +[Hera] [HADES][TEST ] [KRELTSC: 4811879016] Running LEAVE.at_start: : TLV2 0 5 0 DO LEAVE 1+ LOOP ; TLV2 +[Hera] [HADES][INFO ] [KRELTSC: 4813954614] L8[TABLE]: Config 12 → 13 regime=7 score=6553 L1=0 L2=0 L3=0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 4815344394] Test passed +[Hera] [HADES][TEST ] Testing LEAVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4816621761] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 4817410542] Running LEAVE.qdloop: : TLV3 0 5 0 ?DO I 2 = IF LEAVE THEN 1+ +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 4819343424] Test passed +[Hera] [HADES][TEST ] Testing LEAVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4820677113] Expected: Should print: 2 +[Hera] [HADES][TEST ] [KRELTSC: 4821478620] LEAVE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4822384938] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 4823427567] Testing word: UNLOOP +[Hera] [HADES][TEST ] [KRELTSC: 4824134049] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4825173633] Running UNLOOP.early_exit: : TUL 5 0 DO I 2 = IF UNLOOP 42 EX +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 4827338187] Test passed +[Hera] [HADES][TEST ] Testing UNLOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4828615386] Expected: Should print: 42 +[Hera] [HADES][TEST ] [KRELTSC: 4829430249] Running UNLOOP.full_loop: : TUL2 5 0 DO I 9 = IF UNLOOP 77 EX +[Hera] 99 +[Hera] [HADES][TEST ] [KRELTSC: 4831525629] Test passed +[Hera] [HADES][TEST ] Testing UNLOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4832846256] Expected: Should print: 99 +[Hera] [HADES][TEST ] [KRELTSC: 4833662442] UNLOOP: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4834564056] Testing word: UNLOOP +[Hera] [HADES][TEST ] [KRELTSC: 4835275116] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4835974311] Running UNLOOP.early_exit: : TUL 5 0 DO I 2 = IF UNLOOP 42 EX +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 4838201802] Test passed +[Hera] [HADES][TEST ] Testing UNLOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4839508191] Expected: Should print: 42 +[Hera] [HADES][TEST ] [KRELTSC: 4840311483] Running UNLOOP.full_loop: : TUL2 5 0 DO I 9 = IF UNLOOP 77 EX +[Hera] 99 +[Hera] [HADES][TEST ] [KRELTSC: 4842211122] Test passed +[Hera] [HADES][TEST ] Testing UNLOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4843512807] Expected: Should print: 99 +[Hera] [HADES][TEST ] [KRELTSC: 4844282268] UNLOOP: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4845188208] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 4846173969] Testing word: AGAIN +[Hera] [HADES][TEST ] [KRELTSC: 4846866591] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4847599365] Running AGAIN.basic: : TAG 0 BEGIN 1+ DUP 3 = IF EXIT THEN AG +[Hera] 3 [HADES][INFO ] [KRELTSC: 4850202756] L8[TABLE]: Config 13 → 14 regime=7 score=6553 L1=0 L2=0 L3=0 + +[Hera] [HADES][TEST ] [KRELTSC: 4851146790] Test passed +[Hera] [HADES][TEST ] Testing AGAIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4852474515] Expected: Should print: 3 +[Hera] [HADES][TEST ] [KRELTSC: 4853280621] Running AGAIN.countdown: : CD 10 BEGIN 1- DUP 0= IF EXIT THEN +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 4855284252] Test passed +[Hera] [HADES][TEST ] Testing AGAIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4856633670] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 4857414366] AGAIN: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4858348404] Testing word: AGAIN +[Hera] [HADES][TEST ] [KRELTSC: 4859028489] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4859763783] Running AGAIN.basic: : TAG 0 BEGIN 1+ DUP 3 = IF EXIT THEN AG +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 4861676253] Test passed +[Hera] [HADES][TEST ] Testing AGAIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4863233613] Expected: Should print: 3 +[Hera] [HADES][TEST ] [KRELTSC: 4863974682] Running AGAIN.countdown: : CD 10 BEGIN 1- DUP 0= IF EXIT THEN +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 4866015861] Test passed +[Hera] [HADES][TEST ] Testing AGAIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4867327311] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 4868089800] AGAIN: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4868967747] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 4869999666] Testing word: CASE +[Hera] [HADES][TEST ] [KRELTSC: 4870694367] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4871456961] Running CASE.match_1: : TC CASE 1 OF 10 ENDOF 2 OF 20 ENDOF 9 +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 4874540265] Test passed +[Hera] [HADES][TEST ] Testing CASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4876088721] Expected: Should print: 10 +[Hera] [HADES][TEST ] [KRELTSC: 4876862550] Running CASE.match_2: : TC CASE 1 OF 10 ENDOF 2 OF 20 ENDOF 9 +[Hera] 20 +[Hera] [HADES][TEST ] [KRELTSC: 4879081368] Test passed +[Hera] [HADES][TEST ] Testing CASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4880350839] Expected: Should print: 20 +[Hera] [HADES][TEST ] [KRELTSC: 4881139053] Running CASE.default: : TC CASE 1 OF 10 ENDOF 2 OF 20 ENDOF 9 +[Hera] 99 +[Hera] [HADES][INFO ] [KRELTSC: 4883755926] L8[TABLE]: Config 14 → 0 regime=6 score=26214 L1=0 L2=0 L3=0 +[Hera] [HADES][TEST ] [KRELTSC: 4884808131] Test passed +[Hera] [HADES][TEST ] Testing CASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4886133609] Expected: Should print: 99 +[Hera] [HADES][TEST ] [KRELTSC: 4886917665] Running CASE.zero_case: : TC CASE 0 OF 88 ENDOF 1 OF 77 ENDOF +[Hera] 88 +[Hera] [HADES][TEST ] [KRELTSC: 4889336298] Test passed +[Hera] [HADES][TEST ] Testing CASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4890550329] Expected: Should print: 88 +[Hera] [HADES][TEST ] [KRELTSC: 4891327371] Running CASE.neg_case: : TC CASE -1 OF 55 ENDOF 44 SWAP ENDCA +[Hera] 55 +[Hera] [HADES][TEST ] [KRELTSC: 4893244839] Test passed +[Hera] [HADES][TEST ] Testing CASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4894567839] Expected: Should print: 55 +[Hera] [HADES][TEST ] [KRELTSC: 4895311008] CASE: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4896163293] Testing word: CASE +[Hera] [HADES][TEST ] [KRELTSC: 4896834852] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4897579050] Running CASE.match_1: : TC CASE 1 OF 10 ENDOF 2 OF 20 ENDOF 9 +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 4899702885] Test passed +[Hera] [HADES][TEST ] Testing CASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4901354535] Expected: Should print: 10 +[Hera] [HADES][TEST ] [KRELTSC: 4902156840] Running CASE.match_2: : TC CASE 1 OF 10 ENDOF 2 OF 20 ENDOF 9 +[Hera] 20 +[Hera] [HADES][TEST ] [KRELTSC: 4904263623] Test passed +[Hera] [HADES][TEST ] Testing CASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4905544707] Expected: Should print: 20 +[Hera] [HADES][TEST ] [KRELTSC: 4906327629] Running CASE.default: : TC CASE 1 OF 10 ENDOF 2 OF 20 ENDOF 9 +[Hera] 99 +[Hera] [HADES][TEST ] [KRELTSC: 4908460242] Test passed +[Hera] [HADES][TEST ] Testing CASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4909737000] Expected: Should print: 99 +[Hera] [HADES][TEST ] [KRELTSC: 4910541027] Running CASE.zero_case: : TC CASE 0 OF 88 ENDOF 1 OF 77 ENDOF +[Hera] 88 +[Hera] [HADES][TEST ] [KRELTSC: 4912660326] Test passed +[Hera] [HADES][TEST ] Testing CASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4913998803] Expected: Should print: 88 +[Hera] [HADES][TEST ] [KRELTSC: 4914801486] Running CASE.neg_case: : TC CASE -1 OF 55 ENDOF 44 SWAP ENDCA +[Hera] 55 +[Hera] [HADES][TEST ] [KRELTSC: 4916758308] Test passed +[Hera] [HADES][TEST ] Testing CASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4918018812] Expected: Should print: 55 +[Hera] [HADES][TEST ] [KRELTSC: 4918845540] CASE: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4919824392] === Control Words Summary: 0 passed, 0 failed, 0 skipped, 0 err +[Hera] [HADES][INFO ] [KRELTSC: 4920861057] +[Hera] === Testing Module: StarForth Words === +[Hera] [HADES][INFO ] [KRELTSC: 4921966371] Running StarForth Words Tests (Module 17: StarForth Extensions) +[Hera] [HADES][TEST ] [KRELTSC: 4923119586] ▶ Testing module: v3/src/test_runner/modules/starforth_words_ +[Hera] [HADES][TEST ] [KRELTSC: 4924115595] Testing word: ENTROPY@ +[Hera] [HADES][TEST ] [KRELTSC: 4924835559] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4925735136] Running ENTROPY@.after_execution: : TESTWORD 1 1 + DROP ; TES +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 4927725012] Test passed +[Hera] [HADES][TEST ] Testing ENTROPY@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4929063951] Expected: Should show execution count > 0 +[Hera] [HADES][TEST ] [KRELTSC: 4930027263] Running ENTROPY@.zero_initial: : NEWWORD ; ' NEWWORD ENTROPY@ +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 4931728788] Test passed +[Hera] [HADES][TEST ] Testing ENTROPY@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4933077807] Expected: Should show 0 for unused word +[Hera] [HADES][TEST ] [KRELTSC: 4933964217] Running ENTROPY@.multiple_calls: : ENTTEST 1 DROP ; ENTTEST E +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 4935721140] Test passed +[Hera] [HADES][TEST ] Testing ENTROPY@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4937041872] Expected: Should increment with each call +[Hera] [HADES][TEST ] [KRELTSC: 4938192000] Running ENTROPY@.null_addr: 0 ENTROPY@ +[Hera] [HADES][ERROR] [KRELTSC: 4939102119] ENTROPY@: null dictionary entry +[Hera] [HADES][TEST ] [KRELTSC: 4939911648] Expected error occurred +[Hera] [HADES][TEST ] Testing ENTROPY@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4941319005] Expected: Should handle null address +[Hera] [HADES][TEST ] [KRELTSC: 4942167993] Running ENTROPY@.empty_stack: ENTROPY@ +[Hera] [HADES][ERROR] [KRELTSC: 4943070384] ENTROPY@: data stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4943872101] Expected error occurred +[Hera] [HADES][TEST ] Testing ENTROPY@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4945325364] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4946207427] ENTROPY@: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4947152196] ▶ Testing module: v3/src/test_runner/modules/starforth_words_ +[Hera] [HADES][TEST ] [KRELTSC: 4948193754] Testing word: ENTROPY! +[Hera] [HADES][TEST ] [KRELTSC: 4948892613] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4949648634] Running ENTROPY!.set_entropy: : ENTSET ; 42 ' ENTSET ENTROPY! +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 4951777929] Test passed +[Hera] [HADES][TEST ] Testing ENTROPY! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4953146352] Expected: Should set entropy to 42 +[Hera] [HADES][TEST ] [KRELTSC: 4953973836] Running ENTROPY!.overwrite: : ENTOV ; 10 ' ENTOV ENTROPY! 20 +[Hera] [HADES][INFO ] [KRELTSC: 4955504400] L8[TABLE]: Config 0 → 14 regime=7 score=6553 L1=0 L2=0 L3=0 L +[Hera] 20 +[Hera] [HADES][TEST ] [KRELTSC: 4956932148] Test passed +[Hera] [HADES][TEST ] Testing ENTROPY! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4958283876] Expected: Should overwrite previous value +[Hera] [HADES][TEST ] [KRELTSC: 4959170496] Running ENTROPY!.zero_entropy: : ENTZERO ; 0 ' ENTZERO ENTROP +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 4960815783] Test passed +[Hera] [HADES][TEST ] Testing ENTROPY! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4962168477] Expected: Should set entropy to 0 +[Hera] [HADES][TEST ] [KRELTSC: 4963204386] Running ENTROPY!.null_addr: 42 0 ENTROPY! +[Hera] [HADES][ERROR] [KRELTSC: 4964180487] ENTROPY!: null dictionary entry +[Hera] [HADES][TEST ] [KRELTSC: 4965074184] Expected error occurred +[Hera] [HADES][TEST ] Testing ENTROPY! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4966484733] Expected: Should handle null address +[Hera] [HADES][TEST ] [KRELTSC: 4967338929] Running ENTROPY!.one_arg: 42 ENTROPY! +[Hera] [HADES][ERROR] [KRELTSC: 4968279267] ENTROPY!: data stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4969091232] Expected error occurred +[Hera] [HADES][TEST ] Testing ENTROPY! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4970523390] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4971439767] Running ENTROPY!.empty_stack: ENTROPY! +[Hera] [HADES][ERROR] [KRELTSC: 4972292829] ENTROPY!: data stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4973084487] Expected error occurred +[Hera] [HADES][TEST ] Testing ENTROPY! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4974554340] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4975422648] ENTROPY!: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4976606607] ▶ Testing module: v3/src/test_runner/modules/starforth_words_ +[Hera] [HADES][TEST ] [KRELTSC: 4977660114] Testing word: WORD-ENTROPY +[Hera] [HADES][TEST ] [KRELTSC: 4978396038] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4979153844] Running WORD-ENTROPY.display_all: 1 DUP DUP DUP DROP DROP DRO +[Hera] Word Usage Statistics (Execution Heat Counts): + +[Hera] ============================================= + +[Hera] DEFER@: 2 + +[Hera] IS: 5 + +[Hera] DEFER: 4 + +[Hera] WORD-ENTROPY: 1 + +[Hera] ENTROPY!: 7 + +[Hera] ENTROPY@: 8 + +[Hera] ENDCASE: 10 + +[Hera] ENDOF: 18 + +[Hera] OF: 18 + +[Hera] CASE: 10 + +[Hera] EXIT: 119 + +[Hera] UNLOOP: 6 + +[Hera] J: 58 + +[Hera] I: 212 + +[Hera] LEAVE: 6 + +[Hera] +LOOP: 6 + +[Hera] LOOP: 48 + +[Hera] DO: 42 + +[Hera] ?DO: 10 + +[Hera] UNTIL: 8 + +[Hera] AGAIN: 4 + +[Hera] REPEAT: 10 + +[Hera] WHILE: 10 + +[Hera] BEGIN: 20 + +[Hera] THEN: 32 + +[Hera] ELSE: 14 + +[Hera] IF: 32 + +[Hera] (LEAVE): 6 + +[Hera] (+LOOP): 40 + +[Hera] (LOOP): 152 + +[Hera] (DO): 48 + +[Hera] (?DO): 12 + +[Hera] (0BRANCH): 142 + +[Hera] (BRANCH): 72 + +[Hera] DOES>: 3 + +[Hera] does_rt: 1 + +[Hera] LITERAL: 1 + +[Hera] LIT: 305 + +[Hera] FENCE: 3 + +[Hera] FORGET: 7 + +[Hera] ]: 3 + +[Hera] [: 4 + +[Hera] IMMEDIATE: 6 + +[Hera] CONSTANT: 4 + +[Hera] VARIABLE: 5 + +[Hera] CREATE: 23 + +[Hera] ;: 121 + +[Hera] :: 129 + +[Hera] ABORT": 3 + +[Hera] ABORT: 4 + +[Hera] QUIT: 1 + +[Hera] EXECUTE: 2 + +[Hera] ORDER: 3 + +[Hera] FORTH: 10 + +[Hera] CURRENT: 4 + +[Hera] CONTEXT: 5 + +[Hera] DEFINITIONS: 15 + +[Hera] VOCABULARY: 15 + +[Hera] ': 16 + +[Hera] FIND: 4 + +[Hera] >BODY: 2 + +[Hera] HIDDEN: 2 + +[Hera] SMUDGE: 2 + +[Hera] LATEST: 7 + +[Hera] SP@: 8 + +[Hera] SP!: 5 + +[Hera] PAD: 15 + +[Hera] 2,: 7 + +[Hera] C,: 10 + +[Hera] ,: 21 + +[Hera] ALLOT: 9 + +[Hera] ALIGN: 1 + +[Hera] HERE: 109 + +[Hera] SCR: 3 + +[Hera] THRU: 17 + +[Hera] LIST: 5 + +[Hera] LOAD: 5 + +[Hera] FLUSH: 3 + +[Hera] EMPTY-BUFFERS: 4 + +[Hera] SAVE-BUFFERS: 3 + +[Hera] UPDATE: 7 + +[Hera] BUFFER: 4 + +[Hera] BLOCK: 12 + +[Hera] SPACES: 10 + +[Hera] SPACE: 7 + +[Hera] TYPE: 43 + +[Hera] CR: 659 + +[Hera] EMIT: 15 + +[Hera] BLANK: 2 + +[Hera] SKIP: 4 + +[Hera] SCAN: 5 + +[Hera] SEARCH: 4 + +[Hera] COMPARE: 5 + +[Hera] CMOVE>: 4 + +[Hera] CMOVE: 6 + +[Hera] -TRAILING: 4 + +[Hera] LITERAL: 1 + +[Hera] [']: 3 + +[Hera] BL: 19 + +[Hera] SOURCE: 2 + +[Hera] >IN: 5 + +[Hera] S": 37 + +[Hera] (s"): 4 + +[Hera] WORD: 15 + +[Hera] SPAN: 4 + +[Hera] EXPECT: 4 + +[Hera] COUNT: 14 + +[Hera] OCTAL: 6 + +[Hera] HEX: 7 + +[Hera] DECIMAL: 14 + +[Hera] BASE: 9 + +[Hera] SIGN: 3 + +[Hera] HOLD: 2 + +[Hera] #>: 16 + +[Hera] #S: 11 + +[Hera] #: 5 + +[Hera] <#: 17 + +[Hera] .: 901 + +[Hera] D2/: 5 + +[Hera] D2*: 5 + +[Hera] D0<: 7 + +[Hera] D0=: 7 + +[Hera] 2R@: 3 + +[Hera] 2R>: 7 + +[Hera] 2>R: 7 + +[Hera] 2ROT: 6 + +[Hera] 2OVER: 6 + +[Hera] 2SWAP: 7 + +[Hera] 2DUP: 6 + +[Hera] 2DROP: 6 + +[Hera] D=: 7 + +[Hera] D<: 8 + +[Hera] DMIN: 6 + +[Hera] DMAX: 6 + +[Hera] DABS: 7 + +[Hera] DNEGATE: 6 + +[Hera] D-: 8 + +[Hera] D+: 7 + +[Hera] S>D: 7 + +[Hera] */MOD: 8 + +[Hera] */: 10 + +[Hera] M/MOD: 7 + +[Hera] M*: 8 + +[Hera] M+: 7 + +[Hera] FALSE: 18 + +[Hera] TRUE: 30 + +[Hera] WITHIN: 31 + +[Hera] U>: 25 + +[Hera] U<: 25 + +[Hera] <=: 31 + +[Hera] >=: 31 + +[Hera] >: 30 + +[Hera] <: 74 + +[Hera] <>: 26 + +[Hera] =: 176 + +[Hera] 0<>: 22 + +[Hera] 0>: 27 + +[Hera] 0<: 24 + +[Hera] 0=: 66 + +[Hera] NOT: 18 + +[Hera] XOR: 32 + +[Hera] OR: 22 + +[Hera] AND: 43 + +[Hera] MAX: 26 + +[Hera] MIN: 4 + +[Hera] NEGATE: 30 + +[Hera] ABS: 25 + +[Hera] 2/: 31 + +[Hera] 2*: 31 + +[Hera] 2-: 10 + +[Hera] 2+: 19 + +[Hera] 1-: 79 + +[Hera] 1+: 84 + +[Hera] */MOD: 8 + +[Hera] */: 10 + +[Hera] /MOD: 20 + +[Hera] MOD: 38 + +[Hera] /: 35 + +[Hera] *: 50 + +[Hera] -: 34 + +[Hera] +: 135 + +[Hera] CELLS: 18 + +[Hera] ERASE: 11 + +[Hera] MOVE: 11 + +[Hera] FILL: 23 + +[Hera] 2!: 17 + +[Hera] 2@: 14 + +[Hera] -!: 17 + +[Hera] +!: 35 + +[Hera] C!: 51 + +[Hera] C@: 97 + +[Hera] !: 111 + +[Hera] @: 182 + +[Hera] R@: 47 + +[Hera] R>: 64 + +[Hera] >R: 66 + +[Hera] ROLL: 10 + +[Hera] PICK: 16 + +[Hera] DEPTH: 79 + +[Hera] -ROT: 18 + +[Hera] ROT: 31 + +[Hera] OVER: 52 + +[Hera] SWAP: 41 + +[Hera] DUP: 144 + +[Hera] DROP: 51 + +[Hera] ------------------------------------- + +[Hera] Total executions: 6817 + +[Hera] Total words: 516 + +[Hera] Average executions per word: 13 + +[Hera] [HADES][TEST ] [KRELTSC: 5044942833] Test passed +[Hera] [HADES][TEST ] Testing WORD-ENTROPY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5046293133] Expected: Should display all word entropy stats +[Hera] [HADES][TEST ] [KRELTSC: 5047242963] Running WORD-ENTROPY.after_execution: : WDENT 1 2 + DROP ; WD +[Hera] Word Usage Statistics (Execution Heat Counts): + +[Hera] ============================================= + +[Hera] WDENT: 2 + +[Hera] DEFER@: 2 + +[Hera] IS: 5 + +[Hera] DEFER: 4 + +[Hera] WORD-ENTROPY: 2 + +[Hera] ENTROPY!: 7 + +[Hera] ENTROPY@: 8 + +[Hera] ENDCASE: 10 + +[Hera] ENDOF: 18 + +[Hera] OF: 18 + +[Hera] CASE: 10 + +[Hera] EXIT: 121 + +[Hera] UNLOOP: 6 + +[Hera] J: 58 + +[Hera] I: 212 + +[Hera] LEAVE: 6 + +[Hera] +LOOP: 6 + +[Hera] LOOP: 48 + +[Hera] DO: 42 + +[Hera] ?DO: 10 + +[Hera] UNTIL: 8 + +[Hera] AGAIN: 4 + +[Hera] REPEAT: 10 + +[Hera] WHILE: 10 + +[Hera] BEGIN: 20 + +[Hera] THEN: 32 + +[Hera] ELSE: 14 + +[Hera] IF: 32 + +[Hera] (LEAVE): 6 + +[Hera] (+LOOP): 40 + +[Hera] (LOOP): 152 + +[Hera] (DO): 48 + +[Hera] (?DO): 12 + +[Hera] (0BRANCH): 142 + +[Hera] (BRANCH): 72 + +[Hera] DOES>: 3 + +[Hera] does_rt: 1 + +[Hera] LITERAL: 1 + +[Hera] LIT: 309 + +[Hera] FENCE: 3 + +[Hera] FORGET: 7 + +[Hera] ]: 3 + +[Hera] [: 4 + +[Hera] IMMEDIATE: 6 + +[Hera] CONSTANT: 4 + +[Hera] VARIABLE: 5 + +[Hera] CREATE: 23 + +[Hera] ;: 122 + +[Hera] :: 130 + +[Hera] ABORT": 3 + +[Hera] ABORT: 4 + +[Hera] QUIT: 1 + +[Hera] EXECUTE: 2 + +[Hera] ORDER: 3 + +[Hera] FORTH: 10 + +[Hera] CURRENT: 4 + +[Hera] CONTEXT: 5 + +[Hera] DEFINITIONS: 15 + +[Hera] VOCABULARY: 15 + +[Hera] ': 16 + +[Hera] FIND: 4 + +[Hera] >BODY: 2 + +[Hera] HIDDEN: 2 + +[Hera] SMUDGE: 2 + +[Hera] LATEST: 7 + +[Hera] SP@: 8 + +[Hera] SP!: 5 + +[Hera] PAD: 15 + +[Hera] 2,: 7 + +[Hera] C,: 10 + +[Hera] ,: 21 + +[Hera] ALLOT: 9 + +[Hera] ALIGN: 1 + +[Hera] HERE: 109 + +[Hera] SCR: 3 + +[Hera] THRU: 17 + +[Hera] LIST: 5 + +[Hera] LOAD: 5 + +[Hera] FLUSH: 3 + +[Hera] EMPTY-BUFFERS: 4 + +[Hera] SAVE-BUFFERS: 3 + +[Hera] UPDATE: 7 + +[Hera] BUFFER: 4 + +[Hera] BLOCK: 12 + +[Hera] SPACES: 10 + +[Hera] SPACE: 7 + +[Hera] TYPE: 43 + +[Hera] CR: 659 + +[Hera] EMIT: 15 + +[Hera] BLANK: 2 + +[Hera] SKIP: 4 + +[Hera] SCAN: 5 + +[Hera] SEARCH: 4 + +[Hera] COMPARE: 5 + +[Hera] CMOVE>: 4 + +[Hera] CMOVE: 6 + +[Hera] -TRAILING: 4 + +[Hera] LITERAL: 1 + +[Hera] [']: 3 + +[Hera] BL: 19 + +[Hera] SOURCE: 2 + +[Hera] >IN: 5 + +[Hera] S": 37 + +[Hera] (s"): 4 + +[Hera] WORD: 15 + +[Hera] SPAN: 4 + +[Hera] EXPECT: 4 + +[Hera] COUNT: 14 + +[Hera] OCTAL: 6 + +[Hera] HEX: 7 + +[Hera] DECIMAL: 14 + +[Hera] BASE: 9 + +[Hera] SIGN: 3 + +[Hera] HOLD: 2 + +[Hera] #>: 16 + +[Hera] #S: 11 + +[Hera] #: 5 + +[Hera] <#: 17 + +[Hera] .: 901 + +[Hera] D2/: 5 + +[Hera] D2*: 5 + +[Hera] D0<: 7 + +[Hera] D0=: 7 + +[Hera] 2R@: 3 + +[Hera] 2R>: 7 + +[Hera] 2>R: 7 + +[Hera] 2ROT: 6 + +[Hera] 2OVER: 6 + +[Hera] 2SWAP: 7 + +[Hera] 2DUP: 6 + +[Hera] 2DROP: 6 + +[Hera] D=: 7 + +[Hera] D<: 8 + +[Hera] DMIN: 6 + +[Hera] DMAX: 6 + +[Hera] DABS: 7 + +[Hera] DNEGATE: 6 + +[Hera] D-: 8 + +[Hera] D+: 7 + +[Hera] S>D: 7 + +[Hera] */MOD: 8 + +[Hera] */: 10 + +[Hera] M/MOD: 7 + +[Hera] M*: 8 + +[Hera] M+: 7 + +[Hera] FALSE: 18 + +[Hera] TRUE: 30 + +[Hera] WITHIN: 31 + +[Hera] U>: 25 + +[Hera] U<: 25 + +[Hera] <=: 31 + +[Hera] >=: 31 + +[Hera] >: 30 + +[Hera] <: 74 + +[Hera] <>: 26 + +[Hera] =: 176 + +[Hera] 0<>: 22 + +[Hera] 0>: 27 + +[Hera] 0<: 24 + +[Hera] 0=: 66 + +[Hera] NOT: 18 + +[Hera] XOR: 32 + +[Hera] OR: 22 + +[Hera] AND: 43 + +[Hera] MAX: 26 + +[Hera] MIN: 4 + +[Hera] NEGATE: 30 + +[Hera] ABS: 25 + +[Hera] 2/: 31 + +[Hera] 2*: 31 + +[Hera] 2-: 10 + +[Hera] 2+: 19 + +[Hera] 1-: 79 + +[Hera] 1+: 84 + +[Hera] */MOD: 8 + +[Hera] */: 10 + +[Hera] /MOD: 20 + +[Hera] MOD: 38 + +[Hera] /: 35 + +[Hera] *: 50 + +[Hera] -: 34 + +[Hera] +: 138 + +[Hera] CELLS: 18 + +[Hera] ERASE: 11 + +[Hera] MOVE: 11 + +[Hera] FILL: 23 + +[Hera] 2!: 17 + +[Hera] 2@: 14 + +[Hera] -!: 17 + +[Hera] +!: 35 + +[Hera] C!: 51 + +[Hera] C@: 97 + +[Hera] !: 111 + +[Hera] @: 182 + +[Hera] R@: 47 + +[Hera] R>: 64 + +[Hera] >R: 66 + +[Hera] ROLL: 10 + +[Hera] PICK: 16 + +[Hera] DEPTH: 79 + +[Hera] -ROT: 18 + +[Hera] ROT: 31 + +[Hera] OVER: 52 + +[Hera] SWAP: 41 + +[Hera] DUP: 144 + +[Hera] DROP: 54 + +[Hera] ------------------------------------- + +[Hera] Total executions: 6834 + +[Hera] Total words: 517 + +[Hera] Average executions per word: 13 + +[Hera] [HADES][TEST ] [KRELTSC: 5114658927] Test passed +[Hera] [HADES][TEST ] Testing WORD-ENTROPY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5116048077] Expected: Should show defined word entropy +[Hera] [HADES][TEST ] [KRELTSC: 5116940409] Running WORD-ENTROPY.stack_preserved: DEPTH WORD-ENTROPY DEPT +[Hera] Word Usage Statistics (Execution Heat Counts): + +[Hera] ============================================= + +[Hera] WDENT: 2 + +[Hera] DEFER@: 2 + +[Hera] IS: 5 + +[Hera] DEFER: 4 + +[Hera] WORD-ENTROPY: 3 + +[Hera] ENTROPY!: 7 + +[Hera] ENTROPY@: 8 + +[Hera] ENDCASE: 10 + +[Hera] ENDOF: 18 + +[Hera] OF: 18 + +[Hera] CASE: 10 + +[Hera] EXIT: 121 + +[Hera] UNLOOP: 6 + +[Hera] J: 58 + +[Hera] I: 212 + +[Hera] LEAVE: 6 + +[Hera] +LOOP: 6 + +[Hera] LOOP: 48 + +[Hera] DO: 42 + +[Hera] ?DO: 10 + +[Hera] UNTIL: 8 + +[Hera] AGAIN: 4 + +[Hera] REPEAT: 10 + +[Hera] WHILE: 10 + +[Hera] BEGIN: 20 + +[Hera] THEN: 32 + +[Hera] ELSE: 14 + +[Hera] IF: 32 + +[Hera] (LEAVE): 6 + +[Hera] (+LOOP): 40 + +[Hera] (LOOP): 152 + +[Hera] (DO): 48 + +[Hera] (?DO): 12 + +[Hera] (0BRANCH): 142 + +[Hera] (BRANCH): 72 + +[Hera] DOES>: 3 + +[Hera] does_rt: 1 + +[Hera] LITERAL: 1 + +[Hera] LIT: 309 + +[Hera] FENCE: 3 + +[Hera] FORGET: 7 + +[Hera] ]: 3 + +[Hera] [: 4 + +[Hera] IMMEDIATE: 6 + +[Hera] CONSTANT: 4 + +[Hera] VARIABLE: 5 + +[Hera] CREATE: 23 + +[Hera] ;: 122 + +[Hera] :: 130 + +[Hera] ABORT": 3 + +[Hera] ABORT: 4 + +[Hera] QUIT: 1 + +[Hera] EXECUTE: 2 + +[Hera] ORDER: 3 + +[Hera] FORTH: 10 + +[Hera] CURRENT: 4 + +[Hera] CONTEXT: 5 + +[Hera] DEFINITIONS: 15 + +[Hera] VOCABULARY: 15 + +[Hera] ': 16 + +[Hera] FIND: 4 + +[Hera] >BODY: 2 + +[Hera] HIDDEN: 2 + +[Hera] SMUDGE: 2 + +[Hera] LATEST: 7 + +[Hera] SP@: 8 + +[Hera] SP!: 5 + +[Hera] PAD: 15 + +[Hera] 2,: 7 + +[Hera] C,: 10 + +[Hera] ,: 21 + +[Hera] ALLOT: 9 + +[Hera] ALIGN: 1 + +[Hera] HERE: 109 + +[Hera] SCR: 3 + +[Hera] THRU: 17 + +[Hera] LIST: 5 + +[Hera] LOAD: 5 + +[Hera] FLUSH: 3 + +[Hera] EMPTY-BUFFERS: 4 + +[Hera] SAVE-BUFFERS: 3 + +[Hera] UPDATE: 7 + +[Hera] BUFFER: 4 + +[Hera] BLOCK: 12 + +[Hera] SPACES: 10 + +[Hera] SPACE: 7 + +[Hera] TYPE: 43 + +[Hera] CR: 659 + +[Hera] EMIT: 15 + +[Hera] BLANK: 2 + +[Hera] SKIP: 4 + +[Hera] SCAN: 5 + +[Hera] SEARCH: 4 + +[Hera] COMPARE: 5 + +[Hera] CMOVE>: 4 + +[Hera] CMOVE: 6 + +[Hera] -TRAILING: 4 + +[Hera] LITERAL: 1 + +[Hera] [']: 3 + +[Hera] BL: 19 + +[Hera] SOURCE: 2 + +[Hera] >IN: 5 + +[Hera] S": 37 + +[Hera] (s"): 4 + +[Hera] WORD: 15 + +[Hera] SPAN: 4 + +[Hera] EXPECT: 4 + +[Hera] COUNT: 14 + +[Hera] OCTAL: 6 + +[Hera] HEX: 7 + +[Hera] DECIMAL: 14 + +[Hera] BASE: 9 + +[Hera] SIGN: 3 + +[Hera] HOLD: 2 + +[Hera] #>: 16 + +[Hera] #S: 11 + +[Hera] #: 5 + +[Hera] <#: 17 + +[Hera] .: 901 + +[Hera] D2/: 5 + +[Hera] D2*: 5 + +[Hera] D0<: 7 + +[Hera] D0=: 7 + +[Hera] 2R@: 3 + +[Hera] 2R>: 7 + +[Hera] 2>R: 7 + +[Hera] 2ROT: 6 + +[Hera] 2OVER: 6 + +[Hera] 2SWAP: 7 + +[Hera] 2DUP: 6 + +[Hera] 2DROP: 6 + +[Hera] D=: 7 + +[Hera] D<: 8 + +[Hera] DMIN: 6 + +[Hera] DMAX: 6 + +[Hera] DABS: 7 + +[Hera] DNEGATE: 6 + +[Hera] D-: 8 + +[Hera] D+: 7 + +[Hera] S>D: 7 + +[Hera] */MOD: 8 + +[Hera] */: 10 + +[Hera] M/MOD: 7 + +[Hera] M*: 8 + +[Hera] M+: 7 + +[Hera] FALSE: 18 + +[Hera] TRUE: 30 + +[Hera] WITHIN: 31 + +[Hera] U>: 25 + +[Hera] U<: 25 + +[Hera] <=: 31 + +[Hera] >=: 31 + +[Hera] >: 30 + +[Hera] <: 74 + +[Hera] <>: 26 + +[Hera] =: 176 + +[Hera] 0<>: 22 + +[Hera] 0>: 27 + +[Hera] 0<: 24 + +[Hera] 0=: 66 + +[Hera] NOT: 18 + +[Hera] XOR: 32 + +[Hera] OR: 22 + +[Hera] AND: 43 + +[Hera] MAX: 26 + +[Hera] MIN: 4 + +[Hera] NEGATE: 30 + +[Hera] ABS: 25 + +[Hera] 2/: 31 + +[Hera] 2*: 31 + +[Hera] 2-: 10 + +[Hera] 2+: 19 + +[Hera] 1-: 79 + +[Hera] 1+: 84 + +[Hera] */MOD: 8 + +[Hera] */: 10 + +[Hera] /MOD: 20 + +[Hera] MOD: 38 + +[Hera] /: 35 + +[Hera] *: 50 + +[Hera] -: 34 + +[Hera] +: 138 + +[Hera] CELLS: 18 + +[Hera] ERASE: 11 + +[Hera] MOVE: 11 + +[Hera] FILL: 23 + +[Hera] 2!: 17 + +[Hera] 2@: 14 + +[Hera] -!: 17 + +[Hera] +!: 35 + +[Hera] C!: 51 + +[Hera] C@: 97 + +[Hera] !: 111 + +[Hera] @: 182 + +[Hera] R@: 47 + +[Hera] R>: 64 + +[Hera] >R: 66 + +[Hera] ROLL: 10 + +[Hera] PICK: 16 + +[Hera] DEPTH: 80 + +[Hera] -ROT: 18 + +[Hera] ROT: 31 + +[Hera] OVER: 52 + +[Hera] SWAP: 41 + +[Hera] DUP: 144 + +[Hera] DROP: 54 + +[Hera] ------------------------------------- + +[Hera] Total executions: 6836 + +[Hera] Total words: 517 + +[Hera] Average executions per word: 13 + +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 5184087342] Test passed +[Hera] [HADES][TEST ] Testing WORD-ENTROPY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5185496589] Expected: Should not affect stack +[Hera] [HADES][TEST ] [KRELTSC: 5186328168] WORD-ENTROPY: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5187286188] ▶ Testing module: v3/src/test_runner/modules/starforth_words_ +[Hera] [HADES][TEST ] [KRELTSC: 5188295763] Testing word: RESET-ENTROPY +[Hera] [HADES][TEST ] [KRELTSC: 5189124234] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5190000459] Running RESET-ENTROPY.reset_defined: : RESETTEST 1 DROP ; RES +[Hera] [HADES][TEST ] [KRELTSC: 5192000877] Test passed +[Hera] [HADES][TEST ] Testing RESET-ENTROPY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5193379044] Expected: Should reset all entropy counters +[Hera] [HADES][TEST ] [KRELTSC: 5194303296] Running RESET-ENTROPY.double_reset: RESET-ENTROPY RESET-ENTRO +[Hera] [HADES][TEST ] [KRELTSC: 5195570709] Test passed +[Hera] [HADES][TEST ] Testing RESET-ENTROPY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5196937998] Expected: Should handle multiple resets +[Hera] [HADES][TEST ] [KRELTSC: 5197843749] Running RESET-ENTROPY.after_usage: 1 DUP DUP DUP DROP DROP DR +[Hera] [HADES][TEST ] [KRELTSC: 5198972646] Test passed +[Hera] [HADES][TEST ] Testing RESET-ENTROPY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5200408059] Expected: Should reset after word usage +[Hera] [HADES][TEST ] [KRELTSC: 5201331828] RESET-ENTROPY: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5202650838] ▶ Testing module: v3/src/test_runner/modules/starforth_words_ +[Hera] [HADES][TEST ] [KRELTSC: 5203664487] Testing word: TOP-WORDS +[Hera] [HADES][TEST ] [KRELTSC: 5204457846] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5205194841] Running TOP-WORDS.display_top5: : TOPTEST 1 DROP ; TOPTEST TO +[Hera] Top 5 most frequently used words: + +[Hera] ================================== + +[Hera] 1. DROP: 6 + +[Hera] 2. TOPTEST: 5 + +[Hera] 3. EXIT: 5 + +[Hera] 4. LIT: 5 + +[Hera] 5. TOP-WORDS: 1 + +[Hera] [HADES][TEST ] [KRELTSC: 5209969380] Test passed +[Hera] [HADES][TEST ] Testing TOP-WORDS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5211323481] Expected: Should display top 5 hot words +[Hera] [HADES][TEST ] [KRELTSC: 5212215078] Running TOP-WORDS.display_top10: 10 TOP-WORDS +[Hera] Top 10 most frequently used words: + +[Hera] ================================== + +[Hera] 1. DROP: 6 + +[Hera] 2. TOPTEST: 5 + +[Hera] 3. EXIT: 5 + +[Hera] 4. LIT: 5 + +[Hera] 5. TOP-WORDS: 2 + +[Hera] 6. ;: 1 + +[Hera] 7. :: 1 + +[Hera] [HADES][TEST ] [KRELTSC: 5216722329] Test passed +[Hera] [HADES][TEST ] Testing TOP-WORDS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5218041864] Expected: Should display top 10 words +[Hera] [HADES][TEST ] [KRELTSC: 5218977015] Running TOP-WORDS.after_reset: RESET-ENTROPY 5 TOP-WORDS +[Hera] Top 5 most frequently used words: + +[Hera] ================================== + +[Hera] 1. TOP-WORDS: 1 + +[Hera] [HADES][TEST ] [KRELTSC: 5221459740] Test passed +[Hera] [HADES][TEST ] Testing TOP-WORDS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5222807016] Expected: Should handle display after reset +[Hera] [HADES][TEST ] [KRELTSC: 5223717807] Running TOP-WORDS.single_word: 1 TOP-WORDS +[Hera] Top 1 most frequently used words: + +[Hera] ================================== + +[Hera] 1. TOP-WORDS: 2 + +[Hera] [HADES][TEST ] [KRELTSC: 5226025770] Test passed +[Hera] [HADES][TEST ] Testing TOP-WORDS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5227706022] Expected: Should display top 1 word +[Hera] [HADES][TEST ] [KRELTSC: 5228590815] Running TOP-WORDS.large_count: 100 TOP-WORDS +[Hera] Top 100 most frequently used words: + +[Hera] ================================== + +[Hera] 1. TOP-WORDS: 3 + +[Hera] [HADES][TEST ] [KRELTSC: 5230998066] Test passed +[Hera] [HADES][TEST ] Testing TOP-WORDS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5232395385] Expected: Should handle large count +[Hera] [HADES][TEST ] [KRELTSC: 5233291770] Running TOP-WORDS.zero_count: 0 TOP-WORDS +[Hera] TOP-WORDS: invalid count 0 + +[Hera] [HADES][TEST ] [KRELTSC: 5234754777] Test passed +[Hera] [HADES][TEST ] Testing TOP-WORDS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5236175889] Expected: Should handle zero count +[Hera] [HADES][TEST ] [KRELTSC: 5237076264] Running TOP-WORDS.negative_count: -5 TOP-WORDS +[Hera] TOP-WORDS: invalid count -5 + +[Hera] [HADES][TEST ] [KRELTSC: 5238600255] Test passed +[Hera] [HADES][TEST ] Testing TOP-WORDS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5240236197] Expected: Should handle negative count +[Hera] [HADES][TEST ] [KRELTSC: 5241113367] Running TOP-WORDS.empty_stack: TOP-WORDS +[Hera] [HADES][ERROR] [KRELTSC: 5242126806] TOP-WORDS: data stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 5242916616] Expected error occurred +[Hera] [HADES][TEST ] Testing TOP-WORDS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5244360954] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 5245229052] TOP-WORDS: 8 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5246184111] ▶ Testing module: v3/src/test_runner/modules/starforth_words_ +[Hera] [HADES][TEST ] [KRELTSC: 5247199335] Testing word: (- +[Hera] [HADES][TEST ] [KRELTSC: 5247888912] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5248662993] Running (-.comment_line: (- This is a comment +[Hera] 1 2 + . CR +[Hera] [HADES][WARN ] [KRELTSC: 5250152103] (- comment not terminated +[Hera] [HADES][TEST ] [KRELTSC: 5250949914] Test passed +[Hera] [HADES][TEST ] Testing (- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5252354268] Expected: Should ignore rest of line +[Hera] [HADES][TEST ] [KRELTSC: 5253366132] Running (-.mid_line: 1 (- comment here +[Hera] 2 + . CR +[Hera] [HADES][WARN ] [KRELTSC: 5254585014] (- comment not terminated +[Hera] [HADES][TEST ] [KRELTSC: 5255347440] Test passed +[Hera] [HADES][TEST ] Testing (- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5256645009] Expected: Should work mid-expression +[Hera] [HADES][TEST ] [KRELTSC: 5257496769] Running (-.no_stack_effect: DEPTH (- comment +[Hera] DEPTH = . CR +[Hera] [HADES][WARN ] [KRELTSC: 5258782809] (- comment not terminated +[Hera] [HADES][TEST ] [KRELTSC: 5259549834] Test passed +[Hera] [HADES][TEST ] Testing (- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5260849650] Expected: Should not affect stack +[Hera] [HADES][TEST ] [KRELTSC: 5261685702] Running (-.multiple: 1 (- first +[Hera] 2 (- second +[Hera] + . CR +[Hera] [HADES][WARN ] [KRELTSC: 5263171473] (- comment not terminated +[Hera] [HADES][TEST ] [KRELTSC: 5263943454] Test passed +[Hera] [HADES][TEST ] Testing (- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5265578430] Expected: Should handle multiple comments +[Hera] [HADES][TEST ] [KRELTSC: 5266629375] (-: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5267639580] === StarForth Words Summary: 0 passed, 0 failed, 0 skipped, 0 e +[Hera] [HADES][INFO ] [KRELTSC: 5268682818] +[Hera] === Testing Module: ACL Words === +[Hera] [HADES][INFO ] [KRELTSC: 5269814718] Running ACL Words Tests (Module 24)... +[Hera] [HADES][WARN ] [KRELTSC: 5274047247] ACL: denied '__acl_deny_test__' +[Hera] [HADES][INFO ] [KRELTSC: 5276038677] SKIP: STRICT mode test (ACL.4th not loaded) +[Hera] [HADES][INFO ] [KRELTSC: 5277280092] SKIP: ACL-TTL-COMPUTE (ACL.4th not loaded) +[Hera] [HADES][WARN ] [KRELTSC: 5278818552] vm_create_word: cannot shadow pinned word '__acl_shadow_target_ +[Hera] [HADES][TEST ] [KRELTSC: 5283327882] === ACL Words Summary: 29 passed, 0 failed, 0 skipped, 0 errors +[Hera] [HADES][INFO ] [KRELTSC: 5284282143] +[Hera] === Testing Module: Mama FORTH Words === +[Hera] [HADES][INFO ] [KRELTSC: 5285384559] Running Mama FORTH Words Tests (Capsule System M7.1)... +[Hera] [HADES][TEST ] [KRELTSC: 5286387666] Testing word: CAPSULE-COUNT +[Hera] [HADES][TEST ] [KRELTSC: 5287142658] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5287897230] CAPSULE-COUNT: 0 passed, 0 failed, 2 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5288879820] Testing word: CAPSULE@ +[Hera] [HADES][TEST ] [KRELTSC: 5289597894] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5290491444] CAPSULE@: 0 passed, 0 failed, 3 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5291665449] Testing word: CAPSULE-FLAGS@ +[Hera] [HADES][TEST ] [KRELTSC: 5292707427] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5293464267] CAPSULE-FLAGS@: 0 passed, 0 failed, 3 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5294463657] Testing word: CAPSULE-LEN@ +[Hera] [HADES][TEST ] [KRELTSC: 5295215037] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5295939138] CAPSULE-LEN@: 0 passed, 0 failed, 2 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5296945773] Testing word: CAPSULE-HASH@ +[Hera] [HADES][TEST ] [KRELTSC: 5297722542] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5298474195] CAPSULE-HASH@: 0 passed, 0 failed, 2 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5299433454] Testing word: MAMA-VM-ID +[Hera] [HADES][TEST ] [KRELTSC: 5300178912] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5300950956] MAMA-VM-ID: 0 passed, 0 failed, 2 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5301889152] Testing word: VM-COUNT +[Hera] [HADES][TEST ] [KRELTSC: 5302647924] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5303381202] VM-COUNT: 0 passed, 0 failed, 2 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5304285357] Testing word: CAPSULE-BIRTH +[Hera] [HADES][TEST ] [KRELTSC: 5305265595] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5305986336] CAPSULE-BIRTH: 0 passed, 0 failed, 2 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5306981127] Testing word: CAPSULE-RUN +[Hera] [HADES][TEST ] [KRELTSC: 5307748551] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5308495185] CAPSULE-RUN: 0 passed, 0 failed, 1 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5309443146] Testing word: CAPSULE-TEST +[Hera] [HADES][TEST ] [KRELTSC: 5310218613] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5311017432] CAPSULE-TEST: 0 passed, 0 failed, 1 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5312114661] === Mama FORTH Words Summary: 0 passed, 0 failed, 0 skipped, 0 +[Hera] [HADES][INFO ] [KRELTSC: 5313163842] +[Hera] === Testing Module: Q48.16 Words === +[Hera] [HADES][INFO ] [KRELTSC: 5314263087] Running Q48.16 Words Tests (Module 25)... +[Hera] [HADES][TEST ] [KRELTSC: 5315189397] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 5316224424] Testing word: Q.+ +[Hera] [HADES][TEST ] [KRELTSC: 5316916857] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5317843776] Running Q.+.basic: 1 Q.FROM-INT 2 Q.FROM-INT Q.+ Q.TO-INT . C +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 5319404790] Test passed +[Hera] [HADES][TEST ] Testing Q.+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5320779639] Expected: Should print: 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 5323075716] Q.+: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5324024496] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 5325074307] Testing word: Q.- +[Hera] [HADES][TEST ] [KRELTSC: 5325789399] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5326547961] Running Q.-.basic: 5 Q.FROM-INT 2 Q.FROM-INT Q.- Q.TO-INT . C +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 5327978985] Test passed +[Hera] [HADES][TEST ] Testing Q.- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5329279053] Expected: Should print: 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][INFO ] [KRELTSC: 5331373656] L8[TABLE]: Config 14 → 0 regime=3 score=26214 L1=0 L2=0 L3=0 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 5333134758] Q.-: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5334062454] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 5335121778] Testing word: Q.* +[Hera] [HADES][TEST ] [KRELTSC: 5335819482] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5336590455] Running Q.*.basic: 3 Q.FROM-INT 4 Q.FROM-INT Q.* Q.TO-INT . C +[Hera] 12 +[Hera] [HADES][TEST ] [KRELTSC: 5338149558] Test passed +[Hera] [HADES][TEST ] Testing Q.* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5339447778] Expected: Should print: 12 +[Hera] 12 +[Hera] 12 +[Hera] 12 +[Hera] 12 +[Hera] 12 +[Hera] [HADES][TEST ] [KRELTSC: 5341785456] Q.*: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5342854566] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 5343913974] Testing word: Q./ +[Hera] [HADES][TEST ] [KRELTSC: 5344619385] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5345376288] Running Q./.basic: 10 Q.FROM-INT 2 Q.FROM-INT Q./ Q.TO-INT . +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 5346837027] Test passed +[Hera] [HADES][TEST ] Testing Q./ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5348107506] Expected: Should print: 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 5350404927] Running Q./.by_zero: 5 Q.FROM-INT 0 Q.FROM-INT Q./ Q.TO-INT . +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 5351753820] Test passed +[Hera] [HADES][TEST ] Testing Q./ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5353066530] Expected: Should print: 0 (division by zero yields q=0) +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 5355911253] Q./: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5356830360] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 5357901528] Testing word: Q.ABS +[Hera] [HADES][TEST ] [KRELTSC: 5358631362] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5359398492] Running Q.ABS.basic: 3 Q.FROM-INT Q.NEG Q.ABS Q.TO-INT . CR +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 5360794761] Test passed +[Hera] [HADES][TEST ] Testing Q.ABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5362139811] Expected: Should print: 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 5364384039] Q.ABS: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5365314738] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 5366394474] Testing word: Q.NEG +[Hera] [HADES][TEST ] [KRELTSC: 5367102657] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5368126050] Running Q.NEG.basic: 5 Q.FROM-INT Q.NEG Q.TO-INT . CR +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 5369372694] Test passed +[Hera] [HADES][TEST ] Testing Q.NEG ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5370703023] Expected: Should print: -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 5372980809] Q.NEG: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5373927216] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 5374977783] Testing word: Q.LOG +[Hera] [HADES][TEST ] [KRELTSC: 5375683761] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5376469896] Running Q.LOG.of_one: Q.1 Q.LOG Q.TO-INT . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 5377893738] Test passed +[Hera] [HADES][TEST ] Testing Q.LOG ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5379256029] Expected: Should print: 0 (ln 1.0 = 0) +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][INFO ] [KRELTSC: 5381536713] L8[TABLE]: Config 0 → 1 regime=3 score=26214 L1=0 L2=0 L3=0 L +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 5383643223] Q.LOG: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5384797782] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 5386082268] Testing word: Q.EXP +[Hera] [HADES][TEST ] [KRELTSC: 5386976742] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5387885160] Running Q.EXP.of_zero: Q.0 Q.EXP Q.TO-INT . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 5389520094] Test passed +[Hera] [HADES][TEST ] Testing Q.EXP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5391151983] Expected: Should print: 1 (e^0 = 1) +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 5394234111] Q.EXP: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5395399926] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 5396660745] Testing word: Q.SQRT +[Hera] [HADES][TEST ] [KRELTSC: 5397556143] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5398448664] Running Q.SQRT.of_four: 4 Q.FROM-INT Q.SQRT Q.TO-INT . CR +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 5400262917] Test passed +[Hera] [HADES][TEST ] Testing Q.SQRT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5401922253] Expected: Should print: 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 5404682871] Q.SQRT: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5406109485] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 5407805529] Testing word: Q.SIN +[Hera] [HADES][TEST ] [KRELTSC: 5408860632] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5409814347] Running Q.SIN.of_zero: Q.0 Q.SIN Q.TO-INT . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 5411544600] Test passed +[Hera] [HADES][TEST ] Testing Q.SIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5413149000] Expected: Should print: 0 (sin 0 = 0) +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 5416060629] Q.SIN: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5417218884] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 5418470967] Testing word: Q.COS +[Hera] [HADES][TEST ] [KRELTSC: 5419321215] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5420442909] Running Q.COS.of_zero: Q.0 Q.COS Q.TO-INT . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 5422178055] Test passed +[Hera] [HADES][TEST ] Testing Q.COS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5423773761] Expected: Should print: 1 (cos 0 = 1) +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 5426818299] Q.COS: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5427911706] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 5429210535] Testing word: Q.FROM-INT +[Hera] [HADES][TEST ] [KRELTSC: 5430109923] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5431023402] Running Q.FROM-INT.round_trip: 7 Q.FROM-INT Q.TO-INT . CR +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 5432736309] Test passed +[Hera] [HADES][TEST ] Testing Q.FROM-INT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5434436595] Expected: Should print: 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 5437185810] Q.FROM-INT: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5438340453] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 5439596358] Testing word: Q.TO-INT +[Hera] [HADES][TEST ] [KRELTSC: 5440475607] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5441418696] Running Q.TO-INT.of_one: Q.1 Q.TO-INT . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 5442877482] Test passed +[Hera] [HADES][TEST ] Testing Q.TO-INT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5444494902] Expected: Should print: 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 5447443113] Q.TO-INT: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5448605463] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 5449927245] Testing word: Q.1 +[Hera] [HADES][TEST ] [KRELTSC: 5450743767] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5451665814] Running Q.1.raw_value: Q.1 . CR +[Hera] 65536 +[Hera] [HADES][TEST ] [KRELTSC: 5453068614] Test passed +[Hera] [HADES][TEST ] Testing Q.1 ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5456070816] Expected: Should print: 65536 +[Hera] 65536 +[Hera] 65536 +[Hera] 65536 +[Hera] 65536 +[Hera] 65536 +[Hera] [HADES][TEST ] [KRELTSC: 5459480061] Q.1: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5460411264] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 5461407609] Testing word: Q.0 +[Hera] [HADES][TEST ] [KRELTSC: 5462123835] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5462832606] Running Q.0.raw_value: Q.0 . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 5463880758] Test passed +[Hera] [HADES][TEST ] Testing Q.0 ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5465142837] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 5467293993] Q.0: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5468282106] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 5469318897] Testing word: Q.SCALE +[Hera] [HADES][TEST ] [KRELTSC: 5470022019] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5471016453] Running Q.SCALE.raw_value: Q.SCALE . CR +[Hera] 65536 +[Hera] [HADES][TEST ] [KRELTSC: 5472391197] Test passed +[Hera] [HADES][TEST ] Testing Q.SCALE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5473681164] Expected: Should print: 65536 +[Hera] 65536 +[Hera] 65536 +[Hera] 65536 +[Hera] 65536 +[Hera] 65536 +[Hera] [HADES][TEST ] [KRELTSC: 5476031169] Q.SCALE: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5476966677] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 5477986689] Testing word: Q.= +[Hera] [HADES][TEST ] [KRELTSC: 5478698967] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5479467840] Running Q.=.equal: Q.1 Q.1 Q.= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 5480691531] Test passed +[Hera] [HADES][TEST ] Testing Q.= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5482003380] Expected: Should print: -1 (true) +[Hera] -1 +[Hera] -1 [HADES][INFO ] [KRELTSC: 5483668743] L8[TABLE]: Config 1 → 2 regime=3 score=26214 L1=0 L2=0 L3=0 L + +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 5485511304] Running Q.=.not_equal: Q.1 Q.0 Q.= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 5486633754] Test passed +[Hera] [HADES][TEST ] Testing Q.= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5487931050] Expected: Should print: 0 (false) +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 5490161838] Q.=: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5491066140] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 5492095539] Testing word: Q.< +[Hera] [HADES][TEST ] [KRELTSC: 5492796771] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5493579483] Running Q.<.true: Q.0 Q.1 Q.< . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 5494802040] Test passed +[Hera] [HADES][TEST ] Testing Q.< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5496398103] Expected: Should print: -1 (true) +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 5498693382] Running Q.<.false: Q.1 Q.0 Q.< . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 5499794832] Test passed +[Hera] [HADES][TEST ] Testing Q.< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5501071044] Expected: Should print: 0 (false) +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 5503312269] Q.<: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5504248554] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 5505272073] Testing word: Q.> +[Hera] [HADES][TEST ] [KRELTSC: 5505994662] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5506730103] Running Q.>.true: Q.1 Q.0 Q.> . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 5508023304] Test passed +[Hera] [HADES][TEST ] Testing Q.> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5509376187] Expected: Should print: -1 (true) +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 5511685704] Running Q.>.false: Q.0 Q.1 Q.> . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 5512779762] Test passed +[Hera] [HADES][TEST ] Testing Q.> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5514099297] Expected: Should print: 0 (false) +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 5516378994] Q.>: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5517233862] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 5518284240] Testing word: Q.0= +[Hera] [HADES][TEST ] [KRELTSC: 5518979529] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5519746260] Running Q.0=.true: Q.0 Q.0= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 5521083561] Test passed +[Hera] [HADES][TEST ] Testing Q.0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5522360382] Expected: Should print: -1 (true) +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 5524626009] Running Q.0=.false: Q.1 Q.0= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 5525771979] Test passed +[Hera] [HADES][TEST ] Testing Q.0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5527155669] Expected: Should print: 0 (false) +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 5529416130] Q.0=: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5530328832] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 5531383368] Testing word: Q.MAX +[Hera] [HADES][TEST ] [KRELTSC: 5532143022] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5532872625] Running Q.MAX.basic: 3 Q.FROM-INT 7 Q.FROM-INT Q.MAX Q.TO-INT +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 5534630010] Test passed +[Hera] [HADES][TEST ] Testing Q.MAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5535941985] Expected: Should print: 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] [HADES][INFO ] [KRELTSC: 5537980707] L8[TABLE]: Config 2 → 3 regime=3 score=26214 L1=0 L2=0 L3=0 L +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 5539383906] Q.MAX: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5540345286] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 5541506292] Testing word: Q.MIN +[Hera] [HADES][TEST ] [KRELTSC: 5542184025] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5542902372] Running Q.MIN.basic: 3 Q.FROM-INT 7 Q.FROM-INT Q.MIN Q.TO-INT +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 5544369894] Test passed +[Hera] [HADES][TEST ] Testing Q.MIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5545851486] Expected: Should print: 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 5548109301] Q.MIN: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5549018853] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 5550069294] Testing word: Q.PRINT +[Hera] [HADES][TEST ] [KRELTSC: 5550748812] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5551508466] Running Q.PRINT.of_one: Q.1 Q.PRINT CR +[Hera] 1.5u +[Hera] [HADES][TEST ] [KRELTSC: 5553037098] Test passed +[Hera] [HADES][TEST ] Testing Q.PRINT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5554369170] Expected: Should print: 1.00000 +[Hera] 1.5u +[Hera] 1.5u +[Hera] 1.5u +[Hera] 1.5u +[Hera] 1.5u +[Hera] [HADES][TEST ] [KRELTSC: 5556756072] Q.PRINT: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5557708926] === Q48.16 Words Summary: 0 passed, 0 failed, 0 skipped, 0 erro +[Hera] [HADES][INFO ] [KRELTSC: 5558932071] +[Hera] === Testing Module: Inference Engine Words === +[Hera] [HADES][INFO ] [KRELTSC: 5560401231] Running Inference Engine Words Tests (Module 26)... +[Hera] [HADES][TEST ] [KRELTSC: 5561399613] ▶ Testing module: v3/src/test_runner/modules/inference_words_ +[Hera] [HADES][TEST ] [KRELTSC: 5562447009] Testing word: Q.VARIANCE +[Hera] [HADES][TEST ] [KRELTSC: 5563168443] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5563913124] Running Q.VARIANCE.three_cells: 100 HERE ! 200 HERE 8 + ! 300 +[Hera] 6666 +[Hera] [HADES][TEST ] [KRELTSC: 5565700497] Test passed +[Hera] [HADES][TEST ] Testing Q.VARIANCE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5567100336] Expected: Should print population variance of {100,200,300} +[Hera] [HADES][TEST ] [KRELTSC: 5568193533] Q.VARIANCE: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5569246809] ▶ Testing module: v3/src/test_runner/modules/inference_words_ +[Hera] [HADES][TEST ] [KRELTSC: 5570413233] Testing word: INFER-DECAY-SLOPE +[Hera] [HADES][TEST ] [KRELTSC: 5571530454] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5572320285] Running INFER-DECAY-SLOPE.three_cells: 300 HERE ! 200 HERE 8 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 5574454725] Test passed +[Hera] [HADES][TEST ] Testing INFER-DECAY-SLOPE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5575878147] Expected: Should print decay slope for a decreasing traject +[Hera] [HADES][TEST ] [KRELTSC: 5576935119] INFER-DECAY-SLOPE: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5577934194] ▶ Testing module: v3/src/test_runner/modules/inference_words_ +[Hera] [HADES][TEST ] [KRELTSC: 5578981737] Testing word: INFER-WINDOW-WIDTH +[Hera] [HADES][TEST ] [KRELTSC: 5579796978] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5580570807] Running INFER-WINDOW-WIDTH.three_cells: 100 HERE ! 200 HERE 8 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 5582291715] Test passed +[Hera] [HADES][TEST ] Testing INFER-WINDOW-WIDTH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5583973248] Expected: Should print an inferred window width (no error) +[Hera] [HADES][TEST ] [KRELTSC: 5585071653] INFER-WINDOW-WIDTH: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5586091602] ▶ Testing module: v3/src/test_runner/modules/inference_words_ +[Hera] [HADES][TEST ] [KRELTSC: 5587088808] Testing word: INFER-RUN +[Hera] [HADES][TEST ] [KRELTSC: 5587847139] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5588567754] Running INFER-RUN.basic: INFER-RUN +[Hera] [HADES][TEST ] [KRELTSC: 5593369887] Test passed +[Hera] [HADES][TEST ] Testing INFER-RUN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5594670690] Expected: Should run without error +[Hera] [HADES][TEST ] [KRELTSC: 5595487443] INFER-RUN: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5596618104] ▶ Testing module: v3/src/test_runner/modules/inference_words_ +[Hera] [HADES][TEST ] [KRELTSC: 5597579442] Testing word: INFER-WINDOW@ +[Hera] [HADES][TEST ] [KRELTSC: 5598478284] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5599363959] Running INFER-WINDOW@.after_run: INFER-RUN INFER-WINDOW@ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 5601927891] Test passed +[Hera] [HADES][TEST ] Testing INFER-WINDOW@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5603339763] Expected: Should print last adaptive_window_width (no error +[Hera] [HADES][TEST ] [KRELTSC: 5604417525] INFER-WINDOW@: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5605368237] ▶ Testing module: v3/src/test_runner/modules/inference_words_ +[Hera] [HADES][TEST ] [KRELTSC: 5606438250] Testing word: INFER-DECAY@ +[Hera] [HADES][TEST ] [KRELTSC: 5607204519] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5607938658] Running INFER-DECAY@.after_run: INFER-RUN INFER-DECAY@ Q.TO-I +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 5610486168] Test passed +[Hera] [HADES][TEST ] Testing INFER-DECAY@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5611825779] Expected: Should print last adaptive_decay_slope (no error) +[Hera] [HADES][TEST ] [KRELTSC: 5612925171] INFER-DECAY@: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5613976536] ▶ Testing module: v3/src/test_runner/modules/inference_words_ +[Hera] [HADES][TEST ] [KRELTSC: 5615075151] Testing word: INFER-VARIANCE@ +[Hera] [HADES][TEST ] [KRELTSC: 5615886024] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5616645426] Running INFER-VARIANCE@.after_run: INFER-RUN INFER-VARIANCE@ +[Hera] 1169 +[Hera] [HADES][TEST ] [KRELTSC: 5619142935] Test passed +[Hera] [HADES][TEST ] Testing INFER-VARIANCE@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5620518141] Expected: Should print last window_variance_q48 (no error) +[Hera] [HADES][TEST ] [KRELTSC: 5621851284] INFER-VARIANCE@: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5622828855] ▶ Testing module: v3/src/test_runner/modules/inference_words_ +[Hera] [HADES][TEST ] [KRELTSC: 5623901451] Testing word: INFER-FIT@ +[Hera] [HADES][TEST ] [KRELTSC: 5624631054] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5625376113] Running INFER-FIT@.after_run: INFER-RUN INFER-FIT@ Q.TO-INT . +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 5627775195] Test passed +[Hera] [HADES][TEST ] Testing INFER-FIT@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5629213149] Expected: Should print last slope_fit_quality_q48 (no error +[Hera] [HADES][TEST ] [KRELTSC: 5630260608] INFER-FIT@: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5631187590] ▶ Testing module: v3/src/test_runner/modules/inference_words_ +[Hera] [HADES][TEST ] [KRELTSC: 5632235973] Testing word: INFER-EARLY-EXIT@ +[Hera] [HADES][TEST ] [KRELTSC: 5633026329] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5633807067] Running INFER-EARLY-EXIT@.after_run: INFER-RUN INFER-EARLY-EX +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 5638208058] Test passed +[Hera] [HADES][TEST ] Testing INFER-EARLY-EXIT@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5639511696] Expected: Should print 0 or 1 (no error) +[Hera] [HADES][TEST ] [KRELTSC: 5640352977] INFER-EARLY-EXIT@: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5641265301] === Inference Engine Words Summary: 0 passed, 0 failed, 0 skipp +[Hera] [HADES][INFO ] [KRELTSC: 5642251881] +[Hera] === Testing Module: Physics Freeze Words === +[Hera] [HADES][INFO ] [KRELTSC: 5643560055] Running Physics Freeze Words Tests (Module 27)... +[Hera] [HADES][TEST ] [KRELTSC: 5644556232] ▶ Testing module: v3/src/test_runner/modules/physics_freeze_w +[Hera] [HADES][TEST ] [KRELTSC: 5645591364] Testing word: FREEZE-WORD +[Hera] [HADES][TEST ] [KRELTSC: 5646457173] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5647406520] Running FREEZE-WORD.basic: : __freeze_test_word__ ; S" __free +[Hera] 245 +[Hera] [HADES][TEST ] [KRELTSC: 5649444822] Test passed +[Hera] [HADES][TEST ] Testing FREEZE-WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5650849575] Expected: Should print: -1 (word is now frozen) +[Hera] [HADES][TEST ] [KRELTSC: 5651832249] FREEZE-WORD: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5652867675] ▶ Testing module: v3/src/test_runner/modules/physics_freeze_w +[Hera] [HADES][TEST ] [KRELTSC: 5653965429] Testing word: UNFREEZE-WORD +[Hera] [HADES][TEST ] [KRELTSC: 5654756772] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5655660948] Running UNFREEZE-WORD.basic: : __unfreeze_test_word__ ; S" __ +[Hera] 270 +[Hera] [HADES][TEST ] [KRELTSC: 5657824557] Test passed +[Hera] [HADES][TEST ] Testing UNFREEZE-WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5659378074] Expected: Should print: 0 (freeze cleared) +[Hera] [HADES][TEST ] [KRELTSC: 5660327673] UNFREEZE-WORD: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5661335484] ▶ Testing module: v3/src/test_runner/modules/physics_freeze_w +[Hera] [HADES][TEST ] [KRELTSC: 5662386030] Testing word: FROZEN? +[Hera] [HADES][TEST ] [KRELTSC: 5663136549] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5663893179] Running FROZEN?.not_frozen: : __frozen_test_word__ ; S" __fro +[Hera] 224 +[Hera] [HADES][TEST ] [KRELTSC: 5665821819] Test passed +[Hera] [HADES][TEST ] Testing FROZEN? ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5667180561] Expected: Should print: 0 (freshly defined word is not froz +[Hera] [HADES][TEST ] [KRELTSC: 5668229511] Running FROZEN?.not_found: S" __nonexistent_freeze_xyz__" FRO +[Hera] 245 +[Hera] [HADES][TEST ] [KRELTSC: 5669573910] Test passed +[Hera] [HADES][TEST ] Testing FROZEN? ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5670914508] Expected: Should print: 0 (not-found treated as not frozen) +[Hera] [HADES][TEST ] [KRELTSC: 5672151324] FROZEN?: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5673053883] ▶ Testing module: v3/src/test_runner/modules/physics_freeze_w +[Hera] [HADES][TEST ] [KRELTSC: 5674118079] Testing word: HEAT! +[Hera] [HADES][TEST ] [KRELTSC: 5674850286] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5675634678] Running HEAT!.basic: : __heat_store_test_word__ ; 999 S" __he +[Hera] 249 +[Hera] [HADES][TEST ] [KRELTSC: 5677732347] Test passed +[Hera] [HADES][TEST ] Testing HEAT! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5679036909] Expected: Should print: 999 +[Hera] [HADES][TEST ] [KRELTSC: 5679875313] HEAT!: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5680809435] ▶ Testing module: v3/src/test_runner/modules/physics_freeze_w +[Hera] [HADES][TEST ] [KRELTSC: 5681860275] Testing word: HEAT@ +[Hera] [HADES][TEST ] [KRELTSC: 5682577215] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5683295478] Running HEAT@.of_fresh_word: : __heat_fetch_test_word__ ; S" +[Hera] 224 +[Hera] [HADES][TEST ] [KRELTSC: 5685360954] Test passed +[Hera] [HADES][TEST ] Testing HEAT@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5686728453] Expected: Should print: 0 (freshly defined word has zero he +[Hera] [HADES][TEST ] [KRELTSC: 5687807055] HEAT@: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5688708354] ▶ Testing module: v3/src/test_runner/modules/physics_freeze_w +[Hera] [HADES][TEST ] [KRELTSC: 5689764969] Testing word: DECAY-RATE@ +[Hera] [HADES][TEST ] [KRELTSC: 5690530776] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5691279321] Running DECAY-RATE@.basic: DECAY-RATE@ . CR +[Hera] 224 +[Hera] [HADES][TEST ] [KRELTSC: 5692677648] Test passed +[Hera] [HADES][TEST ] Testing DECAY-RATE@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5693994852] Expected: Should print the compile-time DECAY_RATE_PER_US_Q +[Hera] [HADES][TEST ] [KRELTSC: 5695058481] DECAY-RATE@: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5696005161] === Physics Freeze Words Summary: 0 passed, 0 failed, 0 skipped +[Hera] [HADES][INFO ] [KRELTSC: 5697268563] FINAL TEST SUMMARY: +[Hera] [HADES][INFO ] [KRELTSC: 5698057995] Total tests run: 1050 +[Hera] [HADES][INFO ] [KRELTSC: 5698821345] Passed: 1012 +[Hera] [HADES][INFO ] [KRELTSC: 5699593830] Failed: 0 +[Hera] [HADES][INFO ] [KRELTSC: 5700335088] Stubs (not yet implemented): 38 +[Hera] [HADES][INFO ] [KRELTSC: 5701214505] Errors: 0 +[Hera] [HADES][INFO ] [KRELTSC: 5701944276] ALL IMPLEMENTED TESTS PASSED! +[Hera] [HADES][INFO ] [KRELTSC: 5702765523] Contract checks (A4'/A1): all passed +[Hera] [HADES][INFO ] [KRELTSC: 5703661992] ============================================== +[Hera] PARITY:M7.1a word_count=530 here=0x00000000000000d8 latest_id=699 hash=0x08873e0f44b7cb2a +[Hera] PARITY:OK +[Hera] POST: PASSED +[Hera] [HAL][exec] regions frozen: +[Hera] kernel.text: [0x000000003d6f3000, 0x000000003d7463aa) +[Hera] VM: parity bootstrap complete +[Hera] PCI: init... +[Hera] PCI: ECAM mapped (amd64) +[Hera] virtio-rng: found device +[Hera] rng: backend = virtio-rng +[Hera] entropy: ready +[Hera] virtio-blk: found device +[Hera] Artemis: virtio-blk attached +[Hera] Artemis: genesis signature stamped +[Hera] virtio-input: no device on PCI bus 0 +[Hera] Init: Mama birth... +[Hera] [HADES][WARN ] [KRELTSC: 5839063125] capsule sig: init.4th: missing (unsigned) +[Hera] [HADES][WARN ] [KRELTSC: 5860261197] ( Unterminated comment +[Hera] [HADES][WARN ] [KRELTSC: 5865185970] ( Unterminated comment + +[Hera] ================================================ +[Hera] LithosAnanke — FORTH-79 bare-metal kernel +[Hera] Stadium step one: Hera alone +[Hera] ================================================ +[Hera] Hera [live] +[Hera] ================================================ + +[Hera] (no identity) +[Hera] PARITY:MAMA_INIT capsule_id=0xea038ba684c53443 mode=m capsule_hash=0xea038ba684c53443 dict_hash=0xe11082140cf86b05 +[Hera] Init: Mama birth OK +[Hera] ACL: CAPSULE-BIRTH pinned STRICT +[Hera] ACL: BIRTH pinned STRICT +[Hera] Starting heartbeat... +[Hera] APIC Timer: started (LVT=0x00020020 ICR=10067606) +[Hera] I/O APIC: keyboard IRQ1 unmasked +[Hera] Heartbeat running. +[Hera] Stadium words: promotions=422 evictions=0 +[Hera] Stadium conservation: resident_sum=43691 reservoir=21845 sum=65536 (Q48_ONE=65536) +[Hera] Stadium conservation: CONSERVED +[Hera] Stadium quota grant self-test: OK +[Hera] Hera reservoir=21845 +[Hera] test-vm reservoir=65536 +[Hera] Kernel-Hermes alloc/release self-test: Scan cross-check (counters vs arena): PASS +[Hera] scan_held_before_decay=8192 +[Hera] scan_held_after_decay=8148 +[Hera] Stage B (ledger + stadium_conserved): PASS +[Hera] vm_consumed=737 +[Hera] PASS +[Hera] audit_failures=0 +[Hera] decay_consumed=352 +[Hera] reservoir0=65536 +[Hera] Q_SLOT=2048 +[Hera] expected_n=32 +[Hera] got_n=32 +[Hera] reservoir_after_alloc=0 +[Hera] reservoir_final=65536 +[Hera] held(final)=0 +[Hera] pulled(final)=65536 +[Hera] returned(final)=65536 +[Hera] consumed(final)=0 +[Hera] Startup: birthing Hestia (fleet foundation)... +[Hestia] [HADES][WARN ] [KRELTSC: 6039692421] capsule sig: hestia:init.4th: missing (unsigned) +[Hestia] [HADES][WARN ] [KRELTSC: 6326247270] ( Unterminated comment +[Hestia] [HADES][WARN ] [KRELTSC: 6330874116] ( Unterminated comment +[Hestia] [HADES][WARN ] [KRELTSC: 6427153530] ( Unterminated comment +[Hestia] (no identity) +[Hestia] PARITY:BIRTH vm_id=0x3e417af7a996424b-0xac711f4444782b53 capsule_id=0x64e111990fbc45ff mode=p capsule_hash=0x64e111990fbc45ff dict_hash=0xb1256603f848e2b9 +[Hera] BIRTH: Hestia live +[Hera] Startup: Hestia live +[Hera] Startup: birthing Artemis (fleet foundation)... +[Artemis] [HADES][WARN ] [KRELTSC: 6584845008] capsule sig: artemis:init.4th: missing (unsigned) +[Artemis] Artemis: blank disk -- formatting +[Artemis] Artemis self-test... +[Artemis] 3076 allocated +[Artemis] 0.5u K after alloc +[Artemis] 0.5u K after free +[Artemis] PASS +[Artemis] Artemis: persist-write... +[Artemis] PASS: persist-write +[Artemis] Artemis ready +[Artemis] Artemis: 22998 data blocks +[Artemis] K-total=0.5u +[Artemis] ARTEMIS-K=1.5u +[Artemis] (no identity) +[Artemis] [HADES][WARN ] [KRELTSC: 19540291113] ( Unterminated comment +[Artemis] PARITY:BIRTH vm_id=0xf6f94b9c36ea463f-0xb8d8e10f85efa90b capsule_id=0xe6fba9ae56e1c916 mode=p capsule_hash=0xe6fba9ae56e1c916 dict_hash=0xc791409ac1715690 +[Hera] BIRTH: Artemis live +[Hera] Startup: Artemis live +[Hera] Heartbeat: 641 ticks, trust=0x00010000, variance=0x00000000 +[Hera] Kernel-Hermes common-channel fleet self-test: PASS +[Hera] common channel members=3 +[Hera] channel table capacity=50 +[Hera] Kernel-Hermes synthetic private-topic self-test: PASS +[Hera] Kernel-Hermes publish self-test: PASS +[Hera] Kernel-Hermes drain self-test: SKIPPED (Hermes not live) +[Hera] Kernel-Hermes chunk self-test: PASS +[Hera] Kernel-Hermes negotiation self-test: PASS +[Hera] Kernel-Hermes channel-open policy self-test: SKIPPED (Hera/Hermes not available) +[Hera] blkio_usb: MSC device ready +[Hera] Kernel-Hermes BLK-ATTACH-EVENT (real, Stage C): ledger held=2048 pulled=237568 returned=234783 consumed=737 stadium_conserved(Artemis)=true +[Hera] Zuse: genesis minted onto attached thumbdrive +[Hera] LithosAnanke v2.1.0 +[Hera] StarForth Version 3.2.0 + +[Hera] StarForth CLI +[Hera] FORTH-79 interpreter type BYE or power off to exit + +[zuse@Hera] ok>  \ No newline at end of file diff --git a/logs/20261003-100732/aarch64/qemu-aarch64-20261003-100732.log b/logs/20261003-100732/aarch64/qemu-aarch64-20261003-100732.log new file mode 100644 index 00000000..4ae2337a --- /dev/null +++ b/logs/20261003-100732/aarch64/qemu-aarch64-20261003-100732.log @@ -0,0 +1,9115 @@ +UEFI firmware (version 2025.11-3ubuntu7.2 built at 14:10:51 on Aug 26 2026) +[=3hBdsDxe: failed to load Boot0002 "UEFI Misc Device" from PciRoot(0x0)/Pci(0x2,0x0): Not Found +BdsDxe: failed to load Boot0003 "UEFI QEMU QEMU USB HARDDRIVE 1-0000:00:04.0-1" from PciRoot(0x0)/Pci(0x4,0x0)/USB(0x0,0x0): Not Found +BdsDxe: loading Boot0004 "UEFI Misc Device 2" from PciRoot(0x0)/Pci(0x6,0x0) +BdsDxe: starting Boot0004 "UEFI Misc Device 2" from PciRoot(0x0)/Pci(0x6,0x0) +[=3hStarKernel UEFI Loader +Loading kernel from ESP... +[CKPT 001] Entered efi_main - ConOut live +Collecting boot information... +[CKPT 004] Command line parsed +[CKPT 005] Kernel stack allocation decided +[CKPT 006] Boot info collected (ACPI table located) +[CKPT 007] GOP: linear framebuffer found +[CKPT 008] About to enter ExitBootServices retry loop + + + _____ _ _ __ _ + / ____| | | |/ / | | + | (___ | |_ __ _ _ __| ' / ___ _ __ _ __ ___| | + \___ \| __/ _` | '__| < / _ \ '__| '_ \ / _ \ | + ____) | || (_| | | | . \ __/ | | | | | __/ | + |_____/ \__\__,_|_| |_|\_\___|_| |_| |_|\___|_| + +LithosAnanke v2.1.0 +Architecture: aarch64 +Build: Oct 3 2026 10:07:08 + +UEFI BootServices: EXITED + +=== StarKernel Boot Information === +Memory map entries: 108 +Total memory: 4093 MB +Usable memory: 4056 MB +=================================== + +PMM initialized. +PMM statistics: + Total pages: 1039958 + Free pages : 1038547 + Used pages : 1411 + Total MB : 4062 + Free MB : 4056 + Used MB : 5 + +VMM initialized (mapped RAM, CR3 switched) +VMM initialized (mapped RAM, CR3 switched) +VMM self-test: mapped OK at 0xffff800000000000 +VMM self-test complete. + +AArch64: running at EL1 +IDT installed. + +APIC: init... +PSCI: no DTB -- using HVC (QEMU virt-machine default) +GICv2: no DTB GIC node -- using QEMU virt-machine defaults +GICv2: distributor+CPU interface enabled, PPI 30 +APIC: init done + +Timer: init... +Timer: AArch64 generic timer initialised. +Timer: init done + +Kernel heap initialized. +Heap statistics: + Total bytes: 2147483608 + Free bytes: 2147483608 + Used bytes: 0 + Peak bytes: 0 + Heap base addr: 1207959552 + Heap end addr: 3355443200 + +Heartbeat: init... +Heartbeat: init done +Kernel initialization complete. +Boot successful! + +Stadium: 335544 cells (20971 KB), 202 VM slots +Switch-signal: 202 slots +Kernel-Hermes: 202 channel slots +Kernel-Hermes: 202 pending-queue slots +VM: bootstrap parity... +VM arena allocated: 0x0000000040807000 + (5 MB) +[HADES][INFO ] [KRELTSC: 0] Registering FORTH-79 Standard word set... +[HADES][INFO ] [KRELTSC: 255057] Registering FORTH-79 arithmetic words... +[HADES][INFO ] [KRELTSC: 1790646] FORTH-79 Standard word set registration complete +[Hera] POST: Running comprehensive test suite... +[Hera] [HADES][INFO ] [KRELTSC: 3998049] Starting comprehensive FORTH-79 modular test suite... +[Hera] [HADES][INFO ] [KRELTSC: 4172992] ============================================== +[Hera] [HADES][INFO ] [KRELTSC: 4218788] +[Hera] === Testing Module: Stack Words === +[Hera] [HADES][INFO ] [KRELTSC: 4277488] Running Stack Words Tests (Module 1: Foundation)... +[Hera] [HADES][TEST ] [KRELTSC: 4319075] ▶ Testing module: v3/src/test_runner/modules/stack_words_test +[Hera] [HADES][TEST ] [KRELTSC: 4365264] Testing word: DUP +[Hera] [HADES][TEST ] [KRELTSC: 4395230] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4435380] Running DUP.basic: 5 DUP . . CR +[Hera] 5 5 +[Hera] [HADES][TEST ] [KRELTSC: 4846987] Test passed +[Hera] [HADES][TEST ] Testing DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4904777] Expected: Should print: 5 5 +[Hera] 5 5 +[Hera] 5 5 +[Hera] 5 5 +[Hera] 5 5 +[Hera] 5 5 +[Hera] [HADES][TEST ] [KRELTSC: 5195363] Running DUP.zero: 0 DUP . . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 5235097] Test passed +[Hera] [HADES][TEST ] Testing DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5285513] Expected: Should print: 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 5553273] Running DUP.negative: -42 DUP . . CR +[Hera] -42 -42 +[Hera] [HADES][TEST ] [KRELTSC: 5607039] Test passed +[Hera] [HADES][TEST ] Testing DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5659879] Expected: Should print: -42 -42 +[Hera] -42 -42 +[Hera] -42 -42 +[Hera] -42 -42 +[Hera] -42 -42 +[Hera] -42 -42 +[Hera] [HADES][TEST ] [KRELTSC: 5896002] Running DUP.max_int: 2147483647 DUP . . CR +[Hera] 2147483647 2147483647 +[Hera] [HADES][TEST ] [KRELTSC: 5958630] Test passed +[Hera] [HADES][TEST ] Testing DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6006478] Expected: Should duplicate max int +[Hera] 2147483647 2147483647 +[Hera] 2147483647 2147483647 +[Hera] 2147483647 2147483647 +[Hera] 2147483647 2147483647 +[Hera] 2147483647 2147483647 +[Hera] [HADES][TEST ] [KRELTSC: 6133350] Running DUP.min_int: -2147483648 DUP . . CR +[Hera] -2147483648 -2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 6178792] Test passed +[Hera] [HADES][TEST ] Testing DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6387060] Expected: Should duplicate min int +[Hera] -2147483648 -2147483648 +[Hera] -2147483648 -2147483648 +[Hera] -2147483648 -2147483648 +[Hera] -2147483648 -2147483648 +[Hera] -2147483648 -2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 6515385] Running DUP.empty_stack: DUP +[Hera] [HADES][ERROR] [KRELTSC: 6544259] DUP: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 6572175] Expected error occurred +[Hera] [HADES][TEST ] Testing DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6619389] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 6795532] DUP: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 6849952] ▶ Testing module: v3/src/test_runner/modules/stack_words_test +[Hera] [HADES][TEST ] [KRELTSC: 6887654] Testing word: DROP +[Hera] [HADES][TEST ] [KRELTSC: 6918990] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 6954055] Running DROP.basic: 5 7 DROP . CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 7021629] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7070939] Expected: Should print: 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 7332819] Running DROP.zero: 42 0 DROP . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 7373010] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7417942] Expected: Should drop zero, print 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 7634804] Running DROP.negative: 10 -5 DROP . CR +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 7696270] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7743875] Expected: Should drop negative, print 10 +[Hera] 10 +[Hera] 10 +[Hera] 10 +[Hera] 10 +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 7847786] Running DROP.double_drop: 1 2 3 DROP DROP . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 7890104] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7935144] Expected: Should print: 1 +[Hera] 1 +[Hera] [HADES][INFO ] [KRELTSC: 8269471] L8[TABLE]: Config 17 → 0 regime=2 score=26214 L1=0 L2=0 L3=0 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 8531130] Running DROP.triple_drop: 1 2 3 4 DROP DROP DROP . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 8575121] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8625089] Expected: Should print: 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 8724759] Running DROP.sequential: 5 DROP 6 DROP 7 . CR +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 8765761] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8960429] Expected: Should print: 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 9061176] Running DROP.single_item: 99 DROP DEPTH . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 9111675] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9165563] Expected: Should empty stack, depth=0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 9418660] Running DROP.depth_change: DEPTH 1 2 DROP DEPTH SWAP - . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 9478858] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9525701] Expected: Should change depth by 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 9634361] Running DROP.preserve_depth: DEPTH 5 6 DROP DROP DEPTH = . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 9818605] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9877492] Expected: Should preserve net depth +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][INFO ] [KRELTSC: 9983213] L8[TABLE]: Config 0 → 1 regime=2 score=26214 L1=0 L2=0 L3=0 L +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 10036398] Running DROP.max_int: 2147483647 DROP DEPTH . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 10078796] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10123401] Expected: Should drop max int +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 10362069] Running DROP.min_int: -2147483648 DROP DEPTH . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 10406266] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10452736] Expected: Should drop min int +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 10554432] Running DROP.with_dup: 5 DUP DROP . CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 10739631] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10784313] Expected: Should duplicate then drop +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 10883009] Running DROP.with_swap: 1 2 SWAP DROP . CR +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 10928628] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10974388] Expected: Should swap then drop +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 11215979] Running DROP.complex: 1 2 3 ROT DROP SWAP DROP . CR +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 11274404] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 11321050] Expected: Should handle complex sequence +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 11424832] Running DROP.empty_stack: DROP +[Hera] [HADES][ERROR] [KRELTSC: 11454695] DROP: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 11619934] Expected error occurred +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 11671522] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 11703059] DROP: 15 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 11736168] ▶ Testing module: v3/src/test_runner/modules/stack_words_test +[Hera] [HADES][TEST ] [KRELTSC: 11771908] Testing word: SWAP +[Hera] [HADES][TEST ] [KRELTSC: 11795550] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 11821335] Running SWAP.basic: 5 7 SWAP . . CR +[Hera] 5 7 +[Hera] [HADES][TEST ] [KRELTSC: 12008120] Test passed +[Hera] [HADES][TEST ] Testing SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 12056226] Expected: Should print: 7 5 +[Hera] 5 7 +[Hera] 5 7 +[Hera] 5 7 +[Hera] 5 7 +[Hera] 5 7 +[Hera] [HADES][TEST ] [KRELTSC: 12156874] Running SWAP.same_values: 42 42 SWAP . . CR +[Hera] 42 42 +[Hera] [HADES][TEST ] [KRELTSC: 12198284] Test passed +[Hera] [HADES][TEST ] Testing SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 12242420] Expected: Should print: 42 42 +[Hera] 42 42 +[Hera] 42 42 +[Hera] 42 42 +[Hera] 42 42 +[Hera] 42 [HADES][INFO ] [KRELTSC: 12504064] L8[TABLE]: Config 1 → 2 regime=2 score=26214 L1=0 L2=0 L3=0 L +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 12549065] Running SWAP.zero_nonzero: 0 99 SWAP . . CR +[Hera] 0 99 +[Hera] [HADES][TEST ] [KRELTSC: 12591593] Test passed +[Hera] [HADES][TEST ] Testing SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 12638794] Expected: Should print: 99 0 +[Hera] 0 99 +[Hera] 0 99 +[Hera] 0 99 +[Hera] 0 99 +[Hera] 0 99 +[Hera] [HADES][TEST ] [KRELTSC: 12911463] Running SWAP.negative: -5 10 SWAP . . CR +[Hera] -5 10 +[Hera] [HADES][TEST ] [KRELTSC: 12988160] Test passed +[Hera] [HADES][TEST ] Testing SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 13033602] Expected: Should print: 10 -5 +[Hera] -5 10 +[Hera] -5 10 +[Hera] -5 10 +[Hera] -5 10 +[Hera] -5 10 +[Hera] [HADES][TEST ] [KRELTSC: 13135201] Running SWAP.one_item: 42 SWAP +[Hera] [HADES][ERROR] [KRELTSC: 13284723] SWAP: Insufficient stack items (need 2) +[Hera] [HADES][TEST ] [KRELTSC: 13332568] Expected error occurred +[Hera] [HADES][TEST ] Testing SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 13381465] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 13413795] Running SWAP.empty_stack: SWAP +[Hera] [HADES][ERROR] [KRELTSC: 13443590] SWAP: Insufficient stack items (need 2) +[Hera] [HADES][TEST ] [KRELTSC: 13473128] Expected error occurred +[Hera] [HADES][TEST ] Testing SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 13520444] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 13550080] SWAP: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 13580957] ▶ Testing module: v3/src/test_runner/modules/stack_words_test +[Hera] [HADES][TEST ] [KRELTSC: 13758332] Testing word: OVER +[Hera] [HADES][TEST ] [KRELTSC: 13782769] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 13810810] Running OVER.basic: 5 7 OVER . . . CR +[Hera] 5 7 5 +[Hera] [HADES][TEST ] [KRELTSC: 13865709] Test passed +[Hera] [HADES][TEST ] Testing OVER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 13911896] Expected: Should print: 5 7 5 +[Hera] 5 7 5 +[Hera] 5 7 5 +[Hera] 5 7 5 +[Hera] 5 7 5 +[Hera] 5 7 5 +[Hera] [HADES][TEST ] [KRELTSC: 14013640] Running OVER.zeros: 0 0 OVER . . . CR +[Hera] 0 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 14191236] Test passed +[Hera] [HADES][TEST ] Testing OVER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 14239184] Expected: Should print: 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 14346591] Running OVER.mixed: -1 42 OVER . . . CR +[Hera] -1 42 -1 +[Hera] [HADES][TEST ] [KRELTSC: 14389843] Test passed +[Hera] [HADES][TEST ] Testing OVER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 14435860] Expected: Should print: -1 42 -1 +[Hera] -1 42 -1 +[Hera] -1 42 -1 +[Hera] -1 42 -1 +[Hera] -1 42 -1 +[Hera] -1 42 -1 +[Hera] [HADES][TEST ] [KRELTSC: 14682913] Running OVER.one_item: 42 OVER +[Hera] [HADES][ERROR] [KRELTSC: 14715672] OVER: Insufficient stack items (need 2) +[Hera] [HADES][TEST ] [KRELTSC: 14748095] Expected error occurred +[Hera] [HADES][TEST ] Testing OVER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 14797271] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 14827826] Running OVER.empty_stack: OVER +[Hera] [HADES][ERROR] [KRELTSC: 14855309] OVER: Insufficient stack items (need 2) +[Hera] [HADES][TEST ] [KRELTSC: 15014068] Expected error occurred +[Hera] [HADES][TEST ] Testing OVER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 15075809] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 15106804] OVER: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 15140137] ▶ Testing module: v3/src/test_runner/modules/stack_words_test +[Hera] [HADES][TEST ] [KRELTSC: 15179356] Testing word: ROT +[Hera] [HADES][TEST ] [KRELTSC: 15203214] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 15230657] Running ROT.basic: 1 2 3 ROT . . . CR +[Hera] 1 3 2 +[Hera] [HADES][TEST ] [KRELTSC: 15276833] Test passed +[Hera] [HADES][TEST ] Testing ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 15323377] Expected: Should print: 2 3 1 +[Hera] 1 3 2 +[Hera] 1 3 2 +[Hera] 1 3 2 +[Hera] 1 3 2 +[Hera] 1 3 2 +[Hera] [HADES][TEST ] [KRELTSC: 15568879] Running ROT.zeros: 0 0 0 ROT . . . CR +[Hera] [HADES][INFO ] [KRELTSC: 15604444] L8[TABLE]: Config 2 → 3 regime=2 score=26214 L1=0 L2=0 L3=0 L +[Hera] 0 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 15654586] Test passed +[Hera] [HADES][TEST ] Testing ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 15706534] Expected: Should print: 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 15954404] Running ROT.mixed: -1 0 1 ROT . . . CR +[Hera] -1 1 0 +[Hera] [HADES][TEST ] [KRELTSC: 15995285] Test passed +[Hera] [HADES][TEST ] Testing ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 16041358] Expected: Should print: 0 1 -1 +[Hera] -1 1 0 +[Hera] -1 1 0 +[Hera] -1 1 0 +[Hera] -1 1 0 +[Hera] -1 1 0 +[Hera] [HADES][TEST ] [KRELTSC: 16152473] Running ROT.two_items: 1 2 ROT +[Hera] [HADES][ERROR] [KRELTSC: 16183292] ROT: Insufficient stack items (need 3) +[Hera] [HADES][TEST ] [KRELTSC: 16349515] Expected error occurred +[Hera] [HADES][TEST ] Testing ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 16396403] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 16427301] Running ROT.one_item: 42 ROT +[Hera] [HADES][ERROR] [KRELTSC: 16460302] ROT: Insufficient stack items (need 3) +[Hera] [HADES][TEST ] [KRELTSC: 16491893] Expected error occurred +[Hera] [HADES][TEST ] Testing ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 16540427] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 16570556] Running ROT.empty_stack: ROT +[Hera] [HADES][ERROR] [KRELTSC: 16598632] ROT: Insufficient stack items (need 3) +[Hera] [HADES][TEST ] [KRELTSC: 16628252] Expected error occurred +[Hera] [HADES][TEST ] Testing ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 16811916] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 16843678] ROT: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 16873138] ▶ Testing module: v3/src/test_runner/modules/stack_words_test +[Hera] [HADES][TEST ] [KRELTSC: 16909088] Testing word: DEPTH +[Hera] [HADES][TEST ] [KRELTSC: 16934153] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 16960861] Running DEPTH.empty: DEPTH . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 17001833] Test passed +[Hera] [HADES][TEST ] Testing DEPTH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 17048638] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 17282146] Running DEPTH.one_item: 42 DEPTH . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 17321138] Test passed +[Hera] [HADES][TEST ] Testing DEPTH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 17369171] Expected: Should print: 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 17461422] Running DEPTH.multiple: 1 2 3 DEPTH . CR +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 17639275] Test passed +[Hera] [HADES][TEST ] Testing DEPTH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 17683603] Expected: Should print: 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 17786108] DEPTH: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 17817290] ▶ Testing module: v3/src/test_runner/modules/stack_words_test +[Hera] [HADES][TEST ] [KRELTSC: 17853351] Testing word: PICK +[Hera] [HADES][TEST ] [KRELTSC: 17878100] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 17904718] Running PICK.pick_0: 1 2 3 0 PICK . CR +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 18092746] Test passed +[Hera] [HADES][TEST ] Testing PICK ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 18136529] Expected: Should print: 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 18232892] Running PICK.pick_1: 1 2 3 1 PICK . CR +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 18271644] Test passed +[Hera] [HADES][TEST ] Testing PICK ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 18314899] Expected: Should print: 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] [HADES][INFO ] [KRELTSC: 18546542] L8[TABLE]: Config 3 → 4 regime=2 score=26214 L1=0 L2=0 L3=0 L +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 18597388] Running PICK.pick_2: 1 2 3 2 PICK . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 18637539] Test passed +[Hera] [HADES][TEST ] Testing PICK ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 18684198] Expected: Should print: 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 18777272] PICK: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 18930064] ▶ Testing module: v3/src/test_runner/modules/stack_words_test +[Hera] [HADES][TEST ] [KRELTSC: 18980349] Testing word: ROLL +[Hera] [HADES][TEST ] [KRELTSC: 19005232] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 19032977] Running ROLL.roll_1: 1 2 3 1 ROLL . . . CR +[Hera] 1 3 2 +[Hera] [HADES][TEST ] [KRELTSC: 19091319] Test passed +[Hera] [HADES][TEST ] Testing ROLL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 19134410] Expected: Should print: 1 3 2 +[Hera] 1 3 2 +[Hera] 1 3 2 +[Hera] 1 3 2 +[Hera] 1 3 2 +[Hera] 1 3 2 +[Hera] [HADES][TEST ] [KRELTSC: 19371438] Running ROLL.roll_2: 1 2 3 2 ROLL . . . CR +[Hera] 2 3 1 +[Hera] [HADES][TEST ] [KRELTSC: 19430706] Test passed +[Hera] [HADES][TEST ] Testing ROLL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 19478400] Expected: Should print: 2 3 1 +[Hera] 2 3 1 +[Hera] 2 3 1 +[Hera] 2 3 1 +[Hera] 2 3 1 +[Hera] 2 3 1 +[Hera] [HADES][TEST ] [KRELTSC: 19583805] ROLL: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 19615332] ▶ Testing module: v3/src/test_runner/modules/stack_words_test +[Hera] [HADES][TEST ] [KRELTSC: 19649823] Testing word: ?DUP +[Hera] [HADES][TEST ] [KRELTSC: 19808782] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 19834484] Running ?DUP.nonzero: 42 ?DUP . . CR +[Hera] 42 42 +[Hera] [HADES][TEST ] [KRELTSC: 19889757] Test passed +[Hera] [HADES][TEST ] Testing ?DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 19936126] Expected: Should print: 42 42 +[Hera] 42 42 +[Hera] 42 42 +[Hera] 42 42 +[Hera] 42 42 +[Hera] 42 42 +[Hera] [HADES][TEST ] [KRELTSC: 20037411] Running ?DUP.negative: -5 ?DUP . . CR +[Hera] -5 -5 +[Hera] [HADES][TEST ] [KRELTSC: 20076735] Test passed +[Hera] [HADES][TEST ] Testing ?DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 20252289] Expected: Should print: -5 -5 +[Hera] -5 -5 +[Hera] -5 -5 +[Hera] -5 -5 +[Hera] -5 -5 +[Hera] -5 -5 +[Hera] [HADES][TEST ] [KRELTSC: 20359228] Running ?DUP.zero: 0 ?DUP DEPTH . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 20401002] Test passed +[Hera] [HADES][TEST ] Testing ?DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 20444019] Expected: Should not dup: depth 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 20681133] Running ?DUP.empty_stack: ?DUP +[Hera] [HADES][ERROR] [KRELTSC: 20711156] ?DUP: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 20736625] Expected error occurred +[Hera] [HADES][TEST ] Testing ?DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 20788408] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 20819510] ?DUP: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 20851181] ▶ Testing module: v3/src/test_runner/modules/stack_words_test +[Hera] [HADES][TEST ] [KRELTSC: 20887615] Testing word: -ROT +[Hera] [HADES][TEST ] [KRELTSC: 20912085] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 20938540] Running -ROT.basic: 1 2 3 -ROT . . . CR +[Hera] 2 1 3 +[Hera] [HADES][TEST ] [KRELTSC: 21120328] Test passed +[Hera] [HADES][TEST ] Testing -ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 21166799] Expected: Should print: 1 3 2 +[Hera] [HADES][INFO ] [KRELTSC: 21201608] L8[TABLE]: Config 4 → 5 regime=2 score=26214 L1=0 L2=0 L3=0 L +[Hera] 2 1 3 +[Hera] 2 1 3 +[Hera] 2 1 3 +[Hera] 2 1 3 +[Hera] 2 1 3 +[Hera] [HADES][TEST ] [KRELTSC: 21318191] Running -ROT.zeros: 0 0 0 -ROT . . . CR +[Hera] 0 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 21358824] Test passed +[Hera] [HADES][TEST ] Testing -ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 21528821] Expected: Should print: 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 21647979] Running -ROT.roundtrip: 1 2 3 -ROT ROT . . . CR +[Hera] 3 2 1 +[Hera] [HADES][TEST ] [KRELTSC: 21692520] Test passed +[Hera] [HADES][TEST ] Testing -ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 21737099] Expected: Should restore original order +[Hera] 3 2 1 +[Hera] 3 2 1 +[Hera] 3 2 1 +[Hera] 3 2 1 +[Hera] 3 2 1 +[Hera] [HADES][TEST ] [KRELTSC: 21986317] Running -ROT.two_items: 1 2 -ROT +[Hera] [HADES][ERROR] [KRELTSC: 22021946] -ROT: Insufficient stack items (need 3) +[Hera] [HADES][TEST ] [KRELTSC: 22052085] Expected error occurred +[Hera] [HADES][TEST ] Testing -ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 22102609] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 22134634] Running -ROT.empty_stack: -ROT +[Hera] [HADES][ERROR] [KRELTSC: 22163803] -ROT: Insufficient stack items (need 3) +[Hera] [HADES][TEST ] [KRELTSC: 22193623] Expected error occurred +[Hera] [HADES][TEST ] Testing -ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 22242927] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 22394753] -ROT: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 22441921] === Stack Words Summary: 0 passed, 0 failed, 0 skipped, 0 error +[Hera] [HADES][INFO ] [KRELTSC: 22482694] +[Hera] === Testing Module: Return Stack Words === +[Hera] [HADES][INFO ] [KRELTSC: 22523278] Running Return Stack Words Tests (Module 2)... +[Hera] [HADES][TEST ] [KRELTSC: 22558156] ▶ Testing module: v3/src/test_runner/modules/return_stack_wor +[Hera] [HADES][TEST ] [KRELTSC: 22596843] Testing word: >R +[Hera] [HADES][TEST ] [KRELTSC: 22620633] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 22647220] Running >R.basic: 42 >R R@ . R> . CR +[Hera] 42 42 +[Hera] [HADES][TEST ] [KRELTSC: 22717830] Test passed +[Hera] [HADES][TEST ] Testing >R ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 22905346] Expected: Should print: 42 42 +[Hera] 42 42 +[Hera] 42 42 +[Hera] 42 42 +[Hera] 42 42 +[Hera] 42 42 +[Hera] [HADES][TEST ] [KRELTSC: 23013811] Running >R.zero: 0 >R R@ . R> . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 23053108] Test passed +[Hera] [HADES][TEST ] Testing >R ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 23099194] Expected: Should print: 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 23334038] Running >R.negative: -123 >R R@ . R> . CR +[Hera] -123 -123 +[Hera] [HADES][TEST ] [KRELTSC: 23375457] Test passed +[Hera] [HADES][TEST ] Testing >R ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 23422823] Expected: Should print: -123 -123 +[Hera] -123 -123 +[Hera] -123 -123 +[Hera] -123 -123 [HADES][INFO ] [KRELTSC: 23498566] L8[TABLE]: Config 5 → 6 regime=2 score=26214 L1=0 L2=0 L3=0 L + +[Hera] -123 -123 +[Hera] -123 -123 +[Hera] [HADES][TEST ] [KRELTSC: 23566956] Running >R.multiple: 1 2 >R >R R@ . R> . R@ . R> . CR +[Hera] 1 1 2 2 +[Hera] [HADES][TEST ] [KRELTSC: 23754722] Test passed +[Hera] [HADES][TEST ] Testing >R ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 23800747] Expected: Should print: 2 2 1 1 +[Hera] 1 1 2 2 +[Hera] 1 1 2 2 +[Hera] 1 1 2 2 +[Hera] 1 1 2 2 +[Hera] 1 1 2 2 +[Hera] [HADES][TEST ] [KRELTSC: 23915823] Running >R.empty_stack: >R +[Hera] [HADES][ERROR] [KRELTSC: 23947071] >R: DSP underflow +[Hera] [HADES][TEST ] [KRELTSC: 23971246] Expected error occurred +[Hera] [HADES][TEST ] Testing >R ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 24163766] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 24206509] >R: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 24240007] ▶ Testing module: v3/src/test_runner/modules/return_stack_wor +[Hera] [HADES][TEST ] [KRELTSC: 24278223] Testing word: R> +[Hera] [HADES][TEST ] [KRELTSC: 24301999] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 24329021] Running R>.basic: 42 >R R> . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 24371318] Test passed +[Hera] [HADES][TEST ] Testing R> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 24417198] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 24655432] Running R>.lifo_order: 1 2 >R >R R> . R> . CR +[Hera] 1 2 +[Hera] [HADES][TEST ] [KRELTSC: 24698675] Test passed +[Hera] [HADES][TEST ] Testing R> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 24745943] Expected: Should print: 2 1 +[Hera] 1 2 +[Hera] 1 2 +[Hera] 1 2 +[Hera] 1 2 +[Hera] 1 2 +[Hera] [HADES][TEST ] [KRELTSC: 24856096] Running R>.empty_rstack: R> +[Hera] [HADES][ERROR] [KRELTSC: 25009602] R>: RSP underflow +[Hera] [HADES][TEST ] [KRELTSC: 25051313] Expected error occurred +[Hera] [HADES][TEST ] Testing R> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 25099617] Expected: Should cause return stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 25131773] R>: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 25163134] ▶ Testing module: v3/src/test_runner/modules/return_stack_wor +[Hera] [HADES][TEST ] [KRELTSC: 25198966] Testing word: R@ +[Hera] [HADES][TEST ] [KRELTSC: 25227179] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 25254217] Running R@.basic: 42 >R R@ . R> DROP CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 25301294] Test passed +[Hera] [HADES][TEST ] Testing R@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 25482488] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 25588401] Running R@.non_destructive: 99 >R R@ R@ = . R> DROP CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 25632554] Test passed +[Hera] [HADES][TEST ] Testing R@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 25679353] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 [HADES][INFO ] [KRELTSC: 25870035] L8[TABLE]: Config 6 → 7 regime=2 score=26214 L1=0 L2=0 L3=0 L + +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 25960730] Running R@.empty_rstack: R@ +[Hera] [HADES][ERROR] [KRELTSC: 25991159] R@: RSP underflow +[Hera] [HADES][TEST ] [KRELTSC: 26015998] Expected error occurred +[Hera] [HADES][TEST ] Testing R@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 26063778] Expected: Should cause return stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 26096190] R@: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 26129281] === Return Stack Words Summary: 0 passed, 0 failed, 0 skipped, +[Hera] [HADES][INFO ] [KRELTSC: 26166152] +[Hera] === Testing Module: Memory Words === +[Hera] [HADES][INFO ] [KRELTSC: 26344764] Running Memory Words Tests (Module 3)... +[Hera] [HADES][TEST ] [KRELTSC: 26378649] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 26416489] Testing word: ! +[Hera] [HADES][TEST ] [KRELTSC: 26440166] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 26466919] Running !.basic: 42 HERE ! HERE @ . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 26521943] Test passed +[Hera] [HADES][TEST ] Testing ! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 26566757] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 26804146] Running !.zero: 0 HERE ! HERE @ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 26844293] Test passed +[Hera] [HADES][TEST ] Testing ! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 26890491] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 26987489] Running !.negative: -999 HERE ! HERE @ . CR +[Hera] -999 +[Hera] [HADES][TEST ] [KRELTSC: 27028213] Test passed +[Hera] [HADES][TEST ] Testing ! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 27211722] Expected: Should print: -999 +[Hera] -999 +[Hera] -999 +[Hera] -999 +[Hera] -999 +[Hera] -999 +[Hera] [HADES][TEST ] [KRELTSC: 27317703] Running !.overwrite: 111 HERE ! 222 HERE ! HERE @ . CR +[Hera] 222 +[Hera] [HADES][TEST ] [KRELTSC: 27363393] Test passed +[Hera] [HADES][TEST ] Testing ! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 27409400] Expected: Should print: 222 +[Hera] 222 +[Hera] 222 +[Hera] 222 +[Hera] 222 +[Hera] 222 +[Hera] [HADES][TEST ] [KRELTSC: 27657347] Running !.max_int: 2147483647 HERE ! HERE @ . CR +[Hera] 2147483647 +[Hera] [HADES][TEST ] [KRELTSC: 27702995] Test passed +[Hera] [HADES][TEST ] Testing ! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 27748577] Expected: Should store max int +[Hera] 2147483647 +[Hera] 2147483647 +[Hera] 2147483647 +[Hera] 2147483647 +[Hera] 2147483647 +[Hera] [HADES][TEST ] [KRELTSC: 27862543] Running !.min_int: -2147483648 HERE ! HERE @ . CR +[Hera] -2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 27908940] Test passed +[Hera] [HADES][TEST ] Testing ! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 28091706] Expected: Should store min int +[Hera] [HADES][INFO ] [KRELTSC: 28126495] L8[TABLE]: Config 7 → 8 regime=2 score=6553 L1=0 L2=0 L3=0 L4 +[Hera] -2147483648 +[Hera] -2147483648 +[Hera] -2147483648 +[Hera] -2147483648 +[Hera] -2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 28256622] Running !.empty_stack: ! +[Hera] [HADES][TEST ] [KRELTSC: 28286819] Expected error occurred +[Hera] [HADES][TEST ] Testing ! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 28334817] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 28491338] Running !.one_item: 42 ! +[Hera] [HADES][TEST ] [KRELTSC: 28535621] Expected error occurred +[Hera] [HADES][TEST ] Testing ! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 28584948] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 28616538] !: 8 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 28651619] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 28685340] Testing word: @ +[Hera] [HADES][TEST ] [KRELTSC: 28709109] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 28736734] Running @.after_store: 123 HERE ! HERE @ . CR +[Hera] 123 +[Hera] [HADES][TEST ] [KRELTSC: 28781992] Test passed +[Hera] [HADES][TEST ] Testing @ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 28966262] Expected: Should print: 123 +[Hera] 123 +[Hera] 123 +[Hera] 123 +[Hera] 123 +[Hera] 123 +[Hera] [HADES][TEST ] [KRELTSC: 29071507] Running @.multiple_reads: 456 HERE ! HERE @ HERE @ = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 29118011] Test passed +[Hera] [HADES][TEST ] Testing @ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 29165318] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 29406783] Running @.empty_stack: @ +[Hera] [HADES][TEST ] [KRELTSC: 29434564] Expected error occurred +[Hera] [HADES][TEST ] Testing @ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 29482574] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 29516143] @: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 29547027] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 29584737] Testing word: C! +[Hera] [HADES][TEST ] [KRELTSC: 29608835] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 29634646] Running C!.basic: 65 HERE C! HERE C@ . CR +[Hera] 65 +[Hera] [HADES][TEST ] [KRELTSC: 29841079] Test passed +[Hera] [HADES][TEST ] Testing C! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 29886873] Expected: Should print: 65 +[Hera] 65 +[Hera] 65 +[Hera] 65 +[Hera] 65 +[Hera] 65 +[Hera] [HADES][TEST ] [KRELTSC: 29987771] Running C!.zero: 0 HERE C! HERE C@ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 30035301] Test passed +[Hera] [HADES][TEST ] Testing C! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 30080828] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 30325879] Running C!.high_byte: 255 HERE C! HERE C@ . CR +[Hera] 255 +[Hera] [HADES][TEST ] [KRELTSC: 30370603] Test passed +[Hera] [HADES][TEST ] Testing C! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 30416145] Expected: Should print: 255 +[Hera] 255 +[Hera] 255 +[Hera] 255 +[Hera] [HADES][INFO ] [KRELTSC: 30490458] L8[TABLE]: Config 8 → 9 regime=2 score=6553 L1=0 L2=0 L3=0 L4 +[Hera] 255 +[Hera] 255 +[Hera] [HADES][TEST ] [KRELTSC: 30704425] Running C!.truncation: 256 HERE C! HERE C@ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 30746959] Test passed +[Hera] [HADES][TEST ] Testing C! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 30793517] Expected: Should print: 0 (truncated) +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 30895476] C!: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 30925730] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 30961485] Testing word: C@ +[Hera] [HADES][TEST ] [KRELTSC: 31110429] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 31149096] Running C@.after_cstore: 97 HERE C! HERE C@ . CR +[Hera] 97 +[Hera] [HADES][TEST ] [KRELTSC: 31200462] Test passed +[Hera] [HADES][TEST ] Testing C@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 31246635] Expected: Should print: 97 +[Hera] 97 +[Hera] 97 +[Hera] 97 +[Hera] 97 +[Hera] 97 +[Hera] [HADES][TEST ] [KRELTSC: 31347123] Running C@.zero_byte: 0 HERE C! HERE C@ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 31390781] Test passed +[Hera] [HADES][TEST ] Testing C@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 31577500] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 31682468] C@: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 31713991] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 31751231] Testing word: , +[Hera] [HADES][TEST ] [KRELTSC: 31775851] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 31801912] Running ,.basic: 42 , HERE 8 - @ . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 31990034] Test passed +[Hera] [HADES][TEST ] Testing , ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 32038898] Expected: Should compile 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 32142540] Running ,.negative: -999 , HERE 8 - @ . CR +[Hera] -999 +[Hera] [HADES][TEST ] [KRELTSC: 32185139] Test passed +[Hera] [HADES][TEST ] Testing , ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 32231380] Expected: Should compile -999 +[Hera] -999 +[Hera] -999 +[Hera] -999 +[Hera] -999 +[Hera] -999 +[Hera] [HADES][TEST ] [KRELTSC: 32484138] ,: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 32514178] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 32551854] Testing word: C, +[Hera] [HADES][TEST ] [KRELTSC: 32575341] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 32602464] Running C,.basic: 65 C, HERE 1 - C@ . CR +[Hera] 65 +[Hera] [HADES][TEST ] [KRELTSC: 32655375] Test passed +[Hera] [HADES][TEST ] Testing C, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 32836579] Expected: Should compile byte 65 +[Hera] 65 +[Hera] 65 +[Hera] [HADES][INFO ] [KRELTSC: 33534749] L8[TABLE]: Config 9 → 10 regime=2 score=6553 L1=0 L2=0 L3=0 L +[Hera] 65 +[Hera] 65 +[Hera] 65 +[Hera] [HADES][TEST ] [KRELTSC: 33779170] Running C,.zero: 0 C, HERE 1 - C@ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 33849839] Test passed +[Hera] [HADES][TEST ] Testing C, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 33897821] Expected: Should compile byte 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 34161315] C,: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 34194533] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 34268233] Testing word: 2, +[Hera] [HADES][TEST ] [KRELTSC: 34293373] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 34319220] Running 2,.roundtrip: 12345 67890 2, HERE 16 - 2@ . . CR +[Hera] 67890 12345 +[Hera] [HADES][TEST ] [KRELTSC: 34388830] Test passed +[Hera] [HADES][TEST ] Testing 2, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 34433434] Expected: Should print: 67890 12345 +[Hera] 67890 12345 +[Hera] 67890 12345 +[Hera] 67890 12345 +[Hera] 67890 12345 +[Hera] 67890 12345 +[Hera] [HADES][TEST ] [KRELTSC: 34696075] Running 2,.save-and-verify: 12345 67890 2, HERE 16 - 2@ 67890 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 34756181] Test passed +[Hera] [HADES][TEST ] Testing 2, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 34802423] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 35063571] 2,: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 35097827] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 35133089] Testing word: HERE +[Hera] [HADES][TEST ] [KRELTSC: 35159890] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 35185078] Running HERE.basic: HERE HERE = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 35225957] Test passed +[Hera] [HADES][TEST ] Testing HERE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 35274738] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 35522811] Running HERE.after_comma: HERE 42 , HERE SWAP - 1 CELLS = 0 S +[Hera] [HADES][INFO ] [KRELTSC: 35563110] L8[TABLE]: Config 10 → 11 regime=2 score=6553 L1=0 L2=0 L3=0 +[Hera] [HADES][TEST ] [KRELTSC: 35613577] Test passed +[Hera] [HADES][TEST ] Testing HERE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 35658694] Expected: Asserts HERE advances by exactly 1 CELLS (8 bytes +[Hera] [HADES][TEST ] [KRELTSC: 35730474] HERE: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 35759567] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 35940360] Testing word: ALLOT +[Hera] [HADES][TEST ] [KRELTSC: 35977718] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 36025185] Running ALLOT.basic: HERE 10 ALLOT HERE SWAP - . CR +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 36083368] Test passed +[Hera] [HADES][TEST ] Testing ALLOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 36131813] Expected: Should print: 10 +[Hera] 10 +[Hera] 10 +[Hera] 10 +[Hera] 10 +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 36391934] Running ALLOT.zero: HERE 0 ALLOT HERE SWAP - . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 36437541] Test passed +[Hera] [HADES][TEST ] Testing ALLOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 36485678] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 36587839] Running ALLOT.negative: HERE -4 ALLOT HERE SWAP - . CR +[Hera] -4 +[Hera] [HADES][TEST ] [KRELTSC: 36779928] Test passed +[Hera] [HADES][TEST ] Testing ALLOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 36827488] Expected: Should print: -4 +[Hera] -4 +[Hera] -4 +[Hera] -4 +[Hera] -4 +[Hera] -4 +[Hera] [HADES][TEST ] [KRELTSC: 36931645] ALLOT: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 36962251] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 37000039] Testing word: PAD +[Hera] [HADES][TEST ] [KRELTSC: 37024704] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 37180886] Running PAD.basic: PAD PAD = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 37240902] Test passed +[Hera] [HADES][TEST ] Testing PAD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 37288386] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 37387352] Running PAD.different_from_here: PAD HERE = . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 37431145] Test passed +[Hera] [HADES][TEST ] Testing PAD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 37601808] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 [HADES][INFO ] [KRELTSC: 37675649] L8[TABLE]: Config 11 → 12 regime=2 score=6553 L1=0 L2=0 L3=0 + +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 37751905] PAD: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 37784684] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 37821104] Testing word: +! +[Hera] [HADES][TEST ] [KRELTSC: 37846346] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 37873833] Running +!.basic: 10 HERE ! 5 HERE +! HERE @ . CR +[Hera] 15 +[Hera] [HADES][TEST ] [KRELTSC: 38062667] Test passed +[Hera] [HADES][TEST ] Testing +! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 38115163] Expected: Should print: 15 +[Hera] 15 +[Hera] 15 +[Hera] 15 +[Hera] 15 +[Hera] 15 +[Hera] [HADES][TEST ] [KRELTSC: 38222347] Running +!.by_zero: 42 HERE ! 0 HERE +! HERE @ . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 38266286] Test passed +[Hera] [HADES][TEST ] Testing +! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 38313106] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 38564349] Running +!.negative: 10 HERE ! -3 HERE +! HERE @ . CR +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 38608669] Test passed +[Hera] [HADES][TEST ] Testing +! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 38653896] Expected: Should print: 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 38755773] Running +!.accumulate: 0 HERE ! 1 HERE +! 2 HERE +! 3 HERE +! +[Hera] 6 +[Hera] [HADES][TEST ] [KRELTSC: 38943111] Test passed +[Hera] [HADES][TEST ] Testing +! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 38993727] Expected: Should print: 6 +[Hera] 6 +[Hera] 6 +[Hera] [HADES][INFO ] [KRELTSC: 39060033] L8[TABLE]: Config 12 → 13 regime=2 score=6553 L1=0 L2=0 L3=0 +[Hera] 6 +[Hera] 6 +[Hera] 6 +[Hera] [HADES][TEST ] [KRELTSC: 39143981] Running +!.empty_stack: +! +[Hera] [HADES][TEST ] [KRELTSC: 39174063] Expected error occurred +[Hera] [HADES][TEST ] Testing +! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 39359148] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 39393431] +!: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 39426129] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 39463978] Testing word: -! +[Hera] [HADES][TEST ] [KRELTSC: 39489061] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 39515155] Running -!.basic: 10 HERE ! 3 HERE -! HERE @ . CR +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 39570328] Test passed +[Hera] [HADES][TEST ] Testing -! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 39619323] Expected: Should print: 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 39862513] Running -!.by_zero: 42 HERE ! 0 HERE -! HERE @ . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 39907111] Test passed +[Hera] [HADES][TEST ] Testing -! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 39951863] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 40061389] Running -!.negative: 10 HERE ! -5 HERE -! HERE @ . CR +[Hera] 15 +[Hera] [HADES][TEST ] [KRELTSC: 40251958] Test passed +[Hera] [HADES][TEST ] Testing -! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 40297444] Expected: Should print: 15 +[Hera] 15 +[Hera] 15 +[Hera] 15 +[Hera] 15 +[Hera] 15 +[Hera] [HADES][TEST ] [KRELTSC: 40401950] Running -!.empty_stack: -! +[Hera] [HADES][TEST ] [KRELTSC: 40430355] Expected error occurred +[Hera] [HADES][TEST ] Testing -! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 40480777] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 40512735] -!: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 40665951] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 40722009] Testing word: 2! +[Hera] [HADES][TEST ] [KRELTSC: 40745805] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 40776135] Running 2!.basic: 11 22 HERE 2! HERE @ . HERE 8 + @ . CR +[Hera] 11 22 +[Hera] [HADES][TEST ] [KRELTSC: 40840538] Test passed +[Hera] [HADES][TEST ] Testing 2! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 40887190] Expected: Should print: 22 11 +[Hera] 11 22 +[Hera] 11 22 [HADES][INFO ] [KRELTSC: 40947460] L8[TABLE]: Config 13 → 14 regime=2 score=6553 L1=0 L2=0 L3=0 + +[Hera] 11 22 +[Hera] 11 22 +[Hera] 11 22 +[Hera] [HADES][TEST ] [KRELTSC: 41181434] Running 2!.zeros: 0 0 HERE 2! HERE @ . HERE 8 + @ . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 41229409] Test passed +[Hera] [HADES][TEST ] Testing 2! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 41273652] Expected: Should print: 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 41381671] Running 2!.negative: -1 -2 HERE 2! HERE @ . HERE 8 + @ . CR +[Hera] -1 -2 +[Hera] [HADES][TEST ] [KRELTSC: 41566644] Test passed +[Hera] [HADES][TEST ] Testing 2! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 41613441] Expected: Should print: -2 -1 +[Hera] -1 -2 +[Hera] -1 -2 +[Hera] -1 -2 +[Hera] -1 -2 +[Hera] -1 -2 +[Hera] [HADES][TEST ] [KRELTSC: 41724148] Running 2!.empty_stack: 2! +[Hera] [HADES][TEST ] [KRELTSC: 41754364] Expected error occurred +[Hera] [HADES][TEST ] Testing 2! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 41804583] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 41981912] 2!: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 42013628] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 42051294] Testing word: FILL +[Hera] [HADES][TEST ] [KRELTSC: 42077808] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 42105395] Running FILL.basic: HERE 8 65 FILL HERE C@ . HERE 1+ C@ . CR +[Hera] 65 65 +[Hera] [HADES][TEST ] [KRELTSC: 42170933] Test passed +[Hera] [HADES][TEST ] Testing FILL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 42219059] Expected: Should print: 65 65 +[Hera] 65 65 +[Hera] 65 65 +[Hera] 65 65 +[Hera] 65 65 [HADES][INFO ] [KRELTSC: 42463588] L8[TABLE]: Config 14 → 15 regime=2 score=6553 L1=0 L2=0 L3=0 + +[Hera] 65 65 +[Hera] [HADES][TEST ] [KRELTSC: 42517582] Running FILL.zero_n: HERE 0 88 FILL +[Hera] [HADES][TEST ] [KRELTSC: 42547902] Test passed +[Hera] [HADES][TEST ] Testing FILL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 42594023] Expected: Should do nothing +[Hera] [HADES][TEST ] [KRELTSC: 42649561] Running FILL.zero_byte: HERE 4 0 FILL HERE C@ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 42691727] Test passed +[Hera] [HADES][TEST ] Testing FILL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 42893099] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 42997063] Running FILL.empty_stack: FILL +[Hera] [HADES][TEST ] [KRELTSC: 43027369] Expected error occurred +[Hera] [HADES][TEST ] Testing FILL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 43082227] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 43113412] FILL: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 43280075] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 43316855] Testing word: MOVE +[Hera] [HADES][TEST ] [KRELTSC: 43341860] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 43369664] Running MOVE.basic: HERE 65 OVER C! HERE 1+ 66 OVER C! HERE H +[Hera] 65 66 +[Hera] [HADES][TEST ] [KRELTSC: 43447673] Test passed +[Hera] [HADES][TEST ] Testing MOVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 43499522] Expected: Should print: 65 66 +[Hera] 65 66 +[Hera] 65 66 +[Hera] 65 66 +[Hera] 65 66 +[Hera] 65 66 +[Hera] [HADES][TEST ] [KRELTSC: 43765563] Running MOVE.zero_n: HERE HERE 8 + 0 MOVE +[Hera] [HADES][TEST ] [KRELTSC: 43802640] Test passed +[Hera] [HADES][TEST ] Testing MOVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 43855664] Expected: Should do nothing +[Hera] [HADES][INFO ] [KRELTSC: 43893731] L8[TABLE]: Config 15 → 16 regime=2 score=26214 L1=0 L2=0 L3=1 +[Hera] [HADES][TEST ] [KRELTSC: 43960127] Running MOVE.empty_stack: MOVE +[Hera] [HADES][TEST ] [KRELTSC: 44124544] Expected error occurred +[Hera] [HADES][TEST ] Testing MOVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 44177281] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 44210893] MOVE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 44242729] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 44279716] Testing word: ERASE +[Hera] [HADES][TEST ] [KRELTSC: 44305053] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 44331175] Running ERASE.basic: HERE 4 65 FILL HERE 4 ERASE HERE C@ . HE +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 44393193] Test passed +[Hera] [HADES][TEST ] Testing ERASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 44573666] Expected: Should print: 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 44694108] Running ERASE.zero_n: HERE 0 ERASE +[Hera] [HADES][TEST ] [KRELTSC: 44724963] Test passed +[Hera] [HADES][TEST ] Testing ERASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 44771237] Expected: Should do nothing +[Hera] [HADES][TEST ] [KRELTSC: 44823847] Running ERASE.empty_stack: ERASE +[Hera] [HADES][TEST ] [KRELTSC: 44853761] Expected error occurred +[Hera] [HADES][TEST ] Testing ERASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 45037417] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 45068384] ERASE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 45105104] === Memory Words Summary: 0 passed, 0 failed, 0 skipped, 0 erro +[Hera] [HADES][INFO ] [KRELTSC: 45172463] +[Hera] === Testing Module: Arithmetic Words === +[Hera] [HADES][INFO ] [KRELTSC: 45214218] Running Arithmetic Words Tests (Module 5)... +[Hera] [HADES][TEST ] [KRELTSC: 45247935] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 45284736] Testing word: + +[Hera] [HADES][TEST ] [KRELTSC: 45434367] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 45471949] Running +.basic: 5 7 + . CR +[Hera] 12 +[Hera] [HADES][TEST ] [KRELTSC: 45513709] Test passed +[Hera] [HADES][TEST ] Testing + ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 45558836] Expected: Should print: 12 +[Hera] 12 +[Hera] 12 +[Hera] 12 +[Hera] 12 +[Hera] 12 +[Hera] [HADES][TEST ] [KRELTSC: 45654840] Running +.zero_add: 42 0 + . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 45692529] Test passed +[Hera] [HADES][TEST ] Testing + ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 45739835] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 45975195] Running +.negative: -5 3 + . CR +[Hera] -2 +[Hera] [HADES][TEST ] [KRELTSC: 46014037] Test passed +[Hera] [HADES][TEST ] Testing + ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 46058086] Expected: Should print: -2 +[Hera] -2 +[Hera] -2 +[Hera] -2 +[Hera] -2 +[Hera] -2 +[Hera] [HADES][TEST ] [KRELTSC: 46153390] Running +.both_negative: -5 -3 + . CR +[Hera] -8 +[Hera] [HADES][TEST ] [KRELTSC: 46330121] Test passed +[Hera] [HADES][TEST ] Testing + ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 46376000] Expected: Should print: -8 +[Hera] -8 +[Hera] -8 +[Hera] -8 +[Hera] -8 +[Hera] [HADES][INFO ] [KRELTSC: 46463250] L8[TABLE]: Config 16 → 18 regime=2 score=26214 L1=0 L2=0 L3=1 +[Hera] -8 +[Hera] [HADES][TEST ] [KRELTSC: 46513413] Running +.overflow: 2147483647 1 + . CR +[Hera] 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 46558366] Test passed +[Hera] [HADES][TEST ] Testing + ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 46602362] Expected: Should overflow +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 46854158] Running +.underflow: -2147483648 -1 + . CR +[Hera] -2147483649 +[Hera] [HADES][TEST ] [KRELTSC: 46896142] Test passed +[Hera] [HADES][TEST ] Testing + ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 46940638] Expected: Should underflow +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] [HADES][TEST ] [KRELTSC: 47185099] Running +.empty_stack: + +[Hera] [HADES][ERROR] [KRELTSC: 47216692] +: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 47242772] Expected error occurred +[Hera] [HADES][TEST ] Testing + ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 47290683] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 47321628] Running +.one_item: 42 + +[Hera] [HADES][ERROR] [KRELTSC: 47349193] +: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 47373825] Expected error occurred +[Hera] [HADES][TEST ] Testing + ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 47422975] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 47453811] +: 8 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 47613116] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 47660539] Testing word: - +[Hera] [HADES][TEST ] [KRELTSC: 47684639] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 47711266] Running -.basic: 10 3 - . CR +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 47751703] Test passed +[Hera] [HADES][TEST ] Testing - ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 47796587] Expected: Should print: 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 47891438] Running -.zero_sub: 42 0 - . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 48078921] Test passed +[Hera] [HADES][TEST ] Testing - ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 48125044] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 48222936] Running -.from_zero: 0 5 - . CR +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 48260676] Test passed +[Hera] [HADES][TEST ] Testing - ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 48306185] Expected: Should print: -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 48542931] Running -.negative: 5 -3 - . CR +[Hera] 8 +[Hera] [HADES][TEST ] [KRELTSC: 48581708] Test passed +[Hera] [HADES][TEST ] Testing - ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 48628911] Expected: Should print: 8 +[Hera] 8 +[Hera] 8 +[Hera] 8 +[Hera] 8 +[Hera] 8 +[Hera] [HADES][TEST ] [KRELTSC: 48722367] Running -.same_values: 42 42 - . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 48759938] Test passed +[Hera] [HADES][TEST ] Testing - ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 48941095] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 49040484] Running -.overflow: -2147483648 1 - . CR +[Hera] -2147483649 +[Hera] [HADES][TEST ] [KRELTSC: 49082821] Test passed +[Hera] [HADES][TEST ] Testing - ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 49127774] Expected: Should underflow +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] [HADES][TEST ] [KRELTSC: 49370120] Running -.underflow: 2147483647 -1 - . CR +[Hera] 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 49421108] Test passed +[Hera] [HADES][TEST ] Testing - ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 49469516] Expected: Should overflow +[Hera] 2147483648 +[Hera] [HADES][INFO ] [KRELTSC: 49518277] L8[TABLE]: Config 18 → 19 regime=2 score=26214 L1=0 L2=0 L3=1 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 49620845] Running -.empty_stack: - +[Hera] [HADES][ERROR] [KRELTSC: 49649334] -: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 49809705] Expected error occurred +[Hera] [HADES][TEST ] Testing - ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 49856841] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 49895350] Running -.one_item: 42 - +[Hera] [HADES][ERROR] [KRELTSC: 49926790] -: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 49950773] Expected error occurred +[Hera] [HADES][TEST ] Testing - ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 49999081] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 50031246] -: 9 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 50061427] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 50235713] Testing word: * +[Hera] [HADES][TEST ] [KRELTSC: 50258418] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 50284887] Running *.basic: 6 7 * . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 50339534] Test passed +[Hera] [HADES][TEST ] Testing * ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 50383937] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 50480975] Running *.by_zero: 42 0 * . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 50659056] Test passed +[Hera] [HADES][TEST ] Testing * ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 50703694] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 50800843] Running *.by_one: 42 1 * . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 50842005] Test passed +[Hera] [HADES][TEST ] Testing * ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 50887887] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 51130188] Running *.by_negative: 6 -7 * . CR +[Hera] -42 +[Hera] [HADES][TEST ] [KRELTSC: 51171161] Test passed +[Hera] [HADES][TEST ] Testing * ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 51217903] Expected: Should print: -42 +[Hera] -42 +[Hera] -42 +[Hera] -42 +[Hera] -42 +[Hera] -42 +[Hera] [HADES][TEST ] [KRELTSC: 51321495] Running *.negative_negative: -6 -7 * . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 51360901] Test passed +[Hera] [HADES][TEST ] Testing * ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 51544935] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 51643608] Running *.large_numbers: 32767 2 * . CR +[Hera] 65534 +[Hera] [HADES][TEST ] [KRELTSC: 51685132] Test passed +[Hera] [HADES][TEST ] Testing * ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 51730989] Expected: Should print: 65534 +[Hera] 65534 +[Hera] 65534 +[Hera] 65534 +[Hera] 65534 +[Hera] 65534 +[Hera] [HADES][TEST ] [KRELTSC: 51972712] Running *.overflow: 65536 65536 * . CR +[Hera] 4294967296 +[Hera] [HADES][TEST ] [KRELTSC: 52014153] Test passed +[Hera] [HADES][TEST ] Testing * ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 52059623] Expected: May overflow +[Hera] 4294967296 +[Hera] 4294967296 +[Hera] 4294967296 +[Hera] 4294967296 +[Hera] 4294967296 +[Hera] [HADES][TEST ] [KRELTSC: 52169300] Running *.empty_stack: * +[Hera] [HADES][ERROR] [KRELTSC: 52203306] *: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 52228412] Expected error occurred +[Hera] [HADES][TEST ] Testing * ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 52410711] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 52441567] Running *.one_item: 42 * +[Hera] [HADES][ERROR] [KRELTSC: 52471082] *: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 52496921] Expected error occurred +[Hera] [HADES][TEST ] Testing * ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 52548634] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 52580128] *: 9 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 52610230] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 52646631] Testing word: / +[Hera] [HADES][TEST ] [KRELTSC: 52670341] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 52696182] Running /.basic: 15 3 / . CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 52867198] Test passed +[Hera] [HADES][TEST ] Testing / ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 52914663] Expected: Should print: 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] [HADES][INFO ] [KRELTSC: 52987782] L8[TABLE]: Config 19 → 20 regime=2 score=26214 L1=0 L2=0 L3=1 +[Hera] 5 +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 53053632] Running /.by_one: 42 1 / . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 53089601] Test passed +[Hera] [HADES][TEST ] Testing / ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 53133704] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 53369902] Running /.negative_dividend: -15 3 / . CR +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 53414297] Test passed +[Hera] [HADES][TEST ] Testing / ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 53462669] Expected: Should print: -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 53684163] Running /.negative_divisor: 15 -3 / . CR +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 53741209] Test passed +[Hera] [HADES][TEST ] Testing / ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 53789610] Expected: Should print: -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 53893515] Running /.both_negative: -15 -3 / . CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 53936143] Test passed +[Hera] [HADES][TEST ] Testing / ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 53982868] Expected: Should print: 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 54223030] Running /.truncation: 7 3 / . CR +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 54262820] Test passed +[Hera] [HADES][TEST ] Testing / ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 54307583] Expected: Should print: 2 (truncated) +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 54408080] Running /.by_zero: 42 0 / +[Hera] [HADES][ERROR] [KRELTSC: 54438385] /: Division by zero +[Hera] [HADES][TEST ] [KRELTSC: 54606669] Expected error occurred +[Hera] [HADES][TEST ] Testing / ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 54657022] Expected: Should cause division by zero +[Hera] [HADES][TEST ] [KRELTSC: 54689825] Running /.empty_stack: / +[Hera] [HADES][ERROR] [KRELTSC: 54720867] /: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 54746826] Expected error occurred +[Hera] [HADES][TEST ] Testing / ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 54796483] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 54834892] Running /.one_item: 42 / +[Hera] [HADES][ERROR] [KRELTSC: 54987128] /: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 55025266] Expected error occurred +[Hera] [HADES][TEST ] Testing / ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 55073879] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 55106252] /: 9 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 55138634] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 55175782] Testing word: MOD +[Hera] [HADES][TEST ] [KRELTSC: 55203168] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 55231184] Running MOD.basic: 17 5 MOD . CR +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 55290278] Test passed +[Hera] [HADES][TEST ] Testing MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 55469480] Expected: Should print: 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 55576935] Running MOD.exact_division: 15 3 MOD . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 55616608] Test passed +[Hera] [HADES][TEST ] Testing MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 55663909] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 55902464] Running MOD.by_one: 42 1 MOD . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 55943399] Test passed +[Hera] [HADES][TEST ] Testing MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 55993214] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 56091304] Running MOD.negative_dividend: -17 5 MOD . CR +[Hera] [HADES][INFO ] [KRELTSC: 56129825] L8[TABLE]: Config 20 → 21 regime=2 score=26214 L1=0 L2=0 L3=1 +[Hera] -2 +[Hera] [HADES][TEST ] [KRELTSC: 56316899] Test passed +[Hera] [HADES][TEST ] Testing MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 56362520] Expected: Should handle negative +[Hera] -2 +[Hera] -2 +[Hera] -2 +[Hera] -2 +[Hera] -2 +[Hera] [HADES][TEST ] [KRELTSC: 56468022] Running MOD.negative_divisor: 17 -5 MOD . CR +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 56510004] Test passed +[Hera] [HADES][TEST ] Testing MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 56557264] Expected: Should handle negative +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 56794819] Running MOD.small_by_large: 3 7 MOD . CR +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 56837629] Test passed +[Hera] [HADES][TEST ] Testing MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 56888102] Expected: Should print: 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 56984907] Running MOD.by_zero: 42 0 MOD +[Hera] [HADES][ERROR] [KRELTSC: 57015357] MOD: Division by zero +[Hera] [HADES][TEST ] [KRELTSC: 57178357] Expected error occurred +[Hera] [HADES][TEST ] Testing MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 57227016] Expected: Should cause division by zero +[Hera] [HADES][TEST ] [KRELTSC: 57259672] Running MOD.empty_stack: MOD +[Hera] [HADES][ERROR] [KRELTSC: 57293622] MOD: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 57321788] Expected error occurred +[Hera] [HADES][TEST ] Testing MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 57370657] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 57403568] Running MOD.one_item: 42 MOD +[Hera] [HADES][ERROR] [KRELTSC: 57434125] MOD: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 57459624] Expected error occurred +[Hera] [HADES][TEST ] Testing MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 57629301] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 57669592] MOD: 9 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 57702161] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 57740449] Testing word: /MOD +[Hera] [HADES][TEST ] [KRELTSC: 57766997] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 57793716] Running /MOD.basic: 17 5 /MOD . . CR +[Hera] 3 2 +[Hera] [HADES][TEST ] [KRELTSC: 57851482] Test passed +[Hera] [HADES][TEST ] Testing /MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 58019412] Expected: Should print: 3 2 +[Hera] 3 2 +[Hera] 3 2 +[Hera] 3 2 +[Hera] 3 2 +[Hera] 3 2 +[Hera] [HADES][TEST ] [KRELTSC: 58137910] Running /MOD.exact: 15 3 /MOD . . CR +[Hera] 5 0 +[Hera] [HADES][TEST ] [KRELTSC: 58179095] Test passed +[Hera] [HADES][TEST ] Testing /MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 58225663] Expected: Should print: 5 0 +[Hera] 5 0 +[Hera] 5 0 +[Hera] 5 0 +[Hera] 5 0 +[Hera] 5 0 +[Hera] [HADES][TEST ] [KRELTSC: 58334675] Running /MOD.negative: -17 5 /MOD . . CR +[Hera] -3 -2 +[Hera] [HADES][TEST ] [KRELTSC: 58512013] Test passed +[Hera] [HADES][TEST ] Testing /MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 58557643] Expected: Should handle negative dividend +[Hera] -3 -2 +[Hera] -3 -2 +[Hera] -3 -2 +[Hera] -3 -2 +[Hera] -3 -2 +[Hera] [HADES][TEST ] [KRELTSC: 58668641] Running /MOD.by_zero: 42 0 /MOD +[Hera] [HADES][ERROR] [KRELTSC: 58700764] /MOD: Division by zero +[Hera] [HADES][TEST ] [KRELTSC: 58726376] Expected error occurred +[Hera] [HADES][TEST ] Testing /MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 58777380] Expected: Should cause division by zero +[Hera] [HADES][TEST ] [KRELTSC: 58938743] Running /MOD.empty_stack: /MOD +[Hera] [HADES][ERROR] [KRELTSC: 58974350] /MOD: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 59000946] Expected error occurred +[Hera] [HADES][TEST ] Testing /MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 59051416] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 59085984] Running /MOD.one_item: 42 /MOD +[Hera] [HADES][ERROR] [KRELTSC: 59115555] /MOD: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 59143913] Expected error occurred +[Hera] [HADES][TEST ] Testing /MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 59194169] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 59355831] /MOD: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 59386733] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 59423476] Testing word: ABS +[Hera] [HADES][TEST ] [KRELTSC: 59449240] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 59479086] Running ABS.positive: 42 ABS . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 59530054] Test passed +[Hera] [HADES][TEST ] Testing ABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 59578071] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 59810717] Running ABS.negative: -42 ABS . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 59855268] Test passed +[Hera] [HADES][TEST ] Testing ABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 59901977] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 [HADES][INFO ] [KRELTSC: 59999288] L8[TABLE]: Config 21 → 22 regime=2 score=26214 L1=0 L2=0 L3=1 + +[Hera] [HADES][TEST ] [KRELTSC: 60037756] Running ABS.zero: 0 ABS . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 60204144] Test passed +[Hera] [HADES][TEST ] Testing ABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 60258280] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 60352617] Running ABS.min_int: -2147483648 ABS . CR +[Hera] 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 60395584] Test passed +[Hera] [HADES][TEST ] Testing ABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 60442713] Expected: Should print: 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 60689024] Running ABS.empty_stack: ABS +[Hera] [HADES][ERROR] [KRELTSC: 60719328] ABS: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 60745899] Expected error occurred +[Hera] [HADES][TEST ] Testing ABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 60795836] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 60828591] ABS: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 60861323] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 60899302] Testing word: NEGATE +[Hera] [HADES][TEST ] [KRELTSC: 60924718] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 61073446] Running NEGATE.positive: 42 NEGATE . CR +[Hera] -42 +[Hera] [HADES][TEST ] [KRELTSC: 61135086] Test passed +[Hera] [HADES][TEST ] Testing NEGATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 61180083] Expected: Should print: -42 +[Hera] -42 +[Hera] -42 +[Hera] -42 +[Hera] -42 +[Hera] -42 +[Hera] [HADES][TEST ] [KRELTSC: 61275420] Running NEGATE.negative: -42 NEGATE . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 61315934] Test passed +[Hera] [HADES][TEST ] Testing NEGATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 61363586] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 61592007] Running NEGATE.zero: 0 NEGATE . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 61631850] Test passed +[Hera] [HADES][TEST ] Testing NEGATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 61682579] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 61779715] Running NEGATE.min_int: -2147483648 NEGATE . CR +[Hera] 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 61957950] Test passed +[Hera] [HADES][TEST ] Testing NEGATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 62002849] Expected: Should print: 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 62112991] Running NEGATE.empty_stack: NEGATE +[Hera] [HADES][ERROR] [KRELTSC: 62146310] NEGATE: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 62174411] Expected error occurred +[Hera] [HADES][TEST ] Testing NEGATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 62224550] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 62255664] NEGATE: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 62422061] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 62456711] Testing word: MIN +[Hera] [HADES][TEST ] [KRELTSC: 62481684] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 62510127] Running MIN.basic: 5 3 MIN . CR +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 62560066] Test passed +[Hera] [HADES][TEST ] Testing MIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 62608440] Expected: Should print: 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 62840492] Running MIN.equal: 42 42 MIN . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 62879186] Test passed +[Hera] [HADES][TEST ] Testing MIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 62926677] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 63027384] Running MIN.negative: -5 -3 MIN . CR +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 63070458] Test passed +[Hera] [HADES][TEST ] Testing MIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 63116611] Expected: Should print: -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 63346871] Running MIN.mixed: -1 1 MIN . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 63386377] Test passed +[Hera] [HADES][TEST ] Testing MIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 63434318] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 [HADES][INFO ] [KRELTSC: 63505139] L8[TABLE]: Config 22 → 23 regime=2 score=52428 L1=0 L2=0 L3=1 + +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 63694170] Running MIN.one_item: 42 MIN +[Hera] [HADES][ERROR] [KRELTSC: 63736135] MIN: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 63762836] Expected error occurred +[Hera] [HADES][TEST ] Testing MIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 63812754] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 63845021] Running MIN.empty_stack: MIN +[Hera] [HADES][ERROR] [KRELTSC: 63873423] MIN: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 63899646] Expected error occurred +[Hera] [HADES][TEST ] Testing MIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 63951316] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 63983163] MIN: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 64145252] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 64180934] Testing word: MAX +[Hera] [HADES][TEST ] [KRELTSC: 64206300] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 64232652] Running MAX.basic: 5 3 MAX . CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 64283602] Test passed +[Hera] [HADES][TEST ] Testing MAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 64330634] Expected: Should print: 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 64429542] Running MAX.equal: 42 42 MAX . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 64604945] Test passed +[Hera] [HADES][TEST ] Testing MAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 64652813] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 64757789] Running MAX.negative: -5 -3 MAX . CR +[Hera] -3 +[Hera] [HADES][TEST ] [KRELTSC: 64799038] Test passed +[Hera] [HADES][TEST ] Testing MAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 64847142] Expected: Should print: -3 +[Hera] -3 +[Hera] -3 +[Hera] -3 +[Hera] -3 +[Hera] -3 +[Hera] [HADES][TEST ] [KRELTSC: 65084276] Running MAX.mixed: -1 1 MAX . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 65126044] Test passed +[Hera] [HADES][TEST ] Testing MAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 65174567] Expected: Should print: 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 65277054] Running MAX.one_item: 42 MAX +[Hera] [HADES][ERROR] [KRELTSC: 65446544] MAX: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 65474973] Expected error occurred +[Hera] [HADES][TEST ] Testing MAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 65525315] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 65558747] Running MAX.empty_stack: MAX +[Hera] [HADES][ERROR] [KRELTSC: 65590386] MAX: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 65616013] Expected error occurred +[Hera] [HADES][TEST ] Testing MAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 65669215] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 65701106] MAX: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 65860555] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 65906523] Testing word: 1+ +[Hera] [HADES][TEST ] [KRELTSC: 65929606] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 65956072] Running 1+.basic: 5 1+ . CR +[Hera] 6 +[Hera] [HADES][TEST ] [KRELTSC: 66002587] Test passed +[Hera] [HADES][TEST ] Testing 1+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 66051738] Expected: Should print: 6 +[Hera] 6 +[Hera] 6 +[Hera] 6 +[Hera] 6 +[Hera] 6 +[Hera] [HADES][TEST ] [KRELTSC: 66152854] Running 1+.zero: 0 1+ . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 66332448] Test passed +[Hera] [HADES][TEST ] Testing 1+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 66377655] Expected: Should print: 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 66474196] Running 1+.negative: -1 1+ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 66511543] Test passed +[Hera] [HADES][TEST ] Testing 1+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 66559052] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 66797997] Running 1+.chain: 3 1+ 1+ 1+ . CR +[Hera] 6 +[Hera] [HADES][TEST ] [KRELTSC: 66837124] Test passed +[Hera] [HADES][TEST ] Testing 1+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 66888706] Expected: Should print: 6 +[Hera] 6 +[Hera] 6 +[Hera] 6 +[Hera] 6 +[Hera] 6 +[Hera] [HADES][TEST ] [KRELTSC: 66993398] Running 1+.overflow: 2147483647 1+ . CR +[Hera] 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 67173818] Test passed +[Hera] [HADES][TEST ] Testing 1+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 67221521] Expected: Should overflow +[Hera] 2147483648 +[Hera] 2147483648 [HADES][INFO ] [KRELTSC: 67280443] L8[TABLE]: Config 23 → 24 regime=2 score=6553 L1=0 L2=0 L3=1 + +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 67365310] Running 1+.empty_stack: 1+ +[Hera] [HADES][ERROR] [KRELTSC: 67396607] 1+: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 67421628] Expected error occurred +[Hera] [HADES][TEST ] Testing 1+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 67596259] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 67635017] 1+: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 67667007] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 67707435] Testing word: 1- +[Hera] [HADES][TEST ] [KRELTSC: 67730885] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 67756831] Running 1-.basic: 5 1- . CR +[Hera] 4 +[Hera] [HADES][TEST ] [KRELTSC: 67802780] Test passed +[Hera] [HADES][TEST ] Testing 1- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 67851292] Expected: Should print: 4 +[Hera] 4 +[Hera] 4 +[Hera] 4 +[Hera] 4 +[Hera] 4 +[Hera] [HADES][TEST ] [KRELTSC: 68083486] Running 1-.to_zero: 1 1- . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 68119276] Test passed +[Hera] [HADES][TEST ] Testing 1- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 68167260] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 68260847] Running 1-.to_negative: 0 1- . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 68299183] Test passed +[Hera] [HADES][TEST ] Testing 1- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 68477775] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 68577190] Running 1-.chain: 6 1- 1- 1- . CR +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 68616131] Test passed +[Hera] [HADES][TEST ] Testing 1- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 68666204] Expected: Should print: 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 68776370] Running 1-.underflow: -2147483648 1- . CR +[Hera] -2147483649 +[Hera] [HADES][TEST ] [KRELTSC: 68956064] Test passed +[Hera] [HADES][TEST ] Testing 1- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 69000731] Expected: Should underflow +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] [HADES][TEST ] [KRELTSC: 69113676] Running 1-.empty_stack: 1- +[Hera] [HADES][ERROR] [KRELTSC: 69146854] 1-: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 69172989] Expected error occurred +[Hera] [HADES][TEST ] Testing 1- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 69361362] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 69392089] 1-: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 69422964] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 69460096] Testing word: 2+ +[Hera] [HADES][TEST ] [KRELTSC: 69485588] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 69515213] Running 2+.basic: 5 2+ . CR +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 69567124] Test passed +[Hera] [HADES][TEST ] Testing 2+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 69614021] Expected: Should print: 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 69848687] Running 2+.zero: 0 2+ . CR +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 69884297] Test passed +[Hera] [HADES][TEST ] Testing 2+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 69932174] Expected: Should print: 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 70029211] Running 2+.negative: -3 2+ . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 70067763] Test passed +[Hera] [HADES][TEST ] Testing 2+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 70248091] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 70357071] Running 2+.empty_stack: 2+ +[Hera] [HADES][ERROR] [KRELTSC: 70388019] 2+: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 70413653] Expected error occurred +[Hera] [HADES][TEST ] Testing 2+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 70463919] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 70495334] 2+: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 70661931] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 70699581] Testing word: 2- +[Hera] [HADES][TEST ] [KRELTSC: 70724122] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 70751673] Running 2-.basic: 7 2- . CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 70800321] Test passed +[Hera] [HADES][TEST ] Testing 2- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 70846811] Expected: Should print: 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 71074610] Running 2-.zero: 2 2- . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 71125475] Test passed +[Hera] [HADES][TEST ] Testing 2- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 71174203] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][INFO ] [KRELTSC: 71230753] L8[TABLE]: Config 24 → 25 regime=2 score=6553 L1=0 L2=0 L3=1 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 71316852] Running 2-.negative: 0 2- . CR +[Hera] -2 +[Hera] [HADES][TEST ] [KRELTSC: 71355898] Test passed +[Hera] [HADES][TEST ] Testing 2- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 71541782] Expected: Should print: -2 +[Hera] -2 +[Hera] -2 +[Hera] -2 +[Hera] -2 +[Hera] -2 +[Hera] [HADES][TEST ] [KRELTSC: 71645538] Running 2-.empty_stack: 2- +[Hera] [HADES][ERROR] [KRELTSC: 71674135] 2-: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 71699452] Expected error occurred +[Hera] [HADES][TEST ] Testing 2- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 71748474] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 71779463] 2-: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 71808772] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 71980043] Testing word: 2* +[Hera] [HADES][TEST ] [KRELTSC: 72002875] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 72029961] Running 2*.basic: 5 2* . CR +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 72078737] Test passed +[Hera] [HADES][TEST ] Testing 2* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 72125319] Expected: Should print: 10 +[Hera] 10 +[Hera] 10 +[Hera] 10 +[Hera] 10 +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 72223915] Running 2*.zero: 0 2* . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 72410732] Test passed +[Hera] [HADES][TEST ] Testing 2* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 72455563] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 72550475] Running 2*.negative: -3 2* . CR +[Hera] -6 +[Hera] [HADES][TEST ] [KRELTSC: 72587530] Test passed +[Hera] [HADES][TEST ] Testing 2* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 72635127] Expected: Should print: -6 +[Hera] -6 +[Hera] -6 +[Hera] -6 +[Hera] -6 +[Hera] -6 +[Hera] [HADES][TEST ] [KRELTSC: 72869993] Running 2*.one: 1 2* . CR +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 72906737] Test passed +[Hera] [HADES][TEST ] Testing 2* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 72953494] Expected: Should print: 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 73048283] Running 2*.large: 1073741823 2* . CR +[Hera] 2147483646 +[Hera] [HADES][TEST ] [KRELTSC: 73090981] Test passed +[Hera] [HADES][TEST ] Testing 2* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 73273650] Expected: Should print: 2147483646 +[Hera] 2147483646 +[Hera] 2147483646 +[Hera] 2147483646 +[Hera] 2147483646 +[Hera] 2147483646 +[Hera] [HADES][TEST ] [KRELTSC: 73393351] Running 2*.empty_stack: 2* +[Hera] [HADES][ERROR] [KRELTSC: 73424842] 2*: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 73451323] Expected error occurred +[Hera] [HADES][TEST ] Testing 2* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 73500619] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 73532113] 2*: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 73692195] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 73740141] Testing word: 2/ +[Hera] [HADES][TEST ] [KRELTSC: 73763997] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 73790650] Running 2/.basic: 10 2/ . CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 73837963] Test passed +[Hera] [HADES][TEST ] Testing 2/ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 73883209] Expected: Should print: 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 74110057] Running 2/.odd: 7 2/ . CR +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 74163507] Test passed +[Hera] [HADES][TEST ] Testing 2/ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 74215662] Expected: Should print: 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 74318578] Running 2/.zero: 0 2/ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 74357247] Test passed +[Hera] [HADES][TEST ] Testing 2/ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 74403700] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 74641505] Running 2/.negative_even: -10 2/ . CR +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 74682577] Test passed +[Hera] [HADES][TEST ] Testing 2/ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 74727366] Expected: Should print: -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 74823467] Running 2/.one: 1 2/ . CR +[Hera] [HADES][INFO ] [KRELTSC: 74996626] L8[TABLE]: Config 25 → 26 regime=2 score=6553 L1=0 L2=0 L3=1 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 75046667] Test passed +[Hera] [HADES][TEST ] Testing 2/ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 75092564] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 75188777] Running 2/.empty_stack: 2/ +[Hera] [HADES][ERROR] [KRELTSC: 75218308] 2/: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 75243301] Expected error occurred +[Hera] [HADES][TEST ] Testing 2/ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 75424340] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 75465966] 2/: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 75500387] === Arithmetic Words Summary: 0 passed, 0 failed, 0 skipped, 0 +[Hera] [HADES][INFO ] [KRELTSC: 75538487] +[Hera] === Testing Module: Logical Words === +[Hera] [HADES][INFO ] [KRELTSC: 75576290] Running Logical Words Tests (Module 8)... +[Hera] [HADES][TEST ] [KRELTSC: 75608447] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 75645369] Testing word: AND +[Hera] [HADES][TEST ] [KRELTSC: 75669387] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 75695369] Running AND.both_true: -1 -1 AND . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 75875960] Test passed +[Hera] [HADES][TEST ] Testing AND ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 75923398] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 76025574] Running AND.first_false: 0 -1 AND . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 76068009] Test passed +[Hera] [HADES][TEST ] Testing AND ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 76117624] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 76368896] Running AND.second_false: -1 0 AND . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 76411228] Test passed +[Hera] [HADES][TEST ] Testing AND ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 76459972] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 76556953] Running AND.both_false: 0 0 AND . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 76747537] Test passed +[Hera] [HADES][TEST ] Testing AND ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 76794204] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 76892253] Running AND.bitwise: 85 51 AND . CR +[Hera] 17 +[Hera] [HADES][TEST ] [KRELTSC: 76931602] Test passed +[Hera] [HADES][TEST ] Testing AND ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 76977867] Expected: Should print: 17 +[Hera] 17 +[Hera] 17 +[Hera] 17 +[Hera] 17 +[Hera] 17 +[Hera] [HADES][TEST ] [KRELTSC: 77214564] Running AND.empty_stack: AND +[Hera] [HADES][ERROR] [KRELTSC: 77245675] AND: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 77272703] Expected error occurred +[Hera] [HADES][TEST ] Testing AND ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 77321407] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 77352315] Running AND.one_item: 42 AND +[Hera] [HADES][ERROR] [KRELTSC: 77381393] AND: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 77407074] Expected error occurred +[Hera] [HADES][TEST ] Testing AND ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 77594831] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 77638772] AND: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 77673934] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 77712447] Testing word: OR +[Hera] [HADES][TEST ] [KRELTSC: 77737740] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 77764262] Running OR.both_true: -1 -1 OR . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 77813457] Test passed +[Hera] [HADES][TEST ] Testing OR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 77865793] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 78113218] Running OR.first_false: 0 -1 OR . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 78153257] Test passed +[Hera] [HADES][TEST ] Testing OR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 78201335] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 78304180] Running OR.second_false: -1 0 OR . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 78495669] Test passed +[Hera] [HADES][TEST ] Testing OR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 78542072] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][INFO ] [KRELTSC: 78612588] L8[TABLE]: Config 26 → 27 regime=2 score=6553 L1=0 L2=0 L3=1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 78684634] Running OR.both_false: 0 0 OR . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 78726339] Test passed +[Hera] [HADES][TEST ] Testing OR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 78911648] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 79013574] Running OR.bitwise: 85 51 OR . CR +[Hera] 119 +[Hera] [HADES][TEST ] [KRELTSC: 79052970] Test passed +[Hera] [HADES][TEST ] Testing OR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 79098903] Expected: Should print: 119 +[Hera] 119 +[Hera] 119 +[Hera] 119 +[Hera] 119 +[Hera] 119 +[Hera] [HADES][TEST ] [KRELTSC: 79338790] Running OR.empty_stack: OR +[Hera] [HADES][ERROR] [KRELTSC: 79371485] OR: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 79398835] Expected error occurred +[Hera] [HADES][TEST ] Testing OR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 79446983] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 79477840] Running OR.one_item: 42 OR +[Hera] [HADES][ERROR] [KRELTSC: 79506459] OR: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 79531216] Expected error occurred +[Hera] [HADES][TEST ] Testing OR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 79581643] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 79611948] OR: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 79781430] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 79819401] Testing word: XOR +[Hera] [HADES][TEST ] [KRELTSC: 79844592] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 79871992] Running XOR.both_true: -1 -1 XOR . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 79926423] Test passed +[Hera] [HADES][TEST ] Testing XOR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 79972771] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 80207905] Running XOR.first_false: 0 -1 XOR . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 80249695] Test passed +[Hera] [HADES][TEST ] Testing XOR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 80296765] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 80391952] Running XOR.second_false: -1 0 XOR . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 80433470] Test passed +[Hera] [HADES][TEST ] Testing XOR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 80480414] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 80739260] Running XOR.both_false: 0 0 XOR . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 80778203] Test passed +[Hera] [HADES][TEST ] Testing XOR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 80822094] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 80917670] Running XOR.bitwise: 85 51 XOR . CR +[Hera] 102 +[Hera] [HADES][TEST ] [KRELTSC: 81129717] Test passed +[Hera] [HADES][TEST ] Testing XOR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 81175393] Expected: Should print: 102 +[Hera] 102 +[Hera] 102 +[Hera] 102 +[Hera] 102 +[Hera] 102 +[Hera] [HADES][TEST ] [KRELTSC: 81273053] Running XOR.empty_stack: XOR +[Hera] [HADES][ERROR] [KRELTSC: 81303554] XOR: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 81330836] Expected error occurred +[Hera] [HADES][TEST ] Testing XOR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 81527722] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 81557096] Running XOR.one_item: 42 XOR +[Hera] [HADES][ERROR] [KRELTSC: 81586285] XOR: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 81610070] Expected error occurred +[Hera] [HADES][TEST ] Testing XOR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 81656008] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 81686656] XOR: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 81718126] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 81755969] Testing word: NOT +[Hera] [HADES][TEST ] [KRELTSC: 81780549] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 81949937] Running NOT.true: -1 NOT . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 81996898] Test passed +[Hera] [HADES][TEST ] Testing NOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 82043272] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 82137182] Running NOT.false: 0 NOT . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 82175768] Test passed +[Hera] [HADES][TEST ] Testing NOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 82221935] Expected: Should print: -1 +[Hera] [HADES][INFO ] [KRELTSC: 82252494] L8[TABLE]: Config 27 → 28 regime=2 score=6553 L1=0 L2=0 L3=1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 82510858] Running NOT.positive: 42 NOT . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 82549286] Test passed +[Hera] [HADES][TEST ] Testing NOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 82595097] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 82839130] Running NOT.negative: -42 NOT . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 82878657] Test passed +[Hera] [HADES][TEST ] Testing NOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 82924843] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 83019206] Running NOT.empty_stack: NOT +[Hera] [HADES][ERROR] [KRELTSC: 83049034] NOT: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 83075226] Expected error occurred +[Hera] [HADES][TEST ] Testing NOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 83270702] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 83300132] NOT: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 83332394] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 83370136] Testing word: = +[Hera] [HADES][TEST ] [KRELTSC: 83396535] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 83422932] Running =.equal: 42 42 = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 83464177] Test passed +[Hera] [HADES][TEST ] Testing = ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 83509478] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 83792366] Running =.not_equal: 42 43 = . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 83837051] Test passed +[Hera] [HADES][TEST ] Testing = ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 83881823] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 84106405] Running =.zero_equal: 0 0 = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 84165406] Test passed +[Hera] [HADES][TEST ] Testing = ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 84213637] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 84309468] Running =.negative_equal: -42 -42 = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 84349585] Test passed +[Hera] [HADES][TEST ] Testing = ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 84394762] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 84672789] Running =.negative_positive: -42 42 = . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 84719847] Test passed +[Hera] [HADES][TEST ] Testing = ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 84765390] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 85042861] Running =.empty_stack: = +[Hera] [HADES][ERROR] [KRELTSC: 85078379] =: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 85103350] Expected error occurred +[Hera] [HADES][TEST ] Testing = ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 85153377] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 85184196] Running =.one_item: 42 = +[Hera] [HADES][ERROR] [KRELTSC: 85211743] =: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 85235331] Expected error occurred +[Hera] [HADES][TEST ] Testing = ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 85430461] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 85461757] =: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 85491732] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 85528822] Testing word: <> +[Hera] [HADES][TEST ] [KRELTSC: 85552995] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 85578956] Running <>.not_equal: 42 43 <> . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 85628167] Test passed +[Hera] [HADES][TEST ] Testing <> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 85672621] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 85908882] Running <>.equal: 42 42 <> . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 85980841] Test passed +[Hera] [HADES][TEST ] Testing <> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 86037272] Expected: Should print: 0 +[Hera] [HADES][INFO ] [KRELTSC: 86068331] L8[TABLE]: Config 28 → 29 regime=2 score=6553 L1=0 L2=0 L3=1 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 86347145] Running <>.zero_equal: 0 0 <> . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 86440771] Test passed +[Hera] [HADES][TEST ] Testing <> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 86484158] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 86578359] Running <>.negative: -42 42 <> . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 86806353] Test passed +[Hera] [HADES][TEST ] Testing <> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 86851602] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 86947444] Running <>.empty_stack: <> +[Hera] [HADES][ERROR] [KRELTSC: 86977078] <>: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 87002569] Expected error occurred +[Hera] [HADES][TEST ] Testing <> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 87221448] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 87266069] Running <>.one_item: 42 <> +[Hera] [HADES][ERROR] [KRELTSC: 87295416] <>: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 87319612] Expected error occurred +[Hera] [HADES][TEST ] Testing <> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 87368806] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 87399866] <>: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 87430536] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 87614436] Testing word: < +[Hera] [HADES][TEST ] [KRELTSC: 87662637] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 87701023] Running <.less_than: 5 7 < . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 87752633] Test passed +[Hera] [HADES][TEST ] Testing < ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 87795928] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 88049989] Running <.greater_than: 7 5 < . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 88126643] Test passed +[Hera] [HADES][TEST ] Testing < ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 88170642] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 88265025] Running <.equal: 5 5 < . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 88300078] Test passed +[Hera] [HADES][TEST ] Testing < ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 88489213] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 88622051] Running <.negative_positive: -5 5 < . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 88662898] Test passed +[Hera] [HADES][TEST ] Testing < ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 88710255] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 88950413] Running <.negative_negative: -7 -5 < . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 88989269] Test passed +[Hera] [HADES][TEST ] Testing < ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 89032292] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 89125479] Running <.empty_stack: < +[Hera] [HADES][ERROR] [KRELTSC: 89158940] <: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 89330942] Expected error occurred +[Hera] [HADES][TEST ] Testing < ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 89393411] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 89448509] Running <.one_item: 42 < +[Hera] [HADES][ERROR] [KRELTSC: 89475620] <: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 89498801] Expected error occurred +[Hera] [HADES][TEST ] Testing < ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 89547136] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 89576852] <: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 89607076] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 89783576] Testing word: > +[Hera] [HADES][TEST ] [KRELTSC: 89805980] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 89858222] Running >.greater_than: 7 5 > . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 89919387] Test passed +[Hera] [HADES][TEST ] Testing > ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 89962583] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][INFO ] [KRELTSC: 90021675] L8[TABLE]: Config 29 → 30 regime=2 score=6553 L1=0 L2=0 L3=1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 90254821] Running >.less_than: 5 7 > . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 90328940] Test passed +[Hera] [HADES][TEST ] Testing > ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 90370227] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 90463701] Running >.equal: 5 5 > . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 90649574] Test passed +[Hera] [HADES][TEST ] Testing > ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 90703526] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 90824660] Running >.positive_negative: 5 -5 > . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 90864598] Test passed +[Hera] [HADES][TEST ] Testing > ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 90909833] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 91200314] Running >.negative_negative: -5 -7 > . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 91240214] Test passed +[Hera] [HADES][TEST ] Testing > ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 91285452] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 91534125] Running >.empty_stack: > +[Hera] [HADES][ERROR] [KRELTSC: 91562422] >: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 91630688] Expected error occurred +[Hera] [HADES][TEST ] Testing > ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 91679249] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 91710656] Running >.one_item: 42 > +[Hera] [HADES][ERROR] [KRELTSC: 91738672] >: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 91763232] Expected error occurred +[Hera] [HADES][TEST ] Testing > ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 91932432] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 91976922] >: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 92007143] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 92042932] Testing word: 0= +[Hera] [HADES][TEST ] [KRELTSC: 92068435] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 92094085] Running 0=.zero: 0 0= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 92140473] Test passed +[Hera] [HADES][TEST ] Testing 0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 92184246] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 92432018] Running 0=.positive: 42 0= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 92513093] Test passed +[Hera] [HADES][TEST ] Testing 0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 92559416] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 92778609] Running 0=.negative: -42 0= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 92835366] Test passed +[Hera] [HADES][TEST ] Testing 0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 92881177] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 92977579] Running 0=.empty_stack: 0= +[Hera] [HADES][ERROR] [KRELTSC: 93004664] 0=: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 93031671] Expected error occurred +[Hera] [HADES][TEST ] Testing 0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 93081024] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 93268048] 0=: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 93300042] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 93370364] Testing word: 0< +[Hera] [HADES][TEST ] [KRELTSC: 93405365] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 93430738] Running 0<.negative: -42 0< . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 93481526] Test passed +[Hera] [HADES][TEST ] Testing 0< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 93527808] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 93776318] Running 0<.zero: 0 0< . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 93837739] Test passed +[Hera] [HADES][TEST ] Testing 0< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 93882334] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][INFO ] [KRELTSC: 93967565] L8[TABLE]: Config 30 → 31 regime=2 score=6553 L1=0 L2=0 L3=1 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 94199651] Running 0<.positive: 42 0< . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 94239249] Test passed +[Hera] [HADES][TEST ] Testing 0< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 94284946] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 94378258] Running 0<.empty_stack: 0< +[Hera] [HADES][ERROR] [KRELTSC: 94557562] 0<: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 94599945] Expected error occurred +[Hera] [HADES][TEST ] Testing 0< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 94668696] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 94701686] 0<: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 94734225] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 94771982] Testing word: 0> +[Hera] [HADES][TEST ] [KRELTSC: 94796103] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 94822385] Running 0>.positive: 42 0> . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 95024156] Test passed +[Hera] [HADES][TEST ] Testing 0> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 95097842] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 95193505] Running 0>.zero: 0 0> . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 95228778] Test passed +[Hera] [HADES][TEST ] Testing 0> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 95419924] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 95520259] Running 0>.negative: -42 0> . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 95557667] Test passed +[Hera] [HADES][TEST ] Testing 0> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 95603089] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 95696291] Running 0>.empty_stack: 0> +[Hera] [HADES][ERROR] [KRELTSC: 95876876] 0>: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 95924874] Expected error occurred +[Hera] [HADES][TEST ] Testing 0> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 95986339] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 96018963] 0>: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 96049712] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 96087343] Testing word: 0<> +[Hera] [HADES][TEST ] [KRELTSC: 96111721] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 96138318] Running 0<>.nonzero_pos: 42 0<> . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 96357946] Test passed +[Hera] [HADES][TEST ] Testing 0<> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 96420205] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 96516234] Running 0<>.nonzero_neg: -1 0<> . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 96553649] Test passed +[Hera] [HADES][TEST ] Testing 0<> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 96748047] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 96882925] Running 0<>.zero: 0 0<> . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 96920090] Test passed +[Hera] [HADES][TEST ] Testing 0<> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 96966788] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 97212865] Running 0<>.empty_stack: 0<> +[Hera] [HADES][ERROR] [KRELTSC: 97243775] 0<>: stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 97272272] Expected error occurred +[Hera] [HADES][TEST ] Testing 0<> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 97320253] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 97351257] 0<>: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 97384069] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 97420942] Testing word: U< +[Hera] [HADES][TEST ] [KRELTSC: 97594077] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 97619556] Running U<.less: 3 5 U< . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 97670244] Test passed +[Hera] [HADES][TEST ] Testing U< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 97745764] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 97859788] Running U<.equal: 5 5 U< . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 98050633] Test passed +[Hera] [HADES][TEST ] Testing U< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 98099089] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 98204001] Running U<.greater: 7 5 U< . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 98243222] Test passed +[Hera] [HADES][TEST ] Testing U< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 98288818] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][INFO ] [KRELTSC: 99338321] L8[TABLE]: Config 31 → 32 regime=2 score=26214 L1=0 L2=1 L3=0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 99423057] Running U<.zero_one: 0 1 U< . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 99461556] Test passed +[Hera] [HADES][TEST ] Testing U< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 99507677] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 99606693] Running U<.empty_stack: U< +[Hera] [HADES][ERROR] [KRELTSC: 99854347] U<: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 99879778] Expected error occurred +[Hera] [HADES][TEST ] Testing U< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 99929849] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 99961649] U<: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 99993003] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 100032051] Testing word: U> +[Hera] [HADES][TEST ] [KRELTSC: 100241797] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 100268920] Running U>.greater: 5 3 U> . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 100320464] Test passed +[Hera] [HADES][TEST ] Testing U> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 100366982] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 100463484] Running U>.equal: 5 5 U> . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 100671812] Test passed +[Hera] [HADES][TEST ] Testing U> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 100722551] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 100820630] Running U>.less: 3 5 U> . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 100858659] Test passed +[Hera] [HADES][TEST ] Testing U> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 100904507] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 101193022] Running U>.one_zero: 1 0 U> . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 101232328] Test passed +[Hera] [HADES][TEST ] Testing U> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 101277509] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 101569167] Running U>.empty_stack: U> +[Hera] [HADES][ERROR] [KRELTSC: 101600101] U>: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 101625620] Expected error occurred +[Hera] [HADES][TEST ] Testing U> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 101674508] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 101704098] U>: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 101733978] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 101770230] Testing word: WITHIN +[Hera] [HADES][TEST ] [KRELTSC: 101943682] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 101971744] Running WITHIN.in_range: 3 1 5 WITHIN . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 102031838] Test passed +[Hera] [HADES][TEST ] Testing WITHIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 102080574] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 102179254] Running WITHIN.at_low: 1 1 5 WITHIN . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 102219296] Test passed +[Hera] [HADES][TEST ] Testing WITHIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 102413813] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 102516712] Running WITHIN.at_high: 5 1 5 WITHIN . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 102556963] Test passed +[Hera] [HADES][TEST ] Testing WITHIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 102603922] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][INFO ] [KRELTSC: 102822552] L8[TABLE]: Config 32 → 33 regime=2 score=26214 L1=0 L2=1 L3=0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 102887816] Running WITHIN.below: 0 1 5 WITHIN . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 102928634] Test passed +[Hera] [HADES][TEST ] Testing WITHIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 102976299] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 103068997] Running WITHIN.above: 6 1 5 WITHIN . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 103249790] Test passed +[Hera] [HADES][TEST ] Testing WITHIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 103298751] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 103403148] Running WITHIN.empty_stack: WITHIN +[Hera] [HADES][ERROR] [KRELTSC: 103435666] WITHIN: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 103463453] Expected error occurred +[Hera] [HADES][TEST ] Testing WITHIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 103513183] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 103689988] WITHIN: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 103725310] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 103762559] Testing word: TRUE +[Hera] [HADES][TEST ] [KRELTSC: 103788149] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 103813317] Running TRUE.value: TRUE . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 103858125] Test passed +[Hera] [HADES][TEST ] Testing TRUE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 103904624] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 104152737] Running TRUE.as_flag: TRUE 0= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 104192107] Test passed +[Hera] [HADES][TEST ] Testing TRUE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 104239280] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 104334463] Running TRUE.in_and: TRUE TRUE AND . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 104373521] Test passed +[Hera] [HADES][TEST ] Testing TRUE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 104546736] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 104668028] TRUE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 104700863] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 104740979] Testing word: FALSE +[Hera] [HADES][TEST ] [KRELTSC: 104766245] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 104792991] Running FALSE.value: FALSE . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 104984882] Test passed +[Hera] [HADES][TEST ] Testing FALSE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 105034231] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 105128913] Running FALSE.as_flag: FALSE 0= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 105167312] Test passed +[Hera] [HADES][TEST ] Testing FALSE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 105210950] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 105461094] Running FALSE.in_or: TRUE FALSE OR . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 105504797] Test passed +[Hera] [HADES][TEST ] Testing FALSE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 105552457] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 105653634] FALSE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 105684765] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 105860303] Testing word: >= +[Hera] [HADES][TEST ] [KRELTSC: 105886977] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 105914278] Running >=.less: 3 5 >= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 105965643] Test passed +[Hera] [HADES][TEST ] Testing >= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 106008990] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][INFO ] [KRELTSC: 106096965] L8[TABLE]: Config 33 → 34 regime=2 score=26214 L1=0 L2=1 L3=0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 106295729] Running >=.greater: 5 3 >= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 106341131] Test passed +[Hera] [HADES][TEST ] Testing >= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 106387616] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 106482039] Running >=.equal: 3 3 >= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 106524992] Test passed +[Hera] [HADES][TEST ] Testing >= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 106570135] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 106817784] Running >=.negative: -1 0 >= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 106857521] Test passed +[Hera] [HADES][TEST ] Testing >= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 106905095] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 107156959] Running >=.neg_neg: -1 -2 >= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 107203051] Test passed +[Hera] [HADES][TEST ] Testing >= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 107250538] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 107352577] Running >=.underflow: >= +[Hera] [HADES][ERROR] [KRELTSC: 107386116] >=: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 107410356] Expected error occurred +[Hera] [HADES][TEST ] Testing >= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 107616424] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 107660396] >=: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 107692747] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 107730469] Testing word: <= +[Hera] [HADES][TEST ] [KRELTSC: 107754740] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 107782005] Running <=.less: 3 5 <= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 107835328] Test passed +[Hera] [HADES][TEST ] Testing <= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 108019616] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 108129791] Running <=.greater: 5 3 <= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 108170465] Test passed +[Hera] [HADES][TEST ] Testing <= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 108216086] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 108460375] Running <=.equal: 3 3 <= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 108512146] Test passed +[Hera] [HADES][TEST ] Testing <= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 108558560] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 108656657] Running <=.negative: -1 0 <= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 108695715] Test passed +[Hera] [HADES][TEST ] Testing <= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 108741374] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 108993636] Running <=.neg_neg: -2 -1 <= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 109034556] Test passed +[Hera] [HADES][TEST ] Testing <= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 109081436] Expected: Should print: -1 +[Hera] -1 +[Hera] [HADES][INFO ] [KRELTSC: 109128628] L8[TABLE]: Config 34 → 35 regime=2 score=52428 L1=0 L2=1 L3=0 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 109379376] Running <=.underflow: <= +[Hera] [HADES][ERROR] [KRELTSC: 109407755] <=: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 109433571] Expected error occurred +[Hera] [HADES][TEST ] Testing <= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 109485980] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 109517494] <=: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 109551362] === Logical Words Summary: 0 passed, 0 failed, 0 skipped, 0 err +[Hera] [HADES][INFO ] [KRELTSC: 109590148] +[Hera] === Testing Module: Mixed Arithmetic Words === +[Hera] [HADES][INFO ] [KRELTSC: 109797744] Running Mixed Arithmetic Words Tests (Module 7)... +[Hera] [HADES][TEST ] [KRELTSC: 109833404] ▶ Testing module: v3/src/test_runner/modules/mixed_arithmetic +[Hera] [HADES][TEST ] [KRELTSC: 109872001] Testing word: */ +[Hera] [HADES][TEST ] [KRELTSC: 109898563] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 109931404] Running */.basic: 6 7 4 */ . CR +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 109983189] Test passed +[Hera] [HADES][TEST ] Testing */ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 110029965] Expected: Should print: 10 (6*7/4) +[Hera] [HADES][TEST ] [KRELTSC: 110233571] Running */.exact_division: 12 5 3 */ . CR +[Hera] 20 +[Hera] [HADES][TEST ] [KRELTSC: 110281440] Test passed +[Hera] [HADES][TEST ] Testing */ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 110329110] Expected: Should print: 20 (12*5/3) +[Hera] [HADES][TEST ] [KRELTSC: 110359911] Running */.zero_multiply: 0 999 123 */ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 110403738] Test passed +[Hera] [HADES][TEST ] Testing */ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 110450001] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 110477655] Running */.by_one: 42 5 1 */ . CR +[Hera] 210 +[Hera] [HADES][TEST ] [KRELTSC: 110728948] Test passed +[Hera] [HADES][TEST ] Testing */ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 110809836] Expected: Should print: 210 (42*5/1) +[Hera] [HADES][TEST ] [KRELTSC: 110841195] Running */.truncation: 7 3 2 */ . CR +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 110882292] Test passed +[Hera] [HADES][TEST ] Testing */ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 111103104] Expected: Should print: 10 (21/2 truncated) +[Hera] [HADES][TEST ] [KRELTSC: 111135881] Running */.negative_multiply: -6 7 4 */ . CR +[Hera] -10 +[Hera] [HADES][TEST ] [KRELTSC: 111186476] Test passed +[Hera] [HADES][TEST ] Testing */ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 111232624] Expected: Should print: -10 +[Hera] [HADES][TEST ] [KRELTSC: 111261270] Running */.negative_divisor: 6 7 -4 */ . CR +[Hera] -10 +[Hera] [HADES][TEST ] [KRELTSC: 111309518] Test passed +[Hera] [HADES][TEST ] Testing */ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 111511303] Expected: Should print: -10 +[Hera] [HADES][TEST ] [KRELTSC: 111553950] Running */.div_by_zero: 6 7 0 */ +[Hera] [HADES][ERROR] [KRELTSC: 111591739] */: Division by zero +[Hera] [HADES][TEST ] [KRELTSC: 111617624] Expected error occurred +[Hera] [HADES][TEST ] Testing */ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 111665488] Expected: Should cause division by zero +[Hera] [HADES][TEST ] [KRELTSC: 111696857] Running */.empty_stack: */ +[Hera] [HADES][ERROR] [KRELTSC: 111726621] */: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 111752092] Expected error occurred +[Hera] [HADES][TEST ] Testing */ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 111938304] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 111969338] Running */.two_items: 1 2 */ +[Hera] [HADES][ERROR] [KRELTSC: 112003659] */: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 112029966] Expected error occurred +[Hera] [HADES][TEST ] Testing */ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 112078725] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 112114859] */: 10 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 112148520] ▶ Testing module: v3/src/test_runner/modules/mixed_arithmetic +[Hera] [HADES][TEST ] [KRELTSC: 112184957] Testing word: */MOD +[Hera] [HADES][TEST ] [KRELTSC: 112339081] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 112377397] Running */MOD.basic: 17 3 5 */MOD . . CR +[Hera] 10 1 +[Hera] [HADES][TEST ] [KRELTSC: 112432155] Test passed +[Hera] [HADES][TEST ] Testing */MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 112479608] Expected: Should print: 1 10 (51/5 = 10 rem 1) +[Hera] [HADES][TEST ] [KRELTSC: 112512818] Running */MOD.exact_division: 15 4 3 */MOD . . CR +[Hera] 20 0 +[Hera] [HADES][TEST ] [KRELTSC: 112557097] Test passed +[Hera] [HADES][TEST ] Testing */MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 112604165] Expected: Should print: 0 20 (60/3 = 20 rem 0) +[Hera] [HADES][TEST ] [KRELTSC: 112636578] Running */MOD.zero_multiply: 0 999 123 */MOD . . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 112821576] Test passed +[Hera] [HADES][TEST ] Testing */MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 112867069] Expected: Should print: 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 112895326] Running */MOD.by_one: 42 5 1 */MOD . . CR +[Hera] 210 0 +[Hera] [HADES][TEST ] [KRELTSC: 112939077] Test passed +[Hera] [HADES][TEST ] Testing */MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 112982985] Expected: Should print: 0 210 +[Hera] [HADES][TEST ] [KRELTSC: 113012342] Running */MOD.remainder: 7 8 5 */MOD . . CR +[Hera] 11 1 +[Hera] [HADES][TEST ] [KRELTSC: 113054372] Test passed +[Hera] [HADES][TEST ] Testing */MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 113244168] Expected: Should print: 1 11 (56/5 = 11 rem 1) +[Hera] [HADES][TEST ] [KRELTSC: 113296070] Running */MOD.negative: -7 3 4 */MOD . . CR +[Hera] -5 -1 +[Hera] [HADES][TEST ] [KRELTSC: 113344592] Test passed +[Hera] [HADES][TEST ] Testing */MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 113389841] Expected: Should handle negative +[Hera] [HADES][TEST ] [KRELTSC: 113421701] Running */MOD.div_by_zero: 6 7 0 */MOD +[Hera] [HADES][ERROR] [KRELTSC: 113459796] */MOD: Division by zero +[Hera] [HADES][TEST ] [KRELTSC: 113485277] Expected error occurred +[Hera] [HADES][TEST ] Testing */MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 113534145] Expected: Should cause division by zero +[Hera] [HADES][TEST ] [KRELTSC: 113703432] Running */MOD.empty_stack: */MOD +[Hera] [HADES][ERROR] [KRELTSC: 113738767] */MOD: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 113766699] Expected error occurred +[Hera] [HADES][TEST ] Testing */MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 113817331] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 113847998] */MOD: 8 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 113880258] ▶ Testing module: v3/src/test_runner/modules/mixed_arithmetic +[Hera] [HADES][TEST ] [KRELTSC: 113914702] Testing word: M+ +[Hera] [HADES][TEST ] [KRELTSC: 113938357] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 114113669] Running M+.basic: 0 100 200 M+ . . CR +[Hera] 300 0 +[Hera] [HADES][TEST ] [KRELTSC: 114171513] Test passed +[Hera] [HADES][TEST ] Testing M+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 114219064] Expected: Should print: 200 100 +[Hera] [HADES][TEST ] [KRELTSC: 114247456] Running M+.overflow: 0 2147483647 1 M+ . . CR +[Hera] 2147483648 0 +[Hera] [HADES][TEST ] [KRELTSC: 114292989] Test passed +[Hera] [HADES][TEST ] Testing M+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 114339631] Expected: Should handle overflow +[Hera] [HADES][TEST ] [KRELTSC: 114369268] Running M+.negative: 0 -100 50 M+ . . CR +[Hera] -50 0 +[Hera] [HADES][TEST ] [KRELTSC: 114563523] Test passed +[Hera] [HADES][TEST ] Testing M+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 114607696] Expected: Should print: 50 -100 +[Hera] [HADES][TEST ] [KRELTSC: 114638262] Running M+.zero_add: 0 42 0 M+ . . CR +[Hera] 42 0 +[Hera] [HADES][TEST ] [KRELTSC: 114682563] Test passed +[Hera] [HADES][TEST ] Testing M+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 114728272] Expected: Should print: 0 42 +[Hera] [HADES][TEST ] [KRELTSC: 114758312] Running M+.both_negative: 0 -100 -200 M+ . . CR +[Hera] -300 0 +[Hera] [HADES][TEST ] [KRELTSC: 114805565] Test passed +[Hera] [HADES][TEST ] Testing M+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 115002716] Expected: Should print: -200 -100 +[Hera] [HADES][TEST ] [KRELTSC: 115032928] Running M+.empty_stack: M+ +[Hera] [HADES][TEST ] [KRELTSC: 115065978] Expected error occurred +[Hera] [HADES][TEST ] Testing M+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 115115305] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 115146875] Running M+.one_item: 42 M+ +[Hera] [HADES][TEST ] [KRELTSC: 115173830] Expected error occurred +[Hera] [HADES][TEST ] Testing M+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 115223285] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 115253352] M+: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 115441734] ▶ Testing module: v3/src/test_runner/modules/mixed_arithmetic +[Hera] [HADES][TEST ] [KRELTSC: 115476743] Testing word: M* +[Hera] [HADES][TEST ] [KRELTSC: 115515537] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 115562047] Running M*.basic: 123 456 M* . . CR +[Hera] 0 56088 +[Hera] [HADES][TEST ] [KRELTSC: 115614945] Test passed +[Hera] [HADES][TEST ] Testing M* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 115660687] Expected: Should print: 56088 0 +[Hera] [HADES][TEST ] [KRELTSC: 115830190] Running M*.by_zero: 999 0 M* . . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 115887129] Test passed +[Hera] [HADES][TEST ] Testing M* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 115929649] Expected: Should print: 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 115958910] Running M*.by_one: 42 1 M* . . CR +[Hera] 0 42 +[Hera] [HADES][TEST ] [KRELTSC: 115999661] Test passed +[Hera] [HADES][TEST ] Testing M* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 116045177] Expected: Should print: 42 0 +[Hera] [HADES][TEST ] [KRELTSC: 116072680] Running M*.negative: -123 456 M* . . CR +[Hera] -1 -56088 +[Hera] [HADES][TEST ] [KRELTSC: 116254076] Test passed +[Hera] [HADES][TEST ] Testing M* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 116300505] Expected: Should print: -56088 -1 +[Hera] [HADES][TEST ] [KRELTSC: 116331866] Running M*.large_multiply: 65536 65536 M* . . CR +[Hera] 0 4294967296 +[Hera] [HADES][TEST ] [KRELTSC: 116379597] Test passed +[Hera] [HADES][TEST ] Testing M* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 116425244] Expected: Should handle large result +[Hera] [HADES][TEST ] [KRELTSC: 116455863] Running M*.both_negative: -100 -200 M* . . CR +[Hera] 0 20000 +[Hera] [HADES][TEST ] [KRELTSC: 116499460] Test passed +[Hera] [HADES][TEST ] Testing M* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 116545024] Expected: Should print: 20000 0 +[Hera] [HADES][TEST ] [KRELTSC: 116720845] Running M*.empty_stack: M* +[Hera] [HADES][TEST ] [KRELTSC: 116765120] Expected error occurred +[Hera] [HADES][TEST ] Testing M* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 116811068] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 116843608] Running M*.one_item: 42 M* +[Hera] [HADES][TEST ] [KRELTSC: 116872937] Expected error occurred +[Hera] [HADES][TEST ] Testing M* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 116923284] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 116952682] M*: 8 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 116982771] ▶ Testing module: v3/src/test_runner/modules/mixed_arithmetic +[Hera] [HADES][TEST ] [KRELTSC: 117158039] Testing word: M/MOD +[Hera] [HADES][TEST ] [KRELTSC: 117186214] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 117213331] Running M/MOD.basic: 0 1000 100 M/MOD . . CR +[Hera] 10 0 +[Hera] [HADES][TEST ] [KRELTSC: 117278888] Test passed +[Hera] [HADES][TEST ] Testing M/MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 117322309] Expected: Should print: 0 10 (1000/100) +[Hera] [HADES][TEST ] [KRELTSC: 117355134] Running M/MOD.with_remainder: 0 1234 100 M/MOD . . CR +[Hera] 12 34 +[Hera] [HADES][TEST ] [KRELTSC: 117400883] Test passed +[Hera] [HADES][TEST ] Testing M/MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 117614342] Expected: Should handle remainder +[Hera] [HADES][TEST ] [KRELTSC: 117644141] Running M/MOD.double_dividend: 5001 0 10 M/MOD . . CR +[Hera] 1844674407370955161 6 +[Hera] [HADES][TEST ] [KRELTSC: 117698522] Test passed +[Hera] [HADES][TEST ] Testing M/MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 117744404] Expected: Should print: 1 500 (5001/10) +[Hera] [HADES][TEST ] [KRELTSC: 117776642] Running M/MOD.by_one: 0 42 1 M/MOD . . CR +[Hera] 42 0 +[Hera] [HADES][TEST ] [KRELTSC: 117820746] Test passed +[Hera] [HADES][TEST ] Testing M/MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 118035049] Expected: Should print: 0 42 +[Hera] [HADES][TEST ] [KRELTSC: 118063805] Running M/MOD.negative_dividend: -1 1000 100 M/MOD . . CR +[Hera] -184467440737095506 -16 +[Hera] [HADES][TEST ] [KRELTSC: 118129268] Test passed +[Hera] [HADES][TEST ] Testing M/MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 118176232] Expected: Should handle negative +[Hera] [HADES][TEST ] [KRELTSC: 118206019] Running M/MOD.div_by_zero: 0 100 0 M/MOD +[Hera] [HADES][TEST ] [KRELTSC: 118240700] Expected error occurred +[Hera] [HADES][TEST ] Testing M/MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 118290004] Expected: Should cause division by zero +[Hera] [HADES][TEST ] [KRELTSC: 118491119] Running M/MOD.empty_stack: M/MOD +[Hera] [HADES][TEST ] [KRELTSC: 118528319] Expected error occurred +[Hera] [HADES][TEST ] Testing M/MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 118579550] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 118610426] M/MOD: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 118645746] === Mixed Arithmetic Words Summary: 0 passed, 0 failed, 0 skipp +[Hera] [HADES][INFO ] [KRELTSC: 118683411] +[Hera] === Testing Module: Double Words === +[Hera] [HADES][INFO ] [KRELTSC: 118722605] Running Double Number Words Tests (Module 6)... +[Hera] [HADES][TEST ] [KRELTSC: 118898030] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 118934811] Testing word: 2DROP +[Hera] [HADES][TEST ] [KRELTSC: 118960569] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 118987722] Running 2DROP.basic: 1 2 3 4 2DROP . . CR +[Hera] 2 1 +[Hera] [HADES][TEST ] [KRELTSC: 119037293] Test passed +[Hera] [HADES][TEST ] Testing 2DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 119084468] Expected: Should print: 1 2 +[Hera] [HADES][TEST ] [KRELTSC: 119110878] Running 2DROP.zeros: 0 0 42 99 2DROP . . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 119153779] Test passed +[Hera] [HADES][TEST ] Testing 2DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 119349716] Expected: Should print: 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 119376652] Running 2DROP.negative: -1 -2 100 200 2DROP . . CR +[Hera] -2 -1 +[Hera] [HADES][INFO ] [KRELTSC: 119429750] L8[TABLE]: Config 35 → 36 regime=2 score=26214 L1=0 L2=1 L3=0 +[Hera] [HADES][TEST ] [KRELTSC: 119469376] Test passed +[Hera] [HADES][TEST ] Testing 2DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 119517422] Expected: Should print: -1 -2 +[Hera] [HADES][TEST ] [KRELTSC: 119546354] Running 2DROP.exact_four: 10 20 30 40 2DROP DEPTH . CR +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 119748969] Test passed +[Hera] [HADES][TEST ] Testing 2DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 119792778] Expected: Should print: 2 +[Hera] [HADES][TEST ] [KRELTSC: 119820343] Running 2DROP.empty_stack: 2DROP +[Hera] [HADES][TEST ] [KRELTSC: 119853263] Expected error occurred +[Hera] [HADES][TEST ] Testing 2DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 119903788] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 119934796] Running 2DROP.one_item: 42 2DROP +[Hera] [HADES][TEST ] [KRELTSC: 119966872] Expected error occurred +[Hera] [HADES][TEST ] Testing 2DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 120017100] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 120047734] 2DROP: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 120223047] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 120261206] Testing word: 2DUP +[Hera] [HADES][TEST ] [KRELTSC: 120286183] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 120313233] Running 2DUP.basic: 100 200 2DUP . . . . CR +[Hera] 200 100 200 100 +[Hera] [HADES][TEST ] [KRELTSC: 120368186] Test passed +[Hera] [HADES][TEST ] Testing 2DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 120414903] Expected: Should print: 100 200 100 200 +[Hera] [HADES][TEST ] [KRELTSC: 120445868] Running 2DUP.zeros: 0 0 2DUP . . . . CR +[Hera] 0 0 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 120631603] Test passed +[Hera] [HADES][TEST ] Testing 2DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 120677197] Expected: Should print: 0 0 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 120707961] Running 2DUP.negative: -100 -200 2DUP . . . . CR +[Hera] -200 -100 -200 -100 +[Hera] [HADES][TEST ] [KRELTSC: 120756981] Test passed +[Hera] [HADES][TEST ] Testing 2DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 120803021] Expected: Should duplicate negatives +[Hera] [HADES][TEST ] [KRELTSC: 120836493] Running 2DUP.depth_check: 10 20 2DUP DEPTH . CR +[Hera] 4 +[Hera] [HADES][TEST ] [KRELTSC: 120879942] Test passed +[Hera] [HADES][TEST ] Testing 2DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 121066729] Expected: Should print: 4 +[Hera] [HADES][TEST ] [KRELTSC: 121094532] Running 2DUP.empty_stack: 2DUP +[Hera] [HADES][TEST ] [KRELTSC: 121128161] Expected error occurred +[Hera] [HADES][TEST ] Testing 2DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 121180585] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 121212944] Running 2DUP.one_item: 42 2DUP +[Hera] [HADES][TEST ] [KRELTSC: 121242093] Expected error occurred +[Hera] [HADES][TEST ] Testing 2DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 121293426] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 121324935] 2DUP: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 121489872] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 121526259] Testing word: 2OVER +[Hera] [HADES][TEST ] [KRELTSC: 121550605] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 121577255] Running 2OVER.basic: 10 20 30 40 2OVER . . . . . . CR +[Hera] 20 10 40 30 20 10 +[Hera] [HADES][TEST ] [KRELTSC: 121640780] Test passed +[Hera] [HADES][TEST ] Testing 2OVER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 121688484] Expected: Should print: 10 20 30 40 10 20 +[Hera] [HADES][TEST ] [KRELTSC: 121720062] Running 2OVER.zeros: 0 0 99 88 2OVER . . . . . . CR +[Hera] 0 0 88 99 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 121767611] Test passed +[Hera] [HADES][TEST ] Testing 2OVER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 121953581] Expected: Should print: 0 0 99 88 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 121985674] Running 2OVER.mixed: -1 2 -3 4 2OVER . . . . . . CR +[Hera] 2 -1 4 -3 2 -1 +[Hera] [HADES][TEST ] [KRELTSC: 122038568] Test passed +[Hera] [HADES][TEST ] Testing 2OVER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 122086204] Expected: Should handle mixed signs +[Hera] [HADES][TEST ] [KRELTSC: 122117086] Running 2OVER.depth_check: 1 2 3 4 2OVER DEPTH . CR +[Hera] 6 +[Hera] [HADES][TEST ] [KRELTSC: 122163483] Test passed +[Hera] [HADES][TEST ] Testing 2OVER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 122335885] Expected: Should print: 6 +[Hera] [HADES][TEST ] [KRELTSC: 122374376] Running 2OVER.three_items: 1 2 3 2OVER +[Hera] [HADES][TEST ] [KRELTSC: 122410518] Expected error occurred +[Hera] [HADES][TEST ] Testing 2OVER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 122457289] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 122488223] Running 2OVER.empty_stack: 2OVER +[Hera] [HADES][TEST ] [KRELTSC: 122518890] Expected error occurred +[Hera] [HADES][TEST ] Testing 2OVER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 122569587] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 122600319] 2OVER: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 122632273] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 122809024] Testing word: 2SWAP +[Hera] [HADES][TEST ] [KRELTSC: 122833308] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 122858937] Running 2SWAP.basic: 10 20 30 40 2SWAP . . . . CR +[Hera] 20 10 40 30 +[Hera] [HADES][TEST ] [KRELTSC: 122918859] Test passed +[Hera] [HADES][TEST ] Testing 2SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 122967121] Expected: Should print: 30 40 10 20 +[Hera] [HADES][TEST ] [KRELTSC: 122998994] Running 2SWAP.zeros: 0 0 99 88 2SWAP . . . . CR +[Hera] 0 0 88 99 +[Hera] [HADES][TEST ] [KRELTSC: 123045653] Test passed +[Hera] [HADES][TEST ] Testing 2SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 123090681] Expected: Should print: 99 88 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 123252932] Running 2SWAP.same_pairs: 42 42 42 42 2SWAP . . . . CR +[Hera] 42 42 42 42 +[Hera] [HADES][TEST ] [KRELTSC: 123304891] Test passed +[Hera] [HADES][TEST ] Testing 2SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 123352648] Expected: Should print: 42 42 42 42 +[Hera] [HADES][TEST ] [KRELTSC: 123384753] Running 2SWAP.negative: -10 -20 30 40 2SWAP . . . . CR +[Hera] -20 -10 40 30 +[Hera] [HADES][TEST ] [KRELTSC: 123437828] Test passed +[Hera] [HADES][TEST ] Testing 2SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 123490987] Expected: Should print: 30 40 -10 -20 +[Hera] [HADES][TEST ] [KRELTSC: 123683115] Running 2SWAP.depth_check: 1 2 3 4 2SWAP DEPTH . CR +[Hera] 4 +[Hera] [HADES][TEST ] [KRELTSC: 123734406] Test passed +[Hera] [HADES][TEST ] Testing 2SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 123783226] Expected: Should print: 4 +[Hera] [HADES][TEST ] [KRELTSC: 123813024] Running 2SWAP.three_items: 1 2 3 2SWAP +[Hera] [HADES][TEST ] [KRELTSC: 123851070] Expected error occurred +[Hera] [HADES][TEST ] Testing 2SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 123904029] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 123935751] Running 2SWAP.empty_stack: 2SWAP +[Hera] [HADES][TEST ] [KRELTSC: 124141778] Expected error occurred +[Hera] [HADES][TEST ] Testing 2SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 124204874] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 124236494] 2SWAP: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 124268886] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 124306865] Testing word: 2ROT +[Hera] [HADES][TEST ] [KRELTSC: 124333838] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 124360340] Running 2ROT.basic: 10 20 30 40 50 60 2ROT . . . . . . CR +[Hera] 20 10 60 50 40 30 +[Hera] [HADES][TEST ] [KRELTSC: 124566554] Test passed +[Hera] [HADES][TEST ] Testing 2ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 124616837] Expected: Should print: 30 40 50 60 10 20 +[Hera] [HADES][TEST ] [KRELTSC: 124651199] Running 2ROT.zeros: 0 0 1 1 2 2 2ROT . . . . . . CR +[Hera] 0 0 2 2 1 1 +[Hera] [HADES][TEST ] [KRELTSC: 124702186] Test passed +[Hera] [HADES][TEST ] Testing 2ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 124751344] Expected: Should rotate with zeros +[Hera] [HADES][TEST ] [KRELTSC: 124782820] Running 2ROT.negative: -1 -2 3 4 -5 -6 2ROT . . . . . . CR +[Hera] -2 -1 -6 -5 4 3 +[Hera] [HADES][TEST ] [KRELTSC: 124979630] Test passed +[Hera] [HADES][TEST ] Testing 2ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 125029047] Expected: Should handle negatives +[Hera] [HADES][TEST ] [KRELTSC: 125061381] Running 2ROT.depth_check: 1 2 3 4 5 6 2ROT DEPTH . CR +[Hera] 6 +[Hera] [HADES][TEST ] [KRELTSC: 125112943] Test passed +[Hera] [HADES][TEST ] Testing 2ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 125160518] Expected: Should print: 6 +[Hera] [HADES][TEST ] [KRELTSC: 125189698] Running 2ROT.five_items: 1 2 3 4 5 2ROT +[Hera] [HADES][TEST ] [KRELTSC: 125230588] Expected error occurred +[Hera] [HADES][TEST ] Testing 2ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 125417198] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 125449020] Running 2ROT.empty_stack: 2ROT +[Hera] [HADES][TEST ] [KRELTSC: 125482197] Expected error occurred +[Hera] [HADES][TEST ] Testing 2ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 125535721] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 125568399] 2ROT: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 125602847] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 125640977] Testing word: D+ +[Hera] [HADES][TEST ] [KRELTSC: 125664860] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 125826357] Running D+.basic: 100 200 300 400 D+ . . CR +[Hera] 600 400 +[Hera] [HADES][TEST ] [KRELTSC: 125882702] Test passed +[Hera] [HADES][TEST ] Testing D+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 125929913] Expected: Should print: 400 600 +[Hera] [HADES][TEST ] [KRELTSC: 125960368] Running D+.zero_add: 42 99 0 0 D+ . . CR +[Hera] 99 42 +[Hera] [HADES][TEST ] [KRELTSC: 126002644] Test passed +[Hera] [HADES][TEST ] Testing D+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 126053521] Expected: Should print: 42 99 +[Hera] [HADES][TEST ] [KRELTSC: 126083821] Running D+.negative: -100 -200 50 75 D+ . . CR +[Hera] -125 -50 +[Hera] [HADES][TEST ] [KRELTSC: 126256697] Test passed +[Hera] [HADES][TEST ] Testing D+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 126313099] Expected: Should handle negatives +[Hera] [HADES][TEST ] [KRELTSC: 126344498] Running D+.carry: 2147483647 0 1 0 D+ . . CR +[Hera] 0 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 126392112] Test passed +[Hera] [HADES][TEST ] Testing D+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 126436917] Expected: Should handle carry +[Hera] [HADES][TEST ] [KRELTSC: 126466019] Running D+.both_negative: -100 -200 -300 -400 D+ . . CR +[Hera] -599 -400 +[Hera] [HADES][TEST ] [KRELTSC: 126515386] Test passed +[Hera] [HADES][TEST ] Testing D+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 126688579] Expected: Should add negatives +[Hera] [HADES][TEST ] [KRELTSC: 126727434] Running D+.three_items: 1 2 3 D+ +[Hera] [HADES][TEST ] [KRELTSC: 126762824] Expected error occurred +[Hera] [HADES][TEST ] Testing D+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 126814331] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 126848197] Running D+.empty_stack: D+ +[Hera] [HADES][TEST ] [KRELTSC: 126876859] Expected error occurred +[Hera] [HADES][TEST ] Testing D+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 126928289] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 126961462] D+: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 127118113] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 127165952] Testing word: D- +[Hera] [HADES][TEST ] [KRELTSC: 127190093] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 127217396] Running D-.basic: 500 600 100 200 D- . . CR +[Hera] 400 [HADES][INFO ] [KRELTSC: 127279097] L8[TABLE]: Config 36 → 37 regime=2 score=26214 L1=0 L2=1 L3=0 +[Hera] 400 +[Hera] [HADES][TEST ] [KRELTSC: 127320375] Test passed +[Hera] [HADES][TEST ] Testing D- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 127367625] Expected: Should print: 400 400 +[Hera] [HADES][TEST ] [KRELTSC: 127398063] Running D-.zero_sub: 42 99 0 0 D- . . CR +[Hera] 99 42 +[Hera] [HADES][TEST ] [KRELTSC: 127576226] Test passed +[Hera] [HADES][TEST ] Testing D- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 127620950] Expected: Should print: 42 99 +[Hera] [HADES][TEST ] [KRELTSC: 127650275] Running D-.from_zero: 0 0 100 200 D- . . CR +[Hera] -201 -100 +[Hera] [HADES][TEST ] [KRELTSC: 127694642] Test passed +[Hera] [HADES][TEST ] Testing D- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 127741896] Expected: Should print: -100 -200 +[Hera] [HADES][TEST ] [KRELTSC: 127772226] Running D-.negative: 100 200 -50 -75 D- . . CR +[Hera] 274 150 +[Hera] [HADES][TEST ] [KRELTSC: 127818194] Test passed +[Hera] [HADES][TEST ] Testing D- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 127862820] Expected: Should handle negatives +[Hera] [HADES][TEST ] [KRELTSC: 128039762] Running D-.borrow: 0 0 1 0 D- . . CR +[Hera] -1 -1 +[Hera] [HADES][TEST ] [KRELTSC: 128083101] Test passed +[Hera] [HADES][TEST ] Testing D- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 128130600] Expected: Should handle borrow +[Hera] [HADES][TEST ] [KRELTSC: 128160205] Running D-.same_values: 100 200 100 200 D- . . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 128201997] Test passed +[Hera] [HADES][TEST ] Testing D- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 128247768] Expected: Should print: 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 128275940] Running D-.three_items: 1 2 3 D- +[Hera] [HADES][TEST ] [KRELTSC: 128458203] Expected error occurred +[Hera] [HADES][TEST ] Testing D- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 128507620] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 128539786] Running D-.empty_stack: D- +[Hera] [HADES][TEST ] [KRELTSC: 128568396] Expected error occurred +[Hera] [HADES][TEST ] Testing D- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 128616867] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 128648286] D-: 8 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 128678669] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 128714042] Testing word: DNEGATE +[Hera] [HADES][TEST ] [KRELTSC: 128890052] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 128919004] Running DNEGATE.positive: 100 200 DNEGATE . . CR +[Hera] -201 -100 +[Hera] [HADES][TEST ] [KRELTSC: 129003052] Test passed +[Hera] [HADES][TEST ] Testing DNEGATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 129061009] Expected: Should negate positive double +[Hera] [HADES][TEST ] [KRELTSC: 129093549] Running DNEGATE.negative: -100 -200 DNEGATE . . CR +[Hera] 199 100 +[Hera] [HADES][TEST ] [KRELTSC: 129140446] Test passed +[Hera] [HADES][TEST ] Testing DNEGATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 129347412] Expected: Should negate negative double +[Hera] [HADES][TEST ] [KRELTSC: 129385141] Running DNEGATE.zero: 0 0 DNEGATE . . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 129468678] Test passed +[Hera] [HADES][TEST ] Testing DNEGATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 129518343] Expected: Should print: 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 129547012] Running DNEGATE.max_positive: 2147483647 0 DNEGATE . . CR +[Hera] -1 -2147483647 +[Hera] [HADES][TEST ] [KRELTSC: 129741623] Test passed +[Hera] [HADES][TEST ] Testing DNEGATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 129788163] Expected: Should negate max positive +[Hera] [HADES][TEST ] [KRELTSC: 129819386] Running DNEGATE.one_item: 42 DNEGATE +[Hera] [HADES][TEST ] [KRELTSC: 129854290] Expected error occurred +[Hera] [HADES][TEST ] Testing DNEGATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 129905678] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 129936553] Running DNEGATE.empty_stack: DNEGATE +[Hera] [HADES][TEST ] [KRELTSC: 129968748] Expected error occurred +[Hera] [HADES][TEST ] Testing DNEGATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 130022250] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 130208708] DNEGATE: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 130242124] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 130280546] Testing word: DABS +[Hera] [HADES][TEST ] [KRELTSC: 130305793] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 130332968] Running DABS.positive: 100 200 DABS . . CR +[Hera] 200 100 +[Hera] [HADES][TEST ] [KRELTSC: 130387009] Test passed +[Hera] [HADES][TEST ] Testing DABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 130432931] Expected: Should print: 100 200 +[Hera] [HADES][TEST ] [KRELTSC: 130612857] Running DABS.negative: -100 -200 DABS . . CR +[Hera] 199 100 +[Hera] [HADES][TEST ] [KRELTSC: 130674750] Test passed +[Hera] [HADES][TEST ] Testing DABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 130723805] Expected: Should print: 100 200 +[Hera] [HADES][TEST ] [KRELTSC: 130752815] Running DABS.zero: 0 0 DABS . . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 130793111] Test passed +[Hera] [HADES][TEST ] Testing DABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 130839972] Expected: Should print: 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 130867418] Running DABS.mixed_sign: 100 -1 DABS . . CR +[Hera] 0 -100 +[Hera] [HADES][TEST ] [KRELTSC: 131073521] Test passed +[Hera] [HADES][TEST ] Testing DABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 131120168] Expected: Should handle mixed sign +[Hera] [HADES][TEST ] [KRELTSC: 131151068] Running DABS.min_double: -2147483648 -1 DABS . . CR +[Hera] 0 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 131199357] Test passed +[Hera] [HADES][TEST ] Testing DABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 131245270] Expected: Should handle min double +[Hera] [HADES][TEST ] [KRELTSC: 131276520] Running DABS.one_item: 42 DABS +[Hera] [HADES][TEST ] [KRELTSC: 131308902] Expected error occurred +[Hera] [HADES][TEST ] Testing DABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 131522702] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 131554278] Running DABS.empty_stack: DABS +[Hera] [HADES][TEST ] [KRELTSC: 131587093] Expected error occurred +[Hera] [HADES][TEST ] Testing DABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 131637420] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 131667675] DABS: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 131700577] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 131736747] Testing word: DMIN +[Hera] [HADES][TEST ] [KRELTSC: 131761977] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 131962497] Running DMIN.basic: 100 200 300 400 DMIN . . CR +[Hera] 200 100 +[Hera] [HADES][TEST ] [KRELTSC: 132026968] Test passed +[Hera] [HADES][TEST ] Testing DMIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 132071928] Expected: Should print: 100 200 +[Hera] [HADES][TEST ] [KRELTSC: 132101028] Running DMIN.equal: 42 99 42 99 DMIN . . CR +[Hera] 99 42 +[Hera] [HADES][TEST ] [KRELTSC: 132151701] Test passed +[Hera] [HADES][TEST ] Testing DMIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 132364285] Expected: Should print: 42 99 +[Hera] [HADES][TEST ] [KRELTSC: 132406955] Running DMIN.negative: -100 -200 -50 -75 DMIN . . CR +[Hera] -200 -100 +[Hera] [HADES][TEST ] [KRELTSC: 132459519] Test passed +[Hera] [HADES][TEST ] Testing DMIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 132508216] Expected: Should find min negative +[Hera] [HADES][TEST ] [KRELTSC: 132539839] Running DMIN.mixed: -100 -1 100 0 DMIN . . CR +[Hera] -1 -100 +[Hera] [HADES][TEST ] [KRELTSC: 132585463] Test passed +[Hera] [HADES][TEST ] Testing DMIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 132766156] Expected: Should handle mixed signs +[Hera] [HADES][TEST ] [KRELTSC: 132809660] Running DMIN.three_items: 1 2 3 DMIN +[Hera] [HADES][TEST ] [KRELTSC: 132849430] Expected error occurred +[Hera] [HADES][TEST ] Testing DMIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 132900010] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 132931966] Running DMIN.empty_stack: DMIN +[Hera] [HADES][TEST ] [KRELTSC: 132962246] Expected error occurred +[Hera] [HADES][TEST ] Testing DMIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 133012913] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 133044395] DMIN: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 133201037] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 133247075] Testing word: DMAX +[Hera] [HADES][TEST ] [KRELTSC: 133271192] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 133298844] Running DMAX.basic: 100 200 300 400 DMAX . . CR +[Hera] 400 300 +[Hera] [HADES][TEST ] [KRELTSC: 133358721] Test passed +[Hera] [HADES][TEST ] Testing DMAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 133406696] Expected: Should print: 300 400 +[Hera] [HADES][TEST ] [KRELTSC: 133436072] Running DMAX.equal: 42 99 42 99 DMAX . . CR +[Hera] 99 42 +[Hera] [HADES][TEST ] [KRELTSC: 133491786] Test passed +[Hera] [HADES][TEST ] Testing DMAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 133674320] Expected: Should print: 42 99 +[Hera] [HADES][TEST ] [KRELTSC: 133703003] Running DMAX.negative: -300 -400 -100 -200 DMAX . . CR +[Hera] -200 -100 +[Hera] [HADES][TEST ] [KRELTSC: 133756467] Test passed +[Hera] [HADES][TEST ] Testing DMAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 133804318] Expected: Should find max negative +[Hera] [HADES][TEST ] [KRELTSC: 133837574] Running DMAX.mixed: -100 -1 100 0 DMAX . . CR +[Hera] 0 100 +[Hera] [HADES][TEST ] [KRELTSC: 133883254] Test passed +[Hera] [HADES][TEST ] Testing DMAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 133930006] Expected: Should handle mixed signs +[Hera] [HADES][TEST ] [KRELTSC: 134102396] Running DMAX.three_items: 1 2 3 DMAX +[Hera] [HADES][TEST ] [KRELTSC: 134139192] Expected error occurred +[Hera] [HADES][TEST ] Testing DMAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 134191657] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 134228447] Running DMAX.empty_stack: DMAX +[Hera] [HADES][TEST ] [KRELTSC: 134257985] Expected error occurred +[Hera] [HADES][TEST ] Testing DMAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 134309482] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 134341237] DMAX: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 134499081] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 134545860] Testing word: D= +[Hera] [HADES][TEST ] [KRELTSC: 134569387] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 134598765] Running D=.equal: 100 200 100 200 D= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 134655698] Test passed +[Hera] [HADES][TEST ] Testing D= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 134700489] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 134729416] Running D=.not_equal_low: 100 200 101 200 D= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 134775491] Test passed +[Hera] [HADES][TEST ] Testing D= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 134961793] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 134988858] Running D=.not_equal_high: 100 200 100 201 D= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 135034595] Test passed +[Hera] [HADES][TEST ] Testing D= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 135081280] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 135110275] Running D=.zero_equal: 0 0 0 0 D= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 135150957] Test passed +[Hera] [HADES][TEST ] Testing D= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 135197662] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 135227173] Running D=.negative_equal: -100 -200 -100 -200 D= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 135416954] Test passed +[Hera] [HADES][TEST ] Testing D= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 135461836] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 135491810] Running D=.three_items: 1 2 3 D= +[Hera] [HADES][TEST ] [KRELTSC: 135526045] Expected error occurred +[Hera] [HADES][TEST ] Testing D= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 135572006] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 135604076] Running D=.empty_stack: D= +[Hera] [HADES][TEST ] [KRELTSC: 135633054] Expected error occurred +[Hera] [HADES][TEST ] Testing D= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 135811855] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 135855330] D=: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 135886973] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 135923974] Testing word: D< +[Hera] [HADES][TEST ] [KRELTSC: 135950794] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 135977905] Running D<.less_than: 100 200 300 400 D< . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 136033508] Test passed +[Hera] [HADES][TEST ] Testing D< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 136081071] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 136109710] Running D<.greater_than: 300 400 100 200 D< . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 136293401] Test passed +[Hera] [HADES][TEST ] Testing D< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 136344926] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 136379549] Running D<.equal: 100 200 100 200 D< . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 136433896] Test passed +[Hera] [HADES][TEST ] Testing D< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 136492495] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 136527329] Running D<.negative_positive: -100 -1 100 0 D< . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 136747554] Test passed +[Hera] [HADES][TEST ] Testing D< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 136806231] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 136841687] Running D<.negative_negative: -300 -1 -100 -1 D< . CR +[Hera] -1 +[Hera] [HADES][INFO ] [KRELTSC: 136904770] L8[TABLE]: Config 37 → 38 regime=2 score=26214 L1=0 L2=1 L3=0 +[Hera] [HADES][TEST ] [KRELTSC: 136954905] Test passed +[Hera] [HADES][TEST ] Testing D< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 137182101] Expected: Should compare negatives +[Hera] [HADES][TEST ] [KRELTSC: 137224596] Running D<.high_word_diff: 100 200 100 300 D< . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 137286814] Test passed +[Hera] [HADES][TEST ] Testing D< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 137343596] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 137371952] Running D<.three_items: 1 2 3 D< +[Hera] [HADES][TEST ] [KRELTSC: 137408418] Expected error occurred +[Hera] [HADES][TEST ] Testing D< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 137642332] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 137683531] Running D<.empty_stack: D< +[Hera] [HADES][TEST ] [KRELTSC: 137713220] Expected error occurred +[Hera] [HADES][TEST ] Testing D< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 137758183] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 137788790] D<: 8 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 137818510] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 138005243] Testing word: D0= +[Hera] [HADES][TEST ] [KRELTSC: 138059777] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 138107432] Running D0=.zero: 0 0 D0= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 138157063] Test passed +[Hera] [HADES][TEST ] Testing D0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 138202730] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 138230681] Running D0=.positive: 100 200 D0= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 138273871] Test passed +[Hera] [HADES][TEST ] Testing D0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 138484671] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 138516261] Running D0=.negative: -100 -200 D0= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 138564932] Test passed +[Hera] [HADES][TEST ] Testing D0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 138613241] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 138644581] Running D0=.zero_high: 0 100 D0= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 138690903] Test passed +[Hera] [HADES][TEST ] Testing D0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 138896119] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 138924804] Running D0=.zero_low: 100 0 D0= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 138968985] Test passed +[Hera] [HADES][TEST ] Testing D0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 139016746] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 139042714] Running D0=.one_item: 42 D0= +[Hera] [HADES][TEST ] [KRELTSC: 139077275] Expected error occurred +[Hera] [HADES][TEST ] Testing D0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 139124384] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 139323919] Running D0=.empty_stack: D0= +[Hera] [HADES][TEST ] [KRELTSC: 139356737] Expected error occurred +[Hera] [HADES][TEST ] Testing D0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 139414255] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 139449172] D0=: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 139481692] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 139520908] Testing word: D0< +[Hera] [HADES][TEST ] [KRELTSC: 139546706] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 139701488] Running D0<.negative: -100 -1 D0< . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 139762572] Test passed +[Hera] [HADES][TEST ] Testing D0< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 139807794] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 139841482] Running D0<.zero: 0 0 D0< . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 139883349] Test passed +[Hera] [HADES][TEST ] Testing D0< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 139930325] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 139960916] Running D0<.positive: 100 0 D0< . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 140004454] Test passed +[Hera] [HADES][TEST ] Testing D0< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 140199254] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 140226540] Running D0<.negative_high_only: 100 -1 D0< . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 140275072] Test passed +[Hera] [HADES][TEST ] Testing D0< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 140321255] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 140348732] Running D0<.large_negative: -1 -1 D0< . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 140401113] Test passed +[Hera] [HADES][TEST ] Testing D0< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 140586986] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 140624900] Running D0<.one_item: 42 D0< +[Hera] [HADES][TEST ] [KRELTSC: 140657792] Expected error occurred +[Hera] [HADES][TEST ] Testing D0< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 140711429] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 140743059] Running D0<.empty_stack: D0< +[Hera] [HADES][TEST ] [KRELTSC: 140772320] Expected error occurred +[Hera] [HADES][TEST ] Testing D0< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 140819745] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 140850341] D0<: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 140881477] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 141050788] Testing word: S>D +[Hera] [HADES][TEST ] [KRELTSC: 141075843] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 141103326] Running S>D.positive: 5 S>D . . CR +[Hera] 0 5 +[Hera] [HADES][TEST ] [KRELTSC: 141163086] Test passed +[Hera] [HADES][TEST ] Testing S>D ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 141211094] Expected: Should sign-extend positive: 0 5 +[Hera] [HADES][TEST ] [KRELTSC: 141244908] Running S>D.negative: -5 S>D . . CR +[Hera] -1 -5 +[Hera] [HADES][TEST ] [KRELTSC: 141288769] Test passed +[Hera] [HADES][TEST ] Testing S>D ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 141476668] Expected: Should sign-extend negative: -1 -5 +[Hera] [HADES][TEST ] [KRELTSC: 141509619] Running S>D.zero: 0 S>D . . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 141557091] Test passed +[Hera] [HADES][TEST ] Testing S>D ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 141608649] Expected: Should sign-extend zero: 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 141642214] Running S>D.max_int: 2147483647 S>D . . CR +[Hera] 0 2147483647 +[Hera] [HADES][TEST ] [KRELTSC: 141692352] Test passed +[Hera] [HADES][TEST ] Testing S>D ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 141740899] Expected: Should extend max int: 0 2147483647 +[Hera] [HADES][TEST ] [KRELTSC: 141916884] Running S>D.min_int: -2147483648 S>D . . CR +[Hera] -1 -2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 141966937] Test passed +[Hera] [HADES][TEST ] Testing S>D ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 142015704] Expected: Should extend min int: -1 -2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 142053799] Running S>D.empty_stack: S>D +[Hera] [HADES][TEST ] [KRELTSC: 142085711] Expected error occurred +[Hera] [HADES][TEST ] Testing S>D ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 142137705] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 142169880] S>D: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 142340228] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 142375944] Testing word: D2* +[Hera] [HADES][TEST ] [KRELTSC: 142401407] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 142428758] Running D2*.basic: 5 0 D2* . . CR +[Hera] 0 10 +[Hera] [HADES][TEST ] [KRELTSC: 142484085] Test passed +[Hera] [HADES][TEST ] Testing D2* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 142528939] Expected: Should double 5: 0 10 +[Hera] [HADES][TEST ] [KRELTSC: 142558356] Running D2*.zero: 0 0 D2* . . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 142599581] Test passed +[Hera] [HADES][TEST ] Testing D2* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 142835256] Expected: Should double zero: 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 142869750] Running D2*.negative: -1 -1 D2* . . CR +[Hera] -1 -2 +[Hera] [HADES][TEST ] [KRELTSC: 142923487] Test passed +[Hera] [HADES][TEST ] Testing D2* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 142974738] Expected: Should double -1: -1 -2 +[Hera] [HADES][TEST ] [KRELTSC: 143006647] Running D2*.carry: 0 1 D2* . . CR +[Hera] 2 0 +[Hera] [HADES][TEST ] [KRELTSC: 143055064] Test passed +[Hera] [HADES][TEST ] Testing D2* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 143103957] Expected: Should shift high cell: 0 2 +[Hera] [HADES][TEST ] [KRELTSC: 143350661] Running D2*.empty_stack: D2* +[Hera] [HADES][TEST ] [KRELTSC: 143390352] Expected error occurred +[Hera] [HADES][TEST ] Testing D2* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 143440973] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 143473094] D2*: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 143503007] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 143704674] Testing word: D2/ +[Hera] [HADES][TEST ] [KRELTSC: 143730974] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 143758865] Running D2/.basic: 10 0 D2/ . . CR +[Hera] 0 5 +[Hera] [HADES][TEST ] [KRELTSC: 143813645] Test passed +[Hera] [HADES][TEST ] Testing D2/ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 143864402] Expected: Should halve 10: 0 5 +[Hera] [HADES][TEST ] [KRELTSC: 143892568] Running D2/.negative: -2 -1 D2/ . . CR +[Hera] -1 -1 +[Hera] [HADES][TEST ] [KRELTSC: 144102880] Test passed +[Hera] [HADES][TEST ] Testing D2/ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 144156848] Expected: Should halve -2: -1 -1 +[Hera] [HADES][TEST ] [KRELTSC: 144191220] Running D2/.zero: 0 0 D2/ . . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 144246920] Test passed +[Hera] [HADES][TEST ] Testing D2/ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 144299372] Expected: Should halve zero: 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 144332149] Running D2/.odd: 3 0 D2/ . . CR +[Hera] 0 1 +[Hera] [HADES][TEST ] [KRELTSC: 144377958] Test passed +[Hera] [HADES][TEST ] Testing D2/ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 144579215] Expected: Should truncate toward zero: 0 1 +[Hera] [HADES][TEST ] [KRELTSC: 144625985] Running D2/.empty_stack: D2/ +[Hera] [HADES][TEST ] [KRELTSC: 144663216] Expected error occurred +[Hera] [HADES][TEST ] Testing D2/ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 144716261] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 144753246] D2/: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 144800436] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 144979902] Testing word: 2>R +[Hera] [HADES][TEST ] [KRELTSC: 145022733] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 145051967] Running 2>R.roundtrip: 10 20 2>R 2R> . . CR +[Hera] 20 10 +[Hera] [HADES][TEST ] [KRELTSC: 145114761] Test passed +[Hera] [HADES][TEST ] Testing 2>R ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 145164645] Expected: Should store and retrieve: 20 10 +[Hera] [HADES][TEST ] [KRELTSC: 145203079] Running 2>R.depth_after: 1 2 2>R DEPTH . 2R> DROP DROP CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 145446518] Test passed +[Hera] [HADES][TEST ] Testing 2>R ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 145501086] Expected: Should empty data stack: 0 +[Hera] [HADES][TEST ] [KRELTSC: 145628171] Running 2>R.empty_stack: 2>R +[Hera] [HADES][TEST ] [KRELTSC: 145792639] Expected error occurred +[Hera] [HADES][TEST ] Testing 2>R ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 145864185] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 145905173] 2>R: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 145939933] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 145977476] Testing word: 2R> +[Hera] [HADES][TEST ] [KRELTSC: 146003363] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 146031513] Running 2R>.roundtrip: 5 6 2>R 2R> . . CR +[Hera] 6 5 +[Hera] [HADES][TEST ] [KRELTSC: 146081009] Test passed +[Hera] [HADES][TEST ] Testing 2R> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 146125304] Expected: Should retrieve double: 6 5 +[Hera] [HADES][TEST ] [KRELTSC: 146166117] Running 2R>.depth: 9 8 2>R 2R> DEPTH . CR +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 146214173] Test passed +[Hera] [HADES][TEST ] Testing 2R> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 146406358] Expected: Should push 2 items to data stack: 2 +[Hera] [HADES][TEST ] [KRELTSC: 146440580] Running 2R>.empty_rstack: 2R> +[Hera] [HADES][TEST ] [KRELTSC: 146473684] Expected error occurred +[Hera] [HADES][TEST ] Testing 2R> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 146538330] Expected: Should cause return stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 146573780] 2R>: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 146606891] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 146645863] Testing word: 2R@ +[Hera] [HADES][TEST ] [KRELTSC: 146670965] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 146698959] Running 2R@.peek: 3 4 2>R 2R@ . . 2R> DROP DROP CR +[Hera] 4 3 +[Hera] [HADES][TEST ] [KRELTSC: 146767444] Test passed +[Hera] [HADES][TEST ] Testing 2R@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 146816991] Expected: Should peek: 4 3 +[Hera] [HADES][TEST ] [KRELTSC: 146848207] Running 2R@.non_destructive: 7 8 2>R 2R@ DROP DROP 2R> . . CR +[Hera] 8 7 +[Hera] [HADES][TEST ] [KRELTSC: 146900498] Test passed +[Hera] [HADES][TEST ] Testing 2R@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 146955875] Expected: Should leave rstack intact +[Hera] [HADES][TEST ] [KRELTSC: 146986933] Running 2R@.empty_rstack: 2R@ +[Hera] [HADES][TEST ] [KRELTSC: 147169063] Expected error occurred +[Hera] [HADES][TEST ] Testing 2R@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 147221945] Expected: Should cause return stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 147256719] 2R@: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 147290643] === Double Number Words Summary: 0 passed, 0 failed, 0 skipped, +[Hera] [HADES][INFO ] [KRELTSC: 147337511] +[Hera] === Testing Module: Format Words === +[Hera] [HADES][INFO ] [KRELTSC: 147389504] Running Format Words Tests (Module 10)... +[Hera] [HADES][TEST ] [KRELTSC: 147548534] ▶ Testing module: v3/src/test_runner/modules/format_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 147607021] Testing word: BASE +[Hera] [HADES][TEST ] [KRELTSC: 147633796] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 147662113] Running BASE.decimal: DECIMAL 42 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 147713464] Test passed +[Hera] [HADES][TEST ] Testing BASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 147761636] Expected: Should print: 42 +[Hera] [HADES][TEST ] [KRELTSC: 147790053] Running BASE.hex: HEX FF . CR +[Hera] FF +[Hera] [HADES][TEST ] [KRELTSC: 147838886] Test passed +[Hera] [HADES][TEST ] Testing BASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 148027367] Expected: Should print: FF +[Hera] [HADES][TEST ] [KRELTSC: 148050400] Running BASE.octal: OCTAL 52 . CR +[Hera] 52 +[Hera] [HADES][TEST ] [KRELTSC: 148101434] Test passed +[Hera] [HADES][TEST ] Testing BASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 148149737] Expected: Should print: 52 +[Hera] [HADES][TEST ] [KRELTSC: 148181526] Running BASE.base_store: 16 BASE ! 255 . CR +[Hera] 723 +[Hera] [HADES][TEST ] [KRELTSC: 148391478] Test passed +[Hera] [HADES][TEST ] Testing BASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 148438100] Expected: Should print: FF +[Hera] [HADES][TEST ] [KRELTSC: 148470080] Running BASE.base_fetch: BASE @ . CR +[Hera] 16 +[Hera] [HADES][TEST ] [KRELTSC: 148515475] Test passed +[Hera] [HADES][TEST ] Testing BASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 148564793] Expected: Should print current base +[Hera] [HADES][TEST ] [KRELTSC: 148596582] BASE: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 148633288] ▶ Testing module: v3/src/test_runner/modules/format_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 148671372] Testing word: DECIMAL +[Hera] [HADES][TEST ] [KRELTSC: 148698750] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 148732796] Running DECIMAL.from_hex: HEX FF DECIMAL . CR +[Hera] 255 +[Hera] [HADES][TEST ] [KRELTSC: 148909674] Test passed +[Hera] [HADES][TEST ] Testing DECIMAL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 148957299] Expected: Should print: 255 +[Hera] [HADES][TEST ] [KRELTSC: 148988574] Running DECIMAL.from_octal: OCTAL 52 DECIMAL . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 149038208] Test passed +[Hera] [HADES][TEST ] Testing DECIMAL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 149227278] Expected: Should print: 42 +[Hera] [HADES][TEST ] [KRELTSC: 149267680] Running DECIMAL.state_persist: DECIMAL 42 . CR 42 . CR HEX 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 149336773] Test passed +[Hera] [HADES][TEST ] Testing DECIMAL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 149383623] Expected: Should maintain base +[Hera] [HADES][TEST ] [KRELTSC: 149414546] DECIMAL: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 149448657] ▶ Testing module: v3/src/test_runner/modules/format_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 149489184] Testing word: HEX +[Hera] [HADES][TEST ] [KRELTSC: 149515895] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 149541937] Running HEX.from_decimal: DECIMAL 255 HEX . CR +[Hera] FF +[Hera] [HADES][TEST ] [KRELTSC: 149731368] Test passed +[Hera] [HADES][TEST ] Testing HEX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 149779985] Expected: Should print: FF +[Hera] [HADES][TEST ] [KRELTSC: 149809471] Running HEX.from_octal: OCTAL 52 HEX . CR +[Hera] 2A +[Hera] [HADES][TEST ] [KRELTSC: 149853592] Test passed +[Hera] [HADES][TEST ] Testing HEX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 149901675] Expected: Should print: 2A +[Hera] [HADES][TEST ] [KRELTSC: 149933004] Running HEX.state_persist: HEX FF . CR DECIMAL 255 . CR +[Hera] FF +[Hera] [HADES][INFO ] [KRELTSC: 150156892] L8[TABLE]: Config 38 → 39 regime=2 score=52428 L1=0 L2=1 L3=0 +[Hera] 255 +[Hera] [HADES][TEST ] [KRELTSC: 150209828] Test passed +[Hera] [HADES][TEST ] Testing HEX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 150256613] Expected: Should maintain base +[Hera] [HADES][TEST ] [KRELTSC: 150287667] HEX: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 150321076] ▶ Testing module: v3/src/test_runner/modules/format_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 150359000] Testing word: OCTAL +[Hera] [HADES][TEST ] [KRELTSC: 150387291] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 150590580] Running OCTAL.from_decimal: DECIMAL 42 OCTAL . CR +[Hera] 52 +[Hera] [HADES][TEST ] [KRELTSC: 150641048] Test passed +[Hera] [HADES][TEST ] Testing OCTAL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 150689108] Expected: Should print: 52 +[Hera] [HADES][TEST ] [KRELTSC: 150717690] Running OCTAL.from_hex: HEX 2A OCTAL . CR +[Hera] 52 +[Hera] [HADES][TEST ] [KRELTSC: 150758621] Test passed +[Hera] [HADES][TEST ] Testing OCTAL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 150806464] Expected: Should print: 52 +[Hera] [HADES][TEST ] [KRELTSC: 150834884] Running OCTAL.state_persist: DECIMAL 42 . CR OCTAL 52 . CR +[Hera] 42 +[Hera] 52 +[Hera] [HADES][TEST ] [KRELTSC: 151055968] Test passed +[Hera] [HADES][TEST ] Testing OCTAL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 151106927] Expected: Should maintain base +[Hera] [HADES][TEST ] [KRELTSC: 151139172] OCTAL: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 151171831] ▶ Testing module: v3/src/test_runner/modules/format_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 151211577] Testing word: <# +[Hera] [HADES][TEST ] [KRELTSC: 151238402] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 151268079] Running <#.basic: DECIMAL 42 S>D <# #S #> TYPE CR +[Hera] 774763251095801167872 +[Hera] [HADES][TEST ] [KRELTSC: 151514774] Test passed +[Hera] [HADES][TEST ] Testing <# ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 151567047] Expected: Should format number +[Hera] [HADES][TEST ] [KRELTSC: 151599294] Running <#.empty: 0 <# #> TYPE CR + +[Hera] [HADES][TEST ] [KRELTSC: 151632998] Test passed +[Hera] [HADES][TEST ] Testing <# ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 151679481] Expected: Should handle zero +[Hera] [HADES][TEST ] [KRELTSC: 151709422] Running <#.negative: -42 <# #S #> TYPE CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 151906165] Test passed +[Hera] [HADES][TEST ] Testing <# ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 151954716] Expected: Should handle negative +[Hera] [HADES][TEST ] [KRELTSC: 151988413] <#: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 152026311] ▶ Testing module: v3/src/test_runner/modules/format_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 152066621] Testing word: # +[Hera] [HADES][TEST ] [KRELTSC: 152092200] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 152121568] Running #.single_digit: 15 <# # #> TYPE CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 152312584] Test passed +[Hera] [HADES][TEST ] Testing # ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 152359636] Expected: Should print rightmost digit +[Hera] [HADES][TEST ] [KRELTSC: 152392814] Running #.multiple: 15 <# # # #> TYPE CR +[Hera] 15 +[Hera] [HADES][TEST ] [KRELTSC: 152436759] Test passed +[Hera] [HADES][TEST ] Testing # ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 152480331] Expected: Should print digits right to left +[Hera] [HADES][TEST ] [KRELTSC: 152516315] Running #.zero_pad: 5 <# # 0 # #> TYPE CR +[Hera] 05 +[Hera] [HADES][TEST ] [KRELTSC: 152565180] Test passed +[Hera] [HADES][TEST ] Testing # ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 152759614] Expected: Should handle zero padding +[Hera] [HADES][TEST ] [KRELTSC: 152791663] #: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 152827638] ▶ Testing module: v3/src/test_runner/modules/format_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 152868891] Testing word: #S +[Hera] [HADES][TEST ] [KRELTSC: 152897250] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 152926083] Running #S.basic: 42 <# #S #> TYPE CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 152977270] Test passed +[Hera] [HADES][TEST ] Testing #S ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 153168055] Expected: Should convert all digits +[Hera] [HADES][TEST ] [KRELTSC: 153199573] Running #S.zero: 0 <# #S #> TYPE CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 153242769] Test passed +[Hera] [HADES][TEST ] Testing #S ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 153289870] Expected: Should handle zero +[Hera] [HADES][TEST ] [KRELTSC: 153321626] Running #S.large: 1234567890 <# #S #> TYPE CR +[Hera] 1234567890 +[Hera] [HADES][TEST ] [KRELTSC: 153541703] Test passed +[Hera] [HADES][TEST ] Testing #S ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 153594120] Expected: Should handle large numbers +[Hera] [HADES][TEST ] [KRELTSC: 153627580] #S: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 153664577] ▶ Testing module: v3/src/test_runner/modules/format_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 153706809] Testing word: SIGN +[Hera] [HADES][TEST ] [KRELTSC: 153733577] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 153763076] Running SIGN.negative: -42 ABS <# #S SIGN #> TYPE CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 153818556] Test passed +[Hera] [HADES][TEST ] Testing SIGN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 153872784] Expected: Should add minus +[Hera] [HADES][TEST ] [KRELTSC: 154041602] Running SIGN.positive: 42 <# #S SIGN #> TYPE CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 154093546] Test passed +[Hera] [HADES][TEST ] Testing SIGN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 154145894] Expected: Should not add sign +[Hera] [HADES][TEST ] [KRELTSC: 154176681] Running SIGN.zero: 0 <# #S SIGN #> TYPE CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 154231377] Test passed +[Hera] [HADES][TEST ] Testing SIGN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 154280820] Expected: Should handle zero +[Hera] [HADES][TEST ] [KRELTSC: 154311422] SIGN: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 154483188] ▶ Testing module: v3/src/test_runner/modules/format_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 154523021] Testing word: #> +[Hera] [HADES][TEST ] [KRELTSC: 154551624] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 154584914] Running #>.normal: 42 <# #S #> TYPE CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 154633855] Test passed +[Hera] [HADES][TEST ] Testing #> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 154826433] Expected: Should terminate formatting +[Hera] [HADES][TEST ] [KRELTSC: 154872371] Running #>.empty: 0 <# #> TYPE CR + +[Hera] [HADES][TEST ] [KRELTSC: 154908792] Test passed +[Hera] [HADES][TEST ] Testing #> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 154957714] Expected: Should handle empty format +[Hera] [HADES][TEST ] [KRELTSC: 154989935] Running #>.stack_effect: 42 <# #S #> SWAP . . CR +[Hera] 24 2 +[Hera] [HADES][TEST ] [KRELTSC: 155036661] Test passed +[Hera] [HADES][TEST ] Testing #> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 155080223] Expected: Should leave addr u +[Hera] [HADES][TEST ] [KRELTSC: 155110625] #>: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 155144931] ▶ Testing module: v3/src/test_runner/modules/format_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 155182380] Testing word: HOLD +[Hera] [HADES][TEST ] [KRELTSC: 155355016] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 155380974] Running HOLD.basic: 42 <# 46 HOLD #S #> TYPE CR +[Hera] 42. +[Hera] [HADES][TEST ] [KRELTSC: 155431598] Test passed +[Hera] [HADES][TEST ] Testing HOLD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 155477220] Expected: Should insert dot +[Hera] [HADES][TEST ] [KRELTSC: 155506093] Running HOLD.overflow: <# 257 HOLD #> +[Hera] [HADES][ERROR] [KRELTSC: 155540787] HOLD: byte out of range (257) +[Hera] [HADES][TEST ] [KRELTSC: 155579185] Expected error occurred +[Hera] [HADES][TEST ] Testing HOLD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 155626811] Expected: Should handle overflow +[Hera] [HADES][TEST ] [KRELTSC: 155782693] HOLD: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 155831690] === Format Words Summary: 0 passed, 0 failed, 0 skipped, 0 erro +[Hera] [HADES][INFO ] [KRELTSC: 155867253] +[Hera] === Testing Module: String Words === +[Hera] [HADES][INFO ] [KRELTSC: 155908922] Running String Words Tests (Module 11)... +[Hera] [HADES][TEST ] [KRELTSC: 155943705] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 155983070] Testing word: COUNT +[Hera] [HADES][TEST ] [KRELTSC: 156008711] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 156036622] Running COUNT.basic: HERE S" Test" DROP COUNT . . CR +[Hera] 84 121 +[Hera] [HADES][TEST ] [KRELTSC: 156246778] Test passed +[Hera] [HADES][TEST ] Testing COUNT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 156295828] Expected: Should show length and addr+1 +[Hera] [HADES][TEST ] [KRELTSC: 156330807] Running COUNT.empty: HERE 0 OVER C! COUNT . . CR +[Hera] 0 126 +[Hera] [HADES][TEST ] [KRELTSC: 156377142] Test passed +[Hera] [HADES][TEST ] Testing COUNT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 156427264] Expected: Should handle empty string +[Hera] [HADES][TEST ] [KRELTSC: 156463677] Running COUNT.max_length: HERE 255 OVER C! COUNT . . CR +[Hera] 255 126 +[Hera] [HADES][TEST ] [KRELTSC: 156647358] Test passed +[Hera] [HADES][TEST ] Testing COUNT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 156696070] Expected: Should handle max length +[Hera] [HADES][TEST ] [KRELTSC: 156729641] Running COUNT.string_bounds: HERE COUNT SWAP 1- = . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 156781170] Test passed +[Hera] [HADES][TEST ] Testing COUNT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 156830792] Expected: Should increment address +[Hera] [HADES][TEST ] [KRELTSC: 156863618] Running COUNT.empty_stack: COUNT +[Hera] [HADES][ERROR] [KRELTSC: 156899109] COUNT: Data stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 157048824] Expected error occurred +[Hera] [HADES][TEST ] Testing COUNT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 157110554] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 157142807] COUNT: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 157177573] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 157216347] Testing word: -TRAILING +[Hera] [HADES][TEST ] [KRELTSC: 157244244] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 157272893] Running -TRAILING.basic: HERE S" Test " -TRAILING TYPE CR +[Hera] Test +[Hera] [HADES][TEST ] [KRELTSC: 157353447] Test passed +[Hera] [HADES][TEST ] Testing -TRAILING ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 157542329] Expected: Should trim spaces +[Hera] [HADES][TEST ] [KRELTSC: 157570889] Running -TRAILING.all_spaces: HERE S" " -TRAILING TYPE CR + +[Hera] [HADES][TEST ] [KRELTSC: 157616686] Test passed +[Hera] [HADES][TEST ] Testing -TRAILING ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 157667792] Expected: Should handle all spaces +[Hera] [HADES][TEST ] [KRELTSC: 157700030] Running -TRAILING.no_spaces: HERE S" Test" -TRAILING TYPE CR +[Hera] Test +[Hera] [HADES][TEST ] [KRELTSC: 157751232] Test passed +[Hera] [HADES][TEST ] Testing -TRAILING ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 157929250] Expected: Should handle no spaces +[Hera] [HADES][TEST ] [KRELTSC: 157958833] Running -TRAILING.empty: HERE 0 -TRAILING TYPE CR + +[Hera] [HADES][TEST ] [KRELTSC: 158000379] Test passed +[Hera] [HADES][TEST ] Testing -TRAILING ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 158048899] Expected: Should handle empty string +[Hera] [HADES][TEST ] [KRELTSC: 158081312] -TRAILING: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 158114728] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 158151954] Testing word: CMOVE +[Hera] [HADES][TEST ] [KRELTSC: 158182736] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 158212994] Running CMOVE.basic: HERE S" Test" DUP >R HERE 10 + SWAP CMOV + +[Hera] [HADES][TEST ] [KRELTSC: 158398184] Test passed +[Hera] [HADES][TEST ] Testing CMOVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 158442022] Expected: Should copy string +[Hera] [HADES][TEST ] [KRELTSC: 158471792] Running CMOVE.empty: HERE HERE 10 + 0 CMOVE +[Hera] [HADES][TEST ] [KRELTSC: 158505872] Test passed +[Hera] [HADES][TEST ] Testing CMOVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 158550175] Expected: Should handle zero count +[Hera] [HADES][TEST ] [KRELTSC: 158579476] Running CMOVE.overlap: HERE DUP 1+ 5 CMOVE +[Hera] [HADES][TEST ] [KRELTSC: 158612158] Test passed +[Hera] [HADES][TEST ] Testing CMOVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 158659019] Expected: Should handle overlap +[Hera] [HADES][TEST ] [KRELTSC: 158815087] Running CMOVE.bounds: HERE PAD 1000 CMOVE +[Hera] [HADES][ERROR] [KRELTSC: 158855025] CMOVE: out-of-bounds (src=125 dst=5242368 n=1000) +[Hera] [HADES][TEST ] [KRELTSC: 158887374] Expected error occurred +[Hera] [HADES][TEST ] Testing CMOVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 158942862] Expected: Should check bounds +[Hera] [HADES][TEST ] [KRELTSC: 158974461] CMOVE: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 159007772] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 159046027] Testing word: CMOVE> +[Hera] [HADES][TEST ] [KRELTSC: 159074173] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 159233195] Running CMOVE>.basic: HERE S" Test" DUP >R HERE 10 + SWAP CMO + +[Hera] [HADES][TEST ] [KRELTSC: 159296638] Test passed +[Hera] [HADES][TEST ] Testing CMOVE> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 159348724] Expected: Should copy backward +[Hera] [HADES][TEST ] [KRELTSC: 159381026] Running CMOVE>.empty: HERE HERE 10 + 0 CMOVE> +[Hera] [HADES][TEST ] [KRELTSC: 159421903] Test passed +[Hera] [HADES][TEST ] Testing CMOVE> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 159473695] Expected: Should handle zero count +[Hera] [HADES][TEST ] [KRELTSC: 159505008] Running CMOVE>.overlap: HERE DUP 1+ 5 CMOVE> +[Hera] [HADES][TEST ] [KRELTSC: 159672565] Test passed +[Hera] [HADES][TEST ] Testing CMOVE> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 159718397] Expected: Should handle overlap +[Hera] [HADES][TEST ] [KRELTSC: 159748512] Running CMOVE>.bounds: HERE PAD 1000 CMOVE> +[Hera] [HADES][ERROR] [KRELTSC: 159787884] CMOVE>: out-of-bounds (src=125 dst=5242368 n=1000) +[Hera] [HADES][TEST ] [KRELTSC: 159824290] Expected error occurred +[Hera] [HADES][TEST ] Testing CMOVE> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 159877061] Expected: Should check bounds +[Hera] [HADES][TEST ] [KRELTSC: 159908907] CMOVE>: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 159943898] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 160118674] Testing word: COMPARE +[Hera] [HADES][TEST ] [KRELTSC: 160145714] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 160171704] Running COMPARE.equal: HERE S" Test" HERE S" Test" COMPARE . +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 160244316] Test passed +[Hera] [HADES][TEST ] Testing COMPARE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 160292911] Expected: Should return 0 +[Hera] [HADES][TEST ] [KRELTSC: 160329139] Running COMPARE.less: HERE S" Test1" HERE S" Test2" COMPARE . +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 160383757] Test passed +[Hera] [HADES][TEST ] Testing COMPARE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 160568665] Expected: Should return -1 +[Hera] [HADES][TEST ] [KRELTSC: 160598246] Running COMPARE.greater: HERE S" Test2" HERE S" Test1" COMPAR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 160651464] Test passed +[Hera] [HADES][TEST ] Testing COMPARE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 160702141] Expected: Should return 1 +[Hera] [HADES][TEST ] [KRELTSC: 160733072] Running COMPARE.different_lengths: HERE S" Test" HERE S" Test +[Hera] [HADES][INFO ] [KRELTSC: 160775326] L8[TABLE]: Config 39 → 40 regime=2 score=6553 L1=0 L2=1 L3=0 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 160828280] Test passed +[Hera] [HADES][TEST ] Testing COMPARE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 161004157] Expected: Should handle lengths +[Hera] [HADES][TEST ] [KRELTSC: 161035115] Running COMPARE.empty: HERE 0 HERE 0 COMPARE . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 161098854] Test passed +[Hera] [HADES][TEST ] Testing COMPARE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 161150833] Expected: Should handle empty +[Hera] [HADES][TEST ] [KRELTSC: 161182510] COMPARE: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 161218813] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 161258803] Testing word: SEARCH +[Hera] [HADES][TEST ] [KRELTSC: 161412966] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 161440657] Running SEARCH.found: HERE S" Testing" HERE S" Test" SEARCH . +[Hera] -1 15 120 +[Hera] [HADES][TEST ] [KRELTSC: 161523068] Test passed +[Hera] [HADES][TEST ] Testing SEARCH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 161573197] Expected: Should find substring +[Hera] [HADES][TEST ] [KRELTSC: 161604572] Running SEARCH.not_found: HERE S" Testing" HERE S" Xyz" SEARC +[Hera] -1 7 141 +[Hera] [HADES][TEST ] [KRELTSC: 161662659] Test passed +[Hera] [HADES][TEST ] Testing SEARCH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 161850159] Expected: Should return false +[Hera] [HADES][TEST ] [KRELTSC: 161881417] Running SEARCH.empty_pattern: HERE S" Test" HERE 0 SEARCH . . +[Hera] -1 4 145 +[Hera] [HADES][TEST ] [KRELTSC: 161942460] Test passed +[Hera] [HADES][TEST ] Testing SEARCH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 161992081] Expected: Should handle empty pattern +[Hera] [HADES][TEST ] [KRELTSC: 162024661] Running SEARCH.empty_string: HERE 0 HERE S" Test" SEARCH . . +[Hera] -1 30 120 +[Hera] [HADES][TEST ] [KRELTSC: 162211393] Test passed +[Hera] [HADES][TEST ] Testing SEARCH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 162259667] Expected: Should handle empty string +[Hera] [HADES][TEST ] [KRELTSC: 162291551] SEARCH: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 162326530] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 162367004] Testing word: SCAN +[Hera] [HADES][TEST ] [KRELTSC: 162392547] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 162420797] Running SCAN.basic: HERE S" Test,Data" BL SCAN TYPE CR + +[Hera] [HADES][TEST ] [KRELTSC: 162481553] Test passed +[Hera] [HADES][TEST ] Testing SCAN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 162531436] Expected: Should find space +[Hera] [HADES][TEST ] [KRELTSC: 162558580] Running SCAN.not_found: HERE S" TestData" BL SCAN TYPE CR + +[Hera] [HADES][TEST ] [KRELTSC: 162736003] Test passed +[Hera] [HADES][TEST ] Testing SCAN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 162782847] Expected: Should scan to end +[Hera] [HADES][TEST ] [KRELTSC: 162811780] Running SCAN.empty: HERE 0 BL SCAN TYPE CR + +[Hera] [HADES][TEST ] [KRELTSC: 162846746] Test passed +[Hera] [HADES][TEST ] Testing SCAN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 162891360] Expected: Should handle empty +[Hera] [HADES][TEST ] [KRELTSC: 162916322] Running SCAN.all_delims: HERE S" " BL SCAN TYPE CR +[Hera] +[Hera] [HADES][TEST ] [KRELTSC: 162969057] Test passed +[Hera] [HADES][TEST ] Testing SCAN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 163137736] Expected: Should handle all delims +[Hera] [HADES][TEST ] [KRELTSC: 163167760] SCAN: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 163199810] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 163236812] Testing word: SKIP +[Hera] [HADES][TEST ] [KRELTSC: 163262198] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 163289607] Running SKIP.basic: HERE S" Test" BL SKIP TYPE CR +[Hera] Test +[Hera] [HADES][TEST ] [KRELTSC: 163588976] Test passed +[Hera] [HADES][TEST ] Testing SKIP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 163634291] Expected: Should skip spaces +[Hera] [HADES][TEST ] [KRELTSC: 163665556] Running SKIP.no_delims: HERE S" Test" BL SKIP TYPE CR +[Hera] Test +[Hera] [HADES][TEST ] [KRELTSC: 163717640] Test passed +[Hera] [HADES][TEST ] Testing SKIP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 163765103] Expected: Should not skip +[Hera] [HADES][TEST ] [KRELTSC: 163793549] Running SKIP.empty: HERE 0 BL SKIP TYPE CR + +[Hera] [HADES][TEST ] [KRELTSC: 163829923] Test passed +[Hera] [HADES][TEST ] Testing SKIP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 163985757] Expected: Should handle empty +[Hera] [HADES][TEST ] [KRELTSC: 164029888] Running SKIP.all_delims: HERE S" " BL SKIP TYPE CR + +[Hera] [HADES][TEST ] [KRELTSC: 164079654] Test passed +[Hera] [HADES][TEST ] Testing SKIP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 164126503] Expected: Should skip all +[Hera] [HADES][TEST ] [KRELTSC: 164154651] SKIP: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 164188658] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 164226147] Testing word: BLANK +[Hera] [HADES][TEST ] [KRELTSC: 164252491] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 164281372] Running BLANK.basic: HERE 5 BLANK HERE 5 TYPE CR +[Hera] +[Hera] [HADES][TEST ] [KRELTSC: 164461976] Test passed +[Hera] [HADES][TEST ] Testing BLANK ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 164509682] Expected: Should fill with spaces +[Hera] [HADES][TEST ] [KRELTSC: 164542591] Running BLANK.zero: HERE 0 BLANK HERE 0 TYPE CR + +[Hera] [HADES][TEST ] [KRELTSC: 164582362] Test passed +[Hera] [HADES][TEST ] Testing BLANK ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 164631845] Expected: Should handle zero count +[Hera] [HADES][TEST ] [KRELTSC: 164663972] BLANK: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 164700145] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 164737662] Testing word: S" +[Hera] [HADES][TEST ] [KRELTSC: 164890572] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 164919606] Running S".interpret_len: S" hello" . CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 164965451] Test passed +[Hera] [HADES][TEST ] Testing S" ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 165013264] Expected: Should print: 5 (length) +[Hera] [HADES][TEST ] [KRELTSC: 165045936] Running S".interpret_type: S" hello" TYPE CR +[Hera] hello +[Hera] [HADES][TEST ] [KRELTSC: 165091429] Test passed +[Hera] [HADES][TEST ] Testing S" ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 165140934] Expected: Should print: hello +[Hera] [HADES][TEST ] [KRELTSC: 165171594] Running S".empty: S" " . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 165339946] Test passed +[Hera] [HADES][TEST ] Testing S" ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 165389801] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 165419450] Running S".compile_type: : TSQ S" world" TYPE CR ; TSQ +[Hera] world +[Hera] [HADES][TEST ] [KRELTSC: 165587083] Test passed +[Hera] [HADES][TEST ] Testing S" ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 165761370] Expected: Should print: world +[Hera] [HADES][TEST ] [KRELTSC: 165789588] Running S".compile_len: : TSQ2 S" forth" SWAP DROP . CR ; TSQ +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 165857007] Test passed +[Hera] [HADES][TEST ] Testing S" ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 165906345] Expected: Should print: 5 +[Hera] [HADES][TEST ] [KRELTSC: 165935520] Running S".compile_twice: : TSQ3 S" ab" TYPE S" cd" TYPE CR ; +[Hera] abcd +[Hera] [HADES][TEST ] [KRELTSC: 166003471] Test passed +[Hera] [HADES][TEST ] Testing S" ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 166189544] Expected: Should print: abcd +[Hera] [HADES][TEST ] [KRELTSC: 166220070] S": 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 166251687] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 166290288] Testing word: BL +[Hera] [HADES][TEST ] [KRELTSC: 166316403] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 166345121] Running BL.value: BL . CR +[Hera] 32 +[Hera] [HADES][TEST ] [KRELTSC: 166388799] Test passed +[Hera] [HADES][TEST ] Testing BL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 166435995] Expected: Should print: 32 +[Hera] [HADES][TEST ] [KRELTSC: 166464201] Running BL.as_char: BL EMIT CR +[Hera] +[Hera] [HADES][TEST ] [KRELTSC: 166671042] Test passed +[Hera] [HADES][TEST ] Testing BL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 166750602] Expected: Should emit a space +[Hera] [HADES][TEST ] [KRELTSC: 166782132] Running BL.in_scan: HERE S" a b" BL SCAN SWAP DROP . CR +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 166835087] Test passed +[Hera] [HADES][TEST ] Testing BL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 166883375] Expected: Should find space at offset 1 +[Hera] [HADES][TEST ] [KRELTSC: 167030488] BL: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 167071671] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 167108619] Testing word: SOURCE +[Hera] [HADES][TEST ] [KRELTSC: 167133727] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 167159398] Running SOURCE.returns_pair: SOURCE SWAP DROP 0< NOT . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 167233917] Test passed +[Hera] [HADES][TEST ] Testing SOURCE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 167286344] Expected: Should return non-negative length +[Hera] [HADES][TEST ] [KRELTSC: 167321354] Running SOURCE.has_addr: SOURCE DROP 0<> . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 167507912] Test passed +[Hera] [HADES][TEST ] Testing SOURCE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 167555959] Expected: Should return non-null address +[Hera] [HADES][TEST ] [KRELTSC: 167588387] SOURCE: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 167621305] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 167659342] Testing word: >IN +[Hera] [HADES][TEST ] [KRELTSC: 167683716] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 167711438] Running >IN.initial: >IN @ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 167761972] Test passed +[Hera] [HADES][TEST ] Testing >IN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 167934588] Expected: Should return input offset +[Hera] [HADES][TEST ] [KRELTSC: 167965595] Running >IN.advances: : TWIN >IN @ >IN @ - . CR ; TWIN +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 168040862] Test passed +[Hera] [HADES][TEST ] Testing >IN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 168092378] Expected: Should print: 0 (no advance inside compiled word) +[Hera] [HADES][TEST ] [KRELTSC: 168131331] >IN: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 168168462] === String Words Summary: 0 passed, 0 failed, 0 skipped, 0 erro +[Hera] [HADES][INFO ] [KRELTSC: 168210905] +[Hera] === Testing Module: I/O Words === +[Hera] [HADES][INFO ] [KRELTSC: 168377457] Running I/O Words Tests (Module 9)... +[Hera] [HADES][TEST ] [KRELTSC: 168410367] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 168447536] Testing word: . +[Hera] [HADES][TEST ] [KRELTSC: 168472034] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 168497400] Running ..positive: 42 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 168546550] Test passed +[Hera] [HADES][TEST ] Testing . ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 168597405] Expected: Should print: 42 +[Hera] [HADES][TEST ] [KRELTSC: 168627806] Running ..negative: -42 . CR +[Hera] -42 +[Hera] [HADES][TEST ] [KRELTSC: 168800648] Test passed +[Hera] [HADES][TEST ] Testing . ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 168847730] Expected: Should print: -42 +[Hera] [HADES][TEST ] [KRELTSC: 168876564] Running ..zero: 0 . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 168912587] Test passed +[Hera] [HADES][TEST ] Testing . ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 168959540] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 168988388] Running ..max_int: 2147483647 . CR +[Hera] 2147483647 +[Hera] [HADES][TEST ] [KRELTSC: 169032110] Test passed +[Hera] [HADES][TEST ] Testing . ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 169082991] Expected: Should print: 2147483647 +[Hera] [HADES][TEST ] [KRELTSC: 169237063] Running ..min_int: -2147483648 . CR +[Hera] -2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 169280504] Test passed +[Hera] [HADES][TEST ] Testing . ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 169327923] Expected: Should print: -2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 169359637] Running ..multiple: 1 2 3 . . . CR +[Hera] 3 2 1 +[Hera] [HADES][TEST ] [KRELTSC: 169403735] Test passed +[Hera] [HADES][TEST ] Testing . ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 169453009] Expected: Should print: 3 2 1 +[Hera] [HADES][TEST ] [KRELTSC: 169484101] Running ..empty_stack: . +[Hera] [HADES][TEST ] [KRELTSC: 169515697] Expected error occurred +[Hera] [HADES][TEST ] Testing . ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 169691832] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 169724573] .: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 169761206] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 169798834] Testing word: CR +[Hera] [HADES][TEST ] [KRELTSC: 169821809] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 169847365] Running CR.basic: 42 . CR 43 . CR +[Hera] 42 +[Hera] 43 +[Hera] [HADES][TEST ] [KRELTSC: 169901360] Test passed +[Hera] [HADES][TEST ] Testing CR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 169950694] Expected: Should print on separate lines +[Hera] [HADES][TEST ] [KRELTSC: 170112487] Running CR.multiple: CR CR CR + + + +[Hera] [HADES][TEST ] [KRELTSC: 170151628] Test passed +[Hera] [HADES][TEST ] Testing CR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 170204074] Expected: Should print multiple newlines +[Hera] [HADES][TEST ] [KRELTSC: 170241076] Running CR.no_stack_effect: DEPTH CR DEPTH = . CR + +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 170291398] Test passed +[Hera] [HADES][TEST ] Testing CR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 170341345] Expected: Should not affect stack +[Hera] [HADES][TEST ] [KRELTSC: 170372491] Running CR.after_output: 1 2 3 . . . CR +[Hera] 3 2 1 +[Hera] [HADES][TEST ] [KRELTSC: 170544618] Test passed +[Hera] [HADES][TEST ] Testing CR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 170590807] Expected: Should work after output +[Hera] [HADES][TEST ] [KRELTSC: 170624101] CR: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 170656516] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 170694918] Testing word: SPACE +[Hera] [HADES][TEST ] [KRELTSC: 170724610] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 170753749] Running SPACE.basic: 42 . SPACE 43 . CR +[Hera] 42 43 +[Hera] [HADES][TEST ] [KRELTSC: 170807667] Test passed +[Hera] [HADES][TEST ] Testing SPACE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 170981380] Expected: Should add space between numbers +[Hera] [HADES][TEST ] [KRELTSC: 171013414] Running SPACE.multiple: SPACE SPACE SPACE +[Hera] [HADES][INFO ] [KRELTSC: 171879921] L8[TABLE]: Config 40 → 0 regime=7 score=26214 L1=0 L2=0 L3=0 +[Hera] [HADES][TEST ] [KRELTSC: 171926703] Test passed +[Hera] [HADES][TEST ] Testing SPACE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 171969620] Expected: Should print multiple spaces +[Hera] [HADES][TEST ] [KRELTSC: 172003345] Running SPACE.no_stack_effect: DEPTH SPACE DEPTH = . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 172054156] Test passed +[Hera] [HADES][TEST ] Testing SPACE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 172102845] Expected: Should not affect stack +[Hera] [HADES][TEST ] [KRELTSC: 172134894] Running SPACE.with_text: 65 EMIT SPACE 66 EMIT CR +[Hera] A B +[Hera] [HADES][TEST ] [KRELTSC: 172310387] Test passed +[Hera] [HADES][TEST ] Testing SPACE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 172361044] Expected: Should space between chars +[Hera] [HADES][TEST ] [KRELTSC: 172394149] SPACE: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 172427989] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 172465214] Testing word: SPACES +[Hera] [HADES][TEST ] [KRELTSC: 172489422] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 172515907] Running SPACES.zero: 0 SPACES +[Hera] [HADES][TEST ] [KRELTSC: 172552117] Test passed +[Hera] [HADES][TEST ] Testing SPACES ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 172740358] Expected: Should print no spaces +[Hera] [HADES][TEST ] [KRELTSC: 172771538] Running SPACES.one: 1 SPACES +[Hera] [HADES][TEST ] [KRELTSC: 172817743] Test passed +[Hera] [HADES][TEST ] Testing SPACES ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 172863588] Expected: Should print one space +[Hera] [HADES][TEST ] [KRELTSC: 172894812] Running SPACES.multiple: 5 SPACES +[Hera] [HADES][TEST ] [KRELTSC: 172935461] Test passed +[Hera] [HADES][TEST ] Testing SPACES ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 172976891] Expected: Should print five spaces +[Hera] [HADES][TEST ] [KRELTSC: 173138838] Running SPACES.large: 20 SPACES +[Hera] [HADES][TEST ] [KRELTSC: 173185421] Test passed +[Hera] [HADES][TEST ] Testing SPACES ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 173225626] Expected: Should print twenty spaces +[Hera] [HADES][TEST ] [KRELTSC: 173258382] Running SPACES.negative: -5 SPACES +[Hera] [HADES][TEST ] [KRELTSC: 173293817] Test passed +[Hera] [HADES][TEST ] Testing SPACES ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 173344840] Expected: Should handle negative +[Hera] [HADES][TEST ] [KRELTSC: 173379794] Running SPACES.with_output: 42 . 3 SPACES 43 . CR +[Hera] 42 43 +[Hera] [HADES][TEST ] [KRELTSC: 173429671] Test passed +[Hera] [HADES][TEST ] Testing SPACES ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 173608794] Expected: Should space output +[Hera] [HADES][TEST ] [KRELTSC: 173637301] Running SPACES.empty_stack: SPACES +[Hera] [HADES][TEST ] [KRELTSC: 173671416] Expected error occurred +[Hera] [HADES][TEST ] Testing SPACES ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 173721624] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 173752002] SPACES: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 173784511] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 173820865] Testing word: EMIT +[Hera] [HADES][TEST ] [KRELTSC: 173847579] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 174001961] Running EMIT.letter_A: 65 EMIT CR +[Hera] A +[Hera] [HADES][TEST ] [KRELTSC: 174058018] Test passed +[Hera] [HADES][TEST ] Testing EMIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 174108013] Expected: Should print: A +[Hera] [HADES][TEST ] [KRELTSC: 174139141] Running EMIT.letter_Z: 90 EMIT CR +[Hera] Z +[Hera] [HADES][TEST ] [KRELTSC: 174181433] Test passed +[Hera] [HADES][TEST ] Testing EMIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 174231926] Expected: Should print: Z +[Hera] [HADES][TEST ] [KRELTSC: 174257999] Running EMIT.digit: 48 EMIT CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 174285133] Test passed +[Hera] [HADES][TEST ] Testing EMIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 174469498] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 174498198] Running EMIT.space_char: 32 EMIT CR +[Hera] +[Hera] [HADES][TEST ] [KRELTSC: 174540796] Test passed +[Hera] [HADES][TEST ] Testing EMIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 174587574] Expected: Should print space +[Hera] [HADES][TEST ] [KRELTSC: 174619158] Running EMIT.newline: 10 EMIT + +[Hera] [HADES][TEST ] [KRELTSC: 174653193] Test passed +[Hera] [HADES][TEST ] Testing EMIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 174704644] Expected: Should print newline +[Hera] [HADES][TEST ] [KRELTSC: 174864371] Running EMIT.high_ascii: 127 EMIT CR +[Hera]  +[Hera] [HADES][TEST ] [KRELTSC: 174922495] Test passed +[Hera] [HADES][TEST ] Testing EMIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 174970153] Expected: Should print DEL char +[Hera] [HADES][TEST ] [KRELTSC: 174999322] Running EMIT.truncation: 321 EMIT CR +[Hera] A +[Hera] [HADES][TEST ] [KRELTSC: 175039382] Test passed +[Hera] [HADES][TEST ] Testing EMIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 175086638] Expected: Should truncate to low byte +[Hera] [HADES][TEST ] [KRELTSC: 175120747] Running EMIT.negative: -1 EMIT CR +[Hera] ÿ +[Hera] [HADES][TEST ] [KRELTSC: 175162859] Test passed +[Hera] [HADES][TEST ] Testing EMIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 175376785] Expected: Should handle negative +[Hera] [HADES][TEST ] [KRELTSC: 175432838] Running EMIT.sequence: 72 EMIT 73 EMIT 10 EMIT +[Hera] HI +[Hera] [HADES][TEST ] [KRELTSC: 175480334] Test passed +[Hera] [HADES][TEST ] Testing EMIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 175527950] Expected: Should print: HI +[Hera] [HADES][TEST ] [KRELTSC: 175556613] Running EMIT.empty_stack: EMIT +[Hera] [HADES][TEST ] [KRELTSC: 175588064] Expected error occurred +[Hera] [HADES][TEST ] Testing EMIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 175844499] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 175880503] EMIT: 10 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 175918728] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 175963704] Testing word: KEY +[Hera] [HADES][TEST ] [KRELTSC: 175991744] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 176028387] KEY: 0 passed, 0 failed, 4 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 176063800] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 176248218] Testing word: ?KEY +[Hera] [HADES][TEST ] [KRELTSC: 176277690] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 176309511] ?KEY: 0 passed, 0 failed, 3 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 176351790] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 176398284] Testing word: TYPE +[Hera] [HADES][TEST ] [KRELTSC: 176428522] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 176462622] Running TYPE.basic_string: HERE S" Hello" DUP >R HERE SWAP CM +[Hera] Hello +[Hera] [HADES][TEST ] [KRELTSC: 176669877] Test passed +[Hera] [HADES][TEST ] Testing TYPE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 176727265] Expected: Should print: Hello +[Hera] [HADES][TEST ] [KRELTSC: 176762750] Running TYPE.empty_string: HERE 0 TYPE CR + +[Hera] [HADES][TEST ] [KRELTSC: 176796745] Test passed +[Hera] [HADES][TEST ] Testing TYPE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 176844284] Expected: Should print nothing +[Hera] [HADES][TEST ] [KRELTSC: 176872432] Running TYPE.single_char: HERE 65 OVER C! 1 TYPE CR +[Hera] A +[Hera] [HADES][TEST ] [KRELTSC: 176916090] Test passed +[Hera] [HADES][TEST ] Testing TYPE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 177205809] Expected: Should print: A +[Hera] [HADES][TEST ] [KRELTSC: 177253471] Running TYPE.numbers: HERE S" 12345" DUP >R HERE SWAP CMOVE H +[Hera] 12345 +[Hera] [HADES][TEST ] [KRELTSC: 177309792] Test passed +[Hera] [HADES][TEST ] Testing TYPE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 177533342] Expected: Should print: 12345 +[Hera] [HADES][TEST ] [KRELTSC: 177561217] Running TYPE.zero_length: PAD 0 TYPE +[Hera] [HADES][TEST ] [KRELTSC: 177595229] Test passed +[Hera] [HADES][TEST ] Testing TYPE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 177641411] Expected: Should handle zero length +[Hera] [HADES][TEST ] [KRELTSC: 177671676] Running TYPE.one_item: PAD TYPE +[Hera] [HADES][ERROR] [KRELTSC: 177704492] TYPE: Data stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 177732067] Expected error occurred +[Hera] [HADES][TEST ] Testing TYPE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 177947696] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 177992160] Running TYPE.empty_stack: TYPE +[Hera] [HADES][ERROR] [KRELTSC: 178023695] TYPE: Data stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 178051150] Expected error occurred +[Hera] [HADES][TEST ] Testing TYPE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 178108939] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 178144486] TYPE: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 178179731] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 178411197] Testing word: COUNT +[Hera] [HADES][TEST ] [KRELTSC: 178446824] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 178475011] Running COUNT.basic: HERE S" Test" DROP C@ HERE 1+ SWAP COUNT +[Hera] 0 85 +[Hera] [HADES][TEST ] [KRELTSC: 178530443] Test passed +[Hera] [HADES][TEST ] Testing COUNT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 178579857] Expected: Should show length and addr+1 +[Hera] [HADES][TEST ] [KRELTSC: 178616473] Running COUNT.empty: HERE 0 OVER C! COUNT . . CR +[Hera] 0 126 +[Hera] [HADES][TEST ] [KRELTSC: 178901427] Test passed +[Hera] [HADES][TEST ] Testing COUNT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 178949437] Expected: Should handle empty string +[Hera] [HADES][TEST ] [KRELTSC: 178981040] Running COUNT.max_length: HERE 255 OVER C! COUNT . . CR +[Hera] 255 126 +[Hera] [HADES][TEST ] [KRELTSC: 179030378] Test passed +[Hera] [HADES][TEST ] Testing COUNT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 179280765] Expected: Should handle max length +[Hera] [HADES][TEST ] [KRELTSC: 179322421] Running COUNT.zero_addr_plus_one: HERE COUNT SWAP 1- = . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 179373839] Test passed +[Hera] [HADES][TEST ] Testing COUNT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 179420203] Expected: Should increment address +[Hera] [HADES][TEST ] [KRELTSC: 179451286] Running COUNT.empty_stack: COUNT +[Hera] [HADES][ERROR] [KRELTSC: 179484574] COUNT: Data stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 179646953] Expected error occurred +[Hera] [HADES][TEST ] Testing COUNT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 179700018] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 179732262] COUNT: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 179769411] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 179809454] Testing word: EXPECT +[Hera] [HADES][TEST ] [KRELTSC: 179837102] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 179864251] Running EXPECT.zero_length: PAD 0 EXPECT +[Hera] [HADES][TEST ] [KRELTSC: 179915799] Test passed +[Hera] [HADES][TEST ] Testing EXPECT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 180111418] Expected: Should handle zero length +[Hera] [HADES][TEST ] [KRELTSC: 180142300] Running EXPECT.one_item: PAD EXPECT +[Hera] [HADES][TEST ] [KRELTSC: 180177921] Expected error occurred +[Hera] [HADES][TEST ] Testing EXPECT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 180229775] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 180262269] Running EXPECT.empty_stack: EXPECT +[Hera] [HADES][TEST ] [KRELTSC: 180295112] Expected error occurred +[Hera] [HADES][TEST ] Testing EXPECT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 180355868] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 180511035] EXPECT: 3 passed, 0 failed, 2 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 180560439] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 180598748] Testing word: SPAN +[Hera] [HADES][TEST ] [KRELTSC: 180626785] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 180656252] Running SPAN.zero_input: PAD 0 EXPECT SPAN @ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 180717348] Test passed +[Hera] [HADES][TEST ] Testing SPAN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 180766652] Expected: Should show zero +[Hera] [HADES][TEST ] [KRELTSC: 180795060] Running SPAN.variable_test: SPAN @ SPAN @ = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 181039720] Test passed +[Hera] [HADES][TEST ] Testing SPAN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 181099583] Expected: Should be consistent +[Hera] [HADES][TEST ] [KRELTSC: 181128556] Running SPAN.address_test: SPAN 0<> . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 181171925] Test passed +[Hera] [HADES][TEST ] Testing SPAN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 181217822] Expected: Should be valid address +[Hera] [HADES][TEST ] [KRELTSC: 181247244] SPAN: 3 passed, 0 failed, 1 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 181511196] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 181575736] Testing word: WORD +[Hera] [HADES][TEST ] [KRELTSC: 181599541] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 181626317] Running WORD.empty_input: BL WORD COUNT . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 181883956] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 181938766] Expected: Should handle empty input +[Hera] [HADES][TEST ] [KRELTSC: 182003175] Running WORD.space_delim: 32 WORD DROP +[Hera] [HADES][TEST ] [KRELTSC: 182039357] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 182090483] Expected: Should use space as delimiter +[Hera] [HADES][TEST ] [KRELTSC: 182267305] Running WORD.newline_delim: 10 WORD DROP +[Hera] [HADES][TEST ] [KRELTSC: 182304802] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 182353739] Expected: Should use newline as delimiter +[Hera] [HADES][TEST ] [KRELTSC: 182387915] Running WORD.tab_delim: 9 WORD DROP +[Hera] [HADES][TEST ] [KRELTSC: 182419624] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 182466774] Expected: Should use tab as delimiter +[Hera] [HADES][TEST ] [KRELTSC: 182497458] Running WORD.comma_delim: 44 WORD DROP +[Hera] [HADES][TEST ] [KRELTSC: 182528840] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 182826009] Expected: Should use comma as delimiter +[Hera] [HADES][TEST ] [KRELTSC: 182860273] Running WORD.skip_leading: BL WORD DROP +[Hera] [HADES][TEST ] [KRELTSC: 182898074] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 182946813] Expected: Should skip leading spaces +[Hera] [HADES][TEST ] [KRELTSC: 183171874] Running WORD.single_char: BL WORD COUNT . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 183234897] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 183282527] Expected: Should parse single character +[Hera] [HADES][TEST ] [KRELTSC: 183313332] Running WORD.long_word: BL WORD COUNT 0 > . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 183356398] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 183401493] Expected: Should parse long word +[Hera] [HADES][TEST ] [KRELTSC: 183591316] Running WORD.zero_delim: 0 WORD DROP +[Hera] [HADES][TEST ] [KRELTSC: 183658774] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 183724147] Expected: Should handle null delimiter +[Hera] [HADES][TEST ] [KRELTSC: 183756248] Running WORD.high_ascii: 127 WORD DROP +[Hera] [HADES][TEST ] [KRELTSC: 183788064] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 183833065] Expected: Should handle DEL delimiter +[Hera] [HADES][TEST ] [KRELTSC: 183865082] Running WORD.count_format: BL WORD C@ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 184124187] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 184207429] Expected: Should have count byte +[Hera] [HADES][TEST ] [KRELTSC: 184235876] Running WORD.count_value: BL WORD COUNT SWAP DROP . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 184513648] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 184561174] Expected: Should return count +[Hera] [HADES][TEST ] [KRELTSC: 184627446] Running WORD.empty_stack: WORD +[Hera] [HADES][TEST ] [KRELTSC: 184658877] Expected error occurred +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 184713476] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 184966792] Running WORD.multi_delim: BL WORD DROP BL WORD DROP +[Hera] [HADES][TEST ] [KRELTSC: 185007377] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 185054401] Expected: Should handle multiple parses +[Hera] [HADES][TEST ] [KRELTSC: 185085856] WORD: 14 passed, 0 failed, 2 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 185116888] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 185373732] Testing word: BASE_OUTPUT +[Hera] [HADES][TEST ] [KRELTSC: 185403557] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 185430871] Running BASE_OUTPUT.decimal: 10 BASE ! 255 . CR +[Hera] 255 +[Hera] [HADES][TEST ] [KRELTSC: 185481077] Test passed +[Hera] [HADES][TEST ] Testing BASE_OUTPUT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 185530459] Expected: Should print: 255 +[Hera] [HADES][TEST ] [KRELTSC: 185557838] Running BASE_OUTPUT.hex: 16 BASE ! 255 . CR +[Hera] 597 +[Hera] [HADES][TEST ] [KRELTSC: 185813312] Test passed +[Hera] [HADES][TEST ] Testing BASE_OUTPUT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 185862729] Expected: Should print: FF +[Hera] [HADES][TEST ] [KRELTSC: 185891767] Running BASE_OUTPUT.octal: 8 BASE ! 64 . CR +[Hera] 52 +[Hera] [HADES][TEST ] [KRELTSC: 185932410] Test passed +[Hera] [HADES][TEST ] Testing BASE_OUTPUT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 185978152] Expected: Should print: 100 +[Hera] [HADES][TEST ] [KRELTSC: 186008992] Running BASE_OUTPUT.binary: 5 2 BASE ! . CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 186280802] Test passed +[Hera] [HADES][TEST ] Testing BASE_OUTPUT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 186329797] Expected: Should print: 101 +[Hera] [HADES][TEST ] [KRELTSC: 186358718] Running BASE_OUTPUT.base_restore: BASE @ DECIMAL 255 16 BA +[Hera] 255 +[Hera] [HADES][TEST ] [KRELTSC: 186408870] Test passed +[Hera] [HADES][TEST ] Testing BASE_OUTPUT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 186670501] Expected: Should restore base +[Hera] [HADES][TEST ] [KRELTSC: 186704888] BASE_OUTPUT: 5 passed, 0 failed, 1 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 186771392] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 186806803] Testing word: FORMAT_COMBO +[Hera] [HADES][TEST ] [KRELTSC: 186833759] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 186858524] Running FORMAT_COMBO.number_space_number: DECIMAL 42 . SPACE +[Hera] 42 [HADES][INFO ] [KRELTSC: 187121037] L8[TABLE]: Config 0 → 1 regime=7 score=26214 L1=0 L2=0 L3=0 L +[Hera] 43 +[Hera] [HADES][TEST ] [KRELTSC: 187198872] Test passed +[Hera] [HADES][TEST ] Testing FORMAT_COMBO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 187246728] Expected: Should format: 42 43 +[Hera] [HADES][TEST ] [KRELTSC: 187275788] Running FORMAT_COMBO.multi_line: DECIMAL 1 . CR 2 . CR 3 . CR +[Hera] 1 +[Hera] 2 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 187532654] Test passed +[Hera] [HADES][TEST ] Testing FORMAT_COMBO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 187588695] Expected: Should print on separate lines +[Hera] [HADES][TEST ] [KRELTSC: 187644538] Running FORMAT_COMBO.indented: DECIMAL 5 SPACES 42 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 187692083] Test passed +[Hera] [HADES][TEST ] Testing FORMAT_COMBO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 187741137] Expected: Should indent number +[Hera] [HADES][TEST ] [KRELTSC: 187770385] Running FORMAT_COMBO.table_format: DECIMAL 1 . 3 SPACES 10 . +[Hera] 1 10 100 +[Hera] [HADES][TEST ] [KRELTSC: 188052615] Test passed +[Hera] [HADES][TEST ] Testing FORMAT_COMBO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 188114687] Expected: Should format table +[Hera] [HADES][TEST ] [KRELTSC: 188144226] FORMAT_COMBO: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 188410657] === I/O Words Summary: 0 passed, 0 failed, 0 skipped, 0 errors +[Hera] [HADES][INFO ] [KRELTSC: 188470891] +[Hera] === Testing Module: Block Words === +[Hera] [HADES][INFO ] [KRELTSC: 188506349] Running Block Words Tests (Module 16)... +[Hera] [HADES][TEST ] [KRELTSC: 188538502] ▶ Testing module: v3/src/test_runner/modules/block_words_test +[Hera] [HADES][TEST ] [KRELTSC: 188575643] Testing word: BLOCK +[Hera] [HADES][TEST ] [KRELTSC: 188600338] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 188627703] Running BLOCK.basic: 1 BLOCK DUP . CR +[Hera] 5238784 +[Hera] [HADES][TEST ] [KRELTSC: 188906493] Test passed +[Hera] [HADES][TEST ] Testing BLOCK ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 188956500] Expected: Should return block address +[Hera] [HADES][TEST ] [KRELTSC: 188987228] Running BLOCK.zero_block: 0 BLOCK +[Hera] [HADES][TEST ] [KRELTSC: 189017655] Expected error occurred +[Hera] [HADES][TEST ] Testing BLOCK ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 189069538] Expected: Should handle block 0 +[Hera] [HADES][TEST ] [KRELTSC: 189296199] Running BLOCK.large_block: 65536 BLOCK +[Hera] [HADES][TEST ] [KRELTSC: 189378750] Expected error occurred +[Hera] [HADES][TEST ] Testing BLOCK ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 189436420] Expected: Should handle large number +[Hera] [HADES][TEST ] [KRELTSC: 189467579] Running BLOCK.negative: -1 BLOCK +[Hera] [HADES][TEST ] [KRELTSC: 189498081] Expected error occurred +[Hera] [HADES][TEST ] Testing BLOCK ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 189741912] Expected: Should handle negative +[Hera] [HADES][TEST ] [KRELTSC: 189781064] Running BLOCK.empty_stack: BLOCK +[Hera] [HADES][TEST ] [KRELTSC: 189841031] Expected error occurred +[Hera] [HADES][TEST ] Testing BLOCK ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 189889320] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 189921053] BLOCK: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 190162454] ▶ Testing module: v3/src/test_runner/modules/block_words_test +[Hera] [HADES][TEST ] [KRELTSC: 190199681] Testing word: BUFFER +[Hera] [HADES][TEST ] [KRELTSC: 190255759] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 190287608] Running BUFFER.basic: 1 BUFFER DUP . CR +[Hera] 5238784 +[Hera] [HADES][TEST ] [KRELTSC: 190356557] Test passed +[Hera] [HADES][TEST ] Testing BUFFER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 190619492] Expected: Should return buffer address +[Hera] [HADES][TEST ] [KRELTSC: 190662009] Running BUFFER.zero_block: 0 BUFFER +[Hera] [HADES][TEST ] [KRELTSC: 190703584] Expected error occurred +[Hera] [HADES][TEST ] Testing BUFFER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 190753558] Expected: Should handle block 0 +[Hera] [HADES][TEST ] [KRELTSC: 190783247] Running BUFFER.flush_dirty: 2 BLOCK 1+ 2 BUFFER +[Hera] [HADES][TEST ] [KRELTSC: 190999416] Test passed +[Hera] [HADES][TEST ] Testing BUFFER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 191118985] Expected: Should flush if dirty +[Hera] [HADES][TEST ] [KRELTSC: 191160848] Running BUFFER.empty_stack: BUFFER +[Hera] [HADES][TEST ] [KRELTSC: 191192968] Expected error occurred +[Hera] [HADES][TEST ] Testing BUFFER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 191454252] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 191485805] BUFFER: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 191519678] ▶ Testing module: v3/src/test_runner/modules/block_words_test +[Hera] [HADES][TEST ] [KRELTSC: 191555748] Testing word: UPDATE +[Hera] [HADES][TEST ] [KRELTSC: 191581140] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 191608346] Running UPDATE.basic: 1 BLOCK UPDATE +[Hera] [HADES][TEST ] [KRELTSC: 191658171] Test passed +[Hera] [HADES][TEST ] Testing UPDATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 191888094] Expected: Should mark block dirty +[Hera] [HADES][TEST ] [KRELTSC: 191918882] Running UPDATE.multiple: 1 BLOCK UPDATE UPDATE +[Hera] [HADES][TEST ] [KRELTSC: 191959421] Test passed +[Hera] [HADES][TEST ] Testing UPDATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 192007388] Expected: Should handle multiple updates +[Hera] [HADES][TEST ] [KRELTSC: 192042545] Running UPDATE.no_block: 0 SCR ! UPDATE +[Hera] [HADES][TEST ] [KRELTSC: 192081442] Expected error occurred +[Hera] [HADES][TEST ] Testing UPDATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 192360669] Expected: Should error: blk=0 is invalid +[Hera] [HADES][TEST ] [KRELTSC: 192437567] UPDATE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 192482138] ▶ Testing module: v3/src/test_runner/modules/block_words_test +[Hera] [HADES][TEST ] [KRELTSC: 192519025] Testing word: SAVE-BUFFERS +[Hera] [HADES][TEST ] [KRELTSC: 192762325] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 192821871] Running SAVE-BUFFERS.basic: SAVE-BUFFERS +[Hera] [HADES][TEST ] [KRELTSC: 192880100] Test passed +[Hera] [HADES][TEST ] Testing SAVE-BUFFERS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 192928821] Expected: Should flush all buffers +[Hera] [HADES][TEST ] [KRELTSC: 192959391] Running SAVE-BUFFERS.dirty_blocks: 1 BLOCK UPDATE SAVE-BUFFER +[Hera] [HADES][TEST ] [KRELTSC: 193255885] Test passed +[Hera] [HADES][TEST ] Testing SAVE-BUFFERS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 193313739] Expected: Should save dirty blocks +[Hera] [HADES][TEST ] [KRELTSC: 193343762] Running SAVE-BUFFERS.no_dirty: SAVE-BUFFERS +[Hera] [HADES][TEST ] [KRELTSC: 193376471] Test passed +[Hera] [HADES][TEST ] Testing SAVE-BUFFERS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 193620944] Expected: Should handle no dirty blocks +[Hera] [HADES][TEST ] [KRELTSC: 193691191] SAVE-BUFFERS: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 193735386] ▶ Testing module: v3/src/test_runner/modules/block_words_test +[Hera] [HADES][TEST ] [KRELTSC: 193772799] Testing word: EMPTY-BUFFERS +[Hera] [HADES][TEST ] [KRELTSC: 193799584] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 193826211] Running EMPTY-BUFFERS.basic: EMPTY-BUFFERS +[Hera] [HADES][TEST ] [KRELTSC: 194088574] Test passed +[Hera] [HADES][TEST ] Testing EMPTY-BUFFERS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 194170786] Expected: Should invalidate all buffers +[Hera] [HADES][TEST ] [KRELTSC: 194202852] Running EMPTY-BUFFERS.after_use: 1 BLOCK EMPTY-BUFFERS +[Hera] [HADES][TEST ] [KRELTSC: 194241947] Test passed +[Hera] [HADES][TEST ] Testing EMPTY-BUFFERS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 194446783] Expected: Should invalidate used buffers +[Hera] [HADES][TEST ] [KRELTSC: 194527990] Running EMPTY-BUFFERS.dirty_blocks: 1 BLOCK UPDATE EMPTY-BUFF +[Hera] [HADES][TEST ] [KRELTSC: 194602136] Test passed +[Hera] [HADES][TEST ] Testing EMPTY-BUFFERS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 194650260] Expected: Should handle dirty blocks +[Hera] [HADES][TEST ] [KRELTSC: 194681779] EMPTY-BUFFERS: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 194923022] ▶ Testing module: v3/src/test_runner/modules/block_words_test +[Hera] [HADES][TEST ] [KRELTSC: 195003746] Testing word: FLUSH +[Hera] [HADES][TEST ] [KRELTSC: 195039100] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 195064470] Running FLUSH.basic: FLUSH +[Hera] [HADES][TEST ] [KRELTSC: 195098771] Test passed +[Hera] [HADES][TEST ] Testing FLUSH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 195145363] Expected: Should save and invalidate buffers +[Hera] [HADES][TEST ] [KRELTSC: 195334315] Running FLUSH.dirty_blocks: 1 BLOCK UPDATE FLUSH +[Hera] [HADES][TEST ] [KRELTSC: 195446698] Test passed +[Hera] [HADES][TEST ] Testing FLUSH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 195501377] Expected: Should flush dirty blocks +[Hera] [HADES][TEST ] [KRELTSC: 195532904] Running FLUSH.after_empty: EMPTY-BUFFERS FLUSH +[Hera] [HADES][TEST ] [KRELTSC: 195567583] Test passed +[Hera] [HADES][TEST ] Testing FLUSH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 195757774] Expected: Should handle empty buffers +[Hera] [HADES][TEST ] [KRELTSC: 195789474] FLUSH: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 195821155] ▶ Testing module: v3/src/test_runner/modules/block_words_test +[Hera] [HADES][TEST ] [KRELTSC: 195858262] Testing word: LOAD +[Hera] [HADES][TEST ] [KRELTSC: 195882565] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 195909648] Running LOAD.basic: 1 LOAD +[Hera] [HADES][TEST ] [KRELTSC: 195949887] Test passed +[Hera] [HADES][TEST ] Testing LOAD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 195993656] Expected: Should interpret block 1 +[Hera] [HADES][TEST ] [KRELTSC: 196023537] Running LOAD.zero_block: 0 LOAD +[Hera] [HADES][TEST ] [KRELTSC: 196200141] Expected error occurred +[Hera] [HADES][TEST ] Testing LOAD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 196246301] Expected: Should handle block 0 +[Hera] [HADES][TEST ] [KRELTSC: 196276568] Running LOAD.nonexistent: 9999 LOAD +[Hera] [HADES][TEST ] [KRELTSC: 196307204] Expected error occurred +[Hera] [HADES][TEST ] Testing LOAD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 196356489] Expected: Should handle missing block +[Hera] [HADES][TEST ] [KRELTSC: 196387763] Running LOAD.empty_stack: LOAD +[Hera] [HADES][TEST ] [KRELTSC: 196417632] Expected error occurred +[Hera] [HADES][TEST ] Testing LOAD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 196629600] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 196661270] LOAD: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 196694146] ▶ Testing module: v3/src/test_runner/modules/block_words_test +[Hera] [HADES][TEST ] [KRELTSC: 196731439] Testing word: LIST +[Hera] [HADES][TEST ] [KRELTSC: 196754974] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 196781304] Running LIST.basic: 1 LIST + +[Hera] Block 1 + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + + + +[Hera] [HADES][TEST ] [KRELTSC: 198075006] Test passed +[Hera] [HADES][TEST ] Testing LIST ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 198122484] Expected: Should display block 1 +[Hera] [HADES][TEST ] [KRELTSC: 198155472] Running LIST.zero_block: 0 LIST +[Hera] [HADES][TEST ] [KRELTSC: 198189500] Expected error occurred +[Hera] [HADES][TEST ] Testing LIST ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 198436626] Expected: Should handle block 0 +[Hera] [HADES][TEST ] [KRELTSC: 198486439] Running LIST.nonexistent: 9999 LIST +[Hera] [HADES][TEST ] [KRELTSC: 198522136] Expected error occurred +[Hera] [HADES][TEST ] Testing LIST ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 198571281] Expected: Should handle missing block +[Hera] [HADES][TEST ] [KRELTSC: 198605233] Running LIST.empty_stack: LIST +[Hera] [HADES][TEST ] [KRELTSC: 198824258] Expected error occurred +[Hera] [HADES][TEST ] Testing LIST ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 198909236] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 198939800] LIST: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 198971867] ▶ Testing module: v3/src/test_runner/modules/block_words_test +[Hera] [HADES][TEST ] [KRELTSC: 199008408] Testing word: SCR +[Hera] [HADES][TEST ] [KRELTSC: 199035811] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 199259763] Running SCR.basic: SCR @ . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 199348491] Test passed +[Hera] [HADES][TEST ] Testing SCR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 199396079] Expected: Should show current block +[Hera] [HADES][TEST ] [KRELTSC: 199426049] Running SCR.after_list: 1 LIST SCR @ . CR + +[Hera] Block 1 + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + + + +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 200992490] Test passed +[Hera] [HADES][TEST ] Testing SCR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 201039017] Expected: Should update after LIST +[Hera] [HADES][TEST ] [KRELTSC: 201099543] Running SCR.after_load: 1 LOAD SCR @ . CR +[Hera] [HADES][TEST ] [KRELTSC: 201132249] Test passed +[Hera] [HADES][TEST ] Testing SCR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 201178183] Expected: Should update after LOAD +[Hera] [HADES][TEST ] [KRELTSC: 201210734] SCR: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 201242741] ▶ Testing module: v3/src/test_runner/modules/block_words_test +[Hera] [HADES][TEST ] [KRELTSC: 201468407] Testing word: THRU +[Hera] [HADES][TEST ] [KRELTSC: 201524579] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 201558019] Running THRU.single_block: 1 1 THRU +[Hera] [HADES][TEST ] [KRELTSC: 201602722] Test passed +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 201652471] Expected: Should load single block (1-1) +[Hera] [HADES][TEST ] [KRELTSC: 201858328] Running THRU.ascending: 1 3 THRU +[Hera] [HADES][TEST ] [KRELTSC: 201931560] Test passed +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 201999961] Expected: Should load blocks 1-3 in order +[Hera] [HADES][TEST ] [KRELTSC: 202031635] Running THRU.descending: 3 1 THRU +[Hera] [HADES][TEST ] [KRELTSC: 202074590] Test passed +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 202324260] Expected: Should auto-swap and load 1-3 +[Hera] [HADES][TEST ] [KRELTSC: 202394291] Running THRU.same_block: 2 2 THRU +[Hera] [HADES][TEST ] [KRELTSC: 202437028] Test passed +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 202482839] Expected: Should load single block (2-2) +[Hera] [HADES][TEST ] [KRELTSC: 202523384] Running THRU.zero_start: 0 3 THRU +[Hera] [HADES][TEST ] [KRELTSC: 202745138] Expected error occurred +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 202818022] Expected: Should reject block 0 as start +[Hera] [HADES][TEST ] [KRELTSC: 202849854] Running THRU.zero_end: 1 0 THRU +[Hera] [HADES][TEST ] [KRELTSC: 202878684] Expected error occurred +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 202928500] Expected: Should reject block 0 as end +[Hera] [HADES][TEST ] [KRELTSC: 202969262] Running THRU.both_zero: 0 0 THRU +[Hera] [HADES][TEST ] [KRELTSC: 203167415] Expected error occurred +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 203275255] Expected: Should reject both blocks as 0 +[Hera] [HADES][TEST ] [KRELTSC: 203315424] Running THRU.invalid_start: 9999 10000 THRU +[Hera] [HADES][TEST ] [KRELTSC: 203348070] Expected error occurred +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 203580298] Expected: Should reject invalid start block +[Hera] [HADES][TEST ] [KRELTSC: 203653147] Running THRU.invalid_end: 1 9999 THRU +[Hera] [HADES][TEST ] [KRELTSC: 203695486] Expected error occurred +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 203742519] Expected: Should reject invalid end block +[Hera] [HADES][TEST ] [KRELTSC: 203773783] Running THRU.both_invalid: 9998 9999 THRU +[Hera] [HADES][TEST ] [KRELTSC: 203813391] Expected error occurred +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 204053976] Expected: Should reject both invalid blocks +[Hera] [HADES][TEST ] [KRELTSC: 204113331] Running THRU.empty_stack: THRU +[Hera] [HADES][TEST ] [KRELTSC: 204145962] Expected error occurred +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 204194487] Expected: Should cause stack underflow (no args) +[Hera] [HADES][TEST ] [KRELTSC: 204229910] Running THRU.one_arg: 1 THRU +[Hera] [HADES][TEST ] [KRELTSC: 204269101] Expected error occurred +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 204516297] Expected: Should cause stack underflow (one arg) +[Hera] [HADES][TEST ] [KRELTSC: 204592008] Running THRU.small_range: 1 2 THRU +[Hera] [HADES][TEST ] [KRELTSC: 204666768] Test passed +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 204905179] Expected: Should load 2-block range +[Hera] [HADES][TEST ] [KRELTSC: 204957976] Running THRU.medium_range: 1 5 THRU +[Hera] [HADES][TEST ] [KRELTSC: 205008914] Test passed +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 205055511] Expected: Should load 5-block range +[Hera] [HADES][TEST ] [KRELTSC: 205085478] Running THRU.negative_start: -1 3 THRU +[Hera] [HADES][TEST ] [KRELTSC: 205128180] Expected error occurred +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 205386701] Expected: Should handle negative start +[Hera] [HADES][TEST ] [KRELTSC: 205437469] Running THRU.negative_end: 1 -3 THRU +[Hera] [HADES][TEST ] [KRELTSC: 205471279] Expected error occurred +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 205521051] Expected: Should handle negative end +[Hera] [HADES][TEST ] [KRELTSC: 205554809] Running THRU.both_negative: -3 -1 THRU +[Hera] [HADES][TEST ] [KRELTSC: 205758572] Expected error occurred +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 205860064] Expected: Should handle both negative +[Hera] [HADES][TEST ] [KRELTSC: 205891863] THRU: 17 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 205925118] === Block Words Summary: 0 passed, 0 failed, 0 skipped, 0 error +[Hera] [HADES][INFO ] [KRELTSC: 205962265] +[Hera] === Testing Module: Dictionary Words === +[Hera] [HADES][INFO ] [KRELTSC: 206009811] Running Dictionary Words Tests (Module 4)... +[Hera] [HADES][TEST ] [KRELTSC: 206237720] Testing word: HERE +[Hera] [HADES][TEST ] [KRELTSC: 206294049] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 206324019] Running HERE.basic: HERE HERE = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 206366919] Test passed +[Hera] [HADES][TEST ] Testing HERE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 206416057] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 206449744] Running HERE.after_comma: HERE 42 , HERE SWAP - 1 CELLS = 0 S +[Hera] [HADES][TEST ] [KRELTSC: 206735356] Test passed +[Hera] [HADES][TEST ] Testing HERE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 206781802] Expected: Asserts HERE advances by exactly 1 CELLS (8 bytes +[Hera] [HADES][TEST ] [KRELTSC: 206816737] Running HERE.after_c_comma: HERE 65 C, HERE SWAP - . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 206867208] Test passed +[Hera] [HADES][TEST ] Testing HERE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 207123721] Expected: Should print: 1 +[Hera] [HADES][TEST ] [KRELTSC: 207183157] Running HERE.after_allot: HERE 10 ALLOT HERE SWAP - . CR +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 207232547] Test passed +[Hera] [HADES][TEST ] Testing HERE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 207281813] Expected: Should print: 10 +[Hera] [HADES][TEST ] [KRELTSC: 207315184] Running HERE.stability: HERE DUP HERE = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 207613628] Test passed +[Hera] [HADES][TEST ] Testing HERE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 207661554] Expected: Should be stable +[Hera] [HADES][TEST ] [KRELTSC: 207689342] HERE: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 207727849] Testing word: ALLOT +[Hera] [HADES][TEST ] [KRELTSC: 207939909] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 207997623] Running ALLOT.basic: HERE 10 ALLOT HERE SWAP - . CR +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 208075860] Test passed +[Hera] [HADES][TEST ] Testing ALLOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 208121796] Expected: Should print: 10 +[Hera] [HADES][TEST ] [KRELTSC: 208152978] Running ALLOT.zero: HERE 0 ALLOT HERE SWAP - . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 208429853] Test passed +[Hera] [HADES][TEST ] Testing ALLOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 208505467] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 208532799] Running ALLOT.negative: HERE -4 ALLOT HERE SWAP - . CR +[Hera] -4 +[Hera] [HADES][TEST ] [KRELTSC: 208581522] Test passed +[Hera] [HADES][TEST ] Testing ALLOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 208873482] Expected: Should print: -4 +[Hera] [HADES][TEST ] [KRELTSC: 208930621] Running ALLOT.large: HERE 100 ALLOT HERE SWAP - . CR +[Hera] 100 +[Hera] [HADES][TEST ] [KRELTSC: 208978159] Test passed +[Hera] [HADES][TEST ] Testing ALLOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 209030872] Expected: Should print: 100 +[Hera] [HADES][TEST ] [KRELTSC: 209239536] Running ALLOT.after_use: ALIGN HERE 10 ALLOT 42 OVER ! @ . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 209329752] Test passed +[Hera] [HADES][TEST ] Testing ALLOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 209375199] Expected: Should store and retrieve +[Hera] [HADES][TEST ] [KRELTSC: 209405278] Running ALLOT.empty_stack: ALLOT +[Hera] [HADES][TEST ] [KRELTSC: 209435326] Expected error occurred +[Hera] [HADES][TEST ] Testing ALLOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 209719491] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 209786556] ALLOT: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 209826706] Testing word: , +[Hera] [HADES][TEST ] [KRELTSC: 209849937] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 209876457] Running ,.basic: 42 , HERE 1 CELLS - @ . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 210159272] Test passed +[Hera] [HADES][TEST ] Testing , ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 210249200] Expected: Should compile 42 +[Hera] [HADES][TEST ] [KRELTSC: 210276638] Running ,.negative: -999 , HERE 1 CELLS - @ . CR +[Hera] [HADES][INFO ] [KRELTSC: 210313527] L8[TABLE]: Config 1 → 2 regime=7 score=26214 L1=0 L2=0 L3=0 L +[Hera] -999 +[Hera] [HADES][TEST ] [KRELTSC: 210551422] Test passed +[Hera] [HADES][TEST ] Testing , ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 210607852] Expected: Should compile -999 +[Hera] [HADES][TEST ] [KRELTSC: 210661009] Running ,.zero: 0 , HERE 1 CELLS - @ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 210718280] Test passed +[Hera] [HADES][TEST ] Testing , ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 210769259] Expected: Should compile 0 +[Hera] [HADES][TEST ] [KRELTSC: 211024686] Running ,.max_int: 2147483647 , HERE 1 CELLS - @ . CR +[Hera] 2147483647 +[Hera] [HADES][TEST ] [KRELTSC: 211102582] Test passed +[Hera] [HADES][TEST ] Testing , ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 211154819] Expected: Should compile max int +[Hera] [HADES][TEST ] [KRELTSC: 211182768] Running ,.min_int: -2147483648 , HERE 1 CELLS - @ . CR +[Hera] -2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 211459113] Test passed +[Hera] [HADES][TEST ] Testing , ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 211525421] Expected: Should compile min int +[Hera] [HADES][TEST ] [KRELTSC: 211555572] Running ,.multiple: 10 , 20 , HERE 1 CELLS - @ . HERE 1 CELLS +[Hera] 20 20 +[Hera] [HADES][TEST ] [KRELTSC: 211605688] Test passed +[Hera] [HADES][TEST ] Testing , ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 211841751] Expected: Should compile multiple +[Hera] [HADES][TEST ] [KRELTSC: 211910930] Running ,.empty_stack: , +[Hera] [HADES][TEST ] [KRELTSC: 211957914] Expected error occurred +[Hera] [HADES][TEST ] Testing , ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 212003746] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 212034307] ,: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 212071830] Testing word: C, +[Hera] [HADES][TEST ] [KRELTSC: 212309368] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 212367928] Running C,.basic: 65 C, HERE 1 - C@ . CR +[Hera] 65 +[Hera] [HADES][TEST ] [KRELTSC: 212416456] Test passed +[Hera] [HADES][TEST ] Testing C, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 212463703] Expected: Should compile byte 65 +[Hera] [HADES][TEST ] [KRELTSC: 212496867] Running C,.zero: 0 C, HERE 1 - C@ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 212716218] Test passed +[Hera] [HADES][TEST ] Testing C, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 212813775] Expected: Should compile byte 0 +[Hera] [HADES][TEST ] [KRELTSC: 212843839] Running C,.high_byte: 255 C, HERE 1 - C@ . CR +[Hera] 255 +[Hera] [HADES][TEST ] [KRELTSC: 212887127] Test passed +[Hera] [HADES][TEST ] Testing C, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 212938033] Expected: Should compile byte 255 +[Hera] [HADES][TEST ] [KRELTSC: 213129670] Running C,.truncation: 256 C, HERE 1 - C@ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 213231652] Test passed +[Hera] [HADES][TEST ] Testing C, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 213287047] Expected: Should truncate to 0 +[Hera] [HADES][TEST ] [KRELTSC: 213315063] Running C,.negative: -1 C, HERE 1 - C@ . CR +[Hera] 255 +[Hera] [HADES][TEST ] [KRELTSC: 213364373] Test passed +[Hera] [HADES][TEST ] Testing C, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 213552156] Expected: Should handle negative +[Hera] [HADES][TEST ] [KRELTSC: 213581106] Running C,.multiple: 65 C, 66 C, HERE 2 - C@ . HERE 1 - C@ . +[Hera] 65 66 +[Hera] [HADES][TEST ] [KRELTSC: 213631036] Test passed +[Hera] [HADES][TEST ] Testing C, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 213675698] Expected: Should compile multiple +[Hera] [HADES][TEST ] [KRELTSC: 213706358] Running C,.empty_stack: C, +[Hera] [HADES][TEST ] [KRELTSC: 213735679] Expected error occurred +[Hera] [HADES][TEST ] Testing C, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 213784861] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 213824119] C,: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 213859366] Testing word: 2, +[Hera] [HADES][TEST ] [KRELTSC: 214021684] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 214046685] Running 2,.basic: 12345 67890 2, HERE 2 CELLS - 2@ . . CR +[Hera] 67890 12345 +[Hera] [HADES][TEST ] [KRELTSC: 214134809] Test passed +[Hera] [HADES][TEST ] Testing 2, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 214177695] Expected: Should compile double +[Hera] [HADES][TEST ] [KRELTSC: 214205631] Running 2,.zero: 0 0 2, HERE 2 CELLS - 2@ . . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 214257621] Test passed +[Hera] [HADES][TEST ] Testing 2, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 214481457] Expected: Should compile zero double +[Hera] [HADES][TEST ] [KRELTSC: 214550011] Running 2,.negative: -1000 -2000 2, HERE 2 CELLS - 2@ . . CR +[Hera] -2000 -1000 +[Hera] [HADES][TEST ] [KRELTSC: 214613307] Test passed +[Hera] [HADES][TEST ] Testing 2, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 214658641] Expected: Should compile negative double +[Hera] [HADES][TEST ] [KRELTSC: 214694798] Running 2,.large: 2147483647 -1 2, HERE 2 CELLS - 2@ . . CR +[Hera] -1 2147483647 +[Hera] [HADES][TEST ] [KRELTSC: 214993214] Test passed +[Hera] [HADES][TEST ] Testing 2, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 215039183] Expected: Should compile large double +[Hera] [HADES][TEST ] [KRELTSC: 215070713] Running 2,.one_item: 42 2, +[Hera] [HADES][TEST ] [KRELTSC: 215106688] Expected error occurred +[Hera] [HADES][TEST ] Testing 2, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 215405810] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 215456089] Running 2,.empty_stack: 2, +[Hera] [HADES][TEST ] [KRELTSC: 215486115] Expected error occurred +[Hera] [HADES][TEST ] Testing 2, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 215540486] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 215752923] 2,: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 215818524] Testing word: PAD +[Hera] [HADES][TEST ] [KRELTSC: 215840765] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 215864938] Running PAD.basic: PAD PAD = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 215905917] Test passed +[Hera] [HADES][TEST ] Testing PAD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 215949576] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 215983025] Running PAD.different_from_here: PAD HERE = . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 216201944] Test passed +[Hera] [HADES][TEST ] Testing PAD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 216280189] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 216310156] Running PAD.stability: PAD DUP PAD = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 216352275] Test passed +[Hera] [HADES][TEST ] Testing PAD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 216401115] Expected: Should be stable +[Hera] [HADES][TEST ] [KRELTSC: 216435416] Running PAD.usable: PAD 42 OVER ! @ . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 216657925] Test passed +[Hera] [HADES][TEST ] Testing PAD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 216723173] Expected: Should be usable memory +[Hera] [HADES][TEST ] [KRELTSC: 216752533] PAD: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 216784328] Testing word: SP@ +[Hera] [HADES][TEST ] [KRELTSC: 216808606] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 216839388] Running SP@.depth_effect: 42 SP@ SWAP DROP SP@ = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 217045534] Test passed +[Hera] [HADES][TEST ] Testing SP@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 217149882] Expected: Should show stack effect +[Hera] [HADES][TEST ] [KRELTSC: 217203968] Running SP@.empty_stack: DEPTH 0= SP@ AND . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 217247406] Test passed +[Hera] [HADES][TEST ] Testing SP@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 217302101] Expected: Should work on empty stack +[Hera] [HADES][TEST ] [KRELTSC: 217505739] Running SP@.multiple_items: 1 2 3 SP@ SWAP DROP SWAP DROP SWA +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 217593330] Test passed +[Hera] [HADES][TEST ] Testing SP@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 217638550] Expected: Should track changes +[Hera] [HADES][TEST ] [KRELTSC: 217666981] SP@: 3 passed, 0 failed, 1 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 217699369] Testing word: SP! +[Hera] [HADES][TEST ] [KRELTSC: 217732720] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 217899539] Running SP!.basic_restore: 1 2 3 SP@ 4 5 6 DROP DROP DROP SP! +[Hera] 3 [HADES][TEST ] [KRELTSC: 217961735] Test passed +[Hera] [HADES][TEST ] Testing SP! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 217997720] Expected: Should restore stack +[Hera] [HADES][TEST ] [KRELTSC: 218027325] Running SP!.invalid_addr: 0 SP! +[Hera] [HADES][TEST ] [KRELTSC: 218057514] Expected error occurred +[Hera] [HADES][TEST ] Testing SP! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 218106276] Expected: Should cause error +[Hera] [HADES][TEST ] [KRELTSC: 218134327] Running SP!.empty_stack: SP! +[Hera] [HADES][TEST ] [KRELTSC: 218169323] Expected error occurred +[Hera] [HADES][TEST ] Testing SP! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 218419381] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 218452262] SP!: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 218515324] Testing word: LATEST +[Hera] [HADES][TEST ] [KRELTSC: 218539875] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 218566916] Running LATEST.basic: LATEST LATEST = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 218804403] Test passed +[Hera] [HADES][TEST ] Testing LATEST ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 218850519] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 218877894] Running LATEST.stability: LATEST DUP LATEST = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 218919975] Test passed +[Hera] [HADES][TEST ] Testing LATEST ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 218964677] Expected: Should be stable +[Hera] [HADES][TEST ] [KRELTSC: 218992322] LATEST: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 219033267] Testing word: COMPILATION +[Hera] [HADES][TEST ] [KRELTSC: 219237059] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 219267494] Running COMPILATION.here_comma_sequence: HERE 10 , 20 , 30 , +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 219350438] Test passed +[Hera] [HADES][TEST ] Testing COMPILATION ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 219396132] Expected: Should advance HERE by 12 +[Hera] [HADES][TEST ] [KRELTSC: 219425107] Running COMPILATION.mixed_compilation: HERE 42 , 65 C, 100 20 +[Hera] [HADES][INFO ] [KRELTSC: 219663869] L8[TABLE]: Config 2 → 3 regime=7 score=26214 L1=0 L2=0 L3=0 L +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 219732591] Test passed +[Hera] [HADES][TEST ] Testing COMPILATION ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 219797242] Expected: Should advance correctly +[Hera] [HADES][TEST ] [KRELTSC: 219826340] Running COMPILATION.allot_comma_combo: HERE 10 ALLOT 99 , HER +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 219879482] Test passed +[Hera] [HADES][TEST ] Testing COMPILATION ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 220092903] Expected: Should combine allot and comma +[Hera] [HADES][TEST ] [KRELTSC: 220146349] Running COMPILATION.pad_isolation: PAD 999 OVER ! HERE 42 , P +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 220229365] Test passed +[Hera] [HADES][TEST ] Testing COMPILATION ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 220273599] Expected: PAD should be isolated +[Hera] [HADES][TEST ] [KRELTSC: 220301777] COMPILATION: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 220514487] Testing word: STACK_MGMT +[Hera] [HADES][TEST ] [KRELTSC: 220555822] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 220590790] Running STACK_MGMT.sp_round_trip: 42 43 SP@ >R 44 45 R> SP! . +[Hera] 43 42 +[Hera] [HADES][TEST ] [KRELTSC: 220667691] Test passed +[Hera] [HADES][TEST ] Testing STACK_MGMT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 220716125] Expected: Should print: 43 42 +[Hera] [HADES][TEST ] [KRELTSC: 220750305] Running STACK_MGMT.depth_preservation: 1 2 3 DEPTH >R SP@ >R +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 220996813] Test passed +[Hera] [HADES][TEST ] Testing STACK_MGMT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 221078841] Expected: Should preserve depth +[Hera] [HADES][TEST ] [KRELTSC: 221107998] STACK_MGMT: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 221142897] === Dictionary Words Summary: 0 passed, 0 failed, 0 skipped, 0 +[Hera] [HADES][INFO ] [KRELTSC: 221182945] +[Hera] === Testing Module: Dictionary Manipulation Words === +[Hera] [HADES][INFO ] [KRELTSC: 221454557] Running Dictionary Manipulation Words Tests (Module 14)... +[Hera] [HADES][TEST ] [KRELTSC: 221524788] ▶ Testing module: v3/src/test_runner/modules/dictionary_manip +[Hera] [HADES][TEST ] [KRELTSC: 221559218] Testing word: CREATE +[Hera] [HADES][TEST ] [KRELTSC: 221583202] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 221609305] Running CREATE.basic: CREATE test1 42 , test1 @ . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 221935703] Test passed +[Hera] [HADES][TEST ] Testing CREATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 221988944] Expected: Should create and store +[Hera] [HADES][TEST ] [KRELTSC: 222019188] Running CREATE.empty_name: CREATE +[Hera] [HADES][TEST ] [KRELTSC: 222058141] Expected error occurred +[Hera] [HADES][TEST ] Testing CREATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 222283878] Expected: Should handle empty name +[Hera] [HADES][TEST ] [KRELTSC: 222338268] Running CREATE.redefine_shadows: CREATE T 1 , CREATE T 2 , T +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 222406911] Test passed +[Hera] [HADES][TEST ] Testing CREATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 222451371] Expected: Newest definition should win (prints 2) +[Hera] [HADES][TEST ] [KRELTSC: 222487213] Running CREATE.duplicate: CREATE test2 CREATE test2 +[Hera] [HADES][TEST ] [KRELTSC: 222690953] Test passed +[Hera] [HADES][TEST ] Testing CREATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 222737995] Expected: Should allow redefinition (latest shadows) +[Hera] [HADES][TEST ] [KRELTSC: 222770621] CREATE: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 222804905] ▶ Testing module: v3/src/test_runner/modules/dictionary_manip +[Hera] [HADES][TEST ] [KRELTSC: 222841771] Testing word: FORGET +[Hera] [HADES][TEST ] [KRELTSC: 222867229] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 222893478] Running FORGET.basic: CREATE temp1 FORGET temp1 +[Hera] [HADES][TEST ] [KRELTSC: 223146428] Test passed +[Hera] [HADES][TEST ] Testing FORGET ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 223213847] Expected: Should forget word +[Hera] [HADES][TEST ] [KRELTSC: 223270174] Running FORGET.nonexistent: FORGET nonexistent +[Hera] [HADES][TEST ] [KRELTSC: 223312504] Expected error occurred +[Hera] [HADES][TEST ] Testing FORGET ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 223369732] Expected: Should handle missing word +[Hera] [HADES][TEST ] [KRELTSC: 223614457] Running FORGET.protected: FORGET FORGET +[Hera] [HADES][TEST ] [KRELTSC: 223694987] Expected error occurred +[Hera] [HADES][TEST ] Testing FORGET ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 223753230] Expected: Should protect system words +[Hera] [HADES][TEST ] [KRELTSC: 223788679] FORGET: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 223820959] ▶ Testing module: v3/src/test_runner/modules/dictionary_manip +[Hera] [HADES][TEST ] [KRELTSC: 224022579] Testing word: FENCE +[Hera] [HADES][TEST ] [KRELTSC: 224046534] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 224073684] Running FENCE.basic: CREATE fnc1 FENCE CREATE fnc2 FORGET fnc +[Hera] [HADES][TEST ] [KRELTSC: 224142794] Test passed +[Hera] [HADES][TEST ] Testing FENCE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 224186942] Expected: Should forget a word defined after FENCE +[Hera] [HADES][TEST ] [KRELTSC: 224225300] Running FENCE.protects_older: CREATE fnc3 CREATE fnc4 FENCE F +[Hera] [HADES][TEST ] [KRELTSC: 224440226] Expected error occurred +[Hera] [HADES][TEST ] Testing FENCE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 224492030] Expected: Should refuse to forget a word defined before FEN +[Hera] [HADES][TEST ] [KRELTSC: 224528679] Running FENCE.forget_latest_keeps_predecessor: CREATE fnc5 FE +[Hera] [HADES][TEST ] [KRELTSC: 224590730] Test passed +[Hera] [HADES][TEST ] Testing FENCE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 224634356] Expected: Forgetting the newest word must not disturb an ol +[Hera] [HADES][TEST ] [KRELTSC: 224675033] FENCE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 224907644] ▶ Testing module: v3/src/test_runner/modules/dictionary_manip +[Hera] [HADES][TEST ] [KRELTSC: 224943672] Testing word: IMMEDIATE +[Hera] [HADES][TEST ] [KRELTSC: 224983173] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 225031969] Running IMMEDIATE.basic: : test3 42 ; IMMEDIATE test3 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 225120883] Test passed +[Hera] [HADES][TEST ] Testing IMMEDIATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 225395194] Expected: Should execute immediately +[Hera] [HADES][TEST ] [KRELTSC: 225461677] Running IMMEDIATE.already_immediate: : test4 43 ; IMMEDIATE I +[Hera] [HADES][TEST ] [KRELTSC: 225518085] Test passed +[Hera] [HADES][TEST ] Testing IMMEDIATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 225750751] Expected: Should handle double immediate +[Hera] [HADES][TEST ] [KRELTSC: 225795620] IMMEDIATE: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 225851865] ▶ Testing module: v3/src/test_runner/modules/dictionary_manip +[Hera] [HADES][TEST ] [KRELTSC: 225890291] Testing word: FIND +[Hera] [HADES][TEST ] [KRELTSC: 225915086] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 225941340] Running FIND.existing: FIND DUP . CR +[Hera] 1252562496 +[Hera] [HADES][TEST ] [KRELTSC: 226004879] Test passed +[Hera] [HADES][TEST ] Testing FIND ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 226276095] Expected: Should find system word +[Hera] [HADES][TEST ] [KRELTSC: 226337167] Running FIND.user_word: : test5 44 ; FIND test5 . CR +[Hera] 1252896080 +[Hera] [HADES][TEST ] [KRELTSC: 226405019] Test passed +[Hera] [HADES][TEST ] Testing FIND ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 226631910] Expected: Should find user word +[Hera] [HADES][TEST ] [KRELTSC: 226677249] Running FIND.nonexistent: FIND nonexistent . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 226745712] Test passed +[Hera] [HADES][TEST ] Testing FIND ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 226791291] Expected: Should return 0 +[Hera] [HADES][TEST ] [KRELTSC: 226818781] Running FIND.empty: FIND +[Hera] [HADES][TEST ] [KRELTSC: 226852969] Expected error occurred +[Hera] [HADES][TEST ] Testing FIND ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 227054299] Expected: Should error (no token) +[Hera] [HADES][TEST ] [KRELTSC: 227083815] FIND: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 227149413] ▶ Testing module: v3/src/test_runner/modules/dictionary_manip +[Hera] [HADES][TEST ] [KRELTSC: 227187913] Testing word: DEFINITIONS +[Hera] [HADES][TEST ] [KRELTSC: 227214491] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 227241170] Running DEFINITIONS.basic: FORTH DEFINITIONS +[Hera] [HADES][TEST ] [KRELTSC: 227284614] Test passed +[Hera] [HADES][TEST ] Testing DEFINITIONS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 227485321] Expected: Should set current to context +[Hera] [HADES][TEST ] [KRELTSC: 227516995] Running DEFINITIONS.multiple: FORTH DEFINITIONS DEFINITIONS +[Hera] [HADES][TEST ] [KRELTSC: 227589465] Test passed +[Hera] [HADES][TEST ] Testing DEFINITIONS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 227638365] Expected: Should be idempotent +[Hera] [HADES][TEST ] [KRELTSC: 227666802] DEFINITIONS: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 227703829] ▶ Testing module: v3/src/test_runner/modules/dictionary_manip +[Hera] [HADES][TEST ] [KRELTSC: 227898605] Testing word: SMUDGE +[Hera] [HADES][TEST ] [KRELTSC: 227923254] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 227948576] Running SMUDGE.during_def: : test6 SMUDGE 45 ; +[Hera] [HADES][TEST ] [KRELTSC: 228032925] Test passed +[Hera] [HADES][TEST ] Testing SMUDGE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 228077522] Expected: Should hide incomplete def +[Hera] [HADES][TEST ] [KRELTSC: 228107900] Running SMUDGE.outside_def: SMUDGE +[Hera] [HADES][TEST ] [KRELTSC: 228146600] Expected error occurred +[Hera] [HADES][TEST ] Testing SMUDGE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 228351140] Expected: Should error outside def +[Hera] [HADES][TEST ] [KRELTSC: 228380982] SMUDGE: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 228426920] ▶ Testing module: v3/src/test_runner/modules/dictionary_manip +[Hera] [HADES][TEST ] [KRELTSC: 228486576] Testing word: LATEST +[Hera] [HADES][TEST ] [KRELTSC: 228511899] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 228538301] Running LATEST.basic: LATEST @ . CR +[Hera] 1252643920 +[Hera] [HADES][TEST ] [KRELTSC: 228748879] Test passed +[Hera] [HADES][TEST ] Testing LATEST ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 228843839] Expected: Should show latest word +[Hera] [HADES][TEST ] [KRELTSC: 228873851] Running LATEST.after_def: : test7 46 ; LATEST @ . CR +[Hera] 1252683104 +[Hera] [HADES][TEST ] [KRELTSC: 228936002] Test passed +[Hera] [HADES][TEST ] Testing LATEST ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 228983523] Expected: Should update after def +[Hera] [HADES][TEST ] [KRELTSC: 229018106] Running LATEST.after_forget: CREATE test8 FORGET test8 LATEST +[Hera] 1252683104 +[Hera] [HADES][TEST ] [KRELTSC: 229247695] Test passed +[Hera] [HADES][TEST ] Testing LATEST ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 229313293] Expected: Should update after forget +[Hera] [HADES][TEST ] [KRELTSC: 229361092] LATEST: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 229394103] ▶ Testing module: v3/src/test_runner/modules/dictionary_manip +[Hera] [HADES][TEST ] [KRELTSC: 229430770] Testing word: >BODY +[Hera] [HADES][TEST ] [KRELTSC: 229460863] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 229490386] Running >BODY.basic: CREATE test9 ' test9 >BODY . CR +[Hera] 1252897592 +[Hera] [HADES][TEST ] [KRELTSC: 229711766] Test passed +[Hera] [HADES][TEST ] Testing >BODY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 229792637] Expected: Should get param field +[Hera] [HADES][TEST ] [KRELTSC: 229822392] Running >BODY.variable: VARIABLE var1 ' var1 >BODY . CR +[Hera] 1252898056 +[Hera] [HADES][TEST ] [KRELTSC: 229887949] Test passed +[Hera] [HADES][TEST ] Testing >BODY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 230109497] Expected: Should get var storage +[Hera] [HADES][TEST ] [KRELTSC: 230166022] Running >BODY.nonexistent: ' NONEXISTENT >BODY +[Hera] [HADES][ERROR] [KRELTSC: 230204406] ': word 'NONEXISTENT' not found +[Hera] [HADES][TEST ] [KRELTSC: 230240854] Expected error occurred +[Hera] [HADES][TEST ] Testing >BODY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 230290724] Expected: Should handle missing word +[Hera] [HADES][TEST ] [KRELTSC: 230326215] >BODY: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 230499689] ▶ Testing module: v3/src/test_runner/modules/dictionary_manip +[Hera] [HADES][TEST ] [KRELTSC: 230540647] Testing word: HIDDEN +[Hera] [HADES][TEST ] [KRELTSC: 230596062] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 230622453] Running HIDDEN.basic: : test10 HIDDEN 47 ; +[Hera] [HADES][TEST ] [KRELTSC: 230674468] Test passed +[Hera] [HADES][TEST ] Testing HIDDEN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 230721664] Expected: Should hide word +[Hera] [HADES][TEST ] [KRELTSC: 230754047] Running HIDDEN.outside_def: HIDDEN +[Hera] [HADES][TEST ] [KRELTSC: 230930779] Expected error occurred +[Hera] [HADES][TEST ] Testing HIDDEN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 230991298] Expected: Should error outside def +[Hera] [HADES][TEST ] [KRELTSC: 231044480] HIDDEN: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 231077635] === Dictionary Manipulation Words Summary: 0 passed, 0 failed, +[Hera] [HADES][INFO ] [KRELTSC: 231114492] +[Hera] === Testing Module: Vocabulary Words === +[Hera] [HADES][INFO ] [KRELTSC: 231153903] Running Vocabulary Words Tests (Module 15)... +[Hera] [HADES][TEST ] [KRELTSC: 231191623] ▶ Testing module: v3/src/test_runner/modules/vocabulary_words +[Hera] [HADES][TEST ] [KRELTSC: 231370681] Testing word: VOCABULARY +[Hera] [HADES][TEST ] [KRELTSC: 231397032] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 231442869] Running VOCABULARY.basic: VOCABULARY TEST-VOC1 TEST-VOC1 DEFI +[Hera] [HADES][TEST ] [KRELTSC: 231626047] Test passed +[Hera] [HADES][TEST ] Testing VOCABULARY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 231834246] Expected: Should create vocabulary +[Hera] [HADES][TEST ] [KRELTSC: 231900589] Running VOCABULARY.create_and_switch: VOCABULARY MYVOC MYVOC +[Hera] 1252902576 +[Hera] [HADES][TEST ] [KRELTSC: 232235782] Test passed +[Hera] [HADES][TEST ] Testing VOCABULARY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 232281770] Expected: Should create and switch +[Hera] [HADES][TEST ] [KRELTSC: 232346059] Running VOCABULARY.word_isolation: VOCABULARY ISOLATED ISOLAT +[Hera] [HADES][TEST ] [KRELTSC: 232664707] Test passed +[Hera] [HADES][TEST ] Testing VOCABULARY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 232729591] Expected: Should create word in isolated vocab +[Hera] [HADES][TEST ] [KRELTSC: 232762332] Running VOCABULARY.cross_vocab_access: VOCABULARY V1 V1 DEFIN +[Hera] 11 +[Hera] [HADES][TEST ] [KRELTSC: 233111660] Test passed +[Hera] [HADES][TEST ] Testing VOCABULARY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 233159046] Expected: Should access word across vocabs +[Hera] [HADES][TEST ] [KRELTSC: 233227334] Running VOCABULARY.multiple_vocabs: VOCABULARY VA VOCABULARY +[Hera] [HADES][TEST ] [KRELTSC: 233524772] Test passed +[Hera] [HADES][TEST ] Testing VOCABULARY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 233587392] Expected: Should create multiple vocabs +[Hera] [HADES][TEST ] [KRELTSC: 233643799] Running VOCABULARY.duplicate: VOCABULARY TESTVOC VOCABULARY T +[Hera] [HADES][ERROR] [KRELTSC: 233711585] VOCABULARY: duplicate 'TESTVOC' +[Hera] [HADES][TEST ] [KRELTSC: 233738211] Expected error occurred +[Hera] [HADES][TEST ] Testing VOCABULARY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 233790770] Expected: Should handle duplicate +[Hera] [HADES][TEST ] [KRELTSC: 233823424] Running VOCABULARY.empty_name: VOCABULARY +[Hera] [HADES][ERROR] [KRELTSC: 234000275] VOCABULARY: missing name +[Hera] [HADES][TEST ] [KRELTSC: 234029020] Expected error occurred +[Hera] [HADES][TEST ] Testing VOCABULARY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 234114973] Expected: Should handle empty name +[Hera] [HADES][TEST ] [KRELTSC: 234143945] VOCABULARY: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 234176024] ▶ Testing module: v3/src/test_runner/modules/vocabulary_words +[Hera] [HADES][TEST ] [KRELTSC: 234215891] Testing word: FORTH +[Hera] [HADES][TEST ] [KRELTSC: 234413326] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 234449036] Running FORTH.basic: FORTH DEFINITIONS +[Hera] [HADES][TEST ] [KRELTSC: 234594011] Test passed +[Hera] [HADES][TEST ] Testing FORTH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 234643529] Expected: Should select FORTH vocab +[Hera] [HADES][TEST ] [KRELTSC: 234684890] Running FORTH.persistence: FORTH : TEST1 42 ; TEST1 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 234922412] Test passed +[Hera] [HADES][TEST ] Testing FORTH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 234970578] Expected: Should find word in FORTH +[Hera] [HADES][TEST ] [KRELTSC: 235001983] Running FORTH.from_other: VOCABULARY OTHER-VOC OTHER-VOC FORT +[Hera] [HADES][TEST ] [KRELTSC: 235310276] Test passed +[Hera] [HADES][TEST ] Testing FORTH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 235374967] Expected: Should return to FORTH +[Hera] [HADES][TEST ] [KRELTSC: 235403975] FORTH: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 235435386] ▶ Testing module: v3/src/test_runner/modules/vocabulary_words +[Hera] [HADES][TEST ] [KRELTSC: 235472589] Testing word: DEFINITIONS +[Hera] [HADES][TEST ] [KRELTSC: 235499221] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 235530817] Running DEFINITIONS.basic: FORTH DEFINITIONS +[Hera] [HADES][TEST ] [KRELTSC: 235840073] Test passed +[Hera] [HADES][TEST ] Testing DEFINITIONS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 235899042] Expected: Should set current vocabulary +[Hera] [HADES][TEST ] [KRELTSC: 235930292] Running DEFINITIONS.new_vocab: VOCABULARY TEST-VOC6 TEST-VOC6 +[Hera] [HADES][TEST ] [KRELTSC: 236157116] Test passed +[Hera] [HADES][TEST ] Testing DEFINITIONS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 236223221] Expected: Should set new current +[Hera] [HADES][TEST ] [KRELTSC: 236253056] Running DEFINITIONS.word_creation: VOCABULARY TEST-VOC7 TEST- +[Hera] [HADES][TEST ] [KRELTSC: 236578039] Test passed +[Hera] [HADES][TEST ] Testing DEFINITIONS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 236631218] Expected: Should create in correct vocab +[Hera] [HADES][TEST ] [KRELTSC: 236666188] DEFINITIONS: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 236702965] ▶ Testing module: v3/src/test_runner/modules/vocabulary_words +[Hera] [HADES][TEST ] [KRELTSC: 236739235] Testing word: CONTEXT +[Hera] [HADES][TEST ] [KRELTSC: 236764541] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 236790846] Running CONTEXT.basic: CONTEXT @ . CR +[Hera] 1252908560 +[Hera] [HADES][TEST ] [KRELTSC: 236843624] Test passed +[Hera] [HADES][TEST ] Testing CONTEXT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 237072651] Expected: Should show current context +[Hera] [HADES][TEST ] [KRELTSC: 237104280] Running CONTEXT.modify: CONTEXT @ 1+ CONTEXT ! +[Hera] [HADES][TEST ] [KRELTSC: 237177863] Test passed +[Hera] [HADES][TEST ] Testing CONTEXT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 237224566] Expected: Should allow modification (impl-defined effect) +[Hera] [HADES][TEST ] [KRELTSC: 237261797] Running CONTEXT.initial: FORTH CONTEXT @ . CR +[Hera] 1252653728 +[Hera] [HADES][TEST ] [KRELTSC: 237628933] Test passed +[Hera] [HADES][TEST ] Testing CONTEXT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 237675910] Expected: Should show FORTH vocab +[Hera] [HADES][TEST ] [KRELTSC: 237704893] CONTEXT: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 237914273] ▶ Testing module: v3/src/test_runner/modules/vocabulary_words +[Hera] [HADES][TEST ] [KRELTSC: 237986164] Testing word: CURRENT +[Hera] [HADES][TEST ] [KRELTSC: 238011845] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 238039589] Running CURRENT.basic: CURRENT @ . CR +[Hera] 1252908560 +[Hera] [HADES][TEST ] [KRELTSC: 238092086] Test passed +[Hera] [HADES][TEST ] Testing CURRENT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 238140842] Expected: Should show current vocab +[Hera] [HADES][TEST ] [KRELTSC: 238355990] Running CURRENT.after_def: VOCABULARY TEST-VOC8 TEST-VOC8 DEF +[Hera] 1252905264 +[Hera] [HADES][TEST ] [KRELTSC: 238551697] Test passed +[Hera] [HADES][TEST ] Testing CURRENT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 238597445] Expected: Should show new vocab +[Hera] [HADES][TEST ] [KRELTSC: 238775267] Running CURRENT.protect: CURRENT @ 1+ CURRENT ! +[Hera] [HADES][INFO ] [KRELTSC: 239639444] L8[TABLE]: Config 3 → 4 regime=7 score=26214 L1=0 L2=0 L3=0 L +[Hera] [HADES][TEST ] [KRELTSC: 239683932] Test passed +[Hera] [HADES][TEST ] Testing CURRENT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 239737229] Expected: Should allow modification (impl-defined effect) +[Hera] [HADES][TEST ] [KRELTSC: 239778667] CURRENT: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 239812090] ▶ Testing module: v3/src/test_runner/modules/vocabulary_words +[Hera] [HADES][TEST ] [KRELTSC: 239852726] Testing word: ORDER +[Hera] [HADES][TEST ] [KRELTSC: 239877570] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 239900658] Running ORDER.basic: ORDER +[Hera] Search order: +[Hera] + + +[Hera] Current: + + +[Hera] [HADES][TEST ] [KRELTSC: 240185856] Test passed +[Hera] [HADES][TEST ] Testing ORDER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 240233523] Expected: Should list search order +[Hera] [HADES][TEST ] [KRELTSC: 240266812] Running ORDER.multiple: VOCABULARY TEST-VOC9 TEST-VOC9 DEFINI +[Hera] Search order: +[Hera] + + +[Hera] Current: + + +[Hera] [HADES][TEST ] [KRELTSC: 240666547] Test passed +[Hera] [HADES][TEST ] Testing ORDER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 240729510] Expected: Should show all vocabs +[Hera] [HADES][TEST ] [KRELTSC: 240897730] Running ORDER.after_forth: TEST-VOC9 FORTH ORDER +[Hera] Search order: + + +[Hera] Current: + + +[Hera] [HADES][TEST ] [KRELTSC: 241054735] Test passed +[Hera] [HADES][TEST ] Testing ORDER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 241095136] Expected: Should show FORTH only +[Hera] [HADES][TEST ] [KRELTSC: 241125168] ORDER: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 241166774] === Vocabulary Words Summary: 0 passed, 0 failed, 0 skipped, 0 +[Hera] [HADES][INFO ] [KRELTSC: 241203112] +[Hera] === Testing Module: System Words === +[Hera] [HADES][INFO ] [KRELTSC: 241395051] Running System Words Tests (Module 18)... +[Hera] [HADES][WARN ] [KRELTSC: 241448398] Some system tests marked as unimplemented due to system-level e +[Hera] [HADES][TEST ] [KRELTSC: 241491977] ▶ Testing module: v3/src/test_runner/modules/system_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 241532357] Testing word: QUIT +[Hera] [HADES][TEST ] [KRELTSC: 241558286] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 241585163] Running QUIT.in_definition: : BAD-WORD QUIT ; +[Hera] [HADES][TEST ] [KRELTSC: 241642559] Expected error occurred +[Hera] [HADES][TEST ] Testing QUIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 241827687] Expected: Should prevent compilation +[Hera] [HADES][TEST ] [KRELTSC: 241859146] QUIT: 1 passed, 0 failed, 1 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 241897311] ▶ Testing module: v3/src/test_runner/modules/system_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 241938849] Testing word: ABORT +[Hera] [HADES][TEST ] [KRELTSC: 241963934] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 241991532] Running ABORT.basic: ABORT +[Hera] [HADES][TEST ] [KRELTSC: 242031774] Test passed +[Hera] [HADES][TEST ] Testing ABORT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 242190052] Expected: Should clear stacks and return to QUIT +[Hera] [HADES][TEST ] [KRELTSC: 242237350] Running ABORT.with_data: 1 2 3 ABORT DEPTH . CR +[Hera] [HADES][TEST ] [KRELTSC: 242274813] Test passed +[Hera] [HADES][TEST ] Testing ABORT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 242324986] Expected: Should clear stack +[Hera] [HADES][TEST ] [KRELTSC: 242355783] Running ABORT.in_definition_runtime: : BAD-WORD ABORT ; 123 +[Hera] [HADES][TEST ] [KRELTSC: 242418289] Test passed +[Hera] [HADES][TEST ] Testing ABORT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 242465781] Expected: ABORT may appear in a definition; when executed i +[Hera] [HADES][TEST ] [KRELTSC: 242505411] ABORT: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 242689779] ▶ Testing module: v3/src/test_runner/modules/system_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 242729578] Testing word: ABORT" +[Hera] [HADES][TEST ] [KRELTSC: 242756898] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 242786345] Running ABORT".condition_true: -1 ABORT" Error" + +[Hera] [HADES][TEST ] [KRELTSC: 242849516] Test passed +[Hera] [HADES][TEST ] Testing ABORT" ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 242899478] Expected: Should abort with message (no error; stacks clear +[Hera] [HADES][TEST ] [KRELTSC: 242937877] Running ABORT".condition_false: 0 ABORT" Error" +[Hera] [HADES][TEST ] [KRELTSC: 243109482] Test passed +[Hera] [HADES][TEST ] Testing ABORT" ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 243158007] Expected: Should not abort +[Hera] [HADES][TEST ] [KRELTSC: 243186449] Running ABORT".empty_stack: ABORT" +[Hera] [HADES][TEST ] [KRELTSC: 243217765] Expected error occurred +[Hera] [HADES][TEST ] Testing ABORT" ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 243273514] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 243309155] ABORT": 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 243344411] ▶ Testing module: v3/src/test_runner/modules/system_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 243524750] Testing word: BYE +[Hera] [HADES][TEST ] [KRELTSC: 243551046] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 243578489] BYE: 0 passed, 0 failed, 1 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 243610021] ▶ Testing module: v3/src/test_runner/modules/system_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 243648369] Testing word: COLD +[Hera] [HADES][TEST ] [KRELTSC: 243672837] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 243699769] COLD: 0 passed, 0 failed, 1 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 243731952] ▶ Testing module: v3/src/test_runner/modules/system_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 243768963] Testing word: WARM +[Hera] [HADES][TEST ] [KRELTSC: 243794301] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 243976650] WARM: 0 passed, 0 failed, 1 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 244032387] === System Words Summary: 0 passed, 0 failed, 0 skipped, 0 erro +[Hera] [HADES][INFO ] [KRELTSC: 244088952] +[Hera] === Testing Module: Defining Words === +[Hera] [HADES][INFO ] [KRELTSC: 244128999] Running Defining Words Tests (Module 13)... +[Hera] [HADES][TEST ] [KRELTSC: 244164048] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 244203254] Testing word: : +[Hera] [HADES][TEST ] [KRELTSC: 244228373] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 244388576] Running :.basic: : TEST1 42 ; TEST1 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 244451226] Test passed +[Hera] [HADES][TEST ] Testing : ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 244496445] Expected: Should define and execute +[Hera] [HADES][TEST ] [KRELTSC: 244527707] Running :.empty_name: : +[Hera] [HADES][TEST ] [KRELTSC: 244557208] Expected error occurred +[Hera] [HADES][TEST ] Testing : ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 244605866] Expected: Should handle empty definition +[Hera] [HADES][TEST ] [KRELTSC: 244638335] Running :.nested: : TEST3 : ; +[Hera] [HADES][ERROR] [KRELTSC: 244803594] Nested ':' inside a definition is not allowed +[Hera] [HADES][TEST ] [KRELTSC: 244851474] Expected error occurred +[Hera] [HADES][TEST ] Testing : ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 244902603] Expected: Should prevent nested definition +[Hera] [HADES][TEST ] [KRELTSC: 244936052] :: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 244969495] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 245006081] Testing word: ; +[Hera] [HADES][TEST ] [KRELTSC: 245029612] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 245056852] Running ;.alone: ; +[Hera] [HADES][TEST ] [KRELTSC: 245090368] Expected error occurred +[Hera] [HADES][TEST ] Testing ; ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 245256324] Expected: Should error outside definition +[Hera] [HADES][TEST ] [KRELTSC: 245300277] Running ;.immediate: : TEST4 42 ; IMMEDIATE TEST4 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 245368338] Test passed +[Hera] [HADES][TEST ] Testing ; ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 245415935] Expected: Should handle immediate +[Hera] [HADES][TEST ] [KRELTSC: 245447664] ;: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 245480268] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 245521292] Testing word: CONSTANT +[Hera] [HADES][TEST ] [KRELTSC: 245547706] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 245705826] Running CONSTANT.basic: 42 CONSTANT MEANING MEANING . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 245784420] Test passed +[Hera] [HADES][TEST ] Testing CONSTANT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 245832893] Expected: Should create constant +[Hera] [HADES][TEST ] [KRELTSC: 245863179] Running CONSTANT.zero: 0 CONSTANT ZERO ZERO . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 245921265] Test passed +[Hera] [HADES][TEST ] Testing CONSTANT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 245970620] Expected: Should handle zero +[Hera] [HADES][TEST ] [KRELTSC: 246125171] Running CONSTANT.negative: -1 CONSTANT MINUS MINUS . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 246186407] Test passed +[Hera] [HADES][TEST ] Testing CONSTANT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 246232884] Expected: Should handle negative +[Hera] [HADES][TEST ] [KRELTSC: 246261497] Running CONSTANT.empty_stack: CONSTANT +[Hera] [HADES][TEST ] [KRELTSC: 246300111] Expected error occurred +[Hera] [HADES][TEST ] Testing CONSTANT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 246352611] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 246385845] CONSTANT: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 246419632] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 246583025] Testing word: VARIABLE +[Hera] [HADES][TEST ] [KRELTSC: 246607895] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 246634731] Running VARIABLE.basic: VARIABLE VAR1 42 VAR1 ! VAR1 @ . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 246709799] Test passed +[Hera] [HADES][TEST ] Testing VARIABLE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 246757139] Expected: Should create variable +[Hera] [HADES][TEST ] [KRELTSC: 246786880] Running VARIABLE.multiple: VARIABLE VAR2 VARIABLE VAR3 +[Hera] [HADES][TEST ] [KRELTSC: 246838549] Test passed +[Hera] [HADES][TEST ] Testing VARIABLE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 247026834] Expected: Should create multiple +[Hera] [HADES][TEST ] [KRELTSC: 247055880] Running VARIABLE.store_fetch: VARIABLE VAR4 -99 VAR4 ! VAR4 @ +[Hera] -99 +[Hera] [HADES][TEST ] [KRELTSC: 247131682] Test passed +[Hera] [HADES][TEST ] Testing VARIABLE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 247180450] Expected: Should store/fetch +[Hera] [HADES][TEST ] [KRELTSC: 247208886] VARIABLE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 247242241] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 247279385] Testing word: CREATE +[Hera] [HADES][TEST ] [KRELTSC: 247436564] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 247464705] Running CREATE.basic: CREATE OBJ1 +[Hera] [HADES][TEST ] [KRELTSC: 247513130] Test passed +[Hera] [HADES][TEST ] Testing CREATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 247560908] Expected: Should create word +[Hera] [HADES][TEST ] [KRELTSC: 247590052] Running CREATE.with_data: CREATE OBJ2 42 , OBJ2 @ . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 247643046] Test passed +[Hera] [HADES][TEST ] Testing CREATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 247690425] Expected: Should allow data +[Hera] [HADES][TEST ] [KRELTSC: 247717999] Running CREATE.empty_name: CREATE +[Hera] [HADES][TEST ] [KRELTSC: 247874470] Expected error occurred +[Hera] [HADES][TEST ] Testing CREATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 247927637] Expected: Should handle empty name +[Hera] [HADES][TEST ] [KRELTSC: 247960305] CREATE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 247995392] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 248035684] Testing word: DOES> +[Hera] [HADES][TEST ] [KRELTSC: 248061482] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 248090107] Running DOES>.basic: : CONST CREATE , DOES> @ ; 42 CONST MEAN +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 248362064] Test passed +[Hera] [HADES][TEST ] Testing DOES> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 248449877] Expected: Should define behavior +[Hera] [HADES][TEST ] [KRELTSC: 248480450] Running DOES>.multiple: : ARRAY CREATE DOES> SWAP CELLS + ; C +[Hera] [HADES][TEST ] [KRELTSC: 248544338] Test passed +[Hera] [HADES][TEST ] Testing DOES> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 248765723] Expected: Should work with arrays +[Hera] [HADES][TEST ] [KRELTSC: 248807191] Running DOES>.outside: DOES> +[Hera] [HADES][ERROR] [KRELTSC: 248840945] DOES>: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 248867867] Expected error occurred +[Hera] [HADES][TEST ] Testing DOES> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 248920688] Expected: Should error outside definition +[Hera] [HADES][TEST ] [KRELTSC: 248954506] DOES>: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 248988033] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 249160464] Testing word: [ +[Hera] [HADES][TEST ] [KRELTSC: 249184447] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 249211995] Running [.basic: : TEST5 [ 42 ] LITERAL ; TEST5 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 249287082] Test passed +[Hera] [HADES][TEST ] Testing [ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 249332786] Expected: Should enter interpret +[Hera] [HADES][TEST ] [KRELTSC: 249361552] Running [.outside: [ +[Hera] [HADES][TEST ] [KRELTSC: 249388251] Test passed +[Hera] [HADES][TEST ] Testing [ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 249434641] Expected: Should be allowed outside definition (no error) +[Hera] [HADES][TEST ] [KRELTSC: 249605620] [: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 249650502] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 249687844] Testing word: ] +[Hera] [HADES][TEST ] [KRELTSC: 249713126] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 249740886] Running ].basic: [ 42 ] . CR +[Hera] [HADES][TEST ] [KRELTSC: 249777064] Test passed +[Hera] [HADES][TEST ] Testing ] ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 249821797] Expected: Should resume compile +[Hera] [HADES][TEST ] [KRELTSC: 249854408] Running ].nested: : TEST6 [ ] 42 ; TEST6 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 250047021] Test passed +[Hera] [HADES][TEST ] Testing ] ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 250140735] Expected: Should handle nesting +[Hera] [HADES][TEST ] [KRELTSC: 250170180] ]: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 250203310] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 250240118] Testing word: DEFER +[Hera] [HADES][TEST ] [KRELTSC: 250266029] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 250293252] Running DEFER.basic: DEFER DF1 : DF1W 42 . CR ; ' DF1W IS DF1 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 250612548] Test passed +[Hera] [HADES][TEST ] Testing DEFER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 250669519] Expected: Should print: 42 +[Hera] [HADES][TEST ] [KRELTSC: 250698303] Running DEFER.uninit: DEFER DF2 DF2 +[Hera] [HADES][ERROR] [KRELTSC: 250746463] DEFER runtime: no target set for 'DF2' +[Hera] [HADES][TEST ] [KRELTSC: 250925065] Expected error occurred +[Hera] [HADES][TEST ] Testing DEFER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 251013584] Expected: Should error: uninitialized deferred word +[Hera] [HADES][TEST ] [KRELTSC: 251048546] DEFER: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 251082933] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 251116448] Testing word: IS +[Hera] [HADES][TEST ] [KRELTSC: 251142894] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 251169565] Running IS.basic: DEFER IS1 : IS1W 99 . CR ; ' IS1W IS IS1 IS +[Hera] 99 +[Hera] [HADES][TEST ] [KRELTSC: 251381834] Test passed +[Hera] [HADES][TEST ] Testing IS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 251428350] Expected: Should print: 99 +[Hera] [HADES][TEST ] [KRELTSC: 251457851] Running IS.not_defer: 42 IS DUP +[Hera] [HADES][ERROR] [KRELTSC: 251490049] IS: 'DUP' was not created by DEFER +[Hera] [HADES][TEST ] [KRELTSC: 251520185] Expected error occurred +[Hera] [HADES][TEST ] Testing IS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 251564524] Expected: Should error: DUP is not a DEFER word +[Hera] [HADES][TEST ] [KRELTSC: 251597634] Running IS.not_found: 42 IS NOSUCH +[Hera] [HADES][ERROR] [KRELTSC: 251628213] IS: word 'NOSUCH' not found +[Hera] [HADES][TEST ] [KRELTSC: 251820392] Expected error occurred +[Hera] [HADES][TEST ] Testing IS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 251905236] Expected: Should error: word not found +[Hera] [HADES][TEST ] [KRELTSC: 251936548] IS: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 251965248] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 252003320] Testing word: DEFER@ +[Hera] [HADES][TEST ] [KRELTSC: 252029717] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 252057414] Running DEFER@.basic: DEFER DFA1 : DFA1W 7 . CR ; ' DFA1W IS +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 252278679] Test passed +[Hera] [HADES][TEST ] Testing DEFER@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 252326044] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 252354039] Running DEFER@.not_found: DEFER@ NOSUCH2 +[Hera] [HADES][ERROR] [KRELTSC: 252386499] DEFER@: word 'NOSUCH2' not found +[Hera] [HADES][TEST ] [KRELTSC: 252415538] Expected error occurred +[Hera] [HADES][TEST ] Testing DEFER@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 252464266] Expected: Should error: word not found +[Hera] [HADES][TEST ] [KRELTSC: 252495011] DEFER@: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 252690793] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 252761636] Testing word: ['] +[Hera] [HADES][TEST ] [KRELTSC: 252786525] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 252813099] Running ['].compile_xt: : BKT1 ['] DUP ; 77 BKT1 EXECUTE . . +[Hera] 77 77 +[Hera] [HADES][TEST ] [KRELTSC: 252907097] Test passed +[Hera] [HADES][TEST ] Testing ['] ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 253069450] Expected: Should print: 77 77 +[Hera] [HADES][TEST ] [KRELTSC: 253112091] Running ['].pin_like: : BKT2 ['] DROP ; 1 2 BKT2 EXECUTE . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 253206361] Test passed +[Hera] [HADES][TEST ] Testing ['] ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 253251119] Expected: Should print: 1 +[Hera] [HADES][TEST ] [KRELTSC: 253283128] Running ['].not_found: : BKT3 ['] NOSUCHWORD ; +[Hera] [HADES][ERROR] [KRELTSC: 253327576] [']': word 'NOSUCHWORD' not found +[Hera] [HADES][TEST ] [KRELTSC: 253356538] Expected error occurred +[Hera] [HADES][TEST ] Testing ['] ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 253573557] Expected: Should error: word not found +[Hera] [HADES][TEST ] [KRELTSC: 253639972] [']: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 253672988] === Defining Words Summary: 0 passed, 0 failed, 0 skipped, 0 er +[Hera] [HADES][INFO ] [KRELTSC: 253710636] +[Hera] === Testing Module: Control Words === +[Hera] [HADES][INFO ] [KRELTSC: 253748442] Running Control Words Tests (Module 12)... +[Hera] [HADES][TEST ] [KRELTSC: 253781664] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 253818282] Testing word: IF +[Hera] [HADES][TEST ] [KRELTSC: 254005353] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 254060296] Running IF.true: : TEST1 IF 42 ELSE 24 THEN ; -1 TEST1 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 254184087] Test passed +[Hera] [HADES][TEST ] Testing IF ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 254229061] Expected: Should take true branch +[Hera] [HADES][TEST ] [KRELTSC: 254259285] Running IF.false: : TEST2 IF 42 ELSE 24 THEN ; 0 TEST2 . CR +[Hera] 24 +[Hera] [HADES][TEST ] [KRELTSC: 254517633] Test passed +[Hera] [HADES][TEST ] Testing IF ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 254564644] Expected: Should take false branch +[Hera] [HADES][TEST ] [KRELTSC: 254595312] Running IF.nested: : TEST3 IF IF 1 ELSE 2 THEN ELSE 3 THEN ; +[Hera] [HADES][INFO ] [KRELTSC: 254656617] L8[TABLE]: Config 4 → 5 regime=7 score=26214 L1=0 L2=0 L3=0 L +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 254858132] Test passed +[Hera] [HADES][TEST ] Testing IF ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 254957300] Expected: Should handle nesting +[Hera] [HADES][TEST ] [KRELTSC: 254986560] Running IF.no_else: : TEST4 IF 42 THEN ; -1 TEST4 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 255043887] Test passed +[Hera] [HADES][TEST ] Testing IF ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 255088820] Expected: Should work without ELSE +[Hera] [HADES][TEST ] [KRELTSC: 255261830] Running IF.empty_stack: IF +[Hera] [HADES][ERROR] [KRELTSC: 255327336] IF: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 255381756] Expected error occurred +[Hera] [HADES][TEST ] Testing IF ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 255435586] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 255465434] IF: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 255496325] Testing word: IF +[Hera] [HADES][TEST ] [KRELTSC: 255519397] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 255678415] Running IF.true: : TEST1 IF 42 ELSE 24 THEN ; -1 TEST1 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 255791414] Test passed +[Hera] [HADES][TEST ] Testing IF ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 255837421] Expected: Should take true branch +[Hera] [HADES][TEST ] [KRELTSC: 255865630] Running IF.false: : TEST2 IF 42 ELSE 24 THEN ; 0 TEST2 . CR +[Hera] 24 +[Hera] [HADES][TEST ] [KRELTSC: 255919665] Test passed +[Hera] [HADES][TEST ] Testing IF ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 255964914] Expected: Should take false branch +[Hera] [HADES][TEST ] [KRELTSC: 256155629] Running IF.nested: : TEST3 IF IF 1 ELSE 2 THEN ELSE 3 THEN ; +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 256287115] Test passed +[Hera] [HADES][TEST ] Testing IF ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 256328526] Expected: Should handle nesting +[Hera] [HADES][TEST ] [KRELTSC: 256357427] Running IF.no_else: : TEST4 IF 42 THEN ; -1 TEST4 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 256411488] Test passed +[Hera] [HADES][TEST ] Testing IF ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 256645325] Expected: Should work without ELSE +[Hera] [HADES][TEST ] [KRELTSC: 256710546] Running IF.empty_stack: IF +[Hera] [HADES][ERROR] [KRELTSC: 256740440] IF: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 256763189] Expected error occurred +[Hera] [HADES][TEST ] Testing IF ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 256809107] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 256838888] IF: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 257048244] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 257126133] Testing word: ELSE +[Hera] [HADES][TEST ] [KRELTSC: 257163983] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 257187009] Running ELSE.alone: ELSE +[Hera] [HADES][ERROR] [KRELTSC: 257223954] ELSE: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 257247938] Expected error occurred +[Hera] [HADES][TEST ] Testing ELSE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 257297461] Expected: Should error outside IF +[Hera] [HADES][TEST ] [KRELTSC: 257505894] Running ELSE.double: : BAD IF 1 ELSE ELSE 2 THEN ; +[Hera] [HADES][ERROR] [KRELTSC: 257606380] ELSE: missing IF +[Hera] [HADES][TEST ] [KRELTSC: 257630432] Expected error occurred +[Hera] [HADES][TEST ] Testing ELSE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 257678892] Expected: Should prevent double ELSE +[Hera] [HADES][TEST ] [KRELTSC: 257708770] ELSE: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 257916065] Testing word: ELSE +[Hera] [HADES][TEST ] [KRELTSC: 257966053] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 257992223] Running ELSE.alone: ELSE +[Hera] [HADES][ERROR] [KRELTSC: 258026641] ELSE: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 258048546] Expected error occurred +[Hera] [HADES][TEST ] Testing ELSE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 258096018] Expected: Should error outside IF +[Hera] [HADES][TEST ] [KRELTSC: 258124571] Running ELSE.double: : BAD IF 1 ELSE ELSE 2 THEN ; +[Hera] [HADES][ERROR] [KRELTSC: 258354922] ELSE: missing IF +[Hera] [HADES][TEST ] [KRELTSC: 258404799] Expected error occurred +[Hera] [HADES][TEST ] Testing ELSE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 258453410] Expected: Should prevent double ELSE +[Hera] [HADES][TEST ] [KRELTSC: 258480240] ELSE: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 258511861] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 258547768] Testing word: THEN +[Hera] [HADES][TEST ] [KRELTSC: 258572101] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 258806235] Running THEN.alone: THEN +[Hera] [HADES][ERROR] [KRELTSC: 258878170] THEN: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 258916048] Expected error occurred +[Hera] [HADES][TEST ] Testing THEN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 258964642] Expected: Should error outside IF +[Hera] [HADES][TEST ] [KRELTSC: 258993609] Running THEN.extra: : BAD IF 1 THEN THEN ; +[Hera] [HADES][ERROR] [KRELTSC: 259252293] CF: underflow +[Hera] [HADES][ERROR] [KRELTSC: 259306256] THEN: unmatched +[Hera] [HADES][TEST ] [KRELTSC: 259349852] Expected error occurred +[Hera] [HADES][TEST ] Testing THEN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 259399009] Expected: Should prevent extra THEN +[Hera] [HADES][TEST ] [KRELTSC: 259429200] THEN: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 259643693] Testing word: THEN +[Hera] [HADES][TEST ] [KRELTSC: 259710334] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 259770077] Running THEN.alone: THEN +[Hera] [HADES][ERROR] [KRELTSC: 259806939] THEN: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 259831811] Expected error occurred +[Hera] [HADES][TEST ] Testing THEN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 259879730] Expected: Should error outside IF +[Hera] [HADES][TEST ] [KRELTSC: 260107705] Running THEN.extra: : BAD IF 1 THEN THEN ; +[Hera] [HADES][ERROR] [KRELTSC: 260211548] CF: underflow +[Hera] [HADES][ERROR] [KRELTSC: 260238931] THEN: unmatched +[Hera] [HADES][TEST ] [KRELTSC: 260263484] Expected error occurred +[Hera] [HADES][TEST ] Testing THEN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 260310887] Expected: Should prevent extra THEN +[Hera] [HADES][TEST ] [KRELTSC: 260340976] THEN: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 260590108] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 260660624] Testing word: BEGIN +[Hera] [HADES][TEST ] [KRELTSC: 260685116] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 260711628] Running BEGIN.until: : TEST5 0 BEGIN 1+ DUP 5 = UNTIL ; TEST5 +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 260998022] Test passed +[Hera] [HADES][TEST ] Testing BEGIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 261061967] Expected: Should loop until true +[Hera] [HADES][TEST ] [KRELTSC: 261091574] Running BEGIN.while: : TEST6 0 BEGIN DUP 5 < WHILE 1+ REPEAT +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 261168791] Test passed +[Hera] [HADES][TEST ] Testing BEGIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 261433720] Expected: Should loop while true +[Hera] [HADES][TEST ] [KRELTSC: 261484841] Running BEGIN.alone: BEGIN +[Hera] [HADES][ERROR] [KRELTSC: 261517991] BEGIN: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 261543336] Expected error occurred +[Hera] [HADES][TEST ] Testing BEGIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 261592880] Expected: Should error outside definition +[Hera] [HADES][TEST ] [KRELTSC: 261817036] BEGIN: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 261890061] Testing word: BEGIN +[Hera] [HADES][TEST ] [KRELTSC: 261925178] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 261950315] Running BEGIN.until: : TEST5 0 BEGIN 1+ DUP 5 = UNTIL ; TEST5 +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 262023013] Test passed +[Hera] [HADES][TEST ] Testing BEGIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 262279616] Expected: Should loop until true +[Hera] [HADES][TEST ] [KRELTSC: 262348055] Running BEGIN.while: : TEST6 0 BEGIN DUP 5 < WHILE 1+ REPEAT +[Hera] [HADES][INFO ] [KRELTSC: 262423088] L8[TABLE]: Config 5 → 6 regime=7 score=26214 L1=0 L2=0 L3=0 L +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 262474259] Test passed +[Hera] [HADES][TEST ] Testing BEGIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 262749830] Expected: Should loop while true +[Hera] [HADES][TEST ] [KRELTSC: 262797508] Running BEGIN.alone: BEGIN +[Hera] [HADES][ERROR] [KRELTSC: 262826085] BEGIN: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 262851265] Expected error occurred +[Hera] [HADES][TEST ] Testing BEGIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 262900297] Expected: Should error outside definition +[Hera] [HADES][TEST ] [KRELTSC: 263144660] BEGIN: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 263218220] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 263257278] Testing word: UNTIL +[Hera] [HADES][TEST ] [KRELTSC: 263282481] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 263310505] Running UNTIL.basic: : TEST8 BEGIN DUP 1- DUP 0= UNTIL ; 5 TE +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 263536785] Test passed +[Hera] [HADES][TEST ] Testing UNTIL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 263617542] Expected: Should count down +[Hera] [HADES][TEST ] [KRELTSC: 263645695] Running UNTIL.immediate: : TEST9 BEGIN 1 UNTIL ; IMMEDIATE +[Hera] [HADES][TEST ] [KRELTSC: 263698481] Test passed +[Hera] [HADES][TEST ] Testing UNTIL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 263742085] Expected: Should be immediate +[Hera] [HADES][TEST ] [KRELTSC: 263771757] Running UNTIL.no_begin: UNTIL +[Hera] [HADES][ERROR] [KRELTSC: 263803344] UNTIL: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 263975464] Expected error occurred +[Hera] [HADES][TEST ] Testing UNTIL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 264092460] Expected: Should error without BEGIN +[Hera] [HADES][TEST ] [KRELTSC: 264126655] UNTIL: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 264159163] Testing word: UNTIL +[Hera] [HADES][TEST ] [KRELTSC: 264183640] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 264215665] Running UNTIL.basic: : TEST8 BEGIN DUP 1- DUP 0= UNTIL ; 5 TE +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 264532420] Test passed +[Hera] [HADES][TEST ] Testing UNTIL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 264587179] Expected: Should count down +[Hera] [HADES][TEST ] [KRELTSC: 264616089] Running UNTIL.immediate: : TEST9 BEGIN 1 UNTIL ; IMMEDIATE +[Hera] [HADES][TEST ] [KRELTSC: 264819488] Test passed +[Hera] [HADES][TEST ] Testing UNTIL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 264914994] Expected: Should be immediate +[Hera] [HADES][TEST ] [KRELTSC: 264942977] Running UNTIL.no_begin: UNTIL +[Hera] [HADES][ERROR] [KRELTSC: 264973862] UNTIL: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 264997145] Expected error occurred +[Hera] [HADES][TEST ] Testing UNTIL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 265046195] Expected: Should error without BEGIN +[Hera] [HADES][TEST ] [KRELTSC: 265076451] UNTIL: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 265319407] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 265357448] Testing word: WHILE +[Hera] [HADES][TEST ] [KRELTSC: 265383771] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 265412592] Running WHILE.basic: : TEST10 BEGIN DUP 5 < WHILE 1+ REPEAT ; +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 265493794] Test passed +[Hera] [HADES][TEST ] Testing WHILE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 265676746] Expected: Should count up +[Hera] [HADES][TEST ] [KRELTSC: 265710081] Running WHILE.zero_times: : TEST11 BEGIN DUP 0< WHILE 1+ REPE +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 265781850] Test passed +[Hera] [HADES][TEST ] Testing WHILE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 265828801] Expected: Should handle zero iterations +[Hera] [HADES][TEST ] [KRELTSC: 265860269] Running WHILE.no_begin: WHILE +[Hera] [HADES][ERROR] [KRELTSC: 265892385] WHILE: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 265917401] Expected error occurred +[Hera] [HADES][TEST ] Testing WHILE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 265966805] Expected: Should error without BEGIN +[Hera] [HADES][TEST ] [KRELTSC: 266195224] WHILE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 266223142] Testing word: WHILE +[Hera] [HADES][TEST ] [KRELTSC: 266248246] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 266275552] Running WHILE.basic: : TEST10 BEGIN DUP 5 < WHILE 1+ REPEAT ; +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 266355056] Test passed +[Hera] [HADES][TEST ] Testing WHILE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 266402571] Expected: Should count up +[Hera] [HADES][TEST ] [KRELTSC: 266590916] Running WHILE.zero_times: : TEST11 BEGIN DUP 0< WHILE 1+ REPE +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 266660032] Test passed +[Hera] [HADES][TEST ] Testing WHILE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 266707441] Expected: Should handle zero iterations +[Hera] [HADES][TEST ] [KRELTSC: 266738746] Running WHILE.no_begin: WHILE +[Hera] [HADES][ERROR] [KRELTSC: 266767549] WHILE: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 266792513] Expected error occurred +[Hera] [HADES][TEST ] Testing WHILE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 266844313] Expected: Should error without BEGIN +[Hera] [HADES][TEST ] [KRELTSC: 267008913] WHILE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 267052909] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 267088109] Testing word: REPEAT +[Hera] [HADES][TEST ] [KRELTSC: 267112944] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 267139952] Running REPEAT.basic: : TEST12 BEGIN DUP 5 < WHILE 1+ REPEAT +[Hera] [HADES][INFO ] [KRELTSC: 267208064] L8[TABLE]: Config 6 → 7 regime=7 score=26214 L1=0 L2=0 L3=0 L +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 267265210] Test passed +[Hera] [HADES][TEST ] Testing REPEAT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 267513132] Expected: Should terminate loop +[Hera] [HADES][TEST ] [KRELTSC: 267542930] Running REPEAT.no_while: REPEAT +[Hera] [HADES][ERROR] [KRELTSC: 267613849] REPEAT: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 267641000] Expected error occurred +[Hera] [HADES][TEST ] Testing REPEAT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 267693023] Expected: Should error without WHILE +[Hera] [HADES][TEST ] [KRELTSC: 267843060] REPEAT: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 267886103] Testing word: REPEAT +[Hera] [HADES][TEST ] [KRELTSC: 267909892] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 267959291] Running REPEAT.basic: : TEST12 BEGIN DUP 5 < WHILE 1+ REPEAT +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 268052992] Test passed +[Hera] [HADES][TEST ] Testing REPEAT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 268099168] Expected: Should terminate loop +[Hera] [HADES][TEST ] [KRELTSC: 268128941] Running REPEAT.no_while: REPEAT +[Hera] [HADES][ERROR] [KRELTSC: 268360576] REPEAT: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 268383864] Expected error occurred +[Hera] [HADES][TEST ] Testing REPEAT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 268431782] Expected: Should error without WHILE +[Hera] [HADES][TEST ] [KRELTSC: 268463084] REPEAT: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 268495961] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 268532616] Testing word: DO +[Hera] [HADES][TEST ] [KRELTSC: 268556063] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 268762888] Running DO.basic: : TEST13 5 0 DO I . LOOP ; TEST13 CR +[Hera] 0 1 2 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 268875769] Test passed +[Hera] [HADES][TEST ] Testing DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 268924490] Expected: Should count 0 to 4 +[Hera] [HADES][TEST ] [KRELTSC: 268955672] Running DO.negative: : TEST14 -1 -5 DO I . LOOP ; TEST14 CR +[Hera] -5 -4 -3 -2 +[Hera] [HADES][TEST ] [KRELTSC: 269160319] Test passed +[Hera] [HADES][TEST ] Testing DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 269242293] Expected: Should handle negative +[Hera] [HADES][TEST ] [KRELTSC: 269271462] Running DO.empty: : TEST15 0 0 DO LOOP ; +[Hera] [HADES][TEST ] [KRELTSC: 269317010] Test passed +[Hera] [HADES][TEST ] Testing DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 269359436] Expected: Should handle empty range +[Hera] [HADES][TEST ] [KRELTSC: 269389337] Running DO.nested: : TEST16 3 0 DO 3 0 DO J I + . LOOP LOOP ; +[Hera] 0 1 2 1 2 3 2 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 269640361] Test passed +[Hera] [HADES][TEST ] Testing DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 269686791] Expected: Should handle nesting +[Hera] [HADES][TEST ] [KRELTSC: 269717381] DO: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 269749738] Testing word: DO +[Hera] [HADES][TEST ] [KRELTSC: 269776056] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 269802992] Running DO.basic: : TEST13 5 0 DO I . LOOP ; TEST13 CR +[Hera] 0 1 2 3 [HADES][INFO ] [KRELTSC: 269886990] L8[TABLE]: Config 7 → 8 regime=7 score=6553 L1=0 L2=0 L3=0 L4 +[Hera] 4 +[Hera] [HADES][TEST ] [KRELTSC: 270131197] Test passed +[Hera] [HADES][TEST ] Testing DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 270181470] Expected: Should count 0 to 4 +[Hera] [HADES][TEST ] [KRELTSC: 270242527] Running DO.negative: : TEST14 -1 -5 DO I . LOOP ; TEST14 CR +[Hera] -5 -4 -3 -2 +[Hera] [HADES][TEST ] [KRELTSC: 270310219] Test passed +[Hera] [HADES][TEST ] Testing DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 270535986] Expected: Should handle negative +[Hera] [HADES][TEST ] [KRELTSC: 270588016] Running DO.empty: : TEST15 0 0 DO LOOP ; +[Hera] [HADES][TEST ] [KRELTSC: 270658166] Test passed +[Hera] [HADES][TEST ] Testing DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 270703937] Expected: Should handle empty range +[Hera] [HADES][TEST ] [KRELTSC: 270733632] Running DO.nested: : TEST16 3 0 DO 3 0 DO J I + . LOOP LOOP ; +[Hera] 0 1 2 1 2 3 2 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 270981196] Test passed +[Hera] [HADES][TEST ] Testing DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 271032378] Expected: Should handle nesting +[Hera] [HADES][TEST ] [KRELTSC: 271062616] DO: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 271095515] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 271132797] Testing word: ?DO +[Hera] [HADES][TEST ] [KRELTSC: 271158591] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 271307213] Running ?DO.basic: : TEST17 5 0 ?DO I . LOOP ; TEST17 CR +[Hera] 0 1 2 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 271416625] Test passed +[Hera] [HADES][TEST ] Testing ?DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 271461868] Expected: Should count 0 to 4 +[Hera] [HADES][TEST ] [KRELTSC: 271492923] Running ?DO.skip: : TEST18 1 1 ?DO I . LOOP ; +[Hera] [HADES][TEST ] [KRELTSC: 271541013] Test passed +[Hera] [HADES][TEST ] Testing ?DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 271586302] Expected: Should skip when equal +[Hera] [HADES][TEST ] [KRELTSC: 271613288] Running ?DO.nested: : TEST19 3 0 ?DO 3 I ?DO J I + . LOOP LOO +[Hera] 0 1 2 2 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 271911581] Test passed +[Hera] [HADES][TEST ] Testing ?DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 271967060] Expected: Should handle nesting +[Hera] [HADES][TEST ] [KRELTSC: 271996871] ?DO: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 272031683] Testing word: ?DO +[Hera] [HADES][TEST ] [KRELTSC: 272057367] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 272292327] Running ?DO.basic: : TEST17 5 0 ?DO I . LOOP ; TEST17 CR +[Hera] 0 1 2 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 272407314] Test passed +[Hera] [HADES][TEST ] Testing ?DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 272452878] Expected: Should count 0 to 4 +[Hera] [HADES][TEST ] [KRELTSC: 272480457] Running ?DO.skip: : TEST18 1 1 ?DO I . LOOP ; +[Hera] [HADES][TEST ] [KRELTSC: 272691501] Test passed +[Hera] [HADES][TEST ] Testing ?DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 272766339] Expected: Should skip when equal +[Hera] [HADES][TEST ] [KRELTSC: 272796307] Running ?DO.nested: : TEST19 3 0 ?DO 3 I ?DO J I + . LOOP LOO +[Hera] [HADES][INFO ] [KRELTSC: 272858614] L8[TABLE]: Config 8 → 9 regime=7 score=6553 L1=0 L2=0 L3=0 L4 +[Hera] 0 1 2 2 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 272923328] Test passed +[Hera] [HADES][TEST ] Testing ?DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 273110780] Expected: Should handle nesting +[Hera] [HADES][TEST ] [KRELTSC: 273169322] ?DO: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 273209707] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 273248460] Testing word: LOOP +[Hera] [HADES][TEST ] [KRELTSC: 273273658] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 273300843] Running LOOP.basic: : TEST20 5 0 DO I . LOOP ; TEST20 CR +[Hera] 0 1 2 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 273516955] Test passed +[Hera] [HADES][TEST ] Testing LOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 273562357] Expected: Should increment by 1 +[Hera] [HADES][TEST ] [KRELTSC: 273591550] Running LOOP.no_do: LOOP +[Hera] [HADES][ERROR] [KRELTSC: 273620854] LOOP: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 273645712] Expected error occurred +[Hera] [HADES][TEST ] Testing LOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 273693744] Expected: Should error without DO +[Hera] [HADES][TEST ] [KRELTSC: 273723303] LOOP: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 273754643] Testing word: LOOP +[Hera] [HADES][TEST ] [KRELTSC: 273778600] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 273967286] Running LOOP.basic: : TEST20 5 0 DO I . LOOP ; TEST20 CR +[Hera] 0 1 2 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 274075060] Test passed +[Hera] [HADES][TEST ] Testing LOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 274122032] Expected: Should increment by 1 +[Hera] [HADES][TEST ] [KRELTSC: 274152282] Running LOOP.no_do: LOOP +[Hera] [HADES][ERROR] [KRELTSC: 274179053] LOOP: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 274203767] Expected error occurred +[Hera] [HADES][TEST ] Testing LOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 274393673] Expected: Should error without DO +[Hera] [HADES][TEST ] [KRELTSC: 274422041] LOOP: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 274455995] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 274495027] Testing word: +LOOP +[Hera] [HADES][TEST ] [KRELTSC: 274521485] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 274548874] Running +LOOP.basic: : TEST21 10 0 DO I . 2 +LOOP ; TEST21 CR +[Hera] 0 2 4 6 8 +[Hera] [HADES][TEST ] [KRELTSC: 274653172] Test passed +[Hera] [HADES][TEST ] Testing +LOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 274827130] Expected: Should count by 2 +[Hera] [HADES][TEST ] [KRELTSC: 274855343] Running +LOOP.negative: : TEST22 0 10 DO I . -1 +LOOP ; TEST2 +[Hera] 10 9 8 7 6 5 4 3 2 1 0 +[Hera] [HADES][TEST ] [KRELTSC: 274945336] Test passed +[Hera] [HADES][TEST ] Testing +LOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 274996039] Expected: Should count down +[Hera] [HADES][TEST ] [KRELTSC: 275025712] Running +LOOP.variable: : TEST23 10 0 DO I . DUP +LOOP ; 3 TE +[Hera] 0 3 6 9 +[Hera] [HADES][TEST ] [KRELTSC: 275236564] Test passed +[Hera] [HADES][TEST ] Testing +LOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 275281931] Expected: Should use stack value +[Hera] [HADES][TEST ] [KRELTSC: 275310814] +LOOP: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 275344193] Testing word: +LOOP +[Hera] [HADES][TEST ] [KRELTSC: 275372073] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 275400646] Running +LOOP.basic: : TEST21 10 0 DO I . 2 +LOOP ; TEST21 CR +[Hera] [HADES][INFO ] [KRELTSC: 275469750] L8[TABLE]: Config 9 → 10 regime=7 score=6553 L1=0 L2=0 L3=0 L +[Hera] 0 2 4 6 8 +[Hera] [HADES][TEST ] [KRELTSC: 275658777] Test passed +[Hera] [HADES][TEST ] Testing +LOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 275721083] Expected: Should count by 2 +[Hera] [HADES][TEST ] [KRELTSC: 275749314] Running +LOOP.negative: : TEST22 0 10 DO I . -1 +LOOP ; TEST2 +[Hera] 10 9 8 7 6 5 4 3 2 1 0 +[Hera] [HADES][TEST ] [KRELTSC: 275834175] Test passed +[Hera] [HADES][TEST ] Testing +LOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 275881591] Expected: Should count down +[Hera] [HADES][TEST ] [KRELTSC: 275910919] Running +LOOP.variable: : TEST23 10 0 DO I . DUP +LOOP ; 3 TE +[Hera] 0 3 6 9 +[Hera] [HADES][TEST ] [KRELTSC: 275979212] Test passed +[Hera] [HADES][TEST ] Testing +LOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 276187464] Expected: Should use stack value +[Hera] [HADES][TEST ] [KRELTSC: 276221379] +LOOP: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 276255109] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 276292551] Testing word: I +[Hera] [HADES][TEST ] [KRELTSC: 276316804] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 276344157] Running I.basic: : TI 4 0 DO I . LOOP CR ; TI +[Hera] 0 1 2 3 +[Hera] [HADES][TEST ] [KRELTSC: 276550115] Test passed +[Hera] [HADES][TEST ] Testing I ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 276593383] Expected: Should print: 0 1 2 3 +[Hera] [HADES][TEST ] [KRELTSC: 276620249] Running I.single: : TI1 1 0 DO I . LOOP CR ; TI1 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 276683404] Test passed +[Hera] [HADES][TEST ] Testing I ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 276780583] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 276826321] Running I.offset: : TI2 5 3 DO I . LOOP CR ; TI2 +[Hera] 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 277082184] Test passed +[Hera] [HADES][TEST ] Testing I ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 277119173] Expected: Should print: 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 277151156] Running I.in_expr: : TI3 3 0 DO I 2 * . LOOP CR ; TI3 +[Hera] 0 2 4 +[Hera] [HADES][TEST ] [KRELTSC: 277215977] Test passed +[Hera] [HADES][TEST ] Testing I ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 277264905] Expected: Should print: 0 2 4 +[Hera] [HADES][TEST ] [KRELTSC: 277428739] I: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 277463163] Testing word: I +[Hera] [HADES][TEST ] [KRELTSC: 277486741] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 277514355] Running I.basic: : TI 4 0 DO I . LOOP CR ; TI +[Hera] 0 1 2 3 +[Hera] [HADES][TEST ] [KRELTSC: 277597068] Test passed +[Hera] [HADES][TEST ] Testing I ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 277642579] Expected: Should print: 0 1 2 3 +[Hera] [HADES][TEST ] [KRELTSC: 277675068] Running I.single: : TI1 1 0 DO I . LOOP CR ; TI1 +[Hera] 0 +[Hera] [HADES][INFO ] [KRELTSC: 277884808] L8[TABLE]: Config 10 → 11 regime=7 score=6553 L1=0 L2=0 L3=0 +[Hera] [HADES][TEST ] [KRELTSC: 277956065] Test passed +[Hera] [HADES][TEST ] Testing I ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 278001988] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 278030040] Running I.offset: : TI2 5 3 DO I . LOOP CR ; TI2 +[Hera] 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 278093754] Test passed +[Hera] [HADES][TEST ] Testing I ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 278139717] Expected: Should print: 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 278311943] Running I.in_expr: : TI3 3 0 DO I 2 * . LOOP CR ; TI3 +[Hera] 0 2 4 +[Hera] [HADES][TEST ] [KRELTSC: 278421044] Test passed +[Hera] [HADES][TEST ] Testing I ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 278466113] Expected: Should print: 0 2 4 +[Hera] [HADES][TEST ] [KRELTSC: 278494082] I: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 278530824] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 278567368] Testing word: J +[Hera] [HADES][TEST ] [KRELTSC: 278593242] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 278775692] Running J.basic: : TJ 2 0 DO 3 0 DO J . LOOP LOOP CR ; TJ +[Hera] 0 0 0 1 1 1 +[Hera] [HADES][TEST ] [KRELTSC: 278853390] Test passed +[Hera] [HADES][TEST ] Testing J ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 278901998] Expected: Should print: 0 0 0 1 1 1 +[Hera] [HADES][TEST ] [KRELTSC: 278931625] Running J.paired: : TJ2 2 0 DO 2 0 DO J I + . LOOP LOOP CR ; +[Hera] 0 1 1 2 +[Hera] [HADES][TEST ] [KRELTSC: 278997237] Test passed +[Hera] [HADES][TEST ] Testing J ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 279187808] Expected: Should print: 0 1 1 2 +[Hera] [HADES][TEST ] [KRELTSC: 279256409] J: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 279296266] Testing word: J +[Hera] [HADES][TEST ] [KRELTSC: 279321122] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 279347815] Running J.basic: : TJ 2 0 DO 3 0 DO J . LOOP LOOP CR ; TJ +[Hera] 0 0 0 1 1 1 +[Hera] [HADES][TEST ] [KRELTSC: 279426536] Test passed +[Hera] [HADES][TEST ] Testing J ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 279471480] Expected: Should print: 0 0 0 1 1 1 +[Hera] [HADES][TEST ] [KRELTSC: 279698335] Running J.paired: : TJ2 2 0 DO 2 0 DO J I + . LOOP LOOP CR ; +[Hera] 0 1 1 2 +[Hera] [HADES][TEST ] [KRELTSC: 279810599] Test passed +[Hera] [HADES][TEST ] Testing J ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 279855583] Expected: Should print: 0 1 1 2 +[Hera] [HADES][TEST ] [KRELTSC: 280054068] J: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 280133891] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 280170978] Testing word: EXIT +[Hera] [HADES][TEST ] [KRELTSC: 280194882] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 280221331] Running EXIT.early_return: : TEX 5 EXIT 99 ; TEX . CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 280296439] Test passed +[Hera] [HADES][TEST ] Testing EXIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 280501855] Expected: Should print: 5 +[Hera] [HADES][TEST ] [KRELTSC: 280568592] Running EXIT.cond_exit_pos: : TEX2 DUP 0> IF EXIT THEN NEGATE +[Hera] [HADES][INFO ] [KRELTSC: 280641060] L8[TABLE]: Config 11 → 12 regime=7 score=6553 L1=0 L2=0 L3=0 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 280694236] Test passed +[Hera] [HADES][TEST ] Testing EXIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 280740003] Expected: Should print: 3 +[Hera] [HADES][TEST ] [KRELTSC: 280928835] Running EXIT.cond_exit_neg: : TEX2 DUP 0> IF EXIT THEN NEGATE +[Hera] 4 +[Hera] [HADES][TEST ] [KRELTSC: 281033259] Test passed +[Hera] [HADES][TEST ] Testing EXIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 281078561] Expected: Should print: 4 +[Hera] [HADES][TEST ] [KRELTSC: 281105258] Running EXIT.no_skipped: : TEX3 1 2 EXIT 3 ; TEX3 . . CR +[Hera] 2 1 +[Hera] [HADES][TEST ] [KRELTSC: 281160903] Test passed +[Hera] [HADES][TEST ] Testing EXIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 281368831] Expected: Should print: 2 1 +[Hera] [HADES][TEST ] [KRELTSC: 281422751] EXIT: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 281469142] Testing word: EXIT +[Hera] [HADES][TEST ] [KRELTSC: 281492740] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 281519388] Running EXIT.early_return: : TEX 5 EXIT 99 ; TEX . CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 281585290] Test passed +[Hera] [HADES][TEST ] Testing EXIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 281781631] Expected: Should print: 5 +[Hera] [HADES][TEST ] [KRELTSC: 281824314] Running EXIT.cond_exit_pos: : TEX2 DUP 0> IF EXIT THEN NEGATE +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 281930004] Test passed +[Hera] [HADES][TEST ] Testing EXIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 281975902] Expected: Should print: 3 +[Hera] [HADES][TEST ] [KRELTSC: 282003032] Running EXIT.cond_exit_neg: : TEX2 DUP 0> IF EXIT THEN NEGATE +[Hera] 4 +[Hera] [HADES][TEST ] [KRELTSC: 282063163] Test passed +[Hera] [HADES][TEST ] Testing EXIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 282298826] Expected: Should print: 4 +[Hera] [HADES][TEST ] [KRELTSC: 282342439] Running EXIT.no_skipped: : TEX3 1 2 EXIT 3 ; TEX3 . . CR +[Hera] 2 1 +[Hera] [HADES][TEST ] [KRELTSC: 282407908] Test passed +[Hera] [HADES][TEST ] Testing EXIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 282453106] Expected: Should print: 2 1 +[Hera] [HADES][TEST ] [KRELTSC: 282480350] EXIT: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 282511712] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 282711110] Testing word: LEAVE +[Hera] [HADES][TEST ] [KRELTSC: 282767454] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 282793689] Running LEAVE.basic: : TLV 0 5 0 DO I 3 = IF LEAVE THEN 1+ LO +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 282888306] Test passed +[Hera] [HADES][TEST ] Testing LEAVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 283089738] Expected: Should print: 3 +[Hera] [HADES][TEST ] [KRELTSC: 283161323] Running LEAVE.at_start: : TLV2 0 5 0 DO LEAVE 1+ LOOP ; TLV2 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 283258327] Test passed +[Hera] [HADES][TEST ] Testing LEAVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 283305129] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 283332763] Running LEAVE.qdloop: : TLV3 0 5 0 ?DO I 2 = IF LEAVE THEN 1+ +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 283566618] Test passed +[Hera] [HADES][TEST ] Testing LEAVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 283654814] Expected: Should print: 2 +[Hera] [HADES][TEST ] [KRELTSC: 283682508] LEAVE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 283714691] Testing word: LEAVE +[Hera] [HADES][TEST ] [KRELTSC: 283739140] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 283766359] Running LEAVE.basic: : TLV 0 5 0 DO I 3 = IF LEAVE THEN 1+ LO +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 284019020] Test passed +[Hera] [HADES][TEST ] Testing LEAVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 284068446] Expected: Should print: 3 +[Hera] [HADES][TEST ] [KRELTSC: 284097716] Running LEAVE.at_start: : TLV2 0 5 0 DO LEAVE 1+ LOOP ; TLV2 +[Hera] [HADES][INFO ] [KRELTSC: 284158444] L8[TABLE]: Config 12 → 13 regime=7 score=6553 L1=0 L2=0 L3=0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 284207441] Test passed +[Hera] [HADES][TEST ] Testing LEAVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 284404154] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 284472415] Running LEAVE.qdloop: : TLV3 0 5 0 ?DO I 2 = IF LEAVE THEN 1+ +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 284572292] Test passed +[Hera] [HADES][TEST ] Testing LEAVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 284617867] Expected: Should print: 2 +[Hera] [HADES][TEST ] [KRELTSC: 284644245] LEAVE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 284807120] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 284902282] Testing word: UNLOOP +[Hera] [HADES][TEST ] [KRELTSC: 284958973] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 284985310] Running UNLOOP.early_exit: : TUL 5 0 DO I 2 = IF UNLOOP 42 EX +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 285065891] Test passed +[Hera] [HADES][TEST ] Testing UNLOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 285263462] Expected: Should print: 42 +[Hera] [HADES][TEST ] [KRELTSC: 285329473] Running UNLOOP.full_loop: : TUL2 5 0 DO I 9 = IF UNLOOP 77 EX +[Hera] 99 +[Hera] [HADES][TEST ] [KRELTSC: 285411589] Test passed +[Hera] [HADES][TEST ] Testing UNLOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 285458107] Expected: Should print: 99 +[Hera] [HADES][TEST ] [KRELTSC: 285486347] UNLOOP: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 285517794] Testing word: UNLOOP +[Hera] [HADES][TEST ] [KRELTSC: 285542708] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 285726616] Running UNLOOP.early_exit: : TUL 5 0 DO I 2 = IF UNLOOP 42 EX +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 285851614] Test passed +[Hera] [HADES][TEST ] Testing UNLOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 285897773] Expected: Should print: 42 +[Hera] [HADES][TEST ] [KRELTSC: 285925054] Running UNLOOP.full_loop: : TUL2 5 0 DO I 9 = IF UNLOOP 77 EX +[Hera] 99 +[Hera] [HADES][TEST ] [KRELTSC: 286192907] Test passed +[Hera] [HADES][TEST ] Testing UNLOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 286247687] Expected: Should print: 99 +[Hera] [HADES][TEST ] [KRELTSC: 286276538] UNLOOP: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 286307747] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 286343655] Testing word: AGAIN +[Hera] [HADES][TEST ] [KRELTSC: 286367659] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 286392817] Running AGAIN.basic: : TAG 0 BEGIN 1+ DUP 3 = IF EXIT THEN AG +[Hera] 3 [HADES][INFO ] [KRELTSC: 286686202] L8[TABLE]: Config 13 → 14 regime=7 score=6553 L1=0 L2=0 L3=0 + +[Hera] [HADES][TEST ] [KRELTSC: 286719940] Test passed +[Hera] [HADES][TEST ] Testing AGAIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 286765210] Expected: Should print: 3 +[Hera] [HADES][TEST ] [KRELTSC: 286792963] Running AGAIN.countdown: : CD 10 BEGIN 1- DUP 0= IF EXIT THEN +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 287028711] Test passed +[Hera] [HADES][TEST ] Testing AGAIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 287105649] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 287133235] AGAIN: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 287165299] Testing word: AGAIN +[Hera] [HADES][TEST ] [KRELTSC: 287189734] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 287215745] Running AGAIN.basic: : TAG 0 BEGIN 1+ DUP 3 = IF EXIT THEN AG +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 287455851] Test passed +[Hera] [HADES][TEST ] Testing AGAIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 287537557] Expected: Should print: 3 +[Hera] [HADES][TEST ] [KRELTSC: 287564579] Running AGAIN.countdown: : CD 10 BEGIN 1- DUP 0= IF EXIT THEN +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 287638289] Test passed +[Hera] [HADES][TEST ] Testing AGAIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 287670749] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 287688740] AGAIN: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 287875938] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 287931386] Testing word: CASE +[Hera] [HADES][TEST ] [KRELTSC: 287970473] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 287996093] Running CASE.match_1: : TC CASE 1 OF 10 ENDOF 2 OF 20 ENDOF 9 +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 288110370] Test passed +[Hera] [HADES][TEST ] Testing CASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 288327385] Expected: Should print: 10 +[Hera] [HADES][TEST ] [KRELTSC: 288386121] Running CASE.match_2: : TC CASE 1 OF 10 ENDOF 2 OF 20 ENDOF 9 +[Hera] 20 +[Hera] [HADES][TEST ] [KRELTSC: 288470750] Test passed +[Hera] [HADES][TEST ] Testing CASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 288515394] Expected: Should print: 20 +[Hera] [HADES][TEST ] [KRELTSC: 288544281] Running CASE.default: : TC CASE 1 OF 10 ENDOF 2 OF 20 ENDOF 9 +[Hera] 99 +[Hera] [HADES][INFO ] [KRELTSC: 288839602] L8[TABLE]: Config 14 → 0 regime=6 score=26214 L1=0 L2=0 L3=0 +[Hera] [HADES][TEST ] [KRELTSC: 288879810] Test passed +[Hera] [HADES][TEST ] Testing CASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 288927835] Expected: Should print: 99 +[Hera] [HADES][TEST ] [KRELTSC: 288955536] Running CASE.zero_case: : TC CASE 0 OF 88 ENDOF 1 OF 77 ENDOF +[Hera] 88 +[Hera] [HADES][TEST ] [KRELTSC: 289199513] Test passed +[Hera] [HADES][TEST ] Testing CASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 289281327] Expected: Should print: 88 +[Hera] [HADES][TEST ] [KRELTSC: 289309108] Running CASE.neg_case: : TC CASE -1 OF 55 ENDOF 44 SWAP ENDCA +[Hera] 55 +[Hera] [HADES][TEST ] [KRELTSC: 289377092] Test passed +[Hera] [HADES][TEST ] Testing CASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 289423161] Expected: Should print: 55 +[Hera] [HADES][TEST ] [KRELTSC: 289618207] CASE: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 289650569] Testing word: CASE +[Hera] [HADES][TEST ] [KRELTSC: 289718500] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 289744839] Running CASE.match_1: : TC CASE 1 OF 10 ENDOF 2 OF 20 ENDOF 9 +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 289816609] Test passed +[Hera] [HADES][TEST ] Testing CASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 289863257] Expected: Should print: 10 +[Hera] [HADES][TEST ] [KRELTSC: 290062243] Running CASE.match_2: : TC CASE 1 OF 10 ENDOF 2 OF 20 ENDOF 9 +[Hera] 20 +[Hera] [HADES][TEST ] [KRELTSC: 290175967] Test passed +[Hera] [HADES][TEST ] Testing CASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 290221907] Expected: Should print: 20 +[Hera] [HADES][TEST ] [KRELTSC: 290249586] Running CASE.default: : TC CASE 1 OF 10 ENDOF 2 OF 20 ENDOF 9 +[Hera] 99 +[Hera] [HADES][TEST ] [KRELTSC: 290458070] Test passed +[Hera] [HADES][TEST ] Testing CASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 290504838] Expected: Should print: 99 +[Hera] [HADES][TEST ] [KRELTSC: 290532475] Running CASE.zero_case: : TC CASE 0 OF 88 ENDOF 1 OF 77 ENDOF +[Hera] 88 +[Hera] [HADES][TEST ] [KRELTSC: 290602067] Test passed +[Hera] [HADES][TEST ] Testing CASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 290647074] Expected: Should print: 88 +[Hera] [HADES][TEST ] [KRELTSC: 290673265] Running CASE.neg_case: : TC CASE -1 OF 55 ENDOF 44 SWAP ENDCA +[Hera] 55 +[Hera] [HADES][TEST ] [KRELTSC: 290735988] Test passed +[Hera] [HADES][TEST ] Testing CASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 290960030] Expected: Should print: 55 +[Hera] [HADES][TEST ] [KRELTSC: 291036436] CASE: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 291070110] === Control Words Summary: 0 passed, 0 failed, 0 skipped, 0 err +[Hera] [HADES][INFO ] [KRELTSC: 291109163] +[Hera] === Testing Module: StarForth Words === +[Hera] [HADES][INFO ] [KRELTSC: 291149643] Running StarForth Words Tests (Module 17: StarForth Extensions) +[Hera] [HADES][TEST ] [KRELTSC: 291319941] ▶ Testing module: v3/src/test_runner/modules/starforth_words_ +[Hera] [HADES][TEST ] [KRELTSC: 291423715] Testing word: ENTROPY@ +[Hera] [HADES][TEST ] [KRELTSC: 291481001] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 291507185] Running ENTROPY@.after_execution: : TESTWORD 1 1 + DROP ; TES +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 291579242] Test passed +[Hera] [HADES][TEST ] Testing ENTROPY@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 291627009] Expected: Should show execution count > 0 +[Hera] [HADES][TEST ] [KRELTSC: 291798877] Running ENTROPY@.zero_initial: : NEWWORD ; ' NEWWORD ENTROPY@ +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 291861966] Test passed +[Hera] [HADES][TEST ] Testing ENTROPY@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 291913451] Expected: Should show 0 for unused word +[Hera] [HADES][TEST ] [KRELTSC: 291945397] Running ENTROPY@.multiple_calls: : ENTTEST 1 DROP ; ENTTEST E +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 292007990] Test passed +[Hera] [HADES][TEST ] Testing ENTROPY@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 292200194] Expected: Should increment with each call +[Hera] [HADES][TEST ] [KRELTSC: 292232131] Running ENTROPY@.null_addr: 0 ENTROPY@ +[Hera] [HADES][ERROR] [KRELTSC: 292266572] ENTROPY@: null dictionary entry +[Hera] [HADES][TEST ] [KRELTSC: 292294965] Expected error occurred +[Hera] [HADES][TEST ] Testing ENTROPY@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 292344911] Expected: Should handle null address +[Hera] [HADES][TEST ] [KRELTSC: 292375408] Running ENTROPY@.empty_stack: ENTROPY@ +[Hera] [HADES][ERROR] [KRELTSC: 292409773] ENTROPY@: data stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 292437618] Expected error occurred +[Hera] [HADES][TEST ] Testing ENTROPY@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 292487577] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 292659315] ENTROPY@: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 292735079] ▶ Testing module: v3/src/test_runner/modules/starforth_words_ +[Hera] [HADES][TEST ] [KRELTSC: 292773542] Testing word: ENTROPY! +[Hera] [HADES][TEST ] [KRELTSC: 292799636] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 292826247] Running ENTROPY!.set_entropy: : ENTSET ; 42 ' ENTSET ENTROPY! +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 292898093] Test passed +[Hera] [HADES][TEST ] Testing ENTROPY! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 293083724] Expected: Should set entropy to 42 +[Hera] [HADES][TEST ] [KRELTSC: 293111761] Running ENTROPY!.overwrite: : ENTOV ; 10 ' ENTOV ENTROPY! 20 +[Hera] [HADES][INFO ] [KRELTSC: 293175390] L8[TABLE]: Config 0 → 14 regime=7 score=6553 L1=0 L2=0 L3=0 L +[Hera] 20 +[Hera] [HADES][TEST ] [KRELTSC: 293224800] Test passed +[Hera] [HADES][TEST ] Testing ENTROPY! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 293273068] Expected: Should overwrite previous value +[Hera] [HADES][TEST ] [KRELTSC: 293305737] Running ENTROPY!.zero_entropy: : ENTZERO ; 0 ' ENTZERO ENTROP +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 293505488] Test passed +[Hera] [HADES][TEST ] Testing ENTROPY! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 293555282] Expected: Should set entropy to 0 +[Hera] [HADES][TEST ] [KRELTSC: 293584620] Running ENTROPY!.null_addr: 42 0 ENTROPY! +[Hera] [HADES][ERROR] [KRELTSC: 293619803] ENTROPY!: null dictionary entry +[Hera] [HADES][TEST ] [KRELTSC: 293648852] Expected error occurred +[Hera] [HADES][TEST ] Testing ENTROPY! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 293700081] Expected: Should handle null address +[Hera] [HADES][TEST ] [KRELTSC: 293730449] Running ENTROPY!.one_arg: 42 ENTROPY! +[Hera] [HADES][ERROR] [KRELTSC: 293762965] ENTROPY!: data stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 293913425] Expected error occurred +[Hera] [HADES][TEST ] Testing ENTROPY! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 293977305] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 294045692] Running ENTROPY!.empty_stack: ENTROPY! +[Hera] [HADES][ERROR] [KRELTSC: 294077251] ENTROPY!: data stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 294103914] Expected error occurred +[Hera] [HADES][TEST ] Testing ENTROPY! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 294154604] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 294186280] ENTROPY!: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 294341133] ▶ Testing module: v3/src/test_runner/modules/starforth_words_ +[Hera] [HADES][TEST ] [KRELTSC: 294391033] Testing word: WORD-ENTROPY +[Hera] [HADES][TEST ] [KRELTSC: 294431904] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 294484993] Running WORD-ENTROPY.display_all: 1 DUP DUP DUP DROP DROP DRO +[Hera] Word Usage Statistics (Execution Heat Counts): + +[Hera] ============================================= + +[Hera] DEFER@: 2 + +[Hera] IS: 5 + +[Hera] DEFER: 4 + +[Hera] WORD-ENTROPY: 1 + +[Hera] ENTROPY!: 7 + +[Hera] ENTROPY@: 8 + +[Hera] ENDCASE: 10 + +[Hera] ENDOF: 18 + +[Hera] OF: 18 + +[Hera] CASE: 10 + +[Hera] EXIT: 119 + +[Hera] UNLOOP: 6 + +[Hera] J: 58 + +[Hera] I: 212 + +[Hera] LEAVE: 6 + +[Hera] +LOOP: 6 + +[Hera] LOOP: 48 + +[Hera] DO: 42 + +[Hera] ?DO: 10 + +[Hera] UNTIL: 8 + +[Hera] AGAIN: 4 + +[Hera] REPEAT: 10 + +[Hera] WHILE: 10 + +[Hera] BEGIN: 20 + +[Hera] THEN: 32 + +[Hera] ELSE: 14 + +[Hera] IF: 32 + +[Hera] (LEAVE): 6 + +[Hera] (+LOOP): 40 + +[Hera] (LOOP): 152 + +[Hera] (DO): 48 + +[Hera] (?DO): 12 + +[Hera] (0BRANCH): 142 + +[Hera] (BRANCH): 72 + +[Hera] DOES>: 3 + +[Hera] does_rt: 1 + +[Hera] LITERAL: 1 + +[Hera] LIT: 305 + +[Hera] FENCE: 3 + +[Hera] FORGET: 7 + +[Hera] ]: 3 + +[Hera] [: 4 + +[Hera] IMMEDIATE: 6 + +[Hera] CONSTANT: 4 + +[Hera] VARIABLE: 5 + +[Hera] CREATE: 23 + +[Hera] ;: 121 + +[Hera] :: 129 + +[Hera] ABORT": 3 + +[Hera] ABORT: 4 + +[Hera] QUIT: 1 + +[Hera] EXECUTE: 2 + +[Hera] ORDER: 3 + +[Hera] FORTH: 10 + +[Hera] CURRENT: 4 + +[Hera] CONTEXT: 5 + +[Hera] DEFINITIONS: 15 + +[Hera] VOCABULARY: 15 + +[Hera] ': 16 + +[Hera] FIND: 4 + +[Hera] >BODY: 2 + +[Hera] HIDDEN: 2 + +[Hera] SMUDGE: 2 + +[Hera] LATEST: 7 + +[Hera] SP@: 8 + +[Hera] SP!: 5 + +[Hera] PAD: 15 + +[Hera] 2,: 7 + +[Hera] C,: 10 + +[Hera] ,: 21 + +[Hera] ALLOT: 9 + +[Hera] ALIGN: 1 + +[Hera] HERE: 109 + +[Hera] SCR: 3 + +[Hera] THRU: 17 + +[Hera] LIST: 5 + +[Hera] LOAD: 5 + +[Hera] FLUSH: 3 + +[Hera] EMPTY-BUFFERS: 4 + +[Hera] SAVE-BUFFERS: 3 + +[Hera] UPDATE: 7 + +[Hera] BUFFER: 4 + +[Hera] BLOCK: 12 + +[Hera] SPACES: 10 + +[Hera] SPACE: 7 + +[Hera] TYPE: 43 + +[Hera] CR: 659 + +[Hera] EMIT: 15 + +[Hera] BLANK: 2 + +[Hera] SKIP: 4 + +[Hera] SCAN: 5 + +[Hera] SEARCH: 4 + +[Hera] COMPARE: 5 + +[Hera] CMOVE>: 4 + +[Hera] CMOVE: 6 + +[Hera] -TRAILING: 4 + +[Hera] LITERAL: 1 + +[Hera] [']: 3 + +[Hera] BL: 19 + +[Hera] SOURCE: 2 + +[Hera] >IN: 5 + +[Hera] S": 37 + +[Hera] (s"): 4 + +[Hera] WORD: 15 + +[Hera] SPAN: 4 + +[Hera] EXPECT: 4 + +[Hera] COUNT: 14 + +[Hera] OCTAL: 6 + +[Hera] HEX: 7 + +[Hera] DECIMAL: 14 + +[Hera] BASE: 9 + +[Hera] SIGN: 3 + +[Hera] HOLD: 2 + +[Hera] #>: 16 + +[Hera] #S: 11 + +[Hera] #: 5 + +[Hera] <#: 17 + +[Hera] .: 901 + +[Hera] D2/: 5 + +[Hera] D2*: 5 + +[Hera] D0<: 7 + +[Hera] D0=: 7 + +[Hera] 2R@: 3 + +[Hera] 2R>: 7 + +[Hera] 2>R: 7 + +[Hera] 2ROT: 6 + +[Hera] 2OVER: 6 + +[Hera] 2SWAP: 7 + +[Hera] 2DUP: 6 + +[Hera] 2DROP: 6 + +[Hera] D=: 7 + +[Hera] D<: 8 + +[Hera] DMIN: 6 + +[Hera] DMAX: 6 + +[Hera] DABS: 7 + +[Hera] DNEGATE: 6 + +[Hera] D-: 8 + +[Hera] D+: 7 + +[Hera] S>D: 7 + +[Hera] */MOD: 8 + +[Hera] */: 10 + +[Hera] M/MOD: 7 + +[Hera] M*: 8 + +[Hera] M+: 7 + +[Hera] FALSE: 18 + +[Hera] TRUE: 30 + +[Hera] WITHIN: 31 + +[Hera] U>: 25 + +[Hera] U<: 25 + +[Hera] <=: 31 + +[Hera] >=: 31 + +[Hera] >: 30 + +[Hera] <: 74 + +[Hera] <>: 26 + +[Hera] =: 176 + +[Hera] 0<>: 22 + +[Hera] 0>: 27 + +[Hera] 0<: 24 + +[Hera] 0=: 66 + +[Hera] NOT: 18 + +[Hera] XOR: 32 + +[Hera] OR: 22 + +[Hera] AND: 43 + +[Hera] MAX: 26 + +[Hera] MIN: 4 + +[Hera] NEGATE: 30 + +[Hera] ABS: 25 + +[Hera] 2/: 31 + +[Hera] 2*: 31 + +[Hera] 2-: 10 + +[Hera] 2+: 19 + +[Hera] 1-: 79 + +[Hera] 1+: 84 + +[Hera] */MOD: 8 + +[Hera] */: 10 + +[Hera] /MOD: 20 + +[Hera] MOD: 38 + +[Hera] /: 35 + +[Hera] *: 50 + +[Hera] -: 34 + +[Hera] +: 135 + +[Hera] CELLS: 18 + +[Hera] ERASE: 11 + +[Hera] MOVE: 11 + +[Hera] FILL: 23 + +[Hera] 2!: 17 + +[Hera] 2@: 14 + +[Hera] -!: 17 + +[Hera] +!: 35 + +[Hera] C!: 51 + +[Hera] C@: 97 + +[Hera] !: 111 + +[Hera] @: 182 + +[Hera] R@: 47 + +[Hera] R>: 64 + +[Hera] >R: 66 + +[Hera] ROLL: 10 + +[Hera] PICK: 16 + +[Hera] DEPTH: 79 + +[Hera] -ROT: 18 + +[Hera] ROT: 31 + +[Hera] OVER: 52 + +[Hera] SWAP: 41 + +[Hera] DUP: 144 + +[Hera] DROP: 51 + +[Hera] ------------------------------------- + +[Hera] Total executions: 6817 + +[Hera] Total words: 516 + +[Hera] Average executions per word: 13 + +[Hera] [HADES][TEST ] [KRELTSC: 298344253] Test passed +[Hera] [HADES][TEST ] Testing WORD-ENTROPY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 298395269] Expected: Should display all word entropy stats +[Hera] [HADES][TEST ] [KRELTSC: 298430294] Running WORD-ENTROPY.after_execution: : WDENT 1 2 + DROP ; WD +[Hera] Word Usage Statistics (Execution Heat Counts): + +[Hera] ============================================= + +[Hera] WDENT: 2 + +[Hera] DEFER@: 2 + +[Hera] IS: 5 + +[Hera] DEFER: 4 + +[Hera] WORD-ENTROPY: 2 + +[Hera] ENTROPY!: 7 + +[Hera] ENTROPY@: 8 + +[Hera] ENDCASE: 10 + +[Hera] ENDOF: 18 + +[Hera] OF: 18 + +[Hera] CASE: 10 + +[Hera] EXIT: 121 + +[Hera] UNLOOP: 6 + +[Hera] J: 58 + +[Hera] I: 212 + +[Hera] LEAVE: 6 + +[Hera] +LOOP: 6 + +[Hera] LOOP: 48 + +[Hera] DO: 42 + +[Hera] ?DO: 10 + +[Hera] UNTIL: 8 + +[Hera] AGAIN: 4 + +[Hera] REPEAT: 10 + +[Hera] WHILE: 10 + +[Hera] BEGIN: 20 + +[Hera] THEN: 32 + +[Hera] ELSE: 14 + +[Hera] IF: 32 + +[Hera] (LEAVE): 6 + +[Hera] (+LOOP): 40 + +[Hera] (LOOP): 152 + +[Hera] (DO): 48 + +[Hera] (?DO): 12 + +[Hera] (0BRANCH): 142 + +[Hera] (BRANCH): 72 + +[Hera] DOES>: 3 + +[Hera] does_rt: 1 + +[Hera] LITERAL: 1 + +[Hera] LIT: 309 + +[Hera] FENCE: 3 + +[Hera] FORGET: 7 + +[Hera] ]: 3 + +[Hera] [: 4 + +[Hera] IMMEDIATE: 6 + +[Hera] CONSTANT: 4 + +[Hera] VARIABLE: 5 + +[Hera] CREATE: 23 + +[Hera] ;: 122 + +[Hera] :: 130 + +[Hera] ABORT": 3 + +[Hera] ABORT: 4 + +[Hera] QUIT: 1 + +[Hera] EXECUTE: 2 + +[Hera] ORDER: 3 + +[Hera] FORTH: 10 + +[Hera] CURRENT: 4 + +[Hera] CONTEXT: 5 + +[Hera] DEFINITIONS: 15 + +[Hera] VOCABULARY: 15 + +[Hera] ': 16 + +[Hera] FIND: 4 + +[Hera] >BODY: 2 + +[Hera] HIDDEN: 2 + +[Hera] SMUDGE: 2 + +[Hera] LATEST: 7 + +[Hera] SP@: 8 + +[Hera] SP!: 5 + +[Hera] PAD: 15 + +[Hera] 2,: 7 + +[Hera] C,: 10 + +[Hera] ,: 21 + +[Hera] ALLOT: 9 + +[Hera] ALIGN: 1 + +[Hera] HERE: 109 + +[Hera] SCR: 3 + +[Hera] THRU: 17 + +[Hera] LIST: 5 + +[Hera] LOAD: 5 + +[Hera] FLUSH: 3 + +[Hera] EMPTY-BUFFERS: 4 + +[Hera] SAVE-BUFFERS: 3 + +[Hera] UPDATE: 7 + +[Hera] BUFFER: 4 + +[Hera] BLOCK: 12 + +[Hera] SPACES: 10 + +[Hera] SPACE: 7 + +[Hera] TYPE: 43 + +[Hera] CR: 659 + +[Hera] EMIT: 15 + +[Hera] BLANK: 2 + +[Hera] SKIP: 4 + +[Hera] SCAN: 5 + +[Hera] SEARCH: 4 + +[Hera] COMPARE: 5 + +[Hera] CMOVE>: 4 + +[Hera] CMOVE: 6 + +[Hera] -TRAILING: 4 + +[Hera] LITERAL: 1 + +[Hera] [']: 3 + +[Hera] BL: 19 + +[Hera] SOURCE: 2 + +[Hera] >IN: 5 + +[Hera] S": 37 + +[Hera] (s"): 4 + +[Hera] WORD: 15 + +[Hera] SPAN: 4 + +[Hera] EXPECT: 4 + +[Hera] COUNT: 14 + +[Hera] OCTAL: 6 + +[Hera] HEX: 7 + +[Hera] DECIMAL: 14 + +[Hera] BASE: 9 + +[Hera] SIGN: 3 + +[Hera] HOLD: 2 + +[Hera] #>: 16 + +[Hera] #S: 11 + +[Hera] #: 5 + +[Hera] <#: 17 + +[Hera] .: 901 + +[Hera] D2/: 5 + +[Hera] D2*: 5 + +[Hera] D0<: 7 + +[Hera] D0=: 7 + +[Hera] 2R@: 3 + +[Hera] 2R>: 7 + +[Hera] 2>R: 7 + +[Hera] 2ROT: 6 + +[Hera] 2OVER: 6 + +[Hera] 2SWAP: 7 + +[Hera] 2DUP: 6 + +[Hera] 2DROP: 6 + +[Hera] D=: 7 + +[Hera] D<: 8 + +[Hera] DMIN: 6 + +[Hera] DMAX: 6 + +[Hera] DABS: 7 + +[Hera] DNEGATE: 6 + +[Hera] D-: 8 + +[Hera] D+: 7 + +[Hera] S>D: 7 + +[Hera] */MOD: 8 + +[Hera] */: 10 + +[Hera] M/MOD: 7 + +[Hera] M*: 8 + +[Hera] M+: 7 + +[Hera] FALSE: 18 + +[Hera] TRUE: 30 + +[Hera] WITHIN: 31 + +[Hera] U>: 25 + +[Hera] U<: 25 + +[Hera] <=: 31 + +[Hera] >=: 31 + +[Hera] >: 30 + +[Hera] <: 74 + +[Hera] <>: 26 + +[Hera] =: 176 + +[Hera] 0<>: 22 + +[Hera] 0>: 27 + +[Hera] 0<: 24 + +[Hera] 0=: 66 + +[Hera] NOT: 18 + +[Hera] XOR: 32 + +[Hera] OR: 22 + +[Hera] AND: 43 + +[Hera] MAX: 26 + +[Hera] MIN: 4 + +[Hera] NEGATE: 30 + +[Hera] ABS: 25 + +[Hera] 2/: 31 + +[Hera] 2*: 31 + +[Hera] 2-: 10 + +[Hera] 2+: 19 + +[Hera] 1-: 79 + +[Hera] 1+: 84 + +[Hera] */MOD: 8 + +[Hera] */: 10 + +[Hera] /MOD: 20 + +[Hera] MOD: 38 + +[Hera] /: 35 + +[Hera] *: 50 + +[Hera] -: 34 + +[Hera] +: 138 + +[Hera] CELLS: 18 + +[Hera] ERASE: 11 + +[Hera] MOVE: 11 + +[Hera] FILL: 23 + +[Hera] 2!: 17 + +[Hera] 2@: 14 + +[Hera] -!: 17 + +[Hera] +!: 35 + +[Hera] C!: 51 + +[Hera] C@: 97 + +[Hera] !: 111 + +[Hera] @: 182 + +[Hera] R@: 47 + +[Hera] R>: 64 + +[Hera] >R: 66 + +[Hera] ROLL: 10 + +[Hera] PICK: 16 + +[Hera] DEPTH: 79 + +[Hera] -ROT: 18 + +[Hera] ROT: 31 + +[Hera] OVER: 52 + +[Hera] SWAP: 41 + +[Hera] DUP: 144 + +[Hera] DROP: 54 + +[Hera] ------------------------------------- + +[Hera] Total executions: 6834 + +[Hera] Total words: 517 + +[Hera] Average executions per word: 13 + +[Hera] [HADES][TEST ] [KRELTSC: 302012967] Test passed +[Hera] [HADES][TEST ] Testing WORD-ENTROPY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 302204957] Expected: Should show defined word entropy +[Hera] [HADES][TEST ] [KRELTSC: 302240054] Running WORD-ENTROPY.stack_preserved: DEPTH WORD-ENTROPY DEPT +[Hera] Word Usage Statistics (Execution Heat Counts): + +[Hera] ============================================= + +[Hera] WDENT: 2 + +[Hera] DEFER@: 2 + +[Hera] IS: 5 + +[Hera] DEFER: 4 + +[Hera] WORD-ENTROPY: 3 + +[Hera] ENTROPY!: 7 + +[Hera] ENTROPY@: 8 + +[Hera] ENDCASE: 10 + +[Hera] ENDOF: 18 + +[Hera] OF: 18 + +[Hera] CASE: 10 + +[Hera] EXIT: 121 + +[Hera] UNLOOP: 6 + +[Hera] J: 58 + +[Hera] I: 212 + +[Hera] LEAVE: 6 + +[Hera] +LOOP: 6 + +[Hera] LOOP: 48 + +[Hera] DO: 42 + +[Hera] ?DO: 10 + +[Hera] UNTIL: 8 + +[Hera] AGAIN: 4 + +[Hera] REPEAT: 10 + +[Hera] WHILE: 10 + +[Hera] BEGIN: 20 + +[Hera] THEN: 32 + +[Hera] ELSE: 14 + +[Hera] IF: 32 + +[Hera] (LEAVE): 6 + +[Hera] (+LOOP): 40 + +[Hera] (LOOP): 152 + +[Hera] (DO): 48 + +[Hera] (?DO): 12 + +[Hera] (0BRANCH): 142 + +[Hera] (BRANCH): 72 + +[Hera] DOES>: 3 + +[Hera] does_rt: 1 + +[Hera] LITERAL: 1 + +[Hera] LIT: 309 + +[Hera] FENCE: 3 + +[Hera] FORGET: 7 + +[Hera] ]: 3 + +[Hera] [: 4 + +[Hera] IMMEDIATE: 6 + +[Hera] CONSTANT: 4 + +[Hera] VARIABLE: 5 + +[Hera] CREATE: 23 + +[Hera] ;: 122 + +[Hera] :: 130 + +[Hera] ABORT": 3 + +[Hera] ABORT: 4 + +[Hera] QUIT: 1 + +[Hera] EXECUTE: 2 + +[Hera] ORDER: 3 + +[Hera] FORTH: 10 + +[Hera] CURRENT: 4 + +[Hera] CONTEXT: 5 + +[Hera] DEFINITIONS: 15 + +[Hera] VOCABULARY: 15 + +[Hera] ': 16 + +[Hera] FIND: 4 + +[Hera] >BODY: 2 + +[Hera] HIDDEN: 2 + +[Hera] SMUDGE: 2 + +[Hera] LATEST: 7 + +[Hera] SP@: 8 + +[Hera] SP!: 5 + +[Hera] PAD: 15 + +[Hera] 2,: 7 + +[Hera] C,: 10 + +[Hera] ,: 21 + +[Hera] ALLOT: 9 + +[Hera] ALIGN: 1 + +[Hera] HERE: 109 + +[Hera] SCR: 3 + +[Hera] THRU: 17 + +[Hera] LIST: 5 + +[Hera] LOAD: 5 + +[Hera] FLUSH: 3 + +[Hera] EMPTY-BUFFERS: 4 + +[Hera] SAVE-BUFFERS: 3 + +[Hera] UPDATE: 7 + +[Hera] BUFFER: 4 + +[Hera] BLOCK: 12 + +[Hera] SPACES: 10 + +[Hera] SPACE: 7 + +[Hera] TYPE: 43 + +[Hera] CR: 659 + +[Hera] EMIT: 15 + +[Hera] BLANK: 2 + +[Hera] SKIP: 4 + +[Hera] SCAN: 5 + +[Hera] SEARCH: 4 + +[Hera] COMPARE: 5 + +[Hera] CMOVE>: 4 + +[Hera] CMOVE: 6 + +[Hera] -TRAILING: 4 + +[Hera] LITERAL: 1 + +[Hera] [']: 3 + +[Hera] BL: 19 + +[Hera] SOURCE: 2 + +[Hera] >IN: 5 + +[Hera] S": 37 + +[Hera] (s"): 4 + +[Hera] WORD: 15 + +[Hera] SPAN: 4 + +[Hera] EXPECT: 4 + +[Hera] COUNT: 14 + +[Hera] OCTAL: 6 + +[Hera] HEX: 7 + +[Hera] DECIMAL: 14 + +[Hera] BASE: 9 + +[Hera] SIGN: 3 + +[Hera] HOLD: 2 + +[Hera] #>: 16 + +[Hera] #S: 11 + +[Hera] #: 5 + +[Hera] <#: 17 + +[Hera] .: 901 + +[Hera] D2/: 5 + +[Hera] D2*: 5 + +[Hera] D0<: 7 + +[Hera] D0=: 7 + +[Hera] 2R@: 3 + +[Hera] 2R>: 7 + +[Hera] 2>R: 7 + +[Hera] 2ROT: 6 + +[Hera] 2OVER: 6 + +[Hera] 2SWAP: 7 + +[Hera] 2DUP: 6 + +[Hera] 2DROP: 6 + +[Hera] D=: 7 + +[Hera] D<: 8 + +[Hera] DMIN: 6 + +[Hera] DMAX: 6 + +[Hera] DABS: 7 + +[Hera] DNEGATE: 6 + +[Hera] D-: 8 + +[Hera] D+: 7 + +[Hera] S>D: 7 + +[Hera] */MOD: 8 + +[Hera] */: 10 + +[Hera] M/MOD: 7 + +[Hera] M*: 8 + +[Hera] M+: 7 + +[Hera] FALSE: 18 + +[Hera] TRUE: 30 + +[Hera] WITHIN: 31 + +[Hera] U>: 25 + +[Hera] U<: 25 + +[Hera] <=: 31 + +[Hera] >=: 31 + +[Hera] >: 30 + +[Hera] <: 74 + +[Hera] <>: 26 + +[Hera] =: 176 + +[Hera] 0<>: 22 + +[Hera] 0>: 27 + +[Hera] 0<: 24 + +[Hera] 0=: 66 + +[Hera] NOT: 18 + +[Hera] XOR: 32 + +[Hera] OR: 22 + +[Hera] AND: 43 + +[Hera] MAX: 26 + +[Hera] MIN: 4 + +[Hera] NEGATE: 30 + +[Hera] ABS: 25 + +[Hera] 2/: 31 + +[Hera] 2*: 31 + +[Hera] 2-: 10 + +[Hera] 2+: 19 + +[Hera] 1-: 79 + +[Hera] 1+: 84 + +[Hera] */MOD: 8 + +[Hera] */: 10 + +[Hera] /MOD: 20 + +[Hera] MOD: 38 + +[Hera] /: 35 + +[Hera] *: 50 + +[Hera] -: 34 + +[Hera] +: 138 + +[Hera] CELLS: 18 + +[Hera] ERASE: 11 + +[Hera] MOVE: 11 + +[Hera] FILL: 23 + +[Hera] 2!: 17 + +[Hera] 2@: 14 + +[Hera] -!: 17 + +[Hera] +!: 35 + +[Hera] C!: 51 + +[Hera] C@: 97 + +[Hera] !: 111 + +[Hera] @: 182 + +[Hera] R@: 47 + +[Hera] R>: 64 + +[Hera] >R: 66 + +[Hera] ROLL: 10 + +[Hera] PICK: 16 + +[Hera] DEPTH: 80 + +[Hera] -ROT: 18 + +[Hera] ROT: 31 + +[Hera] OVER: 52 + +[Hera] SWAP: 41 + +[Hera] DUP: 144 + +[Hera] DROP: 54 + +[Hera] ------------------------------------- + +[Hera] Total executions: 6836 + +[Hera] Total words: 517 + +[Hera] Average executions per word: 13 + +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 305862619] Test passed +[Hera] [HADES][TEST ] Testing WORD-ENTROPY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 305915328] Expected: Should not affect stack +[Hera] [HADES][TEST ] [KRELTSC: 306071670] WORD-ENTROPY: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 306119728] ▶ Testing module: v3/src/test_runner/modules/starforth_words_ +[Hera] [HADES][TEST ] [KRELTSC: 306191028] Testing word: RESET-ENTROPY +[Hera] [HADES][TEST ] [KRELTSC: 306220203] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 306248910] Running RESET-ENTROPY.reset_defined: : RESETTEST 1 DROP ; RES +[Hera] [HADES][TEST ] [KRELTSC: 306322488] Test passed +[Hera] [HADES][TEST ] Testing RESET-ENTROPY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 306373345] Expected: Should reset all entropy counters +[Hera] [HADES][TEST ] [KRELTSC: 306539366] Running RESET-ENTROPY.double_reset: RESET-ENTROPY RESET-ENTRO +[Hera] [HADES][TEST ] [KRELTSC: 306588940] Test passed +[Hera] [HADES][TEST ] Testing RESET-ENTROPY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 306641791] Expected: Should handle multiple resets +[Hera] [HADES][TEST ] [KRELTSC: 306674091] Running RESET-ENTROPY.after_usage: 1 DUP DUP DUP DROP DROP DR +[Hera] [HADES][TEST ] [KRELTSC: 306719091] Test passed +[Hera] [HADES][TEST ] Testing RESET-ENTROPY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 306768732] Expected: Should reset after word usage +[Hera] [HADES][TEST ] [KRELTSC: 306800913] RESET-ENTROPY: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 306970892] ▶ Testing module: v3/src/test_runner/modules/starforth_words_ +[Hera] [HADES][TEST ] [KRELTSC: 307007787] Testing word: TOP-WORDS +[Hera] [HADES][TEST ] [KRELTSC: 307037424] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 307069465] Running TOP-WORDS.display_top5: : TOPTEST 1 DROP ; TOPTEST TO +[Hera] Top 5 most frequently used words: + +[Hera] ================================== + +[Hera] 1. DROP: 6 + +[Hera] 2. TOPTEST: 5 + +[Hera] 3. EXIT: 5 + +[Hera] 4. LIT: 5 + +[Hera] 5. TOP-WORDS: 1 + +[Hera] [HADES][TEST ] [KRELTSC: 307265272] Test passed +[Hera] [HADES][TEST ] Testing TOP-WORDS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 307448823] Expected: Should display top 5 hot words +[Hera] [HADES][TEST ] [KRELTSC: 307482034] Running TOP-WORDS.display_top10: 10 TOP-WORDS +[Hera] Top 10 most frequently used words: + +[Hera] ================================== + +[Hera] 1. DROP: 6 + +[Hera] 2. TOPTEST: 5 + +[Hera] 3. EXIT: 5 + +[Hera] 4. LIT: 5 + +[Hera] 5. TOP-WORDS: 2 + +[Hera] 6. ;: 1 + +[Hera] 7. :: 1 + +[Hera] [HADES][TEST ] [KRELTSC: 307635992] Test passed +[Hera] [HADES][TEST ] Testing TOP-WORDS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 307683572] Expected: Should display top 10 words +[Hera] [HADES][TEST ] [KRELTSC: 307850286] Running TOP-WORDS.after_reset: RESET-ENTROPY 5 TOP-WORDS +[Hera] Top 5 most frequently used words: + +[Hera] ================================== + +[Hera] 1. TOP-WORDS: 1 + +[Hera] [HADES][TEST ] [KRELTSC: 307942942] Test passed +[Hera] [HADES][TEST ] Testing TOP-WORDS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 307991652] Expected: Should handle display after reset +[Hera] [HADES][TEST ] [KRELTSC: 308026315] Running TOP-WORDS.single_word: 1 TOP-WORDS +[Hera] Top 1 most frequently used words: + +[Hera] ================================== + +[Hera] 1. TOP-WORDS: 2 + +[Hera] [HADES][TEST ] [KRELTSC: 308112594] Test passed +[Hera] [HADES][TEST ] Testing TOP-WORDS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 308295938] Expected: Should display top 1 word +[Hera] [HADES][TEST ] [KRELTSC: 308347971] Running TOP-WORDS.large_count: 100 TOP-WORDS +[Hera] Top 100 most frequently used words: + +[Hera] ================================== + +[Hera] 1. TOP-WORDS: 3 + +[Hera] [HADES][TEST ] [KRELTSC: 308449075] Test passed +[Hera] [HADES][TEST ] Testing TOP-WORDS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 308497061] Expected: Should handle large count +[Hera] [HADES][TEST ] [KRELTSC: 308530749] Running TOP-WORDS.zero_count: 0 TOP-WORDS +[Hera] TOP-WORDS: invalid count 0 + +[Hera] [HADES][TEST ] [KRELTSC: 308718802] Test passed +[Hera] [HADES][TEST ] Testing TOP-WORDS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 308769505] Expected: Should handle zero count +[Hera] [HADES][TEST ] [KRELTSC: 308804223] Running TOP-WORDS.negative_count: -5 TOP-WORDS +[Hera] TOP-WORDS: invalid count -5 + +[Hera] [HADES][TEST ] [KRELTSC: 308864915] Test passed +[Hera] [HADES][TEST ] Testing TOP-WORDS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 308915278] Expected: Should handle negative count +[Hera] [HADES][TEST ] [KRELTSC: 308949645] Running TOP-WORDS.empty_stack: TOP-WORDS +[Hera] [HADES][ERROR] [KRELTSC: 309110947] TOP-WORDS: data stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 309152107] Expected error occurred +[Hera] [HADES][TEST ] Testing TOP-WORDS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 309225904] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 309272000] TOP-WORDS: 8 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 309306171] ▶ Testing module: v3/src/test_runner/modules/starforth_words_ +[Hera] [HADES][TEST ] [KRELTSC: 309343545] Testing word: (- +[Hera] [HADES][TEST ] [KRELTSC: 309370890] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 309402095] Running (-.comment_line: (- This is a comment +[Hera] 1 2 + . CR +[Hera] [HADES][WARN ] [KRELTSC: 309603379] (- comment not terminated +[Hera] [HADES][TEST ] [KRELTSC: 309630464] Test passed +[Hera] [HADES][TEST ] Testing (- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 309673519] Expected: Should ignore rest of line +[Hera] [HADES][TEST ] [KRELTSC: 309704271] Running (-.mid_line: 1 (- comment here +[Hera] 2 + . CR +[Hera] [HADES][WARN ] [KRELTSC: 309746586] (- comment not terminated +[Hera] [HADES][TEST ] [KRELTSC: 309773174] Test passed +[Hera] [HADES][TEST ] Testing (- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 309818904] Expected: Should work mid-expression +[Hera] [HADES][TEST ] [KRELTSC: 309850641] Running (-.no_stack_effect: DEPTH (- comment +[Hera] DEPTH = . CR +[Hera] [HADES][WARN ] [KRELTSC: 310044882] (- comment not terminated +[Hera] [HADES][TEST ] [KRELTSC: 310080588] Test passed +[Hera] [HADES][TEST ] Testing (- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 310152847] Expected: Should not affect stack +[Hera] [HADES][TEST ] [KRELTSC: 310183179] Running (-.multiple: 1 (- first +[Hera] 2 (- second +[Hera] + . CR +[Hera] [HADES][WARN ] [KRELTSC: 310239539] (- comment not terminated +[Hera] [HADES][TEST ] [KRELTSC: 310275392] Test passed +[Hera] [HADES][TEST ] Testing (- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 310464231] Expected: Should handle multiple comments +[Hera] [HADES][TEST ] [KRELTSC: 310494335] (-: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 310569745] === StarForth Words Summary: 0 passed, 0 failed, 0 skipped, 0 e +[Hera] [HADES][INFO ] [KRELTSC: 310608480] +[Hera] === Testing Module: ACL Words === +[Hera] [HADES][INFO ] [KRELTSC: 310647963] Running ACL Words Tests (Module 24)... +[Hera] [HADES][WARN ] [KRELTSC: 310991630] ACL: denied '__acl_deny_test__' +[Hera] [HADES][INFO ] [KRELTSC: 311081084] SKIP: STRICT mode test (ACL.4th not loaded) +[Hera] [HADES][INFO ] [KRELTSC: 311132868] SKIP: ACL-TTL-COMPUTE (ACL.4th not loaded) +[Hera] [HADES][WARN ] [KRELTSC: 311329036] vm_create_word: cannot shadow pinned word '__acl_shadow_target_ +[Hera] [HADES][TEST ] [KRELTSC: 311484331] === ACL Words Summary: 29 passed, 0 failed, 0 skipped, 0 errors +[Hera] [HADES][INFO ] [KRELTSC: 311524518] +[Hera] === Testing Module: Mama FORTH Words === +[Hera] [HADES][INFO ] [KRELTSC: 311562862] Running Mama FORTH Words Tests (Capsule System M7.1)... +[Hera] [HADES][TEST ] [KRELTSC: 311775255] Testing word: CAPSULE-COUNT +[Hera] [HADES][TEST ] [KRELTSC: 311800496] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 311838804] CAPSULE-COUNT: 0 passed, 0 failed, 2 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 311902221] Testing word: CAPSULE@ +[Hera] [HADES][TEST ] [KRELTSC: 311927760] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 311955838] CAPSULE@: 0 passed, 0 failed, 3 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 311989687] Testing word: CAPSULE-FLAGS@ +[Hera] [HADES][TEST ] [KRELTSC: 312022650] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 312198632] CAPSULE-FLAGS@: 0 passed, 0 failed, 3 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 312231763] Testing word: CAPSULE-LEN@ +[Hera] [HADES][TEST ] [KRELTSC: 312258056] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 312286381] CAPSULE-LEN@: 0 passed, 0 failed, 2 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 312321426] Testing word: CAPSULE-HASH@ +[Hera] [HADES][TEST ] [KRELTSC: 312349583] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 312375698] CAPSULE-HASH@: 0 passed, 0 failed, 2 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 312410258] Testing word: MAMA-VM-ID +[Hera] [HADES][TEST ] [KRELTSC: 312436933] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 312591190] MAMA-VM-ID: 0 passed, 0 failed, 2 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 312650236] Testing word: VM-COUNT +[Hera] [HADES][TEST ] [KRELTSC: 312701282] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 312728075] VM-COUNT: 0 passed, 0 failed, 2 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 312761924] Testing word: CAPSULE-BIRTH +[Hera] [HADES][TEST ] [KRELTSC: 312789656] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 312816651] CAPSULE-BIRTH: 0 passed, 0 failed, 2 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 312850977] Testing word: CAPSULE-RUN +[Hera] [HADES][TEST ] [KRELTSC: 312877282] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 313031355] CAPSULE-RUN: 0 passed, 0 failed, 1 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 313077137] Testing word: CAPSULE-TEST +[Hera] [HADES][TEST ] [KRELTSC: 313104549] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 313130720] CAPSULE-TEST: 0 passed, 0 failed, 1 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 313174968] === Mama FORTH Words Summary: 0 passed, 0 failed, 0 skipped, 0 +[Hera] [HADES][INFO ] [KRELTSC: 313216401] +[Hera] === Testing Module: Q48.16 Words === +[Hera] [HADES][INFO ] [KRELTSC: 313258650] Running Q48.16 Words Tests (Module 25)... +[Hera] [HADES][TEST ] [KRELTSC: 313297186] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 313474950] Testing word: Q.+ +[Hera] [HADES][TEST ] [KRELTSC: 313511203] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 313537844] Running Q.+.basic: 1 Q.FROM-INT 2 Q.FROM-INT Q.+ Q.TO-INT . C +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 313602590] Test passed +[Hera] [HADES][TEST ] Testing Q.+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 313650976] Expected: Should print: 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 313763048] Q.+: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 313925366] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 313978462] Testing word: Q.- +[Hera] [HADES][TEST ] [KRELTSC: 314004715] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 314036946] Running Q.-.basic: 5 Q.FROM-INT 2 Q.FROM-INT Q.- Q.TO-INT . C +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 314104139] Test passed +[Hera] [HADES][TEST ] Testing Q.- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 314157270] Expected: Should print: 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][INFO ] [KRELTSC: 315263363] L8[TABLE]: Config 14 → 0 regime=3 score=26214 L1=0 L2=0 L3=0 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 315394841] Q.-: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 315426140] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 315462700] Testing word: Q.* +[Hera] [HADES][TEST ] [KRELTSC: 315486869] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 315637716] Running Q.*.basic: 3 Q.FROM-INT 4 Q.FROM-INT Q.* Q.TO-INT . C +[Hera] 12 +[Hera] [HADES][TEST ] [KRELTSC: 315716077] Test passed +[Hera] [HADES][TEST ] Testing Q.* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 315800572] Expected: Should print: 12 +[Hera] 12 +[Hera] 12 +[Hera] 12 +[Hera] 12 +[Hera] 12 +[Hera] [HADES][TEST ] [KRELTSC: 315916323] Q.*: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 316072589] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 316122555] Testing word: Q./ +[Hera] [HADES][TEST ] [KRELTSC: 316146965] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 316175035] Running Q./.basic: 10 Q.FROM-INT 2 Q.FROM-INT Q./ Q.TO-INT . +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 316234355] Test passed +[Hera] [HADES][TEST ] Testing Q./ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 316280534] Expected: Should print: 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 316519350] Running Q./.by_zero: 5 Q.FROM-INT 0 Q.FROM-INT Q./ Q.TO-INT . +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 316570139] Test passed +[Hera] [HADES][TEST ] Testing Q./ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 316622322] Expected: Should print: 0 (division by zero yields q=0) +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 316745253] Q./: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 316780287] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 316816582] Testing word: Q.ABS +[Hera] [HADES][TEST ] [KRELTSC: 316980457] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 317007307] Running Q.ABS.basic: 3 Q.FROM-INT Q.NEG Q.ABS Q.TO-INT . CR +[Hera] -3 +[Hera] [HADES][TEST ] [KRELTSC: 317068227] Test passed +[Hera] [HADES][TEST ] Testing Q.ABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 317114821] Expected: Should print: 3 +[Hera] -3 +[Hera] -3 +[Hera] -3 +[Hera] -3 +[Hera] -3 +[Hera] [HADES][TEST ] [KRELTSC: 317219452] Q.ABS: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 317379985] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 317431040] Testing word: Q.NEG +[Hera] [HADES][TEST ] [KRELTSC: 317459754] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 317491245] Running Q.NEG.basic: 5 Q.FROM-INT Q.NEG Q.TO-INT . CR +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 317547380] Test passed +[Hera] [HADES][TEST ] Testing Q.NEG ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 317602016] Expected: Should print: -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 317836653] Q.NEG: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 317868314] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 317905427] Testing word: Q.LOG +[Hera] [HADES][TEST ] [KRELTSC: 317930922] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 317963741] Running Q.LOG.of_one: Q.1 Q.LOG Q.TO-INT . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 318024661] Test passed +[Hera] [HADES][TEST ] Testing Q.LOG ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 318077404] Expected: Should print: 0 (ln 1.0 = 0) +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][INFO ] [KRELTSC: 318311309] L8[TABLE]: Config 0 → 1 regime=3 score=26214 L1=0 L2=0 L3=0 L +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 318380790] Q.LOG: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 318414439] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 318450925] Testing word: Q.EXP +[Hera] [HADES][TEST ] [KRELTSC: 318476624] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 318502587] Running Q.EXP.of_zero: Q.0 Q.EXP Q.TO-INT . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 318698589] Test passed +[Hera] [HADES][TEST ] Testing Q.EXP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 318745567] Expected: Should print: 1 (e^0 = 1) +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 318846886] Q.EXP: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 318879829] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 318917702] Testing word: Q.SQRT +[Hera] [HADES][TEST ] [KRELTSC: 318942998] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 318962486] Running Q.SQRT.of_four: 4 Q.FROM-INT Q.SQRT Q.TO-INT . CR +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 319172435] Test passed +[Hera] [HADES][TEST ] Testing Q.SQRT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 319278963] Expected: Should print: 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 319377619] Q.SQRT: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 319574426] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 319669350] Testing word: Q.SIN +[Hera] [HADES][TEST ] [KRELTSC: 319722952] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 319748541] Running Q.SIN.of_zero: Q.0 Q.SIN Q.TO-INT . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 319810613] Test passed +[Hera] [HADES][TEST ] Testing Q.SIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 319856306] Expected: Should print: 0 (sin 0 = 0) +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 320194879] Q.SIN: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 320226832] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 320263194] Testing word: Q.COS +[Hera] [HADES][TEST ] [KRELTSC: 320426411] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 320452364] Running Q.COS.of_zero: Q.0 Q.COS Q.TO-INT . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 320545692] Test passed +[Hera] [HADES][TEST ] Testing Q.COS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 320590128] Expected: Should print: 1 (cos 0 = 1) +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 320687663] Q.COS: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 320720228] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 320902710] Testing word: Q.FROM-INT +[Hera] [HADES][TEST ] [KRELTSC: 320960882] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 320987799] Running Q.FROM-INT.round_trip: 7 Q.FROM-INT Q.TO-INT . CR +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 321037659] Test passed +[Hera] [HADES][TEST ] Testing Q.FROM-INT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 321083150] Expected: Should print: 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 321318028] Q.FROM-INT: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 321376812] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 321429720] Testing word: Q.TO-INT +[Hera] [HADES][TEST ] [KRELTSC: 321455259] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 321481535] Running Q.TO-INT.of_one: Q.1 Q.TO-INT . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 321522176] Test passed +[Hera] [HADES][TEST ] Testing Q.TO-INT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 321569299] Expected: Should print: 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 321836754] Q.TO-INT: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 321870354] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 321906613] Testing word: Q.1 +[Hera] [HADES][TEST ] [KRELTSC: 321930753] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 321957414] Running Q.1.raw_value: Q.1 . CR +[Hera] 65536 +[Hera] [HADES][TEST ] [KRELTSC: 321996166] Test passed +[Hera] [HADES][TEST ] Testing Q.1 ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 322181289] Expected: Should print: 65536 +[Hera] 65536 +[Hera] 65536 +[Hera] 65536 +[Hera] 65536 +[Hera] 65536 +[Hera] [HADES][TEST ] [KRELTSC: 322324238] Q.1: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 322355937] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 322392184] Testing word: Q.0 +[Hera] [HADES][TEST ] [KRELTSC: 322416113] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 322442041] Running Q.0.raw_value: Q.0 . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 322618818] Test passed +[Hera] [HADES][TEST ] Testing Q.0 ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 322683656] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 322798650] Q.0: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 322828079] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 322863763] Testing word: Q.SCALE +[Hera] [HADES][TEST ] [KRELTSC: 322888662] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 323038149] Running Q.SCALE.raw_value: Q.SCALE . CR +[Hera] 65536 +[Hera] [HADES][TEST ] [KRELTSC: 323111317] Test passed +[Hera] [HADES][TEST ] Testing Q.SCALE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 323188802] Expected: Should print: 65536 +[Hera] 65536 +[Hera] 65536 +[Hera] 65536 +[Hera] 65536 +[Hera] 65536 +[Hera] [HADES][TEST ] [KRELTSC: 323288582] Q.SCALE: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 323319220] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 323490113] Testing word: Q.= +[Hera] [HADES][TEST ] [KRELTSC: 323514227] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 323557023] Running Q.=.equal: Q.1 Q.1 Q.= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 323627276] Test passed +[Hera] [HADES][TEST ] Testing Q.= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 323673897] Expected: Should print: -1 (true) +[Hera] -1 +[Hera] -1 [HADES][INFO ] [KRELTSC: 323732840] L8[TABLE]: Config 1 → 2 regime=3 score=26214 L1=0 L2=0 L3=0 L + +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 324016048] Running Q.=.not_equal: Q.1 Q.0 Q.= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 324070761] Test passed +[Hera] [HADES][TEST ] Testing Q.= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 324116707] Expected: Should print: 0 (false) +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 324387858] Q.=: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 324472974] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 324509287] Testing word: Q.< +[Hera] [HADES][TEST ] [KRELTSC: 324539030] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 324565495] Running Q.<.true: Q.0 Q.1 Q.< . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 324611944] Test passed +[Hera] [HADES][TEST ] Testing Q.< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 324806756] Expected: Should print: -1 (true) +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 324962823] Running Q.<.false: Q.1 Q.0 Q.< . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 325001386] Test passed +[Hera] [HADES][TEST ] Testing Q.< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 325047188] Expected: Should print: 0 (false) +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 325326626] Q.<: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 325356343] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 325391902] Testing word: Q.> +[Hera] [HADES][TEST ] [KRELTSC: 325416519] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 325442688] Running Q.>.true: Q.1 Q.0 Q.> . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 325488643] Test passed +[Hera] [HADES][TEST ] Testing Q.> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 325691181] Expected: Should print: -1 (true) +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 325812765] Running Q.>.false: Q.0 Q.1 Q.> . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 325850197] Test passed +[Hera] [HADES][TEST ] Testing Q.> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 325895962] Expected: Should print: 0 (false) +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 326130353] Q.>: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 326161785] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 326232442] Testing word: Q.0= +[Hera] [HADES][TEST ] [KRELTSC: 326256550] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 326282750] Running Q.0=.true: Q.0 Q.0= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 326326168] Test passed +[Hera] [HADES][TEST ] Testing Q.0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 326499154] Expected: Should print: -1 (true) +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 326652372] Running Q.0=.false: Q.1 Q.0= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 326691706] Test passed +[Hera] [HADES][TEST ] Testing Q.0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 326738284] Expected: Should print: 0 (false) +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 326985845] Q.0=: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 327051411] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 327087902] Testing word: Q.MAX +[Hera] [HADES][TEST ] [KRELTSC: 327114121] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 327140775] Running Q.MAX.basic: 3 Q.FROM-INT 7 Q.FROM-INT Q.MAX Q.TO-INT +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 327192840] Test passed +[Hera] [HADES][TEST ] Testing Q.MAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 327368618] Expected: Should print: 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] [HADES][INFO ] [KRELTSC: 327515964] L8[TABLE]: Config 2 → 3 regime=3 score=26214 L1=0 L2=0 L3=0 L +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 327566189] Q.MAX: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 327596041] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 327632416] Testing word: Q.MIN +[Hera] [HADES][TEST ] [KRELTSC: 327657465] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 327822403] Running Q.MIN.basic: 3 Q.FROM-INT 7 Q.FROM-INT Q.MIN Q.TO-INT +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 327917389] Test passed +[Hera] [HADES][TEST ] Testing Q.MIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 327963657] Expected: Should print: 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 328062982] Q.MIN: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 328102278] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 328275821] Testing word: Q.PRINT +[Hera] [HADES][TEST ] [KRELTSC: 328325333] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 328371312] Running Q.PRINT.of_one: Q.1 Q.PRINT CR +[Hera] 1.5u +[Hera] [HADES][TEST ] [KRELTSC: 328429892] Test passed +[Hera] [HADES][TEST ] Testing Q.PRINT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 328476959] Expected: Should print: 1.00000 +[Hera] 1.5u +[Hera] 1.5u +[Hera] 1.5u +[Hera] 1.5u +[Hera] 1.5u +[Hera] [HADES][TEST ] [KRELTSC: 328722913] Q.PRINT: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 328800240] === Q48.16 Words Summary: 0 passed, 0 failed, 0 skipped, 0 erro +[Hera] [HADES][INFO ] [KRELTSC: 328836280] +[Hera] === Testing Module: Inference Engine Words === +[Hera] [HADES][INFO ] [KRELTSC: 328874176] Running Inference Engine Words Tests (Module 26)... +[Hera] [HADES][TEST ] [KRELTSC: 328907688] ▶ Testing module: v3/src/test_runner/modules/inference_words_ +[Hera] [HADES][TEST ] [KRELTSC: 328948821] Testing word: Q.VARIANCE +[Hera] [HADES][TEST ] [KRELTSC: 329103113] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 329143260] Running Q.VARIANCE.three_cells: 100 HERE ! 200 HERE 8 + ! 300 +[Hera] 6666 +[Hera] [HADES][TEST ] [KRELTSC: 329221800] Test passed +[Hera] [HADES][TEST ] Testing Q.VARIANCE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 329270478] Expected: Should print population variance of {100,200,300} +[Hera] [HADES][TEST ] [KRELTSC: 329307528] Q.VARIANCE: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 329342133] ▶ Testing module: v3/src/test_runner/modules/inference_words_ +[Hera] [HADES][TEST ] [KRELTSC: 329380837] Testing word: INFER-DECAY-SLOPE +[Hera] [HADES][TEST ] [KRELTSC: 329414173] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 329577803] Running INFER-DECAY-SLOPE.three_cells: 300 HERE ! 200 HERE 8 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 329670606] Test passed +[Hera] [HADES][TEST ] Testing INFER-DECAY-SLOPE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 329720716] Expected: Should print decay slope for a decreasing traject +[Hera] [HADES][TEST ] [KRELTSC: 329756851] INFER-DECAY-SLOPE: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 329792266] ▶ Testing module: v3/src/test_runner/modules/inference_words_ +[Hera] [HADES][TEST ] [KRELTSC: 329835157] Testing word: INFER-WINDOW-WIDTH +[Hera] [HADES][TEST ] [KRELTSC: 330004816] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 330030111] Running INFER-WINDOW-WIDTH.three_cells: 100 HERE ! 200 HERE 8 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 330095638] Test passed +[Hera] [HADES][TEST ] Testing INFER-WINDOW-WIDTH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 330146371] Expected: Should print an inferred window width (no error) +[Hera] [HADES][TEST ] [KRELTSC: 330182282] INFER-WINDOW-WIDTH: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 330217555] ▶ Testing module: v3/src/test_runner/modules/inference_words_ +[Hera] [HADES][TEST ] [KRELTSC: 330258203] Testing word: INFER-RUN +[Hera] [HADES][TEST ] [KRELTSC: 330420982] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 330447657] Running INFER-RUN.basic: INFER-RUN +[Hera] [HADES][TEST ] [KRELTSC: 330878494] Test passed +[Hera] [HADES][TEST ] Testing INFER-RUN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 330938846] Expected: Should run without error +[Hera] [HADES][TEST ] [KRELTSC: 330968549] INFER-RUN: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 331001963] ▶ Testing module: v3/src/test_runner/modules/inference_words_ +[Hera] [HADES][TEST ] [KRELTSC: 331037868] Testing word: INFER-WINDOW@ +[Hera] [HADES][TEST ] [KRELTSC: 331065998] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 331092573] Running INFER-WINDOW@.after_run: INFER-RUN INFER-WINDOW@ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 331298958] Test passed +[Hera] [HADES][TEST ] Testing INFER-WINDOW@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 331345524] Expected: Should print last adaptive_window_width (no error +[Hera] [HADES][TEST ] [KRELTSC: 331381337] INFER-WINDOW@: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 331415781] ▶ Testing module: v3/src/test_runner/modules/inference_words_ +[Hera] [HADES][TEST ] [KRELTSC: 331452281] Testing word: INFER-DECAY@ +[Hera] [HADES][TEST ] [KRELTSC: 331479103] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 331505604] Running INFER-DECAY@.after_run: INFER-RUN INFER-DECAY@ Q.TO-I +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 331734136] Test passed +[Hera] [HADES][TEST ] Testing INFER-DECAY@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 331780840] Expected: Should print last adaptive_decay_slope (no error) +[Hera] [HADES][TEST ] [KRELTSC: 331816495] INFER-DECAY@: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 331849965] ▶ Testing module: v3/src/test_runner/modules/inference_words_ +[Hera] [HADES][TEST ] [KRELTSC: 331886055] Testing word: INFER-VARIANCE@ +[Hera] [HADES][TEST ] [KRELTSC: 331912688] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 331938658] Running INFER-VARIANCE@.after_run: INFER-RUN INFER-VARIANCE@ +[Hera] 1169 +[Hera] [HADES][TEST ] [KRELTSC: 332185802] Test passed +[Hera] [HADES][TEST ] Testing INFER-VARIANCE@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 332234407] Expected: Should print last window_variance_q48 (no error) +[Hera] [HADES][TEST ] [KRELTSC: 332272076] INFER-VARIANCE@: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 332308807] ▶ Testing module: v3/src/test_runner/modules/inference_words_ +[Hera] [HADES][TEST ] [KRELTSC: 332348648] Testing word: INFER-FIT@ +[Hera] [HADES][TEST ] [KRELTSC: 332374970] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 332401204] Running INFER-FIT@.after_run: INFER-RUN INFER-FIT@ Q.TO-INT . +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 332610494] Test passed +[Hera] [HADES][TEST ] Testing INFER-FIT@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 332656021] Expected: Should print last slope_fit_quality_q48 (no error +[Hera] [HADES][TEST ] [KRELTSC: 332690905] INFER-FIT@: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 332728816] ▶ Testing module: v3/src/test_runner/modules/inference_words_ +[Hera] [HADES][TEST ] [KRELTSC: 332766511] Testing word: INFER-EARLY-EXIT@ +[Hera] [HADES][TEST ] [KRELTSC: 332793855] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 332819472] Running INFER-EARLY-EXIT@.after_run: INFER-RUN INFER-EARLY-EX +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 333193357] Test passed +[Hera] [HADES][TEST ] Testing INFER-EARLY-EXIT@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 333236357] Expected: Should print 0 or 1 (no error) +[Hera] [HADES][TEST ] [KRELTSC: 333270313] INFER-EARLY-EXIT@: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 333303349] === Inference Engine Words Summary: 0 passed, 0 failed, 0 skipp +[Hera] [HADES][INFO ] [KRELTSC: 333480897] +[Hera] === Testing Module: Physics Freeze Words === +[Hera] [HADES][INFO ] [KRELTSC: 333521130] Running Physics Freeze Words Tests (Module 27)... +[Hera] [HADES][TEST ] [KRELTSC: 333556549] ▶ Testing module: v3/src/test_runner/modules/physics_freeze_w +[Hera] [HADES][TEST ] [KRELTSC: 333594680] Testing word: FREEZE-WORD +[Hera] [HADES][TEST ] [KRELTSC: 333621268] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 333647420] Running FREEZE-WORD.basic: : __freeze_test_word__ ; S" __free +[Hera] 245 +[Hera] [HADES][TEST ] [KRELTSC: 333725369] Test passed +[Hera] [HADES][TEST ] Testing FREEZE-WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 333915521] Expected: Should print: -1 (word is now frozen) +[Hera] [HADES][TEST ] [KRELTSC: 333947373] FREEZE-WORD: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 333983024] ▶ Testing module: v3/src/test_runner/modules/physics_freeze_w +[Hera] [HADES][TEST ] [KRELTSC: 334019008] Testing word: UNFREEZE-WORD +[Hera] [HADES][TEST ] [KRELTSC: 334046521] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 334073572] Running UNFREEZE-WORD.basic: : __unfreeze_test_word__ ; S" __ +[Hera] 270 +[Hera] [HADES][TEST ] [KRELTSC: 334149955] Test passed +[Hera] [HADES][TEST ] Testing UNFREEZE-WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 334325292] Expected: Should print: 0 (freeze cleared) +[Hera] [HADES][TEST ] [KRELTSC: 334369568] UNFREEZE-WORD: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 334402172] ▶ Testing module: v3/src/test_runner/modules/physics_freeze_w +[Hera] [HADES][TEST ] [KRELTSC: 334438035] Testing word: FROZEN? +[Hera] [HADES][TEST ] [KRELTSC: 334463456] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 334489526] Running FROZEN?.not_frozen: : __frozen_test_word__ ; S" __fro +[Hera] 224 +[Hera] [HADES][TEST ] [KRELTSC: 334556229] Test passed +[Hera] [HADES][TEST ] Testing FROZEN? ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 334606032] Expected: Should print: 0 (freshly defined word is not froz +[Hera] [HADES][TEST ] [KRELTSC: 334778759] Running FROZEN?.not_found: S" __nonexistent_freeze_xyz__" FRO +[Hera] 245 +[Hera] [HADES][TEST ] [KRELTSC: 334828092] Test passed +[Hera] [HADES][TEST ] Testing FROZEN? ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 334872752] Expected: Should print: 0 (not-found treated as not frozen) +[Hera] [HADES][TEST ] [KRELTSC: 334908557] FROZEN?: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 334940080] ▶ Testing module: v3/src/test_runner/modules/physics_freeze_w +[Hera] [HADES][TEST ] [KRELTSC: 334979149] Testing word: HEAT! +[Hera] [HADES][TEST ] [KRELTSC: 335003909] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 335029965] Running HEAT!.basic: : __heat_store_test_word__ ; 999 S" __he +[Hera] 249 +[Hera] [HADES][TEST ] [KRELTSC: 335252264] Test passed +[Hera] [HADES][TEST ] Testing HEAT! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 335298336] Expected: Should print: 999 +[Hera] [HADES][TEST ] [KRELTSC: 335328960] HEAT!: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 335359210] ▶ Testing module: v3/src/test_runner/modules/physics_freeze_w +[Hera] [HADES][TEST ] [KRELTSC: 335393974] Testing word: HEAT@ +[Hera] [HADES][TEST ] [KRELTSC: 335417945] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 335443637] Running HEAT@.of_fresh_word: : __heat_fetch_test_word__ ; S" +[Hera] 224 +[Hera] [HADES][TEST ] [KRELTSC: 335502959] Test passed +[Hera] [HADES][TEST ] Testing HEAT@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 335675357] Expected: Should print: 0 (freshly defined word has zero he +[Hera] [HADES][TEST ] [KRELTSC: 335716267] HEAT@: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 335747704] ▶ Testing module: v3/src/test_runner/modules/physics_freeze_w +[Hera] [HADES][TEST ] [KRELTSC: 335783651] Testing word: DECAY-RATE@ +[Hera] [HADES][TEST ] [KRELTSC: 335809539] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 335835895] Running DECAY-RATE@.basic: DECAY-RATE@ . CR +[Hera] 224 +[Hera] [HADES][TEST ] [KRELTSC: 335888142] Test passed +[Hera] [HADES][TEST ] Testing DECAY-RATE@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 336086418] Expected: Should print the compile-time DECAY_RATE_PER_US_Q +[Hera] [HADES][TEST ] [KRELTSC: 336134839] DECAY-RATE@: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 336171821] === Physics Freeze Words Summary: 0 passed, 0 failed, 0 skipped +[Hera] [HADES][INFO ] [KRELTSC: 336213005] FINAL TEST SUMMARY: +[Hera] [HADES][INFO ] [KRELTSC: 336239131] Total tests run: 1050 +[Hera] [HADES][INFO ] [KRELTSC: 336267181] Passed: 1012 +[Hera] [HADES][INFO ] [KRELTSC: 336293326] Failed: 0 +[Hera] [HADES][INFO ] [KRELTSC: 336318264] Stubs (not yet implemented): 38 +[Hera] [HADES][INFO ] [KRELTSC: 336347222] Errors: 0 +[Hera] [HADES][INFO ] [KRELTSC: 336544164] ALL IMPLEMENTED TESTS PASSED! +[Hera] [HADES][INFO ] [KRELTSC: 336575321] Contract checks (A4'/A1): all passed +[Hera] [HADES][INFO ] [KRELTSC: 336606120] ============================================== +[Hera] PARITY:M7.1a word_count=530 here=0x00000000000000d8 latest_id=699 hash=0x08873e0f44b7cb2a +[Hera] PARITY:OK +[Hera] POST: PASSED +[Hera] [HAL][exec] regions frozen: +[Hera] kernel.text: [0x000000013dff3cac, 0x000000013dff3cb0) +[Hera] VM: parity bootstrap complete +[Hera] PCI: init... +[Hera] virtio-rng: found device +[Hera] rng: backend = virtio-rng +[Hera] entropy: ready +[Hera] virtio-blk: found device +[Hera] Artemis: virtio-blk attached +[Hera] Artemis: genesis signature stamped +[Hera] virtio-input: found device +[Hera] virtio-input: driver ready +[Hera] Init: Mama birth... +[Hera] [HADES][WARN ] [KRELTSC: 341711722] capsule sig: init.4th: missing (unsigned) +[Hera] [HADES][WARN ] [KRELTSC: 342671024] ( Unterminated comment +[Hera] [HADES][WARN ] [KRELTSC: 343050623] ( Unterminated comment + +[Hera] ================================================ +[Hera] LithosAnanke — FORTH-79 bare-metal kernel +[Hera] Stadium step one: Hera alone +[Hera] ================================================ +[Hera] Hera [live] +[Hera] ================================================ + +[Hera] (no identity) +[Hera] PARITY:MAMA_INIT capsule_id=0xea038ba684c53443 mode=m capsule_hash=0xea038ba684c53443 dict_hash=0xe11082140cf86b05 +[Hera] Init: Mama birth OK +[Hera] ACL: CAPSULE-BIRTH pinned STRICT +[Hera] ACL: BIRTH pinned STRICT +[Hera] Starting heartbeat... +[Hera] Heartbeat running. +[Hera] Stadium words: promotions=422 evictions=0 +[Hera] Stadium conservation: resident_sum=43691 reservoir=21845 sum=65536 (Q48_ONE=65536) +[Hera] Stadium conservation: CONSERVED +[Hera] Stadium quota grant self-test: OK +[Hera] Hera reservoir=21845 +[Hera] test-vm reservoir=65536 +[Hera] Kernel-Hermes alloc/release self-test: Scan cross-check (counters vs arena): PASS +[Hera] scan_held_before_decay=8192 +[Hera] scan_held_after_decay=8148 +[Hera] Stage B (ledger + stadium_conserved): PASS +[Hera] vm_consumed=737 +[Hera] PASS +[Hera] audit_failures=0 +[Hera] decay_consumed=352 +[Hera] reservoir0=65536 +[Hera] Q_SLOT=2048 +[Hera] expected_n=32 +[Hera] got_n=32 +[Hera] reservoir_after_alloc=0 +[Hera] reservoir_final=65536 +[Hera] held(final)=0 +[Hera] pulled(final)=65536 +[Hera] returned(final)=65536 +[Hera] consumed(final)=0 +[Hera] Startup: birthing Hestia (fleet foundation)... +[Hestia] [HADES][WARN ] [KRELTSC: 358400936] capsule sig: hestia:init.4th: missing (unsigned) +[Hestia] [HADES][WARN ] [KRELTSC: 372329119] ( Unterminated comment +[Hestia] [HADES][WARN ] [KRELTSC: 373117382] ( Unterminated comment +[Hestia] [HADES][WARN ] [KRELTSC: 377467236] ( Unterminated comment +[Hestia] (no identity) +[Hestia] PARITY:BIRTH vm_id=0x3e417af7a996424b-0xac711f4444782b53 capsule_id=0x64e111990fbc45ff mode=p capsule_hash=0x64e111990fbc45ff dict_hash=0xb1256603f848e2b9 +[Hera] BIRTH: Hestia live +[Hera] Startup: Hestia live +[Hera] Startup: birthing Artemis (fleet foundation)... +[Artemis] [HADES][WARN ] [KRELTSC: 382750710] capsule sig: artemis:init.4th: missing (unsigned) +[Artemis] Artemis: blank disk -- formatting +[Artemis] Artemis self-test... +[Artemis] 3076 allocated +[Artemis] 0.5u K after alloc +[Artemis] 0.5u K after free +[Artemis] PASS +[Artemis] Artemis: persist-write... +[Artemis] PASS: persist-write +[Artemis] Artemis ready +[Artemis] Artemis: 22998 data blocks +[Artemis] K-total=0.5u +[Artemis] ARTEMIS-K=1.5u +[Artemis] (no identity) +[Artemis] [HADES][WARN ] [KRELTSC: 1358420547] ( Unterminated comment +[Artemis] PARITY:BIRTH vm_id=0xf6f94b9c36ea463f-0xb8d8e10f85efa90b capsule_id=0xe6fba9ae56e1c916 mode=p capsule_hash=0xe6fba9ae56e1c916 dict_hash=0xc791409ac1715690 +[Hera] BIRTH: Artemis live +[Hera] Startup: Artemis live +[Hera] Heartbeat: 1560 ticks, trust=0x00010000, variance=0x00000000 +[Hera] Kernel-Hermes common-channel fleet self-test: PASS +[Hera] common channel members=3 +[Hera] channel table capacity=202 +[Hera] Kernel-Hermes synthetic private-topic self-test: PASS +[Hera] Kernel-Hermes publish self-test: PASS +[Hera] Kernel-Hermes drain self-test: SKIPPED (Hermes not live) +[Hera] Kernel-Hermes chunk self-test: PASS +[Hera] Kernel-Hermes negotiation self-test: PASS +[Hera] Kernel-Hermes channel-open policy self-test: SKIPPED (Hera/Hermes not available) +[Hera] blkio_usb: MSC device ready +[Hera] Kernel-Hermes BLK-ATTACH-EVENT (real, Stage C): ledger held=2048 pulled=237568 returned=234783 consumed=737 stadium_conserved(Artemis)=true +[Hera] Zuse: genesis minted onto attached thumbdrive +[Hera] LithosAnanke v2.1.0 +[Hera] StarForth Version 3.2.0 + +[Hera] StarForth CLI +[Hera] FORTH-79 interpreter type BYE or power off to exit + +[zuse@Hera] ok>  \ No newline at end of file diff --git a/logs/20261003-100941/riscv64/qemu-riscv64-20261003-100941.log b/logs/20261003-100941/riscv64/qemu-riscv64-20261003-100941.log new file mode 100644 index 00000000..481dd0a4 --- /dev/null +++ b/logs/20261003-100941/riscv64/qemu-riscv64-20261003-100941.log @@ -0,0 +1,9187 @@ + +OpenSBI v1.8 + ____ _____ ____ _____ + / __ \ / ____| _ \_ _| + | | | |_ __ ___ _ __ | (___ | |_) || | + | | | | '_ \ / _ \ '_ \ \___ \| _ < | | + | |__| | |_) | __/ | | |____) | |_) || |_ + \____/| .__/ \___|_| |_|_____/|____/_____| + | | + |_| + +Platform Name : riscv-virtio,qemu +Platform Features : medeleg +Platform HART Count : 1 +Platform HART Protection : pmp +Platform IPI Device : aclint-mswi +Platform Timer Device : aclint-mtimer @ 10000000Hz +Platform Console Device : uart8250 +Platform HSM Device : --- +Platform PMU Device : --- +Platform Reboot Device : syscon-reboot +Platform Shutdown Device : syscon-poweroff +Platform Suspend Device : --- +Platform CPPC Device : --- +Firmware Base : 0x80000000 +Firmware Size : 321 KB +Firmware RW Offset : 0x40000 +Firmware RW Size : 65 KB +Firmware Heap Offset : 0x47000 +Firmware Heap Size : 37 KB (total), 0 KB (reserved), 12 KB (used), 23 KB (free) +Firmware Scratch Size : 4096 B (total), 1464 B (used), 2632 B (free) +Runtime SBI Version : 3.0 +Standard SBI Extensions : ipi,pmu,srst,sse,hsm,rfnc,fwft,time,base,legacy,dbcn,dbtr +Experimental SBI Extensions : none + +Domain0 Name : root +Domain0 Boot HART : 0 +Domain0 HARTs : 0* +Domain0 Region00 : 0x0000000080040000-0x000000008005ffff M: (F,R,W) S/U: () +Domain0 Region01 : 0x0000000080000000-0x000000008003ffff M: (F,R,X) S/U: () +Domain0 Region02 : 0x0000000000100000-0x0000000000100fff M: (I,R,W) S/U: (R,W) +Domain0 Region03 : 0x0000000010000000-0x0000000010000fff M: (I,R,W) S/U: (R,W) +Domain0 Region04 : 0x0000000002000000-0x000000000200ffff M: (I,R,W) S/U: () +Domain0 Region05 : 0x000000000c400000-0x000000000c5fffff M: (I,R,W) S/U: (R,W) +Domain0 Region06 : 0x000000000c000000-0x000000000c3fffff M: (I,R,W) S/U: (R,W) +Domain0 Region07 : 0x0000000000000000-0xffffffffffffffff M: () S/U: (R,W,X) +Domain0 Next Address : 0x0000000020000000 +Domain0 Next Arg1 : 0x00000000bfe00000 +Domain0 Next Mode : S-mode +Domain0 SysReset : yes +Domain0 SysSuspend : yes + +Boot HART ID : 0 +Boot HART Domain : root +Boot HART Priv Version : v1.12 +Boot HART Base ISA : rv64imafdch +Boot HART ISA Extensions : sstc,zicntr,zihpm,zicboz,zicbom,sdtrig,svadu +Boot HART PMP Count : 16 +Boot HART PMP Granularity : 2 bits +Boot HART PMP Address Bits : 54 +Boot HART MHPM Info : 16 (0x0007fff8) +Boot HART Debug Triggers : 2 triggers +Boot HART MIDELEG : 0x0000000000001666 +Boot HART MEDELEG : 0x0000000000f4b509 +[=3hRISC-V EDK2 firmware version 2025.11-3ubuntu7.2 +Press ESCAPE within 5 seconds for boot options ERROR: C40000002:V03051002 I0 6D33944A-EC75-4855-A54D-809C75241F6C 83FFF850 +BdsDxe: failed to load Boot0001 "UEFI Misc Device" fr +om PciRoot(0x0)/Pci(0x1,0x0): Not Found +[=3hStarKernel UEFI Loader +Loading kernel from ESP... +[CKPT 001] Entered efi_main - ConOut live +Monolithic build - kernel linked directly +Collecting boot information... +CmdLine: parsed OK +[CKPT 004] Command line parsed +[CKPT 005] Kernel stack allocation decided +[CKPT 006] Boot info collected (ACPI table located) +GOP: linear framebuffer found +[CKPT 007] GOP: linear framebuffer found +[CKPT 008] About to enter ExitBootServices retry loop +Calling kernel_main (monolithic)... +riscv64 item 4.3.5a: satp state at kernel entry (before switch) + satp.MODE = 0x000000000000000a + satp.PPN = 0x00000000000bf868 + __kernel_start = 0x00000000bdf1c678 +riscv64: satp cleared -- Bare mode, explicit (item 4.3.5a) + + + _____ _ _ __ _ + / ____| | | |/ / | | + | (___ | |_ __ _ _ __| ' / ___ _ __ _ __ ___| | + \___ \| __/ _` | '__| < / _ \ '__| '_ \ / _ \ | + ____) | || (_| | | | . \ __/ | | | | | __/ | + |_____/ \__\__,_|_| |_|\_\___|_| |_| |_|\___|_| + +LithosAnanke v2.1.0 +Architecture: riscv64 +Build: Oct 3 2026 10:09:04 + +UEFI BootServices: EXITED + +=== StarKernel Boot Information === +Memory map entries: 100 +Total memory: 1020 MB +Usable memory: 977 MB +=================================== + +PMM initialized. +PMM statistics: + Total pages: 250872 + Free pages : 250220 + Used pages : 652 + Total MB : 979 + Free MB : 977 + Used MB : 2 + +VMM initialized (mapped RAM, CR3 switched) +VMM initialized (mapped RAM, CR3 switched) +VMM self-test: mapped OK at 0xffff800000000000 +VMM self-test complete. + +IDT installed. + +APIC: init... +PLIC: no DTB PLIC node -- using QEMU virt-machine default (base=0x0c000000) +PLIC: init (S-mode context 1, threshold=0) +APIC: init done + +Timer: init... +Timer: RISC-V time CSR @ 10000000 Hz (FALLBACK, no devicetree) +Timer: init done + +Kernel heap initialized. +Heap statistics: + Total bytes: 536870872 + Free bytes: 536870872 + Used bytes: 0 + Peak bytes: 0 + Heap base addr: 2214588416 + Heap end addr: 2751459328 + +Heartbeat: init... +Heartbeat: init done +Kernel initialization complete. +Boot successful! + +Stadium: 83886 cells (5242 KB), 50 VM slots +Switch-signal: 50 slots +Kernel-Hermes: 50 channel slots +Kernel-Hermes: 50 pending-queue slots +VM: bootstrap parity... +VM arena allocated: 0x0000000080267000 + (5 MB) +[HADES][INFO ] [KRELTSC: 0] Registering FORTH-79 Standard word set... +[HADES][INFO ] [KRELTSC: 7641417] Registering FORTH-79 arithmetic words... +[HADES][INFO ] [KRELTSC: 53619699] FORTH-79 Standard word set registration complete +[Hera] POST: Running comprehensive test suite... +[Hera] [HADES][INFO ] [KRELTSC: 98407554] Starting comprehensive FORTH-79 modular test suite... +[Hera] [HADES][INFO ] [KRELTSC: 99630216] ============================================== +[Hera] [HADES][INFO ] [KRELTSC: 101128209] +[Hera] === Testing Module: Stack Words === +[Hera] [HADES][INFO ] [KRELTSC: 107197671] Running Stack Words Tests (Module 1: Foundation)... +[Hera] [HADES][TEST ] [KRELTSC: 108474723] ▶ Testing module: v3/src/test_runner/modules/stack_words_test +[Hera] [HADES][TEST ] [KRELTSC: 109883424] Testing word: DUP +[Hera] [HADES][TEST ] [KRELTSC: 110756961] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 111832392] Running DUP.basic: 5 DUP . . CR +[Hera] 5 5 +[Hera] [HADES][TEST ] [KRELTSC: 123762387] Test passed +[Hera] [HADES][TEST ] Testing DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 125621475] Expected: Should print: 5 5 +[Hera] 5 5 +[Hera] 5 5 +[Hera] 5 5 +[Hera] 5 5 +[Hera] 5 5 +[Hera] [HADES][TEST ] [KRELTSC: 129649065] Running DUP.zero: 0 DUP . . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 131169339] Test passed +[Hera] [HADES][TEST ] Testing DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 137360013] Expected: Should print: 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 140476035] Running DUP.negative: -42 DUP . . CR +[Hera] -42 -42 +[Hera] [HADES][TEST ] [KRELTSC: 142114854] Test passed +[Hera] [HADES][TEST ] Testing DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 143895759] Expected: Should print: -42 -42 +[Hera] -42 -42 +[Hera] -42 -42 +[Hera] -42 -42 +[Hera] -42 -42 +[Hera] -42 -42 +[Hera] [HADES][TEST ] [KRELTSC: 151714857] Running DUP.max_int: 2147483647 DUP . . CR +[Hera] 2147483647 2147483647 +[Hera] [HADES][TEST ] [KRELTSC: 153403089] Test passed +[Hera] [HADES][TEST ] Testing DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 155090145] Expected: Should duplicate max int +[Hera] 2147483647 2147483647 +[Hera] 2147483647 2147483647 +[Hera] 2147483647 2147483647 +[Hera] 2147483647 2147483647 +[Hera] 2147483647 2147483647 +[Hera] [HADES][TEST ] [KRELTSC: 159013386] Running DUP.min_int: -2147483648 DUP . . CR +[Hera] -2147483648 -2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 160632843] Test passed +[Hera] [HADES][TEST ] Testing DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 166733091] Expected: Should duplicate min int +[Hera] -2147483648 -2147483648 +[Hera] -2147483648 -2147483648 +[Hera] -2147483648 -2147483648 +[Hera] -2147483648 -2147483648 +[Hera] -2147483648 -2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 170982945] Running DUP.empty_stack: DUP +[Hera] [HADES][ERROR] [KRELTSC: 172043529] DUP: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 173221965] Expected error occurred +[Hera] [HADES][TEST ] Testing DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 175078827] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 180565938] DUP: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 181867077] ▶ Testing module: v3/src/test_runner/modules/stack_words_test +[Hera] [HADES][TEST ] [KRELTSC: 183156708] Testing word: DROP +[Hera] [HADES][TEST ] [KRELTSC: 184039464] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 184992171] Running DROP.basic: 5 7 DROP . CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 186454590] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 188360697] Expected: Should print: 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 195621699] Running DROP.zero: 42 0 DROP . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 196985586] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 198663234] Expected: Should drop zero, print 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 201729507] Running DROP.negative: 10 -5 DROP . CR +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 203383467] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 209403306] Expected: Should drop negative, print 10 +[Hera] 10 +[Hera] 10 +[Hera] 10 +[Hera] 10 +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 212502906] Running DROP.double_drop: 1 2 3 DROP DROP . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 213992604] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 215629932] Expected: Should print: 1 +[Hera] 1 +[Hera] [HADES][INFO ] [KRELTSC: 226435293] L8[TABLE]: Config 17 → 0 regime=2 score=26214 L1=0 L2=0 L3=0 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 230130684] Running DROP.triple_drop: 1 2 3 4 DROP DROP DROP . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 231911505] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 233587242] Expected: Should print: 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 240858387] Running DROP.sequential: 5 DROP 6 DROP 7 . CR +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 242333973] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 243996228] Expected: Should print: 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 247197468] Running DROP.single_item: 99 DROP DEPTH . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 253400973] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 255101889] Expected: Should empty stack, depth=0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 258099282] Running DROP.depth_change: DEPTH 1 2 DROP DEPTH SWAP - . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 259846839] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 261757020] Expected: Should change depth by 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 269323488] Running DROP.preserve_depth: DEPTH 5 6 DROP DROP DEPTH = . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 271193874] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 272872089] Expected: Should preserve net depth +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][INFO ] [KRELTSC: 276181878] L8[TABLE]: Config 0 → 1 regime=2 score=26214 L1=0 L2=0 L3=0 L +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 282405753] Running DROP.max_int: 2147483647 DROP DEPTH . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 283933503] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 285613923] Expected: Should drop max int +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 288476244] Running DROP.min_int: -2147483648 DROP DEPTH . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 289949541] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 295600557] Expected: Should drop min int +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 298870593] Running DROP.with_dup: 5 DUP DROP . CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 300304242] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 301915068] Expected: Should duplicate then drop +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 304881360] Running DROP.with_swap: 1 2 SWAP DROP . CR +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 310429476] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 312367692] Expected: Should swap then drop +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 315296898] Running DROP.complex: 1 2 3 ROT DROP SWAP DROP . CR +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 316928535] Test passed +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 318657486] Expected: Should handle complex sequence +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 326265198] Running DROP.empty_stack: DROP +[Hera] [HADES][ERROR] [KRELTSC: 327361860] DROP: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 328306629] Expected error occurred +[Hera] [HADES][TEST ] Testing DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 329989317] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 331033899] DROP: 15 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 332159394] ▶ Testing module: v3/src/test_runner/modules/stack_words_test +[Hera] [HADES][TEST ] [KRELTSC: 333670722] Testing word: SWAP +[Hera] [HADES][TEST ] [KRELTSC: 334626684] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 339597846] Running SWAP.basic: 5 7 SWAP . . CR +[Hera] 5 7 +[Hera] [HADES][TEST ] [KRELTSC: 341385240] Test passed +[Hera] [HADES][TEST ] Testing SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 343031682] Expected: Should print: 7 5 +[Hera] 5 7 +[Hera] 5 7 +[Hera] 5 7 +[Hera] 5 7 +[Hera] 5 7 +[Hera] [HADES][TEST ] [KRELTSC: 345977625] Running SWAP.same_values: 42 42 SWAP . . CR +[Hera] 42 42 +[Hera] [HADES][TEST ] [KRELTSC: 347532822] Test passed +[Hera] [HADES][TEST ] Testing SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 349412721] Expected: Should print: 42 42 +[Hera] 42 42 +[Hera] 42 42 +[Hera] 42 42 +[Hera] 42 42 +[Hera] 42 [HADES][INFO ] [KRELTSC: 356669775] L8[TABLE]: Config 1 → 2 regime=2 score=26214 L1=0 L2=0 L3=0 L +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 358088241] Running SWAP.zero_nonzero: 0 99 SWAP . . CR +[Hera] 0 99 +[Hera] [HADES][TEST ] [KRELTSC: 359523381] Test passed +[Hera] [HADES][TEST ] Testing SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 361195233] Expected: Should print: 99 0 +[Hera] 0 99 +[Hera] 0 99 +[Hera] 0 99 +[Hera] 0 99 +[Hera] 0 99 +[Hera] [HADES][TEST ] [KRELTSC: 364454832] Running SWAP.negative: -5 10 SWAP . . CR +[Hera] -5 10 +[Hera] [HADES][TEST ] [KRELTSC: 370778940] Test passed +[Hera] [HADES][TEST ] Testing SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 372485505] Expected: Should print: 10 -5 +[Hera] -5 10 +[Hera] -5 10 +[Hera] -5 10 +[Hera] -5 10 +[Hera] -5 10 +[Hera] [HADES][TEST ] [KRELTSC: 375584538] Running SWAP.one_item: 42 SWAP +[Hera] [HADES][ERROR] [KRELTSC: 376757619] SWAP: Insufficient stack items (need 2) +[Hera] [HADES][TEST ] [KRELTSC: 377850333] Expected error occurred +[Hera] [HADES][TEST ] Testing SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 383961606] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 385100247] Running SWAP.empty_stack: SWAP +[Hera] [HADES][ERROR] [KRELTSC: 386150016] SWAP: Insufficient stack items (need 2) +[Hera] [HADES][TEST ] [KRELTSC: 387256107] Expected error occurred +[Hera] [HADES][TEST ] Testing SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 389040036] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 390210072] SWAP: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 391458438] ▶ Testing module: v3/src/test_runner/modules/stack_words_test +[Hera] [HADES][TEST ] [KRELTSC: 392772870] Testing word: OVER +[Hera] [HADES][TEST ] [KRELTSC: 398973351] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 399920367] Running OVER.basic: 5 7 OVER . . . CR +[Hera] 5 7 5 +[Hera] [HADES][TEST ] [KRELTSC: 401630439] Test passed +[Hera] [HADES][TEST ] Testing OVER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 403333056] Expected: Should print: 5 7 5 +[Hera] 5 7 5 +[Hera] 5 7 5 +[Hera] 5 7 5 +[Hera] 5 7 5 +[Hera] 5 7 5 +[Hera] [HADES][TEST ] [KRELTSC: 406448511] Running OVER.zeros: 0 0 OVER . . . CR +[Hera] 0 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 407968974] Test passed +[Hera] [HADES][TEST ] Testing OVER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 414226890] Expected: Should print: 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 417617760] Running OVER.mixed: -1 42 OVER . . . CR +[Hera] -1 42 -1 +[Hera] [HADES][TEST ] [KRELTSC: 419052375] Test passed +[Hera] [HADES][TEST ] Testing OVER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 420790545] Expected: Should print: -1 42 -1 +[Hera] -1 42 -1 +[Hera] -1 42 -1 +[Hera] -1 42 -1 +[Hera] -1 42 -1 +[Hera] -1 42 -1 +[Hera] [HADES][TEST ] [KRELTSC: 428920737] Running OVER.one_item: 42 OVER +[Hera] [HADES][ERROR] [KRELTSC: 430049130] OVER: Insufficient stack items (need 2) +[Hera] [HADES][TEST ] [KRELTSC: 431197830] Expected error occurred +[Hera] [HADES][TEST ] Testing OVER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 432930981] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 434037891] Running OVER.empty_stack: OVER +[Hera] [HADES][ERROR] [KRELTSC: 435102570] OVER: Insufficient stack items (need 2) +[Hera] [HADES][TEST ] [KRELTSC: 436163196] Expected error occurred +[Hera] [HADES][TEST ] Testing OVER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 442352064] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 443469894] OVER: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 444590412] ▶ Testing module: v3/src/test_runner/modules/stack_words_test +[Hera] [HADES][TEST ] [KRELTSC: 445888569] Testing word: ROT +[Hera] [HADES][TEST ] [KRELTSC: 446745936] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 447687723] Running ROT.basic: 1 2 3 ROT . . . CR +[Hera] 1 3 2 +[Hera] [HADES][TEST ] [KRELTSC: 449250228] Test passed +[Hera] [HADES][TEST ] Testing ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 450987957] Expected: Should print: 2 3 1 +[Hera] 1 3 2 +[Hera] 1 3 2 +[Hera] 1 3 2 +[Hera] 1 3 2 +[Hera] 1 3 2 +[Hera] [HADES][TEST ] [KRELTSC: 459802245] Running ROT.zeros: 0 0 0 ROT . . . CR +[Hera] [HADES][INFO ] [KRELTSC: 461101536] L8[TABLE]: Config 2 → 3 regime=2 score=26214 L1=0 L2=0 L3=0 L +[Hera] 0 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 462888825] Test passed +[Hera] [HADES][TEST ] Testing ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 464548329] Expected: Should print: 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 472999065] Running ROT.mixed: -1 0 1 ROT . . . CR +[Hera] -1 1 0 +[Hera] [HADES][TEST ] [KRELTSC: 474512262] Test passed +[Hera] [HADES][TEST ] Testing ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 476147868] Expected: Should print: 0 1 -1 +[Hera] -1 1 0 +[Hera] -1 1 0 +[Hera] -1 1 0 +[Hera] -1 1 0 +[Hera] -1 1 0 +[Hera] [HADES][TEST ] [KRELTSC: 479665137] Running ROT.two_items: 1 2 ROT +[Hera] [HADES][ERROR] [KRELTSC: 480745965] ROT: Insufficient stack items (need 3) +[Hera] [HADES][TEST ] [KRELTSC: 487307541] Expected error occurred +[Hera] [HADES][TEST ] Testing ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 489081621] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 490159908] Running ROT.one_item: 42 ROT +[Hera] [HADES][ERROR] [KRELTSC: 491151507] ROT: Insufficient stack items (need 3) +[Hera] [HADES][TEST ] [KRELTSC: 492238362] Expected error occurred +[Hera] [HADES][TEST ] Testing ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 494248524] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 499655268] Running ROT.empty_stack: ROT +[Hera] [HADES][ERROR] [KRELTSC: 502061007] ROT: Insufficient stack items (need 3) +[Hera] [HADES][TEST ] [KRELTSC: 503182071] Expected error occurred +[Hera] [HADES][TEST ] Testing ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 505098888] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 506164932] ROT: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 507288201] ▶ Testing module: v3/src/test_runner/modules/stack_words_test +[Hera] [HADES][TEST ] [KRELTSC: 508809483] Testing word: DEPTH +[Hera] [HADES][TEST ] [KRELTSC: 509695410] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 515411946] Running DEPTH.empty: DEPTH . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 517530678] Test passed +[Hera] [HADES][TEST ] Testing DEPTH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 519216621] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 521993388] Running DEPTH.one_item: 42 DEPTH . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 523657533] Test passed +[Hera] [HADES][TEST ] Testing DEPTH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 529935714] Expected: Should print: 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 532956711] Running DEPTH.multiple: 1 2 3 DEPTH . CR +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 534443364] Test passed +[Hera] [HADES][TEST ] Testing DEPTH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 536043417] Expected: Should print: 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 544629687] DEPTH: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 545776224] ▶ Testing module: v3/src/test_runner/modules/stack_words_test +[Hera] [HADES][TEST ] [KRELTSC: 547155924] Testing word: PICK +[Hera] [HADES][TEST ] [KRELTSC: 548034207] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 548952348] Running PICK.pick_0: 1 2 3 0 PICK . CR +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 550524177] Test passed +[Hera] [HADES][TEST ] Testing PICK ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 552199263] Expected: Should print: 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 560033187] Running PICK.pick_1: 1 2 3 1 PICK . CR +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 561494304] Test passed +[Hera] [HADES][TEST ] Testing PICK ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 563103093] Expected: Should print: 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] [HADES][INFO ] [KRELTSC: 565581387] L8[TABLE]: Config 3 → 4 regime=2 score=26214 L1=0 L2=0 L3=0 L +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 567380457] Running PICK.pick_2: 1 2 3 2 PICK . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 569051280] Test passed +[Hera] [HADES][TEST ] Testing PICK ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 575062383] Expected: Should print: 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 578025609] PICK: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 579148710] ▶ Testing module: v3/src/test_runner/modules/stack_words_test +[Hera] [HADES][TEST ] [KRELTSC: 580528305] Testing word: ROLL +[Hera] [HADES][TEST ] [KRELTSC: 581409549] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 582345897] Running ROLL.roll_1: 1 2 3 1 ROLL . . . CR +[Hera] 1 3 2 +[Hera] [HADES][TEST ] [KRELTSC: 588906906] Test passed +[Hera] [HADES][TEST ] Testing ROLL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 590645454] Expected: Should print: 1 3 2 +[Hera] 1 3 2 +[Hera] 1 3 2 +[Hera] 1 3 2 +[Hera] 1 3 2 +[Hera] 1 3 2 +[Hera] [HADES][TEST ] [KRELTSC: 593804127] Running ROLL.roll_2: 1 2 3 2 ROLL . . . CR +[Hera] 2 3 1 +[Hera] [HADES][TEST ] [KRELTSC: 595368207] Test passed +[Hera] [HADES][TEST ] Testing ROLL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 597025737] Expected: Should print: 2 3 1 +[Hera] 2 3 1 +[Hera] 2 3 1 +[Hera] 2 3 1 +[Hera] 2 3 1 +[Hera] 2 3 1 +[Hera] [HADES][TEST ] [KRELTSC: 604872345] ROLL: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 606001326] ▶ Testing module: v3/src/test_runner/modules/stack_words_test +[Hera] [HADES][TEST ] [KRELTSC: 607249083] Testing word: ?DUP +[Hera] [HADES][TEST ] [KRELTSC: 608067852] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 608999853] Running ?DUP.nonzero: 42 ?DUP . . CR +[Hera] 42 42 +[Hera] [HADES][TEST ] [KRELTSC: 610735734] Test passed +[Hera] [HADES][TEST ] Testing ?DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 616546371] Expected: Should print: 42 42 +[Hera] 42 42 +[Hera] 42 42 +[Hera] 42 42 +[Hera] 42 42 +[Hera] 42 42 +[Hera] [HADES][TEST ] [KRELTSC: 620175528] Running ?DUP.negative: -5 ?DUP . . CR +[Hera] -5 -5 +[Hera] [HADES][TEST ] [KRELTSC: 621575619] Test passed +[Hera] [HADES][TEST ] Testing ?DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 623240331] Expected: Should print: -5 -5 +[Hera] -5 -5 +[Hera] -5 -5 +[Hera] -5 -5 +[Hera] -5 -5 +[Hera] -5 -5 +[Hera] [HADES][TEST ] [KRELTSC: 626461248] Running ?DUP.zero: 0 ?DUP DEPTH . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 632556141] Test passed +[Hera] [HADES][TEST ] Testing ?DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 634250568] Expected: Should not dup: depth 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 637150668] Running ?DUP.empty_stack: ?DUP +[Hera] [HADES][ERROR] [KRELTSC: 638160558] ?DUP: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 639179898] Expected error occurred +[Hera] [HADES][TEST ] Testing ?DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 640944150] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 646584939] ?DUP: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 647781792] ▶ Testing module: v3/src/test_runner/modules/stack_words_test +[Hera] [HADES][TEST ] [KRELTSC: 649100739] Testing word: -ROT +[Hera] [HADES][TEST ] [KRELTSC: 649949748] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 650841849] Running -ROT.basic: 1 2 3 -ROT . . . CR +[Hera] 2 1 3 +[Hera] [HADES][TEST ] [KRELTSC: 652460844] Test passed +[Hera] [HADES][TEST ] Testing -ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 654180618] Expected: Should print: 1 3 2 +[Hera] [HADES][INFO ] [KRELTSC: 655316802] L8[TABLE]: Config 4 → 5 regime=2 score=26214 L1=0 L2=0 L3=0 L +[Hera] 2 1 3 +[Hera] 2 1 3 +[Hera] 2 1 3 +[Hera] 2 1 3 +[Hera] 2 1 3 +[Hera] [HADES][TEST ] [KRELTSC: 663564846] Running -ROT.zeros: 0 0 0 -ROT . . . CR +[Hera] 0 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 665106120] Test passed +[Hera] [HADES][TEST ] Testing -ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 666716148] Expected: Should print: 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] 0 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 670119618] Running -ROT.roundtrip: 1 2 3 -ROT ROT . . . CR +[Hera] 3 2 1 +[Hera] [HADES][TEST ] [KRELTSC: 676468800] Test passed +[Hera] [HADES][TEST ] Testing -ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 678136410] Expected: Should restore original order +[Hera] 3 2 1 +[Hera] 3 2 1 +[Hera] 3 2 1 +[Hera] 3 2 1 +[Hera] 3 2 1 +[Hera] [HADES][TEST ] [KRELTSC: 681455691] Running -ROT.two_items: 1 2 -ROT +[Hera] [HADES][ERROR] [KRELTSC: 682678080] -ROT: Insufficient stack items (need 3) +[Hera] [HADES][TEST ] [KRELTSC: 684001962] Expected error occurred +[Hera] [HADES][TEST ] Testing -ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 690649197] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 691884648] Running -ROT.empty_stack: -ROT +[Hera] [HADES][ERROR] [KRELTSC: 692998803] -ROT: Insufficient stack items (need 3) +[Hera] [HADES][TEST ] [KRELTSC: 694109661] Expected error occurred +[Hera] [HADES][TEST ] Testing -ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 695850939] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 696949680] -ROT: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 698444691] === Stack Words Summary: 0 passed, 0 failed, 0 skipped, 0 error +[Hera] [HADES][INFO ] [KRELTSC: 705092304] +[Hera] === Testing Module: Return Stack Words === +[Hera] [HADES][INFO ] [KRELTSC: 706619718] Running Return Stack Words Tests (Module 2)... +[Hera] [HADES][TEST ] [KRELTSC: 707853426] ▶ Testing module: v3/src/test_runner/modules/return_stack_wor +[Hera] [HADES][TEST ] [KRELTSC: 709172940] Testing word: >R +[Hera] [HADES][TEST ] [KRELTSC: 710035788] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 710950905] Running >R.basic: 42 >R R@ . R> . CR +[Hera] 42 42 +[Hera] [HADES][TEST ] [KRELTSC: 713090637] Test passed +[Hera] [HADES][TEST ] Testing >R ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 719809545] Expected: Should print: 42 42 +[Hera] 42 42 +[Hera] 42 42 +[Hera] 42 42 +[Hera] 42 42 +[Hera] 42 42 +[Hera] [HADES][TEST ] [KRELTSC: 723106167] Running >R.zero: 0 >R R@ . R> . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 724493889] Test passed +[Hera] [HADES][TEST ] Testing >R ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 726156291] Expected: Should print: 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 735240576] Running >R.negative: -123 >R R@ . R> . CR +[Hera] -123 -123 +[Hera] [HADES][TEST ] [KRELTSC: 736769628] Test passed +[Hera] [HADES][TEST ] Testing >R ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 738392928] Expected: Should print: -123 -123 +[Hera] -123 -123 +[Hera] -123 -123 +[Hera] -123 -123 [HADES][INFO ] [KRELTSC: 740928153] L8[TABLE]: Config 5 → 6 regime=2 score=26214 L1=0 L2=0 L3=0 L + +[Hera] -123 -123 +[Hera] -123 -123 +[Hera] [HADES][TEST ] [KRELTSC: 748956768] Running >R.multiple: 1 2 >R >R R@ . R> . R@ . R> . CR +[Hera] 1 1 2 2 +[Hera] [HADES][TEST ] [KRELTSC: 750652287] Test passed +[Hera] [HADES][TEST ] Testing >R ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 752269560] Expected: Should print: 2 2 1 1 +[Hera] 1 1 2 2 +[Hera] 1 1 2 2 +[Hera] 1 1 2 2 +[Hera] 1 1 2 2 +[Hera] 1 1 2 2 +[Hera] [HADES][TEST ] [KRELTSC: 755793255] Running >R.empty_stack: >R +[Hera] [HADES][ERROR] [KRELTSC: 757014048] >R: DSP underflow +[Hera] [HADES][TEST ] [KRELTSC: 758018625] Expected error occurred +[Hera] [HADES][TEST ] Testing >R ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 764091510] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 765264129] >R: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 766440465] ▶ Testing module: v3/src/test_runner/modules/return_stack_wor +[Hera] [HADES][TEST ] [KRELTSC: 767707542] Testing word: R> +[Hera] [HADES][TEST ] [KRELTSC: 768571671] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 769483743] Running R>.basic: 42 >R R> . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 771231510] Test passed +[Hera] [HADES][TEST ] Testing R> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 777731892] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 780762969] Running R>.lifo_order: 1 2 >R >R R> . R> . CR +[Hera] 1 2 +[Hera] [HADES][TEST ] [KRELTSC: 782262936] Test passed +[Hera] [HADES][TEST ] Testing R> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 783894048] Expected: Should print: 2 1 +[Hera] 1 2 +[Hera] 1 2 +[Hera] 1 2 +[Hera] 1 2 +[Hera] 1 2 +[Hera] [HADES][TEST ] [KRELTSC: 787261755] Running R>.empty_rstack: R> +[Hera] [HADES][ERROR] [KRELTSC: 792858507] R>: RSP underflow +[Hera] [HADES][TEST ] [KRELTSC: 793762137] Expected error occurred +[Hera] [HADES][TEST ] Testing R> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 795503352] Expected: Should cause return stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 796694157] R>: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 797761041] ▶ Testing module: v3/src/test_runner/modules/return_stack_wor +[Hera] [HADES][TEST ] [KRELTSC: 799103886] Testing word: R@ +[Hera] [HADES][TEST ] [KRELTSC: 800312415] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 801240363] Running R@.basic: 42 >R R@ . R> DROP CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 807877119] Test passed +[Hera] [HADES][TEST ] Testing R@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 809520894] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 812476854] Running R@.non_destructive: 99 >R R@ R@ = . R> DROP CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 814715160] Test passed +[Hera] [HADES][TEST ] Testing R@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 821019906] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 [HADES][INFO ] [KRELTSC: 823388118] L8[TABLE]: Config 6 → 7 regime=2 score=26214 L1=0 L2=0 L3=0 L + +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 825423564] Running R@.empty_rstack: R@ +[Hera] [HADES][ERROR] [KRELTSC: 826466445] R@: RSP underflow +[Hera] [HADES][TEST ] [KRELTSC: 827354724] Expected error occurred +[Hera] [HADES][TEST ] Testing R@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 829323663] Expected: Should cause return stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 835448838] R@: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 838378107] === Return Stack Words Summary: 0 passed, 0 failed, 0 skipped, +[Hera] [HADES][INFO ] [KRELTSC: 839633529] +[Hera] === Testing Module: Memory Words === +[Hera] [HADES][INFO ] [KRELTSC: 840986013] Running Memory Words Tests (Module 3)... +[Hera] [HADES][TEST ] [KRELTSC: 842150841] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 843734745] Testing word: ! +[Hera] [HADES][TEST ] [KRELTSC: 849261462] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 850607835] Running !.basic: 42 HERE ! HERE @ . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 852541431] Test passed +[Hera] [HADES][TEST ] Testing ! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 854187285] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 857330544] Running !.zero: 0 HERE ! HERE @ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 859030200] Test passed +[Hera] [HADES][TEST ] Testing ! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 865649967] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 868722708] Running !.negative: -999 HERE ! HERE @ . CR +[Hera] -999 +[Hera] [HADES][TEST ] [KRELTSC: 870217614] Test passed +[Hera] [HADES][TEST ] Testing ! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 871858050] Expected: Should print: -999 +[Hera] -999 +[Hera] -999 +[Hera] -999 +[Hera] -999 +[Hera] -999 +[Hera] [HADES][TEST ] [KRELTSC: 880043031] Running !.overwrite: 111 HERE ! 222 HERE ! HERE @ . CR +[Hera] 222 +[Hera] [HADES][TEST ] [KRELTSC: 881705559] Test passed +[Hera] [HADES][TEST ] Testing ! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 883354857] Expected: Should print: 222 +[Hera] 222 +[Hera] 222 +[Hera] 222 +[Hera] 222 +[Hera] 222 +[Hera] [HADES][TEST ] [KRELTSC: 886490220] Running !.max_int: 2147483647 HERE ! HERE @ . CR +[Hera] 2147483647 +[Hera] [HADES][TEST ] [KRELTSC: 888359619] Test passed +[Hera] [HADES][TEST ] Testing ! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 889975422] Expected: Should store max int +[Hera] 2147483647 +[Hera] 2147483647 +[Hera] 2147483647 +[Hera] 2147483647 +[Hera] 2147483647 +[Hera] [HADES][TEST ] [KRELTSC: 897720159] Running !.min_int: -2147483648 HERE ! HERE @ . CR +[Hera] -2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 899334450] Test passed +[Hera] [HADES][TEST ] Testing ! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 901019553] Expected: Should store min int +[Hera] [HADES][INFO ] [KRELTSC: 902418909] L8[TABLE]: Config 7 → 8 regime=2 score=6553 L1=0 L2=0 L3=0 L4 +[Hera] -2147483648 +[Hera] -2147483648 +[Hera] -2147483648 +[Hera] -2147483648 +[Hera] -2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 911309847] Running !.empty_stack: ! +[Hera] [HADES][TEST ] [KRELTSC: 912391116] Expected error occurred +[Hera] [HADES][TEST ] Testing ! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 914098038] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 915190941] Running !.one_item: 42 ! +[Hera] [HADES][TEST ] [KRELTSC: 916574673] Expected error occurred +[Hera] [HADES][TEST ] Testing ! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 918400245] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 926500218] !: 8 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 927649233] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 929027799] Testing word: @ +[Hera] [HADES][TEST ] [KRELTSC: 929828130] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 931045206] Running @.after_store: 123 HERE ! HERE @ . CR +[Hera] 123 +[Hera] [HADES][TEST ] [KRELTSC: 937021743] Test passed +[Hera] [HADES][TEST ] Testing @ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 938678685] Expected: Should print: 123 +[Hera] 123 +[Hera] 123 +[Hera] 123 +[Hera] 123 +[Hera] 123 +[Hera] [HADES][TEST ] [KRELTSC: 941886603] Running @.multiple_reads: 456 HERE ! HERE @ HERE @ = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 943463283] Test passed +[Hera] [HADES][TEST ] Testing @ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 945261639] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 953224482] Running @.empty_stack: @ +[Hera] [HADES][TEST ] [KRELTSC: 954119019] Expected error occurred +[Hera] [HADES][TEST ] Testing @ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 955582110] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 956863236] @: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 957998559] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 959335482] Testing word: C! +[Hera] [HADES][TEST ] [KRELTSC: 960401652] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 961308747] Running C!.basic: 65 HERE C! HERE C@ . CR +[Hera] 65 +[Hera] [HADES][TEST ] [KRELTSC: 967949829] Test passed +[Hera] [HADES][TEST ] Testing C! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 969688566] Expected: Should print: 65 +[Hera] 65 +[Hera] 65 +[Hera] 65 +[Hera] 65 +[Hera] 65 +[Hera] [HADES][TEST ] [KRELTSC: 972793752] Running C!.zero: 0 HERE C! HERE C@ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 974398362] Test passed +[Hera] [HADES][TEST ] Testing C! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 976135902] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 983649534] Running C!.high_byte: 255 HERE C! HERE C@ . CR +[Hera] 255 +[Hera] [HADES][TEST ] [KRELTSC: 985169577] Test passed +[Hera] [HADES][TEST ] Testing C! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 986787375] Expected: Should print: 255 +[Hera] 255 +[Hera] 255 +[Hera] 255 +[Hera] [HADES][INFO ] [KRELTSC: 989366973] L8[TABLE]: Config 8 → 9 regime=2 score=6553 L1=0 L2=0 L3=0 L4 +[Hera] 255 +[Hera] 255 +[Hera] [HADES][TEST ] [KRELTSC: 991807992] Running C!.truncation: 256 HERE C! HERE C@ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 997643073] Test passed +[Hera] [HADES][TEST ] Testing C! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 999241278] Expected: Should print: 0 (truncated) +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1002276786] C!: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1003698696] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 1005075603] Testing word: C@ +[Hera] [HADES][TEST ] [KRELTSC: 1010454417] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1011403407] Running C@.after_cstore: 97 HERE C! HERE C@ . CR +[Hera] 97 +[Hera] [HADES][TEST ] [KRELTSC: 1013008878] Test passed +[Hera] [HADES][TEST ] Testing C@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1014614958] Expected: Should print: 97 +[Hera] 97 +[Hera] 97 +[Hera] 97 +[Hera] 97 +[Hera] 97 +[Hera] [HADES][TEST ] [KRELTSC: 1017834174] Running C@.zero_byte: 0 HERE C! HERE C@ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1019539437] Test passed +[Hera] [HADES][TEST ] Testing C@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1025699577] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1028873958] C@: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1029987777] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 1031283477] Testing word: , +[Hera] [HADES][TEST ] [KRELTSC: 1032191118] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1033375833] Running ,.basic: 42 , HERE 8 - @ . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 1035112344] Test passed +[Hera] [HADES][TEST ] Testing , ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1041341826] Expected: Should compile 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 1044463182] Running ,.negative: -999 , HERE 8 - @ . CR +[Hera] -999 +[Hera] [HADES][TEST ] [KRELTSC: 1045969617] Test passed +[Hera] [HADES][TEST ] Testing , ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1047886056] Expected: Should compile -999 +[Hera] -999 +[Hera] -999 +[Hera] -999 +[Hera] -999 +[Hera] -999 +[Hera] [HADES][TEST ] [KRELTSC: 1055734176] ,: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1056881721] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 1058223012] Testing word: C, +[Hera] [HADES][TEST ] [KRELTSC: 1059092811] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1060038987] Running C,.basic: 65 C, HERE 1 - C@ . CR +[Hera] 65 +[Hera] [HADES][TEST ] [KRELTSC: 1061941986] Test passed +[Hera] [HADES][TEST ] Testing C, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1063702185] Expected: Should compile byte 65 +[Hera] 65 +[Hera] 65 +[Hera] [HADES][INFO ] [KRELTSC: 1070660934] L8[TABLE]: Config 9 → 10 regime=2 score=6553 L1=0 L2=0 L3=0 L +[Hera] 65 +[Hera] 65 +[Hera] 65 +[Hera] [HADES][TEST ] [KRELTSC: 1073325351] Running C,.zero: 0 C, HERE 1 - C@ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1074777816] Test passed +[Hera] [HADES][TEST ] Testing C, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1076627853] Expected: Should compile byte 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1084747125] C,: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1085934696] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 1087266075] Testing word: 2, +[Hera] [HADES][TEST ] [KRELTSC: 1088113698] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1089057039] Running 2,.roundtrip: 12345 67890 2, HERE 16 - 2@ . . CR +[Hera] 67890 12345 +[Hera] [HADES][TEST ] [KRELTSC: 1091734770] Test passed +[Hera] [HADES][TEST ] Testing 2, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1093390893] Expected: Should print: 67890 12345 +[Hera] 67890 12345 +[Hera] 67890 12345 +[Hera] 67890 12345 +[Hera] 67890 12345 +[Hera] 67890 12345 +[Hera] [HADES][TEST ] [KRELTSC: 1101454536] Running 2,.save-and-verify: 12345 67890 2, HERE 16 - 2@ 67890 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1103330130] Test passed +[Hera] [HADES][TEST ] Testing 2, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1105164312] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1113144732] 2,: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1114341039] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 1115711730] Testing word: HERE +[Hera] [HADES][TEST ] [KRELTSC: 1116674433] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1117628127] Running HERE.basic: HERE HERE = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1119113394] Test passed +[Hera] [HADES][TEST ] Testing HERE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1121044029] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1130406018] Running HERE.after_comma: HERE 42 , HERE SWAP - 1 CELLS = 0 S +[Hera] [HADES][INFO ] [KRELTSC: 1131810645] L8[TABLE]: Config 10 → 11 regime=2 score=6553 L1=0 L2=0 L3=0 +[Hera] [HADES][TEST ] [KRELTSC: 1133491296] Test passed +[Hera] [HADES][TEST ] Testing HERE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1135400742] Expected: Asserts HERE advances by exactly 1 CELLS (8 bytes +[Hera] [HADES][TEST ] [KRELTSC: 1142760885] HERE: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1143931005] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 1145236995] Testing word: ALLOT +[Hera] [HADES][TEST ] [KRELTSC: 1146113661] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1147036380] Running ALLOT.basic: HERE 10 ALLOT HERE SWAP - . CR +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 1148830935] Test passed +[Hera] [HADES][TEST ] Testing ALLOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1150699179] Expected: Should print: 10 +[Hera] 10 +[Hera] 10 +[Hera] 10 +[Hera] 10 +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 1158289776] Running ALLOT.zero: HERE 0 ALLOT HERE SWAP - . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1159853709] Test passed +[Hera] [HADES][TEST ] Testing ALLOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1161496812] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1164641499] Running ALLOT.negative: HERE -4 ALLOT HERE SWAP - . CR +[Hera] -4 +[Hera] [HADES][TEST ] [KRELTSC: 1171865247] Test passed +[Hera] [HADES][TEST ] Testing ALLOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1173566940] Expected: Should print: -4 +[Hera] -4 +[Hera] -4 +[Hera] -4 +[Hera] -4 +[Hera] -4 +[Hera] [HADES][TEST ] [KRELTSC: 1176554631] ALLOT: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1177741719] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 1179237528] Testing word: PAD +[Hera] [HADES][TEST ] [KRELTSC: 1185743412] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1186698135] Running PAD.basic: PAD PAD = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1188152910] Test passed +[Hera] [HADES][TEST ] Testing PAD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1189759578] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 1192793931] Running PAD.different_from_here: PAD HERE = . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1194453666] Test passed +[Hera] [HADES][TEST ] Testing PAD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1201565610] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 [HADES][INFO ] [KRELTSC: 1203333852] L8[TABLE]: Config 11 → 12 regime=2 score=6553 L1=0 L2=0 L3=0 + +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1205596245] PAD: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1206709413] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 1208285379] Testing word: +! +[Hera] [HADES][TEST ] [KRELTSC: 1209153939] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1214559696] Running +!.basic: 10 HERE ! 5 HERE +! HERE @ . CR +[Hera] 15 +[Hera] [HADES][TEST ] [KRELTSC: 1216340790] Test passed +[Hera] [HADES][TEST ] Testing +! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1217937714] Expected: Should print: 15 +[Hera] 15 +[Hera] 15 +[Hera] 15 +[Hera] 15 +[Hera] 15 +[Hera] [HADES][TEST ] [KRELTSC: 1220887416] Running +!.by_zero: 42 HERE ! 0 HERE +! HERE @ . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 1222741401] Test passed +[Hera] [HADES][TEST ] Testing +! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1228814097] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 1232016954] Running +!.negative: 10 HERE ! -3 HERE +! HERE @ . CR +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 1233564024] Test passed +[Hera] [HADES][TEST ] Testing +! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1235201667] Expected: Should print: 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 1238476701] Running +!.accumulate: 0 HERE ! 1 HERE +! 2 HERE +! 3 HERE +! +[Hera] 6 +[Hera] [HADES][TEST ] [KRELTSC: 1244704545] Test passed +[Hera] [HADES][TEST ] Testing +! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1246282485] Expected: Should print: 6 +[Hera] 6 +[Hera] 6 +[Hera] [HADES][INFO ] [KRELTSC: 1248191910] L8[TABLE]: Config 12 → 13 regime=2 score=6553 L1=0 L2=0 L3=0 +[Hera] 6 +[Hera] 6 +[Hera] 6 +[Hera] [HADES][TEST ] [KRELTSC: 1250835474] Running +!.empty_stack: +! +[Hera] [HADES][TEST ] [KRELTSC: 1252091484] Expected error occurred +[Hera] [HADES][TEST ] Testing +! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1258279701] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1259376048] +!: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1260471513] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 1261735944] Testing word: -! +[Hera] [HADES][TEST ] [KRELTSC: 1262564520] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1263475479] Running -!.basic: 10 HERE ! 3 HERE -! HERE @ . CR +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 1265432469] Test passed +[Hera] [HADES][TEST ] Testing -! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1267168266] Expected: Should print: 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 1274865648] Running -!.by_zero: 42 HERE ! 0 HERE -! HERE @ . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 1276399194] Test passed +[Hera] [HADES][TEST ] Testing -! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1278015333] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 1281336945] Running -!.negative: 10 HERE ! -5 HERE -! HERE @ . CR +[Hera] 15 +[Hera] [HADES][TEST ] [KRELTSC: 1287523167] Test passed +[Hera] [HADES][TEST ] Testing -! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1289169147] Expected: Should print: 15 +[Hera] 15 +[Hera] 15 +[Hera] 15 +[Hera] 15 +[Hera] 15 +[Hera] [HADES][TEST ] [KRELTSC: 1292194596] Running -!.empty_stack: -! +[Hera] [HADES][TEST ] [KRELTSC: 1293223743] Expected error occurred +[Hera] [HADES][TEST ] Testing -! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1295124117] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1296320277] -!: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1302031605] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 1303389717] Testing word: 2! +[Hera] [HADES][TEST ] [KRELTSC: 1304256345] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1305230808] Running 2!.basic: 11 22 HERE 2! HERE @ . HERE 8 + @ . CR +[Hera] 11 22 +[Hera] [HADES][TEST ] [KRELTSC: 1307298762] Test passed +[Hera] [HADES][TEST ] Testing 2! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1308940248] Expected: Should print: 22 11 +[Hera] 11 22 +[Hera] 11 22 [HADES][INFO ] [KRELTSC: 1311162804] L8[TABLE]: Config 13 → 14 regime=2 score=6553 L1=0 L2=0 L3=0 + +[Hera] 11 22 +[Hera] 11 22 +[Hera] 11 22 +[Hera] [HADES][TEST ] [KRELTSC: 1318712787] Running 2!.zeros: 0 0 HERE 2! HERE @ . HERE 8 + @ . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 1320344046] Test passed +[Hera] [HADES][TEST ] Testing 2! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1322048784] Expected: Should print: 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 1330416654] Running 2!.negative: -1 -2 HERE 2! HERE @ . HERE 8 + @ . CR +[Hera] -1 -2 +[Hera] [HADES][TEST ] [KRELTSC: 1332173304] Test passed +[Hera] [HADES][TEST ] Testing 2! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1333818990] Expected: Should print: -2 -1 +[Hera] -1 -2 +[Hera] -1 -2 +[Hera] -1 -2 +[Hera] -1 -2 +[Hera] -1 -2 +[Hera] [HADES][TEST ] [KRELTSC: 1337061768] Running 2!.empty_stack: 2! +[Hera] [HADES][TEST ] [KRELTSC: 1338153159] Expected error occurred +[Hera] [HADES][TEST ] Testing 2! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1339945383] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1345661583] 2!: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1346721621] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 1348002684] Testing word: FILL +[Hera] [HADES][TEST ] [KRELTSC: 1348851357] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1349835060] Running FILL.basic: HERE 8 65 FILL HERE C@ . HERE 1+ C@ . CR +[Hera] 65 65 +[Hera] [HADES][TEST ] [KRELTSC: 1351997976] Test passed +[Hera] [HADES][TEST ] Testing FILL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1353947448] Expected: Should print: 65 65 +[Hera] 65 65 +[Hera] 65 65 +[Hera] 65 65 +[Hera] 65 65 [HADES][INFO ] [KRELTSC: 1361513307] L8[TABLE]: Config 14 → 15 regime=2 score=6553 L1=0 L2=0 L3=0 + +[Hera] 65 65 +[Hera] [HADES][TEST ] [KRELTSC: 1363111659] Running FILL.zero_n: HERE 0 88 FILL +[Hera] [HADES][TEST ] [KRELTSC: 1364152440] Test passed +[Hera] [HADES][TEST ] Testing FILL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1365766584] Expected: Should do nothing +[Hera] [HADES][TEST ] [KRELTSC: 1367087505] Running FILL.zero_byte: HERE 4 0 FILL HERE C@ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1373401386] Test passed +[Hera] [HADES][TEST ] Testing FILL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1375273809] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1378209756] Running FILL.empty_stack: FILL +[Hera] [HADES][TEST ] [KRELTSC: 1379287875] Expected error occurred +[Hera] [HADES][TEST ] Testing FILL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1381033710] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1382316138] FILL: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1387965810] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 1389585372] Testing word: MOVE +[Hera] [HADES][TEST ] [KRELTSC: 1390459035] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1391384694] Running MOVE.basic: HERE 65 OVER C! HERE 1+ 66 OVER C! HERE H +[Hera] 65 66 +[Hera] [HADES][TEST ] [KRELTSC: 1393534695] Test passed +[Hera] [HADES][TEST ] Testing MOVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1395171939] Expected: Should print: 65 66 +[Hera] 65 66 +[Hera] 65 66 +[Hera] 65 66 +[Hera] 65 66 +[Hera] 65 66 +[Hera] [HADES][TEST ] [KRELTSC: 1404611817] Running MOVE.zero_n: HERE HERE 8 + 0 MOVE +[Hera] [HADES][TEST ] [KRELTSC: 1405824231] Test passed +[Hera] [HADES][TEST ] Testing MOVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1407412818] Expected: Should do nothing +[Hera] [HADES][INFO ] [KRELTSC: 1408559838] L8[TABLE]: Config 15 → 16 regime=2 score=26214 L1=0 L2=0 L3=1 +[Hera] [HADES][TEST ] [KRELTSC: 1410292905] Running MOVE.empty_stack: MOVE +[Hera] [HADES][TEST ] [KRELTSC: 1411555299] Expected error occurred +[Hera] [HADES][TEST ] Testing MOVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1418036760] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1419157320] MOVE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1420283235] ▶ Testing module: v3/src/test_runner/modules/memory_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 1421526834] Testing word: ERASE +[Hera] [HADES][TEST ] [KRELTSC: 1422416772] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1423368219] Running ERASE.basic: HERE 4 65 FILL HERE 4 ERASE HERE C@ . HE +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 1425294570] Test passed +[Hera] [HADES][TEST ] Testing ERASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1427194083] Expected: Should print: 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 1435151130] Running ERASE.zero_n: HERE 0 ERASE +[Hera] [HADES][TEST ] [KRELTSC: 1436168538] Test passed +[Hera] [HADES][TEST ] Testing ERASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1437790242] Expected: Should do nothing +[Hera] [HADES][TEST ] [KRELTSC: 1439027961] Running ERASE.empty_stack: ERASE +[Hera] [HADES][TEST ] [KRELTSC: 1440241194] Expected error occurred +[Hera] [HADES][TEST ] Testing ERASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1446726120] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1449029589] ERASE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1450244418] === Memory Words Summary: 0 passed, 0 failed, 0 skipped, 0 erro +[Hera] [HADES][INFO ] [KRELTSC: 1451460150] +[Hera] === Testing Module: Arithmetic Words === +[Hera] [HADES][INFO ] [KRELTSC: 1452815280] Running Arithmetic Words Tests (Module 5)... +[Hera] [HADES][TEST ] [KRELTSC: 1453937688] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 1455320496] Testing word: + +[Hera] [HADES][TEST ] [KRELTSC: 1456225659] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1462186467] Running +.basic: 5 7 + . CR +[Hera] 12 +[Hera] [HADES][TEST ] [KRELTSC: 1463658546] Test passed +[Hera] [HADES][TEST ] Testing + ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1465329789] Expected: Should print: 12 +[Hera] 12 +[Hera] 12 +[Hera] 12 +[Hera] 12 +[Hera] 12 +[Hera] [HADES][TEST ] [KRELTSC: 1468321638] Running +.zero_add: 42 0 + . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 1469700162] Test passed +[Hera] [HADES][TEST ] Testing + ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1475895540] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 1478908179] Running +.negative: -5 3 + . CR +[Hera] -2 +[Hera] [HADES][TEST ] [KRELTSC: 1480261986] Test passed +[Hera] [HADES][TEST ] Testing + ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1481890830] Expected: Should print: -2 +[Hera] -2 +[Hera] -2 +[Hera] -2 +[Hera] -2 +[Hera] -2 +[Hera] [HADES][TEST ] [KRELTSC: 1484758926] Running +.both_negative: -5 -3 + . CR +[Hera] -8 +[Hera] [HADES][TEST ] [KRELTSC: 1490464353] Test passed +[Hera] [HADES][TEST ] Testing + ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1492091034] Expected: Should print: -8 +[Hera] -8 +[Hera] -8 +[Hera] -8 +[Hera] -8 +[Hera] [HADES][INFO ] [KRELTSC: 1509948804] L8[TABLE]: Config 16 → 18 regime=2 score=26214 L1=0 L2=0 L3=1 +[Hera] -8 +[Hera] [HADES][TEST ] [KRELTSC: 1511779101] Running +.overflow: 2147483647 1 + . CR +[Hera] 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 1513249584] Test passed +[Hera] [HADES][TEST ] Testing + ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1514849322] Expected: Should overflow +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 1522575747] Running +.underflow: -2147483648 -1 + . CR +[Hera] -2147483649 +[Hera] [HADES][TEST ] [KRELTSC: 1524265155] Test passed +[Hera] [HADES][TEST ] Testing + ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1525856304] Expected: Should underflow +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] [HADES][TEST ] [KRELTSC: 1529106390] Running +.empty_stack: + +[Hera] [HADES][ERROR] [KRELTSC: 1534522752] +: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1535463363] Expected error occurred +[Hera] [HADES][TEST ] Testing + ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1537421151] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1538583837] Running +.one_item: 42 + +[Hera] [HADES][ERROR] [KRELTSC: 1539644106] +: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1540485009] Expected error occurred +[Hera] [HADES][TEST ] Testing + ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1542211293] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1543270806] +: 8 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1549029069] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 1550249568] Testing word: - +[Hera] [HADES][TEST ] [KRELTSC: 1551091332] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1552023102] Running -.basic: 10 3 - . CR +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 1553410593] Test passed +[Hera] [HADES][TEST ] Testing - ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1555028790] Expected: Should print: 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 1557806712] Running -.zero_sub: 42 0 - . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 1563507078] Test passed +[Hera] [HADES][TEST ] Testing - ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1565058789] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 1567942173] Running -.from_zero: 0 5 - . CR +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 1569238230] Test passed +[Hera] [HADES][TEST ] Testing - ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1570785573] Expected: Should print: -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 1578083346] Running -.negative: 5 -3 - . CR +[Hera] 8 +[Hera] [HADES][TEST ] [KRELTSC: 1579402776] Test passed +[Hera] [HADES][TEST ] Testing - ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1580975445] Expected: Should print: 8 +[Hera] 8 +[Hera] 8 +[Hera] 8 +[Hera] 8 +[Hera] 8 +[Hera] [HADES][TEST ] [KRELTSC: 1583743077] Running -.same_values: 42 42 - . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1585146780] Test passed +[Hera] [HADES][TEST ] Testing - ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1586889591] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1594119702] Running -.overflow: -2147483648 1 - . CR +[Hera] -2147483649 +[Hera] [HADES][TEST ] [KRELTSC: 1595625738] Test passed +[Hera] [HADES][TEST ] Testing - ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1597260609] Expected: Should underflow +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] [HADES][TEST ] [KRELTSC: 1600899048] Running -.underflow: 2147483647 -1 - . CR +[Hera] 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 1606926174] Test passed +[Hera] [HADES][TEST ] Testing - ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1608484479] Expected: Should overflow +[Hera] 2147483648 +[Hera] [HADES][INFO ] [KRELTSC: 1610005740] L8[TABLE]: Config 18 → 19 regime=2 score=26214 L1=0 L2=0 L3=1 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 1613237346] Running -.empty_stack: - +[Hera] [HADES][ERROR] [KRELTSC: 1614252843] -: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1615169094] Expected error occurred +[Hera] [HADES][TEST ] Testing - ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1616926416] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1622551308] Running -.one_item: 42 - +[Hera] [HADES][ERROR] [KRELTSC: 1624886277] -: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1626047031] Expected error occurred +[Hera] [HADES][TEST ] Testing - ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1627773462] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1628886882] -: 9 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1630167042] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 1635671478] Testing word: * +[Hera] [HADES][TEST ] [KRELTSC: 1636831959] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1637765283] Running *.basic: 6 7 * . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 1639279992] Test passed +[Hera] [HADES][TEST ] Testing * ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1640879310] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 1644013623] Running *.by_zero: 42 0 * . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1645500927] Test passed +[Hera] [HADES][TEST ] Testing * ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1651585782] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1654480254] Running *.by_one: 42 1 * . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 1655883558] Test passed +[Hera] [HADES][TEST ] Testing * ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1657419708] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 1660230516] Running *.by_negative: 6 -7 * . CR +[Hera] -42 +[Hera] [HADES][TEST ] [KRELTSC: 1665841695] Test passed +[Hera] [HADES][TEST ] Testing * ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1667458359] Expected: Should print: -42 +[Hera] -42 +[Hera] -42 +[Hera] -42 +[Hera] -42 +[Hera] -42 +[Hera] [HADES][TEST ] [KRELTSC: 1670501301] Running *.negative_negative: -6 -7 * . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 1671960591] Test passed +[Hera] [HADES][TEST ] Testing * ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1673578473] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 1682138409] Running *.large_numbers: 32767 2 * . CR +[Hera] 65534 +[Hera] [HADES][TEST ] [KRELTSC: 1683602676] Test passed +[Hera] [HADES][TEST ] Testing * ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1685198865] Expected: Should print: 65534 +[Hera] 65534 +[Hera] 65534 +[Hera] 65534 +[Hera] 65534 +[Hera] 65534 +[Hera] [HADES][TEST ] [KRELTSC: 1688173410] Running *.overflow: 65536 65536 * . CR +[Hera] 4294967296 +[Hera] [HADES][TEST ] [KRELTSC: 1694637147] Test passed +[Hera] [HADES][TEST ] Testing * ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1696344111] Expected: May overflow +[Hera] 4294967296 +[Hera] 4294967296 +[Hera] 4294967296 +[Hera] 4294967296 +[Hera] 4294967296 +[Hera] [HADES][TEST ] [KRELTSC: 1699608162] Running *.empty_stack: * +[Hera] [HADES][ERROR] [KRELTSC: 1700606817] *: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1701520506] Expected error occurred +[Hera] [HADES][TEST ] Testing * ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1703392824] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1709460018] Running *.one_item: 42 * +[Hera] [HADES][ERROR] [KRELTSC: 1710924558] *: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1711801917] Expected error occurred +[Hera] [HADES][TEST ] Testing * ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1713481539] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1714627929] *: 9 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1715770098] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 1717134762] Testing word: / +[Hera] [HADES][TEST ] [KRELTSC: 1717967328] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1723654086] Running /.basic: 15 3 / . CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 1726708746] Test passed +[Hera] [HADES][TEST ] Testing / ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1728271902] Expected: Should print: 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] [HADES][INFO ] [KRELTSC: 1730410479] L8[TABLE]: Config 19 → 20 regime=2 score=26214 L1=0 L2=0 L3=1 +[Hera] 5 +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 1732551975] Running /.by_one: 42 1 / . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 1733913552] Test passed +[Hera] [HADES][TEST ] Testing / ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1741575045] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 1744507779] Running /.negative_dividend: -15 3 / . CR +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 1745929542] Test passed +[Hera] [HADES][TEST ] Testing / ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1747565190] Expected: Should print: -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 1756788096] Running /.negative_divisor: 15 -3 / . CR +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 1758836415] Test passed +[Hera] [HADES][TEST ] Testing / ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1760426850] Expected: Should print: -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 1770471297] Running /.both_negative: -15 -3 / . CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 1771843143] Test passed +[Hera] [HADES][TEST ] Testing / ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1773426585] Expected: Should print: 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 1776239031] Running /.truncation: 7 3 / . CR +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 1783284069] Test passed +[Hera] [HADES][TEST ] Testing / ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1784969256] Expected: Should print: 2 (truncated) +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 1787882019] Running /.by_zero: 42 0 / +[Hera] [HADES][ERROR] [KRELTSC: 1788910137] /: Division by zero +[Hera] [HADES][TEST ] [KRELTSC: 1789847703] Expected error occurred +[Hera] [HADES][TEST ] Testing / ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1791686946] Expected: Should cause division by zero +[Hera] [HADES][TEST ] [KRELTSC: 1798963152] Running /.empty_stack: / +[Hera] [HADES][ERROR] [KRELTSC: 1800418851] /: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1801287600] Expected error occurred +[Hera] [HADES][TEST ] Testing / ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1802936667] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1804008969] Running /.one_item: 42 / +[Hera] [HADES][ERROR] [KRELTSC: 1805046558] /: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1805916525] Expected error occurred +[Hera] [HADES][TEST ] Testing / ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1814621802] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1815768381] /: 9 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1816872288] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 1818177606] Testing word: MOD +[Hera] [HADES][TEST ] [KRELTSC: 1819076973] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1820080059] Running MOD.basic: 17 5 MOD . CR +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 1827627606] Test passed +[Hera] [HADES][TEST ] Testing MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1829301495] Expected: Should print: 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 1832127381] Running MOD.exact_division: 15 3 MOD . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1833557544] Test passed +[Hera] [HADES][TEST ] Testing MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1835208396] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1844288208] Running MOD.by_one: 42 1 MOD . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1845612006] Test passed +[Hera] [HADES][TEST ] Testing MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1847203533] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 1856255058] Running MOD.negative_dividend: -17 5 MOD . CR +[Hera] [HADES][INFO ] [KRELTSC: 1857439164] L8[TABLE]: Config 20 → 21 regime=2 score=26214 L1=0 L2=0 L3=1 +[Hera] -2 +[Hera] [HADES][TEST ] [KRELTSC: 1859066811] Test passed +[Hera] [HADES][TEST ] Testing MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1860724530] Expected: Should handle negative +[Hera] -2 +[Hera] -2 +[Hera] -2 +[Hera] -2 +[Hera] -2 +[Hera] [HADES][TEST ] [KRELTSC: 1863708945] Running MOD.negative_divisor: 17 -5 MOD . CR +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 1871154117] Test passed +[Hera] [HADES][TEST ] Testing MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1872728466] Expected: Should handle negative +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 1875753306] Running MOD.small_by_large: 3 7 MOD . CR +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 1877230236] Test passed +[Hera] [HADES][TEST ] Testing MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1883471625] Expected: Should print: 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 1888095888] Running MOD.by_zero: 42 0 MOD +[Hera] [HADES][ERROR] [KRELTSC: 1889209329] MOD: Division by zero +[Hera] [HADES][TEST ] [KRELTSC: 1890189420] Expected error occurred +[Hera] [HADES][TEST ] Testing MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1891991325] Expected: Should cause division by zero +[Hera] [HADES][TEST ] [KRELTSC: 1893271905] Running MOD.empty_stack: MOD +[Hera] [HADES][ERROR] [KRELTSC: 1899986844] MOD: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1901155809] Expected error occurred +[Hera] [HADES][TEST ] Testing MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1902948117] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1904086716] Running MOD.one_item: 42 MOD +[Hera] [HADES][ERROR] [KRELTSC: 1905208536] MOD: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1906115862] Expected error occurred +[Hera] [HADES][TEST ] Testing MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1908076359] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1914376842] MOD: 9 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1915907784] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 1917195798] Testing word: /MOD +[Hera] [HADES][TEST ] [KRELTSC: 1918068726] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1918959777] Running /MOD.basic: 17 5 /MOD . . CR +[Hera] 3 2 +[Hera] [HADES][TEST ] [KRELTSC: 1920665019] Test passed +[Hera] [HADES][TEST ] Testing /MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1922558568] Expected: Should print: 3 2 +[Hera] 3 2 +[Hera] 3 2 +[Hera] 3 2 +[Hera] 3 2 +[Hera] 3 2 +[Hera] [HADES][TEST ] [KRELTSC: 1931254584] Running /MOD.exact: 15 3 /MOD . . CR +[Hera] 5 0 +[Hera][39m [HADES][TEST ] [KRELTSC: 1932666204] Test passed +[Hera] [HADES][TEST ] Testing /MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1934276757] Expected: Should print: 5 0 +[Hera] 5 0 +[Hera] 5 0 +[Hera] 5 0 +[Hera] 5 0 +[Hera] 5 0 +[Hera] [HADES][TEST ] [KRELTSC: 1937289081] Running /MOD.negative: -17 5 /MOD . . CR +[Hera] -3 -2 +[Hera] [HADES][TEST ] [KRELTSC: 1944154002] Test passed +[Hera] [HADES][TEST ] Testing /MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1945963299] Expected: Should handle negative dividend +[Hera] -3 -2 +[Hera] -3 -2 +[Hera] -3 -2 +[Hera] -3 -2 +[Hera] -3 -2 +[Hera] [HADES][TEST ] [KRELTSC: 1949226888] Running /MOD.by_zero: 42 0 /MOD +[Hera] [HADES][ERROR] [KRELTSC: 1950353706] /MOD: Division by zero +[Hera] [HADES][TEST ] [KRELTSC: 1951332747] Expected error occurred +[Hera] [HADES][TEST ] Testing /MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1957208778] Expected: Should cause division by zero +[Hera] [HADES][TEST ] [KRELTSC: 1959922902] Running /MOD.empty_stack: /MOD +[Hera] [HADES][ERROR] [KRELTSC: 1960997703] /MOD: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1961964039] Expected error occurred +[Hera] [HADES][TEST ] Testing /MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1963697127] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1964795889] Running /MOD.one_item: 42 /MOD +[Hera] [HADES][ERROR] [KRELTSC: 1966023360] /MOD: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1972291188] Expected error occurred +[Hera] [HADES][TEST ] Testing /MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1974150696] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 1975255191] /MOD: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 1976401623] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 1977711918] Testing word: ABS +[Hera] [HADES][TEST ] [KRELTSC: 1978734555] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 1979689152] Running ABS.positive: 42 ABS . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 1981260603] Test passed +[Hera] [HADES][TEST ] Testing ABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1988910861] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 1991899161] Running ABS.negative: -42 ABS . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 1993318383] Test passed +[Hera] [HADES][TEST ] Testing ABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 1994975955] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 [HADES][INFO ] [KRELTSC: 2003272383] L8[TABLE]: Config 21 → 22 regime=2 score=26214 L1=0 L2=0 L3=1 + +[Hera] [HADES][TEST ] [KRELTSC: 2004443007] Running ABS.zero: 0 ABS . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2005858512] Test passed +[Hera] [HADES][TEST ] Testing ABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2007460623] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2014614126] Running ABS.min_int: -2147483648 ABS . CR +[Hera] 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 2017181418] Test passed +[Hera] [HADES][TEST ] Testing ABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2018877483] Expected: Should print: 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 2022215118] Running ABS.empty_stack: ABS +[Hera] [HADES][ERROR] [KRELTSC: 2023298802] ABS: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2024250543] Expected error occurred +[Hera] [HADES][TEST ] Testing ABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2031603735] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2032726038] ABS: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2033876250] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 2035200363] Testing word: NEGATE +[Hera] [HADES][TEST ] [KRELTSC: 2036100486] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2037053109] Running NEGATE.positive: 42 NEGATE . CR +[Hera] -42 +[Hera] [HADES][TEST ] [KRELTSC: 2038665951] Test passed +[Hera] [HADES][TEST ] Testing NEGATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2040390408] Expected: Should print: -42 +[Hera] -42 +[Hera] -42 +[Hera] -42 +[Hera] -42 +[Hera] -42 +[Hera] [HADES][TEST ] [KRELTSC: 2049794418] Running NEGATE.negative: -42 NEGATE . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 2051254401] Test passed +[Hera] [HADES][TEST ] Testing NEGATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2052902481] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 2061697995] Running NEGATE.zero: 0 NEGATE . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2063032188] Test passed +[Hera] [HADES][TEST ] Testing NEGATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2064669936] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2067426417] Running NEGATE.min_int: -2147483648 NEGATE . CR +[Hera] 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 2073992655] Test passed +[Hera] [HADES][TEST ] Testing NEGATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2076167835] Expected: Should print: 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 2079553791] Running NEGATE.empty_stack: NEGATE +[Hera] [HADES][ERROR] [KRELTSC: 2080648584] NEGATE: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2081638587] Expected error occurred +[Hera] [HADES][TEST ] Testing NEGATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2087707167] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2089148187] NEGATE: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2090257113] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 2091500313] Testing word: MIN +[Hera] [HADES][TEST ] [KRELTSC: 2092336764] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2093245539] Running MIN.basic: 5 3 MIN . CR +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 2094820938] Test passed +[Hera] [HADES][TEST ] Testing MIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2096471874] Expected: Should print: 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 2104916457] Running MIN.equal: 42 42 MIN . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 2106235971] Test passed +[Hera] [HADES][TEST ] Testing MIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2107895580] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 2110640049] Running MIN.negative: -5 -3 MIN . CR +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 2116238439] Test passed +[Hera] [HADES][TEST ] Testing MIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2119556481] Expected: Should print: -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 2122432494] Running MIN.mixed: -1 1 MIN . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2123757972] Test passed +[Hera] [HADES][TEST ] Testing MIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2125406808] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 [HADES][INFO ] [KRELTSC: 2132648784] L8[TABLE]: Config 22 → 23 regime=2 score=52428 L1=0 L2=0 L3=1 + +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2135186298] Running MIN.one_item: 42 MIN +[Hera] [HADES][ERROR] [KRELTSC: 2136259062] MIN: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2137196628] Expected error occurred +[Hera] [HADES][TEST ] Testing MIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2138825493] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2140073103] Running MIN.empty_stack: MIN +[Hera] [HADES][ERROR] [KRELTSC: 2141065899] MIN: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2146352082] Expected error occurred +[Hera] [HADES][TEST ] Testing MIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2149379589] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2150400630] MIN: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2151501723] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 2152808070] Testing word: MAX +[Hera] [HADES][TEST ] [KRELTSC: 2153595297] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2154469737] Running MAX.basic: 5 3 MAX . CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 2156042007] Test passed +[Hera] [HADES][TEST ] Testing MAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2163295323] Expected: Should print: 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 2166123183] Running MAX.equal: 42 42 MAX . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 2167472790] Test passed +[Hera] [HADES][TEST ] Testing MAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2169070113] Expected: Should print: 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 2178122436] Running MAX.negative: -5 -3 MAX . CR +[Hera] -3 +[Hera] [HADES][TEST ] [KRELTSC: 2179498545] Test passed +[Hera] [HADES][TEST ] Testing MAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2181083562] Expected: Should print: -3 +[Hera] -3 +[Hera] -3 +[Hera] -3 +[Hera] -3 +[Hera] -3 +[Hera] [HADES][TEST ] [KRELTSC: 2183892690] Running MAX.mixed: -1 1 MAX . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 2185181397] Test passed +[Hera] [HADES][TEST ] Testing MAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2192569197] Expected: Should print: 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 2195384877] Running MAX.one_item: 42 MAX +[Hera] [HADES][ERROR] [KRELTSC: 2196403104] MAX: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2197317822] Expected error occurred +[Hera] [HADES][TEST ] Testing MAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2198983479] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2204948550] Running MAX.empty_stack: MAX +[Hera] [HADES][ERROR] [KRELTSC: 2206039038] MAX: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2207024925] Expected error occurred +[Hera] [HADES][TEST ] Testing MAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2208801147] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2209929708] MAX: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2211089244] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 2212414764] Testing word: 1+ +[Hera] [HADES][TEST ] [KRELTSC: 2213298633] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2218835892] Running 1+.basic: 5 1+ . CR +[Hera] 6 +[Hera] [HADES][TEST ] [KRELTSC: 2222019954] Test passed +[Hera] [HADES][TEST ] Testing 1+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2223708648] Expected: Should print: 6 +[Hera] 6 +[Hera] 6 +[Hera] 6 +[Hera] 6 +[Hera] 6 +[Hera] [HADES][TEST ] [KRELTSC: 2226603834] Running 1+.zero: 0 1+ . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 2227916838] Test passed +[Hera] [HADES][TEST ] Testing 1+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2234884680] Expected: Should print: 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 2237862312] Running 1+.negative: -1 1+ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2239220823] Test passed +[Hera] [HADES][TEST ] Testing 1+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2240892297] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2248057119] Running 1+.chain: 3 1+ 1+ 1+ . CR +[Hera] 6 +[Hera] [HADES][TEST ] [KRELTSC: 2250153654] Test passed +[Hera] [HADES][TEST ] Testing 1+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2251923954] Expected: Should print: 6 +[Hera] 6 +[Hera] 6 +[Hera] 6 +[Hera] 6 +[Hera] 6 +[Hera] [HADES][TEST ] [KRELTSC: 2254842744] Running 1+.overflow: 2147483647 1+ . CR +[Hera] 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 2256395778] Test passed +[Hera] [HADES][TEST ] Testing 1+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2258028990] Expected: Should overflow +[Hera] 2147483648 +[Hera] 2147483648 [HADES][INFO ] [KRELTSC: 2265166071] L8[TABLE]: Config 23 → 24 regime=2 score=6553 L1=0 L2=0 L3=1 + +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 2267694093] Running 1+.empty_stack: 1+ +[Hera] [HADES][ERROR] [KRELTSC: 2268703227] 1+: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2269680651] Expected error occurred +[Hera] [HADES][TEST ] Testing 1+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2271462963] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2276769516] 1+: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2278994445] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 2280259485] Testing word: 1- +[Hera] [HADES][TEST ] [KRELTSC: 2281107759] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2282059794] Running 1-.basic: 5 1- . CR +[Hera] 4 +[Hera] [HADES][TEST ] [KRELTSC: 2283502200] Test passed +[Hera] [HADES][TEST ] Testing 1- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2285136210] Expected: Should print: 4 +[Hera] 4 +[Hera] 4 +[Hera] 4 +[Hera] 4 +[Hera] 4 +[Hera] [HADES][TEST ] [KRELTSC: 2293689195] Running 1-.to_zero: 1 1- . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2294986869] Test passed +[Hera] [HADES][TEST ] Testing 1- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2296632807] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2299480470] Running 1-.to_negative: 0 1- . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2300903073] Test passed +[Hera] [HADES][TEST ] Testing 1- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2308086858] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2310949200] Running 1-.chain: 6 1- 1- 1- . CR +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 2312279256] Test passed +[Hera] [HADES][TEST ] Testing 1- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2313861942] Expected: Should print: 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 2321989026] Running 1-.underflow: -2147483648 1- . CR +[Hera] -2147483649 +[Hera] [HADES][TEST ] [KRELTSC: 2323805064] Test passed +[Hera] [HADES][TEST ] Testing 1- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2325525174] Expected: Should underflow +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] -2147483649 +[Hera] [HADES][TEST ] [KRELTSC: 2328915519] Running 1-.empty_stack: 1- +[Hera] [HADES][ERROR] [KRELTSC: 2329952016] 1-: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2335109658] Expected error occurred +[Hera] [HADES][TEST ] Testing 1- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2338530705] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2339595510] 1-: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2340711744] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 2342003307] Testing word: 2+ +[Hera] [HADES][TEST ] [KRELTSC: 2342897046] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2343843348] Running 2+.basic: 5 2+ . CR +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 2350256874] Test passed +[Hera] [HADES][TEST ] Testing 2+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2352749931] Expected: Should print: 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 2355589740] Running 2+.zero: 0 2+ . CR +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 2356878804] Test passed +[Hera] [HADES][TEST ] Testing 2+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2358498933] Expected: Should print: 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 2365906998] Running 2+.negative: -3 2+ . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2367212715] Test passed +[Hera] [HADES][TEST ] Testing 2+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2368778412] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2371690062] Running 2+.empty_stack: 2+ +[Hera] [HADES][ERROR] [KRELTSC: 2373061635] 2+: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2373988995] Expected error occurred +[Hera] [HADES][TEST ] Testing 2+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2381904126] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2383043439] 2+: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2384198460] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 2385555648] Testing word: 2- +[Hera] [HADES][TEST ] [KRELTSC: 2386404195] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2387410179] Running 2-.basic: 7 2- . CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 2393954724] Test passed +[Hera] [HADES][TEST ] Testing 2- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2395699845] Expected: Should print: 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 2398641756] Running 2-.zero: 2 2- . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2400047874] Test passed +[Hera] [HADES][TEST ] Testing 2- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2401731990] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][INFO ] [KRELTSC: 2407896372] L8[TABLE]: Config 24 → 25 regime=2 score=6553 L1=0 L2=0 L3=1 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2412045804] Running 2-.negative: 0 2- . CR +[Hera] -2 +[Hera] [HADES][TEST ] [KRELTSC: 2413349463] Test passed +[Hera] [HADES][TEST ] Testing 2- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2414909658] Expected: Should print: -2 +[Hera] -2 +[Hera] -2 +[Hera] -2 +[Hera] -2 +[Hera] -2 +[Hera] [HADES][TEST ] [KRELTSC: 2417958564] Running 2-.empty_stack: 2- +[Hera] [HADES][ERROR] [KRELTSC: 2423657838] 2-: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2424616446] Expected error occurred +[Hera] [HADES][TEST ] Testing 2- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2426418918] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2427460434] 2-: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2428528725] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 2429825076] Testing word: 2* +[Hera] [HADES][TEST ] [KRELTSC: 2430707097] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2431647960] Running 2*.basic: 5 2* . CR +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 2437381485] Test passed +[Hera] [HADES][TEST ] Testing 2* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2440618425] Expected: Should print: 10 +[Hera] 10 +[Hera] 10 +[Hera] 10 +[Hera] 10 +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 2443644651] Running 2*.zero: 0 2* . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2444866179] Test passed +[Hera] [HADES][TEST ] Testing 2* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2446525557] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2454005463] Running 2*.negative: -3 2* . CR +[Hera] -6 +[Hera] [HADES][TEST ] [KRELTSC: 2455444677] Test passed +[Hera] [HADES][TEST ] Testing 2* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2457133371] Expected: Should print: -6 +[Hera] -6 +[Hera] -6 +[Hera] -6 +[Hera] -6 +[Hera] -6 +[Hera] [HADES][TEST ] [KRELTSC: 2460054576] Running 2*.one: 1 2* . CR +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 2461384212] Test passed +[Hera] [HADES][TEST ] Testing 2* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2467871175] Expected: Should print: 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 2470890996] Running 2*.large: 1073741823 2* . CR +[Hera] 2147483646 +[Hera] [HADES][TEST ] [KRELTSC: 2472326787] Test passed +[Hera] [HADES][TEST ] Testing 2* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2473986102] Expected: Should print: 2147483646 +[Hera] 2147483646 +[Hera] 2147483646 +[Hera] 2147483646 +[Hera] 2147483646 +[Hera] 2147483646 +[Hera] [HADES][TEST ] [KRELTSC: 2482018350] Running 2*.empty_stack: 2* +[Hera] [HADES][ERROR] [KRELTSC: 2483172321] 2*: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2484135465] Expected error occurred +[Hera] [HADES][TEST ] Testing 2* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2485926786] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2487000726] 2*: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2488077207] ▶ Testing module: v3/src/test_runner/modules/arithmetic_words +[Hera] [HADES][TEST ] [KRELTSC: 2489379354] Testing word: 2/ +[Hera] [HADES][TEST ] [KRELTSC: 2490278175] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2496021570] Running 2/.basic: 10 2/ . CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 2497643610] Test passed +[Hera] [HADES][TEST ] Testing 2/ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2499321951] Expected: Should print: 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 2502152730] Running 2/.odd: 7 2/ . CR +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 2503440282] Test passed +[Hera] [HADES][TEST ] Testing 2/ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2505088551] Expected: Should print: 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 2513580993] Running 2/.zero: 0 2/ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2514815520] Test passed +[Hera] [HADES][TEST ] Testing 2/ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2516381238] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2519209938] Running 2/.negative_even: -10 2/ . CR +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 2527905366] Test passed +[Hera] [HADES][TEST ] Testing 2/ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2529744231] Expected: Should print: -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 2532743787] Running 2/.one: 1 2/ . CR +[Hera] [HADES][INFO ] [KRELTSC: 2533784190] L8[TABLE]: Config 25 → 26 regime=2 score=6553 L1=0 L2=0 L3=1 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2540440833] Test passed +[Hera] [HADES][TEST ] Testing 2/ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2542282911] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2545119507] Running 2/.empty_stack: 2/ +[Hera] [HADES][ERROR] [KRELTSC: 2546204766] 2/: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2547120282] Expected error occurred +[Hera] [HADES][TEST ] Testing 2/ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2548927941] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2555688345] 2/: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2556902691] === Arithmetic Words Summary: 0 passed, 0 failed, 0 skipped, 0 +[Hera] [HADES][INFO ] [KRELTSC: 2558212923] +[Hera] === Testing Module: Logical Words === +[Hera] [HADES][INFO ] [KRELTSC: 2559649407] Running Logical Words Tests (Module 8)... +[Hera] [HADES][TEST ] [KRELTSC: 2560835760] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 2562162981] Testing word: AND +[Hera] [HADES][TEST ] [KRELTSC: 2563125075] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2568837117] Running AND.both_true: -1 -1 AND . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2571152094] Test passed +[Hera] [HADES][TEST ] Testing AND ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2572813152] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2575746222] Running AND.first_false: 0 -1 AND . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2577548862] Test passed +[Hera] [HADES][TEST ] Testing AND ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2583701127] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2586676176] Running AND.second_false: -1 0 AND . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2588073642] Test passed +[Hera] [HADES][TEST ] Testing AND ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2589665988] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2592615165] Running AND.both_false: 0 0 AND . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2598611673] Test passed +[Hera] [HADES][TEST ] Testing AND ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2600338293] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2603174196] Running AND.bitwise: 85 51 AND . CR +[Hera] 17 +[Hera] [HADES][TEST ] [KRELTSC: 2604526680] Test passed +[Hera] [HADES][TEST ] Testing AND ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2606225958] Expected: Should print: 17 +[Hera] 17 +[Hera] 17 +[Hera] 17 +[Hera] 17 +[Hera] 17 +[Hera] [HADES][TEST ] [KRELTSC: 2613939867] Running AND.empty_stack: AND +[Hera] [HADES][ERROR] [KRELTSC: 2615012316] AND: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2616022500] Expected error occurred +[Hera] [HADES][TEST ] Testing AND ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2617744017] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2618796222] Running AND.one_item: 42 AND +[Hera] [HADES][ERROR] [KRELTSC: 2619877827] AND: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2620867977] Expected error occurred +[Hera] [HADES][TEST ] Testing AND ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2627005080] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2628209976] AND: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2629538898] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 2630818575] Testing word: OR +[Hera] [HADES][TEST ] [KRELTSC: 2631657252] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2632552419] Running OR.both_true: -1 -1 OR . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2634152136] Test passed +[Hera] [HADES][TEST ] Testing OR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2635853493] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2643312714] Running OR.first_false: 0 -1 OR . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2644801068] Test passed +[Hera] [HADES][TEST ] Testing OR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2646450576] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2649432912] Running OR.second_false: -1 0 OR . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2650888338] Test passed +[Hera] [HADES][TEST ] Testing OR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2656736334] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][INFO ] [KRELTSC: 2659046208] L8[TABLE]: Config 26 → 27 regime=2 score=6553 L1=0 L2=0 L3=1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2661124620] Running OR.both_false: 0 0 OR . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2662442853] Test passed +[Hera] [HADES][TEST ] Testing OR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2664040218] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2671344165] Running OR.bitwise: 85 51 OR . CR +[Hera] 119 +[Hera] [HADES][TEST ] [KRELTSC: 2672707338] Test passed +[Hera] [HADES][TEST ] Testing OR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2674344834] Expected: Should print: 119 +[Hera] 119 +[Hera] 119 +[Hera] 119 +[Hera] 119 +[Hera] 119 +[Hera] [HADES][TEST ] [KRELTSC: 2677226370] Running OR.empty_stack: OR +[Hera] [HADES][ERROR] [KRELTSC: 2678404512] OR: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2679400941] Expected error occurred +[Hera] [HADES][TEST ] Testing OR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2685743361] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2686893279] Running OR.one_item: 42 OR +[Hera] [HADES][ERROR] [KRELTSC: 2687999958] OR: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2688896049] Expected error occurred +[Hera] [HADES][TEST ] Testing OR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2690566242] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2691729390] OR: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2692801902] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 2694086346] Testing word: XOR +[Hera] [HADES][TEST ] [KRELTSC: 2698855593] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2700133548] Running XOR.both_true: -1 -1 XOR . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2701842948] Test passed +[Hera] [HADES][TEST ] Testing XOR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2703562344] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2706301836] Running XOR.first_false: 0 -1 XOR . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2707736619] Test passed +[Hera] [HADES][TEST ] Testing XOR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2709434217] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2716855365] Running XOR.second_false: -1 0 XOR . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2718293991] Test passed +[Hera] [HADES][TEST ] Testing XOR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2719915296] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2722765059] Running XOR.both_false: 0 0 XOR . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2724209187] Test passed +[Hera] [HADES][TEST ] Testing XOR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2730038052] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2733055605] Running XOR.bitwise: 85 51 XOR . CR +[Hera] 102 +[Hera] [HADES][TEST ] [KRELTSC: 2734386963] Test passed +[Hera] [HADES][TEST ] Testing XOR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2736011439] Expected: Should print: 102 +[Hera] 102 +[Hera] 102 +[Hera] 102 +[Hera] 102 +[Hera] 102 +[Hera] [HADES][TEST ] [KRELTSC: 2743384959] Running XOR.empty_stack: XOR +[Hera] [HADES][ERROR] [KRELTSC: 2744456148] XOR: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2745465723] Expected error occurred +[Hera] [HADES][TEST ] Testing XOR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2747253012] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2748436887] Running XOR.one_item: 42 XOR +[Hera] [HADES][ERROR] [KRELTSC: 2749471599] XOR: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2750332809] Expected error occurred +[Hera] [HADES][TEST ] Testing XOR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2752085427] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2757483246] XOR: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2758620396] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 2759921892] Testing word: NOT +[Hera] [HADES][TEST ] [KRELTSC: 2760743328] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2761627764] Running NOT.true: -1 NOT . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2763186888] Test passed +[Hera] [HADES][TEST ] Testing NOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2764779486] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2767578450] Running NOT.false: 0 NOT . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2774269953] Test passed +[Hera] [HADES][TEST ] Testing NOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2775861186] Expected: Should print: -1 +[Hera] [HADES][INFO ] [KRELTSC: 2777033259] L8[TABLE]: Config 27 → 28 regime=2 score=6553 L1=0 L2=0 L3=1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2780251425] Running NOT.positive: 42 NOT . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2781867564] Test passed +[Hera] [HADES][TEST ] Testing NOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2789028060] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2791953087] Running NOT.negative: -42 NOT . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2793355488] Test passed +[Hera] [HADES][TEST ] Testing NOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2794999326] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2802598407] Running NOT.empty_stack: NOT +[Hera] [HADES][ERROR] [KRELTSC: 2803565898] NOT: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2804489541] Expected error occurred +[Hera] [HADES][TEST ] Testing NOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2806328826] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2807311437] NOT: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2808410682] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 2809659825] Testing word: = +[Hera] [HADES][TEST ] [KRELTSC: 2810617005] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2811485859] Running =.equal: 42 42 = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2817417813] Test passed +[Hera] [HADES][TEST ] Testing = ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2818942812] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2821612794] Running =.not_equal: 42 43 = . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2822916117] Test passed +[Hera] [HADES][TEST ] Testing = ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2824454661] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2833110504] Running =.zero_equal: 0 0 = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2834380752] Test passed +[Hera] [HADES][TEST ] Testing = ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2835912681] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2838747408] Running =.negative_equal: -42 -42 = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2840194371] Test passed +[Hera] [HADES][TEST ] Testing = ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2846906349] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2849716128] Running =.negative_positive: -42 42 = . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2851081443] Test passed +[Hera] [HADES][TEST ] Testing = ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2852626434] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2860596270] Running =.empty_stack: = +[Hera] [HADES][ERROR] [KRELTSC: 2862472095] =: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2863335342] Expected error occurred +[Hera] [HADES][TEST ] Testing = ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2864952363] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2866001124] Running =.one_item: 42 = +[Hera] [HADES][ERROR] [KRELTSC: 2866939803] =: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2867757186] Expected error occurred +[Hera] [HADES][TEST ] Testing = ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2869500060] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2875552365] =: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2876622630] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 2877895545] Testing word: <> +[Hera] [HADES][TEST ] [KRELTSC: 2878718115] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2879605008] Running <>.not_equal: 42 43 <> . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2881181268] Test passed +[Hera] [HADES][TEST ] Testing <> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2882748435] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2891752269] Running <>.equal: 42 42 <> . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2893095870] Test passed +[Hera] [HADES][TEST ] Testing <> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2894646720] Expected: Should print: 0 +[Hera] [HADES][INFO ] [KRELTSC: 2895618201] L8[TABLE]: Config 28 → 29 regime=2 score=6553 L1=0 L2=0 L3=1 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2898771120] Running <>.zero_equal: 0 0 <> . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2905927248] Test passed +[Hera] [HADES][TEST ] Testing <> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2907723042] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2910393255] Running <>.negative: -42 42 <> . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2911716381] Test passed +[Hera] [HADES][TEST ] Testing <> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2917496211] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2920785924] Running <>.empty_stack: <> +[Hera] [HADES][ERROR] [KRELTSC: 2921820048] <>: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2922706899] Expected error occurred +[Hera] [HADES][TEST ] Testing <> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2924397756] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2925463821] Running <>.one_item: 42 <> +[Hera] [HADES][ERROR] [KRELTSC: 2926405608] <>: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2927284731] Expected error occurred +[Hera] [HADES][TEST ] Testing <> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2933779317] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2934851535] <>: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2935972704] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 2937192237] Testing word: < +[Hera] [HADES][TEST ] [KRELTSC: 2937913461] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2938747602] Running <.less_than: 5 7 < . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2940181041] Test passed +[Hera] [HADES][TEST ] Testing < ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2941756146] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2949026913] Running <.greater_than: 7 5 < . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2950491012] Test passed +[Hera] [HADES][TEST ] Testing < ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2952058830] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2954721084] Running <.equal: 5 5 < . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2955993558] Test passed +[Hera] [HADES][TEST ] Testing < ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2962253532] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 2965015767] Running <.negative_positive: -5 5 < . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2966370939] Test passed +[Hera] [HADES][TEST ] Testing < ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2967801228] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2970567999] Running <.negative_negative: -7 -5 < . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2971979871] Test passed +[Hera] [HADES][TEST ] Testing < ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2977833243] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2980766460] Running <.empty_stack: < +[Hera] [HADES][ERROR] [KRELTSC: 2981648607] <: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2982546924] Expected error occurred +[Hera] [HADES][TEST ] Testing < ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2984187654] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2985256428] Running <.one_item: 42 < +[Hera] [HADES][ERROR] [KRELTSC: 2986201743] <: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2991295713] Expected error occurred +[Hera] [HADES][TEST ] Testing < ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 2992922583] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 2993904732] <: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 2994920628] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 2996132412] Testing word: > +[Hera] [HADES][TEST ] [KRELTSC: 2996952567] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 2997838011] Running >.greater_than: 7 5 > . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 2999413956] Test passed +[Hera] [HADES][TEST ] Testing > ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3005512881] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][INFO ] [KRELTSC: 3007309452] L8[TABLE]: Config 29 → 30 regime=2 score=6553 L1=0 L2=0 L3=1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3009702465] Running >.less_than: 5 7 > . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3011074500] Test passed +[Hera] [HADES][TEST ] Testing > ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3012623040] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3019853046] Running >.equal: 5 5 > . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3021497724] Test passed +[Hera] [HADES][TEST ] Testing > ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3023031984] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3025770657] Running >.positive_negative: 5 -5 > . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3027173562] Test passed +[Hera] [HADES][TEST ] Testing > ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3028901442] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3035984364] Running >.negative_negative: -5 -7 > . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3037375236] Test passed +[Hera] [HADES][TEST ] Testing > ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3038902377] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3041724420] Running >.empty_stack: > +[Hera] [HADES][ERROR] [KRELTSC: 3042706233] >: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3043609212] Expected error occurred +[Hera] [HADES][TEST ] Testing > ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3049850391] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3050899068] Running >.one_item: 42 > +[Hera] [HADES][ERROR] [KRELTSC: 3051874938] >: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3052691607] Expected error occurred +[Hera] [HADES][TEST ] Testing > ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3054447921] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3055509618] >: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3056526396] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 3057807417] Testing word: 0= +[Hera] [HADES][TEST ] [KRELTSC: 3058601910] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3063976965] Running 0=.zero: 0 0= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3065470947] Test passed +[Hera] [HADES][TEST ] Testing 0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3067060311] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3069873996] Running 0=.positive: 42 0= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3071249517] Test passed +[Hera] [HADES][TEST ] Testing 0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3073033530] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3081522150] Running 0=.negative: -42 0= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3082792419] Test passed +[Hera] [HADES][TEST ] Testing 0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3084335583] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3087134778] Running 0=.empty_stack: 0= +[Hera] [HADES][ERROR] [KRELTSC: 3088299606] 0=: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3093744675] Expected error occurred +[Hera] [HADES][TEST ] Testing 0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3095412117] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3096464028] 0=: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3097522953] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 3098665143] Testing word: 0< +[Hera] [HADES][TEST ] [KRELTSC: 3099490212] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3100376307] Running 0<.negative: -42 0< . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3102211581] Test passed +[Hera] [HADES][TEST ] Testing 0< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3108924063] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3111741759] Running 0<.zero: 0 0< . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3113009235] Test passed +[Hera] [HADES][TEST ] Testing 0< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3114534234] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][INFO ] [KRELTSC: 3117002595] L8[TABLE]: Config 30 → 31 regime=2 score=6553 L1=0 L2=0 L3=1 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3123282225] Running 0<.positive: 42 0< . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3124626120] Test passed +[Hera] [HADES][TEST ] Testing 0< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3126188688] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3128815305] Running 0<.empty_stack: 0< +[Hera] [HADES][ERROR] [KRELTSC: 3129789348] 0<: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3130677375] Expected error occurred +[Hera] [HADES][TEST ] Testing 0< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3136445529] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3137994468] 0<: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3139086720] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 3140340231] Testing word: 0> +[Hera] [HADES][TEST ] [KRELTSC: 3141175485] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3141971742] Running 0>.positive: 42 0> . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3143479206] Test passed +[Hera] [HADES][TEST ] Testing 0> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3144990156] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3152143386] Running 0>.zero: 0 0> . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3153507861] Test passed +[Hera] [HADES][TEST ] Testing 0> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3155058543] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3157695639] Running 0>.negative: -42 0> . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3158954022] Test passed +[Hera] [HADES][TEST ] Testing 0> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3160463460] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3167610390] Running 0>.empty_stack: 0> +[Hera] [HADES][ERROR] [KRELTSC: 3168630045] 0>: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3169702662] Expected error occurred +[Hera] [HADES][TEST ] Testing 0> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3171377391] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3172435644] 0>: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3173502549] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 3174755892] Testing word: 0<> +[Hera] [HADES][TEST ] [KRELTSC: 3179609412] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3180903096] Running 0<>.nonzero_pos: 42 0<> . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3182437650] Test passed +[Hera] [HADES][TEST ] Testing 0<> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3183990999] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3186875874] Running 0<>.nonzero_neg: -1 0<> . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3188427480] Test passed +[Hera] [HADES][TEST ] Testing 0<> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3190197528] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3197293575] Running 0<>.zero: 0 0<> . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3198556998] Test passed +[Hera] [HADES][TEST ] Testing 0<> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3200109780] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3202829637] Running 0<>.empty_stack: 0<> +[Hera] [HADES][ERROR] [KRELTSC: 3204090267] 0<>: stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3209475654] Expected error occurred +[Hera] [HADES][TEST ] Testing 0<> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3211880553] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3213133476] 0<>: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3214247778] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 3215491545] Testing word: U< +[Hera] [HADES][TEST ] [KRELTSC: 3216301536] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3217221210] Running U<.less: 3 5 U< . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3219020511] Test passed +[Hera] [HADES][TEST ] Testing U< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3225193482] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3228106434] Running U<.equal: 5 5 U< . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3229456881] Test passed +[Hera] [HADES][TEST ] Testing U< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3230975622] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3238439694] Running U<.greater: 7 5 U< . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3239800662] Test passed +[Hera] [HADES][TEST ] Testing U< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3241320537] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][INFO ] [KRELTSC: 3243410583] L8[TABLE]: Config 31 → 32 regime=2 score=26214 L1=0 L2=1 L3=0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3245403021] Running U<.zero_one: 0 1 U< . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3246749646] Test passed +[Hera] [HADES][TEST ] Testing U< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3248372190] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3255724710] Running U<.empty_stack: U< +[Hera] [HADES][ERROR] [KRELTSC: 3256721391] U<: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3257573298] Expected error occurred +[Hera] [HADES][TEST ] Testing U< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3259244478] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3260273562] U<: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3261426378] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 3267016494] Testing word: U> +[Hera] [HADES][TEST ] [KRELTSC: 3268237707] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3269129766] Running U>.greater: 5 3 U> . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3270652413] Test passed +[Hera] [HADES][TEST ] Testing U> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3272223738] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3274970664] Running U>.equal: 5 5 U> . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3276529032] Test passed +[Hera] [HADES][TEST ] Testing U> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3282737871] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3285496284] Running U>.less: 3 5 U> . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3286740975] Test passed +[Hera] [HADES][TEST ] Testing U> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3288257238] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3291211959] Running U>.one_zero: 1 0 U> . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3292635906] Test passed +[Hera] [HADES][TEST ] Testing U> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3298612569] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3301476108] Running U>.empty_stack: U> +[Hera] [HADES][ERROR] [KRELTSC: 3302460987] U>: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3303473670] Expected error occurred +[Hera] [HADES][TEST ] Testing U> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3305188320] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3306242226] U>: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3311822787] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 3313078125] Testing word: WITHIN +[Hera] [HADES][TEST ] [KRELTSC: 3313881963] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3314740422] Running WITHIN.in_range: 3 1 5 WITHIN . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3316483464] Test passed +[Hera] [HADES][TEST ] Testing WITHIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3318069615] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3320937669] Running WITHIN.at_low: 1 1 5 WITHIN . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3326765001] Test passed +[Hera] [HADES][TEST ] Testing WITHIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3328383891] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3331159041] Running WITHIN.at_high: 5 1 5 WITHIN . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3332615139] Test passed +[Hera] [HADES][TEST ] Testing WITHIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3334285248] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][INFO ] [KRELTSC: 3341329404] L8[TABLE]: Config 32 → 33 regime=2 score=26214 L1=0 L2=1 L3=0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3343409643] Running WITHIN.below: 0 1 5 WITHIN . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3344770758] Test passed +[Hera] [HADES][TEST ] Testing WITHIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3346239498] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3349024707] Running WITHIN.above: 6 1 5 WITHIN . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3354790530] Test passed +[Hera] [HADES][TEST ] Testing WITHIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3356771103] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3359540037] Running WITHIN.empty_stack: WITHIN +[Hera] [HADES][ERROR] [KRELTSC: 3360586467] WITHIN: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3361540224] Expected error occurred +[Hera] [HADES][TEST ] Testing WITHIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3363277785] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3364393137] WITHIN: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3370119816] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 3371411988] Testing word: TRUE +[Hera] [HADES][TEST ] [KRELTSC: 3372256167] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3373154085] Running TRUE.value: TRUE . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3374578893] Test passed +[Hera] [HADES][TEST ] Testing TRUE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3376159710] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3378997251] Running TRUE.as_flag: TRUE 0= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3385333224] Test passed +[Hera] [HADES][TEST ] Testing TRUE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3386913831] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3389621298] Running TRUE.in_and: TRUE TRUE AND . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3390991842] Test passed +[Hera] [HADES][TEST ] Testing TRUE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3392666739] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3400037109] TRUE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3401125455] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 3402363531] Testing word: FALSE +[Hera] [HADES][TEST ] [KRELTSC: 3403205799] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3404094435] Running FALSE.value: FALSE . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3405536925] Test passed +[Hera] [HADES][TEST ] Testing FALSE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3407190444] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3414653319] Running FALSE.as_flag: FALSE 0= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3416024913] Test passed +[Hera] [HADES][TEST ] Testing FALSE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3417560496] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3420300366] Running FALSE.in_or: TRUE FALSE OR . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3421790211] Test passed +[Hera] [HADES][TEST ] Testing FALSE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3428074629] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3431031954] FALSE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3432147201] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 3433393509] Testing word: >= +[Hera] [HADES][TEST ] [KRELTSC: 3434197494] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3435207447] Running >=.less: 3 5 >= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3436910295] Test passed +[Hera] [HADES][TEST ] Testing >= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3443657343] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][INFO ] [KRELTSC: 3446111277] L8[TABLE]: Config 33 → 34 regime=2 score=26214 L1=0 L2=1 L3=0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3447815721] Running >=.greater: 5 3 >= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3449245989] Test passed +[Hera] [HADES][TEST ] Testing >= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3450995982] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3458331030] Running >=.equal: 3 3 >= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3459570492] Test passed +[Hera] [HADES][TEST ] Testing >= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3461225418] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3464027175] Running >=.negative: -1 0 >= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3465407232] Test passed +[Hera] [HADES][TEST ] Testing >= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3467152962] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3475160199] Running >=.neg_neg: -1 -2 >= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3476471691] Test passed +[Hera] [HADES][TEST ] Testing >= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3477984804] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3480998745] Running >=.underflow: >= +[Hera] [HADES][ERROR] [KRELTSC: 3487147839] >=: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3488410233] Expected error occurred +[Hera] [HADES][TEST ] Testing >= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3490060161] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3491081370] >=: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3492148422] ▶ Testing module: v3/src/test_runner/modules/logical_words_te +[Hera] [HADES][TEST ] [KRELTSC: 3493377741] Testing word: <= +[Hera] [HADES][TEST ] [KRELTSC: 3494230089] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3495323874] Running <=.less: 3 5 <= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3501419082] Test passed +[Hera] [HADES][TEST ] Testing <= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3502999815] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3505717803] Running <=.greater: 5 3 <= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3507064638] Test passed +[Hera] [HADES][TEST ] Testing <= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3508640982] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3516125739] Running <=.equal: 3 3 <= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3517450209] Test passed +[Hera] [HADES][TEST ] Testing <= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3519004524] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3521729337] Running <=.negative: -1 0 <= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3523062291] Test passed +[Hera] [HADES][TEST ] Testing <= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3524885406] Expected: Should print: -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3532327344] Running <=.neg_neg: -2 -1 <= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3533633523] Test passed +[Hera] [HADES][TEST ] Testing <= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3535171710] Expected: Should print: -1 +[Hera] -1 +[Hera] [HADES][INFO ] [KRELTSC: 3536490111] L8[TABLE]: Config 34 → 35 regime=2 score=52428 L1=0 L2=1 L3=0 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 3539514447] Running <=.underflow: <= +[Hera] [HADES][ERROR] [KRELTSC: 3544821420] <=: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3545785047] Expected error occurred +[Hera] [HADES][TEST ] Testing <= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3547391274] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3548456520] <=: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3549528969] === Logical Words Summary: 0 passed, 0 failed, 0 skipped, 0 err +[Hera] [HADES][INFO ] [KRELTSC: 3550784055] +[Hera] === Testing Module: Mixed Arithmetic Words === +[Hera] [HADES][INFO ] [KRELTSC: 3552171084] Running Mixed Arithmetic Words Tests (Module 7)... +[Hera] [HADES][TEST ] [KRELTSC: 3553557462] ▶ Testing module: v3/src/test_runner/modules/mixed_arithmetic +[Hera] [HADES][TEST ] [KRELTSC: 3559436055] Testing word: */ +[Hera] [HADES][TEST ] [KRELTSC: 3560370345] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3561351591] Running */.basic: 6 7 4 */ . CR +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 3562990767] Test passed +[Hera] [HADES][TEST ] Testing */ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3564560496] Expected: Should print: 10 (6*7/4) +[Hera] [HADES][TEST ] [KRELTSC: 3565612554] Running */.exact_division: 12 5 3 */ . CR +[Hera] 20 +[Hera] [HADES][TEST ] [KRELTSC: 3567092529] Test passed +[Hera] [HADES][TEST ] Testing */ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3568855752] Expected: Should print: 20 (12*5/3) +[Hera] [HADES][TEST ] [KRELTSC: 3574792137] Running */.zero_multiply: 0 999 123 */ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 3576335049] Test passed +[Hera] [HADES][TEST ] Testing */ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3577859166] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 3578800680] Running */.by_one: 42 5 1 */ . CR +[Hera] 210 +[Hera] [HADES][TEST ] [KRELTSC: 3580125171] Test passed +[Hera] [HADES][TEST ] Testing */ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3581740344] Expected: Should print: 210 (42*5/1) +[Hera] [HADES][TEST ] [KRELTSC: 3582932430] Running */.truncation: 7 3 2 */ . CR +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 3588732672] Test passed +[Hera] [HADES][TEST ] Testing */ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3590307336] Expected: Should print: 10 (21/2 truncated) +[Hera] [HADES][TEST ] [KRELTSC: 3591402402] Running */.negative_multiply: -6 7 4 */ . CR +[Hera] -10 +[Hera] [HADES][TEST ] [KRELTSC: 3592831179] Test passed +[Hera] [HADES][TEST ] Testing */ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3594257436] Expected: Should print: -10 +[Hera] [HADES][TEST ] [KRELTSC: 3595172070] Running */.negative_divisor: 6 7 -4 */ . CR +[Hera] -10 +[Hera] [HADES][TEST ] [KRELTSC: 3596782791] Test passed +[Hera] [HADES][TEST ] Testing */ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3602765670] Expected: Should print: -10 +[Hera] [HADES][TEST ] [KRELTSC: 3603762708] Running */.div_by_zero: 6 7 0 */ +[Hera] [HADES][ERROR] [KRELTSC: 3604921446] */: Division by zero +[Hera] [HADES][TEST ] [KRELTSC: 3605826273] Expected error occurred +[Hera] [HADES][TEST ] Testing */ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3607522149] Expected: Should cause division by zero +[Hera] [HADES][TEST ] [KRELTSC: 3608500245] Running */.empty_stack: */ +[Hera] [HADES][ERROR] [KRELTSC: 3609488841] */: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3610372479] Expected error occurred +[Hera] [HADES][TEST ] Testing */ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3612386148] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3617944743] Running */.two_items: 1 2 */ +[Hera] [HADES][ERROR] [KRELTSC: 3619045500] */: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3619910511] Expected error occurred +[Hera] [HADES][TEST ] Testing */ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3621566739] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3622668819] */: 10 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3623917584] ▶ Testing module: v3/src/test_runner/modules/mixed_arithmetic +[Hera] [HADES][TEST ] [KRELTSC: 3625163178] Testing word: */MOD +[Hera] [HADES][TEST ] [KRELTSC: 3626214858] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3627186318] Running */MOD.basic: 17 3 5 */MOD . . CR +[Hera] 10 1 +[Hera] [HADES][TEST ] [KRELTSC: 3634010310] Test passed +[Hera] [HADES][TEST ] Testing */MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3636425100] Expected: Should print: 1 10 (51/5 = 10 rem 1) +[Hera] [HADES][TEST ] [KRELTSC: 3637965282] Running */MOD.exact_division: 15 4 3 */MOD . . CR +[Hera] 20 0 +[Hera] [HADES][TEST ] [KRELTSC: 3639438684] Test passed +[Hera] [HADES][TEST ] Testing */MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3641291745] Expected: Should print: 0 20 (60/3 = 20 rem 0) +[Hera] [HADES][TEST ] [KRELTSC: 3646725684] Running */MOD.zero_multiply: 0 999 123 */MOD . . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 3648470238] Test passed +[Hera] [HADES][TEST ] Testing */MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3650037531] Expected: Should print: 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 3651004770] Running */MOD.by_one: 42 5 1 */MOD . . CR +[Hera] 210 0 +[Hera] [HADES][TEST ] [KRELTSC: 3652384911] Test passed +[Hera] [HADES][TEST ] Testing */MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3653949747] Expected: Should print: 0 210 +[Hera] [HADES][TEST ] [KRELTSC: 3655089900] Running */MOD.remainder: 7 8 5 */MOD . . CR +[Hera] 11 1 +[Hera] [HADES][TEST ] [KRELTSC: 3661178388] Test passed +[Hera] [HADES][TEST ] Testing */MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3662821848] Expected: Should print: 1 11 (56/5 = 11 rem 1) +[Hera] [HADES][TEST ] [KRELTSC: 3663955806] Running */MOD.negative: -7 3 4 */MOD . . CR +[Hera] -5 -1 +[Hera] [HADES][TEST ] [KRELTSC: 3665472132] Test passed +[Hera] [HADES][TEST ] Testing */MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3666899376] Expected: Should handle negative +[Hera] [HADES][TEST ] [KRELTSC: 3667884759] Running */MOD.div_by_zero: 6 7 0 */MOD +[Hera] [HADES][ERROR] [KRELTSC: 3669040641] */MOD: Division by zero +[Hera] [HADES][TEST ] [KRELTSC: 3670266705] Expected error occurred +[Hera] [HADES][TEST ] Testing */MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3676778133] Expected: Should cause division by zero +[Hera] [HADES][TEST ] [KRELTSC: 3677880675] Running */MOD.empty_stack: */MOD +[Hera] [HADES][ERROR] [KRELTSC: 3679035612] */MOD: Stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3679964442] Expected error occurred +[Hera] [HADES][TEST ] Testing */MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3681529026] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3682602021] */MOD: 8 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3683807778] ▶ Testing module: v3/src/test_runner/modules/mixed_arithmetic +[Hera] [HADES][TEST ] [KRELTSC: 3685184727] Testing word: M+ +[Hera] [HADES][TEST ] [KRELTSC: 3690345477] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3691288020] Running M+.basic: 0 100 200 M+ . . CR +[Hera] 300 0 +[Hera] [HADES][TEST ] [KRELTSC: 3692967075] Test passed +[Hera] [HADES][TEST ] Testing M+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3694514481] Expected: Should print: 200 100 +[Hera] [HADES][TEST ] [KRELTSC: 3695482329] Running M+.overflow: 0 2147483647 1 M+ . . CR +[Hera] 2147483648 0 +[Hera] [HADES][TEST ] [KRELTSC: 3697065519] Test passed +[Hera] [HADES][TEST ] Testing M+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3698786532] Expected: Should handle overflow +[Hera] [HADES][TEST ] [KRELTSC: 3699904278] Running M+.negative: 0 -100 50 M+ . . CR +[Hera] -50 0 +[Hera] [HADES][TEST ] [KRELTSC: 3705793749] Test passed +[Hera] [HADES][TEST ] Testing M+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3707334960] Expected: Should print: 50 -100 +[Hera] [HADES][TEST ] [KRELTSC: 3708318810] Running M+.zero_add: 0 42 0 M+ . . CR +[Hera] 42 0 +[Hera] [HADES][TEST ] [KRELTSC: 3709691706] Test passed +[Hera] [HADES][TEST ] Testing M+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3711228969] Expected: Should print: 0 42 +[Hera] [HADES][TEST ] [KRELTSC: 3712166241] Running M+.both_negative: 0 -100 -200 M+ . . CR +[Hera] -300 0 +[Hera] [HADES][TEST ] [KRELTSC: 3713940510] Test passed +[Hera] [HADES][TEST ] Testing M+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3720311343] Expected: Should print: -200 -100 +[Hera] [HADES][TEST ] [KRELTSC: 3721391163] Running M+.empty_stack: M+ +[Hera] [HADES][TEST ] [KRELTSC: 3722435094] Expected error occurred +[Hera] [HADES][TEST ] Testing M+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3724092519] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3725117760] Running M+.one_item: 42 M+ +[Hera] [HADES][TEST ] [KRELTSC: 3726078636] Expected error occurred +[Hera] [HADES][TEST ] Testing M+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3727872351] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3729208728] M+: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3734582103] ▶ Testing module: v3/src/test_runner/modules/mixed_arithmetic +[Hera] [HADES][TEST ] [KRELTSC: 3735802581] Testing word: M* +[Hera] [HADES][TEST ] [KRELTSC: 3736598586] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3737411559] Running M*.basic: 123 456 M* . . CR +[Hera] 0 56088 +[Hera] [HADES][TEST ] [KRELTSC: 3738997836] Test passed +[Hera] [HADES][TEST ] Testing M* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3740505447] Expected: Should print: 56088 0 +[Hera] [HADES][TEST ] [KRELTSC: 3741684765] Running M*.by_zero: 999 0 M* . . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 3743376210] Test passed +[Hera] [HADES][TEST ] Testing M* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3750333405] Expected: Should print: 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 3751272504] Running M*.by_one: 42 1 M* . . CR +[Hera] 0 42 +[Hera] [HADES][TEST ] [KRELTSC: 3752560812] Test passed +[Hera] [HADES][TEST ] Testing M* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3754264395] Expected: Should print: 42 0 +[Hera] [HADES][TEST ] [KRELTSC: 3755252067] Running M*.negative: -123 456 M* . . CR +[Hera] -1 -56088 +[Hera] [HADES][TEST ] [KRELTSC: 3756771312] Test passed +[Hera] [HADES][TEST ] Testing M* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3758458956] Expected: Should print: -56088 -1 +[Hera] [HADES][TEST ] [KRELTSC: 3763769205] Running M*.large_multiply: 65536 65536 M* . . CR +[Hera] 0 4294967296 +[Hera] [HADES][TEST ] [KRELTSC: 3765361047] Test passed +[Hera] [HADES][TEST ] Testing M* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3766920465] Expected: Should handle large result +[Hera] [HADES][TEST ] [KRELTSC: 3767958747] Running M*.both_negative: -100 -200 M* . . CR +[Hera] 0 20000 +[Hera] [HADES][TEST ] [KRELTSC: 3769402455] Test passed +[Hera] [HADES][TEST ] Testing M* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3770970567] Expected: Should print: 20000 0 +[Hera] [HADES][TEST ] [KRELTSC: 3772170822] Running M*.empty_stack: M* +[Hera] [HADES][TEST ] [KRELTSC: 3777497745] Expected error occurred +[Hera] [HADES][TEST ] Testing M* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3779276235] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3780314286] Running M*.one_item: 42 M* +[Hera] [HADES][TEST ] [KRELTSC: 3781266468] Expected error occurred +[Hera] [HADES][TEST ] Testing M* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3782889222] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3783924165] M*: 8 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3785000268] ▶ Testing module: v3/src/test_runner/modules/mixed_arithmetic +[Hera] [HADES][TEST ] [KRELTSC: 3786314175] Testing word: M/MOD +[Hera] [HADES][TEST ] [KRELTSC: 3787287630] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3792612033] Running M/MOD.basic: 0 1000 100 M/MOD . . CR +[Hera] 10 0 +[Hera] [HADES][TEST ] [KRELTSC: 3794501865] Test passed +[Hera] [HADES][TEST ] Testing M/MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3797271093] Expected: Should print: 0 10 (1000/100) +[Hera] [HADES][TEST ] [KRELTSC: 3798310719] Running M/MOD.with_remainder: 0 1234 100 M/MOD . . CR +[Hera] 12 34 +[Hera] [HADES][TEST ] [KRELTSC: 3799836831] Test passed +[Hera] [HADES][TEST ] Testing M/MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3801497784] Expected: Should handle remainder +[Hera] [HADES][TEST ] [KRELTSC: 3807151404] Running M/MOD.double_dividend: 5001 0 10 M/MOD . . CR +[Hera] 1844674407370955161 6 +[Hera] [HADES][TEST ] [KRELTSC: 3808943376] Test passed +[Hera] [HADES][TEST ] Testing M/MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3810538557] Expected: Should print: 1 500 (5001/10) +[Hera] [HADES][TEST ] [KRELTSC: 3811619532] Running M/MOD.by_one: 0 42 1 M/MOD . . CR +[Hera] 42 0 +[Hera] [HADES][TEST ] [KRELTSC: 3813103959] Test passed +[Hera] [HADES][TEST ] Testing M/MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3814717515] Expected: Should print: 0 42 +[Hera] [HADES][TEST ] [KRELTSC: 3815875833] Running M/MOD.negative_dividend: -1 1000 100 M/MOD . . CR +[Hera] -184467440737095506 -16 +[Hera] [HADES][TEST ] [KRELTSC: 3822536109] Test passed +[Hera] [HADES][TEST ] Testing M/MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3824959488] Expected: Should handle negative +[Hera] [HADES][TEST ] [KRELTSC: 3825936072] Running M/MOD.div_by_zero: 0 100 0 M/MOD +[Hera] [HADES][TEST ] [KRELTSC: 3827120409] Expected error occurred +[Hera] [HADES][TEST ] Testing M/MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3828796671] Expected: Should cause division by zero +[Hera] [HADES][TEST ] [KRELTSC: 3830041614] Running M/MOD.empty_stack: M/MOD +[Hera] [HADES][TEST ] [KRELTSC: 3831272739] Expected error occurred +[Hera] [HADES][TEST ] Testing M/MOD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3839348373] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3840377688] M/MOD: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3841585272] === Mixed Arithmetic Words Summary: 0 passed, 0 failed, 0 skipp +[Hera] [HADES][INFO ] [KRELTSC: 3842801109] +[Hera] === Testing Module: Double Words === +[Hera] [HADES][INFO ] [KRELTSC: 3844214535] Running Double Number Words Tests (Module 6)... +[Hera] [HADES][TEST ] [KRELTSC: 3845540706] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 3851910909] Testing word: 2DROP +[Hera] [HADES][TEST ] [KRELTSC: 3852802506] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3853678668] Running 2DROP.basic: 1 2 3 4 2DROP . . CR +[Hera] 2 1 +[Hera] [HADES][TEST ] [KRELTSC: 3855269796] Test passed +[Hera] [HADES][TEST ] Testing 2DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3856878396] Expected: Should print: 1 2 +[Hera] [HADES][TEST ] [KRELTSC: 3857815143] Running 2DROP.zeros: 0 0 42 99 2DROP . . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 3859581222] Test passed +[Hera] [HADES][TEST ] Testing 2DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3865532622] Expected: Should print: 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 3867084816] Running 2DROP.negative: -1 -2 100 200 2DROP . . CR +[Hera] -2 -1 +[Hera] [HADES][INFO ] [KRELTSC: 3882932550] L8[TABLE]: Config 35 → 36 regime=2 score=26214 L1=0 L2=1 L3=0 +[Hera] [HADES][TEST ] [KRELTSC: 3884229720] Test passed +[Hera] [HADES][TEST ] Testing 2DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3885717129] Expected: Should print: -1 -2 +[Hera] [HADES][TEST ] [KRELTSC: 3886610238] Running 2DROP.exact_four: 10 20 30 40 2DROP DEPTH . CR +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 3888376443] Test passed +[Hera] [HADES][TEST ] Testing 2DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3890147373] Expected: Should print: 2 +[Hera] [HADES][TEST ] [KRELTSC: 3896046945] Running 2DROP.empty_stack: 2DROP +[Hera] [HADES][TEST ] [KRELTSC: 3897209463] Expected error occurred +[Hera] [HADES][TEST ] Testing 2DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3898835430] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3899904687] Running 2DROP.one_item: 42 2DROP +[Hera] [HADES][TEST ] [KRELTSC: 3900985935] Expected error occurred +[Hera] [HADES][TEST ] Testing 2DROP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3902870601] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3904027218] 2DROP: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3909640224] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 3910904739] Testing word: 2DUP +[Hera] [HADES][TEST ] [KRELTSC: 3911679912] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3912558972] Running 2DUP.basic: 100 200 2DUP . . . . CR +[Hera] 200 100 200 100 +[Hera] [HADES][TEST ] [KRELTSC: 3914293131] Test passed +[Hera] [HADES][TEST ] Testing 2DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3915807966] Expected: Should print: 100 200 100 200 +[Hera] [HADES][TEST ] [KRELTSC: 3916957023] Running 2DUP.zeros: 0 0 2DUP . . . . CR +[Hera] 0 0 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 3918601407] Test passed +[Hera] [HADES][TEST ] Testing 2DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3925573995] Expected: Should print: 0 0 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 3926481216] Running 2DUP.negative: -100 -200 2DUP . . . . CR +[Hera] -200 -100 -200 -100 +[Hera] [HADES][TEST ] [KRELTSC: 3928158024] Test passed +[Hera] [HADES][TEST ] Testing 2DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3929716350] Expected: Should duplicate negatives +[Hera] [HADES][TEST ] [KRELTSC: 3930723951] Running 2DUP.depth_check: 10 20 2DUP DEPTH . CR +[Hera] 4 +[Hera] [HADES][TEST ] [KRELTSC: 3932515482] Test passed +[Hera] [HADES][TEST ] Testing 2DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3934115157] Expected: Should print: 4 +[Hera] [HADES][TEST ] [KRELTSC: 3940135185] Running 2DUP.empty_stack: 2DUP +[Hera] [HADES][TEST ] [KRELTSC: 3941151606] Expected error occurred +[Hera] [HADES][TEST ] Testing 2DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3942883938] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3943949499] Running 2DUP.one_item: 42 2DUP +[Hera] [HADES][TEST ] [KRELTSC: 3944924760] Expected error occurred +[Hera] [HADES][TEST ] Testing 2DUP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3946824420] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3947957076] 2DUP: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 3955354074] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 3956474781] Testing word: 2OVER +[Hera] [HADES][TEST ] [KRELTSC: 3957308124] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 3958268034] Running 2OVER.basic: 10 20 30 40 2OVER . . . . . . CR +[Hera] 20 10 40 30 20 10 +[Hera] [HADES][TEST ] [KRELTSC: 3960187266] Test passed +[Hera] [HADES][TEST ] Testing 2OVER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3961985055] Expected: Should print: 10 20 30 40 10 20 +[Hera] [HADES][TEST ] [KRELTSC: 3968108991] Running 2OVER.zeros: 0 0 99 88 2OVER . . . . . . CR +[Hera] 0 0 88 99 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 3969812259] Test passed +[Hera] [HADES][TEST ] Testing 2OVER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3971411388] Expected: Should print: 0 0 99 88 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 3972482871] Running 2OVER.mixed: -1 2 -3 4 2OVER . . . . . . CR +[Hera] 2 -1 4 -3 2 -1 +[Hera] [HADES][TEST ] [KRELTSC: 3974089308] Test passed +[Hera] [HADES][TEST ] Testing 2OVER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3975875316] Expected: Should handle mixed signs +[Hera] [HADES][TEST ] [KRELTSC: 3976983381] Running 2OVER.depth_check: 1 2 3 4 2OVER DEPTH . CR +[Hera] 6 +[Hera] [HADES][TEST ] [KRELTSC: 3983177625] Test passed +[Hera] [HADES][TEST ] Testing 2OVER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3984723057] Expected: Should print: 6 +[Hera] [HADES][TEST ] [KRELTSC: 3985649451] Running 2OVER.three_items: 1 2 3 2OVER +[Hera] [HADES][TEST ] [KRELTSC: 3986810688] Expected error occurred +[Hera] [HADES][TEST ] Testing 2OVER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3988505094] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3989576346] Running 2OVER.empty_stack: 2OVER +[Hera] [HADES][TEST ] [KRELTSC: 3990849933] Expected error occurred +[Hera] [HADES][TEST ] Testing 2OVER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 3997626423] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 3999117570] 2OVER: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4000195794] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 4001421312] Testing word: 2SWAP +[Hera] [HADES][TEST ] [KRELTSC: 4002253353] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4003144908] Running 2SWAP.basic: 10 20 30 40 2SWAP . . . . CR +[Hera] 20 10 40 30 +[Hera] [HADES][TEST ] [KRELTSC: 4005413496] Test passed +[Hera] [HADES][TEST ] Testing 2SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4011747999] Expected: Should print: 30 40 10 20 +[Hera] [HADES][TEST ] [KRELTSC: 4012785420] Running 2SWAP.zeros: 0 0 99 88 2SWAP . . . . CR +[Hera] 0 0 88 99 +[Hera] [HADES][TEST ] [KRELTSC: 4014332532] Test passed +[Hera] [HADES][TEST ] Testing 2SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4015867128] Expected: Should print: 99 88 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 4016836971] Running 2SWAP.same_pairs: 42 42 42 42 2SWAP . . . . CR +[Hera] 42 42 42 42 +[Hera] [HADES][TEST ] [KRELTSC: 4018596582] Test passed +[Hera] [HADES][TEST ] Testing 2SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4020390276] Expected: Should print: 42 42 42 42 +[Hera] [HADES][TEST ] [KRELTSC: 4026250599] Running 2SWAP.negative: -10 -20 30 40 2SWAP . . . . CR +[Hera] -20 -10 40 30 +[Hera] [HADES][TEST ] [KRELTSC: 4028734101] Test passed +[Hera] [HADES][TEST ] Testing 2SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4030276509] Expected: Should print: 30 40 -10 -20 +[Hera] [HADES][TEST ] [KRELTSC: 4031276067] Running 2SWAP.depth_check: 1 2 3 4 2SWAP DEPTH . CR +[Hera] 4 +[Hera] [HADES][TEST ] [KRELTSC: 4032801045] Test passed +[Hera] [HADES][TEST ] Testing 2SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4034667000] Expected: Should print: 4 +[Hera] [HADES][TEST ] [KRELTSC: 4035616536] Running 2SWAP.three_items: 1 2 3 2SWAP +[Hera] [HADES][TEST ] [KRELTSC: 4041206400] Expected error occurred +[Hera] [HADES][TEST ] Testing 2SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4043002257] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4044017943] Running 2SWAP.empty_stack: 2SWAP +[Hera] [HADES][TEST ] [KRELTSC: 4045041693] Expected error occurred +[Hera] [HADES][TEST ] Testing 2SWAP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4046701050] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4047738891] 2SWAP: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4049068191] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 4054818264] Testing word: 2ROT +[Hera] [HADES][TEST ] [KRELTSC: 4055758518] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4056618951] Running 2ROT.basic: 10 20 30 40 50 60 2ROT . . . . . . CR +[Hera] 20 10 60 50 40 30 +[Hera] [HADES][TEST ] [KRELTSC: 4058591229] Test passed +[Hera] [HADES][TEST ] Testing 2ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4060162932] Expected: Should print: 30 40 50 60 10 20 +[Hera] [HADES][TEST ] [KRELTSC: 4061224104] Running 2ROT.zeros: 0 0 1 1 2 2 2ROT . . . . . . CR +[Hera] 0 0 2 2 1 1 +[Hera] [HADES][TEST ] [KRELTSC: 4062991821] Test passed +[Hera] [HADES][TEST ] Testing 2ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4068767031] Expected: Should rotate with zeros +[Hera] [HADES][TEST ] [KRELTSC: 4070209143] Running 2ROT.negative: -1 -2 3 4 -5 -6 2ROT . . . . . . CR +[Hera] -2 -1 -6 -5 4 3 +[Hera] [HADES][TEST ] [KRELTSC: 4071955062] Test passed +[Hera] [HADES][TEST ] Testing 2ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4073487033] Expected: Should handle negatives +[Hera] [HADES][TEST ] [KRELTSC: 4074514122] Running 2ROT.depth_check: 1 2 3 4 5 6 2ROT DEPTH . CR +[Hera] 6 +[Hera] [HADES][TEST ] [KRELTSC: 4075986117] Test passed +[Hera] [HADES][TEST ] Testing 2ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4077658305] Expected: Should print: 6 +[Hera] [HADES][TEST ] [KRELTSC: 4078666011] Running 2ROT.five_items: 1 2 3 4 5 2ROT +[Hera] [HADES][TEST ] [KRELTSC: 4084497564] Expected error occurred +[Hera] [HADES][TEST ] Testing 2ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4086245352] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4087318074] Running 2ROT.empty_stack: 2ROT +[Hera] [HADES][TEST ] [KRELTSC: 4088275149] Expected error occurred +[Hera] [HADES][TEST ] Testing 2ROT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4089905190] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4090954896] 2ROT: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4092079782] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 4093365297] Testing word: D+ +[Hera] [HADES][TEST ] [KRELTSC: 4098589551] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4099556412] Running D+.basic: 100 200 300 400 D+ . . CR +[Hera] 600 400 +[Hera] [HADES][TEST ] [KRELTSC: 4101272112] Test passed +[Hera] [HADES][TEST ] Testing D+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4102819161] Expected: Should print: 400 600 +[Hera] [HADES][TEST ] [KRELTSC: 4103831277] Running D+.zero_add: 42 99 0 0 D+ . . CR +[Hera] 99 42 +[Hera] [HADES][TEST ] [KRELTSC: 4105264779] Test passed +[Hera] [HADES][TEST ] Testing D+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4106846667] Expected: Should print: 42 99 +[Hera] [HADES][TEST ] [KRELTSC: 4107859098] Running D+.negative: -100 -200 50 75 D+ . . CR +[Hera] -125 -50 +[Hera] [HADES][TEST ] [KRELTSC: 4113721143] Test passed +[Hera] [HADES][TEST ] Testing D+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4115285076] Expected: Should handle negatives +[Hera] [HADES][TEST ] [KRELTSC: 4116338037] Running D+.carry: 2147483647 0 1 0 D+ . . CR +[Hera] 0 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 4117803249] Test passed +[Hera] [HADES][TEST ] Testing D+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4119368631] Expected: Should handle carry +[Hera] [HADES][TEST ] [KRELTSC: 4120348134] Running D+.both_negative: -100 -200 -300 -400 D+ . . CR +[Hera] -599 -400 +[Hera] [HADES][TEST ] [KRELTSC: 4122172089] Test passed +[Hera] [HADES][TEST ] Testing D+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4128163368] Expected: Should add negatives +[Hera] [HADES][TEST ] [KRELTSC: 4129270131] Running D+.three_items: 1 2 3 D+ +[Hera] [HADES][TEST ] [KRELTSC: 4130428134] Expected error occurred +[Hera] [HADES][TEST ] Testing D+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4132076298] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4133151015] Running D+.empty_stack: D+ +[Hera] [HADES][TEST ] [KRELTSC: 4134065523] Expected error occurred +[Hera] [HADES][TEST ] Testing D+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4135780950] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4136869632] D+: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4142311698] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 4143651183] Testing word: D- +[Hera] [HADES][TEST ] [KRELTSC: 4144455378] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4145368143] Running D-.basic: 500 600 100 200 D- . . CR +[Hera] 400 [HADES][INFO ] [KRELTSC: 4147011708] L8[TABLE]: Config 36 → 37 regime=2 score=26214 L1=0 L2=1 L3=0 +[Hera] 400 +[Hera] [HADES][TEST ] [KRELTSC: 4148406423] Test passed +[Hera] [HADES][TEST ] Testing D- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4149971616] Expected: Should print: 400 400 +[Hera] [HADES][TEST ] [KRELTSC: 4151012292] Running D-.zero_sub: 42 99 0 0 D- . . CR +[Hera] 99 42 +[Hera] [HADES][TEST ] [KRELTSC: 4156879230] Test passed +[Hera] [HADES][TEST ] Testing D- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4158461853] Expected: Should print: 42 99 +[Hera] [HADES][TEST ] [KRELTSC: 4159412817] Running D-.from_zero: 0 0 100 200 D- . . CR +[Hera] -201 -100 +[Hera] [HADES][TEST ] [KRELTSC: 4160864022] Test passed +[Hera] [HADES][TEST ] Testing D- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4162427094] Expected: Should print: -100 -200 +[Hera] [HADES][TEST ] [KRELTSC: 4163409957] Running D-.negative: 100 200 -50 -75 D- . . CR +[Hera] 274 150 +[Hera] [HADES][TEST ] [KRELTSC: 4164985272] Test passed +[Hera] [HADES][TEST ] Testing D- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4166595825] Expected: Should handle negatives +[Hera] [HADES][TEST ] [KRELTSC: 4171998138] Running D-.borrow: 0 0 1 0 D- . . CR +[Hera] -1 -1 +[Hera] [HADES][TEST ] [KRELTSC: 4173462111] Test passed +[Hera] [HADES][TEST ] Testing D- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4175020983] Expected: Should handle borrow +[Hera] [HADES][TEST ] [KRELTSC: 4175985450] Running D-.same_values: 100 200 100 200 D- . . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 4177482414] Test passed +[Hera] [HADES][TEST ] Testing D- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4179036372] Expected: Should print: 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 4180033158] Running D-.three_items: 1 2 3 D- +[Hera] [HADES][TEST ] [KRELTSC: 4185643791] Expected error occurred +[Hera] [HADES][TEST ] Testing D- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4187354535] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4188449118] Running D-.empty_stack: D- +[Hera] [HADES][TEST ] [KRELTSC: 4189393635] Expected error occurred +[Hera] [HADES][TEST ] Testing D- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4191065718] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4192101207] D-: 8 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4193151354] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 4194489264] Testing word: DNEGATE +[Hera] [HADES][TEST ] [KRELTSC: 4195391046] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4200939162] Running DNEGATE.positive: 100 200 DNEGATE . . CR +[Hera] -201 -100 +[Hera] [HADES][TEST ] [KRELTSC: 4202700936] Test passed +[Hera] [HADES][TEST ] Testing DNEGATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4204244835] Expected: Should negate positive double +[Hera] [HADES][TEST ] [KRELTSC: 4205254053] Running DNEGATE.negative: -100 -200 DNEGATE . . CR +[Hera] 199 100 +[Hera] [HADES][TEST ] [KRELTSC: 4206778485] Test passed +[Hera] [HADES][TEST ] Testing DNEGATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4208526000] Expected: Should negate negative double +[Hera] [HADES][TEST ] [KRELTSC: 4209660987] Running DNEGATE.zero: 0 0 DNEGATE . . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 4215487752] Test passed +[Hera] [HADES][TEST ] Testing DNEGATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4217080098] Expected: Should print: 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 4218002292] Running DNEGATE.max_positive: 2147483647 0 DNEGATE . . CR +[Hera] -1 -2147483647 +[Hera] [HADES][TEST ] [KRELTSC: 4219612971] Test passed +[Hera] [HADES][TEST ] Testing DNEGATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4221327012] Expected: Should negate max positive +[Hera] [HADES][TEST ] [KRELTSC: 4222362795] Running DNEGATE.one_item: 42 DNEGATE +[Hera] [HADES][TEST ] [KRELTSC: 4223631405] Expected error occurred +[Hera] [HADES][TEST ] Testing DNEGATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4229887977] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4230952383] Running DNEGATE.empty_stack: DNEGATE +[Hera] [HADES][TEST ] [KRELTSC: 4232026911] Expected error occurred +[Hera] [HADES][TEST ] Testing DNEGATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4233814977] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4234880958] DNEGATE: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4235983059] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 4237219602] Testing word: DABS +[Hera] [HADES][TEST ] [KRELTSC: 4238075289] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4238990889] Running DABS.positive: 100 200 DABS . . CR +[Hera] 200 100 +[Hera] [HADES][TEST ] [KRELTSC: 4245069024] Test passed +[Hera] [HADES][TEST ] Testing DABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4246737327] Expected: Should print: 100 200 +[Hera] [HADES][TEST ] [KRELTSC: 4247694822] Running DABS.negative: -100 -200 DABS . . CR +[Hera] 199 100 +[Hera] [HADES][TEST ] [KRELTSC: 4249198464] Test passed +[Hera] [HADES][TEST ] Testing DABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4250763363] Expected: Should print: 100 200 +[Hera] [HADES][TEST ] [KRELTSC: 4251746352] Running DABS.zero: 0 0 DABS . . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 4253236722] Test passed +[Hera] [HADES][TEST ] Testing DABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4259423490] Expected: Should print: 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 4260401565] Running DABS.mixed_sign: 100 -1 DABS . . CR +[Hera] 0 -100 +[Hera] [HADES][TEST ] [KRELTSC: 4261888827] Test passed +[Hera] [HADES][TEST ] Testing DABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4263419034] Expected: Should handle mixed sign +[Hera] [HADES][TEST ] [KRELTSC: 4264426131] Running DABS.min_double: -2147483648 -1 DABS . . CR +[Hera] 0 2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 4265991534] Test passed +[Hera] [HADES][TEST ] Testing DABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4267633209] Expected: Should handle min double +[Hera] [HADES][TEST ] [KRELTSC: 4273076430] Running DABS.one_item: 42 DABS +[Hera] [HADES][TEST ] [KRELTSC: 4275765438] Expected error occurred +[Hera] [HADES][TEST ] Testing DABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4277490609] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4278590862] Running DABS.empty_stack: DABS +[Hera] [HADES][TEST ] [KRELTSC: 4279904265] Expected error occurred +[Hera] [HADES][TEST ] Testing DABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4281868500] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4282963335] DABS: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4289444061] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 4291125237] Testing word: DMIN +[Hera] [HADES][TEST ] [KRELTSC: 4291906668] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4292765358] Running DMIN.basic: 100 200 300 400 DMIN . . CR +[Hera] 200 100 +[Hera] [HADES][TEST ] [KRELTSC: 4294518081] Test passed +[Hera] [HADES][TEST ] Testing DMIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4296357954] Expected: Should print: 100 200 +[Hera] [HADES][TEST ] [KRELTSC: 4297352241] Running DMIN.equal: 42 99 42 99 DMIN . . CR +[Hera] 99 42 +[Hera] [HADES][TEST ] [KRELTSC: 4303878054] Test passed +[Hera] [HADES][TEST ] Testing DMIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4305458514] Expected: Should print: 42 99 +[Hera] [HADES][TEST ] [KRELTSC: 4306430856] Running DMIN.negative: -100 -200 -50 -75 DMIN . . CR +[Hera] -200 -100 +[Hera] [HADES][TEST ] [KRELTSC: 4307991072] Test passed +[Hera] [HADES][TEST ] Testing DMIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4309673487] Expected: Should find min negative +[Hera] [HADES][TEST ] [KRELTSC: 4310768931] Running DMIN.mixed: -100 -1 100 0 DMIN . . CR +[Hera] -1 -100 +[Hera] [HADES][TEST ] [KRELTSC: 4317238128] Test passed +[Hera] [HADES][TEST ] Testing DMIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4318858005] Expected: Should handle mixed signs +[Hera] [HADES][TEST ] [KRELTSC: 4319897190] Running DMIN.three_items: 1 2 3 DMIN +[Hera] [HADES][TEST ] [KRELTSC: 4321023336] Expected error occurred +[Hera] [HADES][TEST ] Testing DMIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4322827698] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4323854472] Running DMIN.empty_stack: DMIN +[Hera] [HADES][TEST ] [KRELTSC: 4324930638] Expected error occurred +[Hera] [HADES][TEST ] Testing DMIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4326789705] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4332740139] DMIN: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4333964019] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 4335213666] Testing word: DMAX +[Hera] [HADES][TEST ] [KRELTSC: 4336047429] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4336959627] Running DMAX.basic: 100 200 300 400 DMAX . . CR +[Hera] 400 300 +[Hera] [HADES][TEST ] [KRELTSC: 4338741855] Test passed +[Hera] [HADES][TEST ] Testing DMAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4340605059] Expected: Should print: 300 400 +[Hera] [HADES][TEST ] [KRELTSC: 4341609090] Running DMAX.equal: 42 99 42 99 DMAX . . CR +[Hera] 99 42 +[Hera] [HADES][TEST ] [KRELTSC: 4348027362] Test passed +[Hera] [HADES][TEST ] Testing DMAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4349638902] Expected: Should print: 42 99 +[Hera] [HADES][TEST ] [KRELTSC: 4350596082] Running DMAX.negative: -300 -400 -100 -200 DMAX . . CR +[Hera] -200 -100 +[Hera] [HADES][TEST ] [KRELTSC: 4352149935] Test passed +[Hera] [HADES][TEST ] Testing DMAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4353737640] Expected: Should find max negative +[Hera] [HADES][TEST ] [KRELTSC: 4354967568] Running DMAX.mixed: -100 -1 100 0 DMAX . . CR +[Hera] 0 100 +[Hera] [HADES][TEST ] [KRELTSC: 4361874930] Test passed +[Hera] [HADES][TEST ] Testing DMAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4363474647] Expected: Should handle mixed signs +[Hera] [HADES][TEST ] [KRELTSC: 4364479812] Running DMAX.three_items: 1 2 3 DMAX +[Hera] [HADES][TEST ] [KRELTSC: 4365582501] Expected error occurred +[Hera] [HADES][TEST ] Testing DMAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4367269221] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4368355803] Running DMAX.empty_stack: DMAX +[Hera] [HADES][TEST ] [KRELTSC: 4369610133] Expected error occurred +[Hera] [HADES][TEST ] Testing DMAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4375661388] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4376774094] DMAX: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4377863469] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 4379093376] Testing word: D= +[Hera] [HADES][TEST ] [KRELTSC: 4379888352] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4380812457] Running D=.equal: 100 200 100 200 D= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 4382432943] Test passed +[Hera] [HADES][TEST ] Testing D= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4384275966] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 4390499358] Running D=.not_equal_low: 100 200 101 200 D= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 4392407502] Test passed +[Hera] [HADES][TEST ] Testing D= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4393931724] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 4394879664] Running D=.not_equal_high: 100 200 100 201 D= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 4396336203] Test passed +[Hera] [HADES][TEST ] Testing D= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4398058308] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 4399105935] Running D=.zero_equal: 0 0 0 0 D= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 4406047800] Test passed +[Hera] [HADES][TEST ] Testing D= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4407624459] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 4408577817] Running D=.negative_equal: -100 -200 -100 -200 D= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 4410093555] Test passed +[Hera] [HADES][TEST ] Testing D= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4411611561] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 4412702658] Running D=.three_items: 1 2 3 D= +[Hera] [HADES][TEST ] [KRELTSC: 4414008123] Expected error occurred +[Hera] [HADES][TEST ] Testing D= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4420249218] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4421285568] Running D=.empty_stack: D= +[Hera] [HADES][TEST ] [KRELTSC: 4422256461] Expected error occurred +[Hera] [HADES][TEST ] Testing D= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4423859454] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4424923188] D=: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4425971172] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 4427387202] Testing word: D< +[Hera] [HADES][TEST ] [KRELTSC: 4428289593] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4433601753] Running D<.less_than: 100 200 300 400 D< . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 4435328415] Test passed +[Hera] [HADES][TEST ] Testing D< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4436802972] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 4437730668] Running D<.greater_than: 300 400 100 200 D< . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 4439270073] Test passed +[Hera] [HADES][TEST ] Testing D< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4440854775] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 4441986486] Running D<.equal: 100 200 100 200 D< . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 4443575619] Test passed +[Hera] [HADES][TEST ] Testing D< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4449514797] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 4450443165] Running D<.negative_positive: -100 -1 100 0 D< . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 4451896533] Test passed +[Hera] [HADES][TEST ] Testing D< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4453528527] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 4454456475] Running D<.negative_negative: -300 -1 -100 -1 D< . CR +[Hera] -1 +[Hera] [HADES][INFO ] [KRELTSC: 4456117407] L8[TABLE]: Config 37 → 38 regime=2 score=26214 L1=0 L2=1 L3=0 +[Hera] [HADES][TEST ] [KRELTSC: 4457626656] Test passed +[Hera] [HADES][TEST ] Testing D< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4463764893] Expected: Should compare negatives +[Hera] [HADES][TEST ] [KRELTSC: 4464777807] Running D<.high_word_diff: 100 200 100 300 D< . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 4466328216] Test passed +[Hera] [HADES][TEST ] Testing D< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4467875013] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 4468799811] Running D<.three_items: 1 2 3 D< +[Hera] [HADES][TEST ] [KRELTSC: 4469866422] Expected error occurred +[Hera] [HADES][TEST ] Testing D< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4471838364] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4477508049] Running D<.empty_stack: D< +[Hera] [HADES][TEST ] [KRELTSC: 4478498997] Expected error occurred +[Hera] [HADES][TEST ] Testing D< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4480108206] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4481126391] D<: 8 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4482195585] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 4483469151] Testing word: D0= +[Hera] [HADES][TEST ] [KRELTSC: 4484286177] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4485343401] Running D0=.zero: 0 0 D0= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 4486987995] Test passed +[Hera] [HADES][TEST ] Testing D0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4492998447] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 4493907894] Running D0=.positive: 100 200 D0= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 4495291983] Test passed +[Hera] [HADES][TEST ] Testing D0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4496818893] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 4497775905] Running D0=.negative: -100 -200 D0= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 4499137587] Test passed +[Hera] [HADES][TEST ] Testing D0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4500928929] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 4506734988] Running D0=.zero_high: 0 100 D0= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 4508184471] Test passed +[Hera] [HADES][TEST ] Testing D0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4509718164] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 4510623369] Running D0=.zero_low: 100 0 D0= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 4511962665] Test passed +[Hera] [HADES][TEST ] Testing D0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4513483044] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 4514545686] Running D0=.one_item: 42 D0= +[Hera] [HADES][TEST ] [KRELTSC: 4515744324] Expected error occurred +[Hera] [HADES][TEST ] Testing D0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4523147748] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4524263751] Running D0=.empty_stack: D0= +[Hera] [HADES][TEST ] [KRELTSC: 4525196928] Expected error occurred +[Hera] [HADES][TEST ] Testing D0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4526861052] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4527878040] D0=: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4529117649] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 4530473934] Testing word: D0< +[Hera] [HADES][TEST ] [KRELTSC: 4536460089] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4537392825] Running D0<.negative: -100 -1 D0< . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 4538984457] Test passed +[Hera] [HADES][TEST ] Testing D0< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4540567080] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 4541535768] Running D0<.zero: 0 0 D0< . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 4542778254] Test passed +[Hera] [HADES][TEST ] Testing D0< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4544614515] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 4550199885] Running D0<.positive: 100 0 D0< . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 4552813104] Test passed +[Hera] [HADES][TEST ] Testing D0< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4554377667] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 4555312797] Running D0<.negative_high_only: 100 -1 D0< . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 4556766753] Test passed +[Hera] [HADES][TEST ] Testing D0< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4558535583] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 4559503011] Running D0<.large_negative: -1 -1 D0< . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 4565429190] Test passed +[Hera] [HADES][TEST ] Testing D0< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4567063179] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 4568050368] Running D0<.one_item: 42 D0< +[Hera] [HADES][TEST ] [KRELTSC: 4569083610] Expected error occurred +[Hera] [HADES][TEST ] Testing D0< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4570872999] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4571941437] Running D0<.empty_stack: D0< +[Hera] [HADES][TEST ] [KRELTSC: 4573002966] Expected error occurred +[Hera] [HADES][TEST ] Testing D0< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4579246812] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4580347191] D0<: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4581434844] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 4582699212] Testing word: S>D +[Hera] [HADES][TEST ] [KRELTSC: 4583650869] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4584573777] Running S>D.positive: 5 S>D . . CR +[Hera] 0 5 +[Hera] [HADES][TEST ] [KRELTSC: 4586081703] Test passed +[Hera] [HADES][TEST ] Testing S>D ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4587726255] Expected: Should sign-extend positive: 0 5 +[Hera] [HADES][TEST ] [KRELTSC: 4588862292] Running S>D.negative: -5 S>D . . CR +[Hera] -1 -5 +[Hera] [HADES][TEST ] [KRELTSC: 4595667321] Test passed +[Hera] [HADES][TEST ] Testing S>D ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4597270377] Expected: Should sign-extend negative: -1 -5 +[Hera] [HADES][TEST ] [KRELTSC: 4598391672] Running S>D.zero: 0 S>D . . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 4599710115] Test passed +[Hera] [HADES][TEST ] Testing S>D ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4601274321] Expected: Should sign-extend zero: 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 4602417519] Running S>D.max_int: 2147483647 S>D . . CR +[Hera] 0 2147483647 +[Hera] [HADES][TEST ] [KRELTSC: 4609362723] Test passed +[Hera] [HADES][TEST ] Testing S>D ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4611090645] Expected: Should extend max int: 0 2147483647 +[Hera] [HADES][TEST ] [KRELTSC: 4612150116] Running S>D.min_int: -2147483648 S>D . . CR +[Hera] -1 -2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 4613686245] Test passed +[Hera] [HADES][TEST ] Testing S>D ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4615239657] Expected: Should extend min int: -1 -2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 4616445603] Running S>D.empty_stack: S>D +[Hera] [HADES][TEST ] [KRELTSC: 4617620952] Expected error occurred +[Hera] [HADES][TEST ] Testing S>D ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4624822734] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4625890227] S>D: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4626934704] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 4628201214] Testing word: D2* +[Hera] [HADES][TEST ] [KRELTSC: 4629033843] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4629891168] Running D2*.basic: 5 0 D2* . . CR +[Hera] 0 10 +[Hera] [HADES][TEST ] [KRELTSC: 4631539668] Test passed +[Hera] [HADES][TEST ] Testing D2* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4638552660] Expected: Should double 5: 0 10 +[Hera] [HADES][TEST ] [KRELTSC: 4639762617] Running D2*.zero: 0 0 D2* . . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 4641148869] Test passed +[Hera] [HADES][TEST ] Testing D2* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4642654002] Expected: Should double zero: 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 4643645202] Running D2*.negative: -1 -1 D2* . . CR +[Hera] -1 -2 +[Hera] [HADES][TEST ] [KRELTSC: 4645054218] Test passed +[Hera] [HADES][TEST ] Testing D2* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4646692302] Expected: Should double -1: -1 -2 +[Hera] [HADES][TEST ] [KRELTSC: 4652426142] Running D2*.carry: 0 1 D2* . . CR +[Hera] 2 0 +[Hera] [HADES][TEST ] [KRELTSC: 4653847611] Test passed +[Hera] [HADES][TEST ] Testing D2* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4655420910] Expected: Should shift high cell: 0 2 +[Hera] [HADES][TEST ] [KRELTSC: 4656503586] Running D2*.empty_stack: D2* +[Hera] [HADES][TEST ] [KRELTSC: 4657536975] Expected error occurred +[Hera] [HADES][TEST ] Testing D2* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4659208071] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4660300134] D2*: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4661420442] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 4667798142] Testing word: D2/ +[Hera] [HADES][TEST ] [KRELTSC: 4668691503] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4669604310] Running D2/.basic: 10 0 D2/ . . CR +[Hera] 0 5 +[Hera] [HADES][TEST ] [KRELTSC: 4671203733] Test passed +[Hera] [HADES][TEST ] Testing D2/ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4672775352] Expected: Should halve 10: 0 5 +[Hera] [HADES][TEST ] [KRELTSC: 4673748933] Running D2/.negative: -2 -1 D2/ . . CR +[Hera] -1 -1 +[Hera] [HADES][TEST ] [KRELTSC: 4675220088] Test passed +[Hera] [HADES][TEST ] Testing D2/ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4681702200] Expected: Should halve -2: -1 -1 +[Hera] [HADES][TEST ] [KRELTSC: 4682719713] Running D2/.zero: 0 0 D2/ . . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 4684095381] Test passed +[Hera] [HADES][TEST ] Testing D2/ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4685617650] Expected: Should halve zero: 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 4686619980] Running D2/.odd: 3 0 D2/ . . CR +[Hera] 0 1 +[Hera] [HADES][TEST ] [KRELTSC: 4687921497] Test passed +[Hera] [HADES][TEST ] Testing D2/ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4689520374] Expected: Should truncate toward zero: 0 1 +[Hera] [HADES][TEST ] [KRELTSC: 4690717332] Running D2/.empty_stack: D2/ +[Hera] [HADES][TEST ] [KRELTSC: 4696111560] Expected error occurred +[Hera] [HADES][TEST ] Testing D2/ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4697792316] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4698822849] D2/: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4699846347] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 4701096225] Testing word: 2>R +[Hera] [HADES][TEST ] [KRELTSC: 4701904935] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4702830573] Running 2>R.roundtrip: 10 20 2>R 2R> . . CR +[Hera] 20 10 +[Hera] [HADES][TEST ] [KRELTSC: 4704696444] Test passed +[Hera] [HADES][TEST ] Testing 2>R ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4710856185] Expected: Should store and retrieve: 20 10 +[Hera] [HADES][TEST ] [KRELTSC: 4711979916] Running 2>R.depth_after: 1 2 2>R DEPTH . 2R> DROP DROP CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 4713553761] Test passed +[Hera] [HADES][TEST ] Testing 2>R ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4715053035] Expected: Should empty data stack: 0 +[Hera] [HADES][TEST ] [KRELTSC: 4716117525] Running 2>R.empty_stack: 2>R +[Hera] [HADES][TEST ] [KRELTSC: 4717137243] Expected error occurred +[Hera] [HADES][TEST ] Testing 2>R ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4718859327] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4719939378] 2>R: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4725512988] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 4726742496] Testing word: 2R> +[Hera] [HADES][TEST ] [KRELTSC: 4727556015] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4728437259] Running 2R>.roundtrip: 5 6 2>R 2R> . . CR +[Hera] 6 5 +[Hera] [HADES][TEST ] [KRELTSC: 4729905789] Test passed +[Hera] [HADES][TEST ] Testing 2R> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4731439461] Expected: Should retrieve double: 6 5 +[Hera] [HADES][TEST ] [KRELTSC: 4732515942] Running 2R>.depth: 9 8 2>R 2R> DEPTH . CR +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 4734003603] Test passed +[Hera] [HADES][TEST ] Testing 2R> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4739940366] Expected: Should push 2 items to data stack: 2 +[Hera] [HADES][TEST ] [KRELTSC: 4741047885] Running 2R>.empty_rstack: 2R> +[Hera] [HADES][TEST ] [KRELTSC: 4742088603] Expected error occurred +[Hera] [HADES][TEST ] Testing 2R> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4743741261] Expected: Should cause return stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4744890255] 2R>: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4745989941] ▶ Testing module: v3/src/test_runner/modules/double_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 4747282428] Testing word: 2R@ +[Hera] [HADES][TEST ] [KRELTSC: 4748129442] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4749026751] Running 2R@.peek: 3 4 2>R 2R@ . . 2R> DROP DROP CR +[Hera] 4 3 +[Hera] [HADES][TEST ] [KRELTSC: 4755525327] Test passed +[Hera] [HADES][TEST ] Testing 2R@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4757079999] Expected: Should peek: 4 3 +[Hera] [HADES][TEST ] [KRELTSC: 4758004734] Running 2R@.non_destructive: 7 8 2>R 2R@ DROP DROP 2R> . . CR +[Hera] 8 7 +[Hera] [HADES][TEST ] [KRELTSC: 4759619256] Test passed +[Hera] [HADES][TEST ] Testing 2R@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4761154188] Expected: Should leave rstack intact +[Hera] [HADES][TEST ] [KRELTSC: 4762225104] Running 2R@.empty_rstack: 2R@ +[Hera] [HADES][TEST ] [KRELTSC: 4763404716] Expected error occurred +[Hera] [HADES][TEST ] Testing 2R@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4769239083] Expected: Should cause return stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 4772486334] 2R@: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4773718509] === Double Number Words Summary: 0 passed, 0 failed, 0 skipped, +[Hera] [HADES][INFO ] [KRELTSC: 4774976388] +[Hera] === Testing Module: Format Words === +[Hera] [HADES][INFO ] [KRELTSC: 4776277422] Running Format Words Tests (Module 10)... +[Hera] [HADES][TEST ] [KRELTSC: 4777405206] ▶ Testing module: v3/src/test_runner/modules/format_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 4778686206] Testing word: BASE +[Hera] [HADES][TEST ] [KRELTSC: 4784264604] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4785190074] Running BASE.decimal: DECIMAL 42 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 4786746573] Test passed +[Hera] [HADES][TEST ] Testing BASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4788374535] Expected: Should print: 42 +[Hera] [HADES][TEST ] [KRELTSC: 4789320942] Running BASE.hex: HEX FF . CR +[Hera] FF +[Hera] [HADES][TEST ] [KRELTSC: 4790720487] Test passed +[Hera] [HADES][TEST ] Testing BASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4792275474] Expected: Should print: FF +[Hera] [HADES][TEST ] [KRELTSC: 4793235321] Running BASE.octal: OCTAL 52 . CR +[Hera] 52 +[Hera] [HADES][TEST ] [KRELTSC: 4799603046] Test passed +[Hera] [HADES][TEST ] Testing BASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4801151397] Expected: Should print: 52 +[Hera] [HADES][TEST ] [KRELTSC: 4802127288] Running BASE.base_store: 16 BASE ! 255 . CR +[Hera] 723 +[Hera] [HADES][TEST ] [KRELTSC: 4803641157] Test passed +[Hera] [HADES][TEST ] Testing BASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4805208240] Expected: Should print: FF +[Hera] [HADES][TEST ] [KRELTSC: 4806194988] Running BASE.base_fetch: BASE @ . CR +[Hera] 16 +[Hera] [HADES][TEST ] [KRELTSC: 4807601505] Test passed +[Hera] [HADES][TEST ] Testing BASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4815069546] Expected: Should print current base +[Hera] [HADES][TEST ] [KRELTSC: 4816236705] BASE: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4817367765] ▶ Testing module: v3/src/test_runner/modules/format_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 4818582342] Testing word: DECIMAL +[Hera] [HADES][TEST ] [KRELTSC: 4819414383] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4820345187] Running DECIMAL.from_hex: HEX FF DECIMAL . CR +[Hera] 255 +[Hera] [HADES][TEST ] [KRELTSC: 4821831756] Test passed +[Hera] [HADES][TEST ] Testing DECIMAL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4828425777] Expected: Should print: 255 +[Hera] [HADES][TEST ] [KRELTSC: 4829337828] Running DECIMAL.from_octal: OCTAL 52 DECIMAL . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 4830869715] Test passed +[Hera] [HADES][TEST ] Testing DECIMAL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4832435958] Expected: Should print: 42 +[Hera] [HADES][TEST ] [KRELTSC: 4833362667] Running DECIMAL.state_persist: DECIMAL 42 . CR 42 . CR HEX 42 +[Hera] 42 +[Hera] 42 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 4835563362] Test passed +[Hera] [HADES][TEST ] Testing DECIMAL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4841810526] Expected: Should maintain base +[Hera] [HADES][TEST ] [KRELTSC: 4843148373] DECIMAL: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4844211120] ▶ Testing module: v3/src/test_runner/modules/format_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 4845454152] Testing word: HEX +[Hera] [HADES][TEST ] [KRELTSC: 4846318491] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4847230122] Running HEX.from_decimal: DECIMAL 255 HEX . CR +[Hera] FF +[Hera] [HADES][TEST ] [KRELTSC: 4848723474] Test passed +[Hera] [HADES][TEST ] Testing HEX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4850318298] Expected: Should print: FF +[Hera] [HADES][TEST ] [KRELTSC: 4851258804] Running HEX.from_octal: OCTAL 52 HEX . CR +[Hera] 2A +[Hera] [HADES][TEST ] [KRELTSC: 4857897681] Test passed +[Hera] [HADES][TEST ] Testing HEX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4859348823] Expected: Should print: 2A +[Hera] [HADES][TEST ] [KRELTSC: 4860369990] Running HEX.state_persist: HEX FF . CR DECIMAL 255 . CR +[Hera] FF +[Hera] [HADES][INFO ] [KRELTSC: 4862012715] L8[TABLE]: Config 38 → 39 regime=2 score=52428 L1=0 L2=1 L3=0 +[Hera] 255 +[Hera] [HADES][TEST ] [KRELTSC: 4863614112] Test passed +[Hera] [HADES][TEST ] Testing HEX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4865200515] Expected: Should maintain base +[Hera] [HADES][TEST ] [KRELTSC: 4866178128] HEX: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4871898591] ▶ Testing module: v3/src/test_runner/modules/format_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 4874303322] Testing word: OCTAL +[Hera] [HADES][TEST ] [KRELTSC: 4875085845] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4875956400] Running OCTAL.from_decimal: DECIMAL 42 OCTAL . CR +[Hera] 52 +[Hera] [HADES][TEST ] [KRELTSC: 4877447001] Test passed +[Hera] [HADES][TEST ] Testing OCTAL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4879055412] Expected: Should print: 52 +[Hera] [HADES][TEST ] [KRELTSC: 4879992957] Running OCTAL.from_hex: HEX 2A OCTAL . CR +[Hera] 52 +[Hera] [HADES][TEST ] [KRELTSC: 4888459044] Test passed +[Hera] [HADES][TEST ] Testing OCTAL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4890183060] Expected: Should print: 52 +[Hera] [HADES][TEST ] [KRELTSC: 4891078311] Running OCTAL.state_persist: DECIMAL 42 . CR OCTAL 52 . CR +[Hera] 42 +[Hera] 52 +[Hera] [HADES][TEST ] [KRELTSC: 4892950608] Test passed +[Hera] [HADES][TEST ] Testing OCTAL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4894567944] Expected: Should maintain base +[Hera] [HADES][TEST ] [KRELTSC: 4901198127] OCTAL: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4902350943] ▶ Testing module: v3/src/test_runner/modules/format_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 4903589565] Testing word: <# +[Hera] [HADES][TEST ] [KRELTSC: 4904417679] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4905323745] Running <#.basic: DECIMAL 42 S>D <# #S #> TYPE CR +[Hera] 774763251095801167872 +[Hera] [HADES][TEST ] [KRELTSC: 4908016071] Test passed +[Hera] [HADES][TEST ] Testing <# ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4915948884] Expected: Should format number +[Hera] [HADES][TEST ] [KRELTSC: 4918341687] Running <#.empty: 0 <# #> TYPE CR + +[Hera] [HADES][TEST ] [KRELTSC: 4919529174] Test passed +[Hera] [HADES][TEST ] Testing <# ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4921008246] Expected: Should handle zero +[Hera] [HADES][TEST ] [KRELTSC: 4921959399] Running <#.negative: -42 <# #S #> TYPE CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 4923592149] Test passed +[Hera] [HADES][TEST ] Testing <# ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4933222644] Expected: Should handle negative +[Hera] [HADES][TEST ] [KRELTSC: 4934171487] <#: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4935182847] ▶ Testing module: v3/src/test_runner/modules/format_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 4936296498] Testing word: # +[Hera] [HADES][TEST ] [KRELTSC: 4937072868] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4937923137] Running #.single_digit: 15 <# # #> TYPE CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 4946629317] Test passed +[Hera] [HADES][TEST ] Testing # ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4948666275] Expected: Should print rightmost digit +[Hera] [HADES][TEST ] [KRELTSC: 4949685888] Running #.multiple: 15 <# # # #> TYPE CR +[Hera] 15 +[Hera] [HADES][TEST ] [KRELTSC: 4951067352] Test passed +[Hera] [HADES][TEST ] Testing # ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4952640294] Expected: Should print digits right to left +[Hera] [HADES][TEST ] [KRELTSC: 4959768429] Running #.zero_pad: 5 <# # 0 # #> TYPE CR +[Hera] 05 +[Hera] [HADES][TEST ] [KRELTSC: 4961183871] Test passed +[Hera] [HADES][TEST ] Testing # ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4962632955] Expected: Should handle zero padding +[Hera] [HADES][TEST ] [KRELTSC: 4963721574] #: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4964780415] ▶ Testing module: v3/src/test_runner/modules/format_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 4966008705] Testing word: #S +[Hera] [HADES][TEST ] [KRELTSC: 4966864371] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4967729844] Running #S.basic: 42 <# #S #> TYPE CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 4973858673] Test passed +[Hera] [HADES][TEST ] Testing #S ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4975437705] Expected: Should convert all digits +[Hera] [HADES][TEST ] [KRELTSC: 4976431152] Running #S.zero: 0 <# #S #> TYPE CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 4977797265] Test passed +[Hera] [HADES][TEST ] Testing #S ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4979303952] Expected: Should handle zero +[Hera] [HADES][TEST ] [KRELTSC: 4980248784] Running #S.large: 1234567890 <# #S #> TYPE CR +[Hera] 1234567890 +[Hera] [HADES][TEST ] [KRELTSC: 4981847661] Test passed +[Hera] [HADES][TEST ] Testing #S ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4988376057] Expected: Should handle large numbers +[Hera] [HADES][TEST ] [KRELTSC: 4989342645] #S: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 4990464549] ▶ Testing module: v3/src/test_runner/modules/format_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 4991696598] Testing word: SIGN +[Hera] [HADES][TEST ] [KRELTSC: 4992564108] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 4993440627] Running SIGN.negative: -42 ABS <# #S SIGN #> TYPE CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 4995180582] Test passed +[Hera] [HADES][TEST ] Testing SIGN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 4996785549] Expected: Should add minus +[Hera] [HADES][TEST ] [KRELTSC: 5002495008] Running SIGN.positive: 42 <# #S SIGN #> TYPE CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 5003994912] Test passed +[Hera] [HADES][TEST ] Testing SIGN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5005602168] Expected: Should not add sign +[Hera] [HADES][TEST ] [KRELTSC: 5006567223] Running SIGN.zero: 0 <# #S SIGN #> TYPE CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 5007948309] Test passed +[Hera] [HADES][TEST ] Testing SIGN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5009466777] Expected: Should handle zero +[Hera] [HADES][TEST ] [KRELTSC: 5010457431] SIGN: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5011542123] ▶ Testing module: v3/src/test_runner/modules/format_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 5017799682] Testing word: #> +[Hera] [HADES][TEST ] [KRELTSC: 5018619375] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5019528318] Running #>.normal: 42 <# #S #> TYPE CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 5020980846] Test passed +[Hera] [HADES][TEST ] Testing #> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5022541020] Expected: Should terminate formatting +[Hera] [HADES][TEST ] [KRELTSC: 5023579722] Running #>.empty: 0 <# #> TYPE CR + +[Hera] [HADES][TEST ] [KRELTSC: 5024670924] Test passed +[Hera] [HADES][TEST ] Testing #> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5026199829] Expected: Should handle empty format +[Hera] [HADES][TEST ] [KRELTSC: 5032174287] Running #>.stack_effect: 42 <# #S #> SWAP . . CR +[Hera] 24 2 +[Hera] [HADES][TEST ] [KRELTSC: 5033739900] Test passed +[Hera] [HADES][TEST ] Testing #> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5035308873] Expected: Should leave addr u +[Hera] [HADES][TEST ] [KRELTSC: 5036910102] #>: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5039542872] ▶ Testing module: v3/src/test_runner/modules/format_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 5045689194] Testing word: HOLD +[Hera] [HADES][TEST ] [KRELTSC: 5047674681] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5049710988] Running HOLD.basic: 42 <# 46 HOLD #S #> TYPE CR +[Hera] 42. +[Hera] [HADES][TEST ] [KRELTSC: 5051714409] Test passed +[Hera] [HADES][TEST ] Testing HOLD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5053282668] Expected: Should insert dot +[Hera] [HADES][TEST ] [KRELTSC: 5054259021] Running HOLD.overflow: <# 257 HOLD #> +[Hera] [HADES][ERROR] [KRELTSC: 5055484266] HOLD: byte out of range (257) +[Hera] [HADES][TEST ] [KRELTSC: 5063116947] Expected error occurred +[Hera] [HADES][TEST ] Testing HOLD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5065981998] Expected: Should handle overflow +[Hera] [HADES][TEST ] [KRELTSC: 5066939136] HOLD: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5068068285] === Format Words Summary: 0 passed, 0 failed, 0 skipped, 0 erro +[Hera] [HADES][INFO ] [KRELTSC: 5069339268] +[Hera] === Testing Module: String Words === +[Hera] [HADES][INFO ] [KRELTSC: 5075768838] Running String Words Tests (Module 11)... +[Hera] [HADES][TEST ] [KRELTSC: 5078281278] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 5080469436] Testing word: COUNT +[Hera] [HADES][TEST ] [KRELTSC: 5081289444] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5082160314] Running COUNT.basic: HERE S" Test" DROP COUNT . . CR +[Hera] 84 121 +[Hera] [HADES][TEST ] [KRELTSC: 5084480877] Test passed +[Hera] [HADES][TEST ] Testing COUNT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5090924055] Expected: Should show length and addr+1 +[Hera] [HADES][TEST ] [KRELTSC: 5093376498] Running COUNT.empty: HERE 0 OVER C! COUNT . . CR +[Hera] 0 126 +[Hera] [HADES][TEST ] [KRELTSC: 5095649013] Test passed +[Hera] [HADES][TEST ] Testing COUNT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5097198792] Expected: Should handle empty string +[Hera] [HADES][TEST ] [KRELTSC: 5098211265] Running COUNT.max_length: HERE 255 OVER C! COUNT . . CR +[Hera] 255 126 +[Hera] [HADES][TEST ] [KRELTSC: 5104487745] Test passed +[Hera] [HADES][TEST ] Testing COUNT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5109029184] Expected: Should handle max length +[Hera] [HADES][TEST ] [KRELTSC: 5110308231] Running COUNT.string_bounds: HERE COUNT SWAP 1- = . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 5111911980] Test passed +[Hera] [HADES][TEST ] Testing COUNT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5113544751] Expected: Should increment address +[Hera] [HADES][TEST ] [KRELTSC: 5121285519] Running COUNT.empty_stack: COUNT +[Hera] [HADES][ERROR] [KRELTSC: 5124432159] COUNT: Data stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 5125388037] Expected error occurred +[Hera] [HADES][TEST ] Testing COUNT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5127141831] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 5128351620] COUNT: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5135411568] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 5137383972] Testing word: -TRAILING +[Hera] [HADES][TEST ] [KRELTSC: 5138275212] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5139170169] Running -TRAILING.basic: HERE S" Test " -TRAILING TYPE CR +[Hera] Test +[Hera] [HADES][TEST ] [KRELTSC: 5141134866] Test passed +[Hera] [HADES][TEST ] Testing -TRAILING ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5149083177] Expected: Should trim spaces +[Hera] [HADES][TEST ] [KRELTSC: 5151754503] Running -TRAILING.all_spaces: HERE S" " -TRAILING TYPE CR + +[Hera] [HADES][TEST ] [KRELTSC: 5154315432] Test passed +[Hera] [HADES][TEST ] Testing -TRAILING ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5155965591] Expected: Should handle all spaces +[Hera] [HADES][TEST ] [KRELTSC: 5156986569] Running -TRAILING.no_spaces: HERE S" Test" -TRAILING TYPE CR +[Hera] Test +[Hera] [HADES][TEST ] [KRELTSC: 5164324473] Test passed +[Hera] [HADES][TEST ] Testing -TRAILING ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5166921585] Expected: Should handle no spaces +[Hera] [HADES][TEST ] [KRELTSC: 5167946868] Running -TRAILING.empty: HERE 0 -TRAILING TYPE CR + +[Hera] [HADES][TEST ] [KRELTSC: 5169232719] Test passed +[Hera] [HADES][TEST ] Testing -TRAILING ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5170913181] Expected: Should handle empty string +[Hera] [HADES][TEST ] [KRELTSC: 5177288697] -TRAILING: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5178838392] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 5179931484] Testing word: CMOVE +[Hera] [HADES][TEST ] [KRELTSC: 5180756364] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5181672195] Running CMOVE.basic: HERE S" Test" DUP >R HERE 10 + SWAP CMOV + +[Hera] [HADES][TEST ] [KRELTSC: 5183357844] Test passed +[Hera] [HADES][TEST ] Testing CMOVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5185025433] Expected: Should copy string +[Hera] [HADES][TEST ] [KRELTSC: 5185993974] Running CMOVE.empty: HERE HERE 10 + 0 CMOVE +[Hera] [HADES][TEST ] [KRELTSC: 5192167029] Test passed +[Hera] [HADES][TEST ] Testing CMOVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5195411256] Expected: Should handle zero count +[Hera] [HADES][TEST ] [KRELTSC: 5196456300] Running CMOVE.overlap: HERE DUP 1+ 5 CMOVE +[Hera] [HADES][TEST ] [KRELTSC: 5197588284] Test passed +[Hera] [HADES][TEST ] Testing CMOVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5199192285] Expected: Should handle overlap +[Hera] [HADES][TEST ] [KRELTSC: 5200237056] Running CMOVE.bounds: HERE PAD 1000 CMOVE +[Hera] [HADES][ERROR] [KRELTSC: 5207276844] CMOVE: out-of-bounds (src=125 dst=5242368 n=1000) +[Hera] [HADES][TEST ] [KRELTSC: 5209231818] Expected error occurred +[Hera] [HADES][TEST ] Testing CMOVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5211574473] Expected: Should check bounds +[Hera] [HADES][TEST ] [KRELTSC: 5212546143] CMOVE: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5213638962] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 5214969018] Testing word: CMOVE> +[Hera] [HADES][TEST ] [KRELTSC: 5221299027] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5222659092] Running CMOVE>.basic: HERE S" Test" DUP >R HERE 10 + SWAP CMO + +[Hera] [HADES][TEST ] [KRELTSC: 5225573955] Test passed +[Hera] [HADES][TEST ] Testing CMOVE> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5227150068] Expected: Should copy backward +[Hera] [HADES][TEST ] [KRELTSC: 5228172306] Running CMOVE>.empty: HERE HERE 10 + 0 CMOVE> +[Hera] [HADES][TEST ] [KRELTSC: 5229403683] Test passed +[Hera] [HADES][TEST ] Testing CMOVE> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5238278304] Expected: Should handle zero count +[Hera] [HADES][TEST ] [KRELTSC: 5240092326] Running CMOVE>.overlap: HERE DUP 1+ 5 CMOVE> +[Hera] [HADES][TEST ] [KRELTSC: 5241268347] Test passed +[Hera] [HADES][TEST ] Testing CMOVE> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5242858236] Expected: Should handle overlap +[Hera] [HADES][TEST ] [KRELTSC: 5243900424] Running CMOVE>.bounds: HERE PAD 1000 CMOVE> +[Hera] [HADES][ERROR] [KRELTSC: 5250024906] CMOVE>: out-of-bounds (src=125 dst=5242368 n=1000) +[Hera] [HADES][TEST ] [KRELTSC: 5252822190] Expected error occurred +[Hera] [HADES][TEST ] Testing CMOVE> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5255496708] Expected: Should check bounds +[Hera] [HADES][TEST ] [KRELTSC: 5256488727] CMOVE>: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5257627179] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 5258938755] Testing word: COMPARE +[Hera] [HADES][TEST ] [KRELTSC: 5265549765] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5266355052] Running COMPARE.equal: HERE S" Test" HERE S" Test" COMPARE . +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 5269395264] Test passed +[Hera] [HADES][TEST ] Testing COMPARE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5271045024] Expected: Should return 0 +[Hera] [HADES][TEST ] [KRELTSC: 5272030827] Running COMPARE.less: HERE S" Test1" HERE S" Test2" COMPARE . +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 5273732352] Test passed +[Hera] [HADES][TEST ] Testing COMPARE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5283920481] Expected: Should return -1 +[Hera] [HADES][TEST ] [KRELTSC: 5284891731] Running COMPARE.greater: HERE S" Test2" HERE S" Test1" COMPAR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 5286538173] Test passed +[Hera] [HADES][TEST ] Testing COMPARE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5288223633] Expected: Should return 1 +[Hera] [HADES][TEST ] [KRELTSC: 5293761606] Running COMPARE.different_lengths: HERE S" Test" HERE S" Test +[Hera] [HADES][INFO ] [KRELTSC: 5296376883] L8[TABLE]: Config 39 → 40 regime=2 score=6553 L1=0 L2=1 L3=0 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 5297977650] Test passed +[Hera] [HADES][TEST ] Testing COMPARE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5299531356] Expected: Should handle lengths +[Hera] [HADES][TEST ] [KRELTSC: 5300538684] Running COMPARE.empty: HERE 0 HERE 0 COMPARE . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 5302282209] Test passed +[Hera] [HADES][TEST ] Testing COMPARE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5310261810] Expected: Should handle empty +[Hera] [HADES][TEST ] [KRELTSC: 5311215420] COMPARE: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5312175834] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 5313303366] Testing word: SEARCH +[Hera] [HADES][TEST ] [KRELTSC: 5314222284] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5315149077] Running SEARCH.found: HERE S" Testing" HERE S" Test" SEARCH . +[Hera] -1 15 120 +[Hera] [HADES][TEST ] [KRELTSC: 5317528860] Test passed +[Hera] [HADES][TEST ] Testing SEARCH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5327756259] Expected: Should find substring +[Hera] [HADES][TEST ] [KRELTSC: 5328786015] Running SEARCH.not_found: HERE S" Testing" HERE S" Xyz" SEARC +[Hera] -1 7 141 +[Hera] [HADES][TEST ] [KRELTSC: 5330556042] Test passed +[Hera] [HADES][TEST ] Testing SEARCH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5332154856] Expected: Should return false +[Hera] [HADES][TEST ] [KRELTSC: 5337648687] Running SEARCH.empty_pattern: HERE S" Test" HERE 0 SEARCH . . +[Hera] -1 4 145 +[Hera] [HADES][TEST ] [KRELTSC: 5340761979] Test passed +[Hera] [HADES][TEST ] Testing SEARCH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5342359281] Expected: Should handle empty pattern +[Hera] [HADES][TEST ] [KRELTSC: 5343401679] Running SEARCH.empty_string: HERE 0 HERE S" Test" SEARCH . . +[Hera] -1 30 120 +[Hera] [HADES][TEST ] [KRELTSC: 5345139009] Test passed +[Hera] [HADES][TEST ] Testing SEARCH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5352173043] Expected: Should handle empty string +[Hera] [HADES][TEST ] [KRELTSC: 5354667990] SEARCH: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5355967512] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 5357192568] Testing word: SCAN +[Hera] [HADES][TEST ] [KRELTSC: 5358005142] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5358899595] Running SCAN.basic: HERE S" Test,Data" BL SCAN TYPE CR + +[Hera] [HADES][TEST ] [KRELTSC: 5360696187] Test passed +[Hera] [HADES][TEST ] Testing SCAN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5367743766] Expected: Should find space +[Hera] [HADES][TEST ] [KRELTSC: 5369844879] Running SCAN.not_found: HERE S" TestData" BL SCAN TYPE CR + +[Hera] [HADES][TEST ] [KRELTSC: 5371176258] Test passed +[Hera] [HADES][TEST ] Testing SCAN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5372667384] Expected: Should scan to end +[Hera] [HADES][TEST ] [KRELTSC: 5373643968] Running SCAN.empty: HERE 0 BL SCAN TYPE CR + +[Hera] [HADES][TEST ] [KRELTSC: 5374955355] Test passed +[Hera] [HADES][TEST ] Testing SCAN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5382096867] Expected: Should handle empty +[Hera] [HADES][TEST ] [KRELTSC: 5384001210] Running SCAN.all_delims: HERE S" " BL SCAN TYPE CR +[Hera] +[Hera] [HADES][TEST ] [KRELTSC: 5385975798] Test passed +[Hera] [HADES][TEST ] Testing SCAN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5387481813] Expected: Should handle all delims +[Hera] [HADES][TEST ] [KRELTSC: 5388531351] SCAN: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5389660101] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 5396656965] Testing word: SKIP +[Hera] [HADES][TEST ] [KRELTSC: 5398126545] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5399600031] Running SKIP.basic: HERE S" Test" BL SKIP TYPE CR +[Hera] Test +[Hera] [HADES][TEST ] [KRELTSC: 5401504395] Test passed +[Hera] [HADES][TEST ] Testing SKIP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5403085716] Expected: Should skip spaces +[Hera] [HADES][TEST ] [KRELTSC: 5404121016] Running SKIP.no_delims: HERE S" Test" BL SKIP TYPE CR +[Hera] Test +[Hera] [HADES][TEST ] [KRELTSC: 5411507136] Test passed +[Hera] [HADES][TEST ] Testing SKIP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5414278737] Expected: Should not skip +[Hera] [HADES][TEST ] [KRELTSC: 5415186399] Running SKIP.empty: HERE 0 BL SKIP TYPE CR + +[Hera] [HADES][TEST ] [KRELTSC: 5416381803] Test passed +[Hera] [HADES][TEST ] Testing SKIP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5417969319] Expected: Should handle empty +[Hera] [HADES][TEST ] [KRELTSC: 5419044057] Running SKIP.all_delims: HERE S" " BL SKIP TYPE CR + +[Hera] [HADES][TEST ] [KRELTSC: 5425929999] Test passed +[Hera] [HADES][TEST ] Testing SKIP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5427420789] Expected: Should skip all +[Hera] [HADES][TEST ] [KRELTSC: 5428311063] SKIP: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5430429459] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 5431818924] Testing word: BLANK +[Hera] [HADES][TEST ] [KRELTSC: 5432742546] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5433628452] Running BLANK.basic: HERE 5 BLANK HERE 5 TYPE CR +[Hera] +[Hera] [HADES][TEST ] [KRELTSC: 5441276022] Test passed +[Hera] [HADES][TEST ] Testing BLANK ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5443950708] Expected: Should fill with spaces +[Hera] [HADES][TEST ] [KRELTSC: 5444961879] Running BLANK.zero: HERE 0 BLANK HERE 0 TYPE CR + +[Hera] [HADES][TEST ] [KRELTSC: 5446172823] Test passed +[Hera] [HADES][TEST ] Testing BLANK ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5447796249] Expected: Should handle zero count +[Hera] [HADES][TEST ] [KRELTSC: 5454278046] BLANK: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5455741389] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 5458222539] Testing word: S" +[Hera] [HADES][TEST ] [KRELTSC: 5459032824] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5459920683] Running S".interpret_len: S" hello" . CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 5461401960] Test passed +[Hera] [HADES][TEST ] Testing S" ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5462953125] Expected: Should print: 5 (length) +[Hera] [HADES][TEST ] [KRELTSC: 5470551912] Running S".interpret_type: S" hello" TYPE CR +[Hera] hello +[Hera] [HADES][TEST ] [KRELTSC: 5473454700] Test passed +[Hera] [HADES][TEST ] Testing S" ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5474989674] Expected: Should print: hello +[Hera] [HADES][TEST ] [KRELTSC: 5475968757] Running S".empty: S" " . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 5477327625] Test passed +[Hera] [HADES][TEST ] Testing S" ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5485755072] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 5487573147] Running S".compile_type: : TSQ S" world" TYPE CR ; TSQ +[Hera] world +[Hera] [HADES][TEST ] [KRELTSC: 5491529694] Test passed +[Hera] [HADES][TEST ] Testing S" ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5499990426] Expected: Should print: world +[Hera] [HADES][TEST ] [KRELTSC: 5502350091] Running S".compile_len: : TSQ2 S" forth" SWAP DROP . CR ; TSQ +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 5504326128] Test passed +[Hera] [HADES][TEST ] Testing S" ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5505878469] Expected: Should print: 5 +[Hera] [HADES][TEST ] [KRELTSC: 5510834385] Running S".compile_twice: : TSQ3 S" ab" TYPE S" cd" TYPE CR ; +[Hera] abcd +[Hera] [HADES][TEST ] [KRELTSC: 5513863257] Test passed +[Hera] [HADES][TEST ] Testing S" ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5515957797] Expected: Should print: abcd +[Hera] [HADES][TEST ] [KRELTSC: 5516907774] S": 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5517958236] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 5519192259] Testing word: BL +[Hera] [HADES][TEST ] [KRELTSC: 5520032994] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5520905208] Running BL.value: BL . CR +[Hera] 32 +[Hera] [HADES][TEST ] [KRELTSC: 5528591775] Test passed +[Hera] [HADES][TEST ] Testing BL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5531756853] Expected: Should print: 32 +[Hera] [HADES][TEST ] [KRELTSC: 5532729153] Running BL.as_char: BL EMIT CR +[Hera] +[Hera] [HADES][TEST ] [KRELTSC: 5534181261] Test passed +[Hera] [HADES][TEST ] Testing BL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5535961473] Expected: Should emit a space +[Hera] [HADES][TEST ] [KRELTSC: 5542371261] Running BL.in_scan: HERE S" a b" BL SCAN SWAP DROP . CR +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 5544974316] Test passed +[Hera] [HADES][TEST ] Testing BL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5546491251] Expected: Should find space at offset 1 +[Hera] [HADES][TEST ] [KRELTSC: 5547643920] BL: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5548801272] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 5550079920] Testing word: SOURCE +[Hera] [HADES][TEST ] [KRELTSC: 5555184180] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5556472215] Running SOURCE.returns_pair: SOURCE SWAP DROP 0< NOT . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 5559892002] Test passed +[Hera] [HADES][TEST ] Testing SOURCE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5561462529] Expected: Should return non-negative length +[Hera] [HADES][TEST ] [KRELTSC: 5562550560] Running SOURCE.has_addr: SOURCE DROP 0<> . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 5564036184] Test passed +[Hera] [HADES][TEST ] Testing SOURCE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5571617331] Expected: Should return non-null address +[Hera] [HADES][TEST ] [KRELTSC: 5574559137] SOURCE: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5576416419] ▶ Testing module: v3/src/test_runner/modules/string_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 5577651534] Testing word: >IN +[Hera] [HADES][TEST ] [KRELTSC: 5578459299] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5579349006] Running >IN.initial: >IN @ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 5585388984] Test passed +[Hera] [HADES][TEST ] Testing >IN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5586940086] Expected: Should return input offset +[Hera] [HADES][TEST ] [KRELTSC: 5588091663] Running >IN.advances: : TWIN >IN @ >IN @ - . CR ; TWIN +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 5589981054] Test passed +[Hera] [HADES][TEST ] Testing >IN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5591515881] Expected: Should print: 0 (no advance inside compiled word) +[Hera] [HADES][TEST ] [KRELTSC: 5592757569] >IN: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5593990500] === String Words Summary: 0 passed, 0 failed, 0 skipped, 0 erro +[Hera] [HADES][INFO ] [KRELTSC: 5602390248] +[Hera] === Testing Module: I/O Words === +[Hera] [HADES][INFO ] [KRELTSC: 5606231925] Running I/O Words Tests (Module 9)... +[Hera] [HADES][TEST ] [KRELTSC: 5607924000] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 5615470917] Testing word: . +[Hera] [HADES][TEST ] [KRELTSC: 5616668400] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5617516107] Running ..positive: 42 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 5620284747] Test passed +[Hera] [HADES][TEST ] Testing . ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5621805042] Expected: Should print: 42 +[Hera] [HADES][TEST ] [KRELTSC: 5622781206] Running ..negative: -42 . CR +[Hera] -42 +[Hera] [HADES][TEST ] [KRELTSC: 5628687540] Test passed +[Hera] [HADES][TEST ] Testing . ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5630179191] Expected: Should print: -42 +[Hera] [HADES][TEST ] [KRELTSC: 5631195423] Running ..zero: 0 . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 5632371864] Test passed +[Hera] [HADES][TEST ] Testing . ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5633914671] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 5634826092] Running ..max_int: 2147483647 . CR +[Hera] 2147483647 +[Hera] [HADES][TEST ] [KRELTSC: 5636227653] Test passed +[Hera] [HADES][TEST ] Testing . ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5637815232] Expected: Should print: 2147483647 +[Hera] [HADES][TEST ] [KRELTSC: 5644107693] Running ..min_int: -2147483648 . CR +[Hera] -2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 5645987214] Test passed +[Hera] [HADES][TEST ] Testing . ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5647456374] Expected: Should print: -2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 5648485752] Running ..multiple: 1 2 3 . . . CR +[Hera] 3 2 1 +[Hera] [HADES][TEST ] [KRELTSC: 5649828660] Test passed +[Hera] [HADES][TEST ] Testing . ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5651376969] Expected: Should print: 3 2 1 +[Hera] [HADES][TEST ] [KRELTSC: 5652348093] Running ..empty_stack: . +[Hera] [HADES][TEST ] [KRELTSC: 5659061562] Expected error occurred +[Hera] [HADES][TEST ] Testing . ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5661902631] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 5662950615] .: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5664029469] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 5665244088] Testing word: CR +[Hera] [HADES][TEST ] [KRELTSC: 5666054982] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5666943345] Running CR.basic: 42 . CR 43 . CR +[Hera] 42 +[Hera] 43 +[Hera] [HADES][TEST ] [KRELTSC: 5673382701] Test passed +[Hera] [HADES][TEST ] Testing CR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5675664204] Expected: Should print on separate lines +[Hera] [HADES][TEST ] [KRELTSC: 5677128072] Running CR.multiple: CR CR CR + + + +[Hera] [HADES][TEST ] [KRELTSC: 5678127882] Test passed +[Hera] [HADES][TEST ] Testing CR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5679621780] Expected: Should print multiple newlines +[Hera] [HADES][TEST ] [KRELTSC: 5680708467] Running CR.no_stack_effect: DEPTH CR DEPTH = . CR + +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 5682275172] Test passed +[Hera] [HADES][TEST ] Testing CR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5689669020] Expected: Should not affect stack +[Hera] [HADES][TEST ] [KRELTSC: 5690666604] Running CR.after_output: 1 2 3 . . . CR +[Hera] 3 2 1 +[Hera] [HADES][TEST ] [KRELTSC: 5692101492] Test passed +[Hera] [HADES][TEST ] Testing CR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5693611581] Expected: Should work after output +[Hera] [HADES][TEST ] [KRELTSC: 5694639237] CR: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5695708704] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 5702964624] Testing word: SPACE +[Hera] [HADES][TEST ] [KRELTSC: 5703993414] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5706118089] Running SPACE.basic: 42 . SPACE 43 . CR +[Hera] 42 43 +[Hera] [HADES][TEST ] [KRELTSC: 5707666503] Test passed +[Hera] [HADES][TEST ] Testing SPACE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5709233082] Expected: Should add space between numbers +[Hera] [HADES][TEST ] [KRELTSC: 5710352781] Running SPACE.multiple: SPACE SPACE SPACE +[Hera] [HADES][INFO ] [KRELTSC: 5719303527] L8[TABLE]: Config 40 → 0 regime=7 score=26214 L1=0 L2=0 L3=0 +[Hera] [HADES][TEST ] [KRELTSC: 5721480303] Test passed +[Hera] [HADES][TEST ] Testing SPACE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5722782261] Expected: Should print multiple spaces +[Hera] [HADES][TEST ] [KRELTSC: 5723851119] Running SPACE.no_stack_effect: DEPTH SPACE DEPTH = . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 5725422906] Test passed +[Hera] [HADES][TEST ] Testing SPACE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5733339003] Expected: Should not affect stack +[Hera] [HADES][TEST ] [KRELTSC: 5735650767] Running SPACE.with_text: 65 EMIT SPACE 66 EMIT CR +[Hera] A B +[Hera] [HADES][TEST ] [KRELTSC: 5737136181] Test passed +[Hera] [HADES][TEST ] Testing SPACE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5738733294] Expected: Should space between chars +[Hera] [HADES][TEST ] [KRELTSC: 5739770799] SPACE: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5746949418] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 5748898827] Testing word: SPACES +[Hera] [HADES][TEST ] [KRELTSC: 5750451420] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5751349632] Running SPACES.zero: 0 SPACES +[Hera] [HADES][TEST ] [KRELTSC: 5752500453] Test passed +[Hera] [HADES][TEST ] Testing SPACES ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5754089166] Expected: Should print no spaces +[Hera] [HADES][TEST ] [KRELTSC: 5759659626] Running SPACES.one: 1 SPACES +[Hera] [HADES][TEST ] [KRELTSC: 5761514472] Test passed +[Hera] [HADES][TEST ] Testing SPACES ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5763203691] Expected: Should print one space +[Hera] [HADES][TEST ] [KRELTSC: 5764980816] Running SPACES.multiple: 5 SPACES +[Hera] [HADES][TEST ] [KRELTSC: 5766272127] Test passed +[Hera] [HADES][TEST ] Testing SPACES ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5767606719] Expected: Should print five spaces +[Hera] [HADES][TEST ] [KRELTSC: 5768643573] Running SPACES.large: 20 SPACES +[Hera] [HADES][TEST ] [KRELTSC: 5775529179] Test passed +[Hera] [HADES][TEST ] Testing SPACES ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5776853838] Expected: Should print twenty spaces +[Hera] [HADES][TEST ] [KRELTSC: 5777871708] Running SPACES.negative: -5 SPACES +[Hera] [HADES][TEST ] [KRELTSC: 5778941133] Test passed +[Hera] [HADES][TEST ] Testing SPACES ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5780533038] Expected: Should handle negative +[Hera] [HADES][TEST ] [KRELTSC: 5781504456] Running SPACES.with_output: 42 . 3 SPACES 43 . CR +[Hera] 42 43 +[Hera] [HADES][TEST ] [KRELTSC: 5783123619] Test passed +[Hera] [HADES][TEST ] Testing SPACES ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5791064286] Expected: Should space output +[Hera] [HADES][TEST ] [KRELTSC: 5792033184] Running SPACES.empty_stack: SPACES +[Hera] [HADES][TEST ] [KRELTSC: 5794499046] Expected error occurred +[Hera] [HADES][TEST ] Testing SPACES ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5796150654] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 5797208865] SPACES: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5798319030] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 5806018722] Testing word: EMIT +[Hera] [HADES][TEST ] [KRELTSC: 5807306631] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5809104735] Running EMIT.letter_A: 65 EMIT CR +[Hera] A +[Hera] [HADES][TEST ] [KRELTSC: 5810429646] Test passed +[Hera] [HADES][TEST ] Testing EMIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5812013151] Expected: Should print: A +[Hera] [HADES][TEST ] [KRELTSC: 5818030407] Running EMIT.letter_Z: 90 EMIT CR +[Hera] Z +[Hera] [HADES][TEST ] [KRELTSC: 5819807133] Test passed +[Hera] [HADES][TEST ] Testing EMIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5821373208] Expected: Should print: Z +[Hera] [HADES][TEST ] [KRELTSC: 5822309199] Running EMIT.digit: 48 EMIT CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 5823551853] Test passed +[Hera] [HADES][TEST ] Testing EMIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5825086680] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 5826039597] Running EMIT.space_char: 32 EMIT CR +[Hera] +[Hera] [HADES][TEST ] [KRELTSC: 5827333323] Test passed +[Hera] [HADES][TEST ] Testing EMIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5834263281] Expected: Should print space +[Hera] [HADES][TEST ] [KRELTSC: 5835219915] Running EMIT.newline: 10 EMIT + +[Hera] [HADES][TEST ] [KRELTSC: 5836218381] Test passed +[Hera] [HADES][TEST ] Testing EMIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5837746803] Expected: Should print newline +[Hera] [HADES][TEST ] [KRELTSC: 5838723324] Running EMIT.high_ascii: 127 EMIT CR +[Hera]  +[Hera] [HADES][TEST ] [KRELTSC: 5840004765] Test passed +[Hera] [HADES][TEST ] Testing EMIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5841582054] Expected: Should print DEL char +[Hera] [HADES][TEST ] [KRELTSC: 5848174353] Running EMIT.truncation: 321 EMIT CR +[Hera] A +[Hera] [HADES][TEST ] [KRELTSC: 5849552394] Test passed +[Hera] [HADES][TEST ] Testing EMIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5851051668] Expected: Should truncate to low byte +[Hera] [HADES][TEST ] [KRELTSC: 5852075082] Running EMIT.negative: -1 EMIT CR +[Hera] ÿ +[Hera] [HADES][TEST ] [KRELTSC: 5853335082] Test passed +[Hera] [HADES][TEST ] Testing EMIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5854857267] Expected: Should handle negative +[Hera] [HADES][TEST ] [KRELTSC: 5855878539] Running EMIT.sequence: 72 EMIT 73 EMIT 10 EMIT +[Hera] HI +[Hera] [HADES][TEST ] [KRELTSC: 5862903522] Test passed +[Hera] [HADES][TEST ] Testing EMIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5864449710] Expected: Should print: HI +[Hera] [HADES][TEST ] [KRELTSC: 5865408948] Running EMIT.empty_stack: EMIT +[Hera] [HADES][TEST ] [KRELTSC: 5866456449] Expected error occurred +[Hera] [HADES][TEST ] Testing EMIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5868118263] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 5869152912] EMIT: 10 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5870285589] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 5877182178] Testing word: KEY +[Hera] [HADES][TEST ] [KRELTSC: 5878003509] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5880120939] KEY: 0 passed, 0 failed, 4 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5881191162] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 5882394189] Testing word: ?KEY +[Hera] [HADES][TEST ] [KRELTSC: 5883231942] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5884107474] ?KEY: 0 passed, 0 failed, 3 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5885208945] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 5886510357] Testing word: TYPE +[Hera] [HADES][TEST ] [KRELTSC: 5892741561] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5893607118] Running TYPE.basic_string: HERE S" Hello" DUP >R HERE SWAP CM +[Hera] Hello +[Hera] [HADES][TEST ] [KRELTSC: 5895323973] Test passed +[Hera] [HADES][TEST ] Testing TYPE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5896873038] Expected: Should print: Hello +[Hera] [HADES][TEST ] [KRELTSC: 5897855964] Running TYPE.empty_string: HERE 0 TYPE CR + +[Hera] [HADES][TEST ] [KRELTSC: 5898936162] Test passed +[Hera] [HADES][TEST ] Testing TYPE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5906560506] Expected: Should print nothing +[Hera] [HADES][TEST ] [KRELTSC: 5907513129] Running TYPE.single_char: HERE 65 OVER C! 1 TYPE CR +[Hera] A +[Hera] [HADES][TEST ] [KRELTSC: 5909170365] Test passed +[Hera] [HADES][TEST ] Testing TYPE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5910776634] Expected: Should print: A +[Hera] [HADES][TEST ] [KRELTSC: 5911707564] Running TYPE.numbers: HERE S" 12345" DUP >R HERE SWAP CMOVE H +[Hera] 12345 +[Hera] [HADES][TEST ] [KRELTSC: 5913595989] Test passed +[Hera] [HADES][TEST ] Testing TYPE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5919762198] Expected: Should print: 12345 +[Hera] [HADES][TEST ] [KRELTSC: 5920763289] Running TYPE.zero_length: PAD 0 TYPE +[Hera] [HADES][TEST ] [KRELTSC: 5921879649] Test passed +[Hera] [HADES][TEST ] Testing TYPE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5923445808] Expected: Should handle zero length +[Hera] [HADES][TEST ] [KRELTSC: 5924475249] Running TYPE.one_item: PAD TYPE +[Hera] [HADES][ERROR] [KRELTSC: 5925657696] TYPE: Data stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 5926619937] Expected error occurred +[Hera] [HADES][TEST ] Testing TYPE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5928343911] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 5929392021] Running TYPE.empty_stack: TYPE +[Hera] [HADES][ERROR] [KRELTSC: 5936702856] TYPE: Data stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 5938022244] Expected error occurred +[Hera] [HADES][TEST ] Testing TYPE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5941096854] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 5942171424] TYPE: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5943259896] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 5949329589] Testing word: COUNT +[Hera] [HADES][TEST ] [KRELTSC: 5950291872] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5951134413] Running COUNT.basic: HERE S" Test" DROP C@ HERE 1+ SWAP COUNT +[Hera] 0 85 +[Hera] [HADES][TEST ] [KRELTSC: 5954023467] Test passed +[Hera] [HADES][TEST ] Testing COUNT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5955566106] Expected: Should show length and addr+1 +[Hera] [HADES][TEST ] [KRELTSC: 5956666653] Running COUNT.empty: HERE 0 OVER C! COUNT . . CR +[Hera] 0 126 +[Hera] [HADES][TEST ] [KRELTSC: 5958233169] Test passed +[Hera] [HADES][TEST ] Testing COUNT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5966036202] Expected: Should handle empty string +[Hera] [HADES][TEST ] [KRELTSC: 5968514118] Running COUNT.max_length: HERE 255 OVER C! COUNT . . CR +[Hera] 255 126 +[Hera] [HADES][TEST ] [KRELTSC: 5970125553] Test passed +[Hera] [HADES][TEST ] Testing COUNT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5971748223] Expected: Should handle max length +[Hera] [HADES][TEST ] [KRELTSC: 5972766450] Running COUNT.zero_addr_plus_one: HERE COUNT SWAP 1- = . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 5980522548] Test passed +[Hera] [HADES][TEST ] Testing COUNT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5983329954] Expected: Should increment address +[Hera] [HADES][TEST ] [KRELTSC: 5984311452] Running COUNT.empty_stack: COUNT +[Hera] [HADES][ERROR] [KRELTSC: 5985307734] COUNT: Data stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 5986239924] Expected error occurred +[Hera] [HADES][TEST ] Testing COUNT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 5993812209] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 5995258122] COUNT: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 5996297601] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 5997500313] Testing word: EXPECT +[Hera] [HADES][TEST ] [KRELTSC: 5998367613] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 5999242095] Running EXPECT.zero_length: PAD 0 EXPECT +[Hera] [HADES][TEST ] [KRELTSC: 6000730743] Test passed +[Hera] [HADES][TEST ] Testing EXPECT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6002361666] Expected: Should handle zero length +[Hera] [HADES][TEST ] [KRELTSC: 6009659334] Running EXPECT.one_item: PAD EXPECT +[Hera] [HADES][TEST ] [KRELTSC: 6011599713] Expected error occurred +[Hera] [HADES][TEST ] Testing EXPECT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6013824138] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 6014906121] Running EXPECT.empty_stack: EXPECT +[Hera] [HADES][TEST ] [KRELTSC: 6015972816] Expected error occurred +[Hera] [HADES][TEST ] Testing EXPECT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6024211032] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 6025726266] EXPECT: 3 passed, 0 failed, 2 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 6027773241] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 6028991178] Testing word: SPAN +[Hera] [HADES][TEST ] [KRELTSC: 6029852388] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 6030794238] Running SPAN.zero_input: PAD 0 EXPECT SPAN @ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 6038220174] Test passed +[Hera] [HADES][TEST ] Testing SPAN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6042086085] Expected: Should show zero +[Hera] [HADES][TEST ] [KRELTSC: 6042991605] Running SPAN.variable_test: SPAN @ SPAN @ = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 6044502240] Test passed +[Hera] [HADES][TEST ] Testing SPAN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6046098891] Expected: Should be consistent +[Hera] [HADES][TEST ] [KRELTSC: 6053127213] Running SPAN.address_test: SPAN 0<> . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 6055321272] Test passed +[Hera] [HADES][TEST ] Testing SPAN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6056912169] Expected: Should be valid address +[Hera] [HADES][TEST ] [KRELTSC: 6057897300] SPAN: 3 passed, 0 failed, 1 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 6059024370] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 6060278679] Testing word: WORD +[Hera] [HADES][TEST ] [KRELTSC: 6066578112] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 6068133876] Running WORD.empty_input: BL WORD COUNT . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 6070611036] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6072171231] Expected: Should handle empty input +[Hera] [HADES][TEST ] [KRELTSC: 6073181037] Running WORD.space_delim: 32 WORD DROP +[Hera] [HADES][TEST ] [KRELTSC: 6074359179] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6080473602] Expected: Should use space as delimiter +[Hera] [HADES][TEST ] [KRELTSC: 6081479439] Running WORD.newline_delim: 10 WORD DROP +[Hera] [HADES][TEST ] [KRELTSC: 6083704998] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6085317336] Expected: Should use newline as delimiter +[Hera] [HADES][TEST ] [KRELTSC: 6086361267] Running WORD.tab_delim: 9 WORD DROP +[Hera] [HADES][TEST ] [KRELTSC: 6087395433] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6089008779] Expected: Should use tab as delimiter +[Hera] [HADES][TEST ] [KRELTSC: 6090037002] Running WORD.comma_delim: 44 WORD DROP +[Hera] [HADES][TEST ] [KRELTSC: 6096288429] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6097785414] Expected: Should use comma as delimiter +[Hera] [HADES][TEST ] [KRELTSC: 6098830857] Running WORD.skip_leading: BL WORD DROP +[Hera] [HADES][TEST ] [KRELTSC: 6099959061] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6101492964] Expected: Should skip leading spaces +[Hera] [HADES][TEST ] [KRELTSC: 6102532905] Running WORD.single_char: BL WORD COUNT . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 6109659213] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6112038072] Expected: Should parse single character +[Hera] [HADES][TEST ] [KRELTSC: 6113766897] Running WORD.long_word: BL WORD COUNT 0 > . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 6115366782] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6116905767] Expected: Should parse long word +[Hera] [HADES][TEST ] [KRELTSC: 6117950979] Running WORD.zero_delim: 0 WORD DROP +[Hera] [HADES][TEST ] [KRELTSC: 6118998837] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6125181384] Expected: Should handle null delimiter +[Hera] [HADES][TEST ] [KRELTSC: 6126821505] Running WORD.high_ascii: 127 WORD DROP +[Hera] [HADES][TEST ] [KRELTSC: 6128599617] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6130134843] Expected: Should handle DEL delimiter +[Hera] [HADES][TEST ] [KRELTSC: 6131150844] Running WORD.count_format: BL WORD C@ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 6132589554] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6141206274] Expected: Should have count byte +[Hera] [HADES][TEST ] [KRELTSC: 6143004840] Running WORD.count_value: BL WORD COUNT SWAP DROP . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 6144599181] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6146132307] Expected: Should return count +[Hera] [HADES][TEST ] [KRELTSC: 6147134007] Running WORD.empty_stack: WORD +[Hera] [HADES][TEST ] [KRELTSC: 6154308552] Expected error occurred +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6157713009] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 6158715129] Running WORD.multi_delim: BL WORD DROP BL WORD DROP +[Hera] [HADES][TEST ] [KRELTSC: 6159908370] Test passed +[Hera] [HADES][TEST ] Testing WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6161517327] Expected: Should handle multiple parses +[Hera] [HADES][TEST ] [KRELTSC: 6162574803] WORD: 14 passed, 0 failed, 2 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 6171576600] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 6173165880] Testing word: BASE_OUTPUT +[Hera] [HADES][TEST ] [KRELTSC: 6174061824] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 6174920304] Running BASE_OUTPUT.decimal: 10 BASE ! 255 . CR +[Hera] 255 +[Hera] [HADES][TEST ] [KRELTSC: 6176496396] Test passed +[Hera] [HADES][TEST ] Testing BASE_OUTPUT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6186203100] Expected: Should print: 255 +[Hera] [HADES][TEST ] [KRELTSC: 6187549347] Running BASE_OUTPUT.hex: 16 BASE ! 255 . CR +[Hera] 597 +[Hera] [HADES][TEST ] [KRELTSC: 6189042258] Test passed +[Hera] [HADES][TEST ] Testing BASE_OUTPUT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6190699200] Expected: Should print: FF +[Hera] [HADES][TEST ] [KRELTSC: 6191651865] Running BASE_OUTPUT.octal: 8 BASE ! 64 . CR +[Hera] 52 +[Hera] [HADES][TEST ] [KRELTSC: 6201612522] Test passed +[Hera] [HADES][TEST ] Testing BASE_OUTPUT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6203256129] Expected: Should print: 100 +[Hera] [HADES][TEST ] [KRELTSC: 6204203124] Running BASE_OUTPUT.binary: 5 2 BASE ! . CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 6205727010] Test passed +[Hera] [HADES][TEST ] Testing BASE_OUTPUT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6215233227] Expected: Should print: 101 +[Hera] [HADES][TEST ] [KRELTSC: 6216842289] Running BASE_OUTPUT.base_restore: BASE @ DECIMAL 255 16 BA +[Hera] 255 +[Hera] [HADES][TEST ] [KRELTSC: 6218548518] Test passed +[Hera] [HADES][TEST ] Testing BASE_OUTPUT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6220228392] Expected: Should restore base +[Hera] [HADES][TEST ] [KRELTSC: 6226848831] BASE_OUTPUT: 5 passed, 0 failed, 1 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 6229062105] ▶ Testing module: v3/src/test_runner/modules/io_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 6230252385] Testing word: FORMAT_COMBO +[Hera] [HADES][TEST ] [KRELTSC: 6231164247] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 6232042488] Running FORMAT_COMBO.number_space_number: DECIMAL 42 . SPACE +[Hera] 42 [HADES][INFO ] [KRELTSC: 6247078173] L8[TABLE]: Config 0 → 1 regime=7 score=26214 L1=0 L2=0 L3=0 L +[Hera] 43 +[Hera] [HADES][TEST ] [KRELTSC: 6248379165] Test passed +[Hera] [HADES][TEST ] Testing FORMAT_COMBO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6256505829] Expected: Should format: 42 43 +[Hera] [HADES][TEST ] [KRELTSC: 6259500261] Running FORMAT_COMBO.multi_line: DECIMAL 1 . CR 2 . CR 3 . CR +[Hera] 1 +[Hera] 2 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 6262210416] Test passed +[Hera] [HADES][TEST ] Testing FORMAT_COMBO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6263876157] Expected: Should print on separate lines +[Hera] [HADES][TEST ] [KRELTSC: 6270626733] Running FORMAT_COMBO.indented: DECIMAL 5 SPACES 42 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 6273470070] Test passed +[Hera] [HADES][TEST ] Testing FORMAT_COMBO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6275093769] Expected: Should indent number +[Hera] [HADES][TEST ] [KRELTSC: 6276071424] Running FORMAT_COMBO.table_format: DECIMAL 1 . 3 SPACES 10 . +[Hera] 1 10 100 +[Hera] [HADES][TEST ] [KRELTSC: 6277840233] Test passed +[Hera] [HADES][TEST ] Testing FORMAT_COMBO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6279460719] Expected: Should format table +[Hera] [HADES][TEST ] [KRELTSC: 6288269526] FORMAT_COMBO: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 6290458251] === I/O Words Summary: 0 passed, 0 failed, 0 skipped, 0 errors +[Hera] [HADES][INFO ] [KRELTSC: 6291725790] +[Hera] === Testing Module: Block Words === +[Hera] [HADES][INFO ] [KRELTSC: 6293052423] Running Block Words Tests (Module 16)... +[Hera] [HADES][TEST ] [KRELTSC: 6299432811] ▶ Testing module: v3/src/test_runner/modules/block_words_test +[Hera] [HADES][TEST ] [KRELTSC: 6301498014] Testing word: BLOCK +[Hera] [HADES][TEST ] [KRELTSC: 6302724561] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 6303617670] Running BLOCK.basic: 1 BLOCK DUP . CR +[Hera] 5238784 +[Hera] [HADES][TEST ] [KRELTSC: 6306036240] Test passed +[Hera] [HADES][TEST ] Testing BLOCK ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6307611786] Expected: Should return block address +[Hera] [HADES][TEST ] [KRELTSC: 6315072057] Running BLOCK.zero_block: 0 BLOCK +[Hera] [HADES][TEST ] [KRELTSC: 6318230625] Expected error occurred +[Hera] [HADES][TEST ] Testing BLOCK ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6320359206] Expected: Should handle block 0 +[Hera] [HADES][TEST ] [KRELTSC: 6321389718] Running BLOCK.large_block: 65536 BLOCK +[Hera] [HADES][TEST ] [KRELTSC: 6327058731] Expected error occurred +[Hera] [HADES][TEST ] Testing BLOCK ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6329914185] Expected: Should handle large number +[Hera] [HADES][TEST ] [KRELTSC: 6330936801] Running BLOCK.negative: -1 BLOCK +[Hera] [HADES][TEST ] [KRELTSC: 6331936422] Expected error occurred +[Hera] [HADES][TEST ] Testing BLOCK ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6333596472] Expected: Should handle negative +[Hera] [HADES][TEST ] [KRELTSC: 6334563459] Running BLOCK.empty_stack: BLOCK +[Hera] [HADES][TEST ] [KRELTSC: 6335562723] Expected error occurred +[Hera] [HADES][TEST ] Testing BLOCK ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6337241736] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 6343500807] BLOCK: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 6346235532] ▶ Testing module: v3/src/test_runner/modules/block_words_test +[Hera] [HADES][TEST ] [KRELTSC: 6347506935] Testing word: BUFFER +[Hera] [HADES][TEST ] [KRELTSC: 6348364785] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 6349228221] Running BUFFER.basic: 1 BUFFER DUP . CR +[Hera] 5238784 +[Hera] [HADES][TEST ] [KRELTSC: 6351310644] Test passed +[Hera] [HADES][TEST ] Testing BUFFER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6360303621] Expected: Should return buffer address +[Hera] [HADES][TEST ] [KRELTSC: 6361762890] Running BUFFER.zero_block: 0 BUFFER +[Hera] [HADES][TEST ] [KRELTSC: 6362877969] Expected error occurred +[Hera] [HADES][TEST ] Testing BUFFER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6364543395] Expected: Should handle block 0 +[Hera] [HADES][TEST ] [KRELTSC: 6365538795] Running BUFFER.flush_dirty: 2 BLOCK 1+ 2 BUFFER +[Hera] [HADES][TEST ] [KRELTSC: 6373660650] Test passed +[Hera] [HADES][TEST ] Testing BUFFER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6377412321] Expected: Should flush if dirty +[Hera] [HADES][TEST ] [KRELTSC: 6378614928] Running BUFFER.empty_stack: BUFFER +[Hera] [HADES][TEST ] [KRELTSC: 6379714887] Expected error occurred +[Hera] [HADES][TEST ] Testing BUFFER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6385722630] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 6388406010] BUFFER: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 6390626550] ▶ Testing module: v3/src/test_runner/modules/block_words_test +[Hera] [HADES][TEST ] [KRELTSC: 6391835163] Testing word: UPDATE +[Hera] [HADES][TEST ] [KRELTSC: 6392669997] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 6393542022] Running UPDATE.basic: 1 BLOCK UPDATE +[Hera] [HADES][TEST ] [KRELTSC: 6395129286] Test passed +[Hera] [HADES][TEST ] Testing UPDATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6404052816] Expected: Should mark block dirty +[Hera] [HADES][TEST ] [KRELTSC: 6405683823] Running UPDATE.multiple: 1 BLOCK UPDATE UPDATE +[Hera] [HADES][TEST ] [KRELTSC: 6406895418] Test passed +[Hera] [HADES][TEST ] Testing UPDATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6408446100] Expected: Should handle multiple updates +[Hera] [HADES][TEST ] [KRELTSC: 6409562733] Running UPDATE.no_block: 0 SCR ! UPDATE +[Hera] [HADES][TEST ] [KRELTSC: 6415324734] Expected error occurred +[Hera] [HADES][TEST ] Testing UPDATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6418227312] Expected: Should error: blk=0 is invalid +[Hera] [HADES][TEST ] [KRELTSC: 6419299803] UPDATE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 6420414651] ▶ Testing module: v3/src/test_runner/modules/block_words_test +[Hera] [HADES][TEST ] [KRELTSC: 6421663227] Testing word: SAVE-BUFFERS +[Hera] [HADES][TEST ] [KRELTSC: 6422569125] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 6423480945] Running SAVE-BUFFERS.basic: SAVE-BUFFERS +[Hera] [HADES][TEST ] [KRELTSC: 6424952163] Test passed +[Hera] [HADES][TEST ] Testing SAVE-BUFFERS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6432552567] Expected: Should flush all buffers +[Hera] [HADES][TEST ] [KRELTSC: 6433556031] Running SAVE-BUFFERS.dirty_blocks: 1 BLOCK UPDATE SAVE-BUFFER +[Hera] [HADES][TEST ] [KRELTSC: 6434919708] Test passed +[Hera] [HADES][TEST ] Testing SAVE-BUFFERS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6436553298] Expected: Should save dirty blocks +[Hera] [HADES][TEST ] [KRELTSC: 6437563818] Running SAVE-BUFFERS.no_dirty: SAVE-BUFFERS +[Hera] [HADES][TEST ] [KRELTSC: 6438950721] Test passed +[Hera] [HADES][TEST ] Testing SAVE-BUFFERS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6445239864] Expected: Should handle no dirty blocks +[Hera] [HADES][TEST ] [KRELTSC: 6447332031] SAVE-BUFFERS: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 6448441398] ▶ Testing module: v3/src/test_runner/modules/block_words_test +[Hera] [HADES][TEST ] [KRELTSC: 6449662296] Testing word: EMPTY-BUFFERS +[Hera] [HADES][TEST ] [KRELTSC: 6450548979] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 6451512375] Running EMPTY-BUFFERS.basic: EMPTY-BUFFERS +[Hera] [HADES][TEST ] [KRELTSC: 6452877879] Test passed +[Hera] [HADES][TEST ] Testing EMPTY-BUFFERS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6458696874] Expected: Should invalidate all buffers +[Hera] [HADES][TEST ] [KRELTSC: 6461677446] Running EMPTY-BUFFERS.after_use: 1 BLOCK EMPTY-BUFFERS +[Hera] [HADES][TEST ] [KRELTSC: 6463059582] Test passed +[Hera] [HADES][TEST ] Testing EMPTY-BUFFERS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6464793510] Expected: Should invalidate used buffers +[Hera] [HADES][TEST ] [KRELTSC: 6465835887] Running EMPTY-BUFFERS.dirty_blocks: 1 BLOCK UPDATE EMPTY-BUFF +[Hera] [HADES][TEST ] [KRELTSC: 6467177556] Test passed +[Hera] [HADES][TEST ] Testing EMPTY-BUFFERS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6468807555] Expected: Should handle dirty blocks +[Hera] [HADES][TEST ] [KRELTSC: 6474231372] EMPTY-BUFFERS: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 6476683521] ▶ Testing module: v3/src/test_runner/modules/block_words_test +[Hera] [HADES][TEST ] [KRELTSC: 6477929073] Testing word: FLUSH +[Hera] [HADES][TEST ] [KRELTSC: 6478767981] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 6479643408] Running FLUSH.basic: FLUSH +[Hera] [HADES][TEST ] [KRELTSC: 6480685176] Test passed +[Hera] [HADES][TEST ] Testing FLUSH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6482266917] Expected: Should save and invalidate buffers +[Hera] [HADES][TEST ] [KRELTSC: 6487470633] Running FLUSH.dirty_blocks: 1 BLOCK UPDATE FLUSH +[Hera] [HADES][TEST ] [KRELTSC: 6489364749] Test passed +[Hera] [HADES][TEST ] Testing FLUSH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6491945817] Expected: Should flush dirty blocks +[Hera] [HADES][TEST ] [KRELTSC: 6492980319] Running FLUSH.after_empty: EMPTY-BUFFERS FLUSH +[Hera] [HADES][TEST ] [KRELTSC: 6494122257] Test passed +[Hera] [HADES][TEST ] Testing FLUSH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6495679638] Expected: Should handle empty buffers +[Hera] [HADES][TEST ] [KRELTSC: 6496769202] FLUSH: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 6502350939] ▶ Testing module: v3/src/test_runner/modules/block_words_test +[Hera] [HADES][TEST ] [KRELTSC: 6503605563] Testing word: LOAD +[Hera] [HADES][TEST ] [KRELTSC: 6505261539] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 6506519922] Running LOAD.basic: 1 LOAD +[Hera] [HADES][TEST ] [KRELTSC: 6507751299] Test passed +[Hera] [HADES][TEST ] Testing LOAD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6509311578] Expected: Should interpret block 1 +[Hera] [HADES][TEST ] [KRELTSC: 6510318213] Running LOAD.zero_block: 0 LOAD +[Hera] [HADES][TEST ] [KRELTSC: 6511458513] Expected error occurred +[Hera] [HADES][TEST ] Testing LOAD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6517700847] Expected: Should handle block 0 +[Hera] [HADES][TEST ] [KRELTSC: 6518944950] Running LOAD.nonexistent: 9999 LOAD +[Hera] [HADES][TEST ] [KRELTSC: 6520988838] Expected error occurred +[Hera] [HADES][TEST ] Testing LOAD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6522711762] Expected: Should handle missing block +[Hera] [HADES][TEST ] [KRELTSC: 6523733895] Running LOAD.empty_stack: LOAD +[Hera] [HADES][TEST ] [KRELTSC: 6524718879] Expected error occurred +[Hera] [HADES][TEST ] Testing LOAD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6526388904] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 6531989352] LOAD: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 6533079000] ▶ Testing module: v3/src/test_runner/modules/block_words_test +[Hera] [HADES][TEST ] [KRELTSC: 6535497717] Testing word: LIST +[Hera] [HADES][TEST ] [KRELTSC: 6536308086] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 6537231939] Running LIST.basic: 1 LIST + +[Hera] Block 1 + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + + + +[Hera] [HADES][TEST ] [KRELTSC: 6569409882] Test passed +[Hera] [HADES][TEST ] Testing LIST ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6575521932] Expected: Should display block 1 +[Hera] [HADES][TEST ] [KRELTSC: 6576520419] Running LIST.zero_block: 0 LIST +[Hera] [HADES][TEST ] [KRELTSC: 6577943274] Expected error occurred +[Hera] [HADES][TEST ] Testing LIST ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6580434840] Expected: Should handle block 0 +[Hera] [HADES][TEST ] [KRELTSC: 6581406006] Running LIST.nonexistent: 9999 LIST +[Hera] [HADES][TEST ] [KRELTSC: 6582428097] Expected error occurred +[Hera] [HADES][TEST ] Testing LIST ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6584114985] Expected: Should handle missing block +[Hera] [HADES][TEST ] [KRELTSC: 6585154548] Running LIST.empty_stack: LIST +[Hera] [HADES][TEST ] [KRELTSC: 6590746512] Expected error occurred +[Hera] [HADES][TEST ] Testing LIST ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6592888659] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 6594645645] LIST: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 6595753101] ▶ Testing module: v3/src/test_runner/modules/block_words_test +[Hera] [HADES][TEST ] [KRELTSC: 6596975280] Testing word: SCR +[Hera] [HADES][TEST ] [KRELTSC: 6597818010] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 6598730292] Running SCR.basic: SCR @ . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 6604419990] Test passed +[Hera] [HADES][TEST ] Testing SCR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6606385107] Expected: Should show current block +[Hera] [HADES][TEST ] [KRELTSC: 6608333991] Running SCR.after_list: 1 LIST SCR @ . CR + +[Hera] Block 1 + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + +[Hera] 2d: +[Hera] + + + +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 6640670967] Test passed +[Hera] [HADES][TEST ] Testing SCR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6642302436] Expected: Should update after LIST +[Hera] [HADES][TEST ] [KRELTSC: 6643312410] Running SCR.after_load: 1 LOAD SCR @ . CR +[Hera] [HADES][TEST ] [KRELTSC: 6649257741] Test passed +[Hera] [HADES][TEST ] Testing SCR ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6652757223] Expected: Should update after LOAD +[Hera] [HADES][TEST ] [KRELTSC: 6655039293] SCR: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 6656101536] ▶ Testing module: v3/src/test_runner/modules/block_words_test +[Hera] [HADES][TEST ] [KRELTSC: 6657343434] Testing word: THRU +[Hera] [HADES][TEST ] [KRELTSC: 6658378923] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 6664227822] Running THRU.single_block: 1 1 THRU +[Hera] [HADES][TEST ] [KRELTSC: 6666343110] Test passed +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6667899525] Expected: Should load single block (1-1) +[Hera] [HADES][TEST ] [KRELTSC: 6668943855] Running THRU.ascending: 1 3 THRU +[Hera] [HADES][TEST ] [KRELTSC: 6669957735] Test passed +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6671697375] Expected: Should load blocks 1-3 in order +[Hera] [HADES][TEST ] [KRELTSC: 6672803592] Running THRU.descending: 3 1 THRU +[Hera] [HADES][TEST ] [KRELTSC: 6678534261] Test passed +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6681011988] Expected: Should auto-swap and load 1-3 +[Hera] [HADES][TEST ] [KRELTSC: 6682078263] Running THRU.same_block: 2 2 THRU +[Hera] [HADES][TEST ] [KRELTSC: 6683105541] Test passed +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6684784029] Expected: Should load single block (2-2) +[Hera] [HADES][TEST ] [KRELTSC: 6685880985] Running THRU.zero_start: 0 3 THRU +[Hera] [HADES][TEST ] [KRELTSC: 6686987160] Expected error occurred +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6696273969] Expected: Should reject block 0 as start +[Hera] [HADES][TEST ] [KRELTSC: 6697773663] Running THRU.zero_end: 1 0 THRU +[Hera] [HADES][TEST ] [KRELTSC: 6698807115] Expected error occurred +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6700516872] Expected: Should reject block 0 as end +[Hera] [HADES][TEST ] [KRELTSC: 6706500381] Running THRU.both_zero: 0 0 THRU +[Hera] [HADES][TEST ] [KRELTSC: 6708458358] Expected error occurred +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6710822643] Expected: Should reject both blocks as 0 +[Hera] [HADES][TEST ] [KRELTSC: 6711914853] Running THRU.invalid_start: 9999 10000 THRU +[Hera] [HADES][TEST ] [KRELTSC: 6713000259] Expected error occurred +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6714679902] Expected: Should reject invalid start block +[Hera] [HADES][TEST ] [KRELTSC: 6715784607] Running THRU.invalid_end: 1 9999 THRU +[Hera] [HADES][TEST ] [KRELTSC: 6721444674] Expected error occurred +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6725202204] Expected: Should reject invalid end block +[Hera] [HADES][TEST ] [KRELTSC: 6726964881] Running THRU.both_invalid: 9998 9999 THRU +[Hera] [HADES][TEST ] [KRELTSC: 6728074626] Expected error occurred +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6729776613] Expected: Should reject both invalid blocks +[Hera] [HADES][TEST ] [KRELTSC: 6735966447] Running THRU.empty_stack: THRU +[Hera] [HADES][TEST ] [KRELTSC: 6738142950] Expected error occurred +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6740271090] Expected: Should cause stack underflow (no args) +[Hera] [HADES][TEST ] [KRELTSC: 6741418152] Running THRU.one_arg: 1 THRU +[Hera] [HADES][TEST ] [KRELTSC: 6742395324] Expected error occurred +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6744111612] Expected: Should cause stack underflow (one arg) +[Hera] [HADES][TEST ] [KRELTSC: 6745220475] Running THRU.small_range: 1 2 THRU +[Hera] [HADES][TEST ] [KRELTSC: 6753216771] Test passed +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6756225630] Expected: Should load 2-block range +[Hera] [HADES][TEST ] [KRELTSC: 6757275084] Running THRU.medium_range: 1 5 THRU +[Hera] [HADES][TEST ] [KRELTSC: 6758383716] Test passed +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6759906342] Expected: Should load 5-block range +[Hera] [HADES][TEST ] [KRELTSC: 6765661518] Running THRU.negative_start: -1 3 THRU +[Hera] [HADES][TEST ] [KRELTSC: 6768103818] Expected error occurred +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6771138003] Expected: Should handle negative start +[Hera] [HADES][TEST ] [KRELTSC: 6772206525] Running THRU.negative_end: 1 -3 THRU +[Hera] [HADES][TEST ] [KRELTSC: 6773319441] Expected error occurred +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6779946600] Expected: Should handle negative end +[Hera] [HADES][TEST ] [KRELTSC: 6781896870] Running THRU.both_negative: -3 -1 THRU +[Hera] [HADES][TEST ] [KRELTSC: 6783671559] Expected error occurred +[Hera] [HADES][TEST ] Testing THRU ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6785314347] Expected: Should handle both negative +[Hera] [HADES][TEST ] [KRELTSC: 6786343872] THRU: 17 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 6787566933] === Block Words Summary: 0 passed, 0 failed, 0 skipped, 0 error +[Hera] [HADES][INFO ] [KRELTSC: 6788772669] +[Hera] === Testing Module: Dictionary Words === +[Hera] [HADES][INFO ] [KRELTSC: 6798033585] Running Dictionary Words Tests (Module 4)... +[Hera] [HADES][TEST ] [KRELTSC: 6800328738] Testing word: HERE +[Hera] [HADES][TEST ] [KRELTSC: 6801193518] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 6802113864] Running HERE.basic: HERE HERE = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 6809484612] Test passed +[Hera] [HADES][TEST ] Testing HERE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6812744568] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 6813712227] Running HERE.after_comma: HERE 42 , HERE SWAP - 1 CELLS = 0 S +[Hera] [HADES][TEST ] [KRELTSC: 6815039007] Test passed +[Hera] [HADES][TEST ] Testing HERE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6816603549] Expected: Asserts HERE advances by exactly 1 CELLS (8 bytes +[Hera] [HADES][TEST ] [KRELTSC: 6817894188] Running HERE.after_c_comma: HERE 65 C, HERE SWAP - . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 6825009513] Test passed +[Hera] [HADES][TEST ] Testing HERE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6827770992] Expected: Should print: 1 +[Hera] [HADES][TEST ] [KRELTSC: 6828729579] Running HERE.after_allot: HERE 10 ALLOT HERE SWAP - . CR +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 6830283348] Test passed +[Hera] [HADES][TEST ] Testing HERE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6832099638] Expected: Should print: 10 +[Hera] [HADES][TEST ] [KRELTSC: 6840025353] Running HERE.stability: HERE DUP HERE = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 6844134801] Test passed +[Hera] [HADES][TEST ] Testing HERE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6845889225] Expected: Should be stable +[Hera] [HADES][TEST ] [KRELTSC: 6846901026] HERE: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 6853123053] Testing word: ALLOT +[Hera] [HADES][TEST ] [KRELTSC: 6853930314] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 6855202305] Running ALLOT.basic: HERE 10 ALLOT HERE SWAP - . CR +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 6857588472] Test passed +[Hera] [HADES][TEST ] Testing ALLOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6859133841] Expected: Should print: 10 +[Hera] [HADES][TEST ] [KRELTSC: 6860250474] Running ALLOT.zero: HERE 0 ALLOT HERE SWAP - . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 6861829107] Test passed +[Hera] [HADES][TEST ] Testing ALLOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6869985633] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 6870751041] Running ALLOT.negative: HERE -4 ALLOT HERE SWAP - . CR +[Hera] -4 +[Hera] [HADES][TEST ] [KRELTSC: 6873320790] Test passed +[Hera] [HADES][TEST ] Testing ALLOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6875119377] Expected: Should print: -4 +[Hera] [HADES][TEST ] [KRELTSC: 6876110031] Running ALLOT.large: HERE 100 ALLOT HERE SWAP - . CR +[Hera] 100 +[Hera] [HADES][TEST ] [KRELTSC: 6882790215] Test passed +[Hera] [HADES][TEST ] Testing ALLOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6884806677] Expected: Should print: 100 +[Hera] [HADES][TEST ] [KRELTSC: 6886461477] Running ALLOT.after_use: ALIGN HERE 10 ALLOT 42 OVER ! @ . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 6888064995] Test passed +[Hera] [HADES][TEST ] Testing ALLOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6889852011] Expected: Should store and retrieve +[Hera] [HADES][TEST ] [KRELTSC: 6890888193] Running ALLOT.empty_stack: ALLOT +[Hera] [HADES][TEST ] [KRELTSC: 6898828377] Expected error occurred +[Hera] [HADES][TEST ] Testing ALLOT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6900209106] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 6901877829] ALLOT: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 6903580299] Testing word: , +[Hera] [HADES][TEST ] [KRELTSC: 6904557891] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 6910255737] Running ,.basic: 42 , HERE 1 CELLS - @ . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 6912140172] Test passed +[Hera] [HADES][TEST ] Testing , ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6913601058] Expected: Should compile 42 +[Hera] [HADES][TEST ] [KRELTSC: 6914626509] Running ,.negative: -999 , HERE 1 CELLS - @ . CR +[Hera] [HADES][INFO ] [KRELTSC: 6915825588] L8[TABLE]: Config 1 → 2 regime=7 score=26214 L1=0 L2=0 L3=0 L +[Hera] -999 +[Hera] [HADES][TEST ] [KRELTSC: 6917351301] Test passed +[Hera] [HADES][TEST ] Testing , ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6919058454] Expected: Should compile -999 +[Hera] [HADES][TEST ] [KRELTSC: 6919974159] Running ,.zero: 0 , HERE 1 CELLS - @ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 6927485607] Test passed +[Hera] [HADES][TEST ] Testing , ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6930134526] Expected: Should compile 0 +[Hera] [HADES][TEST ] [KRELTSC: 6931078686] Running ,.max_int: 2147483647 , HERE 1 CELLS - @ . CR +[Hera] 2147483647 +[Hera] [HADES][TEST ] [KRELTSC: 6932720445] Test passed +[Hera] [HADES][TEST ] Testing , ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6934374027] Expected: Should compile max int +[Hera] [HADES][TEST ] [KRELTSC: 6941752083] Running ,.min_int: -2147483648 , HERE 1 CELLS - @ . CR +[Hera] -2147483648 +[Hera] [HADES][TEST ] [KRELTSC: 6944556150] Test passed +[Hera] [HADES][TEST ] Testing , ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6946359168] Expected: Should compile min int +[Hera] [HADES][TEST ] [KRELTSC: 6947471769] Running ,.multiple: 10 , 20 , HERE 1 CELLS - @ . HERE 1 CELLS +[Hera] 20 20 +[Hera] [HADES][TEST ] [KRELTSC: 6955460589] Test passed +[Hera] [HADES][TEST ] Testing , ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6957373752] Expected: Should compile multiple +[Hera] [HADES][TEST ] [KRELTSC: 6959867796] Running ,.empty_stack: , +[Hera] [HADES][TEST ] [KRELTSC: 6960851205] Expected error occurred +[Hera] [HADES][TEST ] Testing , ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6963621000] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 6972571893] ,: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 6973536402] Testing word: C, +[Hera] [HADES][TEST ] [KRELTSC: 6974296518] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 6975193323] Running C,.basic: 65 C, HERE 1 - C@ . CR +[Hera] 65 +[Hera] [HADES][TEST ] [KRELTSC: 6976657233] Test passed +[Hera] [HADES][TEST ] Testing C, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6983684715] Expected: Should compile byte 65 +[Hera] [HADES][TEST ] [KRELTSC: 6985074999] Running C,.zero: 0 C, HERE 1 - C@ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 6986472633] Test passed +[Hera] [HADES][TEST ] Testing C, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6987984696] Expected: Should compile byte 0 +[Hera] [HADES][TEST ] [KRELTSC: 6988927113] Running C,.high_byte: 255 C, HERE 1 - C@ . CR +[Hera] 255 +[Hera] [HADES][TEST ] [KRELTSC: 6990350850] Test passed +[Hera] [HADES][TEST ] Testing C, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 6991927488] Expected: Should compile byte 255 +[Hera] [HADES][TEST ] [KRELTSC: 6992908146] Running C,.truncation: 256 C, HERE 1 - C@ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 6999609876] Test passed +[Hera] [HADES][TEST ] Testing C, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7001184645] Expected: Should truncate to 0 +[Hera] [HADES][TEST ] [KRELTSC: 7002309762] Running C,.negative: -1 C, HERE 1 - C@ . CR +[Hera] 255 +[Hera] [HADES][TEST ] [KRELTSC: 7003749984] Test passed +[Hera] [HADES][TEST ] Testing C, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7005270720] Expected: Should handle negative +[Hera] [HADES][TEST ] [KRELTSC: 7006302534] Running C,.multiple: 65 C, 66 C, HERE 2 - C@ . HERE 1 - C@ . +[Hera] 65 66 +[Hera] [HADES][TEST ] [KRELTSC: 7014192339] Test passed +[Hera] [HADES][TEST ] Testing C, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7017439695] Expected: Should compile multiple +[Hera] [HADES][TEST ] [KRELTSC: 7018359936] Running C,.empty_stack: C, +[Hera] [HADES][TEST ] [KRELTSC: 7019385681] Expected error occurred +[Hera] [HADES][TEST ] Testing C, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7021061796] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 7028704116] C,: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7031439597] Testing word: 2, +[Hera] [HADES][TEST ] [KRELTSC: 7032184698] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7033000338] Running 2,.basic: 12345 67890 2, HERE 2 CELLS - 2@ . . CR +[Hera] 67890 12345 +[Hera] [HADES][TEST ] [KRELTSC: 7034700036] Test passed +[Hera] [HADES][TEST ] Testing 2, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7036279740] Expected: Should compile double +[Hera] [HADES][TEST ] [KRELTSC: 7041791736] Running 2,.zero: 0 0 2, HERE 2 CELLS - 2@ . . CR +[Hera] 0 0 +[Hera] [HADES][TEST ] [KRELTSC: 7043293971] Test passed +[Hera] [HADES][TEST ] Testing 2, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7044783459] Expected: Should compile zero double +[Hera] [HADES][TEST ] [KRELTSC: 7045781211] Running 2,.negative: -1000 -2000 2, HERE 2 CELLS - 2@ . . CR +[Hera] -2000 -1000 +[Hera] [HADES][TEST ] [KRELTSC: 7047432630] Test passed +[Hera] [HADES][TEST ] Testing 2, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7048966239] Expected: Should compile negative double +[Hera] [HADES][TEST ] [KRELTSC: 7050066114] Running 2,.large: 2147483647 -1 2, HERE 2 CELLS - 2@ . . CR +[Hera] -1 2147483647 +[Hera] [HADES][TEST ] [KRELTSC: 7051744371] Test passed +[Hera] [HADES][TEST ] Testing 2, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7058660406] Expected: Should compile large double +[Hera] [HADES][TEST ] [KRELTSC: 7059640224] Running 2,.one_item: 42 2, +[Hera] [HADES][TEST ] [KRELTSC: 7060679556] Expected error occurred +[Hera] [HADES][TEST ] Testing 2, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7062312474] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 7063353024] Running 2,.empty_stack: 2, +[Hera] [HADES][TEST ] [KRELTSC: 7064296743] Expected error occurred +[Hera] [HADES][TEST ] Testing 2, ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7071521583] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 7072942254] 2,: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7074069408] Testing word: PAD +[Hera] [HADES][TEST ] [KRELTSC: 7074857391] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7075765872] Running PAD.basic: PAD PAD = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 7077087864] Test passed +[Hera] [HADES][TEST ] Testing PAD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7078795500] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 7079935716] Running PAD.different_from_here: PAD HERE = . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 7087342626] Test passed +[Hera] [HADES][TEST ] Testing PAD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7089505185] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 7090785660] Running PAD.stability: PAD DUP PAD = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 7092565725] Test passed +[Hera] [HADES][TEST ] Testing PAD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7094517507] Expected: Should be stable +[Hera] [HADES][TEST ] [KRELTSC: 7095732252] Running PAD.usable: PAD 42 OVER ! @ . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 7103092080] Test passed +[Hera] [HADES][TEST ] Testing PAD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7105063707] Expected: Should be usable memory +[Hera] [HADES][TEST ] [KRELTSC: 7106321061] PAD: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7107685683] Testing word: SP@ +[Hera] [HADES][TEST ] [KRELTSC: 7108742592] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7109941146] Running SP@.depth_effect: 42 SP@ SWAP DROP SP@ = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 7118487222] Test passed +[Hera] [HADES][TEST ] Testing SP@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7120470546] Expected: Should show stack effect +[Hera] [HADES][TEST ] [KRELTSC: 7121775192] Running SP@.empty_stack: DEPTH 0= SP@ AND . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 7123667817] Test passed +[Hera] [HADES][TEST ] Testing SP@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7130618691] Expected: Should work on empty stack +[Hera] [HADES][TEST ] [KRELTSC: 7132025565] Running SP@.multiple_items: 1 2 3 SP@ SWAP DROP SWAP DROP SWA +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 7134140790] Test passed +[Hera] [HADES][TEST ] Testing SP@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7136071845] Expected: Should track changes +[Hera] [HADES][TEST ] [KRELTSC: 7137296544] SP@: 3 passed, 0 failed, 1 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7138643694] Testing word: SP! +[Hera] [HADES][TEST ] [KRELTSC: 7146192396] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7147494333] Running SP!.basic_restore: 1 2 3 SP@ 4 5 6 DROP DROP DROP SP! +[Hera] 3 [HADES][TEST ] [KRELTSC: 7149718632] Test passed +[Hera] [HADES][TEST ] Testing SP! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7151371080] Expected: Should restore stack +[Hera] [HADES][TEST ] [KRELTSC: 7152645570] Running SP!.invalid_addr: 0 SP! +[Hera] [HADES][TEST ] [KRELTSC: 7160254143] Expected error occurred +[Hera] [HADES][TEST ] Testing SP! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7162828050] Expected: Should cause error +[Hera] [HADES][TEST ] [KRELTSC: 7164061275] Running SP!.empty_stack: SP! +[Hera] [HADES][TEST ] [KRELTSC: 7165342485] Expected error occurred +[Hera] [HADES][TEST ] Testing SP! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7167413211] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 7174112064] SP!: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7175471436] Testing word: LATEST +[Hera] [HADES][TEST ] [KRELTSC: 7176595377] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7177707012] Running LATEST.basic: LATEST LATEST = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 7179595794] Test passed +[Hera] [HADES][TEST ] Testing LATEST ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7181585985] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 7189773108] Running LATEST.stability: LATEST DUP LATEST = . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 7192177293] Test passed +[Hera] [HADES][TEST ] Testing LATEST ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7194169353] Expected: Should be stable +[Hera] [HADES][TEST ] [KRELTSC: 7195387626] LATEST: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7196809137] Testing word: COMPILATION +[Hera] [HADES][TEST ] [KRELTSC: 7203357924] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7204487766] Running COMPILATION.here_comma_sequence: HERE 10 , 20 , 30 , +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 7206646398] Test passed +[Hera] [HADES][TEST ] Testing COMPILATION ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7208681634] Expected: Should advance HERE by 12 +[Hera] [HADES][TEST ] [KRELTSC: 7209980841] Running COMPILATION.mixed_compilation: HERE 42 , 65 C, 100 20 +[Hera] [HADES][INFO ] [KRELTSC: 7216633347] L8[TABLE]: Config 2 → 3 regime=7 score=26214 L1=0 L2=0 L3=0 L +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 7218751134] Test passed +[Hera] [HADES][TEST ] Testing COMPILATION ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7220829714] Expected: Should advance correctly +[Hera] [HADES][TEST ] [KRELTSC: 7222139148] Running COMPILATION.allot_comma_combo: HERE 10 ALLOT 99 , HER +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 7224142863] Test passed +[Hera] [HADES][TEST ] Testing COMPILATION ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7226217432] Expected: Should combine allot and comma +[Hera] [HADES][TEST ] [KRELTSC: 7232957172] Running COMPILATION.pad_isolation: PAD 999 OVER ! HERE 42 , P +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 7234819662] Test passed +[Hera] [HADES][TEST ] Testing COMPILATION ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7237517364] Expected: PAD should be isolated +[Hera] [HADES][TEST ] [KRELTSC: 7238551656] COMPILATION: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7239919092] Testing word: STACK_MGMT +[Hera] [HADES][TEST ] [KRELTSC: 7245359940] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7246211574] Running STACK_MGMT.sp_round_trip: 42 43 SP@ >R 44 45 R> SP! . +[Hera] 43 42 +[Hera] [HADES][TEST ] [KRELTSC: 7247868684] Test passed +[Hera] [HADES][TEST ] Testing STACK_MGMT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7249444083] Expected: Should print: 43 42 +[Hera] [HADES][TEST ] [KRELTSC: 7250428941] Running STACK_MGMT.depth_preservation: 1 2 3 DEPTH >R SP@ >R +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 7252084917] Test passed +[Hera] [HADES][TEST ] Testing STACK_MGMT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7253894256] Expected: Should preserve depth +[Hera] [HADES][TEST ] [KRELTSC: 7254892722] STACK_MGMT: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7260583260] === Dictionary Words Summary: 0 passed, 0 failed, 0 skipped, 0 +[Hera] [HADES][INFO ] [KRELTSC: 7261838724] +[Hera] === Testing Module: Dictionary Manipulation Words === +[Hera] [HADES][INFO ] [KRELTSC: 7263210591] Running Dictionary Manipulation Words Tests (Module 14)... +[Hera] [HADES][TEST ] [KRELTSC: 7264464396] ▶ Testing module: v3/src/test_runner/modules/dictionary_manip +[Hera] [HADES][TEST ] [KRELTSC: 7265678784] Testing word: CREATE +[Hera] [HADES][TEST ] [KRELTSC: 7266537600] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7267424367] Running CREATE.basic: CREATE test1 42 , test1 @ . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 7274877267] Test passed +[Hera] [HADES][TEST ] Testing CREATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7276437315] Expected: Should create and store +[Hera] [HADES][TEST ] [KRELTSC: 7277414004] Running CREATE.empty_name: CREATE +[Hera] [HADES][TEST ] [KRELTSC: 7278522657] Expected error occurred +[Hera] [HADES][TEST ] Testing CREATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7280192766] Expected: Should handle empty name +[Hera] [HADES][TEST ] [KRELTSC: 7281278844] Running CREATE.redefine_shadows: CREATE T 1 , CREATE T 2 , T +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 7283437581] Test passed +[Hera] [HADES][TEST ] Testing CREATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7289405844] Expected: Newest definition should win (prints 2) +[Hera] [HADES][TEST ] [KRELTSC: 7290576741] Running CREATE.duplicate: CREATE test2 CREATE test2 +[Hera] [HADES][TEST ] [KRELTSC: 7292143173] Test passed +[Hera] [HADES][TEST ] Testing CREATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7293812358] Expected: Should allow redefinition (latest shadows) +[Hera] [HADES][TEST ] [KRELTSC: 7294988400] CREATE: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7296175761] ▶ Testing module: v3/src/test_runner/modules/dictionary_manip +[Hera] [HADES][TEST ] [KRELTSC: 7297599498] Testing word: FORGET +[Hera] [HADES][TEST ] [KRELTSC: 7298532066] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7303769298] Running FORGET.basic: CREATE temp1 FORGET temp1 +[Hera] [HADES][TEST ] [KRELTSC: 7305964995] Test passed +[Hera] [HADES][TEST ] Testing FORGET ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7307544342] Expected: Should forget word +[Hera] [HADES][TEST ] [KRELTSC: 7308513807] Running FORGET.nonexistent: FORGET nonexistent +[Hera] [HADES][TEST ] [KRELTSC: 7309731555] Expected error occurred +[Hera] [HADES][TEST ] Testing FORGET ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7311499965] Expected: Should handle missing word +[Hera] [HADES][TEST ] [KRELTSC: 7312704504] Running FORGET.protected: FORGET FORGET +[Hera] [HADES][TEST ] [KRELTSC: 7318621758] Expected error occurred +[Hera] [HADES][TEST ] Testing FORGET ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7320281115] Expected: Should protect system words +[Hera] [HADES][TEST ] [KRELTSC: 7321351107] FORGET: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7322434371] ▶ Testing module: v3/src/test_runner/modules/dictionary_manip +[Hera] [HADES][TEST ] [KRELTSC: 7323648024] Testing word: FENCE +[Hera] [HADES][TEST ] [KRELTSC: 7324495269] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7325392599] Running FENCE.basic: CREATE fnc1 FENCE CREATE fnc2 FORGET fnc +[Hera] [HADES][TEST ] [KRELTSC: 7327536111] Test passed +[Hera] [HADES][TEST ] Testing FENCE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7334091891] Expected: Should forget a word defined after FENCE +[Hera] [HADES][TEST ] [KRELTSC: 7335163647] Running FENCE.protects_older: CREATE fnc3 CREATE fnc4 FENCE F +[Hera] [HADES][TEST ] [KRELTSC: 7336767942] Expected error occurred +[Hera] [HADES][TEST ] Testing FENCE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7338403863] Expected: Should refuse to forget a word defined before FEN +[Hera] [HADES][TEST ] [KRELTSC: 7339596642] Running FENCE.forget_latest_keeps_predecessor: CREATE fnc5 FE +[Hera] [HADES][TEST ] [KRELTSC: 7341502749] Test passed +[Hera] [HADES][TEST ] Testing FENCE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7343240604] Expected: Forgetting the newest word must not disturb an ol +[Hera] [HADES][TEST ] [KRELTSC: 7349012979] FENCE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7349900187] ▶ Testing module: v3/src/test_runner/modules/dictionary_manip +[Hera] [HADES][TEST ] [KRELTSC: 7352282469] Testing word: IMMEDIATE +[Hera] [HADES][TEST ] [KRELTSC: 7353151806] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7354058355] Running IMMEDIATE.basic: : test3 42 ; IMMEDIATE test3 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 7356802068] Test passed +[Hera] [HADES][TEST ] Testing IMMEDIATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7364203161] Expected: Should execute immediately +[Hera] [HADES][TEST ] [KRELTSC: 7366550520] Running IMMEDIATE.already_immediate: : test4 43 ; IMMEDIATE I +[Hera] [HADES][TEST ] [KRELTSC: 7368379200] Test passed +[Hera] [HADES][TEST ] Testing IMMEDIATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7370231526] Expected: Should handle double immediate +[Hera] [HADES][TEST ] [KRELTSC: 7371402276] IMMEDIATE: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7378086009] ▶ Testing module: v3/src/test_runner/modules/dictionary_manip +[Hera] [HADES][TEST ] [KRELTSC: 7380143925] Testing word: FIND +[Hera] [HADES][TEST ] [KRELTSC: 7380971766] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7381971996] Running FIND.existing: FIND DUP . CR +[Hera] 2225731376 +[Hera] [HADES][TEST ] [KRELTSC: 7383654999] Test passed +[Hera] [HADES][TEST ] Testing FIND ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7385419251] Expected: Should find system word +[Hera] [HADES][TEST ] [KRELTSC: 7390906467] Running FIND.user_word: : test5 44 ; FIND test5 . CR +[Hera] 2226064960 +[Hera] [HADES][TEST ] [KRELTSC: 7393429239] Test passed +[Hera] [HADES][TEST ] Testing FIND ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7395517395] Expected: Should find user word +[Hera] [HADES][TEST ] [KRELTSC: 7396496142] Running FIND.nonexistent: FIND nonexistent . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 7398001317] Test passed +[Hera] [HADES][TEST ] Testing FIND ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7399741419] Expected: Should return 0 +[Hera] [HADES][TEST ] [KRELTSC: 7400727789] Running FIND.empty: FIND +[Hera] [HADES][TEST ] [KRELTSC: 7406703612] Expected error occurred +[Hera] [HADES][TEST ] Testing FIND ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7408414125] Expected: Should error (no token) +[Hera] [HADES][TEST ] [KRELTSC: 7409444007] FIND: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7410509862] ▶ Testing module: v3/src/test_runner/modules/dictionary_manip +[Hera] [HADES][TEST ] [KRELTSC: 7411715703] Testing word: DEFINITIONS +[Hera] [HADES][TEST ] [KRELTSC: 7412596359] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7413489216] Running DEFINITIONS.basic: FORTH DEFINITIONS +[Hera] [HADES][TEST ] [KRELTSC: 7414784601] Test passed +[Hera] [HADES][TEST ] Testing DEFINITIONS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7420912485] Expected: Should set current to context +[Hera] [HADES][TEST ] [KRELTSC: 7422006837] Running DEFINITIONS.multiple: FORTH DEFINITIONS DEFINITIONS +[Hera] [HADES][TEST ] [KRELTSC: 7423354071] Test passed +[Hera] [HADES][TEST ] Testing DEFINITIONS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7424938185] Expected: Should be idempotent +[Hera] [HADES][TEST ] [KRELTSC: 7425929553] DEFINITIONS: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7427040180] ▶ Testing module: v3/src/test_runner/modules/dictionary_manip +[Hera] [HADES][TEST ] [KRELTSC: 7428308580] Testing word: SMUDGE +[Hera] [HADES][TEST ] [KRELTSC: 7429206099] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7430112690] Running SMUDGE.during_def: : test6 SMUDGE 45 ; +[Hera] [HADES][TEST ] [KRELTSC: 7436931411] Test passed +[Hera] [HADES][TEST ] Testing SMUDGE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7438464054] Expected: Should hide incomplete def +[Hera] [HADES][TEST ] [KRELTSC: 7439460966] Running SMUDGE.outside_def: SMUDGE +[Hera] [HADES][TEST ] [KRELTSC: 7440556872] Expected error occurred +[Hera] [HADES][TEST ] Testing SMUDGE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7442143275] Expected: Should error outside def +[Hera] [HADES][TEST ] [KRELTSC: 7443097116] SMUDGE: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7444205013] ▶ Testing module: v3/src/test_runner/modules/dictionary_manip +[Hera] [HADES][TEST ] [KRELTSC: 7452427311] Testing word: LATEST +[Hera] [HADES][TEST ] [KRELTSC: 7453542369] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7455558999] Running LATEST.basic: LATEST @ . CR +[Hera] 2225812800 +[Hera] [HADES][TEST ] [KRELTSC: 7457103108] Test passed +[Hera] [HADES][TEST ] Testing LATEST ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7458749949] Expected: Should show latest word +[Hera] [HADES][TEST ] [KRELTSC: 7464176748] Running LATEST.after_def: : test7 46 ; LATEST @ . CR +[Hera] 2225851984 +[Hera] [HADES][TEST ] [KRELTSC: 7466068512] Test passed +[Hera] [HADES][TEST ] Testing LATEST ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7467634650] Expected: Should update after def +[Hera] [HADES][TEST ] [KRELTSC: 7468629651] Running LATEST.after_forget: CREATE test8 FORGET test8 LATEST +[Hera] 2225851984 +[Hera] [HADES][TEST ] [KRELTSC: 7470455979] Test passed +[Hera] [HADES][TEST ] Testing LATEST ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7472132703] Expected: Should update after forget +[Hera] [HADES][TEST ] [KRELTSC: 7473204291] LATEST: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7479946719] ▶ Testing module: v3/src/test_runner/modules/dictionary_manip +[Hera] [HADES][TEST ] [KRELTSC: 7481205816] Testing word: >BODY +[Hera] [HADES][TEST ] [KRELTSC: 7482033594] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7482888672] Running >BODY.basic: CREATE test9 ' test9 >BODY . CR +[Hera] 2226066472 +[Hera] [HADES][TEST ] [KRELTSC: 7485117213] Test passed +[Hera] [HADES][TEST ] Testing >BODY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7486850805] Expected: Should get param field +[Hera] [HADES][TEST ] [KRELTSC: 7487862060] Running >BODY.variable: VARIABLE var1 ' var1 >BODY . CR +[Hera] 2226066936 +[Hera] [HADES][TEST ] [KRELTSC: 7494480945] Test passed +[Hera] [HADES][TEST ] Testing >BODY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7496001387] Expected: Should get var storage +[Hera] [HADES][TEST ] [KRELTSC: 7496988597] Running >BODY.nonexistent: ' NONEXISTENT >BODY +[Hera] [HADES][ERROR] [KRELTSC: 7498168461] ': word 'NONEXISTENT' not found +[Hera] [HADES][TEST ] [KRELTSC: 7499312541] Expected error occurred +[Hera] [HADES][TEST ] Testing >BODY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7501028556] Expected: Should handle missing word +[Hera] [HADES][TEST ] [KRELTSC: 7502133219] >BODY: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7508694060] ▶ Testing module: v3/src/test_runner/modules/dictionary_manip +[Hera] [HADES][TEST ] [KRELTSC: 7510146924] Testing word: HIDDEN +[Hera] [HADES][TEST ] [KRELTSC: 7511956704] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7512852249] Running HIDDEN.basic: : test10 HIDDEN 47 ; +[Hera] [HADES][TEST ] [KRELTSC: 7514251332] Test passed +[Hera] [HADES][TEST ] Testing HIDDEN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7516152294] Expected: Should hide word +[Hera] [HADES][TEST ] [KRELTSC: 7517085156] Running HIDDEN.outside_def: HIDDEN +[Hera] [HADES][TEST ] [KRELTSC: 7522856775] Expected error occurred +[Hera] [HADES][TEST ] Testing HIDDEN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7524525855] Expected: Should error outside def +[Hera] [HADES][TEST ] [KRELTSC: 7525525665] HIDDEN: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7526634129] === Dictionary Manipulation Words Summary: 0 passed, 0 failed, +[Hera] [HADES][INFO ] [KRELTSC: 7527947616] +[Hera] === Testing Module: Vocabulary Words === +[Hera] [HADES][INFO ] [KRELTSC: 7529258079] Running Vocabulary Words Tests (Module 15)... +[Hera] [HADES][TEST ] [KRELTSC: 7530563040] ▶ Testing module: v3/src/test_runner/modules/vocabulary_words +[Hera] [HADES][TEST ] [KRELTSC: 7531815333] Testing word: VOCABULARY +[Hera] [HADES][TEST ] [KRELTSC: 7537413618] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7538311599] Running VOCABULARY.basic: VOCABULARY TEST-VOC1 TEST-VOC1 DEFI +[Hera] [HADES][TEST ] [KRELTSC: 7542608640] Test passed +[Hera] [HADES][TEST ] Testing VOCABULARY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7544241327] Expected: Should create vocabulary +[Hera] [HADES][TEST ] [KRELTSC: 7545379821] Running VOCABULARY.create_and_switch: VOCABULARY MYVOC MYVOC +[Hera] 2226071456 +[Hera] [HADES][TEST ] [KRELTSC: 7553212506] Test passed +[Hera] [HADES][TEST ] Testing VOCABULARY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7554822933] Expected: Should create and switch +[Hera] [HADES][TEST ] [KRELTSC: 7555830093] Running VOCABULARY.word_isolation: VOCABULARY ISOLATED ISOLAT +[Hera] [HADES][TEST ] [KRELTSC: 7559616666] Test passed +[Hera] [HADES][TEST ] Testing VOCABULARY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7566036744] Expected: Should create word in isolated vocab +[Hera] [HADES][TEST ] [KRELTSC: 7567165788] Running VOCABULARY.cross_vocab_access: VOCABULARY V1 V1 DEFIN +[Hera] 11 +[Hera] [HADES][TEST ] [KRELTSC: 7571397015] Test passed +[Hera] [HADES][TEST ] Testing VOCABULARY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7572994023] Expected: Should access word across vocabs +[Hera] [HADES][TEST ] [KRELTSC: 7574184009] Running VOCABULARY.multiple_vocabs: VOCABULARY VA VOCABULARY +[Hera] [HADES][TEST ] [KRELTSC: 7581433587] Test passed +[Hera] [HADES][TEST ] Testing VOCABULARY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7583140950] Expected: Should create multiple vocabs +[Hera] [HADES][TEST ] [KRELTSC: 7584174213] Running VOCABULARY.duplicate: VOCABULARY TESTVOC VOCABULARY T +[Hera] [HADES][ERROR] [KRELTSC: 7585637535] VOCABULARY: duplicate 'TESTVOC' +[Hera] [HADES][TEST ] [KRELTSC: 7586676258] Expected error occurred +[Hera] [HADES][TEST ] Testing VOCABULARY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7588389690] Expected: Should handle duplicate +[Hera] [HADES][TEST ] [KRELTSC: 7589510271] Running VOCABULARY.empty_name: VOCABULARY +[Hera] [HADES][ERROR] [KRELTSC: 7595073465] VOCABULARY: missing name +[Hera] [HADES][TEST ] [KRELTSC: 7596030267] Expected error occurred +[Hera] [HADES][TEST ] Testing VOCABULARY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7597758735] Expected: Should handle empty name +[Hera] [HADES][TEST ] [KRELTSC: 7598796051] VOCABULARY: 7 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7599945717] ▶ Testing module: v3/src/test_runner/modules/vocabulary_words +[Hera] [HADES][TEST ] [KRELTSC: 7601219472] Testing word: FORTH +[Hera] [HADES][TEST ] [KRELTSC: 7602036687] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7602964341] Running FORTH.basic: FORTH DEFINITIONS +[Hera] [HADES][TEST ] [KRELTSC: 7609286244] Test passed +[Hera] [HADES][TEST ] Testing FORTH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7611387168] Expected: Should select FORTH vocab +[Hera] [HADES][TEST ] [KRELTSC: 7612455921] Running FORTH.persistence: FORTH : TEST1 42 ; TEST1 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 7614375279] Test passed +[Hera] [HADES][TEST ] Testing FORTH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7615960569] Expected: Should find word in FORTH +[Hera] [HADES][TEST ] [KRELTSC: 7616994798] Running FORTH.from_other: VOCABULARY OTHER-VOC OTHER-VOC FORT +[Hera] [HADES][TEST ] [KRELTSC: 7623207501] Test passed +[Hera] [HADES][TEST ] Testing FORTH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7625232426] Expected: Should return to FORTH +[Hera] [HADES][TEST ] [KRELTSC: 7627455633] FORTH: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7628574513] ▶ Testing module: v3/src/test_runner/modules/vocabulary_words +[Hera] [HADES][TEST ] [KRELTSC: 7629812673] Testing word: DEFINITIONS +[Hera] [HADES][TEST ] [KRELTSC: 7630706853] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7631609034] Running DEFINITIONS.basic: FORTH DEFINITIONS +[Hera] [HADES][TEST ] [KRELTSC: 7634141214] Test passed +[Hera] [HADES][TEST ] Testing DEFINITIONS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7640193120] Expected: Should set current vocabulary +[Hera] [HADES][TEST ] [KRELTSC: 7641283713] Running DEFINITIONS.new_vocab: VOCABULARY TEST-VOC6 TEST-VOC6 +[Hera] [HADES][TEST ] [KRELTSC: 7644065100] Test passed +[Hera] [HADES][TEST ] Testing DEFINITIONS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7645668198] Expected: Should set new current +[Hera] [HADES][TEST ] [KRELTSC: 7646708937] Running DEFINITIONS.word_creation: VOCABULARY TEST-VOC7 TEST- +[Hera] [HADES][TEST ] [KRELTSC: 7654090542] Test passed +[Hera] [HADES][TEST ] Testing DEFINITIONS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7655905047] Expected: Should create in correct vocab +[Hera] [HADES][TEST ] [KRELTSC: 7656982116] DEFINITIONS: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7658148183] ▶ Testing module: v3/src/test_runner/modules/vocabulary_words +[Hera] [HADES][TEST ] [KRELTSC: 7659383025] Testing word: CONTEXT +[Hera] [HADES][TEST ] [KRELTSC: 7660237431] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7661176635] Running CONTEXT.basic: CONTEXT @ . CR +[Hera] 2226077440 +[Hera] [HADES][TEST ] [KRELTSC: 7662832926] Test passed +[Hera] [HADES][TEST ] Testing CONTEXT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7668841698] Expected: Should show current context +[Hera] [HADES][TEST ] [KRELTSC: 7669922400] Running CONTEXT.modify: CONTEXT @ 1+ CONTEXT ! +[Hera] [HADES][TEST ] [KRELTSC: 7671161106] Test passed +[Hera] [HADES][TEST ] Testing CONTEXT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7672752045] Expected: Should allow modification (impl-defined effect) +[Hera] [HADES][TEST ] [KRELTSC: 7673984934] Running CONTEXT.initial: FORTH CONTEXT @ . CR +[Hera] 2225822608 +[Hera] [HADES][TEST ] [KRELTSC: 7676712099] Test passed +[Hera] [HADES][TEST ] Testing CONTEXT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7682704260] Expected: Should show FORTH vocab +[Hera] [HADES][TEST ] [KRELTSC: 7683721605] CONTEXT: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7684809678] ▶ Testing module: v3/src/test_runner/modules/vocabulary_words +[Hera] [HADES][TEST ] [KRELTSC: 7686040152] Testing word: CURRENT +[Hera] [HADES][TEST ] [KRELTSC: 7686903105] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7687796697] Running CURRENT.basic: CURRENT @ . CR +[Hera] 2226077440 +[Hera] [HADES][TEST ] [KRELTSC: 7689422517] Test passed +[Hera] [HADES][TEST ] Testing CURRENT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7691136138] Expected: Should show current vocab +[Hera] [HADES][TEST ] [KRELTSC: 7696448319] Running CURRENT.after_def: VOCABULARY TEST-VOC8 TEST-VOC8 DEF +[Hera] 2226074144 +[Hera] [HADES][TEST ] [KRELTSC: 7700110383] Test passed +[Hera] [HADES][TEST ] Testing CURRENT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7701671691] Expected: Should show new vocab +[Hera] [HADES][TEST ] [KRELTSC: 7702702623] Running CURRENT.protect: CURRENT @ 1+ CURRENT ! +[Hera] [HADES][INFO ] [KRELTSC: 7704030852] L8[TABLE]: Config 3 → 4 regime=7 score=26214 L1=0 L2=0 L3=0 L +[Hera] [HADES][TEST ] [KRELTSC: 7705493250] Test passed +[Hera] [HADES][TEST ] Testing CURRENT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7711094517] Expected: Should allow modification (impl-defined effect) +[Hera] [HADES][TEST ] [KRELTSC: 7712746209] CURRENT: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7713821052] ▶ Testing module: v3/src/test_runner/modules/vocabulary_words +[Hera] [HADES][TEST ] [KRELTSC: 7715056986] Testing word: ORDER +[Hera] [HADES][TEST ] [KRELTSC: 7715891946] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7716780435] Running ORDER.basic: ORDER +[Hera] Search order: +[Hera] + + +[Hera] Current: + + +[Hera] [HADES][TEST ] [KRELTSC: 7719270951] Test passed +[Hera] [HADES][TEST ] Testing ORDER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7720956285] Expected: Should list search order +[Hera] [HADES][TEST ] [KRELTSC: 7726488021] Running ORDER.multiple: VOCABULARY TEST-VOC9 TEST-VOC9 DEFINI +[Hera] Search order: +[Hera] + + +[Hera] Current: + + +[Hera] [HADES][TEST ] [KRELTSC: 7730340450] Test passed +[Hera] [HADES][TEST ] Testing ORDER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7731898671] Expected: Should show all vocabs +[Hera] [HADES][TEST ] [KRELTSC: 7732877313] Running ORDER.after_forth: TEST-VOC9 FORTH ORDER +[Hera] Search order: + + +[Hera] Current: + + +[Hera] [HADES][TEST ] [KRELTSC: 7735965909] Test passed +[Hera] [HADES][TEST ] Testing ORDER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7741912206] Expected: Should show FORTH only +[Hera] [HADES][TEST ] [KRELTSC: 7742963382] ORDER: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7745260614] === Vocabulary Words Summary: 0 passed, 0 failed, 0 skipped, 0 +[Hera] [HADES][INFO ] [KRELTSC: 7746526914] +[Hera] === Testing Module: System Words === +[Hera] [HADES][INFO ] [KRELTSC: 7747830048] Running System Words Tests (Module 18)... +[Hera] [HADES][WARN ] [KRELTSC: 7749032613] Some system tests marked as unimplemented due to system-level e +[Hera] [HADES][TEST ] [KRELTSC: 7754895750] ▶ Testing module: v3/src/test_runner/modules/system_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 7756146720] Testing word: QUIT +[Hera] [HADES][TEST ] [KRELTSC: 7756994133] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7757880228] Running QUIT.in_definition: : BAD-WORD QUIT ; +[Hera] [HADES][TEST ] [KRELTSC: 7759402665] Expected error occurred +[Hera] [HADES][TEST ] Testing QUIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7761109587] Expected: Should prevent compilation +[Hera] [HADES][TEST ] [KRELTSC: 7762139952] QUIT: 1 passed, 0 failed, 1 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7763319081] ▶ Testing module: v3/src/test_runner/modules/system_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 7764647226] Testing word: ABORT +[Hera] [HADES][TEST ] [KRELTSC: 7769762322] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7771084755] Running ABORT.basic: ABORT +[Hera] [HADES][TEST ] [KRELTSC: 7772205714] Test passed +[Hera] [HADES][TEST ] Testing ABORT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7774996698] Expected: Should clear stacks and return to QUIT +[Hera] [HADES][TEST ] [KRELTSC: 7776152769] Running ABORT.with_data: 1 2 3 ABORT DEPTH . CR +[Hera] [HADES][TEST ] [KRELTSC: 7777407561] Test passed +[Hera] [HADES][TEST ] Testing ABORT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7779053310] Expected: Should clear stack +[Hera] [HADES][TEST ] [KRELTSC: 7784482524] Running ABORT.in_definition_runtime: : BAD-WORD ABORT ; 123 +[Hera] [HADES][TEST ] [KRELTSC: 7786248792] Test passed +[Hera] [HADES][TEST ] Testing ABORT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7787822742] Expected: ABORT may appear in a definition; when executed i +[Hera] [HADES][TEST ] [KRELTSC: 7789047525] ABORT: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7790275920] ▶ Testing module: v3/src/test_runner/modules/system_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 7791487053] Testing word: ABORT" +[Hera] [HADES][TEST ] [KRELTSC: 7792390977] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7793380434] Running ABORT".condition_true: -1 ABORT" Error" + +[Hera] [HADES][TEST ] [KRELTSC: 7799428980] Test passed +[Hera] [HADES][TEST ] Testing ABORT" ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7801015803] Expected: Should abort with message (no error; stacks clear +[Hera] [HADES][TEST ] [KRELTSC: 7802220468] Running ABORT".condition_false: 0 ABORT" Error" +[Hera] [HADES][TEST ] [KRELTSC: 7803413457] Test passed +[Hera] [HADES][TEST ] Testing ABORT" ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7805038206] Expected: Should not abort +[Hera] [HADES][TEST ] [KRELTSC: 7805970606] Running ABORT".empty_stack: ABORT" +[Hera] [HADES][TEST ] [KRELTSC: 7807144737] Expected error occurred +[Hera] [HADES][TEST ] Testing ABORT" ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7808947398] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 7814681154] ABORT": 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7815847536] ▶ Testing module: v3/src/test_runner/modules/system_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 7817146176] Testing word: BYE +[Hera] [HADES][TEST ] [KRELTSC: 7817962404] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7818895749] BYE: 0 passed, 0 failed, 1 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7819960911] ▶ Testing module: v3/src/test_runner/modules/system_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 7821225615] Testing word: COLD +[Hera] [HADES][TEST ] [KRELTSC: 7822194555] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7827104943] COLD: 0 passed, 0 failed, 1 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7828624587] ▶ Testing module: v3/src/test_runner/modules/system_words_tes +[Hera] [HADES][TEST ] [KRELTSC: 7829849748] Testing word: WARM +[Hera] [HADES][TEST ] [KRELTSC: 7830694515] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7831615617] WARM: 0 passed, 0 failed, 1 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7832768181] === System Words Summary: 0 passed, 0 failed, 0 skipped, 0 erro +[Hera] [HADES][INFO ] [KRELTSC: 7834016694] +[Hera] === Testing Module: Defining Words === +[Hera] [HADES][INFO ] [KRELTSC: 7835294418] Running Defining Words Tests (Module 13)... +[Hera] [HADES][TEST ] [KRELTSC: 7836582222] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 7842018177] Testing word: : +[Hera] [HADES][TEST ] [KRELTSC: 7843111332] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7843984092] Running :.basic: : TEST1 42 ; TEST1 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 7845857061] Test passed +[Hera] [HADES][TEST ] Testing : ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7847426769] Expected: Should define and execute +[Hera] [HADES][TEST ] [KRELTSC: 7848444177] Running :.empty_name: : +[Hera] [HADES][TEST ] [KRELTSC: 7849443252] Expected error occurred +[Hera] [HADES][TEST ] Testing : ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7851235728] Expected: Should handle empty definition +[Hera] [HADES][TEST ] [KRELTSC: 7856705829] Running :.nested: : TEST3 : ; +[Hera] [HADES][ERROR] [KRELTSC: 7858547256] Nested ':' inside a definition is not allowed +[Hera] [HADES][TEST ] [KRELTSC: 7859689425] Expected error occurred +[Hera] [HADES][TEST ] Testing : ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7861370895] Expected: Should prevent nested definition +[Hera] [HADES][TEST ] [KRELTSC: 7862488809] :: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7863572934] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 7864797087] Testing word: ; +[Hera] [HADES][TEST ] [KRELTSC: 7865731692] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7866694080] Running ;.alone: ; +[Hera] [HADES][TEST ] [KRELTSC: 7872121194] Expected error occurred +[Hera] [HADES][TEST ] Testing ; ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7873793844] Expected: Should error outside definition +[Hera] [HADES][TEST ] [KRELTSC: 7874853861] Running ;.immediate: : TEST4 42 ; IMMEDIATE TEST4 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 7876628634] Test passed +[Hera] [HADES][TEST ] Testing ; ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7878155544] Expected: Should handle immediate +[Hera] [HADES][TEST ] [KRELTSC: 7879142859] ;: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7880438286] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 7881645681] Testing word: CONSTANT +[Hera] [HADES][TEST ] [KRELTSC: 7886918424] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7887787362] Running CONSTANT.basic: 42 CONSTANT MEANING MEANING . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 7889980350] Test passed +[Hera] [HADES][TEST ] Testing CONSTANT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7891611651] Expected: Should create constant +[Hera] [HADES][TEST ] [KRELTSC: 7892758755] Running CONSTANT.zero: 0 CONSTANT ZERO ZERO . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 7894324662] Test passed +[Hera] [HADES][TEST ] Testing CONSTANT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7900348218] Expected: Should handle zero +[Hera] [HADES][TEST ] [KRELTSC: 7901663070] Running CONSTANT.negative: -1 CONSTANT MINUS MINUS . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 7904516088] Test passed +[Hera] [HADES][TEST ] Testing CONSTANT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7906258395] Expected: Should handle negative +[Hera] [HADES][TEST ] [KRELTSC: 7907238801] Running CONSTANT.empty_stack: CONSTANT +[Hera] [HADES][TEST ] [KRELTSC: 7908340923] Expected error occurred +[Hera] [HADES][TEST ] Testing CONSTANT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7910207991] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 7915736745] CONSTANT: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7916819400] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 7919408406] Testing word: VARIABLE +[Hera] [HADES][TEST ] [KRELTSC: 7920305106] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7921218354] Running VARIABLE.basic: VARIABLE VAR1 42 VAR1 ! VAR1 @ . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 7923346893] Test passed +[Hera] [HADES][TEST ] Testing VARIABLE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7924921305] Expected: Should create variable +[Hera] [HADES][TEST ] [KRELTSC: 7930331115] Running VARIABLE.multiple: VARIABLE VAR2 VARIABLE VAR3 +[Hera] [HADES][TEST ] [KRELTSC: 7931996562] Test passed +[Hera] [HADES][TEST ] Testing VARIABLE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7934678031] Expected: Should create multiple +[Hera] [HADES][TEST ] [KRELTSC: 7935672717] Running VARIABLE.store_fetch: VARIABLE VAR4 -99 VAR4 ! VAR4 @ +[Hera] -99 +[Hera] [HADES][TEST ] [KRELTSC: 7937418888] Test passed +[Hera] [HADES][TEST ] Testing VARIABLE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7939080513] Expected: Should store/fetch +[Hera] [HADES][TEST ] [KRELTSC: 7944490785] VARIABLE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7945935900] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 7947891315] Testing word: CREATE +[Hera] [HADES][TEST ] [KRELTSC: 7949190837] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7950094131] Running CREATE.basic: CREATE OBJ1 +[Hera] [HADES][TEST ] [KRELTSC: 7951404951] Test passed +[Hera] [HADES][TEST ] Testing CREATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7953023610] Expected: Should create word +[Hera] [HADES][TEST ] [KRELTSC: 7954008111] Running CREATE.with_data: CREATE OBJ2 42 , OBJ2 @ . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 7960312437] Test passed +[Hera] [HADES][TEST ] Testing CREATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7962723846] Expected: Should allow data +[Hera] [HADES][TEST ] [KRELTSC: 7964041995] Running CREATE.empty_name: CREATE +[Hera] [HADES][TEST ] [KRELTSC: 7965052704] Expected error occurred +[Hera] [HADES][TEST ] Testing CREATE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7966762461] Expected: Should handle empty name +[Hera] [HADES][TEST ] [KRELTSC: 7967841042] CREATE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 7968953517] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 7974613647] Testing word: DOES> +[Hera] [HADES][TEST ] [KRELTSC: 7975455054] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 7976899812] Running DOES>.basic: : CONST CREATE , DOES> @ ; 42 CONST MEAN +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 7981394505] Test passed +[Hera] [HADES][TEST ] Testing DOES> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7987539546] Expected: Should define behavior +[Hera] [HADES][TEST ] [KRELTSC: 7988912967] Running DOES>.multiple: : ARRAY CREATE DOES> SWAP CELLS + ; C +[Hera] [HADES][TEST ] [KRELTSC: 7990733100] Test passed +[Hera] [HADES][TEST ] Testing DOES> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7992349092] Expected: Should work with arrays +[Hera] [HADES][TEST ] [KRELTSC: 7993400205] Running DOES>.outside: DOES> +[Hera] [HADES][ERROR] [KRELTSC: 7994403879] DOES>: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 7995256689] Expected error occurred +[Hera] [HADES][TEST ] Testing DOES> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 7996994838] Expected: Should error outside definition +[Hera] [HADES][TEST ] [KRELTSC: 8002611225] DOES>: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8003737413] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 8004958668] Testing word: [ +[Hera] [HADES][TEST ] [KRELTSC: 8005782897] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8006639067] Running [.basic: : TEST5 [ 42 ] LITERAL ; TEST5 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 8008718235] Test passed +[Hera] [HADES][TEST ] Testing [ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8010269274] Expected: Should enter interpret +[Hera] [HADES][TEST ] [KRELTSC: 8011300584] Running [.outside: [ +[Hera] [HADES][TEST ] [KRELTSC: 8012217654] Test passed +[Hera] [HADES][TEST ] Testing [ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8018148327] Expected: Should be allowed outside definition (no error) +[Hera] [HADES][TEST ] [KRELTSC: 8019361938] [: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8020877487] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 8022817404] Testing word: ] +[Hera] [HADES][TEST ] [KRELTSC: 8023612065] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8024491965] Running ].basic: [ 42 ] . CR +[Hera] [HADES][TEST ] [KRELTSC: 8025630963] Test passed +[Hera] [HADES][TEST ] Testing ] ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8031452898] Expected: Should resume compile +[Hera] [HADES][TEST ] [KRELTSC: 8032919076] Running ].nested: : TEST6 [ ] 42 ; TEST6 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 8034749289] Test passed +[Hera] [HADES][TEST ] Testing ] ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8036262150] Expected: Should handle nesting +[Hera] [HADES][TEST ] [KRELTSC: 8037240876] ]: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8038268784] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 8039511858] Testing word: DEFER +[Hera] [HADES][TEST ] [KRELTSC: 8040403140] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8041351038] Running DEFER.basic: DEFER DF1 : DF1W 42 . CR ; ' DF1W IS DF1 +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 8048304999] Test passed +[Hera] [HADES][TEST ] Testing DEFER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8049954171] Expected: Should print: 42 +[Hera] [HADES][TEST ] [KRELTSC: 8050937580] Running DEFER.uninit: DEFER DF2 DF2 +[Hera] [HADES][ERROR] [KRELTSC: 8052141972] DEFER runtime: no target set for 'DF2' +[Hera] [HADES][TEST ] [KRELTSC: 8053168200] Expected error occurred +[Hera] [HADES][TEST ] Testing DEFER ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8054886693] Expected: Should error: uninitialized deferred word +[Hera] [HADES][TEST ] [KRELTSC: 8056123257] DEFER: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8061774903] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 8063039985] Testing word: IS +[Hera] [HADES][TEST ] [KRELTSC: 8063855562] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8064769839] Running IS.basic: DEFER IS1 : IS1W 99 . CR ; ' IS1W IS IS1 IS +[Hera] 99 +[Hera] [HADES][TEST ] [KRELTSC: 8066829036] Test passed +[Hera] [HADES][TEST ] Testing IS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8068282656] Expected: Should print: 99 +[Hera] [HADES][TEST ] [KRELTSC: 8069221818] Running IS.not_defer: 42 IS DUP +[Hera] [HADES][ERROR] [KRELTSC: 8070298152] IS: 'DUP' was not created by DEFER +[Hera] [HADES][TEST ] [KRELTSC: 8075568039] Expected error occurred +[Hera] [HADES][TEST ] Testing IS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8077608651] Expected: Should error: DUP is not a DEFER word +[Hera] [HADES][TEST ] [KRELTSC: 8078777196] Running IS.not_found: 42 IS NOSUCH +[Hera] [HADES][ERROR] [KRELTSC: 8079854958] IS: word 'NOSUCH' not found +[Hera] [HADES][TEST ] [KRELTSC: 8080829799] Expected error occurred +[Hera] [HADES][TEST ] Testing IS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8082487329] Expected: Should error: word not found +[Hera] [HADES][TEST ] [KRELTSC: 8083560303] IS: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8084621160] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 8085929754] Testing word: DEFER@ +[Hera] [HADES][TEST ] [KRELTSC: 8091713217] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8092610652] Running DEFER@.basic: DEFER DFA1 : DFA1W 7 . CR ; ' DFA1W IS +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 8094940287] Test passed +[Hera] [HADES][TEST ] Testing DEFER@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8096514426] Expected: Should print: -1 +[Hera] [HADES][TEST ] [KRELTSC: 8097444558] Running DEFER@.not_found: DEFER@ NOSUCH2 +[Hera] [HADES][ERROR] [KRELTSC: 8098720476] DEFER@: word 'NOSUCH2' not found +[Hera] [HADES][TEST ] [KRELTSC: 8100075459] Expected error occurred +[Hera] [HADES][TEST ] Testing DEFER@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8108221443] Expected: Should error: word not found +[Hera] [HADES][TEST ] [KRELTSC: 8110505466] DEFER@: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8111559456] ▶ Testing module: v3/src/test_runner/modules/defining_words_t +[Hera] [HADES][TEST ] [KRELTSC: 8112808011] Testing word: ['] +[Hera] [HADES][TEST ] [KRELTSC: 8113813869] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8114858955] Running ['].compile_xt: : BKT1 ['] DUP ; 77 BKT1 EXECUTE . . +[Hera] 77 77 +[Hera] [HADES][TEST ] [KRELTSC: 8123642142] Test passed +[Hera] [HADES][TEST ] Testing ['] ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8125170627] Expected: Should print: 77 77 +[Hera] [HADES][TEST ] [KRELTSC: 8126148975] Running ['].pin_like: : BKT2 ['] DROP ; 1 2 BKT2 EXECUTE . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 8128191834] Test passed +[Hera] [HADES][TEST ] Testing ['] ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8134623651] Expected: Should print: 1 +[Hera] [HADES][TEST ] [KRELTSC: 8135647443] Running ['].not_found: : BKT3 ['] NOSUCHWORD ; +[Hera] [HADES][ERROR] [KRELTSC: 8138340315] [']': word 'NOSUCHWORD' not found +[Hera] [HADES][TEST ] [KRELTSC: 8139350583] Expected error occurred +[Hera] [HADES][TEST ] Testing ['] ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8140986147] Expected: Should error: word not found +[Hera] [HADES][TEST ] [KRELTSC: 8142131844] [']: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8143507596] === Defining Words Summary: 0 passed, 0 failed, 0 skipped, 0 er +[Hera] [HADES][INFO ] [KRELTSC: 8151564456] +[Hera] === Testing Module: Control Words === +[Hera] [HADES][INFO ] [KRELTSC: 8153396328] Running Control Words Tests (Module 12)... +[Hera] [HADES][TEST ] [KRELTSC: 8154481083] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 8155749126] Testing word: IF +[Hera] [HADES][TEST ] [KRELTSC: 8156624154] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8157478728] Running IF.true: : TEST1 IF 42 ELSE 24 THEN ; -1 TEST1 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 8164844352] Test passed +[Hera] [HADES][TEST ] Testing IF ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8167558602] Expected: Should take true branch +[Hera] [HADES][TEST ] [KRELTSC: 8168565510] Running IF.false: : TEST2 IF 42 ELSE 24 THEN ; 0 TEST2 . CR +[Hera] 24 +[Hera] [HADES][TEST ] [KRELTSC: 8170417773] Test passed +[Hera] [HADES][TEST ] Testing IF ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8171990463] Expected: Should take false branch +[Hera] [HADES][TEST ] [KRELTSC: 8177268246] Running IF.nested: : TEST3 IF IF 1 ELSE 2 THEN ELSE 3 THEN ; +[Hera] [HADES][INFO ] [KRELTSC: 8179531836] L8[TABLE]: Config 4 → 5 regime=7 score=26214 L1=0 L2=0 L3=0 L +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 8182378281] Test passed +[Hera] [HADES][TEST ] Testing IF ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8183917455] Expected: Should handle nesting +[Hera] [HADES][TEST ] [KRELTSC: 8184870729] Running IF.no_else: : TEST4 IF 42 THEN ; -1 TEST4 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 8186744601] Test passed +[Hera] [HADES][TEST ] Testing IF ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8192619414] Expected: Should work without ELSE +[Hera] [HADES][TEST ] [KRELTSC: 8194051530] Running IF.empty_stack: IF +[Hera] [HADES][ERROR] [KRELTSC: 8195138112] IF: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 8195961795] Expected error occurred +[Hera] [HADES][TEST ] Testing IF ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8197592277] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 8198664285] IF: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8199732870] Testing word: IF +[Hera] [HADES][TEST ] [KRELTSC: 8200590279] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8201697525] Running IF.true: : TEST1 IF 42 ELSE 24 THEN ; -1 TEST1 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 8208432897] Test passed +[Hera] [HADES][TEST ] Testing IF ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8211132174] Expected: Should take true branch +[Hera] [HADES][TEST ] [KRELTSC: 8212145991] Running IF.false: : TEST2 IF 42 ELSE 24 THEN ; 0 TEST2 . CR +[Hera] 24 +[Hera] [HADES][TEST ] [KRELTSC: 8214064089] Test passed +[Hera] [HADES][TEST ] Testing IF ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8215625565] Expected: Should take false branch +[Hera] [HADES][TEST ] [KRELTSC: 8220941652] Running IF.nested: : TEST3 IF IF 1 ELSE 2 THEN ELSE 3 THEN ; +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 8225437290] Test passed +[Hera] [HADES][TEST ] Testing IF ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8227324602] Expected: Should handle nesting +[Hera] [HADES][TEST ] [KRELTSC: 8228309460] Running IF.no_else: : TEST4 IF 42 THEN ; -1 TEST4 . CR +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 8230147611] Test passed +[Hera] [HADES][TEST ] Testing IF ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8237050794] Expected: Should work without ELSE +[Hera] [HADES][TEST ] [KRELTSC: 8239797237] Running IF.empty_stack: IF +[Hera] [HADES][ERROR] [KRELTSC: 8241351342] IF: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 8242151925] Expected error occurred +[Hera] [HADES][TEST ] Testing IF ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8243795112] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 8244916470] IF: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8250840969] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 8254222074] Testing word: ELSE +[Hera] [HADES][TEST ] [KRELTSC: 8255660301] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8256519537] Running ELSE.alone: ELSE +[Hera] [HADES][ERROR] [KRELTSC: 8257616451] ELSE: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 8258474637] Expected error occurred +[Hera] [HADES][TEST ] Testing ELSE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8260181664] Expected: Should error outside IF +[Hera] [HADES][TEST ] [KRELTSC: 8265732153] Running ELSE.double: : BAD IF 1 ELSE ELSE 2 THEN ; +[Hera] [HADES][ERROR] [KRELTSC: 8268608985] ELSE: missing IF +[Hera] [HADES][TEST ] [KRELTSC: 8269403814] Expected error occurred +[Hera] [HADES][TEST ] Testing ELSE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8271051579] Expected: Should prevent double ELSE +[Hera] [HADES][TEST ] [KRELTSC: 8272084254] ELSE: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8273147652] Testing word: ELSE +[Hera] [HADES][TEST ] [KRELTSC: 8274043176] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8274936453] Running ELSE.alone: ELSE +[Hera] [HADES][ERROR] [KRELTSC: 8281282884] ELSE: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 8283264717] Expected error occurred +[Hera] [HADES][TEST ] Testing ELSE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8285693367] Expected: Should error outside IF +[Hera] [HADES][TEST ] [KRELTSC: 8286695886] Running ELSE.double: : BAD IF 1 ELSE ELSE 2 THEN ; +[Hera] [HADES][ERROR] [KRELTSC: 8288206080] ELSE: missing IF +[Hera] [HADES][TEST ] [KRELTSC: 8289056832] Expected error occurred +[Hera] [HADES][TEST ] Testing ELSE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8295285537] Expected: Should prevent double ELSE +[Hera] [HADES][TEST ] [KRELTSC: 8297442111] ELSE: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8298500595] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 8299772943] Testing word: THEN +[Hera] [HADES][TEST ] [KRELTSC: 8300576718] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8301470289] Running THEN.alone: THEN +[Hera] [HADES][ERROR] [KRELTSC: 8302676277] THEN: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 8303542233] Expected error occurred +[Hera] [HADES][TEST ] Testing THEN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8309607327] Expected: Should error outside IF +[Hera] [HADES][TEST ] [KRELTSC: 8311594851] Running THEN.extra: : BAD IF 1 THEN THEN ; +[Hera] [HADES][ERROR] [KRELTSC: 8313364857] CF: underflow +[Hera] [HADES][ERROR] [KRELTSC: 8314207461] THEN: unmatched +[Hera] [HADES][TEST ] [KRELTSC: 8315009766] Expected error occurred +[Hera] [HADES][TEST ] Testing THEN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8316631155] Expected: Should prevent extra THEN +[Hera] [HADES][TEST ] [KRELTSC: 8317690416] THEN: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8318761878] Testing word: THEN +[Hera] [HADES][TEST ] [KRELTSC: 8324185002] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8325796269] Running THEN.alone: THEN +[Hera] [HADES][ERROR] [KRELTSC: 8327342604] THEN: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 8328168975] Expected error occurred +[Hera] [HADES][TEST ] Testing THEN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8329857921] Expected: Should error outside IF +[Hera] [HADES][TEST ] [KRELTSC: 8330869197] Running THEN.extra: : BAD IF 1 THEN THEN ; +[Hera] [HADES][ERROR] [KRELTSC: 8332417359] CF: underflow +[Hera] [HADES][ERROR] [KRELTSC: 8333234490] THEN: unmatched +[Hera] [HADES][TEST ] [KRELTSC: 8339359035] Expected error occurred +[Hera] [HADES][TEST ] Testing THEN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8343086346] Expected: Should prevent extra THEN +[Hera] [HADES][TEST ] [KRELTSC: 8344301931] THEN: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8345335908] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 8346588684] Testing word: BEGIN +[Hera] [HADES][TEST ] [KRELTSC: 8347455354] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8348382714] Running BEGIN.until: : TEST5 0 BEGIN 1+ DUP 5 = UNTIL ; TEST5 +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 8358145887] Test passed +[Hera] [HADES][TEST ] Testing BEGIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8359705074] Expected: Should loop until true +[Hera] [HADES][TEST ] [KRELTSC: 8360748480] Running BEGIN.while: : TEST6 0 BEGIN DUP 5 < WHILE 1+ REPEAT +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 8367774156] Test passed +[Hera] [HADES][TEST ] Testing BEGIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8370095979] Expected: Should loop while true +[Hera] [HADES][TEST ] [KRELTSC: 8371474692] Running BEGIN.alone: BEGIN +[Hera] [HADES][ERROR] [KRELTSC: 8372465997] BEGIN: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 8373291864] Expected error occurred +[Hera] [HADES][TEST ] Testing BEGIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8374922619] Expected: Should error outside definition +[Hera] [HADES][TEST ] [KRELTSC: 8376011028] BEGIN: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8377371324] Testing word: BEGIN +[Hera] [HADES][TEST ] [KRELTSC: 8383531443] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8385495489] Running BEGIN.until: : TEST5 0 BEGIN 1+ DUP 5 = UNTIL ; TEST5 +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 8387648325] Test passed +[Hera] [HADES][TEST ] Testing BEGIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8389239600] Expected: Should loop until true +[Hera] [HADES][TEST ] [KRELTSC: 8390409384] Running BEGIN.while: : TEST6 0 BEGIN DUP 5 < WHILE 1+ REPEAT +[Hera] [HADES][INFO ] [KRELTSC: 8412936945] L8[TABLE]: Config 5 → 6 regime=7 score=26214 L1=0 L2=0 L3=0 L +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 8414981946] Test passed +[Hera] [HADES][TEST ] Testing BEGIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8416536870] Expected: Should loop while true +[Hera] [HADES][TEST ] [KRELTSC: 8417502975] Running BEGIN.alone: BEGIN +[Hera] [HADES][ERROR] [KRELTSC: 8418429999] BEGIN: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 8419316325] Expected error occurred +[Hera] [HADES][TEST ] Testing BEGIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8425739133] Expected: Should error outside definition +[Hera] [HADES][TEST ] [KRELTSC: 8427808809] BEGIN: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8428867839] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 8430089073] Testing word: UNTIL +[Hera] [HADES][TEST ] [KRELTSC: 8430930333] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8431824912] Running UNTIL.basic: : TEST8 BEGIN DUP 1- DUP 0= UNTIL ; 5 TE +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 8433994422] Test passed +[Hera] [HADES][TEST ] Testing UNTIL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8440826730] Expected: Should count down +[Hera] [HADES][TEST ] [KRELTSC: 8443004073] Running UNTIL.immediate: : TEST9 BEGIN 1 UNTIL ; IMMEDIATE +[Hera] [HADES][TEST ] [KRELTSC: 8445364389] Test passed +[Hera] [HADES][TEST ] Testing UNTIL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8446932228] Expected: Should be immediate +[Hera] [HADES][TEST ] [KRELTSC: 8447895813] Running UNTIL.no_begin: UNTIL +[Hera] [HADES][ERROR] [KRELTSC: 8449051821] UNTIL: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 8454313896] Expected error occurred +[Hera] [HADES][TEST ] Testing UNTIL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8458394238] Expected: Should error without BEGIN +[Hera] [HADES][TEST ] [KRELTSC: 8459733954] UNTIL: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8460818793] Testing word: UNTIL +[Hera] [HADES][TEST ] [KRELTSC: 8461647915] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8462525862] Running UNTIL.basic: : TEST8 BEGIN DUP 1- DUP 0= UNTIL ; 5 TE +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 8464712424] Test passed +[Hera] [HADES][TEST ] Testing UNTIL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8471167845] Expected: Should count down +[Hera] [HADES][TEST ] [KRELTSC: 8472971073] Running UNTIL.immediate: : TEST9 BEGIN 1 UNTIL ; IMMEDIATE +[Hera] [HADES][TEST ] [KRELTSC: 8474979828] Test passed +[Hera] [HADES][TEST ] Testing UNTIL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8476553232] Expected: Should be immediate +[Hera] [HADES][TEST ] [KRELTSC: 8477759577] Running UNTIL.no_begin: UNTIL +[Hera] [HADES][ERROR] [KRELTSC: 8478739185] UNTIL: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 8484075621] Expected error occurred +[Hera] [HADES][TEST ] Testing UNTIL ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8486894766] Expected: Should error without BEGIN +[Hera] [HADES][TEST ] [KRELTSC: 8487949512] UNTIL: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8489012049] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 8490369111] Testing word: WHILE +[Hera] [HADES][TEST ] [KRELTSC: 8491216524] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8492146446] Running WHILE.basic: : TEST10 BEGIN DUP 5 < WHILE 1+ REPEAT ; +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 8498972727] Test passed +[Hera] [HADES][TEST ] Testing WHILE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8501631936] Expected: Should count up +[Hera] [HADES][TEST ] [KRELTSC: 8502627273] Running WHILE.zero_times: : TEST11 BEGIN DUP 0< WHILE 1+ REPE +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 8504552364] Test passed +[Hera] [HADES][TEST ] Testing WHILE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8506094436] Expected: Should handle zero iterations +[Hera] [HADES][TEST ] [KRELTSC: 8507181459] Running WHILE.no_begin: WHILE +[Hera] [HADES][ERROR] [KRELTSC: 8512714875] WHILE: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 8513636670] Expected error occurred +[Hera] [HADES][TEST ] Testing WHILE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8516629422] Expected: Should error without BEGIN +[Hera] [HADES][TEST ] [KRELTSC: 8517665730] WHILE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8518735008] Testing word: WHILE +[Hera] [HADES][TEST ] [KRELTSC: 8519551866] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8520441741] Running WHILE.basic: : TEST10 BEGIN DUP 5 < WHILE 1+ REPEAT ; +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 8527335621] Test passed +[Hera] [HADES][TEST ] Testing WHILE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8528964507] Expected: Should count up +[Hera] [HADES][TEST ] [KRELTSC: 8529918936] Running WHILE.zero_times: : TEST11 BEGIN DUP 0< WHILE 1+ REPE +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 8532953205] Test passed +[Hera] [HADES][TEST ] Testing WHILE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8534454726] Expected: Should handle zero iterations +[Hera] [HADES][TEST ] [KRELTSC: 8535524466] Running WHILE.no_begin: WHILE +[Hera] [HADES][ERROR] [KRELTSC: 8536493994] WHILE: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 8541803970] Expected error occurred +[Hera] [HADES][TEST ] Testing WHILE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8543452848] Expected: Should error without BEGIN +[Hera] [HADES][TEST ] [KRELTSC: 8544519690] WHILE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8546245890] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 8547983682] Testing word: REPEAT +[Hera] [HADES][TEST ] [KRELTSC: 8548822653] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8549706753] Running REPEAT.basic: : TEST12 BEGIN DUP 5 < WHILE 1+ REPEAT +[Hera] [HADES][INFO ] [KRELTSC: 8551492866] L8[TABLE]: Config 6 → 7 regime=7 score=26214 L1=0 L2=0 L3=0 L +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 8558348316] Test passed +[Hera] [HADES][TEST ] Testing REPEAT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8560772808] Expected: Should terminate loop +[Hera] [HADES][TEST ] [KRELTSC: 8561770959] Running REPEAT.no_while: REPEAT +[Hera] [HADES][ERROR] [KRELTSC: 8562886542] REPEAT: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 8563717386] Expected error occurred +[Hera] [HADES][TEST ] Testing REPEAT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8565425610] Expected: Should error without WHILE +[Hera] [HADES][TEST ] [KRELTSC: 8566464186] REPEAT: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8572150377] Testing word: REPEAT +[Hera] [HADES][TEST ] [KRELTSC: 8573860365] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8575068096] Running REPEAT.basic: : TEST12 BEGIN DUP 5 < WHILE 1+ REPEAT +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 8577257304] Test passed +[Hera] [HADES][TEST ] Testing REPEAT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8578799082] Expected: Should terminate loop +[Hera] [HADES][TEST ] [KRELTSC: 8579767728] Running REPEAT.no_while: REPEAT +[Hera] [HADES][ERROR] [KRELTSC: 8580738327] REPEAT: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 8586195534] Expected error occurred +[Hera] [HADES][TEST ] Testing REPEAT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8589013566] Expected: Should error without WHILE +[Hera] [HADES][TEST ] [KRELTSC: 8590152396] REPEAT: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8591226147] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 8592421005] Testing word: DO +[Hera] [HADES][TEST ] [KRELTSC: 8593268145] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8594167953] Running DO.basic: : TEST13 5 0 DO I . LOOP ; TEST13 CR +[Hera] 0 1 2 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 8601430383] Test passed +[Hera] [HADES][TEST ] Testing DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8604165339] Expected: Should count 0 to 4 +[Hera] [HADES][TEST ] [KRELTSC: 8605144338] Running DO.negative: : TEST14 -1 -5 DO I . LOOP ; TEST14 CR +[Hera] -5 -4 -3 -2 +[Hera] [HADES][TEST ] [KRELTSC: 8607013737] Test passed +[Hera] [HADES][TEST ] Testing DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8608568619] Expected: Should handle negative +[Hera] [HADES][TEST ] [KRELTSC: 8609589807] Running DO.empty: : TEST15 0 0 DO LOOP ; +[Hera] [HADES][TEST ] [KRELTSC: 8615606580] Test passed +[Hera] [HADES][TEST ] Testing DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8618005179] Expected: Should handle empty range +[Hera] [HADES][TEST ] [KRELTSC: 8619337251] Running DO.nested: : TEST16 3 0 DO 3 0 DO J I + . LOOP LOOP ; +[Hera] 0 1 2 1 2 3 2 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 8621651094] Test passed +[Hera] [HADES][TEST ] Testing DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8623225002] Expected: Should handle nesting +[Hera] [HADES][TEST ] [KRELTSC: 8624262444] DO: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8629746363] Testing word: DO +[Hera] [HADES][TEST ] [KRELTSC: 8630568261] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8631770133] Running DO.basic: : TEST13 5 0 DO I . LOOP ; TEST13 CR +[Hera] 0 1 2 3 [HADES][INFO ] [KRELTSC: 8634764670] L8[TABLE]: Config 7 → 8 regime=7 score=6553 L1=0 L2=0 L3=0 L4 +[Hera] 4 +[Hera] [HADES][TEST ] [KRELTSC: 8636072676] Test passed +[Hera] [HADES][TEST ] Testing DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8637644799] Expected: Should count 0 to 4 +[Hera] [HADES][TEST ] [KRELTSC: 8638661913] Running DO.negative: : TEST14 -1 -5 DO I . LOOP ; TEST14 CR +[Hera] -5 -4 -3 -2 +[Hera] [HADES][TEST ] [KRELTSC: 8645265111] Test passed +[Hera] [HADES][TEST ] Testing DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8647985829] Expected: Should handle negative +[Hera] [HADES][TEST ] [KRELTSC: 8648977995] Running DO.empty: : TEST15 0 0 DO LOOP ; +[Hera] [HADES][TEST ] [KRELTSC: 8650211535] Test passed +[Hera] [HADES][TEST ] Testing DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8651753439] Expected: Should handle empty range +[Hera] [HADES][TEST ] [KRELTSC: 8652822213] Running DO.nested: : TEST16 3 0 DO 3 0 DO J I + . LOOP LOOP ; +[Hera] 0 1 2 1 2 3 2 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 8659564641] Test passed +[Hera] [HADES][TEST ] Testing DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8661915108] Expected: Should handle nesting +[Hera] [HADES][TEST ] [KRELTSC: 8663320449] DO: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8664377484] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 8665635783] Testing word: ?DO +[Hera] [HADES][TEST ] [KRELTSC: 8666482902] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8667409716] Running ?DO.basic: : TEST17 5 0 ?DO I . LOOP ; TEST17 CR +[Hera] 0 1 2 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 8674648542] Test passed +[Hera] [HADES][TEST ] Testing ?DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8677348953] Expected: Should count 0 to 4 +[Hera] [HADES][TEST ] [KRELTSC: 8678322744] Running ?DO.skip: : TEST18 1 1 ?DO I . LOOP ; +[Hera] [HADES][TEST ] [KRELTSC: 8679615819] Test passed +[Hera] [HADES][TEST ] Testing ?DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8681188047] Expected: Should skip when equal +[Hera] [HADES][TEST ] [KRELTSC: 8682224733] Running ?DO.nested: : TEST19 3 0 ?DO 3 I ?DO J I + . LOOP LOO +[Hera] 0 1 2 2 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 8688982176] Test passed +[Hera] [HADES][TEST ] Testing ?DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8691204984] Expected: Should handle nesting +[Hera] [HADES][TEST ] [KRELTSC: 8692660053] ?DO: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8693737374] Testing word: ?DO +[Hera] [HADES][TEST ] [KRELTSC: 8694584115] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8695626870] Running ?DO.basic: : TEST17 5 0 ?DO I . LOOP ; TEST17 CR +[Hera] 0 1 2 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 8702635977] Test passed +[Hera] [HADES][TEST ] Testing ?DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8704159569] Expected: Should count 0 to 4 +[Hera] [HADES][TEST ] [KRELTSC: 8705148522] Running ?DO.skip: : TEST18 1 1 ?DO I . LOOP ; +[Hera] [HADES][TEST ] [KRELTSC: 8706568248] Test passed +[Hera] [HADES][TEST ] Testing ?DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8708243985] Expected: Should skip when equal +[Hera] [HADES][TEST ] [KRELTSC: 8709216474] Running ?DO.nested: : TEST19 3 0 ?DO 3 I ?DO J I + . LOOP LOO +[Hera] [HADES][INFO ] [KRELTSC: 8710984401] L8[TABLE]: Config 8 → 9 regime=7 score=6553 L1=0 L2=0 L3=0 L4 +[Hera] 0 1 2 2 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 8717381442] Test passed +[Hera] [HADES][TEST ] Testing ?DO ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8718942183] Expected: Should handle nesting +[Hera] [HADES][TEST ] [KRELTSC: 8719942119] ?DO: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8721140169] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 8722366695] Testing word: LOOP +[Hera] [HADES][TEST ] [KRELTSC: 8723190168] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8724028992] Running LOOP.basic: : TEST20 5 0 DO I . LOOP ; TEST20 CR +[Hera] 0 1 2 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 8726236911] Test passed +[Hera] [HADES][TEST ] Testing LOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8732342262] Expected: Should increment by 1 +[Hera] [HADES][TEST ] [KRELTSC: 8733396441] Running LOOP.no_do: LOOP +[Hera] [HADES][ERROR] [KRELTSC: 8734521474] LOOP: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 8735356896] Expected error occurred +[Hera] [HADES][TEST ] Testing LOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8737003695] Expected: Should error without DO +[Hera] [HADES][TEST ] [KRELTSC: 8738016231] LOOP: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8739123099] Testing word: LOOP +[Hera] [HADES][TEST ] [KRELTSC: 8739990420] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8740893420] Running LOOP.basic: : TEST20 5 0 DO I . LOOP ; TEST20 CR +[Hera] 0 1 2 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 8747715816] Test passed +[Hera] [HADES][TEST ] Testing LOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8749292496] Expected: Should increment by 1 +[Hera] [HADES][TEST ] [KRELTSC: 8750271558] Running LOOP.no_do: LOOP +[Hera] [HADES][ERROR] [KRELTSC: 8751200409] LOOP: compile-only +[Hera] [HADES][TEST ] [KRELTSC: 8752029951] Expected error occurred +[Hera] [HADES][TEST ] Testing LOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8753710350] Expected: Should error without DO +[Hera] [HADES][TEST ] [KRELTSC: 8754743151] LOOP: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8761035633] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 8762303151] Testing word: +LOOP +[Hera] [HADES][TEST ] [KRELTSC: 8763133428] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8764059360] Running +LOOP.basic: : TEST21 10 0 DO I . 2 +LOOP ; TEST21 CR +[Hera] 0 2 4 6 8 +[Hera] [HADES][TEST ] [KRELTSC: 8766772014] Test passed +[Hera] [HADES][TEST ] Testing +LOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8768384268] Expected: Should count by 2 +[Hera] [HADES][TEST ] [KRELTSC: 8769375426] Running +LOOP.negative: : TEST22 0 10 DO I . -1 +LOOP ; TEST2 +[Hera] 10 9 8 7 6 5 4 3 2 1 0 +[Hera] [HADES][TEST ] [KRELTSC: 8777683782] Test passed +[Hera] [HADES][TEST ] Testing +LOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8780711058] Expected: Should count down +[Hera] [HADES][TEST ] [KRELTSC: 8781657339] Running +LOOP.variable: : TEST23 10 0 DO I . DUP +LOOP ; 3 TE +[Hera] 0 3 6 9 +[Hera] [HADES][TEST ] [KRELTSC: 8783937813] Test passed +[Hera] [HADES][TEST ] Testing +LOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8790605817] Expected: Should use stack value +[Hera] [HADES][TEST ] [KRELTSC: 8792692839] +LOOP: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8795076486] Testing word: +LOOP +[Hera] [HADES][TEST ] [KRELTSC: 8796063276] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8796935721] Running +LOOP.basic: : TEST21 10 0 DO I . 2 +LOOP ; TEST21 CR +[Hera] [HADES][INFO ] [KRELTSC: 8798932779] L8[TABLE]: Config 9 → 10 regime=7 score=6553 L1=0 L2=0 L3=0 L +[Hera] 0 2 4 6 8 +[Hera] [HADES][TEST ] [KRELTSC: 8805290718] Test passed +[Hera] [HADES][TEST ] Testing +LOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8808116877] Expected: Should count by 2 +[Hera] [HADES][TEST ] [KRELTSC: 8809192413] Running +LOOP.negative: : TEST22 0 10 DO I . -1 +LOOP ; TEST2 +[Hera] 10 9 8 7 6 5 4 3 2 1 0 +[Hera] [HADES][TEST ] [KRELTSC: 8811447288] Test passed +[Hera] [HADES][TEST ] Testing +LOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8813046627] Expected: Should count down +[Hera] [HADES][TEST ] [KRELTSC: 8814029595] Running +LOOP.variable: : TEST23 10 0 DO I . DUP +LOOP ; 3 TE +[Hera] 0 3 6 9 +[Hera] [HADES][TEST ] [KRELTSC: 8821996407] Test passed +[Hera] [HADES][TEST ] Testing +LOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8823779874] Expected: Should use stack value +[Hera] [HADES][TEST ] [KRELTSC: 8824767147] +LOOP: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8825835039] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 8827073472] Testing word: I +[Hera] [HADES][TEST ] [KRELTSC: 8827918260] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8833307889] Running I.basic: : TI 4 0 DO I . LOOP CR ; TI +[Hera] 0 1 2 3 +[Hera] [HADES][TEST ] [KRELTSC: 8836148538] Test passed +[Hera] [HADES][TEST ] Testing I ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8838204837] Expected: Should print: 0 1 2 3 +[Hera] [HADES][TEST ] [KRELTSC: 8839180056] Running I.single: : TI1 1 0 DO I . LOOP CR ; TI1 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 8840814066] Test passed +[Hera] [HADES][TEST ] Testing I ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8842383186] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 8847958035] Running I.offset: : TI2 5 3 DO I . LOOP CR ; TI2 +[Hera] 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 8850546348] Test passed +[Hera] [HADES][TEST ] Testing I ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8852705001] Expected: Should print: 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 8853660690] Running I.in_expr: : TI3 3 0 DO I 2 * . LOOP CR ; TI3 +[Hera] 0 2 4 +[Hera] [HADES][TEST ] [KRELTSC: 8855450247] Test passed +[Hera] [HADES][TEST ] Testing I ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8857024701] Expected: Should print: 0 2 4 +[Hera] [HADES][TEST ] [KRELTSC: 8862405090] I: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8863825971] Testing word: I +[Hera] [HADES][TEST ] [KRELTSC: 8865129378] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8866719918] Running I.basic: : TI 4 0 DO I . LOOP CR ; TI +[Hera] 0 1 2 3 +[Hera] [HADES][TEST ] [KRELTSC: 8868816873] Test passed +[Hera] [HADES][TEST ] Testing I ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8870368857] Expected: Should print: 0 1 2 3 +[Hera] [HADES][TEST ] [KRELTSC: 8871427236] Running I.single: : TI1 1 0 DO I . LOOP CR ; TI1 +[Hera] 0 +[Hera] [HADES][INFO ] [KRELTSC: 8877825159] L8[TABLE]: Config 10 → 11 regime=7 score=6553 L1=0 L2=0 L3=0 +[Hera] [HADES][TEST ] [KRELTSC: 8879127096] Test passed +[Hera] [HADES][TEST ] Testing I ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8881766775] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 8882689305] Running I.offset: : TI2 5 3 DO I . LOOP CR ; TI2 +[Hera] 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 8884389045] Test passed +[Hera] [HADES][TEST ] Testing I ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8885947770] Expected: Should print: 3 4 +[Hera] [HADES][TEST ] [KRELTSC: 8886877440] Running I.in_expr: : TI3 3 0 DO I 2 * . LOOP CR ; TI3 +[Hera] 0 2 4 +[Hera] [HADES][TEST ] [KRELTSC: 8893541349] Test passed +[Hera] [HADES][TEST ] Testing I ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8896273512] Expected: Should print: 0 2 4 +[Hera] [HADES][TEST ] [KRELTSC: 8897272629] I: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8898308958] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 8899552494] Testing word: J +[Hera] [HADES][TEST ] [KRELTSC: 8900405619] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8905611540] Running J.basic: : TJ 2 0 DO 3 0 DO J . LOOP LOOP CR ; TJ +[Hera] 0 0 0 1 1 1 +[Hera] [HADES][TEST ] [KRELTSC: 8910339186] Test passed +[Hera] [HADES][TEST ] Testing J ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8911982373] Expected: Should print: 0 0 0 1 1 1 +[Hera] [HADES][TEST ] [KRELTSC: 8912987580] Running J.paired: : TJ2 2 0 DO 2 0 DO J I + . LOOP LOOP CR ; +[Hera] 0 1 1 2 +[Hera] [HADES][TEST ] [KRELTSC: 8915068638] Test passed +[Hera] [HADES][TEST ] Testing J ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8921454066] Expected: Should print: 0 1 1 2 +[Hera] [HADES][TEST ] [KRELTSC: 8923721667] J: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8925588672] Testing word: J +[Hera] [HADES][TEST ] [KRELTSC: 8926400742] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8927247021] Running J.basic: : TJ 2 0 DO 3 0 DO J . LOOP LOOP CR ; TJ +[Hera] 0 0 0 1 1 1 +[Hera] [HADES][TEST ] [KRELTSC: 8929596060] Test passed +[Hera] [HADES][TEST ] Testing J ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8935604076] Expected: Should print: 0 0 0 1 1 1 +[Hera] [HADES][TEST ] [KRELTSC: 8937870207] Running J.paired: : TJ2 2 0 DO 2 0 DO J I + . LOOP LOOP CR ; +[Hera] 0 1 1 2 +[Hera] [HADES][TEST ] [KRELTSC: 8941282308] Test passed +[Hera] [HADES][TEST ] Testing J ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8942797185] Expected: Should print: 0 1 1 2 +[Hera] [HADES][TEST ] [KRELTSC: 8943804471] J: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8944847121] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 8950889262] Testing word: EXIT +[Hera] [HADES][TEST ] [KRELTSC: 8952631275] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8953531923] Running EXIT.early_return: : TEX 5 EXIT 99 ; TEX . CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 8955497586] Test passed +[Hera] [HADES][TEST ] Testing EXIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8956989888] Expected: Should print: 5 +[Hera] [HADES][TEST ] [KRELTSC: 8957930499] Running EXIT.cond_exit_pos: : TEX2 DUP 0> IF EXIT THEN NEGATE +[Hera] [HADES][INFO ] [KRELTSC: 8964112332] L8[TABLE]: Config 11 → 12 regime=7 score=6553 L1=0 L2=0 L3=0 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 8966868687] Test passed +[Hera] [HADES][TEST ] Testing EXIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8968603602] Expected: Should print: 3 +[Hera] [HADES][TEST ] [KRELTSC: 8969524956] Running EXIT.cond_exit_neg: : TEX2 DUP 0> IF EXIT THEN NEGATE +[Hera] 4 +[Hera] [HADES][TEST ] [KRELTSC: 8971360965] Test passed +[Hera] [HADES][TEST ] Testing EXIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8972985756] Expected: Should print: 4 +[Hera] [HADES][TEST ] [KRELTSC: 8974079541] Running EXIT.no_skipped: : TEX3 1 2 EXIT 3 ; TEX3 . . CR +[Hera] 2 1 +[Hera] [HADES][TEST ] [KRELTSC: 8981836710] Test passed +[Hera] [HADES][TEST ] Testing EXIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8983444239] Expected: Should print: 2 1 +[Hera] [HADES][TEST ] [KRELTSC: 8984572989] EXIT: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 8985669063] Testing word: EXIT +[Hera] [HADES][TEST ] [KRELTSC: 8986510323] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 8987661795] Running EXIT.early_return: : TEX 5 EXIT 99 ; TEX . CR +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 8994705426] Test passed +[Hera] [HADES][TEST ] Testing EXIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 8996335929] Expected: Should print: 5 +[Hera] [HADES][TEST ] [KRELTSC: 8998177209] Running EXIT.cond_exit_pos: : TEX2 DUP 0> IF EXIT THEN NEGATE +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 9000552876] Test passed +[Hera] [HADES][TEST ] Testing EXIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9002175042] Expected: Should print: 3 +[Hera] [HADES][TEST ] [KRELTSC: 9003099252] Running EXIT.cond_exit_neg: : TEX2 DUP 0> IF EXIT THEN NEGATE +[Hera] 4 +[Hera] [HADES][TEST ] [KRELTSC: 9010556667] Test passed +[Hera] [HADES][TEST ] Testing EXIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9012628758] Expected: Should print: 4 +[Hera] [HADES][TEST ] [KRELTSC: 9013563825] Running EXIT.no_skipped: : TEX3 1 2 EXIT 3 ; TEX3 . . CR +[Hera] 2 1 +[Hera] [HADES][TEST ] [KRELTSC: 9015285993] Test passed +[Hera] [HADES][TEST ] Testing EXIT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9016878339] Expected: Should print: 2 1 +[Hera] [HADES][TEST ] [KRELTSC: 9017861391] EXIT: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 9018986907] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 9020211459] Testing word: LEAVE +[Hera] [HADES][TEST ] [KRELTSC: 9025511544] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 9026943366] Running LEAVE.basic: : TLV 0 5 0 DO I 3 = IF LEAVE THEN 1+ LO +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 9030172452] Test passed +[Hera] [HADES][TEST ] Testing LEAVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9031778175] Expected: Should print: 3 +[Hera] [HADES][TEST ] [KRELTSC: 9037236369] Running LEAVE.at_start: : TLV2 0 5 0 DO LEAVE 1+ LOOP ; TLV2 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 9040055283] Test passed +[Hera] [HADES][TEST ] Testing LEAVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9042027897] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 9042947655] Running LEAVE.qdloop: : TLV3 0 5 0 ?DO I 2 = IF LEAVE THEN 1+ +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 9044828583] Test passed +[Hera] [HADES][TEST ] Testing LEAVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9046419354] Expected: Should print: 2 +[Hera] [HADES][TEST ] [KRELTSC: 9051887964] LEAVE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 9052969107] Testing word: LEAVE +[Hera] [HADES][TEST ] [KRELTSC: 9054469410] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 9055878258] Running LEAVE.basic: : TLV 0 5 0 DO I 3 = IF LEAVE THEN 1+ LO +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 9058079016] Test passed +[Hera] [HADES][TEST ] Testing LEAVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9059619618] Expected: Should print: 3 +[Hera] [HADES][TEST ] [KRELTSC: 9060579780] Running LEAVE.at_start: : TLV2 0 5 0 DO LEAVE 1+ LOOP ; TLV2 +[Hera] [HADES][INFO ] [KRELTSC: 9066645420] L8[TABLE]: Config 12 → 13 regime=7 score=6553 L1=0 L2=0 L3=0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 9068770914] Test passed +[Hera] [HADES][TEST ] Testing LEAVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9071112351] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 9072045927] Running LEAVE.qdloop: : TLV3 0 5 0 ?DO I 2 = IF LEAVE THEN 1+ +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 9073942437] Test passed +[Hera] [HADES][TEST ] Testing LEAVE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9075525228] Expected: Should print: 2 +[Hera] [HADES][TEST ] [KRELTSC: 9076453827] LEAVE: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 9077746440] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 9083602290] Testing word: UNLOOP +[Hera] [HADES][TEST ] [KRELTSC: 9084453735] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 9086127960] Running UNLOOP.early_exit: : TUL 5 0 DO I 2 = IF UNLOOP 42 EX +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 9088796136] Test passed +[Hera] [HADES][TEST ] Testing UNLOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9090565113] Expected: Should print: 42 +[Hera] [HADES][TEST ] [KRELTSC: 9091518618] Running UNLOOP.full_loop: : TUL2 5 0 DO I 9 = IF UNLOOP 77 EX +[Hera] 99 +[Hera] [HADES][TEST ] [KRELTSC: 9098149557] Test passed +[Hera] [HADES][TEST ] Testing UNLOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9100130823] Expected: Should print: 99 +[Hera] [HADES][TEST ] [KRELTSC: 9101943837] UNLOOP: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 9103178175] Testing word: UNLOOP +[Hera] [HADES][TEST ] [KRELTSC: 9104069541] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 9104948349] Running UNLOOP.early_exit: : TUL 5 0 DO I 2 = IF UNLOOP 42 EX +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 9107128380] Test passed +[Hera] [HADES][TEST ] Testing UNLOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9113017746] Expected: Should print: 42 +[Hera] [HADES][TEST ] [KRELTSC: 9113936433] Running UNLOOP.full_loop: : TUL2 5 0 DO I 9 = IF UNLOOP 77 EX +[Hera] 99 +[Hera] [HADES][TEST ] [KRELTSC: 9117533082] Test passed +[Hera] [HADES][TEST ] Testing UNLOOP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9119127633] Expected: Should print: 99 +[Hera] [HADES][TEST ] [KRELTSC: 9120067299] UNLOOP: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 9121175973] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 9126791667] Testing word: AGAIN +[Hera] [HADES][TEST ] [KRELTSC: 9129090495] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 9129971907] Running AGAIN.basic: : TAG 0 BEGIN 1+ DUP 3 = IF EXIT THEN AG +[Hera] 3 [HADES][INFO ] [KRELTSC: 9132435060] L8[TABLE]: Config 13 → 14 regime=7 score=6553 L1=0 L2=0 L3=0 + +[Hera] [HADES][TEST ] [KRELTSC: 9133540353] Test passed +[Hera] [HADES][TEST ] Testing AGAIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9135113862] Expected: Should print: 3 +[Hera] [HADES][TEST ] [KRELTSC: 9136035489] Running AGAIN.countdown: : CD 10 BEGIN 1- DUP 0= IF EXIT THEN +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 9143840916] Test passed +[Hera] [HADES][TEST ] Testing AGAIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9145397646] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 9146353398] AGAIN: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 9147425448] Testing word: AGAIN +[Hera] [HADES][TEST ] [KRELTSC: 9148284705] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 9149166033] Running AGAIN.basic: : TAG 0 BEGIN 1+ DUP 3 = IF EXIT THEN AG +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 9156332367] Test passed +[Hera] [HADES][TEST ] Testing AGAIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9159922653] Expected: Should print: 3 +[Hera] [HADES][TEST ] [KRELTSC: 9161114907] Running AGAIN.countdown: : CD 10 BEGIN 1- DUP 0= IF EXIT THEN +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 9163474131] Test passed +[Hera] [HADES][TEST ] Testing AGAIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9165045666] Expected: Should print: 0 +[Hera] [HADES][TEST ] [KRELTSC: 9170390523] AGAIN: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 9172264647] ▶ Testing module: v3/src/test_runner/modules/control_words_te +[Hera] [HADES][TEST ] [KRELTSC: 9173934168] Testing word: CASE +[Hera] [HADES][TEST ] [KRELTSC: 9174753399] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 9175647579] Running CASE.match_1: : TC CASE 1 OF 10 ENDOF 2 OF 20 ENDOF 9 +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 9178826013] Test passed +[Hera] [HADES][TEST ] Testing CASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9180422433] Expected: Should print: 10 +[Hera] [HADES][TEST ] [KRELTSC: 9185633037] Running CASE.match_2: : TC CASE 1 OF 10 ENDOF 2 OF 20 ENDOF 9 +[Hera] 20 +[Hera] [HADES][TEST ] [KRELTSC: 9189021870] Test passed +[Hera] [HADES][TEST ] Testing CASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9190569171] Expected: Should print: 20 +[Hera] [HADES][TEST ] [KRELTSC: 9191539917] Running CASE.default: : TC CASE 1 OF 10 ENDOF 2 OF 20 ENDOF 9 +[Hera] 99 +[Hera] [HADES][INFO ] [KRELTSC: 9194147844] L8[TABLE]: Config 14 → 0 regime=6 score=26214 L1=0 L2=0 L3=0 +[Hera] [HADES][TEST ] [KRELTSC: 9200169594] Test passed +[Hera] [HADES][TEST ] Testing CASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9202968033] Expected: Should print: 99 +[Hera] [HADES][TEST ] [KRELTSC: 9203903373] Running CASE.zero_case: : TC CASE 0 OF 88 ENDOF 1 OF 77 ENDOF +[Hera] 88 +[Hera] [HADES][TEST ] [KRELTSC: 9206031156] Test passed +[Hera] [HADES][TEST ] Testing CASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9207637404] Expected: Should print: 88 +[Hera] [HADES][TEST ] [KRELTSC: 9208584252] Running CASE.neg_case: : TC CASE -1 OF 55 ENDOF 44 SWAP ENDCA +[Hera] 55 +[Hera] [HADES][TEST ] [KRELTSC: 9215715390] Test passed +[Hera] [HADES][TEST ] Testing CASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9218107752] Expected: Should print: 55 +[Hera] [HADES][TEST ] [KRELTSC: 9219032823] CASE: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 9220126209] Testing word: CASE +[Hera] [HADES][TEST ] [KRELTSC: 9220965117] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 9221841867] Running CASE.match_1: : TC CASE 1 OF 10 ENDOF 2 OF 20 ENDOF 9 +[Hera] 10 +[Hera] [HADES][TEST ] [KRELTSC: 9228322530] Test passed +[Hera] [HADES][TEST ] Testing CASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9230345019] Expected: Should print: 10 +[Hera] [HADES][TEST ] [KRELTSC: 9231277902] Running CASE.match_2: : TC CASE 1 OF 10 ENDOF 2 OF 20 ENDOF 9 +[Hera] 20 +[Hera] [HADES][TEST ] [KRELTSC: 9233418306] Test passed +[Hera] [HADES][TEST ] Testing CASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9234967539] Expected: Should print: 20 +[Hera] [HADES][TEST ] [KRELTSC: 9235931901] Running CASE.default: : TC CASE 1 OF 10 ENDOF 2 OF 20 ENDOF 9 +[Hera] 99 +[Hera] [HADES][TEST ] [KRELTSC: 9238096644] Test passed +[Hera] [HADES][TEST ] Testing CASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9244608912] Expected: Should print: 99 +[Hera] [HADES][TEST ] [KRELTSC: 9246645597] Running CASE.zero_case: : TC CASE 0 OF 88 ENDOF 1 OF 77 ENDOF +[Hera] 88 +[Hera] [HADES][TEST ] [KRELTSC: 9248897175] Test passed +[Hera] [HADES][TEST ] Testing CASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9250442040] Expected: Should print: 88 +[Hera] [HADES][TEST ] [KRELTSC: 9251373999] Running CASE.neg_case: : TC CASE -1 OF 55 ENDOF 44 SWAP ENDCA +[Hera] 55 +[Hera] [HADES][TEST ] [KRELTSC: 9258001683] Test passed +[Hera] [HADES][TEST ] Testing CASE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9260257629] Expected: Should print: 55 +[Hera] [HADES][TEST ] [KRELTSC: 9261741069] CASE: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 9262883469] === Control Words Summary: 0 passed, 0 failed, 0 skipped, 0 err +[Hera] [HADES][INFO ] [KRELTSC: 9264169761] +[Hera] === Testing Module: StarForth Words === +[Hera] [HADES][INFO ] [KRELTSC: 9265563426] Running StarForth Words Tests (Module 17: StarForth Extensions) +[Hera] [HADES][TEST ] [KRELTSC: 9266852595] ▶ Testing module: v3/src/test_runner/modules/starforth_words_ +[Hera] [HADES][TEST ] [KRELTSC: 9272730222] Testing word: ENTROPY@ +[Hera] [HADES][TEST ] [KRELTSC: 9273600840] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 9275434728] Running ENTROPY@.after_execution: : TESTWORD 1 1 + DROP ; TES +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 9277957479] Test passed +[Hera] [HADES][TEST ] Testing ENTROPY@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9279571392] Expected: Should show execution count > 0 +[Hera] [HADES][TEST ] [KRELTSC: 9280770513] Running ENTROPY@.zero_initial: : NEWWORD ; ' NEWWORD ENTROPY@ +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 9287095566] Test passed +[Hera] [HADES][TEST ] Testing ENTROPY@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9290046108] Expected: Should show 0 for unused word +[Hera] [HADES][TEST ] [KRELTSC: 9291413292] Running ENTROPY@.multiple_calls: : ENTTEST 1 DROP ; ENTTEST E +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 9293594436] Test passed +[Hera] [HADES][TEST ] Testing ENTROPY@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9295144425] Expected: Should increment with each call +[Hera] [HADES][TEST ] [KRELTSC: 9296183274] Running ENTROPY@.null_addr: 0 ENTROPY@ +[Hera] [HADES][ERROR] [KRELTSC: 9301959828] ENTROPY@: null dictionary entry +[Hera] [HADES][TEST ] [KRELTSC: 9302906676] Expected error occurred +[Hera] [HADES][TEST ] Testing ENTROPY@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9305905224] Expected: Should handle null address +[Hera] [HADES][TEST ] [KRELTSC: 9306934518] Running ENTROPY@.empty_stack: ENTROPY@ +[Hera] [HADES][ERROR] [KRELTSC: 9308082042] ENTROPY@: data stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 9308996613] Expected error occurred +[Hera] [HADES][TEST ] Testing ENTROPY@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9310680078] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 9311740641] ENTROPY@: 5 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 9317393946] ▶ Testing module: v3/src/test_runner/modules/starforth_words_ +[Hera] [HADES][TEST ] [KRELTSC: 9319817136] Testing word: ENTROPY! +[Hera] [HADES][TEST ] [KRELTSC: 9320809197] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 9321706254] Running ENTROPY!.set_entropy: : ENTSET ; 42 ' ENTSET ENTROPY! +[Hera] 42 +[Hera] [HADES][TEST ] [KRELTSC: 9323873769] Test passed +[Hera] [HADES][TEST ] Testing ENTROPY! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9325486464] Expected: Should set entropy to 42 +[Hera] [HADES][TEST ] [KRELTSC: 9331200102] Running ENTROPY!.overwrite: : ENTOV ; 10 ' ENTOV ENTROPY! 20 +[Hera] [HADES][INFO ] [KRELTSC: 9333291534] L8[TABLE]: Config 0 → 14 regime=7 score=6553 L1=0 L2=0 L3=0 L +[Hera] 20 +[Hera] [HADES][TEST ] [KRELTSC: 9335705694] Test passed +[Hera] [HADES][TEST ] Testing ENTROPY! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9337334433] Expected: Should overwrite previous value +[Hera] [HADES][TEST ] [KRELTSC: 9338417508] Running ENTROPY!.zero_entropy: : ENTZERO ; 0 ' ENTZERO ENTROP +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 9344515992] Test passed +[Hera] [HADES][TEST ] Testing ENTROPY! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9348313380] Expected: Should set entropy to 0 +[Hera] [HADES][TEST ] [KRELTSC: 9349952514] Running ENTROPY!.null_addr: 42 0 ENTROPY! +[Hera] [HADES][ERROR] [KRELTSC: 9351124818] ENTROPY!: null dictionary entry +[Hera] [HADES][TEST ] [KRELTSC: 9352110579] Expected error occurred +[Hera] [HADES][TEST ] Testing ENTROPY! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9353789802] Expected: Should handle null address +[Hera] [HADES][TEST ] [KRELTSC: 9354815022] Running ENTROPY!.one_arg: 42 ENTROPY! +[Hera] [HADES][ERROR] [KRELTSC: 9360381912] ENTROPY!: data stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 9361336866] Expected error occurred +[Hera] [HADES][TEST ] Testing ENTROPY! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9363005820] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 9364054539] Running ENTROPY!.empty_stack: ENTROPY! +[Hera] [HADES][ERROR] [KRELTSC: 9365042757] ENTROPY!: data stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 9365910603] Expected error occurred +[Hera] [HADES][TEST ] Testing ENTROPY! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9367575315] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 9368773911] ENTROPY!: 6 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 9369864399] ▶ Testing module: v3/src/test_runner/modules/starforth_words_ +[Hera] [HADES][TEST ] [KRELTSC: 9375679635] Testing word: WORD-ENTROPY +[Hera] [HADES][TEST ] [KRELTSC: 9376609284] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 9378531708] Running WORD-ENTROPY.display_all: 1 DUP DUP DUP DROP DROP DRO +[Hera] Word Usage Statistics (Execution Heat Counts): + +[Hera] ============================================= + +[Hera] DEFER@: 2 + +[Hera] IS: 5 + +[Hera] DEFER: 4 + +[Hera] WORD-ENTROPY: 1 + +[Hera] ENTROPY!: 7 + +[Hera] ENTROPY@: 8 + +[Hera] ENDCASE: 10 + +[Hera] ENDOF: 18 + +[Hera] OF: 18 + +[Hera] CASE: 10 + +[Hera] EXIT: 119 + +[Hera] UNLOOP: 6 + +[Hera] J: 58 + +[Hera] I: 212 + +[Hera] LEAVE: 6 + +[Hera] +LOOP: 6 + +[Hera] LOOP: 48 + +[Hera] DO: 42 + +[Hera] ?DO: 10 + +[Hera] UNTIL: 8 + +[Hera] AGAIN: 4 + +[Hera] REPEAT: 10 + +[Hera] WHILE: 10 + +[Hera] BEGIN: 20 + +[Hera] THEN: 32 + +[Hera] ELSE: 14 + +[Hera] IF: 32 + +[Hera] (LEAVE): 6 + +[Hera] (+LOOP): 40 + +[Hera] (LOOP): 152 + +[Hera] (DO): 48 + +[Hera] (?DO): 12 + +[Hera] (0BRANCH): 142 + +[Hera] (BRANCH): 72 + +[Hera] DOES>: 3 + +[Hera] does_rt: 1 + +[Hera] LITERAL: 1 + +[Hera] LIT: 305 + +[Hera] FENCE: 3 + +[Hera] FORGET: 7 + +[Hera] ]: 3 + +[Hera] [: 4 + +[Hera] IMMEDIATE: 6 + +[Hera] CONSTANT: 4 + +[Hera] VARIABLE: 5 + +[Hera] CREATE: 23 + +[Hera] ;: 121 + +[Hera] :: 129 + +[Hera] ABORT": 3 + +[Hera] ABORT: 4 + +[Hera] QUIT: 1 + +[Hera] EXECUTE: 2 + +[Hera] ORDER: 3 + +[Hera] FORTH: 10 + +[Hera] CURRENT: 4 + +[Hera] CONTEXT: 5 + +[Hera] DEFINITIONS: 15 + +[Hera] VOCABULARY: 15 + +[Hera] ': 16 + +[Hera] FIND: 4 + +[Hera] >BODY: 2 + +[Hera] HIDDEN: 2 + +[Hera] SMUDGE: 2 + +[Hera] LATEST: 7 + +[Hera] SP@: 8 + +[Hera] SP!: 5 + +[Hera] PAD: 15 + +[Hera] 2,: 7 + +[Hera] C,: 10 + +[Hera] ,: 21 + +[Hera] ALLOT: 9 + +[Hera] ALIGN: 1 + +[Hera] HERE: 109 + +[Hera] SCR: 3 + +[Hera] THRU: 17 + +[Hera] LIST: 5 + +[Hera] LOAD: 5 + +[Hera] FLUSH: 3 + +[Hera] EMPTY-BUFFERS: 4 + +[Hera] SAVE-BUFFERS: 3 + +[Hera] UPDATE: 7 + +[Hera] BUFFER: 4 + +[Hera] BLOCK: 12 + +[Hera] SPACES: 10 + +[Hera] SPACE: 7 + +[Hera] TYPE: 43 + +[Hera] CR: 659 + +[Hera] EMIT: 15 + +[Hera] BLANK: 2 + +[Hera] SKIP: 4 + +[Hera] SCAN: 5 + +[Hera] SEARCH: 4 + +[Hera] COMPARE: 5 + +[Hera] CMOVE>: 4 + +[Hera] CMOVE: 6 + +[Hera] -TRAILING: 4 + +[Hera] LITERAL: 1 + +[Hera] [']: 3 + +[Hera] BL: 19 + +[Hera] SOURCE: 2 + +[Hera] >IN: 5 + +[Hera] S": 37 + +[Hera] (s"): 4 + +[Hera] WORD: 15 + +[Hera] SPAN: 4 + +[Hera] EXPECT: 4 + +[Hera] COUNT: 14 + +[Hera] OCTAL: 6 + +[Hera] HEX: 7 + +[Hera] DECIMAL: 14 + +[Hera] BASE: 9 + +[Hera] SIGN: 3 + +[Hera] HOLD: 2 + +[Hera] #>: 16 + +[Hera] #S: 11 + +[Hera] #: 5 + +[Hera] <#: 17 + +[Hera] .: 901 + +[Hera] D2/: 5 + +[Hera] D2*: 5 + +[Hera] D0<: 7 + +[Hera] D0=: 7 + +[Hera] 2R@: 3 + +[Hera] 2R>: 7 + +[Hera] 2>R: 7 + +[Hera] 2ROT: 6 + +[Hera] 2OVER: 6 + +[Hera] 2SWAP: 7 + +[Hera] 2DUP: 6 + +[Hera] 2DROP: 6 + +[Hera] D=: 7 + +[Hera] D<: 8 + +[Hera] DMIN: 6 + +[Hera] DMAX: 6 + +[Hera] DABS: 7 + +[Hera] DNEGATE: 6 + +[Hera] D-: 8 + +[Hera] D+: 7 + +[Hera] S>D: 7 + +[Hera] */MOD: 8 + +[Hera] */: 10 + +[Hera] M/MOD: 7 + +[Hera] M*: 8 + +[Hera] M+: 7 + +[Hera] FALSE: 18 + +[Hera] TRUE: 30 + +[Hera] WITHIN: 31 + +[Hera] U>: 25 + +[Hera] U<: 25 + +[Hera] <=: 31 + +[Hera] >=: 31 + +[Hera] >: 30 + +[Hera] <: 74 + +[Hera] <>: 26 + +[Hera] =: 176 + +[Hera] 0<>: 22 + +[Hera] 0>: 27 + +[Hera] 0<: 24 + +[Hera] 0=: 66 + +[Hera] NOT: 18 + +[Hera] XOR: 32 + +[Hera] OR: 22 + +[Hera] AND: 43 + +[Hera] MAX: 26 + +[Hera] MIN: 4 + +[Hera] NEGATE: 30 + +[Hera] ABS: 25 + +[Hera] 2/: 31 + +[Hera] 2*: 31 + +[Hera] 2-: 10 + +[Hera] 2+: 19 + +[Hera] 1-: 79 + +[Hera] 1+: 84 + +[Hera] */MOD: 8 + +[Hera] */: 10 + +[Hera] /MOD: 20 + +[Hera] MOD: 38 + +[Hera] /: 35 + +[Hera] *: 50 + +[Hera] -: 34 + +[Hera] +: 135 + +[Hera] CELLS: 18 + +[Hera] ERASE: 11 + +[Hera] MOVE: 11 + +[Hera] FILL: 23 + +[Hera] 2!: 17 + +[Hera] 2@: 14 + +[Hera] -!: 17 + +[Hera] +!: 35 + +[Hera] C!: 51 + +[Hera] C@: 97 + +[Hera] !: 111 + +[Hera] @: 182 + +[Hera] R@: 47 + +[Hera] R>: 64 + +[Hera] >R: 66 + +[Hera] ROLL: 10 + +[Hera] PICK: 16 + +[Hera] DEPTH: 79 + +[Hera] -ROT: 18 + +[Hera] ROT: 31 + +[Hera] OVER: 52 + +[Hera] SWAP: 41 + +[Hera] DUP: 144 + +[Hera] DROP: 51 + +[Hera] ------------------------------------- + +[Hera] Total executions: 6817 + +[Hera] Total words: 516 + +[Hera] Average executions per word: 13 + +[Hera] [HADES][TEST ] [KRELTSC: 9512409732] Test passed +[Hera] [HADES][TEST ] Testing WORD-ENTROPY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9514066275] Expected: Should display all word entropy stats +[Hera] [HADES][TEST ] [KRELTSC: 9515222619] Running WORD-ENTROPY.after_execution: : WDENT 1 2 + DROP ; WD +[Hera] Word Usage Statistics (Execution Heat Counts): + +[Hera] ============================================= + +[Hera] WDENT: 2 + +[Hera] DEFER@: 2 + +[Hera] IS: 5 + +[Hera] DEFER: 4 + +[Hera] WORD-ENTROPY: 2 + +[Hera] ENTROPY!: 7 + +[Hera] ENTROPY@: 8 + +[Hera] ENDCASE: 10 + +[Hera] ENDOF: 18 + +[Hera] OF: 18 + +[Hera] CASE: 10 + +[Hera] EXIT: 121 + +[Hera] UNLOOP: 6 + +[Hera] J: 58 + +[Hera] I: 212 + +[Hera] LEAVE: 6 + +[Hera] +LOOP: 6 + +[Hera] LOOP: 48 + +[Hera] DO: 42 + +[Hera] ?DO: 10 + +[Hera] UNTIL: 8 + +[Hera] AGAIN: 4 + +[Hera] REPEAT: 10 + +[Hera] WHILE: 10 + +[Hera] BEGIN: 20 + +[Hera] THEN: 32 + +[Hera] ELSE: 14 + +[Hera] IF: 32 + +[Hera] (LEAVE): 6 + +[Hera] (+LOOP): 40 + +[Hera] (LOOP): 152 + +[Hera] (DO): 48 + +[Hera] (?DO): 12 + +[Hera] (0BRANCH): 142 + +[Hera] (BRANCH): 72 + +[Hera] DOES>: 3 + +[Hera] does_rt: 1 + +[Hera] LITERAL: 1 + +[Hera] LIT: 309 + +[Hera] FENCE: 3 + +[Hera] FORGET: 7 + +[Hera] ]: 3 + +[Hera] [: 4 + +[Hera] IMMEDIATE: 6 + +[Hera] CONSTANT: 4 + +[Hera] VARIABLE: 5 + +[Hera] CREATE: 23 + +[Hera] ;: 122 + +[Hera] :: 130 + +[Hera] ABORT": 3 + +[Hera] ABORT: 4 + +[Hera] QUIT: 1 + +[Hera] EXECUTE: 2 + +[Hera] ORDER: 3 + +[Hera] FORTH: 10 + +[Hera] CURRENT: 4 + +[Hera] CONTEXT: 5 + +[Hera] DEFINITIONS: 15 + +[Hera] VOCABULARY: 15 + +[Hera] ': 16 + +[Hera] FIND: 4 + +[Hera] >BODY: 2 + +[Hera] HIDDEN: 2 + +[Hera] SMUDGE: 2 + +[Hera] LATEST: 7 + +[Hera] SP@: 8 + +[Hera] SP!: 5 + +[Hera] PAD: 15 + +[Hera] 2,: 7 + +[Hera] C,: 10 + +[Hera] ,: 21 + +[Hera] ALLOT: 9 + +[Hera] ALIGN: 1 + +[Hera] HERE: 109 + +[Hera] SCR: 3 + +[Hera] THRU: 17 + +[Hera] LIST: 5 + +[Hera] LOAD: 5 + +[Hera] FLUSH: 3 + +[Hera] EMPTY-BUFFERS: 4 + +[Hera] SAVE-BUFFERS: 3 + +[Hera] UPDATE: 7 + +[Hera] BUFFER: 4 + +[Hera] BLOCK: 12 + +[Hera] SPACES: 10 + +[Hera] SPACE: 7 + +[Hera] TYPE: 43 + +[Hera] CR: 659 + +[Hera] EMIT: 15 + +[Hera] BLANK: 2 + +[Hera] SKIP: 4 + +[Hera] SCAN: 5 + +[Hera] SEARCH: 4 + +[Hera] COMPARE: 5 + +[Hera] CMOVE>: 4 + +[Hera] CMOVE: 6 + +[Hera] -TRAILING: 4 + +[Hera] LITERAL: 1 + +[Hera] [']: 3 + +[Hera] BL: 19 + +[Hera] SOURCE: 2 + +[Hera] >IN: 5 + +[Hera] S": 37 + +[Hera] (s"): 4 + +[Hera] WORD: 15 + +[Hera] SPAN: 4 + +[Hera] EXPECT: 4 + +[Hera] COUNT: 14 + +[Hera] OCTAL: 6 + +[Hera] HEX: 7 + +[Hera] DECIMAL: 14 + +[Hera] BASE: 9 + +[Hera] SIGN: 3 + +[Hera] HOLD: 2 + +[Hera] #>: 16 + +[Hera] #S: 11 + +[Hera] #: 5 + +[Hera] <#: 17 + +[Hera] .: 901 + +[Hera] D2/: 5 + +[Hera] D2*: 5 + +[Hera] D0<: 7 + +[Hera] D0=: 7 + +[Hera] 2R@: 3 + +[Hera] 2R>: 7 + +[Hera] 2>R: 7 + +[Hera] 2ROT: 6 + +[Hera] 2OVER: 6 + +[Hera] 2SWAP: 7 + +[Hera] 2DUP: 6 + +[Hera] 2DROP: 6 + +[Hera] D=: 7 + +[Hera] D<: 8 + +[Hera] DMIN: 6 + +[Hera] DMAX: 6 + +[Hera] DABS: 7 + +[Hera] DNEGATE: 6 + +[Hera] D-: 8 + +[Hera] D+: 7 + +[Hera] S>D: 7 + +[Hera] */MOD: 8 + +[Hera] */: 10 + +[Hera] M/MOD: 7 + +[Hera] M*: 8 + +[Hera] M+: 7 + +[Hera] FALSE: 18 + +[Hera] TRUE: 30 + +[Hera] WITHIN: 31 + +[Hera] U>: 25 + +[Hera] U<: 25 + +[Hera] <=: 31 + +[Hera] >=: 31 + +[Hera] >: 30 + +[Hera] <: 74 + +[Hera] <>: 26 + +[Hera] =: 176 + +[Hera] 0<>: 22 + +[Hera] 0>: 27 + +[Hera] 0<: 24 + +[Hera] 0=: 66 + +[Hera] NOT: 18 + +[Hera] XOR: 32 + +[Hera] OR: 22 + +[Hera] AND: 43 + +[Hera] MAX: 26 + +[Hera] MIN: 4 + +[Hera] NEGATE: 30 + +[Hera] ABS: 25 + +[Hera] 2/: 31 + +[Hera] 2*: 31 + +[Hera] 2-: 10 + +[Hera] 2+: 19 + +[Hera] 1-: 79 + +[Hera] 1+: 84 + +[Hera] */MOD: 8 + +[Hera] */: 10 + +[Hera] /MOD: 20 + +[Hera] MOD: 38 + +[Hera] /: 35 + +[Hera] *: 50 + +[Hera] -: 34 + +[Hera] +: 138 + +[Hera] CELLS: 18 + +[Hera] ERASE: 11 + +[Hera] MOVE: 11 + +[Hera] FILL: 23 + +[Hera] 2!: 17 + +[Hera] 2@: 14 + +[Hera] -!: 17 + +[Hera] +!: 35 + +[Hera] C!: 51 + +[Hera] C@: 97 + +[Hera] !: 111 + +[Hera] @: 182 + +[Hera] R@: 47 + +[Hera] R>: 64 + +[Hera] >R: 66 + +[Hera] ROLL: 10 + +[Hera] PICK: 16 + +[Hera] DEPTH: 79 + +[Hera] -ROT: 18 + +[Hera] ROT: 31 + +[Hera] OVER: 52 + +[Hera] SWAP: 41 + +[Hera] DUP: 144 + +[Hera] DROP: 54 + +[Hera] ------------------------------------- + +[Hera] Total executions: 6834 + +[Hera] Total words: 517 + +[Hera] Average executions per word: 13 + +[Hera] [HADES][TEST ] [KRELTSC: 9642432597] Test passed +[Hera] [HADES][TEST ] Testing WORD-ENTROPY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9644106528] Expected: Should show defined word entropy +[Hera] [HADES][TEST ] [KRELTSC: 9645247122] Running WORD-ENTROPY.stack_preserved: DEPTH WORD-ENTROPY DEPT +[Hera] Word Usage Statistics (Execution Heat Counts): + +[Hera] ============================================= + +[Hera] WDENT: 2 + +[Hera] DEFER@: 2 + +[Hera] IS: 5 + +[Hera] DEFER: 4 + +[Hera] WORD-ENTROPY: 3 + +[Hera] ENTROPY!: 7 + +[Hera] ENTROPY@: 8 + +[Hera] ENDCASE: 10 + +[Hera] ENDOF: 18 + +[Hera] OF: 18 + +[Hera] CASE: 10 + +[Hera] EXIT: 121 + +[Hera] UNLOOP: 6 + +[Hera] J: 58 + +[Hera] I: 212 + +[Hera] LEAVE: 6 + +[Hera] +LOOP: 6 + +[Hera] LOOP: 48 + +[Hera] DO: 42 + +[Hera] ?DO: 10 + +[Hera] UNTIL: 8 + +[Hera] AGAIN: 4 + +[Hera] REPEAT: 10 + +[Hera] WHILE: 10 + +[Hera] BEGIN: 20 + +[Hera] THEN: 32 + +[Hera] ELSE: 14 + +[Hera] IF: 32 + +[Hera] (LEAVE): 6 + +[Hera] (+LOOP): 40 + +[Hera] (LOOP): 152 + +[Hera] (DO): 48 + +[Hera] (?DO): 12 + +[Hera] (0BRANCH): 142 + +[Hera] (BRANCH): 72 + +[Hera] DOES>: 3 + +[Hera] does_rt: 1 + +[Hera] LITERAL: 1 + +[Hera] LIT: 309 + +[Hera] FENCE: 3 + +[Hera] FORGET: 7 + +[Hera] ]: 3 + +[Hera] [: 4 + +[Hera] IMMEDIATE: 6 + +[Hera] CONSTANT: 4 + +[Hera] VARIABLE: 5 + +[Hera] CREATE: 23 + +[Hera] ;: 122 + +[Hera] :: 130 + +[Hera] ABORT": 3 + +[Hera] ABORT: 4 + +[Hera] QUIT: 1 + +[Hera] EXECUTE: 2 + +[Hera] ORDER: 3 + +[Hera] FORTH: 10 + +[Hera] CURRENT: 4 + +[Hera] CONTEXT: 5 + +[Hera] DEFINITIONS: 15 + +[Hera] VOCABULARY: 15 + +[Hera] ': 16 + +[Hera] FIND: 4 + +[Hera] >BODY: 2 + +[Hera] HIDDEN: 2 + +[Hera] SMUDGE: 2 + +[Hera] LATEST: 7 + +[Hera] SP@: 8 + +[Hera] SP!: 5 + +[Hera] PAD: 15 + +[Hera] 2,: 7 + +[Hera] C,: 10 + +[Hera] ,: 21 + +[Hera] ALLOT: 9 + +[Hera] ALIGN: 1 + +[Hera] HERE: 109 + +[Hera] SCR: 3 + +[Hera] THRU: 17 + +[Hera] LIST: 5 + +[Hera] LOAD: 5 + +[Hera] FLUSH: 3 + +[Hera] EMPTY-BUFFERS: 4 + +[Hera] SAVE-BUFFERS: 3 + +[Hera] UPDATE: 7 + +[Hera] BUFFER: 4 + +[Hera] BLOCK: 12 + +[Hera] SPACES: 10 + +[Hera] SPACE: 7 + +[Hera] TYPE: 43 + +[Hera] CR: 659 + +[Hera] EMIT: 15 + +[Hera] BLANK: 2 + +[Hera] SKIP: 4 + +[Hera] SCAN: 5 + +[Hera] SEARCH: 4 + +[Hera] COMPARE: 5 + +[Hera] CMOVE>: 4 + +[Hera] CMOVE: 6 + +[Hera] -TRAILING: 4 + +[Hera] LITERAL: 1 + +[Hera] [']: 3 + +[Hera] BL: 19 + +[Hera] SOURCE: 2 + +[Hera] >IN: 5 + +[Hera] S": 37 + +[Hera] (s"): 4 + +[Hera] WORD: 15 + +[Hera] SPAN: 4 + +[Hera] EXPECT: 4 + +[Hera] COUNT: 14 + +[Hera] OCTAL: 6 + +[Hera] HEX: 7 + +[Hera] DECIMAL: 14 + +[Hera] BASE: 9 + +[Hera] SIGN: 3 + +[Hera] HOLD: 2 + +[Hera] #>: 16 + +[Hera] #S: 11 + +[Hera] #: 5 + +[Hera] <#: 17 + +[Hera] .: 901 + +[Hera] D2/: 5 + +[Hera] D2*: 5 + +[Hera] D0<: 7 + +[Hera] D0=: 7 + +[Hera] 2R@: 3 + +[Hera] 2R>: 7 + +[Hera] 2>R: 7 + +[Hera] 2ROT: 6 + +[Hera] 2OVER: 6 + +[Hera] 2SWAP: 7 + +[Hera] 2DUP: 6 + +[Hera] 2DROP: 6 + +[Hera] D=: 7 + +[Hera] D<: 8 + +[Hera] DMIN: 6 + +[Hera] DMAX: 6 + +[Hera] DABS: 7 + +[Hera] DNEGATE: 6 + +[Hera] D-: 8 + +[Hera] D+: 7 + +[Hera] S>D: 7 + +[Hera] */MOD: 8 + +[Hera] */: 10 + +[Hera] M/MOD: 7 + +[Hera] M*: 8 + +[Hera] M+: 7 + +[Hera] FALSE: 18 + +[Hera] TRUE: 30 + +[Hera] WITHIN: 31 + +[Hera] U>: 25 + +[Hera] U<: 25 + +[Hera] <=: 31 + +[Hera] >=: 31 + +[Hera] >: 30 + +[Hera] <: 74 + +[Hera] <>: 26 + +[Hera] =: 176 + +[Hera] 0<>: 22 + +[Hera] 0>: 27 + +[Hera] 0<: 24 + +[Hera] 0=: 66 + +[Hera] NOT: 18 + +[Hera] XOR: 32 + +[Hera] OR: 22 + +[Hera] AND: 43 + +[Hera] MAX: 26 + +[Hera] MIN: 4 + +[Hera] NEGATE: 30 + +[Hera] ABS: 25 + +[Hera] 2/: 31 + +[Hera] 2*: 31 + +[Hera] 2-: 10 + +[Hera] 2+: 19 + +[Hera] 1-: 79 + +[Hera] 1+: 84 + +[Hera] */MOD: 8 + +[Hera] */: 10 + +[Hera] /MOD: 20 + +[Hera] MOD: 38 + +[Hera] /: 35 + +[Hera] *: 50 + +[Hera] -: 34 + +[Hera] +: 138 + +[Hera] CELLS: 18 + +[Hera] ERASE: 11 + +[Hera] MOVE: 11 + +[Hera] FILL: 23 + +[Hera] 2!: 17 + +[Hera] 2@: 14 + +[Hera] -!: 17 + +[Hera] +!: 35 + +[Hera] C!: 51 + +[Hera] C@: 97 + +[Hera] !: 111 + +[Hera] @: 182 + +[Hera] R@: 47 + +[Hera] R>: 64 + +[Hera] >R: 66 + +[Hera] ROLL: 10 + +[Hera] PICK: 16 + +[Hera] DEPTH: 80 + +[Hera] -ROT: 18 + +[Hera] ROT: 31 + +[Hera] OVER: 52 + +[Hera] SWAP: 41 + +[Hera] DUP: 144 + +[Hera] DROP: 54 + +[Hera] ------------------------------------- + +[Hera] Total executions: 6836 + +[Hera] Total words: 517 + +[Hera] Average executions per word: 13 + +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 9767616810] Test passed +[Hera] [HADES][TEST ] Testing WORD-ENTROPY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9770015493] Expected: Should not affect stack +[Hera] [HADES][TEST ] [KRELTSC: 9771920592] WORD-ENTROPY: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 9773079750] ▶ Testing module: v3/src/test_runner/modules/starforth_words_ +[Hera] [HADES][TEST ] [KRELTSC: 9774343341] Testing word: RESET-ENTROPY +[Hera] [HADES][TEST ] [KRELTSC: 9775258899] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 9776149467] Running RESET-ENTROPY.reset_defined: : RESETTEST 1 DROP ; RES +[Hera] [HADES][TEST ] [KRELTSC: 9782543463] Test passed +[Hera] [HADES][TEST ] Testing RESET-ENTROPY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9785489070] Expected: Should reset all entropy counters +[Hera] [HADES][TEST ] [KRELTSC: 9787021587] Running RESET-ENTROPY.double_reset: RESET-ENTROPY RESET-ENTRO +[Hera] [HADES][TEST ] [KRELTSC: 9788389317] Test passed +[Hera] [HADES][TEST ] Testing RESET-ENTROPY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9790067637] Expected: Should handle multiple resets +[Hera] [HADES][TEST ] [KRELTSC: 9791131875] Running RESET-ENTROPY.after_usage: 1 DUP DUP DUP DROP DROP DR +[Hera] [HADES][TEST ] [KRELTSC: 9792486942] Test passed +[Hera] [HADES][TEST ] Testing RESET-ENTROPY ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9798558252] Expected: Should reset after word usage +[Hera] [HADES][TEST ] [KRELTSC: 9800720181] RESET-ENTROPY: 3 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 9802031925] ▶ Testing module: v3/src/test_runner/modules/starforth_words_ +[Hera] [HADES][TEST ] [KRELTSC: 9803311224] Testing word: TOP-WORDS +[Hera] [HADES][TEST ] [KRELTSC: 9804199188] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 9805055883] Running TOP-WORDS.display_top5: : TOPTEST 1 DROP ; TOPTEST TO +[Hera] Top 5 most frequently used words: + +[Hera] ================================== + +[Hera] 1. DROP: 6 + +[Hera] 2. TOPTEST: 5 + +[Hera] 3. EXIT: 5 + +[Hera] 4. LIT: 5 + +[Hera] 5. TOP-WORDS: 1 + +[Hera] [HADES][TEST ] [KRELTSC: 9816480177] Test passed +[Hera] [HADES][TEST ] Testing TOP-WORDS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9818172861] Expected: Should display top 5 hot words +[Hera] [HADES][TEST ] [KRELTSC: 9819251568] Running TOP-WORDS.display_top10: 10 TOP-WORDS +[Hera] Top 10 most frequently used words: + +[Hera] ================================== + +[Hera] 1. DROP: 6 + +[Hera] 2. TOPTEST: 5 + +[Hera] 3. EXIT: 5 + +[Hera] 4. LIT: 5 + +[Hera] 5. TOP-WORDS: 2 + +[Hera] 6. ;: 1 + +[Hera] 7. :: 1 + +[Hera] [HADES][TEST ] [KRELTSC: 9829937166] Test passed +[Hera] [HADES][TEST ] Testing TOP-WORDS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9831780756] Expected: Should display top 10 words +[Hera] [HADES][TEST ] [KRELTSC: 9832857321] Running TOP-WORDS.after_reset: RESET-ENTROPY 5 TOP-WORDS +[Hera] Top 5 most frequently used words: + +[Hera] ================================== + +[Hera] 1. TOP-WORDS: 1 + +[Hera] [HADES][TEST ] [KRELTSC: 9835893753] Test passed +[Hera] [HADES][TEST ] Testing TOP-WORDS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9842138817] Expected: Should handle display after reset +[Hera] [HADES][TEST ] [KRELTSC: 9843635256] Running TOP-WORDS.single_word: 1 TOP-WORDS +[Hera] Top 1 most frequently used words: + +[Hera] ================================== + +[Hera] 1. TOP-WORDS: 2 + +[Hera] [HADES][TEST ] [KRELTSC: 9847305867] Test passed +[Hera] [HADES][TEST ] Testing TOP-WORDS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9848893488] Expected: Should display top 1 word +[Hera] [HADES][TEST ] [KRELTSC: 9849902076] Running TOP-WORDS.large_count: 100 TOP-WORDS +[Hera] Top 100 most frequently used words: + +[Hera] ================================== + +[Hera] 1. TOP-WORDS: 3 + +[Hera] [HADES][TEST ] [KRELTSC: 9857225742] Test passed +[Hera] [HADES][TEST ] Testing TOP-WORDS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9860006541] Expected: Should handle large count +[Hera] [HADES][TEST ] [KRELTSC: 9861064563] Running TOP-WORDS.zero_count: 0 TOP-WORDS +[Hera] TOP-WORDS: invalid count 0 + +[Hera] [HADES][TEST ] [KRELTSC: 9862860672] Test passed +[Hera] [HADES][TEST ] Testing TOP-WORDS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9864453165] Expected: Should handle zero count +[Hera] [HADES][TEST ] [KRELTSC: 9870146937] Running TOP-WORDS.negative_count: -5 TOP-WORDS +[Hera] TOP-WORDS: invalid count -5 + +[Hera] [HADES][TEST ] [KRELTSC: 9871928619] Test passed +[Hera] [HADES][TEST ] Testing TOP-WORDS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9873495093] Expected: Should handle negative count +[Hera] [HADES][TEST ] [KRELTSC: 9874557000] Running TOP-WORDS.empty_stack: TOP-WORDS +[Hera] [HADES][ERROR] [KRELTSC: 9875713596] TOP-WORDS: data stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 9876713385] Expected error occurred +[Hera] [HADES][TEST ] Testing TOP-WORDS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9878415960] Expected: Should cause stack underflow +[Hera] [HADES][TEST ] [KRELTSC: 9883915902] TOP-WORDS: 8 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 9885352386] ▶ Testing module: v3/src/test_runner/modules/starforth_words_ +[Hera] [HADES][TEST ] [KRELTSC: 9886505097] Testing word: (- +[Hera] [HADES][TEST ] [KRELTSC: 9887299590] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 9888243582] Running (-.comment_line: (- This is a comment +[Hera] 1 2 + . CR +[Hera] [HADES][WARN ] [KRELTSC: 9890029947] (- comment not terminated +[Hera] [HADES][TEST ] [KRELTSC: 9891003654] Test passed +[Hera] [HADES][TEST ] Testing (- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9892543101] Expected: Should ignore rest of line +[Hera] [HADES][TEST ] [KRELTSC: 9893574684] Running (-.mid_line: 1 (- comment here +[Hera] 2 + . CR +[Hera] [HADES][WARN ] [KRELTSC: 9899580222] (- comment not terminated +[Hera] [HADES][TEST ] [KRELTSC: 9900483096] Test passed +[Hera] [HADES][TEST ] Testing (- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9902023026] Expected: Should work mid-expression +[Hera] [HADES][TEST ] [KRELTSC: 9903060153] Running (-.no_stack_effect: DEPTH (- comment +[Hera] DEPTH = . CR +[Hera] [HADES][WARN ] [KRELTSC: 9904566693] (- comment not terminated +[Hera] [HADES][TEST ] [KRELTSC: 9905505372] Test passed +[Hera] [HADES][TEST ] Testing (- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9907039485] Expected: Should not affect stack +[Hera] [HADES][TEST ] [KRELTSC: 9908043180] Running (-.multiple: 1 (- first +[Hera] 2 (- second +[Hera] + . CR +[Hera] [HADES][WARN ] [KRELTSC: 9914639679] (- comment not terminated +[Hera] [HADES][TEST ] [KRELTSC: 9915651438] Test passed +[Hera] [HADES][TEST ] Testing (- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 9917249517] Expected: Should handle multiple comments +[Hera] [HADES][TEST ] [KRELTSC: 9918341496] (-: 4 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 9919555674] === StarForth Words Summary: 0 passed, 0 failed, 0 skipped, 0 e +[Hera] [HADES][INFO ] [KRELTSC: 9920815401] +[Hera] === Testing Module: ACL Words === +[Hera] [HADES][INFO ] [KRELTSC: 9922171770] Running ACL Words Tests (Module 24)... +[Hera] [HADES][WARN ] [KRELTSC: 9930296796] ACL: denied '__acl_deny_test__' +[Hera] [HADES][INFO ] [KRELTSC: 9932113905] SKIP: STRICT mode test (ACL.4th not loaded) +[Hera] [HADES][INFO ] [KRELTSC: 9933320187] SKIP: ACL-TTL-COMPUTE (ACL.4th not loaded) +[Hera] [HADES][WARN ] [KRELTSC: 9934718010] vm_create_word: cannot shadow pinned word '__acl_shadow_target_ +[Hera] [HADES][TEST ] [KRELTSC: 9943629150] === ACL Words Summary: 29 passed, 0 failed, 0 skipped, 0 errors +[Hera] [HADES][INFO ] [KRELTSC: 9946162170] +[Hera] === Testing Module: Mama FORTH Words === +[Hera] [HADES][INFO ] [KRELTSC: 9947429478] Running Mama FORTH Words Tests (Capsule System M7.1)... +[Hera] [HADES][TEST ] [KRELTSC: 9948667575] Testing word: CAPSULE-COUNT +[Hera] [HADES][TEST ] [KRELTSC: 9949610391] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 9950503584] CAPSULE-COUNT: 0 passed, 0 failed, 2 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 9951662511] Testing word: CAPSULE@ +[Hera] [HADES][TEST ] [KRELTSC: 9952526304] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 9958420521] CAPSULE@: 0 passed, 0 failed, 3 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 9959582787] Testing word: CAPSULE-FLAGS@ +[Hera] [HADES][TEST ] [KRELTSC: 9960536250] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 9962566992] CAPSULE-FLAGS@: 0 passed, 0 failed, 3 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 9963832830] Testing word: CAPSULE-LEN@ +[Hera] [HADES][TEST ] [KRELTSC: 9964720164] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 9965619615] CAPSULE-LEN@: 0 passed, 0 failed, 2 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 9966756954] Testing word: CAPSULE-HASH@ +[Hera] [HADES][TEST ] [KRELTSC: 9972149859] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 9973073229] CAPSULE-HASH@: 0 passed, 0 failed, 2 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 9975479409] Testing word: MAMA-VM-ID +[Hera] [HADES][TEST ] [KRELTSC: 9976360548] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 9977304666] MAMA-VM-ID: 0 passed, 0 failed, 2 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 9978489402] Testing word: VM-COUNT +[Hera] [HADES][TEST ] [KRELTSC: 9979366467] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 9980279379] VM-COUNT: 0 passed, 0 failed, 2 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 9981374907] Testing word: CAPSULE-BIRTH +[Hera] [HADES][TEST ] [KRELTSC: 9987197619] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 9988116873] CAPSULE-BIRTH: 0 passed, 0 failed, 2 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 9989287560] Testing word: CAPSULE-RUN +[Hera] [HADES][TEST ] [KRELTSC: 9990194949] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 9991115148] CAPSULE-RUN: 0 passed, 0 failed, 1 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 9992284848] Testing word: CAPSULE-TEST +[Hera] [HADES][TEST ] [KRELTSC: 9993245724] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 9994143789] CAPSULE-TEST: 0 passed, 0 failed, 1 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 9995569311] === Mama FORTH Words Summary: 0 passed, 0 failed, 0 skipped, 0 +[Hera] [HADES][INFO ] [KRELTSC: 10001659458] +[Hera] === Testing Module: Q48.16 Words === +[Hera] [HADES][INFO ] [KRELTSC: 10003608027] Running Q48.16 Words Tests (Module 25)... +[Hera] [HADES][TEST ] [KRELTSC: 10005289098] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 10006564575] Testing word: Q.+ +[Hera] [HADES][TEST ] [KRELTSC: 10007608275] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10008510918] Running Q.+.basic: 1 Q.FROM-INT 2 Q.FROM-INT Q.+ Q.TO-INT . C +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 10010330127] Test passed +[Hera] [HADES][TEST ] Testing Q.+ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10017109893] Expected: Should print: 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 10021384212] Q.+: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10022594505] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 10023843816] Testing word: Q.- +[Hera] [HADES][TEST ] [KRELTSC: 10024667982] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10025541918] Running Q.-.basic: 5 Q.FROM-INT 2 Q.FROM-INT Q.- Q.TO-INT . C +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 10031753718] Test passed +[Hera] [HADES][TEST ] Testing Q.- ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10034599512] Expected: Should print: 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][INFO ] [KRELTSC: 10036955376] L8[TABLE]: Config 14 → 0 regime=3 score=26214 L1=0 L2=0 L3=0 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 10038975576] Q.-: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10040019276] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 10046888208] Testing word: Q.* +[Hera] [HADES][TEST ] [KRELTSC: 10048800027] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10049674152] Running Q.*.basic: 3 Q.FROM-INT 4 Q.FROM-INT Q.* Q.TO-INT . C +[Hera] 12 +[Hera] [HADES][TEST ] [KRELTSC: 10051565916] Test passed +[Hera] [HADES][TEST ] Testing Q.* ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10053074766] Expected: Should print: 12 +[Hera] 12 +[Hera] 12 +[Hera] 12 +[Hera] 12 +[Hera] 12 +[Hera] [HADES][TEST ] [KRELTSC: 10060526112] Q.*: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10061621514] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 10062886197] Testing word: Q./ +[Hera] [HADES][TEST ] [KRELTSC: 10063708011] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10064603703] Running Q./.basic: 10 Q.FROM-INT 2 Q.FROM-INT Q./ Q.TO-INT . +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 10066503384] Test passed +[Hera] [HADES][TEST ] Testing Q./ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10068065742] Expected: Should print: 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] 5 +[Hera] [HADES][TEST ] [KRELTSC: 10075639350] Running Q./.by_zero: 5 Q.FROM-INT 0 Q.FROM-INT Q./ Q.TO-INT . +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 10078441401] Test passed +[Hera] [HADES][TEST ] Testing Q./ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10080041097] Expected: Should print: 0 (division by zero yields q=0) +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 10083204663] Q./: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10088896188] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 10090086405] Testing word: Q.ABS +[Hera] [HADES][TEST ] [KRELTSC: 10091135733] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10092972729] Running Q.ABS.basic: 3 Q.FROM-INT Q.NEG Q.ABS Q.TO-INT . CR +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 10094752248] Test passed +[Hera] [HADES][TEST ] Testing Q.ABS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10096331322] Expected: Should print: 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 10105580037] Q.ABS: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10107767334] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 10108991151] Testing word: Q.NEG +[Hera] [HADES][TEST ] [KRELTSC: 10109816787] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10110748494] Running Q.NEG.basic: 5 Q.FROM-INT Q.NEG Q.TO-INT . CR +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 10112284581] Test passed +[Hera] [HADES][TEST ] Testing Q.NEG ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10120294674] Expected: Should print: -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] -5 +[Hera] [HADES][TEST ] [KRELTSC: 10124237718] Q.NEG: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10125317664] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 10126527411] Testing word: Q.LOG +[Hera] [HADES][TEST ] [KRELTSC: 10132667916] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10134654327] Running Q.LOG.of_one: Q.1 Q.LOG Q.TO-INT . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 10137607326] Test passed +[Hera] [HADES][TEST ] Testing Q.LOG ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10139175669] Expected: Should print: 0 (ln 1.0 = 0) +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][INFO ] [KRELTSC: 10141487979] L8[TABLE]: Config 0 → 1 regime=3 score=26214 L1=0 L2=0 L3=0 L +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 10149163794] Q.LOG: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10151624973] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 10152898056] Testing word: Q.EXP +[Hera] [HADES][TEST ] [KRELTSC: 10153752357] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10154633895] Running Q.EXP.of_zero: Q.0 Q.EXP Q.TO-INT . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 10156234221] Test passed +[Hera] [HADES][TEST ] Testing Q.EXP ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10163844936] Expected: Should print: 1 (e^0 = 1) +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 10168348512] Q.EXP: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10169438139] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 10170661368] Testing word: Q.SQRT +[Hera] [HADES][TEST ] [KRELTSC: 10176130881] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10177350036] Running Q.SQRT.of_four: 4 Q.FROM-INT Q.SQRT Q.TO-INT . CR +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 10180127580] Test passed +[Hera] [HADES][TEST ] Testing Q.SQRT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10181721207] Expected: Should print: 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] 2 +[Hera] [HADES][TEST ] [KRELTSC: 10184500515] Q.SQRT: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10190041701] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 10191903708] Testing word: Q.SIN +[Hera] [HADES][TEST ] [KRELTSC: 10193749545] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10194689295] Running Q.SIN.of_zero: Q.0 Q.SIN Q.TO-INT . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 10196420388] Test passed +[Hera] [HADES][TEST ] Testing Q.SIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10198030101] Expected: Should print: 0 (sin 0 = 0) +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 10206473361] Q.SIN: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10209397485] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 10211217429] Testing word: Q.COS +[Hera] [HADES][TEST ] [KRELTSC: 10212074691] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10212961920] Running Q.COS.of_zero: Q.0 Q.COS Q.TO-INT . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 10214665356] Test passed +[Hera] [HADES][TEST ] Testing Q.COS ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10222804662] Expected: Should print: 1 (cos 0 = 1) +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 10225903821] Q.COS: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10226960541] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 10228216845] Testing word: Q.FROM-INT +[Hera] [HADES][TEST ] [KRELTSC: 10229109786] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10234517496] Running Q.FROM-INT.round_trip: 7 Q.FROM-INT Q.TO-INT . CR +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 10236703134] Test passed +[Hera] [HADES][TEST ] Testing Q.FROM-INT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10238909226] Expected: Should print: 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 10241656509] Q.FROM-INT: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10242793554] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 10244008551] Testing word: Q.TO-INT +[Hera] [HADES][TEST ] [KRELTSC: 10250675841] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10252786803] Running Q.TO-INT.of_one: Q.1 Q.TO-INT . CR +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 10255231035] Test passed +[Hera] [HADES][TEST ] Testing Q.TO-INT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10257026703] Expected: Should print: 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] 1 +[Hera] [HADES][TEST ] [KRELTSC: 10264526538] Q.TO-INT: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10266469605] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 10268084211] Testing word: Q.1 +[Hera] [HADES][TEST ] [KRELTSC: 10268908986] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10269900123] Running Q.1.raw_value: Q.1 . CR +[Hera] 65536 +[Hera] [HADES][TEST ] [KRELTSC: 10271246475] Test passed +[Hera] [HADES][TEST ] Testing Q.1 ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10272802701] Expected: Should print: 65536 +[Hera] 65536 +[Hera] 65536 +[Hera] 65536 +[Hera] 65536 +[Hera] 65536 +[Hera] [HADES][TEST ] [KRELTSC: 10280999148] Q.1: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10282621482] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 10283877072] Testing word: Q.0 +[Hera] [HADES][TEST ] [KRELTSC: 10284774402] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10285665390] Running Q.0.raw_value: Q.0 . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 10287016173] Test passed +[Hera] [HADES][TEST ] Testing Q.0 ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10292971857] Expected: Should print: 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 10296958056] Q.0: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10298034306] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 10299329040] Testing word: Q.SCALE +[Hera] [HADES][TEST ] [KRELTSC: 10300201926] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10301108664] Running Q.SCALE.raw_value: Q.SCALE . CR +[Hera] 65536 +[Hera] [HADES][TEST ] [KRELTSC: 10307179848] Test passed +[Hera] [HADES][TEST ] Testing Q.SCALE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10308748107] Expected: Should print: 65536 +[Hera] 65536 +[Hera] 65536 +[Hera] 65536 +[Hera] 65536 +[Hera] 65536 +[Hera] [HADES][TEST ] [KRELTSC: 10312891512] Q.SCALE: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10314051069] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 10315286856] Testing word: Q.= +[Hera] [HADES][TEST ] [KRELTSC: 10316127885] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10321301802] Running Q.=.equal: Q.1 Q.1 Q.= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 10322871069] Test passed +[Hera] [HADES][TEST ] Testing Q.= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10324421646] Expected: Should print: -1 (true) +[Hera] -1 +[Hera] -1 [HADES][INFO ] [KRELTSC: 10326155931] L8[TABLE]: Config 1 → 2 regime=3 score=26214 L1=0 L2=0 L3=0 L + +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 10328467065] Running Q.=.not_equal: Q.1 Q.0 Q.= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 10329818877] Test passed +[Hera] [HADES][TEST ] Testing Q.= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10331360970] Expected: Should print: 0 (false) +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 10339065723] Q.=: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10341044385] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 10342328115] Testing word: Q.< +[Hera] [HADES][TEST ] [KRELTSC: 10343205348] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10344089427] Running Q.<.true: Q.0 Q.1 Q.< . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 10349617719] Test passed +[Hera] [HADES][TEST ] Testing Q.< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10351587918] Expected: Should print: -1 (true) +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 10354447656] Running Q.<.false: Q.1 Q.0 Q.< . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 10355765574] Test passed +[Hera] [HADES][TEST ] Testing Q.< ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10357389840] Expected: Should print: 0 (false) +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 10360263648] Q.<: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10367120316] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 10368405558] Testing word: Q.> +[Hera] [HADES][TEST ] [KRELTSC: 10369261434] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10370196081] Running Q.>.true: Q.1 Q.0 Q.> . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 10371825051] Test passed +[Hera] [HADES][TEST ] Testing Q.> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10373398329] Expected: Should print: -1 (true) +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 10380853224] Running Q.>.false: Q.0 Q.1 Q.> . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 10382204952] Test passed +[Hera] [HADES][TEST ] Testing Q.> ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10383800490] Expected: Should print: 0 (false) +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 10386639480] Q.>: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10387679421] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 10388897820] Testing word: Q.0= +[Hera] [HADES][TEST ] [KRELTSC: 10394054286] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10394946933] Running Q.0=.true: Q.0 Q.0= . CR +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 10396472646] Test passed +[Hera] [HADES][TEST ] Testing Q.0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10398093132] Expected: Should print: -1 (true) +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] -1 +[Hera] [HADES][TEST ] [KRELTSC: 10401005181] Running Q.0=.false: Q.1 Q.0= . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 10402304346] Test passed +[Hera] [HADES][TEST ] Testing Q.0= ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10403890728] Expected: Should print: 0 (false) +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 10411037868] Q.0=: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10412152632] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 10413382938] Testing word: Q.MAX +[Hera] [HADES][TEST ] [KRELTSC: 10414261326] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10415174826] Running Q.MAX.basic: 3 Q.FROM-INT 7 Q.FROM-INT Q.MAX Q.TO-INT +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 10416892857] Test passed +[Hera] [HADES][TEST ] Testing Q.MAX ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10418446437] Expected: Should print: 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] 7 +[Hera] [HADES][INFO ] [KRELTSC: 10425363774] L8[TABLE]: Config 2 → 3 regime=3 score=26214 L1=0 L2=0 L3=0 L +[Hera] 7 +[Hera] [HADES][TEST ] [KRELTSC: 10427088714] Q.MAX: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10428133632] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 10429373367] Testing word: Q.MIN +[Hera] [HADES][TEST ] [KRELTSC: 10430231595] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10431130899] Running Q.MIN.basic: 3 Q.FROM-INT 7 Q.FROM-INT Q.MIN Q.TO-INT +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 10432901010] Test passed +[Hera] [HADES][TEST ] Testing Q.MIN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10438918245] Expected: Should print: 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 10441840458] Q.MIN: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10442904486] ▶ Testing module: v3/src/test_runner/modules/q48_words_test.c +[Hera] [HADES][TEST ] [KRELTSC: 10444140504] Testing word: Q.PRINT +[Hera] [HADES][TEST ] [KRELTSC: 10445021538] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10445942661] Running Q.PRINT.of_one: Q.1 Q.PRINT CR +[Hera] 1.5u +[Hera] [HADES][TEST ] [KRELTSC: 10447687635] Test passed +[Hera] [HADES][TEST ] Testing Q.PRINT ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10453723581] Expected: Should print: 1.00000 +[Hera] 1.5u +[Hera] 1.5u +[Hera] 1.5u +[Hera] 1.5u +[Hera] 1.5u +[Hera] [HADES][TEST ] [KRELTSC: 10456770723] Q.PRINT: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10457968542] === Q48.16 Words Summary: 0 passed, 0 failed, 0 skipped, 0 erro +[Hera] [HADES][INFO ] [KRELTSC: 10459222074] +[Hera] === Testing Module: Inference Engine Words === +[Hera] [HADES][INFO ] [KRELTSC: 10460622816] Running Inference Engine Words Tests (Module 26)... +[Hera] [HADES][TEST ] [KRELTSC: 10461743943] ▶ Testing module: v3/src/test_runner/modules/inference_words_ +[Hera] [HADES][TEST ] [KRELTSC: 10467125487] Testing word: Q.VARIANCE +[Hera] [HADES][TEST ] [KRELTSC: 10468419885] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10469299407] Running Q.VARIANCE.three_cells: 100 HERE ! 200 HERE 8 + ! 300 +[Hera] 6666 +[Hera] [HADES][TEST ] [KRELTSC: 10471423011] Test passed +[Hera] [HADES][TEST ] Testing Q.VARIANCE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10473015000] Expected: Should print population variance of {100,200,300} +[Hera] [HADES][TEST ] [KRELTSC: 10474309839] Q.VARIANCE: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10475508687] ▶ Testing module: v3/src/test_runner/modules/inference_words_ +[Hera] [HADES][TEST ] [KRELTSC: 10476758775] Testing word: INFER-DECAY-SLOPE +[Hera] [HADES][TEST ] [KRELTSC: 10482314871] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10483226838] Running INFER-DECAY-SLOPE.three_cells: 300 HERE ! 200 HERE 8 +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 10485651519] Test passed +[Hera] [HADES][TEST ] Testing INFER-DECAY-SLOPE ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10487317449] Expected: Should print decay slope for a decreasing traject +[Hera] [HADES][TEST ] [KRELTSC: 10488606114] INFER-DECAY-SLOPE: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10489814160] ▶ Testing module: v3/src/test_runner/modules/inference_words_ +[Hera] [HADES][TEST ] [KRELTSC: 10491020442] Testing word: INFER-WINDOW-WIDTH +[Hera] [HADES][TEST ] [KRELTSC: 10491988458] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10497433317] Running INFER-WINDOW-WIDTH.three_cells: 100 HERE ! 200 HERE 8 +[Hera] 3 +[Hera] [HADES][TEST ] [KRELTSC: 10499515761] Test passed +[Hera] [HADES][TEST ] Testing INFER-WINDOW-WIDTH ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10501268820] Expected: Should print an inferred window width (no error) +[Hera] [HADES][TEST ] [KRELTSC: 10502530626] INFER-WINDOW-WIDTH: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10503711225] ▶ Testing module: v3/src/test_runner/modules/inference_words_ +[Hera] [HADES][TEST ] [KRELTSC: 10504978806] Testing word: INFER-RUN +[Hera] [HADES][TEST ] [KRELTSC: 10505849844] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10510977981] Running INFER-RUN.basic: INFER-RUN +[Hera] [HADES][TEST ] [KRELTSC: 10516061220] Test passed +[Hera] [HADES][TEST ] Testing INFER-RUN ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10517717805] Expected: Should run without error +[Hera] [HADES][TEST ] [KRELTSC: 10518723222] INFER-RUN: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10519811232] ▶ Testing module: v3/src/test_runner/modules/inference_words_ +[Hera] [HADES][TEST ] [KRELTSC: 10525173498] Testing word: INFER-WINDOW@ +[Hera] [HADES][TEST ] [KRELTSC: 10526491185] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10527380430] Running INFER-WINDOW@.after_run: INFER-RUN INFER-WINDOW@ . CR +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 10530372825] Test passed +[Hera] [HADES][TEST ] Testing INFER-WINDOW@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10532025735] Expected: Should print last adaptive_window_width (no error +[Hera] [HADES][TEST ] [KRELTSC: 10533245835] INFER-WINDOW@: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10534388130] ▶ Testing module: v3/src/test_runner/modules/inference_words_ +[Hera] [HADES][TEST ] [KRELTSC: 10540108488] Testing word: INFER-DECAY@ +[Hera] [HADES][TEST ] [KRELTSC: 10541427015] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10542317604] Running INFER-DECAY@.after_run: INFER-RUN INFER-DECAY@ Q.TO-I +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 10547448618] Test passed +[Hera] [HADES][TEST ] Testing INFER-DECAY@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10549317807] Expected: Should print last adaptive_decay_slope (no error) +[Hera] [HADES][TEST ] [KRELTSC: 10555245897] INFER-DECAY@: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10556393379] ▶ Testing module: v3/src/test_runner/modules/inference_words_ +[Hera] [HADES][TEST ] [KRELTSC: 10557593571] Testing word: INFER-VARIANCE@ +[Hera] [HADES][TEST ] [KRELTSC: 10558475235] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10559333253] Running INFER-VARIANCE@.after_run: INFER-RUN INFER-VARIANCE@ +[Hera] 1169 +[Hera] [HADES][TEST ] [KRELTSC: 10562149521] Test passed +[Hera] [HADES][TEST ] Testing INFER-VARIANCE@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10563807408] Expected: Should print last window_variance_q48 (no error) +[Hera] [HADES][TEST ] [KRELTSC: 10569640557] INFER-VARIANCE@: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10570780794] ▶ Testing module: v3/src/test_runner/modules/inference_words_ +[Hera] [HADES][TEST ] [KRELTSC: 10572081912] Testing word: INFER-FIT@ +[Hera] [HADES][TEST ] [KRELTSC: 10572966033] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10573943646] Running INFER-FIT@.after_run: INFER-RUN INFER-FIT@ Q.TO-INT . +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 10576782657] Test passed +[Hera] [HADES][TEST ] Testing INFER-FIT@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10578428553] Expected: Should print last slope_fit_quality_q48 (no error +[Hera] [HADES][TEST ] [KRELTSC: 10584518154] INFER-FIT@: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10585638798] ▶ Testing module: v3/src/test_runner/modules/inference_words_ +[Hera] [HADES][TEST ] [KRELTSC: 10586924313] Testing word: INFER-EARLY-EXIT@ +[Hera] [HADES][TEST ] [KRELTSC: 10587850224] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10588721997] Running INFER-EARLY-EXIT@.after_run: INFER-RUN INFER-EARLY-EX +[Hera] 0 +[Hera] [HADES][TEST ] [KRELTSC: 10592971557] Test passed +[Hera] [HADES][TEST ] Testing INFER-EARLY-EXIT@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10599145767] Expected: Should print 0 or 1 (no error) +[Hera] [HADES][TEST ] [KRELTSC: 10600191420] INFER-EARLY-EXIT@: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10601473680] === Inference Engine Words Summary: 0 passed, 0 failed, 0 skipp +[Hera] [HADES][INFO ] [KRELTSC: 10602695187] +[Hera] === Testing Module: Physics Freeze Words === +[Hera] [HADES][INFO ] [KRELTSC: 10604104770] Running Physics Freeze Words Tests (Module 27)... +[Hera] [HADES][TEST ] [KRELTSC: 10605356895] ▶ Testing module: v3/src/test_runner/modules/physics_freeze_w +[Hera] [HADES][TEST ] [KRELTSC: 10606633023] Testing word: FREEZE-WORD +[Hera] [HADES][TEST ] [KRELTSC: 10607533692] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10612932792] Running FREEZE-WORD.basic: : __freeze_test_word__ ; S" __free +[Hera] 245 +[Hera] [HADES][TEST ] [KRELTSC: 10615098228] Test passed +[Hera] [HADES][TEST ] Testing FREEZE-WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10616715396] Expected: Should print: -1 (word is now frozen) +[Hera] [HADES][TEST ] [KRELTSC: 10617856599] FREEZE-WORD: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10619195664] ▶ Testing module: v3/src/test_runner/modules/physics_freeze_w +[Hera] [HADES][TEST ] [KRELTSC: 10620760920] Testing word: UNFREEZE-WORD +[Hera] [HADES][TEST ] [KRELTSC: 10621913064] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10622818899] Running UNFREEZE-WORD.basic: : __unfreeze_test_word__ ; S" __ +[Hera] 270 +[Hera] [HADES][TEST ] [KRELTSC: 10629810933] Test passed +[Hera] [HADES][TEST ] Testing UNFREEZE-WORD ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10631469324] Expected: Should print: 0 (freeze cleared) +[Hera] [HADES][TEST ] [KRELTSC: 10632543579] UNFREEZE-WORD: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10633830606] ▶ Testing module: v3/src/test_runner/modules/physics_freeze_w +[Hera] [HADES][TEST ] [KRELTSC: 10635303987] Testing word: FROZEN? +[Hera] [HADES][TEST ] [KRELTSC: 10636186722] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10637065740] Running FROZEN?.not_frozen: : __frozen_test_word__ ; S" __fro +[Hera] 224 +[Hera] [HADES][TEST ] [KRELTSC: 10643615178] Test passed +[Hera] [HADES][TEST ] Testing FROZEN? ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10645155906] Expected: Should print: 0 (freshly defined word is not froz +[Hera] [HADES][TEST ] [KRELTSC: 10646484156] Running FROZEN?.not_found: S" __nonexistent_freeze_xyz__" FRO +[Hera] 245 +[Hera] [HADES][TEST ] [KRELTSC: 10648143471] Test passed +[Hera] [HADES][TEST ] Testing FROZEN? ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10650018876] Expected: Should print: 0 (not-found treated as not frozen) +[Hera] [HADES][TEST ] [KRELTSC: 10651282551] FROZEN?: 2 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10656489984] ▶ Testing module: v3/src/test_runner/modules/physics_freeze_w +[Hera] [HADES][TEST ] [KRELTSC: 10658095602] Testing word: HEAT! +[Hera] [HADES][TEST ] [KRELTSC: 10658895681] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10659751683] Running HEAT!.basic: : __heat_store_test_word__ ; 999 S" __he +[Hera] 249 +[Hera] [HADES][TEST ] [KRELTSC: 10661908089] Test passed +[Hera] [HADES][TEST ] Testing HEAT! ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10663837989] Expected: Should print: 999 +[Hera] [HADES][TEST ] [KRELTSC: 10664821251] HEAT!: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10665945066] ▶ Testing module: v3/src/test_runner/modules/physics_freeze_w +[Hera] [HADES][TEST ] [KRELTSC: 10671364137] Testing word: HEAT@ +[Hera] [HADES][TEST ] [KRELTSC: 10672671639] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10673508951] Running HEAT@.of_fresh_word: : __heat_fetch_test_word__ ; S" +[Hera] 224 +[Hera] [HADES][TEST ] [KRELTSC: 10675443996] Test passed +[Hera] [HADES][TEST ] Testing HEAT@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10677081030] Expected: Should print: 0 (freshly defined word has zero he +[Hera] [HADES][TEST ] [KRELTSC: 10678639965] HEAT@: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10679748933] ▶ Testing module: v3/src/test_runner/modules/physics_freeze_w +[Hera] [HADES][TEST ] [KRELTSC: 10681003956] Testing word: DECAY-RATE@ +[Hera] [HADES][TEST ] [KRELTSC: 10686474036] ------------------------ +[Hera] [HADES][TEST ] [KRELTSC: 10687363239] Running DECAY-RATE@.basic: DECAY-RATE@ . CR +[Hera] 224 +[Hera] [HADES][TEST ] [KRELTSC: 10689038430] Test passed +[Hera] [HADES][TEST ] Testing DECAY-RATE@ ... PASS +[Hera] [HADES][TEST ] [KRELTSC: 10690704465] Expected: Should print the compile-time DECAY_RATE_PER_US_Q +[Hera] [HADES][TEST ] [KRELTSC: 10692059637] DECAY-RATE@: 1 passed, 0 failed, 0 stubs, 0 errors +[Hera] [HADES][TEST ] [KRELTSC: 10693552422] === Physics Freeze Words Summary: 0 passed, 0 failed, 0 skipped +[Hera] [HADES][INFO ] [KRELTSC: 10694866119] FINAL TEST SUMMARY: +[Hera] [HADES][INFO ] [KRELTSC: 10695711747] Total tests run: 1050 +[Hera] [HADES][INFO ] [KRELTSC: 10700809980] Passed: 1012 +[Hera] [HADES][INFO ] [KRELTSC: 10702029513] Failed: 0 +[Hera] [HADES][INFO ] [KRELTSC: 10702904205] Stubs (not yet implemented): 38 +[Hera] [HADES][INFO ] [KRELTSC: 10703870940] Errors: 0 +[Hera] [HADES][INFO ] [KRELTSC: 10704848826] ALL IMPLEMENTED TESTS PASSED! +[Hera] [HADES][INFO ] [KRELTSC: 10705854180] Contract checks (A4'/A1): all passed +[Hera] [HADES][INFO ] [KRELTSC: 10707191502] ============================================== +[Hera] PARITY:M7.1a word_count=530 here=0x00000000000000d8 latest_id=699 hash=0x08873e0f44b7cb2a +[Hera] PARITY:OK +[Hera] POST: PASSED +[Hera] [HAL][exec] regions frozen: +[Hera] kernel.text: [0x00000000bdefb000, 0x00000000bdf38dee) +[Hera] VM: parity bootstrap complete +[Hera] PCI: init... +[Hera] virtio-rng: found device +[Hera] rng: backend = virtio-rng +[Hera] entropy: ready +[Hera] virtio-blk: found device +[Hera] Artemis: virtio-blk attached +[Hera] Artemis: genesis signature stamped +[Hera] virtio-input: found device +[Hera] virtio-input: driver ready +[Hera] Init: Mama birth... +[Hera] [HADES][WARN ] [KRELTSC: 10808744667] capsule sig: init.4th: missing (unsigned) +[Hera] [HADES][WARN ] [KRELTSC: 10838556918] ( Unterminated comment +[Hera] [HADES][WARN ] [KRELTSC: 10846381959] ( Unterminated comment + +[Hera] ================================================ +[Hera] LithosAnanke — FORTH-79 bare-metal kernel +[Hera] Stadium step one: Hera alone +[Hera] ================================================ +[Hera] Hera [live] +[Hera] ================================================ + +[Hera] (no identity) +[Hera] PARITY:MAMA_INIT capsule_id=0xea038ba684c53443 mode=m capsule_hash=0xea038ba684c53443 dict_hash=0xe11082140cf86b05 +[Hera] Init: Mama birth OK +[Hera] ACL: CAPSULE-BIRTH pinned STRICT +[Hera] ACL: BIRTH pinned STRICT +[Hera] Starting heartbeat... +[Hera] SBI: timer armed (TIME extension) +[Hera] Heartbeat running. +[Hera] Stadium words: promotions=422 evictions=0 +[Hera] Stadium conservation: resident_sum=43691 reservoir=21845 sum=65536 (Q48_ONE=65536) +[Hera] Stadium conservation: CONSERVED +[Hera] Stadium quota grant self-test: OK +[Hera] Hera reservoir=21845 +[Hera] test-vm reservoir=65536 +[Hera] Kernel-Hermes alloc/release self-test: Scan cross-check (counters vs arena): PASS +[Hera] scan_held_before_decay=8192 +[Hera] scan_held_after_decay=8148 +[Hera] Stage B (ledger + stadium_conserved): PASS +[Hera] vm_consumed=737 +[Hera] PASS +[Hera] audit_failures=0 +[Hera] decay_consumed=352 +[Hera] reservoir0=65536 +[Hera] Q_SLOT=2048 +[Hera] expected_n=32 +[Hera] got_n=32 +[Hera] reservoir_after_alloc=0 +[Hera] reservoir_final=65536 +[Hera] held(final)=0 +[Hera] pulled(final)=65536 +[Hera] returned(final)=65536 +[Hera] consumed(final)=0 +[Hera] Startup: birthing Hestia (fleet foundation)... +[Hestia] [HADES][WARN ] [KRELTSC: 10975492710] capsule sig: hestia:init.4th: missing (unsigned) +[Hestia] [HADES][WARN ] [KRELTSC: 11145709680] ( Unterminated comment +[Hestia] [HADES][WARN ] [KRELTSC: 11152072638] ( Unterminated comment +[Hestia] [HADES][WARN ] [KRELTSC: 11199574344] ( Unterminated comment +[Hestia] (no identity) +[Hestia] PARITY:BIRTH vm_id=0x3e417af7a996424b-0xac711f4444782b53 capsule_id=0x64e111990fbc45ff mode=p capsule_hash=0x64e111990fbc45ff dict_hash=0xb1256603f848e2b9 +[Hera] BIRTH: Hestia live +[Hera] Startup: Hestia live +[Hera] Startup: birthing Artemis (fleet foundation)... +[Artemis] [HADES][WARN ] [KRELTSC: 11252098998] capsule sig: artemis:init.4th: missing (unsigned) +[Artemis] Artemis: blank disk -- formatting +[Artemis] Artemis self-test... +[Artemis] 3076 allocated +[Artemis] 0.5u K after alloc +[Artemis] 0.5u K after free +[Artemis] [HADES][ERROR] [KRELTSC: 17785088664] virtio_blk: vblk_io timed out (write=1 sector=296) -- queue nev +[Artemis] PASS +[Artemis] Artemis: persist-write... +[Artemis] PASS: persist-write +[Artemis] Artemis ready +[Artemis] Artemis: 22998 data blocks +[Artemis] K-total=0.5u +[Artemis] ARTEMIS-K=1.5u +[Artemis] (no identity) +[Artemis] [HADES][WARN ] [KRELTSC: 24692383401] ( Unterminated comment +[Artemis] PARITY:BIRTH vm_id=0xf6f94b9c36ea463f-0xb8d8e10f85efa90b capsule_id=0xe6fba9ae56e1c916 mode=p capsule_hash=0xe6fba9ae56e1c916 dict_hash=0xc791409ac1715690 +[Hera] BIRTH: Artemis live +[Hera] Startup: Artemis live +[Hera] Heartbeat: 663 ticks, trust=0x00010000, variance=0x00000000 +[Hera] Kernel-Hermes common-channel fleet self-test: PASS +[Hera] common channel members=3 +[Hera] channel table capacity=50 +[Hera] Kernel-Hermes synthetic private-topic self-test: PASS +[Hera] Kernel-Hermes publish self-test: PASS +[Hera] Kernel-Hermes drain self-test: SKIPPED (Hermes not live) +[Hera] Kernel-Hermes chunk self-test: PASS +[Hera] Kernel-Hermes negotiation self-test: PASS +[Hera] Kernel-Hermes channel-open policy self-test: SKIPPED (Hera/Hermes not available) +[Hera] blkio_usb: MSC device ready +[Hera] Kernel-Hermes BLK-ATTACH-EVENT (real, Stage C): ledger held=2048 pulled=237568 returned=234783 consumed=737 stadium_conserved(Artemis)=true +[Hera] Zuse: genesis minted onto attached thumbdrive +[Hera] LithosAnanke v2.1.0 +[Hera] StarForth Version 3.2.0 + +[Hera] StarForth CLI +[Hera] FORTH-79 interpreter type BYE or power off to exit + +[zuse@Hera] ok>  \ No newline at end of file -- 2.54.0 From a2a4a85d38c1d1be8154969507b5e5699eeb868b Mon Sep 17 00:00:00 2001 From: rajames Date: Sat, 3 Oct 2026 10:13:58 -0400 Subject: [PATCH 023/135] docs(v4.0.0): record the three products and v4's acceptance criteria Both ruled by Captain Bob, 2026-10-03. Products (README.md, JUSTIFICATION.md section 15): Hosted StarForth F18 (native Linux, amd64/arm64/riscv64, on hardware); FPGA StarForth F18 (a 32-bit build loaded into the FPGA, the gateway and foundation); and StarshipOS (bare metal, LithosAnanke on the v4 F18 engine). FORTH-79 recomposed on the F18 engine is stored as a capsule, as are the StarshipOS portions; the tree will be reorganised around this. Acceptance (JUSTIFICATION.md section 16, v4/README.md): v4 is equivalent to v3 at any point in time -- same vocabularies, same behaviour, on the F18-derived engine -- and every ISA, hosted and bare metal, must still reach its ok prompt. `make -C v4 test` is a development check, not acceptance. v4 had no acceptance criteria before this. Documentation only; no code changed. Co-Authored-By: Claude Opus 5.5 --- README.md | 19 +++++++++++++++++++ docs/v4.0.0/JUSTIFICATION.md | 31 +++++++++++++++++++++++++++++++ v4/README.md | 5 +++++ 3 files changed, 55 insertions(+) diff --git a/README.md b/README.md index 6fa97f8c..58957de6 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,25 @@ --- +## Products + +StarForth v4 moves the engine onto a 32-instruction core derived from Chuck Moore's F18 +(`docs/v4.0.0/`). With it, this repository carries three products, not one: + +| Product | What it is | +|---|---| +| **Hosted StarForth F18** | The v4 engine as a native Linux build, for amd64, arm64 and riscv64, on real hardware. | +| **FPGA StarForth F18** | A 32-bit build of the same engine loaded into the FPGA. It is the gateway to the rest: the foundation everything else is built up from. | +| **StarshipOS** | The bare-metal product: LithosAnanke running the v4 F18 engine. | + +FORTH-79 is recomposed on the F18 engine and stored as a capsule; the StarshipOS-specific +vocabulary gets the same treatment. The source tree will be reorganised around this split. + +v3 remains the reference system until v4 meets its acceptance criteria +(`docs/v4.0.0/JUSTIFICATION.md` §16). Everything below describes v3 as it stands today. + +--- + ## Status — M7.1 (Capsule System · Multi-VM Fleet) | Milestone | | Status | diff --git a/docs/v4.0.0/JUSTIFICATION.md b/docs/v4.0.0/JUSTIFICATION.md index 151110b3..24ae5735 100644 --- a/docs/v4.0.0/JUSTIFICATION.md +++ b/docs/v4.0.0/JUSTIFICATION.md @@ -224,3 +224,34 @@ LithosAnanke filing is a question for counsel. - K≡1.0 holds on the golden model at both widths, on all three host ISAs. - A hosted mesh runs the Tripod roles as nodes, with Hermes as the network. - Verilator co-simulation of one node matches the golden model instruction for instruction. + +## 15. Products + +Ruled by Captain Bob, 2026-10-03. v4 turns one project into three products built on the same engine: + +1. **Hosted StarForth F18.** The v4 engine as a native Linux build for amd64, arm64 and riscv64, on + real hardware. +2. **FPGA StarForth F18.** A 32-bit build of the engine loaded into the FPGA. This is the gateway into + building the whole system, and its foundation. +3. **StarshipOS.** The bare-metal product: LithosAnanke running the v4 F18 engine. + +The FORTH-79 vocabulary, recomposed on the F18 engine (`DECOMPOSITION.md`), is stored as a capsule. The +StarshipOS-specific portions are recomposed and stored as capsules in the same way. The source tree +will be reorganised around this split. + +## 16. Acceptance criteria + +Ruled by Captain Bob, 2026-10-03. Until then v4 had none: this document and `v4/README.md` named a +POST suite and K≡1.0 on three host ISAs, neither of which exists yet, so nothing could be called +accepted. + +- **v4 is equivalent to v3 at any point in time.** It must provide the same vocabularies and behave + the same way. The only difference is the machine underneath: the F18-derived engine instead of the + original StarForth VM. +- **Every ISA, hosted and bare metal, must still reach its `ok` prompt.** That is amd64, aarch64 and + riscv64, as a hosted build and as a bare-metal boot. + +The existing acceptance tests keep their force and their rules: the three-architecture QEMU boot for +anything bare metal (`.claude/CLAUDE.md`), and the hosted three-architecture test +(`docs/lithosananke/hosted-acceptance-test/README.md`). Passing `make -C v4 test` is a development +check on the golden model, not acceptance. diff --git a/v4/README.md b/v4/README.md index 3b1251dd..5315f636 100644 --- a/v4/README.md +++ b/v4/README.md @@ -8,6 +8,11 @@ The first deliverable is the hosted C99 golden model (`JUSTIFICATION.md` §10, step 1). It must pass POST and hold K≡1.0 with 32- and 64-bit cells on all three host ISAs. +Acceptance (`JUSTIFICATION.md` §16): v4 must be equivalent to v3 at any point +in time, with the same vocabularies and behaviour, on the F18-derived engine; +and every ISA, hosted and bare metal, must still reach its `ok` prompt. +`make -C v4 test` passing is a development check, not acceptance. + What exists so far is the single node: registers, circular stacks, memory, all 32 opcodes, and per-opcode and per-call-target heat. `make -C v4 test` builds and runs the tests at both cell widths; `make -C v4 sanitize` repeats them -- 2.54.0 From e117333a876e45233114bec1c7c7d0b4647146ea Mon Sep 17 00:00:00 2001 From: rajames Date: Sat, 3 Oct 2026 10:29:59 -0400 Subject: [PATCH 024/135] feat(v4.0.0): Q.LOG, flattened, bit for bit with v3 Q.LOG is v3's q48_log_approx: x = 2^k * m with 1.0 <= m < 2.0, ln m by up to 6 Newton rounds on e^y = m, result y + k * ln 2. As ruled, e^y is Q.EXP's Taylor loop written in line rather than a call to Q.EXP, so Q.LOG calls only Q.*, Q./ and UM*. After the reduction m, y, the Taylor term and its sum each fit one cell, so the 7-cell variable (QL) holds single cells. x <= 0 returns 0 and sets NODE-ERROR (D-12). Checked bit for bit against v3's q48_log_approx (ported into the test) on 22 positive edge values, 2000 pseudo-random x of every magnitude and a sweep of every 17th reduced m, at 32- and 64-bit cells, optimised and ASan+UBSan (`make test`, `make sanitize`). Mutating the round count, the 100-ulp stop, ln 2 or the Taylor length all fail. v3's clamp y = max(y - corr, 0) is kept but cannot fire: a scan of all 65536 values of m in C never reaches it, and never needs more than 4 rounds. So no test covers it. The test harness's per-call step limit is raised from 100000 to 4000000 instruction words: a 64-bit Q./ takes about 6500, and a mutant forcing extra Newton rounds ran past the old limit and looked like a width difference. Headroom (data under arg / return): Q.LOG 3/2. Test results on the amd64 host only. This is a development check, not acceptance (JUSTIFICATION.md section 16). Co-Authored-By: Claude Opus 5.5 --- docs/v4.0.0/DECOMPOSITION.md | 8 +- v4/tests/test_foundation.c | 245 ++++++++++++++++++++++++++++++++++- 2 files changed, 244 insertions(+), 9 deletions(-) diff --git a/docs/v4.0.0/DECOMPOSITION.md b/docs/v4.0.0/DECOMPOSITION.md index 2e81fb92..48ccf306 100644 --- a/docs/v4.0.0/DECOMPOSITION.md +++ b/docs/v4.0.0/DECOMPOSITION.md @@ -147,8 +147,8 @@ IF body1 ELSE body2 THEN → if L1 drop body1 jump L2 times, as on the F18. `FOR ... UNEXT` is the same but the body must fit in one instruction word. **Register conventions.** `A` and `B` are caller-saved. A word that uses them says so. Words in this -document that clobber `A`: `@ ! +! -! 2@ 2! C@ C! UM* * UM/MOD Q.FROM-INT Q.TO-INT Q.* Q./ Q.EXP Q.SQRT SEND RECV`. Words that clobber `B`: -`Q./ Q.EXP Q.SQRT SEND RECV`. +document that clobber `A`: `@ ! +! -! 2@ 2! C@ C! UM* * UM/MOD Q.FROM-INT Q.TO-INT Q.* Q./ Q.EXP Q.SQRT Q.LOG SEND RECV`. Words that clobber `B`: +`Q./ Q.EXP Q.SQRT Q.LOG SEND RECV`. **Return-stack words** (`>R R> R@ 2>R 2R> 2R@ I J UNLOOP` and the loop runtimes) are always IN. @@ -664,7 +664,9 @@ word. Per D-10 it occupies two cells on a 64-bit node too. Per D-8, v4 Q values | `D2*C` | CAP | `( lo hi cin -- lo' hi' cout )`: the double shifted left one bit, `cin` entering at the bottom and `cout` the bit leaving the top (both 0 or 1). `a! dup -if L1 drop 1 jump L2 L1: drop 0 L2: push over -if L3 drop 1 jump L4 L3: drop 0 L4: over + + push 2* a + pop pop` — `cin` waits in `A`, and `2hi + m` is `over + +`, so it needs one return entry. Executed on the golden model (2026-10-02). Clobbers `A`. | | `(Q/)` | CAP | Variable, 5 cells: `Q./`'s quotient register, divisor and result sign. Like `BASE` and the hold buffer, it lives in node memory. | | `Q.ABS` `Q.NEG` | CAP | `DABS`, `DNEGATE` — executed on the golden model (2026-10-02) against v3's `q48_abs` and `0 - q`: bit-for-bit at 32-bit cells, including v3's wrap of Q min to itself; at 64-bit cells the low cell is v3's and the high cell is the true sign, per D-10. | -| `Q.LOG` `Q.SIN` `Q.COS` | CAP | Algorithms ported from `q48_words.c`; the hosted C versions are the golden model. | +| `Q.SIN` `Q.COS` | CAP | Algorithms ported from `q48_words.c`; the hosted C versions are the golden model. | +| `Q.LOG` | CAP | v3's `q48_log_approx`: `x = 2^k * m` with `1.0 <= m < 2.0`; `ln m` by up to 6 Newton rounds on `e^y = m` from `y = m - 1.0`, stopping once `|m - e^y| < 100` ulp; result `y + k * ln 2` with `ln 2 = 45426`. `e^y` is `Q.EXP`'s Taylor loop **written in line** (flattened, ruled 2026-10-02), so `Q.LOG` calls only `Q.*`, `Q./` and `UM*` and the call chain is one level shorter than through `Q.EXP`. After the reduction `m`, `y`, the Taylor term and its sum each fit one cell at either width, so the variable `(QL)` holds single cells. `x <= 0` returns 0 and sets `NODE-ERROR` (D-12). Executed on the golden model (2026-10-03): bit for bit v3's result for every `x > 0` tested, including a sweep of the reduced `m`. v3's clamp `y = max(y - corr, 0)` is kept for fidelity but cannot fire: over all 65536 values of `m` it is never reached, and the iteration never needs more than 4 rounds. Leaves its caller 3 data cells under its argument and 2 return entries. Clobbers `A` and `B`. | +| `(QL)` | CAP | Variable, 7 cells: `Q.LOG`'s `m`, `y`, `k`, rounds left, Taylor term (then `delta`), sum, and `n * 1.0`. | | `Q.SQRT` | CAP | v3's `q48_sqrt_approx`: Newton from `x0 = q/2 + 0.25`, up to 8 rounds of `x' = (x + q/x) / 2`, returning `x` as soon as `|x' - x| < 10` ulp; `sqrt(0) = 0`, `sqrt(1.0) = 1.0`. `q < 0` returns 0 and sets `NODE-ERROR` (D-12). `q`, `x` and the rounds left live in the variable `(QR)`. The halving is a logical double shift, `push a! 0 pop +* MAXHI and push drop a pop`. Executed on the golden model (2026-10-02): bit for bit v3's result for `0 <= q < 2^48`; above that v3's `q48_div` saturates and v4 divides correctly, so they part. Leaves its caller 3 data cells under its argument and 2 return entries. Clobbers `A` and `B`. | | `(QR)` | CAP | Variable, 5 cells: `Q.SQRT`'s `q`, `x` and rounds left. | | `Q.EXP` | CAP | v3's `q48_exp_approx`: `1 + x + x^2/2! + …` to 10 terms on `x = |q|`, stopping once a term is below 50 ulp; `1.0 Q./ e^|q|` for `q < 0`; `e^0 = 1.0`; `|q| >= 16.0` gives 0 (`q < 0`) or **Q max** (v3 returned all ones, which reads as −ulp under D-8). `x`, the term, the sum, the sign and the term index live in the variable `(QE)`, so only `Q.*` and `Q./` arguments sit on the stacks. Executed on the golden model (2026-10-02): bit for bit v3's result for `|q| < 16.0` (at 64-bit cells as the same value, high cell 0). Leaves its caller 3 data cells under its argument and 2 return entries. Clobbers `A` and `B`. | diff --git a/v4/tests/test_foundation.c b/v4/tests/test_foundation.c index 71ecc00a..b0b0eaeb 100644 --- a/v4/tests/test_foundation.c +++ b/v4/tests/test_foundation.c @@ -29,7 +29,9 @@ * values, and against v3's q48_div where v4 keeps v3's meaning. * Q.EXP is checked bit for bit against v3's q48_exp_approx for |q| < 16.0. * Q.SQRT is checked bit for bit against v3's q48_sqrt_approx for - * 0 <= q < 2^48, and for 0 with NODE-ERROR below zero (D-12). Every word is + * 0 <= q < 2^48, and for 0 with NODE-ERROR below zero (D-12). + * Q.LOG is checked bit for bit against v3's q48_log_approx for x > 0, and + * for 0 with NODE-ERROR at or below zero. Every word is * also probed for how much of the 10- and 9-deep circular stacks (D-2) it * leaves to its caller. * @@ -56,6 +58,8 @@ static int failures = 0, checks = 0; #define QE ((v4_cell)(V4_NODE_WORDS - 16u)) /* (QR), Q.SQRT's 5-cell variable: q, x (two cells each), rounds left. */ #define QR ((v4_cell)(V4_NODE_WORDS - 24u)) +/* (QL), Q.LOG's 7-cell variable: m, y, k, rounds left, term, sum, n*1.0. */ +#define QL ((v4_cell)(V4_NODE_WORDS - 32u)) #define MAXU ((v4_ucell)~(v4_ucell)0) #define FLAG(c) ((c) ? V4_ALL_ONES : (v4_cell)0) @@ -69,7 +73,7 @@ static v4_cell w_nip, w_swap, w_or, w_negate, w_rot, w_zless, w_zequal, w_ugreater, w_abs, w_s2d, w_dplus, w_dnegate, w_dabs, w_smrem, w_slashmod, w_mplus, w_dminus, w_d0equal, w_dequal, w_qfromint, w_qtoint, w_less, w_equal, w_dless, w_2swap, w_2over, - w_dmax, w_dmin, w_qgt_doc, w_qgt, w_dltkeep, w_qstar, w_d2starc, w_uqdiv, w_qslash, w_qexp, w_qsqrt; + w_dmax, w_dmin, w_qgt_doc, w_qgt, w_dltkeep, w_qstar, w_d2starc, w_uqdiv, w_qslash, w_qexp, w_qsqrt, w_qlog; #define O(name) v4_asm_op(&as, V4_OP_##name) #define LIT(v) v4_asm_lit(&as, (v4_cell)(v)) @@ -1018,6 +1022,156 @@ static void build(void) #undef FETCH2 #undef STORE2 #undef HERE_ +#undef FWD + + /* : Q.LOG ( x -- ln x ) 5.26, v3's q48_log_approx + * x = 2^k * m with 1.0 <= m < 2.0; ln m by up to 6 Newton rounds on + * e^y = m from y = m - 1.0; result y + k * ln 2 (ln 2 = 45426). e^y is + * Q.EXP's Taylor loop written here in line, so Q.LOG calls only Q.*, Q./ + * and UM*. After the reduction m, y, the Taylor term and sum all fit one + * cell, so (QL) holds single cells: m y k rounds term sum n*1.0. + * x <= 0 gives 0 and sets NODE-ERROR (D-12). D2/ is the logical double + * shift right, as in Q.SQRT. + * dup -if POS drop jump ERR + * POS: drop over over OR if ZERO drop 0 QL 2 + b! !b + * DOWN: dup if CHKLO drop jump SHR + * CHKLO: drop over -131072 and if DOWNDONE drop + * SHR: D2/ QL 2 + b! @b 1 + !b jump DOWN x >= 2.0: halve, k+1 + * DOWNDONE: drop drop m + * UP: dup -65536 and if UPSHIFT drop jump NORM + * UPSHIFT: drop 2* QL 2 + b! @b -1 + !b jump UP m < 1.0: double, k-1 + * NORM: dup QL b! !b -65536 + QL 1 + b! !b 6 QL 3 + b! !b + * NEWTON: QL 1 + b! @b dup QL 4 + b! !b 65536 + QL 5 + b! !b + * 131072 QL 6 + b! !b + * EXPL: QL 4 + b! @b 0 QL 1 + b! @b 0 Q.* drop + * 0 QL 6 + b! @b 0 Q./ drop dup QL 4 + b! !b + * dup QL 5 + b! @b + !b + * -50 + -if EXPC drop jump EXPD + * EXPC: drop QL 6 + b! @b 65536 + dup !b -720896 + -if EXPD2 drop jump EXPL + * EXPD2: drop + * EXPD: QL b! @b QL 5 + b! @b push inv pop + inv delta = m - e^y + * dup QL 4 + b! !b delta waits in the term's cell + * if DZ -if DPOS + * inv 1 + 0 QL 5 + b! @b 0 Q./ drop corr = -delta / e^y + * QL 1 + b! @b SWAP push inv pop + inv -if KEEP drop 0 KEEP: QL 1 + b! !b + * jump TEST y = max(y - corr, 0) + * DPOS: 0 QL 5 + b! @b 0 Q./ drop QL 1 + b! @b + !b jump TEST + * DZ: drop + * TEST: QL 4 + b! @b -if AP inv 1 + AP: -100 + -if CONT drop jump FIN + * CONT: drop QL 3 + b! @b -1 + dup !b if FIN0 drop jump NEWTON + * FIN0: drop + * FIN: QL 1 + b! @b QL 2 + b! @b + * -if KP inv 1 + 45426 UM* drop inv 1 + jump KS KP: 45426 UM* drop + * KS: + dup -if SP drop -1 ; SP: drop 0 ; + * ZERO: drop ERR: drop drop NODE-ERROR b! -1 !b 0 0 ; + * Clobbers A and B. */ +#define FWD(op) v4_asm_branch_fwd(&as, V4_OP_##op) +#define HERE_(r) v4_asm_resolve(&as, (r), v4_asm_label(&as)) +#define JUMP_TO(l) v4_asm_branch(&as, V4_OP_JUMP, (l)) +#define VGET(a) do { LIT(a); O(BANG_B); O(FETCH_B); } while (0) +#define VSET(a) do { LIT(a); O(BANG_B); O(STORE_B); } while (0) +#define SWAP_INLINE() do { O(OVER); O(PUSH); O(PUSH); O(DROP); O(RPOP); O(RPOP); } while (0) +#define SUB_INLINE() do { O(PUSH); O(INV); O(RPOP); O(ADD); O(INV); } while (0) +#define D2SLASH() do { O(PUSH); O(BANG_A); LIT(0); O(RPOP); O(MUL_STEP); \ + LIT((v4_cell)(MAXU >> 1)); O(AND); O(PUSH); O(DROP); O(PUSH_A); O(RPOP); } while (0) + { + v4_asm_ref pos, j_err, zero, chklo, j_shr, downdone, upshift, j_norm, expc, j_expd, + expd2, dzero, dpos, keep, j_test, ap, contn, j_fin, fin0, kp, j_ks, sp; + v4_cell l_down, l_up, l_newton, l_expl, l_test, l_err; + + w_qlog = v4_asm_label(&as); + O(DUP); pos = FWD(MINUS_IF); + O(DROP); j_err = FWD(JUMP); + HERE_(pos); + O(DROP); O(OVER); O(OVER); CALL(w_or); zero = FWD(IF); + O(DROP); LIT(0); VSET(QL + 2); + l_down = v4_asm_label(&as); + O(DUP); chklo = FWD(IF); + O(DROP); j_shr = FWD(JUMP); + HERE_(chklo); + O(DROP); O(OVER); LIT(-131072); O(AND); downdone = FWD(IF); + O(DROP); + HERE_(j_shr); + D2SLASH(); VGET(QL + 2); LIT(1); O(ADD); O(STORE_B); JUMP_TO(l_down); + HERE_(downdone); + O(DROP); O(DROP); + l_up = v4_asm_label(&as); + O(DUP); LIT(-65536); O(AND); upshift = FWD(IF); + O(DROP); j_norm = FWD(JUMP); + HERE_(upshift); + O(DROP); O(TWO_STAR); VGET(QL + 2); LIT(-1); O(ADD); O(STORE_B); JUMP_TO(l_up); + HERE_(j_norm); + O(DUP); VSET(QL); LIT(-65536); O(ADD); VSET(QL + 1); LIT(6); VSET(QL + 3); + l_newton = v4_asm_label(&as); + VGET(QL + 1); O(DUP); VSET(QL + 4); LIT(65536); O(ADD); VSET(QL + 5); + LIT(131072); VSET(QL + 6); + l_expl = v4_asm_label(&as); + VGET(QL + 4); LIT(0); VGET(QL + 1); LIT(0); CALL(w_qstar); O(DROP); + LIT(0); VGET(QL + 6); LIT(0); CALL(w_qslash); O(DROP); + O(DUP); VSET(QL + 4); + O(DUP); VGET(QL + 5); O(ADD); O(STORE_B); + LIT(-50); O(ADD); expc = FWD(MINUS_IF); + O(DROP); j_expd = FWD(JUMP); + HERE_(expc); + O(DROP); VGET(QL + 6); LIT(65536); O(ADD); O(DUP); O(STORE_B); + LIT(-720896); O(ADD); expd2 = FWD(MINUS_IF); + O(DROP); JUMP_TO(l_expl); + HERE_(expd2); + O(DROP); + HERE_(j_expd); + VGET(QL); VGET(QL + 5); SUB_INLINE(); O(DUP); VSET(QL + 4); + dzero = FWD(IF); + dpos = FWD(MINUS_IF); + O(INV); LIT(1); O(ADD); LIT(0); VGET(QL + 5); LIT(0); CALL(w_qslash); O(DROP); + VGET(QL + 1); SWAP_INLINE(); SUB_INLINE(); + keep = FWD(MINUS_IF); O(DROP); LIT(0); HERE_(keep); + VSET(QL + 1); j_test = FWD(JUMP); + HERE_(dpos); + LIT(0); VGET(QL + 5); LIT(0); CALL(w_qslash); O(DROP); + VGET(QL + 1); O(ADD); O(STORE_B); + { + v4_asm_ref j_test2 = FWD(JUMP); + HERE_(dzero); + O(DROP); + l_test = v4_asm_label(&as); + v4_asm_resolve(&as, j_test2, l_test); + } + VGET(QL + 4); + ap = FWD(MINUS_IF); O(INV); LIT(1); O(ADD); HERE_(ap); + LIT(-100); O(ADD); contn = FWD(MINUS_IF); + O(DROP); j_fin = FWD(JUMP); + HERE_(contn); + O(DROP); VGET(QL + 3); LIT(-1); O(ADD); O(DUP); O(STORE_B); + fin0 = FWD(IF); + O(DROP); JUMP_TO(l_newton); + HERE_(fin0); + O(DROP); + HERE_(j_fin); + VGET(QL + 1); VGET(QL + 2); + kp = FWD(MINUS_IF); + O(INV); LIT(1); O(ADD); LIT(45426); CALL(w_umstar); O(DROP); O(INV); LIT(1); O(ADD); + j_ks = FWD(JUMP); + HERE_(kp); + LIT(45426); CALL(w_umstar); O(DROP); + HERE_(j_ks); + O(ADD); O(DUP); sp = FWD(MINUS_IF); + O(DROP); LIT(-1); O(SEMI); + HERE_(sp); O(DROP); LIT(0); O(SEMI); + HERE_(zero); + O(DROP); + l_err = v4_asm_label(&as); + O(DROP); O(DROP); LIT(NODE_ERROR); O(BANG_B); LIT(-1); O(STORE_B); LIT(0); LIT(0); O(SEMI); + + v4_asm_resolve(&as, j_err, l_err); + v4_asm_resolve(&as, j_test, l_test); + } +#undef D2SLASH +#undef SUB_INLINE +#undef SWAP_INLINE +#undef VSET +#undef VGET +#undef JUMP_TO +#undef HERE_ #undef FWD CHECK(v4_asm_ok(&as), "foundation words assemble"); @@ -1034,7 +1188,7 @@ static int call(v4_cell word, unsigned argc, v4_cell a, v4_cell b, v4_cell c) if (argc > 0) v4_dstack_push(&n.ds, a); if (argc > 1) v4_dstack_push(&n.ds, b); if (argc > 2) v4_dstack_push(&n.ds, c); - return v4_test_call(&n, &es, &h, word, 100000) > 0; + return v4_test_call(&n, &es, &h, word, 4000000) > 0; } /* The same with four arguments. */ @@ -1048,7 +1202,7 @@ static int call4(v4_cell word, v4_cell a, v4_cell b, v4_cell c, v4_cell d) v4_dstack_push(&n.ds, b); v4_dstack_push(&n.ds, c); v4_dstack_push(&n.ds, d); - return v4_test_call(&n, &es, &h, word, 100000) > 0; + return v4_test_call(&n, &es, &h, word, 4000000) > 0; } /* The results, top first, then the canary. */ @@ -1422,6 +1576,42 @@ static uint64_t v3_q48_sqrt(uint64_t q) return x; } +/* v3's q48_log_approx, verbatim but for the names. */ +static uint64_t v3_q48_log(uint64_t x) +{ + const uint64_t LN2_Q48 = 45426; + int k = 0, iter; + uint64_t m = x, y, result; + + if (x == 0) return 0; + if (x == 65536) return 0; + if (m >= 131072) { + while (m >= 131072) { m >>= 1; k++; } + } else if (m < 65536) { + while (m < 65536) { m <<= 1; k--; } + } + y = (m > 65536) ? (m - 65536) : 0; + for (iter = 0; iter < 6; iter++) { + uint64_t exp_y = v3_q48_exp(y), correction; + int64_t delta_signed; + if (exp_y == 0) break; + delta_signed = (int64_t)m - (int64_t)exp_y; + if (delta_signed > 0) { + correction = v3_q48_div((uint64_t)delta_signed, exp_y); + y = y + correction; + } else if (delta_signed < 0) { + correction = v3_q48_div((uint64_t)(-delta_signed), exp_y); + if (y > correction) y = y - correction; + else y = 0; + } + if (delta_signed < 100 && delta_signed > -100) break; + } + result = y; + if (k > 0) result = result + v3_q48_mul((uint64_t)k << 16, LN2_Q48); + else if (k < 0) result = result - v3_q48_mul((uint64_t)(-k) << 16, LN2_Q48); + return result; +} + /* Stack headroom. Run `word` with `dfill` marked cells under the canary and * `rfill` marked cells under its return address, and report whether the * results, the canary and every marked cell come back intact. The F18 stacks @@ -1440,7 +1630,7 @@ static int fits(v4_cell word, unsigned argc, const v4_cell *arg, v4_rstack_reset(&n.rs); v4_exec_reset(&es); for (i = 0; i < argc; i++) v4_dstack_push(&n.ds, arg[i]); - if (v4_test_call(&n, &es, &h, word, 100000) <= 0) return 0; + if (v4_test_call(&n, &es, &h, word, 4000000) <= 0) return 0; if (nres > V4_DATA_DEPTH) return 0; for (i = 0; i < nres; i++) want[i] = v4_dstack_pop(&n.ds); @@ -1451,7 +1641,7 @@ static int fits(v4_cell word, unsigned argc, const v4_cell *arg, v4_dstack_push(&n.ds, CANARY); for (i = 0; i < argc; i++) v4_dstack_push(&n.ds, arg[i]); for (i = 0; i < rfill; i++) v4_rstack_push(&n.rs, RFILL(i)); - if (v4_test_call(&n, &es, &h, word, 100000) <= 0) return 0; + if (v4_test_call(&n, &es, &h, word, 4000000) <= 0) return 0; for (i = 0; i < nres; i++) if (v4_dstack_pop(&n.ds) != want[i]) return 0; if (v4_dstack_pop(&n.ds) != CANARY) return 0; for (i = dfill; i-- > 0; ) if (v4_dstack_pop(&n.ds) != DFILL(i)) return 0; @@ -2105,6 +2295,43 @@ int main(void) } } + /* Q.LOG against v3's q48_log_approx for x > 0, bit for bit; x <= 0 + * gives 0 and NODE-ERROR (D-12). */ + { + static const int64_t ql[] = { + 1, 2, 3, 0x7FFF, 0x8000, 0xFFFF, 0x10000, 0x10001, 0x18000, 0x1FFFF, 0x20000, + 0x2B7E1, 0x30000, 0xA0000, 0x640000, 0x7FFFFFFF, 0x80000000, 0xFFFFFFFF, + 0x100000000, ((int64_t)1 << 47), ((int64_t)1 << 62) + 12345, + (int64_t)(((uint64_t)1 << 63) - 1u), 0, -1, -0x10000 + }; + uint64_t x = 0xA0761D6478BD642Fu; + for (unsigned i = 0; i < sizeof ql / sizeof ql[0] + 2000u; i++) { + int64_t q; + v4_cell xl, xh, el, eh; + if (i < sizeof ql / sizeof ql[0]) q = ql[i]; + else { + x ^= x << 13; x ^= x >> 7; x ^= x << 17; + q = (int64_t)((x >> 1) >> (x & 63u)); /* every magnitude */ + if (q == 0) q = 1; + } + qcells((uint64_t)q, &xl, &xh); + if (q <= 0) { el = 0; eh = 0; } + else qcells(v3_q48_log((uint64_t)q), &el, &eh); + v4_node_store(&n, NODE_ERROR, 0); + CHECK(call(w_qlog, 2, xl, xh, 0) && left2(el, eh) + && v4_node_load(&n, NODE_ERROR) == (q <= 0 ? -1 : 0), + "Q.LOG [%u] x=%lld", i, (long long)q); + } + /* The reduced m takes only 65536 values, 1.0 <= m < 2.0; sweep every + * 17th directly (k = 0), which covers the Newton iteration itself. */ + for (int64_t m = 65536; m < 131072; m += 17) { + v4_cell xl, xh, el, eh; + qcells((uint64_t)m, &xl, &xh); + qcells(v3_q48_log((uint64_t)m), &el, &eh); + CHECK(call(w_qlog, 2, xl, xh, 0) && left2(el, eh), "Q.LOG m=%lld", (long long)m); + } + } + /* Q./ at the overflow boundary: |a| * 2^16 against |b| * 2^(2N-1), for * divisors around 2^16 and 2^17, every sign. */ { @@ -2218,6 +2445,12 @@ int main(void) }; headroom("Q.SQRT", w_qsqrt, 2, qsqrt_args, 5, 2, &dh, &rh); CHECK(dh >= 2 && rh >= 2, "Q.SQRT leaves room"); + static const v4_cell qlog_args[][4] = { + { 0x10000, 0, 0, 0 }, { 0x2B7E1, 0, 0, 0 }, { 3, 0, 0, 0 }, { -1, 0x7FFF, 0, 0 }, + { 0, 0, 0, 0 }, { 5, -1, 0, 0 } + }; + headroom("Q.LOG", w_qlog, 2, qlog_args, 6, 2, &dh, &rh); + CHECK(dh >= 2 && rh >= 2, "Q.LOG leaves room"); headroom("SM/REM", w_smrem, 3, smrem_args, 5, 2, &dh, &rh); CHECK(rh >= 1, "SM/REM leaves room for /MOD's return address"); headroom("/MOD", w_slashmod, 2, slashmod_args, 4, 2, &dh, &rh); -- 2.54.0 From 1ce705783c679928a4955bc3d372804e69498615 Mon Sep 17 00:00:00 2001 From: rajames Date: Sat, 3 Oct 2026 10:44:42 -0400 Subject: [PATCH 025/135] feat(v4.0.0): Q.SIN and (Q.REDUCE), bit for bit with v3 (Q.REDUCE) is v3's q48_reduce_angle: the angle as one cell in [-pi, pi]. x / 2pi does not fit a cell, but only the remainder is needed, and |x| mod 2pi is two UM/MOD steps (high cell first, its remainder leading the low cell); then the sign of x and one step of 2pi back into range. Q.SIN is v3's q48_sin_approx on the reduced angle: the odd Taylor series to n = 11, each term the last times x^2 over n(n-1), stopping below 10 ulp. After the reduction every value fits one cell, so the 6-cell variable (QT) holds single cells. The loop is laid out for Q.COS to jump into, so the pair share it without an extra call level. Checked bit for bit against v3 (both functions ported into the test) on 33 edge angles -- around +-pi/2, +-pi, +-2pi, the 32-bit seam and both 64-bit extremes -- and 3000 pseudo-random angles of every size and sign, at 32- and 64-bit cells, optimised and ASan+UBSan (`make test`, `make sanitize`). Mutating either range boundary, the series length or the sign alternation fails. Moving the 10-ulp stop to 11 fails nothing, and a scan of all 205888 reduced angles in C shows why: no input's result depends on it, for sine or cosine. Headroom (data under arg / return): (Q.REDUCE) 5/5, Q.SIN 3/2. Test results on the amd64 host only. This is a development check, not acceptance (JUSTIFICATION.md section 16). Co-Authored-By: Claude Opus 5.5 --- docs/v4.0.0/DECOMPOSITION.md | 9 +- v4/tests/test_foundation.c | 176 ++++++++++++++++++++++++++++++++++- 2 files changed, 180 insertions(+), 5 deletions(-) diff --git a/docs/v4.0.0/DECOMPOSITION.md b/docs/v4.0.0/DECOMPOSITION.md index 48ccf306..895cbd90 100644 --- a/docs/v4.0.0/DECOMPOSITION.md +++ b/docs/v4.0.0/DECOMPOSITION.md @@ -147,8 +147,8 @@ IF body1 ELSE body2 THEN → if L1 drop body1 jump L2 times, as on the F18. `FOR ... UNEXT` is the same but the body must fit in one instruction word. **Register conventions.** `A` and `B` are caller-saved. A word that uses them says so. Words in this -document that clobber `A`: `@ ! +! -! 2@ 2! C@ C! UM* * UM/MOD Q.FROM-INT Q.TO-INT Q.* Q./ Q.EXP Q.SQRT Q.LOG SEND RECV`. Words that clobber `B`: -`Q./ Q.EXP Q.SQRT Q.LOG SEND RECV`. +document that clobber `A`: `@ ! +! -! 2@ 2! C@ C! UM* * UM/MOD Q.FROM-INT Q.TO-INT Q.* Q./ Q.EXP Q.SQRT Q.LOG Q.SIN SEND RECV`. Words that clobber `B`: +`Q./ Q.EXP Q.SQRT Q.LOG Q.SIN SEND RECV`. **Return-stack words** (`>R R> R@ 2>R 2R> 2R@ I J UNLOOP` and the loop runtimes) are always IN. @@ -664,7 +664,10 @@ word. Per D-10 it occupies two cells on a 64-bit node too. Per D-8, v4 Q values | `D2*C` | CAP | `( lo hi cin -- lo' hi' cout )`: the double shifted left one bit, `cin` entering at the bottom and `cout` the bit leaving the top (both 0 or 1). `a! dup -if L1 drop 1 jump L2 L1: drop 0 L2: push over -if L3 drop 1 jump L4 L3: drop 0 L4: over + + push 2* a + pop pop` — `cin` waits in `A`, and `2hi + m` is `over + +`, so it needs one return entry. Executed on the golden model (2026-10-02). Clobbers `A`. | | `(Q/)` | CAP | Variable, 5 cells: `Q./`'s quotient register, divisor and result sign. Like `BASE` and the hold buffer, it lives in node memory. | | `Q.ABS` `Q.NEG` | CAP | `DABS`, `DNEGATE` — executed on the golden model (2026-10-02) against v3's `q48_abs` and `0 - q`: bit-for-bit at 32-bit cells, including v3's wrap of Q min to itself; at 64-bit cells the low cell is v3's and the high cell is the true sign, per D-10. | -| `Q.SIN` `Q.COS` | CAP | Algorithms ported from `q48_words.c`; the hosted C versions are the golden model. | +| `Q.COS` | CAP | Algorithm ported from `q48_words.c`; the hosted C version is the golden model. | +| `Q.SIN` | CAP | v3's `q48_sin_approx`: on `r = (Q.REDUCE) x` and `xu = |r|`, `xu - xu^3/3! + xu^5/5! - …` to `n = 11`, each term the last times `xu^2` over `n(n-1)`, stopping once a term is below 10 ulp; negated if `r < 0`. After the reduction every value fits one cell, so the variable `(QT)` holds single cells and the only calls are `(Q.REDUCE)`, `Q.*`, `Q./` and `UM*`. The Taylor loop is written so that `Q.COS` can jump into it. Executed on the golden model (2026-10-03): bit for bit v3's result on angles of every size and sign. Leaves its caller 3 data cells under its argument and 2 return entries. Clobbers `A` and `B`. | +| `(Q.REDUCE)` | CAP | `( x -- r )`, v3's `q48_reduce_angle`: the angle reduced to one cell, `-pi <= r <= pi` with `pi = 205887`, `2pi = 411774` — the remainder of `x / 2pi` with the sign of `x`, then one step of `2pi` back into range. `x / 2pi` does not fit a cell, but only the remainder is wanted: `|x| mod 2pi` is two `UM/MOD` steps, the high cell first and its remainder then leading the low cell. `dup (QT) b! !b -if L1 DNEGATE L1: 0 411774 UM/MOD drop 411774 UM/MOD drop (QT) b! @b -if P1 drop inv 1 + jump J1 P1: drop J1: dup -205888 + -if BIG drop dup 205887 + -if OK drop 411774 + ; OK: drop ; BIG: drop -411774 + ;` Executed on the golden model (2026-10-03), bit for bit v3's. Clobbers `A` and `B`. | +| `(QT)` | CAP | Variable, 6 cells: `Q.SIN` / `Q.COS`'s sign, `x^2`, term, sum, `n` and subtract flag. | | `Q.LOG` | CAP | v3's `q48_log_approx`: `x = 2^k * m` with `1.0 <= m < 2.0`; `ln m` by up to 6 Newton rounds on `e^y = m` from `y = m - 1.0`, stopping once `|m - e^y| < 100` ulp; result `y + k * ln 2` with `ln 2 = 45426`. `e^y` is `Q.EXP`'s Taylor loop **written in line** (flattened, ruled 2026-10-02), so `Q.LOG` calls only `Q.*`, `Q./` and `UM*` and the call chain is one level shorter than through `Q.EXP`. After the reduction `m`, `y`, the Taylor term and its sum each fit one cell at either width, so the variable `(QL)` holds single cells. `x <= 0` returns 0 and sets `NODE-ERROR` (D-12). Executed on the golden model (2026-10-03): bit for bit v3's result for every `x > 0` tested, including a sweep of the reduced `m`. v3's clamp `y = max(y - corr, 0)` is kept for fidelity but cannot fire: over all 65536 values of `m` it is never reached, and the iteration never needs more than 4 rounds. Leaves its caller 3 data cells under its argument and 2 return entries. Clobbers `A` and `B`. | | `(QL)` | CAP | Variable, 7 cells: `Q.LOG`'s `m`, `y`, `k`, rounds left, Taylor term (then `delta`), sum, and `n * 1.0`. | | `Q.SQRT` | CAP | v3's `q48_sqrt_approx`: Newton from `x0 = q/2 + 0.25`, up to 8 rounds of `x' = (x + q/x) / 2`, returning `x` as soon as `|x' - x| < 10` ulp; `sqrt(0) = 0`, `sqrt(1.0) = 1.0`. `q < 0` returns 0 and sets `NODE-ERROR` (D-12). `q`, `x` and the rounds left live in the variable `(QR)`. The halving is a logical double shift, `push a! 0 pop +* MAXHI and push drop a pop`. Executed on the golden model (2026-10-02): bit for bit v3's result for `0 <= q < 2^48`; above that v3's `q48_div` saturates and v4 divides correctly, so they part. Leaves its caller 3 data cells under its argument and 2 return entries. Clobbers `A` and `B`. | diff --git a/v4/tests/test_foundation.c b/v4/tests/test_foundation.c index b0b0eaeb..197ba5d1 100644 --- a/v4/tests/test_foundation.c +++ b/v4/tests/test_foundation.c @@ -31,7 +31,9 @@ * Q.SQRT is checked bit for bit against v3's q48_sqrt_approx for * 0 <= q < 2^48, and for 0 with NODE-ERROR below zero (D-12). * Q.LOG is checked bit for bit against v3's q48_log_approx for x > 0, and - * for 0 with NODE-ERROR at or below zero. Every word is + * for 0 with NODE-ERROR at or below zero. + * (Q.REDUCE) and Q.SIN are checked bit for bit against v3's + * q48_reduce_angle and q48_sin_approx on angles of every size and sign. Every word is * also probed for how much of the 10- and 9-deep circular stacks (D-2) it * leaves to its caller. * @@ -60,6 +62,8 @@ static int failures = 0, checks = 0; #define QR ((v4_cell)(V4_NODE_WORDS - 24u)) /* (QL), Q.LOG's 7-cell variable: m, y, k, rounds left, term, sum, n*1.0. */ #define QL ((v4_cell)(V4_NODE_WORDS - 32u)) +/* (QT), Q.SIN / Q.COS's 6-cell variable: sign, x^2, term, sum, n, subtract. */ +#define QT ((v4_cell)(V4_NODE_WORDS - 40u)) #define MAXU ((v4_ucell)~(v4_ucell)0) #define FLAG(c) ((c) ? V4_ALL_ONES : (v4_cell)0) @@ -73,7 +77,8 @@ static v4_cell w_nip, w_swap, w_or, w_negate, w_rot, w_zless, w_zequal, w_ugreater, w_abs, w_s2d, w_dplus, w_dnegate, w_dabs, w_smrem, w_slashmod, w_mplus, w_dminus, w_d0equal, w_dequal, w_qfromint, w_qtoint, w_less, w_equal, w_dless, w_2swap, w_2over, - w_dmax, w_dmin, w_qgt_doc, w_qgt, w_dltkeep, w_qstar, w_d2starc, w_uqdiv, w_qslash, w_qexp, w_qsqrt, w_qlog; + w_dmax, w_dmin, w_qgt_doc, w_qgt, w_dltkeep, w_qstar, w_d2starc, w_uqdiv, w_qslash, w_qexp, w_qsqrt, w_qlog, + w_qreduce, w_qsin, l_trig; #define O(name) v4_asm_op(&as, V4_OP_##name) #define LIT(v) v4_asm_lit(&as, (v4_cell)(v)) @@ -1172,6 +1177,106 @@ static void build(void) #undef VGET #undef JUMP_TO #undef HERE_ +#undef FWD + +#define FWD(op) v4_asm_branch_fwd(&as, V4_OP_##op) +#define HERE_(r) v4_asm_resolve(&as, (r), v4_asm_label(&as)) +#define JUMP_TO(l) v4_asm_branch(&as, V4_OP_JUMP, (l)) +#define VGET(a) do { LIT(a); O(BANG_B); O(FETCH_B); } while (0) +#define VSET(a) do { LIT(a); O(BANG_B); O(STORE_B); } while (0) + /* : (Q.REDUCE) ( x -- r ) 5.26, v3's q48_reduce_angle + * The angle x reduced to one cell r, -pi <= r <= pi (pi = 205887, + * 2pi = 411774): the remainder of x / 2pi with the sign of x, then one + * step of 2pi back into range. x / 2pi does not fit a cell, but only + * the remainder is wanted: |x| mod 2pi is two UM/MOD steps, the high + * cell first, its remainder then leading the low cell. + * dup QT b! !b -if L1 DNEGATE L1: u0 u1 (QT): sign of x + * 0 411774 UM/MOD drop 411774 UM/MOD drop |x| mod 2pi + * QT b! @b -if P1 drop inv 1 + jump J1 P1: drop J1: r + * dup -205888 + -if BIG drop + * dup 205887 + -if OK drop 411774 + ; + * OK: drop ; + * BIG: drop -411774 + ; + * Clobbers A and B. */ + { + v4_asm_ref l1, p1, j1, big, ok; + w_qreduce = v4_asm_label(&as); + O(DUP); VSET(QT); + l1 = FWD(MINUS_IF); CALL(w_dnegate); HERE_(l1); + LIT(0); LIT(411774); CALL(w_ummod); O(DROP); + LIT(411774); CALL(w_ummod); O(DROP); + VGET(QT); p1 = FWD(MINUS_IF); + O(DROP); O(INV); LIT(1); O(ADD); j1 = FWD(JUMP); + HERE_(p1); O(DROP); + HERE_(j1); + O(DUP); LIT(-205888); O(ADD); big = FWD(MINUS_IF); + O(DROP); + O(DUP); LIT(205887); O(ADD); ok = FWD(MINUS_IF); + O(DROP); LIT(411774); O(ADD); O(SEMI); + HERE_(ok); O(DROP); O(SEMI); + HERE_(big); O(DROP); LIT(-411774); O(ADD); O(SEMI); + } + + /* : Q.SIN ( x -- sin x ) 5.26, v3's q48_sin_approx + * On r = (Q.REDUCE) x and xu = |r|: xu - xu^3/3! + xu^5/5! - ... to + * n = 11, each term the last times xu^2 over n(n-1), stopping once a + * term is below 10 ulp; negated if r < 0. After the reduction every + * value fits one cell, so (QT) holds single cells: sign, x^2, term, + * sum, n, subtract flag. The loop is TRIG; Q.COS jumps into it. + * (Q.REDUCE) dup QT b! !b -if A1 inv 1 + A1: xu + * dup QT 2 + b! !b dup QT 3 + b! !b term = sum = xu + * 0 over 0 Q.* drop QT 1 + b! !b x^2 + * 3 QT 4 + b! !b -1 QT 5 + b! !b + * TRIG: QT 2 + b! @b 0 QT 1 + b! @b 0 Q.* drop + * 0 QT 4 + b! @b dup -1 + UM* drop 65536 UM* drop 0 Q./ drop + * dup QT 2 + b! !b term + * QT 5 + b! @b if ADDT drop inv 1 + jump ACC ADDT: drop + * ACC: QT 3 + b! @b + !b QT 5 + b! @b inv !b sum, flip the flag + * QT 2 + b! @b -10 + -if CONT drop jump END + * CONT: drop QT 4 + b! @b 2 + dup !b -12 + -if END2 drop jump TRIG + * END2: drop + * END: QT 3 + b! @b QT b! @b -if PR drop inv 1 + jump SD PR: drop + * SD: dup -if SP drop -1 ; SP: drop 0 ; + * Clobbers A and B. */ + { + v4_asm_ref a1, addt, j_acc, contn, j_end, end2, pr, j_sd, sp; + w_qsin = v4_asm_label(&as); + CALL(w_qreduce); O(DUP); VSET(QT); + a1 = FWD(MINUS_IF); O(INV); LIT(1); O(ADD); HERE_(a1); + O(DUP); VSET(QT + 2); O(DUP); VSET(QT + 3); + LIT(0); O(OVER); LIT(0); CALL(w_qstar); O(DROP); VSET(QT + 1); + LIT(3); VSET(QT + 4); LIT(-1); VSET(QT + 5); + l_trig = v4_asm_label(&as); + VGET(QT + 2); LIT(0); VGET(QT + 1); LIT(0); CALL(w_qstar); O(DROP); + LIT(0); VGET(QT + 4); O(DUP); LIT(-1); O(ADD); CALL(w_umstar); O(DROP); + LIT(65536); CALL(w_umstar); O(DROP); LIT(0); CALL(w_qslash); O(DROP); + O(DUP); VSET(QT + 2); + VGET(QT + 5); addt = FWD(IF); + O(DROP); O(INV); LIT(1); O(ADD); j_acc = FWD(JUMP); + HERE_(addt); O(DROP); + HERE_(j_acc); + VGET(QT + 3); O(ADD); O(STORE_B); + VGET(QT + 5); O(INV); O(STORE_B); + VGET(QT + 2); LIT(-10); O(ADD); contn = FWD(MINUS_IF); + O(DROP); j_end = FWD(JUMP); + HERE_(contn); + O(DROP); VGET(QT + 4); LIT(2); O(ADD); O(DUP); O(STORE_B); + LIT(-12); O(ADD); end2 = FWD(MINUS_IF); + O(DROP); JUMP_TO(l_trig); + HERE_(end2); O(DROP); + HERE_(j_end); + VGET(QT + 3); VGET(QT); pr = FWD(MINUS_IF); + O(DROP); O(INV); LIT(1); O(ADD); j_sd = FWD(JUMP); + HERE_(pr); O(DROP); + HERE_(j_sd); + O(DUP); sp = FWD(MINUS_IF); + O(DROP); LIT(-1); O(SEMI); + HERE_(sp); O(DROP); LIT(0); O(SEMI); + } +#undef VSET +#undef VGET +#undef JUMP_TO +#undef HERE_ #undef FWD CHECK(v4_asm_ok(&as), "foundation words assemble"); @@ -1612,6 +1717,37 @@ static uint64_t v3_q48_log(uint64_t x) return result; } +/* v3's q48_reduce_angle and q48_sin_approx, verbatim but for the names. */ +static int64_t v3_q48_reduce(int64_t x) +{ + const int64_t PI_Q48 = 205887; + const int64_t TWO_PI_Q48 = 2 * PI_Q48; + int64_t k = x / TWO_PI_Q48; + x -= k * TWO_PI_Q48; + while (x > PI_Q48) x -= TWO_PI_Q48; + while (x < -PI_Q48) x += TWO_PI_Q48; + return x; +} +static uint64_t v3_q48_sin(uint64_t q) +{ + int64_t x = v3_q48_reduce((int64_t)q); + int negative = (x < 0), subtract = 1, nn; + uint64_t xu, x2, term, result; + if (negative) x = -x; + xu = (uint64_t)x; + x2 = v3_q48_mul(xu, xu); + term = xu; + result = xu; + for (nn = 3; nn <= 11; nn += 2) { + term = v3_q48_mul(term, x2); + term = v3_q48_div(term, (uint64_t)(nn * (nn - 1)) << 16); + result = subtract ? result - term : result + term; + subtract = !subtract; + if (term < 10) break; + } + return negative ? (uint64_t)0 - result : result; +} + /* Stack headroom. Run `word` with `dfill` marked cells under the canary and * `rfill` marked cells under its return address, and report whether the * results, the canary and every marked cell come back intact. The F18 stacks @@ -2332,6 +2468,35 @@ int main(void) } } + /* (Q.REDUCE) and Q.SIN against v3's q48_reduce_angle and q48_sin_approx, + * bit for bit, on angles of every size and sign. */ + { + static const int64_t qa[] = { + 0, 1, -1, 0x8000, 0x10000, -0x10000, 102943, 102944, -102943, -102944, + 205886, 205887, 205888, -205886, -205887, -205888, + 411773, 411774, 411775, -411773, -411774, -411775, 617661, -617661, + 0x7FFFFFFF, -0x7FFFFFFF, 0x80000000, 0x100000000, -0x100000000, + ((int64_t)1 << 40) + 7, -(((int64_t)1 << 40) + 7), + (int64_t)(((uint64_t)1 << 63) - 1u), (int64_t)((uint64_t)1 << 63) + }; + uint64_t x = 0xE7037ED1A0B428DBu; + for (unsigned i = 0; i < sizeof qa / sizeof qa[0] + 3000u; i++) { + int64_t q; + v4_cell xl, xh, el, eh; + if (i < sizeof qa / sizeof qa[0]) q = qa[i]; + else { + x ^= x << 13; x ^= x >> 7; x ^= x << 17; + q = (int64_t)asr64(x, (unsigned)(x & 63u)); /* every size, both signs */ + if (i & 1u) q %= 1000000; /* and a few turns of the circle */ + } + qcells((uint64_t)q, &xl, &xh); + CHECK(call(w_qreduce, 2, xl, xh, 0) && left1((v4_cell)v3_q48_reduce(q)), + "(Q.REDUCE) [%u] x=%lld", i, (long long)q); + qcells(v3_q48_sin((uint64_t)q), &el, &eh); + CHECK(call(w_qsin, 2, xl, xh, 0) && left2(el, eh), "Q.SIN [%u] x=%lld", i, (long long)q); + } + } + /* Q./ at the overflow boundary: |a| * 2^16 against |b| * 2^(2N-1), for * divisors around 2^16 and 2^17, every sign. */ { @@ -2451,6 +2616,13 @@ int main(void) }; headroom("Q.LOG", w_qlog, 2, qlog_args, 6, 2, &dh, &rh); CHECK(dh >= 2 && rh >= 2, "Q.LOG leaves room"); + static const v4_cell qtrig_args[][4] = { + { 0, 0, 0, 0 }, { 0x10000, 0, 0, 0 }, { -0x10000, -1, 0, 0 }, { 205887, 0, 0, 0 }, + { -1, 0x7FFF, 0, 0 }, { 5, -3, 0, 0 } + }; + headroom("(Q.REDUCE)", w_qreduce, 2, qtrig_args, 6, 1, &dh, &rh); + headroom("Q.SIN", w_qsin, 2, qtrig_args, 6, 2, &dh, &rh); + CHECK(dh >= 2 && rh >= 2, "Q.SIN leaves room"); headroom("SM/REM", w_smrem, 3, smrem_args, 5, 2, &dh, &rh); CHECK(rh >= 1, "SM/REM leaves room for /MOD's return address"); headroom("/MOD", w_slashmod, 2, slashmod_args, 4, 2, &dh, &rh); -- 2.54.0 From 8235078b3b5f33ab3f391158eeba2eebcd682346 Mon Sep 17 00:00:00 2001 From: rajames Date: Sat, 3 Oct 2026 10:53:52 -0400 Subject: [PATCH 026/135] feat(v4.0.0): Q.COS, bit for bit with v3 Q.COS is v3's q48_cos_approx: on |(Q.REDUCE) x|, the even Taylor series to n = 10. It sets term and sum to 1.0, n to 2 and the sign cell to 0, then jumps into Q.SIN's loop, so it adds no call level. Checked bit for bit against v3's q48_cos_approx (ported into the test) on the same 33 edge angles and 3000 pseudo-random angles as Q.SIN, at 32- and 64-bit cells, optimised and ASan+UBSan (`make test`, `make sanitize`). Mutating the start index, the start sum, the alternation or the sign cell each fails 2500+ cosine checks and no sine checks. Headroom (data under arg / return): Q.COS 3/2. Test results on the amd64 host only. This is a development check, not acceptance (JUSTIFICATION.md section 16). Co-Authored-By: Claude Opus 5.5 --- docs/v4.0.0/DECOMPOSITION.md | 6 ++-- v4/tests/test_foundation.c | 55 ++++++++++++++++++++++++++++++++---- 2 files changed, 53 insertions(+), 8 deletions(-) diff --git a/docs/v4.0.0/DECOMPOSITION.md b/docs/v4.0.0/DECOMPOSITION.md index 895cbd90..e4ad39bf 100644 --- a/docs/v4.0.0/DECOMPOSITION.md +++ b/docs/v4.0.0/DECOMPOSITION.md @@ -147,8 +147,8 @@ IF body1 ELSE body2 THEN → if L1 drop body1 jump L2 times, as on the F18. `FOR ... UNEXT` is the same but the body must fit in one instruction word. **Register conventions.** `A` and `B` are caller-saved. A word that uses them says so. Words in this -document that clobber `A`: `@ ! +! -! 2@ 2! C@ C! UM* * UM/MOD Q.FROM-INT Q.TO-INT Q.* Q./ Q.EXP Q.SQRT Q.LOG Q.SIN SEND RECV`. Words that clobber `B`: -`Q./ Q.EXP Q.SQRT Q.LOG Q.SIN SEND RECV`. +document that clobber `A`: `@ ! +! -! 2@ 2! C@ C! UM* * UM/MOD Q.FROM-INT Q.TO-INT Q.* Q./ Q.EXP Q.SQRT Q.LOG Q.SIN Q.COS SEND RECV`. Words that clobber `B`: +`Q./ Q.EXP Q.SQRT Q.LOG Q.SIN Q.COS SEND RECV`. **Return-stack words** (`>R R> R@ 2>R 2R> 2R@ I J UNLOOP` and the loop runtimes) are always IN. @@ -664,7 +664,7 @@ word. Per D-10 it occupies two cells on a 64-bit node too. Per D-8, v4 Q values | `D2*C` | CAP | `( lo hi cin -- lo' hi' cout )`: the double shifted left one bit, `cin` entering at the bottom and `cout` the bit leaving the top (both 0 or 1). `a! dup -if L1 drop 1 jump L2 L1: drop 0 L2: push over -if L3 drop 1 jump L4 L3: drop 0 L4: over + + push 2* a + pop pop` — `cin` waits in `A`, and `2hi + m` is `over + +`, so it needs one return entry. Executed on the golden model (2026-10-02). Clobbers `A`. | | `(Q/)` | CAP | Variable, 5 cells: `Q./`'s quotient register, divisor and result sign. Like `BASE` and the hold buffer, it lives in node memory. | | `Q.ABS` `Q.NEG` | CAP | `DABS`, `DNEGATE` — executed on the golden model (2026-10-02) against v3's `q48_abs` and `0 - q`: bit-for-bit at 32-bit cells, including v3's wrap of Q min to itself; at 64-bit cells the low cell is v3's and the high cell is the true sign, per D-10. | -| `Q.COS` | CAP | Algorithm ported from `q48_words.c`; the hosted C version is the golden model. | +| `Q.COS` | CAP | v3's `q48_cos_approx`: on `xu = |(Q.REDUCE) x|`, `1 - xu^2/2! + xu^4/4! - …` to `n = 10`, run by `Q.SIN`'s loop: `(Q.REDUCE) -if A1 inv 1 + A1: 0 (QT) b! !b 0 over 0 Q.* drop (QT) 1 + b! !b 65536 (QT) 2 + b! !b 65536 (QT) 3 + b! !b 2 (QT) 4 + b! !b -1 (QT) 5 + b! !b jump TRIG` — term and sum start at 1.0, `n` at 2, and the sign cell is 0 so nothing is negated at the end. It jumps into the loop rather than calling it, so it costs no extra return entry. Executed on the golden model (2026-10-03): bit for bit v3's result on angles of every size and sign. Leaves its caller 3 data cells under its argument and 2 return entries. Clobbers `A` and `B`. | | `Q.SIN` | CAP | v3's `q48_sin_approx`: on `r = (Q.REDUCE) x` and `xu = |r|`, `xu - xu^3/3! + xu^5/5! - …` to `n = 11`, each term the last times `xu^2` over `n(n-1)`, stopping once a term is below 10 ulp; negated if `r < 0`. After the reduction every value fits one cell, so the variable `(QT)` holds single cells and the only calls are `(Q.REDUCE)`, `Q.*`, `Q./` and `UM*`. The Taylor loop is written so that `Q.COS` can jump into it. Executed on the golden model (2026-10-03): bit for bit v3's result on angles of every size and sign. Leaves its caller 3 data cells under its argument and 2 return entries. Clobbers `A` and `B`. | | `(Q.REDUCE)` | CAP | `( x -- r )`, v3's `q48_reduce_angle`: the angle reduced to one cell, `-pi <= r <= pi` with `pi = 205887`, `2pi = 411774` — the remainder of `x / 2pi` with the sign of `x`, then one step of `2pi` back into range. `x / 2pi` does not fit a cell, but only the remainder is wanted: `|x| mod 2pi` is two `UM/MOD` steps, the high cell first and its remainder then leading the low cell. `dup (QT) b! !b -if L1 DNEGATE L1: 0 411774 UM/MOD drop 411774 UM/MOD drop (QT) b! @b -if P1 drop inv 1 + jump J1 P1: drop J1: dup -205888 + -if BIG drop dup 205887 + -if OK drop 411774 + ; OK: drop ; BIG: drop -411774 + ;` Executed on the golden model (2026-10-03), bit for bit v3's. Clobbers `A` and `B`. | | `(QT)` | CAP | Variable, 6 cells: `Q.SIN` / `Q.COS`'s sign, `x^2`, term, sum, `n` and subtract flag. | diff --git a/v4/tests/test_foundation.c b/v4/tests/test_foundation.c index 197ba5d1..31f99aab 100644 --- a/v4/tests/test_foundation.c +++ b/v4/tests/test_foundation.c @@ -32,8 +32,9 @@ * 0 <= q < 2^48, and for 0 with NODE-ERROR below zero (D-12). * Q.LOG is checked bit for bit against v3's q48_log_approx for x > 0, and * for 0 with NODE-ERROR at or below zero. - * (Q.REDUCE) and Q.SIN are checked bit for bit against v3's - * q48_reduce_angle and q48_sin_approx on angles of every size and sign. Every word is + * (Q.REDUCE), Q.SIN and Q.COS are checked bit for bit against v3's + * q48_reduce_angle, q48_sin_approx and q48_cos_approx on angles of every + * size and sign. Every word is * also probed for how much of the 10- and 9-deep circular stacks (D-2) it * leaves to its caller. * @@ -78,7 +79,7 @@ static v4_cell w_nip, w_swap, w_or, w_negate, w_rot, w_zless, w_zequal, w_slashmod, w_mplus, w_dminus, w_d0equal, w_dequal, w_qfromint, w_qtoint, w_less, w_equal, w_dless, w_2swap, w_2over, w_dmax, w_dmin, w_qgt_doc, w_qgt, w_dltkeep, w_qstar, w_d2starc, w_uqdiv, w_qslash, w_qexp, w_qsqrt, w_qlog, - w_qreduce, w_qsin, l_trig; + w_qreduce, w_qsin, l_trig, w_qcos; #define O(name) v4_asm_op(&as, V4_OP_##name) #define LIT(v) v4_asm_lit(&as, (v4_cell)(v)) @@ -1273,6 +1274,27 @@ static void build(void) O(DROP); LIT(-1); O(SEMI); HERE_(sp); O(DROP); LIT(0); O(SEMI); } + + /* : Q.COS ( x -- cos x ) 5.26, v3's q48_cos_approx + * On xu = |(Q.REDUCE) x|: 1 - xu^2/2! + xu^4/4! - ... to n = 10, by + * Q.SIN's loop: term and sum start at 1.0, n at 2, and the sign cell is + * 0 so nothing is negated at the end. + * (Q.REDUCE) -if A1 inv 1 + A1: xu + * 0 QT b! !b 0 over 0 Q.* drop QT 1 + b! !b x^2 + * 65536 QT 2 + b! !b 65536 QT 3 + b! !b + * 2 QT 4 + b! !b -1 QT 5 + b! !b jump TRIG + * Clobbers A and B. */ + { + v4_asm_ref a1; + w_qcos = v4_asm_label(&as); + CALL(w_qreduce); + a1 = FWD(MINUS_IF); O(INV); LIT(1); O(ADD); HERE_(a1); + LIT(0); VSET(QT); + LIT(0); O(OVER); LIT(0); CALL(w_qstar); O(DROP); VSET(QT + 1); + LIT(65536); VSET(QT + 2); LIT(65536); VSET(QT + 3); + LIT(2); VSET(QT + 4); LIT(-1); VSET(QT + 5); + JUMP_TO(l_trig); + } #undef VSET #undef VGET #undef JUMP_TO @@ -1748,6 +1770,24 @@ static uint64_t v3_q48_sin(uint64_t q) return negative ? (uint64_t)0 - result : result; } +/* v3's q48_cos_approx, verbatim but for the names. */ +static uint64_t v3_q48_cos(uint64_t q) +{ + int64_t x = v3_q48_reduce((int64_t)q); + uint64_t xu = (uint64_t)(x < 0 ? -x : x); + uint64_t x2 = v3_q48_mul(xu, xu); + uint64_t term = 65536, result = term; + int subtract = 1, nn; + for (nn = 2; nn <= 10; nn += 2) { + term = v3_q48_mul(term, x2); + term = v3_q48_div(term, (uint64_t)(nn * (nn - 1)) << 16); + result = subtract ? result - term : result + term; + subtract = !subtract; + if (term < 10) break; + } + return result; +} + /* Stack headroom. Run `word` with `dfill` marked cells under the canary and * `rfill` marked cells under its return address, and report whether the * results, the canary and every marked cell come back intact. The F18 stacks @@ -2468,8 +2508,9 @@ int main(void) } } - /* (Q.REDUCE) and Q.SIN against v3's q48_reduce_angle and q48_sin_approx, - * bit for bit, on angles of every size and sign. */ + /* (Q.REDUCE), Q.SIN and Q.COS against v3's q48_reduce_angle, + * q48_sin_approx and q48_cos_approx, bit for bit, on angles of every size + * and sign. */ { static const int64_t qa[] = { 0, 1, -1, 0x8000, 0x10000, -0x10000, 102943, 102944, -102943, -102944, @@ -2494,6 +2535,8 @@ int main(void) "(Q.REDUCE) [%u] x=%lld", i, (long long)q); qcells(v3_q48_sin((uint64_t)q), &el, &eh); CHECK(call(w_qsin, 2, xl, xh, 0) && left2(el, eh), "Q.SIN [%u] x=%lld", i, (long long)q); + qcells(v3_q48_cos((uint64_t)q), &el, &eh); + CHECK(call(w_qcos, 2, xl, xh, 0) && left2(el, eh), "Q.COS [%u] x=%lld", i, (long long)q); } } @@ -2623,6 +2666,8 @@ int main(void) headroom("(Q.REDUCE)", w_qreduce, 2, qtrig_args, 6, 1, &dh, &rh); headroom("Q.SIN", w_qsin, 2, qtrig_args, 6, 2, &dh, &rh); CHECK(dh >= 2 && rh >= 2, "Q.SIN leaves room"); + headroom("Q.COS", w_qcos, 2, qtrig_args, 6, 2, &dh, &rh); + CHECK(dh >= 2 && rh >= 2, "Q.COS leaves room"); headroom("SM/REM", w_smrem, 3, smrem_args, 5, 2, &dh, &rh); CHECK(rh >= 1, "SM/REM leaves room for /MOD's return address"); headroom("/MOD", w_slashmod, 2, slashmod_args, 4, 2, &dh, &rh); -- 2.54.0 From 13ec4b1b6c7e7c5007894946fb7cde61c69e5f6f Mon Sep 17 00:00:00 2001 From: rajames Date: Sat, 3 Oct 2026 11:03:57 -0400 Subject: [PATCH 027/135] test(v4.0.0): execute the in-line constants Q.1, Q.0 and Q.SCALE DECOMPOSITION.md 5.26 gives them fate IN: the compiler places two literals, low cell first. Q.1 and Q.SCALE are `65536 0`, Q.0 is `0 0`; v3's are 65536, 0 and 65536. Each expansion is assembled and run, and checked against v3's value; then in use: Q.1 Q.TO-INT is 1, 1 Q.FROM-INT is Q.1, and q Q.1 Q.* and q Q.0 Q.+ return q for 2000 pseudo-random q plus 0, Q max and Q min. At 32- and 64-bit cells, optimised and ASan+UBSan (`make test`, `make sanitize`). A wrong value in any of the three fails. Test results on the amd64 host only. This is a development check, not acceptance (JUSTIFICATION.md section 16). Co-Authored-By: Claude Opus 5.5 --- docs/v4.0.0/DECOMPOSITION.md | 2 +- v4/tests/test_foundation.c | 53 ++++++++++++++++++++++++++++++++++-- 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/docs/v4.0.0/DECOMPOSITION.md b/docs/v4.0.0/DECOMPOSITION.md index e4ad39bf..3bb171be 100644 --- a/docs/v4.0.0/DECOMPOSITION.md +++ b/docs/v4.0.0/DECOMPOSITION.md @@ -676,7 +676,7 @@ word. Per D-10 it occupies two cells on a 64-bit node too. Per D-8, v4 Q values | `(QE)` | CAP | Variable, 8 cells: `Q.EXP`'s `x`, term, sum, sign and term index. | | `Q.FROM-INT` | CAP | `push 0 a! 0 pop 15 FOR +* UNEXT push drop a pop` — `n * 2^16` as a signed double. `+*` with `S = 0` never adds, so each step is an exact arithmetic right shift of `T:A`; starting from `T:A = n:0` (that is, `n * 2^N`) and shifting `N-16` bits leaves `n * 2^16`. The count is `N-17`: 15 at 32-bit cells, 47 at 64. Negative values are no longer clamped to 0. Executed on the golden model (2026-10-02): matches v3's `q48_from_u64` for `n >= 0` (at 64-bit cells in the low cell, where v3 wraps for `n >= 2^47`, per D-10). Clobbers `A`. | | `Q.TO-INT` | CAP | `push a! 0 pop 15 FOR +* UNEXT drop drop a` — the same `+*` shift, 16 bits at every cell width, leaving the low cell in `A`. Rounds toward minus infinity, as v3's arithmetic shift does (−1.5 gives −2). Executed on the golden model (2026-10-02): v3's `q48_to_u64` exactly at 64-bit cells, its low cell at 32. Clobbers `A`. | -| `Q.1` `Q.0` `Q.SCALE` | IN | Double-cell constants. | +| `Q.1` `Q.0` `Q.SCALE` | IN | Double-cell constants, placed in line as two literals, low cell first: `Q.1` and `Q.SCALE` are `65536 0` (1.0), `Q.0` is `0 0`. v3's are 65536, 0 and 65536. Executed on the golden model (2026-10-03): the values match v3's, `Q.1 Q.TO-INT` is 1, `1 Q.FROM-INT` is `Q.1`, and `q Q.1 Q.*` and `q Q.0 Q.+` return `q`. | | `Q.=` `Q.<` `Q.>` `Q.0=` `Q.MAX` `Q.MIN` | CAP | `D=`, `D<`, `2SWAP D<` (for `Q.>`), `D0=`, `DMAX`, `DMIN`. Signed (D-8); v3 compared unsigned, so v3 agrees only when both values have the same sign. Executed on the golden model (2026-10-02). `Q.>` was given here as `SWAP D<`, which swaps single cells, not Q values, and gave a wrong answer in 11702 of 20169 test cases. | | `Q.PRINT` | CAP | Pictured output, five fractional digits. | diff --git a/v4/tests/test_foundation.c b/v4/tests/test_foundation.c index 31f99aab..c6b0b1d9 100644 --- a/v4/tests/test_foundation.c +++ b/v4/tests/test_foundation.c @@ -34,7 +34,8 @@ * for 0 with NODE-ERROR at or below zero. * (Q.REDUCE), Q.SIN and Q.COS are checked bit for bit against v3's * q48_reduce_angle, q48_sin_approx and q48_cos_approx on angles of every - * size and sign. Every word is + * size and sign. The in-line constants Q.1, Q.0 and Q.SCALE are checked + * against v3's values and in use. Every word is * also probed for how much of the 10- and 9-deep circular stacks (D-2) it * leaves to its caller. * @@ -79,7 +80,8 @@ static v4_cell w_nip, w_swap, w_or, w_negate, w_rot, w_zless, w_zequal, w_slashmod, w_mplus, w_dminus, w_d0equal, w_dequal, w_qfromint, w_qtoint, w_less, w_equal, w_dless, w_2swap, w_2over, w_dmax, w_dmin, w_qgt_doc, w_qgt, w_dltkeep, w_qstar, w_d2starc, w_uqdiv, w_qslash, w_qexp, w_qsqrt, w_qlog, - w_qreduce, w_qsin, l_trig, w_qcos; + w_qreduce, w_qsin, l_trig, w_qcos, + w_q1, w_q0, w_qscale, w_q1_times, w_q0_plus, w_q1_toint, w_one_fromint; #define O(name) v4_asm_op(&as, V4_OP_##name) #define LIT(v) v4_asm_lit(&as, (v4_cell)(v)) @@ -1301,6 +1303,28 @@ static void build(void) #undef HERE_ #undef FWD + /* Q.1, Q.0, Q.SCALE 5.26, fate IN + * In-line double-cell constants: the compiler places two literals, low + * cell first. Q.1 and Q.SCALE are `65536 0` (1.0), Q.0 is `0 0`; v3's + * are 65536, 0 and 65536. Each expansion is assembled here followed by + * `;` so that it can be run, and then in the middle of a definition, as + * it would be used: + * Q.1 Q.* ( q -- q ) Q.0 Q.+ ( q -- q ) + * Q.1 Q.TO-INT ( -- 1 ) 1 Q.FROM-INT ( -- q ), which must be Q.1 */ +#define Q_ONE() do { LIT(65536); LIT(0); } while (0) +#define Q_ZERO() do { LIT(0); LIT(0); } while (0) +#define Q_SCALE() do { LIT(65536); LIT(0); } while (0) + w_q1 = v4_asm_label(&as); Q_ONE(); O(SEMI); + w_q0 = v4_asm_label(&as); Q_ZERO(); O(SEMI); + w_qscale = v4_asm_label(&as); Q_SCALE(); O(SEMI); + w_q1_times = v4_asm_label(&as); Q_ONE(); CALL(w_qstar); O(SEMI); + w_q0_plus = v4_asm_label(&as); Q_ZERO(); CALL(w_dplus); O(SEMI); + w_q1_toint = v4_asm_label(&as); Q_ONE(); CALL(w_qtoint); O(SEMI); + w_one_fromint = v4_asm_label(&as); LIT(1); CALL(w_qfromint); O(SEMI); +#undef Q_SCALE +#undef Q_ZERO +#undef Q_ONE + CHECK(v4_asm_ok(&as), "foundation words assemble"); } @@ -2540,6 +2564,31 @@ int main(void) } } + /* Q.1, Q.0 and Q.SCALE: v3's values, and how they behave in use. */ + { + v4_cell ol, oh, zl, zh; + uint64_t x = 0x8EBC6AF09C88C6E3u; + qcells(65536u, &ol, &oh); /* v3 Q.1 and Q.SCALE */ + qcells(0u, &zl, &zh); /* v3 Q.0 */ + CHECK(call(w_q1, 0, 0, 0, 0) && left2(ol, oh), "Q.1 is v3's 65536"); + CHECK(call(w_q0, 0, 0, 0, 0) && left2(zl, zh), "Q.0 is v3's 0"); + CHECK(call(w_qscale, 0, 0, 0, 0) && left2(ol, oh), "Q.SCALE is v3's 65536"); + CHECK(call(w_q1_toint, 0, 0, 0, 0) && left1(1), "Q.1 Q.TO-INT is 1"); + CHECK(call(w_one_fromint, 0, 0, 0, 0) && left2(ol, oh), "1 Q.FROM-INT is Q.1"); + for (unsigned i = 0; i < 2000; i++) { + uint64_t q; + v4_cell ql, qh; + x ^= x << 13; x ^= x >> 7; x ^= x << 17; + q = asr64(x, (unsigned)(x & 63u)); + if (i == 0) q = 0; + if (i == 1) q = ((uint64_t)1 << 63) - 1u; + if (i == 2) q = (uint64_t)1 << 63; + qcells(q, &ql, &qh); + CHECK(call(w_q1_times, 2, ql, qh, 0) && left2(ql, qh), "q Q.1 Q.* is q [%u]", i); + CHECK(call(w_q0_plus, 2, ql, qh, 0) && left2(ql, qh), "q Q.0 Q.+ is q [%u]", i); + } + } + /* Q./ at the overflow boundary: |a| * 2^16 against |b| * 2^(2N-1), for * divisors around 2^16 and 2^17, every sign. */ { -- 2.54.0 From f030edcd082feea6c2f5d5df723e7262a86aa2b7 Mon Sep 17 00:00:00 2001 From: rajames Date: Sat, 3 Oct 2026 11:10:03 -0400 Subject: [PATCH 028/135] test(v4.0.0): execute LSHIFT and RSHIFT on the golden model Both run exactly as written in DECOMPOSITION.md 5.5 and need no change. Checked against C on the edge vectors for every count 0 .. N (a count of N gives 0), at 32- and 64-bit cells, optimised and ASan+UBSan (`make test`, `make sanitize`). Removing RSHIFT's sign-bit mask fails. Headroom (data under args / return): 7/5 each. They are dependencies of C@ and C!, which the pictured-output hold buffer needs. Test results on the amd64 host only. This is a development check, not acceptance (JUSTIFICATION.md section 16). Co-Authored-By: Claude Opus 5.5 --- docs/v4.0.0/DECOMPOSITION.md | 4 ++-- v4/tests/test_foundation.c | 43 +++++++++++++++++++++++++++++++++++- 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/docs/v4.0.0/DECOMPOSITION.md b/docs/v4.0.0/DECOMPOSITION.md index 3bb171be..8c66fa0f 100644 --- a/docs/v4.0.0/DECOMPOSITION.md +++ b/docs/v4.0.0/DECOMPOSITION.md @@ -379,8 +379,8 @@ Section numbers match the v3 primitive reference. | `OR` | CAP | §4 | | `INVERT` | OP | `inv` | | `NOT` | CAP | `0=` (FORTH-79 logical not, as in v3) | -| `LSHIFT` | CAP | `BEGIN dup WHILE 1- SWAP 2* SWAP REPEAT drop` | -| `RSHIFT` | CAP | `BEGIN dup WHILE 1- SWAP 2/ MSB inv and SWAP REPEAT drop` (clears the sign bit each step; `MSB` is the cell-width top-bit constant) | +| `LSHIFT` | CAP | `BEGIN dup WHILE 1- SWAP 2* SWAP REPEAT drop` — executed on the golden model (2026-10-03). | +| `RSHIFT` | CAP | `BEGIN dup WHILE 1- SWAP 2/ MSB inv and SWAP REPEAT drop` (clears the sign bit each step; `MSB` is the cell-width top-bit constant) — executed on the golden model (2026-10-03). | | `0=` `0<` | CAP | §4 | | `0<>` | CAP | `0= 0=` | | `0>` | CAP | `dup 0< SWAP 0= OR 0=` (correct for the most negative number) | diff --git a/v4/tests/test_foundation.c b/v4/tests/test_foundation.c index c6b0b1d9..991b0482 100644 --- a/v4/tests/test_foundation.c +++ b/v4/tests/test_foundation.c @@ -81,7 +81,8 @@ static v4_cell w_nip, w_swap, w_or, w_negate, w_rot, w_zless, w_zequal, w_qfromint, w_qtoint, w_less, w_equal, w_dless, w_2swap, w_2over, w_dmax, w_dmin, w_qgt_doc, w_qgt, w_dltkeep, w_qstar, w_d2starc, w_uqdiv, w_qslash, w_qexp, w_qsqrt, w_qlog, w_qreduce, w_qsin, l_trig, w_qcos, - w_q1, w_q0, w_qscale, w_q1_times, w_q0_plus, w_q1_toint, w_one_fromint; + w_q1, w_q0, w_qscale, w_q1_times, w_q0_plus, w_q1_toint, w_one_fromint, + w_lshift, w_rshift; #define O(name) v4_asm_op(&as, V4_OP_##name) #define LIT(v) v4_asm_lit(&as, (v4_cell)(v)) @@ -1325,6 +1326,32 @@ static void build(void) #undef Q_ZERO #undef Q_ONE + /* : LSHIFT ( x n -- x<>n ) BEGIN dup WHILE 1- SWAP 2/ MSB inv and SWAP REPEAT drop ; + * As written. Section 2 expands BEGIN ... WHILE ... REPEAT as it does IF: + * L0: dup if L1 drop jump L0 L1: drop + * 1- is in line (-1 +); SWAP is a call. */ + { + v4_cell l0; + v4_asm_ref l1; + w_lshift = v4_asm_label(&as); + l0 = v4_asm_label(&as); + O(DUP); l1 = v4_asm_branch_fwd(&as, V4_OP_IF); + O(DROP); LIT(-1); O(ADD); CALL(w_swap); O(TWO_STAR); CALL(w_swap); + v4_asm_branch(&as, V4_OP_JUMP, l0); + v4_asm_resolve(&as, l1, v4_asm_label(&as)); + O(DROP); O(DROP); O(SEMI); + + w_rshift = v4_asm_label(&as); + l0 = v4_asm_label(&as); + O(DUP); l1 = v4_asm_branch_fwd(&as, V4_OP_IF); + O(DROP); LIT(-1); O(ADD); CALL(w_swap); + O(TWO_SLASH); LIT((v4_cell)V4_MSB); O(INV); O(AND); CALL(w_swap); + v4_asm_branch(&as, V4_OP_JUMP, l0); + v4_asm_resolve(&as, l1, v4_asm_label(&as)); + O(DROP); O(DROP); O(SEMI); + } + CHECK(v4_asm_ok(&as), "foundation words assemble"); } @@ -2589,6 +2616,17 @@ int main(void) } } + /* LSHIFT and RSHIFT as written, against C, for every count 0 .. N (a + * count of N must give 0). */ + for (unsigned i = 0; i < NVEC; i++) + for (unsigned c = 0; c <= V4_CELL_BITS; c++) { + v4_ucell u = (v4_ucell)vec[i]; + v4_ucell l = c < V4_CELL_BITS ? u << c : 0u; + v4_ucell r = c < V4_CELL_BITS ? u >> c : 0u; + CHECK(call(w_lshift, 2, vec[i], (v4_cell)c, 0) && left1((v4_cell)l), "LSHIFT [%u,%u]", i, c); + CHECK(call(w_rshift, 2, vec[i], (v4_cell)c, 0) && left1((v4_cell)r), "RSHIFT [%u,%u]", i, c); + } + /* Q./ at the overflow boundary: |a| * 2^16 against |b| * 2^(2N-1), for * divisors around 2^16 and 2^17, every sign. */ { @@ -2717,6 +2755,9 @@ int main(void) CHECK(dh >= 2 && rh >= 2, "Q.SIN leaves room"); headroom("Q.COS", w_qcos, 2, qtrig_args, 6, 2, &dh, &rh); CHECK(dh >= 2 && rh >= 2, "Q.COS leaves room"); + static const v4_cell shift_args[][4] = { { -1, 0, 0, 0 }, { -1, 5, 0, 0 }, { 12345, 31, 0, 0 } }; + headroom("LSHIFT", w_lshift, 2, shift_args, 3, 1, &dh, &rh); + headroom("RSHIFT", w_rshift, 2, shift_args, 3, 1, &dh, &rh); headroom("SM/REM", w_smrem, 3, smrem_args, 5, 2, &dh, &rh); CHECK(rh >= 1, "SM/REM leaves room for /MOD's return address"); headroom("/MOD", w_slashmod, 2, slashmod_args, 4, 2, &dh, &rh); -- 2.54.0 From 2e4d1330ea09503ad3afa708e5b31727d54c0b2f Mon Sep 17 00:00:00 2001 From: rajames Date: Sat, 3 Oct 2026 11:16:16 -0400 Subject: [PATCH 029/135] test(v4.0.0): execute C@ and C! on the golden model Both run exactly as written in DECOMPOSITION.md 5.3 and need no change: four bytes to a cell, little-endian, byte address = 4 * word address + byte index, at either cell width. Checked at 32- and 64-bit cells, optimised and ASan+UBSan (`make test`, `make sanitize`): every byte of two adjacent words, eight values including ones wider than a byte, with the other bytes of the word, the upper half of a 64-bit cell and the neighbouring words left untouched. Breaking C!'s mask or C@'s mask fails. Headroom (data under args / return): C@ 6/4, C! 5/4. Test results on the amd64 host only. This is a development check, not acceptance (JUSTIFICATION.md section 16). Co-Authored-By: Claude Opus 5.5 --- docs/v4.0.0/DECOMPOSITION.md | 8 +++--- v4/tests/test_foundation.c | 50 +++++++++++++++++++++++++++++++++++- 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/docs/v4.0.0/DECOMPOSITION.md b/docs/v4.0.0/DECOMPOSITION.md index 8c66fa0f..170ce5e9 100644 --- a/docs/v4.0.0/DECOMPOSITION.md +++ b/docs/v4.0.0/DECOMPOSITION.md @@ -330,15 +330,17 @@ Section numbers match the v3 primitive reference. | `-!` | CAP | `a! NEGATE @ + !` | | `2@` | CAP | `a! @+ @` (low cell at `addr`, high at `addr+1`, as in v3) | | `2!` | CAP | `a! SWAP !+ !` | -| `C@` | CAP | See below (D-1). | -| `C!` | CAP | See below (D-1). | +| `C@` | CAP | See below (D-1). Executed on the golden model (2026-10-03). | +| `C!` | CAP | See below (D-1). Executed on the golden model (2026-10-03). | | `FILL` | CAP | See below. | | `MOVE` | CAP | `push 2DUP U< IF pop CMOVE> ELSE pop CMOVE THEN` | | `ERASE` | CAP | `0 FILL` | | `CELLS` | IN | Empty (word-addressed). Becomes `2* 2*` if D-1 chooses bytes. | ```forth -\ byte access on a word-addressed node, little-endian +\ byte access on a word-addressed node, little-endian: four bytes to a cell at +\ either cell width (so compiled code is the same, D-9), byte address = 4 * word +\ address + byte index. `@` and `!` inside are the opcodes, addressing through A. : C@ ( baddr -- c ) dup 3 and 3 LSHIFT SWAP 2 RSHIFT a! @ SWAP RSHIFT 255 and ; diff --git a/v4/tests/test_foundation.c b/v4/tests/test_foundation.c index 991b0482..25bc2b3e 100644 --- a/v4/tests/test_foundation.c +++ b/v4/tests/test_foundation.c @@ -66,6 +66,8 @@ static int failures = 0, checks = 0; #define QL ((v4_cell)(V4_NODE_WORDS - 32u)) /* (QT), Q.SIN / Q.COS's 6-cell variable: sign, x^2, term, sum, n, subtract. */ #define QT ((v4_cell)(V4_NODE_WORDS - 40u)) +/* Scratch words for the byte-access tests. */ +#define BYTES ((v4_cell)(V4_NODE_WORDS - 48u)) #define MAXU ((v4_ucell)~(v4_ucell)0) #define FLAG(c) ((c) ? V4_ALL_ONES : (v4_cell)0) @@ -82,7 +84,7 @@ static v4_cell w_nip, w_swap, w_or, w_negate, w_rot, w_zless, w_zequal, w_dmax, w_dmin, w_qgt_doc, w_qgt, w_dltkeep, w_qstar, w_d2starc, w_uqdiv, w_qslash, w_qexp, w_qsqrt, w_qlog, w_qreduce, w_qsin, l_trig, w_qcos, w_q1, w_q0, w_qscale, w_q1_times, w_q0_plus, w_q1_toint, w_one_fromint, - w_lshift, w_rshift; + w_lshift, w_rshift, w_cfetch, w_cstore; #define O(name) v4_asm_op(&as, V4_OP_##name) #define LIT(v) v4_asm_lit(&as, (v4_cell)(v)) @@ -1352,6 +1354,26 @@ static void build(void) O(DROP); O(DROP); O(SEMI); } + /* Byte access on a word-addressed node (D-1), as written in 5.3: four + * bytes to a cell, little-endian; a byte address is 4 * word address + + * byte index. `@` and `!` here are the opcodes, addressing through A. + * : C@ ( baddr -- c ) + * dup 3 and 3 LSHIFT SWAP 2 RSHIFT a! @ SWAP RSHIFT 255 and ; + * : C! ( c baddr -- ) + * dup 2 RSHIFT a! 3 and 3 LSHIFT SWAP 255 and over LSHIFT + * SWAP 255 SWAP LSHIFT inv @ and OR ! ; */ + w_cfetch = v4_asm_label(&as); + O(DUP); LIT(3); O(AND); LIT(3); CALL(w_lshift); + CALL(w_swap); LIT(2); CALL(w_rshift); O(BANG_A); O(FETCH_A); + CALL(w_swap); CALL(w_rshift); LIT(255); O(AND); O(SEMI); + + w_cstore = v4_asm_label(&as); + O(DUP); LIT(2); CALL(w_rshift); O(BANG_A); + LIT(3); O(AND); LIT(3); CALL(w_lshift); + CALL(w_swap); LIT(255); O(AND); O(OVER); CALL(w_lshift); + CALL(w_swap); LIT(255); CALL(w_swap); CALL(w_lshift); O(INV); + O(FETCH_A); O(AND); CALL(w_or); O(STORE_A); O(SEMI); + CHECK(v4_asm_ok(&as), "foundation words assemble"); } @@ -2627,6 +2649,28 @@ int main(void) CHECK(call(w_rshift, 2, vec[i], (v4_cell)c, 0) && left1((v4_cell)r), "RSHIFT [%u,%u]", i, c); } + /* C@ and C! as written: every byte of two adjacent words, several + * values, the other bytes and the neighbouring words left alone. */ + { + static const v4_ucell cv[] = { 0, 1, 0x41, 0x7F, 0x80, 0xFF, 0x1FF, 0xABCD }; + const v4_ucell pat = (v4_ucell)0xA5C3F00Fu | ((MAXU >> 16 >> 16) << 16 << 16); + for (unsigned b = 0; b < 8; b++) + for (unsigned k = 0; k < sizeof cv / sizeof cv[0]; k++) { + v4_cell w = BYTES + 1 + (v4_cell)(b / 4u); + unsigned sh = 8u * (b % 4u); + v4_ucell want = (pat & ~((v4_ucell)0xFFu << sh)) | ((cv[k] & 0xFFu) << sh); + v4_cell baddr = (BYTES + 1) * 4 + (v4_cell)b; + for (unsigned j = 0; j < 4; j++) v4_node_store(&n, BYTES + (v4_cell)j, (v4_cell)pat); + CHECK(call(w_cstore, 2, (v4_cell)cv[k], baddr, 0) && n.ds.t == CANARY, + "C! returns [%u,%u]", b, k); + CHECK((v4_ucell)v4_node_load(&n, w) == want, "C! stores [%u,%u]", b, k); + for (unsigned j = 0; j < 4; j++) + if (BYTES + (v4_cell)j != w) + CHECK((v4_ucell)v4_node_load(&n, BYTES + (v4_cell)j) == pat, "C! neighbours [%u,%u,%u]", b, k, j); + CHECK(call(w_cfetch, 1, baddr, 0, 0) && left1((v4_cell)(cv[k] & 0xFFu)), "C@ [%u,%u]", b, k); + } + } + /* Q./ at the overflow boundary: |a| * 2^16 against |b| * 2^(2N-1), for * divisors around 2^16 and 2^17, every sign. */ { @@ -2758,6 +2802,10 @@ int main(void) static const v4_cell shift_args[][4] = { { -1, 0, 0, 0 }, { -1, 5, 0, 0 }, { 12345, 31, 0, 0 } }; headroom("LSHIFT", w_lshift, 2, shift_args, 3, 1, &dh, &rh); headroom("RSHIFT", w_rshift, 2, shift_args, 3, 1, &dh, &rh); + static const v4_cell cf_args[][4] = { { (V4_NODE_WORDS - 47) * 4 + 3, 0, 0, 0 }, { (V4_NODE_WORDS - 47) * 4, 0, 0, 0 } }; + static const v4_cell cs_args[][4] = { { 0x41, (V4_NODE_WORDS - 47) * 4 + 3, 0, 0 }, { 0xFF, (V4_NODE_WORDS - 47) * 4, 0, 0 } }; + headroom("C@", w_cfetch, 1, cf_args, 2, 1, &dh, &rh); + headroom("C!", w_cstore, 2, cs_args, 2, 0, &dh, &rh); headroom("SM/REM", w_smrem, 3, smrem_args, 5, 2, &dh, &rh); CHECK(rh >= 1, "SM/REM leaves room for /MOD's return address"); headroom("/MOD", w_slashmod, 2, slashmod_args, 4, 2, &dh, &rh); -- 2.54.0 From 6a019b8968d5cd1ac5042b359202506089a9dd52 Mon Sep 17 00:00:00 2001 From: rajames Date: Sat, 3 Oct 2026 11:37:08 -0400 Subject: [PATCH 030/135] feat(v4.0.0): pictured output <# # #S HOLD SIGN #>; D-13 DECOMPOSITION.md 5.8 only named these as "standard pictured-output definitions over UM/MOD and a hold buffer". They are now written out (5.8) and run on the golden model. D-13 (ruled 2026-10-03): the hold buffer takes 63 characters, as v3's; HOLD of a value outside 0-255, or into a full buffer, stores nothing and sets NODE-ERROR, which is what v3 did with its error flag. Behaviour follows v3 otherwise: digits 0-9 then A-Z, BASE outside 2..36 reads as 10, SIGN ( n -- ). Stack effects are the standard ones, as 5.8 already ruled (v3 took its double low cell on top). The buffer is 64 bytes, filled backwards from its end through HLD; `#` divides by the base in two UM/MOD steps. HOLD, SIGN and # end in a jump to the next word instead of a call, which saves two return-stack entries: with calls, the signed picture `.` needs overflowed the 9-deep return stack. New test file v4/tests/test_pictured.c, on a node of its own: test_foundation.c's hand-assembled words already fill 901 of a node's 1024 words. It re-assembles SWAP, OR, UM/MOD, LSHIFT, RSHIFT and C! as they are in test_foundation.c. Checked against a C reference (short division on 16-bit limbs) at 32- and 64-bit cells, optimised and ASan+UBSan (`make test`, `make sanitize`), 4716 checks per width: <# #S #>, <# # # 46 HOLD #S #> and the signed picture, in bases 10, 16, 2, 8, 36, 3 and the invalid 0, 1, 37, -5, on every pair of 15 edge cells; HOLD of 12 values; and a base-2 number that overflows the buffer (63 characters kept, NODE-ERROR set, nothing outside the buffer written). Six mutations all fail. Headroom: <# #S #> leaves 3 data cells and 2 return entries; the signed picture leaves 1 return entry. The depth is C!'s as written (C! -> LSHIFT -> SWAP), which is unchanged. Test results on the amd64 host only. This is a development check, not acceptance (JUSTIFICATION.md section 16). Co-Authored-By: Claude Opus 5.5 --- docs/v4.0.0/DECOMPOSITION.md | 32 ++- v4/tests/test_pictured.c | 496 +++++++++++++++++++++++++++++++++++ 2 files changed, 524 insertions(+), 4 deletions(-) create mode 100644 v4/tests/test_pictured.c diff --git a/docs/v4.0.0/DECOMPOSITION.md b/docs/v4.0.0/DECOMPOSITION.md index 170ce5e9..5b062896 100644 --- a/docs/v4.0.0/DECOMPOSITION.md +++ b/docs/v4.0.0/DECOMPOSITION.md @@ -147,8 +147,8 @@ IF body1 ELSE body2 THEN → if L1 drop body1 jump L2 times, as on the F18. `FOR ... UNEXT` is the same but the body must fit in one instruction word. **Register conventions.** `A` and `B` are caller-saved. A word that uses them says so. Words in this -document that clobber `A`: `@ ! +! -! 2@ 2! C@ C! UM* * UM/MOD Q.FROM-INT Q.TO-INT Q.* Q./ Q.EXP Q.SQRT Q.LOG Q.SIN Q.COS SEND RECV`. Words that clobber `B`: -`Q./ Q.EXP Q.SQRT Q.LOG Q.SIN Q.COS SEND RECV`. +document that clobber `A`: `@ ! +! -! 2@ 2! C@ C! UM* * UM/MOD Q.FROM-INT Q.TO-INT Q.* Q./ Q.EXP Q.SQRT Q.LOG Q.SIN Q.COS HOLD SIGN # #S SEND RECV`. Words that clobber `B`: +`Q./ Q.EXP Q.SQRT Q.LOG Q.SIN Q.COS <# HOLD SIGN # #S #> SEND RECV`. **Return-stack words** (`>R R> R@ 2>R 2R> 2R@ I J UNLOOP` and the loop runtimes) are always IN. @@ -174,6 +174,7 @@ definition below depends on one, it says so. | **D-10** | Q48.16 width on a 64-bit-cell node (ruled 2026-10-02). | **Two cells at every cell width.** A Q value is a signed double on 32- and 64-bit nodes alike, so every Q word is the same double word at both widths. At 32-bit cells this is bit-for-bit v3's 64-bit Q. At 64-bit cells the low cell is v3's value, and where v3 wraps on Q48.16 overflow (a sum past Q max, `ABS` or `NEG` of Q min) the high cell carries the true result instead. | | **D-11** | `Q./` semantics: division by zero, rounding, overflow (ruled 2026-10-02). | **Saturate and flag; round toward zero; saturate on overflow.** The quotient of `a * 2^16 / b` is rounded toward zero, like `SM/REM`. When it does not fit a Q value it is clamped to Q max or Q min by its sign. Division by zero returns Q max or Q min by the sign of the dividend (`0 / 0` gives 0) and sets the node's `NODE-ERROR` register (§7), which `VM-ERROR?` reads. v3 returned 0 on division by zero and saturated whenever the dividend was 2^48 or more, even when the quotient would have fit. | | **D-12** | Q approximations outside their domain (ruled 2026-10-02). | **Return 0 and set `NODE-ERROR`.** `Q.SQRT` of a negative value and `Q.LOG` of zero or a negative value return 0 and set `NODE-ERROR` (§7), as `Q./` does on division by zero (D-11). v3 returned 0 for `ln(0)` without a flag and read negative arguments as large unsigned values. | +| **D-13** | Pictured-output hold buffer: size and errors (ruled 2026-10-03). | **63 characters, as v3; on error set `NODE-ERROR` and drop the character.** The buffer holds 63 characters at either cell width. `HOLD` of a value outside 0–255, or into a full buffer, stores nothing and sets `NODE-ERROR` (§7), which is v3's behaviour (it set its error flag and dropped the character). A full double in base 2 therefore does not fit, as in v3. | **Consequences of D-2 that every definition must respect.** The data stack holds 10 items and the return stack 9, and every `call`, `FOR`, `DO` loop frame and `push` uses return-stack slots. Nesting @@ -446,7 +447,8 @@ All output reaches the console through `EMIT` (DEV). | Word | Fate | Notes | | --- | --- | --- | -| `<#` `#` `#S` `HOLD` `SIGN` `#>` | CAP | Standard pictured-output definitions over `UM/MOD` and a hold buffer. v3's tolerant `#>` (pops `ud` only if present) is not kept; v4 follows the standard stack effect. | +| `<#` `#` `#S` `HOLD` `SIGN` `#>` | CAP | Pictured output over `UM/MOD` and a 64-byte hold buffer, filled backwards from its end `HEND` through the pointer `HLD`. Standard stack effects (v3 took its double low cell on top, and its tolerant `#>` popped `ud` only if present; neither is kept). Otherwise v3's behaviour: digits `0`–`9` then `A`–`Z`; `BASE` outside 2–36 reads as 10; 63 characters; `HOLD` of a value outside 0–255 or into a full buffer stores nothing and sets `NODE-ERROR` (D-13). Definitions below. Executed on the golden model (2026-10-03) against a C reference in bases 2, 3, 8, 10, 16, 36 and four invalid ones. `<# #S #>` leaves its caller 3 data cells and 2 return entries; the signed picture `dup push ABS 0 <# #S pop SIGN #>` leaves 1 return entry, the depth being `C!`'s as written (`C!` → `LSHIFT` → `SWAP`). `#`, `#S`, `HOLD` and `SIGN` clobber `A` and `B`. | +| `HLD` | CAP | Variable: byte address of the first held character. | | `.` `.R` `U.` `U.R` `D.` `D.R` | CAP | Built on pictured output and `TYPE`. | | `.S` | RET | No visible stack pointer (D-2). | | `?` | CAP | `@ .` | @@ -454,6 +456,28 @@ All output reaches the console through `EMIT` (DEV). | `BASE` | CAP | Variable. | | `DECIMAL` `HEX` `OCTAL` | CAP | `10 BASE !` and so on. | +```forth +\ pictured output. HEND is the byte address just past the hold buffer. +: (BASE) ( -- b ) BASE b! @b dup -2 + -if L1 drop drop 10 ; + L1: drop dup -37 + -if L2 drop ; L2: drop drop 10 ; +: <# ( -- ) HEND HLD b! !b ; +: HOLD ( c -- ) dup -256 and if OKC drop jump ERR + OKC: drop HLD b! @b -(HEND-62) + -if ROOM drop + ERR: drop NODE-ERROR b! -1 !b ; + ROOM: drop HLD b! @b -1 + dup !b jump C! +: SIGN ( n -- ) -if L1 drop 45 jump HOLD L1: drop ; +: # ( ud1 -- ud2 ) + 0 (BASE) UM/MOD push (BASE) UM/MOD pop ROT \ qlo qhi rem + dup -10 + -if L1 drop 48 + jump L2 L1: drop 55 + L2: jump HOLD +: #S ( ud -- 0 0 ) L: # over over OR if L1 drop jump L L1: drop ; +: #> ( ud -- baddr u ) drop drop HLD b! @b HEND over push inv pop + inv ; +``` + +`#` divides the double by the base in two `UM/MOD` steps, the high cell first and its remainder +leading the low cell; the last remainder is the digit. `HOLD`, `SIGN` and `#` end with a jump to the +next word rather than a call, so `C!` returns straight to their caller and two return-stack entries +are saved. `ROT` is in line. + ### 5.9 Strings, parsing, and input | Word | Fate | Notes | @@ -781,4 +805,4 @@ Addresses are assigned in the node memory map (D-4). Names only here. | `GOV-*` | R/W | Governor parameters and Jacquard selector state (`L8-*`, decay rate). | | `REC-ENABLE` | R/W | DoE recorder on/off (`HB-ON` / `HB-OFF`). | | `PORT-STATUS` | R | Per-port ready flags, for non-blocking polls. | -| `NODE-ERROR` | R/W | Arithmetic error flag: set to −1 by `Q./` on division by zero (D-11) and by `Q.SQRT` / `Q.LOG` outside their domain (D-12), cleared by writing 0. `VM-ERROR?` reads it. | +| `NODE-ERROR` | R/W | Arithmetic error flag: set to −1 by `Q./` on division by zero (D-11), by `Q.SQRT` / `Q.LOG` outside their domain (D-12) and by `HOLD` on a bad character or a full buffer (D-13), cleared by writing 0. `VM-ERROR?` reads it. | diff --git a/v4/tests/test_pictured.c b/v4/tests/test_pictured.c new file mode 100644 index 00000000..0df5b10e --- /dev/null +++ b/v4/tests/test_pictured.c @@ -0,0 +1,496 @@ +/* test_pictured.c -- pictured numeric output, executed. + * + * DECOMPOSITION.md 5.8 says only that `<# # #S HOLD SIGN #>` are "standard + * pictured-output definitions over UM/MOD and a hold buffer". This file + * writes them out, assembles them on a node of their own and runs them on + * the golden model against a C reference. + * + * It is a separate file from test_foundation.c because that file's + * hand-assembled words already fill about 900 of a node's 1024 words. The + * words these definitions rest on (SWAP, OR, UM/MOD, LSHIFT, RSHIFT, C!) are + * therefore assembled again here, opcode for opcode as in test_foundation.c, + * where each is tested on its own. + * + * Behaviour follows v3 (v3/src/word_source/format_words.c) with the standard + * stack effects 5.8 rules: digits 0-9 then A-Z; BASE outside 2..36 reads as + * 10; SIGN ( n -- ); the buffer holds 63 characters; HOLD of a value outside + * 0..255, or into a full buffer, stores nothing and sets NODE-ERROR (D-13). + * + * The buffer is filled backwards from its end through the pointer HLD, so + * `#>` returns the byte address of the first character and the count. + */ +#include "v4/asm.h" +#include "v4/testcode.h" +#include +#include +#include + +static int failures = 0, checks = 0; +#define CHECK(c,...) do{checks++; if(!(c)){failures++; printf("FAIL %s:%d: ",__FILE__,__LINE__); printf(__VA_ARGS__); printf("\n");}}while(0) + +#define CANARY ((v4_cell)0x0C0FFEE5) +#define MAXU ((v4_ucell)~(v4_ucell)0) + +/* The memory map is open (D-4); the test puts the variables at the top of + * the node. */ +#define NODE_ERROR ((v4_cell)(V4_NODE_WORDS - 2u)) +#define HBUF ((v4_cell)(V4_NODE_WORDS - 32u)) /* 16 cells = 64 bytes */ +#define HEND ((v4_cell)(HBUF * 4 + 64)) /* byte address past the buffer */ +#define HLD ((v4_cell)(V4_NODE_WORDS - 35u)) /* byte address of the first character */ +#define BASE ((v4_cell)(V4_NODE_WORDS - 34u)) /* the cell at -33, under the buffer, is left free */ +#define HCAP 63 + +static v4_node n; +static v4_exec_state es; +static v4_heat h; +static v4_asm as; + +static v4_cell w_swap, w_or, w_ummod, w_lshift, w_rshift, w_cstore, + w_base, w_begin, w_hold, w_sign, w_hash, w_hashs, w_end, + t_ud, t_signed, t_money, t_hold1; + +#define O(name) v4_asm_op(&as, V4_OP_##name) +#define LIT(v) v4_asm_lit(&as, (v4_cell)(v)) +#define CALL(w) v4_asm_branch(&as, V4_OP_CALL, (w)) +#define FWD(op) v4_asm_branch_fwd(&as, V4_OP_##op) +#define HERE_(r) v4_asm_resolve(&as, (r), v4_asm_label(&as)) +#define VGET(a) do { LIT(a); O(BANG_B); O(FETCH_B); } while (0) +#define VSET(a) do { LIT(a); O(BANG_B); O(STORE_B); } while (0) +#define SWAP_INLINE() do { O(OVER); O(PUSH); O(PUSH); O(DROP); O(RPOP); O(RPOP); } while (0) +#define ROT_INLINE() do { O(PUSH); SWAP_INLINE(); O(RPOP); SWAP_INLINE(); } while (0) +#define SUB_INLINE() do { O(PUSH); O(INV); O(RPOP); O(ADD); O(INV); } while (0) + +/* The words pictured output rests on, as in test_foundation.c. */ +static void build_dependencies(void) +{ + /* : SWAP over push push drop pop pop ; */ + w_swap = v4_asm_label(&as); + O(OVER); O(PUSH); O(PUSH); O(DROP); O(RPOP); O(RPOP); O(SEMI); + + /* : OR over inv and xor ; */ + w_or = v4_asm_label(&as); + O(OVER); O(INV); O(AND); O(XOR); O(SEMI); + + /* : UM/MOD ( ulo uhi ud -- urem uquot ) section 4, call-free */ + { + v4_cell loop, l_sub, l_setbit, l_nosub; + v4_asm_ref r0, r1, r2, r3, r4, r5, r6, to_sub1, to_sub2, to_nosub1, + to_nosub2, to_setbit; + + w_ummod = v4_asm_label(&as); + O(BANG_A); LIT(V4_CELL_BITS - 1); O(PUSH); + loop = v4_asm_label(&as); + r0 = FWD(MINUS_IF); + O(TWO_STAR); O(OVER); + r1 = FWD(MINUS_IF); + O(DROP); LIT(1); O(ADD); + r2 = FWD(JUMP); + HERE_(r1); + O(DROP); + HERE_(r2); + O(PUSH); O(TWO_STAR); O(RPOP); + to_sub1 = FWD(JUMP); + HERE_(r0); + O(TWO_STAR); O(OVER); + r3 = FWD(MINUS_IF); + O(DROP); LIT(1); O(ADD); + r4 = FWD(JUMP); + HERE_(r3); + O(DROP); + HERE_(r4); + O(PUSH); O(TWO_STAR); O(RPOP); + O(DUP); O(PUSH_A); O(XOR); + r5 = FWD(MINUS_IF); + O(DROP); + to_nosub1 = FWD(MINUS_IF); + to_sub2 = FWD(JUMP); + HERE_(r5); + O(DROP); O(DUP); O(INV); O(PUSH_A); O(ADD); O(INV); + r6 = FWD(MINUS_IF); + O(DROP); + to_nosub2 = FWD(JUMP); + HERE_(r6); + O(PUSH); O(DROP); O(RPOP); + to_setbit = FWD(JUMP); + l_sub = v4_asm_label(&as); + O(INV); O(PUSH_A); O(ADD); O(INV); + l_setbit = v4_asm_label(&as); + O(PUSH); LIT(1); O(ADD); O(RPOP); + l_nosub = v4_asm_label(&as); + v4_asm_branch(&as, V4_OP_NEXT, loop); + O(OVER); O(PUSH); O(PUSH); O(DROP); O(RPOP); O(RPOP); O(SEMI); + + v4_asm_resolve(&as, to_sub1, l_sub); + v4_asm_resolve(&as, to_sub2, l_sub); + v4_asm_resolve(&as, to_setbit, l_setbit); + v4_asm_resolve(&as, to_nosub1, l_nosub); + v4_asm_resolve(&as, to_nosub2, l_nosub); + } + + /* : LSHIFT BEGIN dup WHILE 1- SWAP 2* SWAP REPEAT drop ; + * : RSHIFT BEGIN dup WHILE 1- SWAP 2/ MSB inv and SWAP REPEAT drop ; */ + { + v4_cell l0; + v4_asm_ref l1; + w_lshift = v4_asm_label(&as); + l0 = v4_asm_label(&as); + O(DUP); l1 = FWD(IF); + O(DROP); LIT(-1); O(ADD); CALL(w_swap); O(TWO_STAR); CALL(w_swap); + v4_asm_branch(&as, V4_OP_JUMP, l0); + HERE_(l1); + O(DROP); O(DROP); O(SEMI); + + w_rshift = v4_asm_label(&as); + l0 = v4_asm_label(&as); + O(DUP); l1 = FWD(IF); + O(DROP); LIT(-1); O(ADD); CALL(w_swap); + O(TWO_SLASH); LIT((v4_cell)V4_MSB); O(INV); O(AND); CALL(w_swap); + v4_asm_branch(&as, V4_OP_JUMP, l0); + HERE_(l1); + O(DROP); O(DROP); O(SEMI); + } + + /* : C! ( c baddr -- ) + * dup 2 RSHIFT a! 3 and 3 LSHIFT SWAP 255 and over LSHIFT + * SWAP 255 SWAP LSHIFT inv @ and OR ! ; */ + w_cstore = v4_asm_label(&as); + O(DUP); LIT(2); CALL(w_rshift); O(BANG_A); + LIT(3); O(AND); LIT(3); CALL(w_lshift); + CALL(w_swap); LIT(255); O(AND); O(OVER); CALL(w_lshift); + CALL(w_swap); LIT(255); CALL(w_swap); CALL(w_lshift); O(INV); + O(FETCH_A); O(AND); CALL(w_or); O(STORE_A); O(SEMI); +} + +/* Pictured output, 5.8. */ +static void build_pictured(void) +{ + v4_asm_ref a, b, c; + v4_cell l; + + /* : (BASE) ( -- b ) BASE, or 10 when it is outside 2..36 + * BASE b! @b dup -2 + -if L1 drop drop 10 ; + * L1: drop dup -37 + -if L2 drop ; + * L2: drop drop 10 ; */ + w_base = v4_asm_label(&as); + VGET(BASE); O(DUP); LIT(-2); O(ADD); a = FWD(MINUS_IF); + O(DROP); O(DROP); LIT(10); O(SEMI); + HERE_(a); + O(DROP); O(DUP); LIT(-37); O(ADD); b = FWD(MINUS_IF); + O(DROP); O(SEMI); + HERE_(b); + O(DROP); O(DROP); LIT(10); O(SEMI); + + /* : <# ( -- ) HEND HLD b! !b ; */ + w_begin = v4_asm_label(&as); + LIT(HEND); VSET(HLD); O(SEMI); + + /* : HOLD ( c -- ) D-13 + * dup -256 and if OKC drop jump ERR c outside 0..255 + * OKC: drop HLD b! @b -(HEND-62) + -if ROOM drop 63 held already + * ERR: drop NODE-ERROR b! -1 !b ; + * ROOM: drop HLD b! @b -1 + dup !b jump C! + * The last step is a jump, not a call: C! returns to HOLD's caller. */ + w_hold = v4_asm_label(&as); + O(DUP); LIT(-256); O(AND); a = FWD(IF); + O(DROP); b = FWD(JUMP); + HERE_(a); + O(DROP); VGET(HLD); LIT(-(HEND - 62)); O(ADD); c = FWD(MINUS_IF); + O(DROP); + HERE_(b); + O(DROP); LIT(NODE_ERROR); O(BANG_B); LIT(-1); O(STORE_B); O(SEMI); + HERE_(c); + O(DROP); VGET(HLD); LIT(-1); O(ADD); O(DUP); O(STORE_B); + v4_asm_branch(&as, V4_OP_JUMP, w_cstore); + + /* : SIGN ( n -- ) -if L1 drop 45 jump HOLD L1: drop ; */ + w_sign = v4_asm_label(&as); + a = FWD(MINUS_IF); + O(DROP); LIT(45); v4_asm_branch(&as, V4_OP_JUMP, w_hold); + HERE_(a); + O(DROP); O(SEMI); + + /* : # ( ud1 -- ud2 ) + * ud1 / base in two UM/MOD steps, the high cell first and its remainder + * leading the low cell; the last remainder is the digit. + * 0 (BASE) UM/MOD push (BASE) UM/MOD pop ROT qlo qhi rem + * dup -10 + -if L1 drop 48 + jump L2 L1: drop 55 + L2: jump HOLD */ + w_hash = v4_asm_label(&as); + LIT(0); CALL(w_base); CALL(w_ummod); O(PUSH); + CALL(w_base); CALL(w_ummod); O(RPOP); ROT_INLINE(); + O(DUP); LIT(-10); O(ADD); a = FWD(MINUS_IF); + O(DROP); LIT(48); O(ADD); b = FWD(JUMP); + HERE_(a); + O(DROP); LIT(55); O(ADD); + HERE_(b); + v4_asm_branch(&as, V4_OP_JUMP, w_hold); + + /* : #S ( ud -- 0 0 ) L: # over over OR if L1 drop jump L L1: drop ; */ + w_hashs = v4_asm_label(&as); + l = v4_asm_label(&as); + CALL(w_hash); O(OVER); O(OVER); CALL(w_or); a = FWD(IF); + O(DROP); v4_asm_branch(&as, V4_OP_JUMP, l); + HERE_(a); + O(DROP); O(SEMI); + + /* : #> ( ud -- baddr u ) drop drop HLD b! @b HEND over push inv pop + inv ; */ + w_end = v4_asm_label(&as); + O(DROP); O(DROP); VGET(HLD); LIT(HEND); O(OVER); SUB_INLINE(); O(SEMI); + + /* How they are used. */ + + /* ( ud -- baddr u ) <# #S #> */ + t_ud = v4_asm_label(&as); + CALL(w_begin); CALL(w_hashs); CALL(w_end); O(SEMI); + + /* ( n -- baddr u ) dup push ABS 0 <# #S pop SIGN #> as `.` does */ + t_signed = v4_asm_label(&as); + O(DUP); O(PUSH); + a = FWD(MINUS_IF); O(INV); LIT(1); O(ADD); HERE_(a); + LIT(0); CALL(w_begin); CALL(w_hashs); O(RPOP); CALL(w_sign); CALL(w_end); O(SEMI); + + /* ( ud -- baddr u ) <# # # 46 HOLD #S #> two places, a point, the rest */ + t_money = v4_asm_label(&as); + CALL(w_begin); CALL(w_hash); CALL(w_hash); LIT(46); CALL(w_hold); + CALL(w_hashs); CALL(w_end); O(SEMI); + + /* ( c -- baddr u ) <# HOLD 0 0 #> */ + t_hold1 = v4_asm_label(&as); + CALL(w_begin); CALL(w_hold); LIT(0); LIT(0); CALL(w_end); O(SEMI); +} + +/* ---- running ---------------------------------------------------------- */ + +static int call(v4_cell word, unsigned argc, v4_cell a, v4_cell b) +{ + v4_dstack_reset(&n.ds); + v4_rstack_reset(&n.rs); + v4_exec_reset(&es); + v4_heat_reset(&h); + v4_dstack_push(&n.ds, CANARY); + if (argc > 0) v4_dstack_push(&n.ds, a); + if (argc > 1) v4_dstack_push(&n.ds, b); + return v4_test_call(&n, &es, &h, word, 4000000) > 0; +} + +/* The string `#>` left: its bytes read out of the node, and the canary + * under ( baddr u ). */ +static int result_string(char *out, unsigned cap) +{ + v4_cell u = v4_dstack_pop(&n.ds), baddr = v4_dstack_pop(&n.ds); + unsigned i; + if (v4_dstack_pop(&n.ds) != CANARY) return -1; + if (u < 0 || (unsigned)u >= cap) return -1; + for (i = 0; i < (unsigned)u; i++) { + v4_cell ba = baddr + (v4_cell)i; + v4_ucell w = (v4_ucell)v4_node_load(&n, ba >> 2); + out[i] = (char)((w >> (8u * (unsigned)(ba & 3))) & 0xFFu); + } + out[u] = 0; + return (int)u; +} + +/* Stack headroom, as in test_foundation.c: run `word` with `dfill` marked + * cells under the canary and `rfill` under its return address; the string, + * the canary and every marked cell must come back intact. */ +static int fits(v4_cell word, unsigned argc, v4_cell a, v4_cell b, const char *want, + unsigned dfill, unsigned rfill) +{ + char got[4 * V4_CELL_BITS]; + unsigned i; + v4_dstack_reset(&n.ds); + v4_rstack_reset(&n.rs); + v4_exec_reset(&es); + for (i = 0; i < dfill; i++) v4_dstack_push(&n.ds, (v4_cell)(0x5A000000 + i)); + v4_dstack_push(&n.ds, CANARY); + if (argc > 0) v4_dstack_push(&n.ds, a); + if (argc > 1) v4_dstack_push(&n.ds, b); + for (i = 0; i < rfill; i++) v4_rstack_push(&n.rs, (v4_cell)(0x6B000000 + i)); + if (v4_test_call(&n, &es, &h, word, 4000000) <= 0) return 0; + if (result_string(got, sizeof got) < 0 || strcmp(got, want) != 0) return 0; + for (i = dfill; i-- > 0; ) if (v4_dstack_pop(&n.ds) != (v4_cell)(0x5A000000 + i)) return 0; + for (i = rfill; i-- > 0; ) if (v4_rstack_pop(&n.rs) != (v4_cell)(0x6B000000 + i)) return 0; + return 1; +} +static void headroom(const char *name, v4_cell word, unsigned argc, v4_cell a, v4_cell b, + const char *want, int *dh, int *rh) +{ + int d, r; + for (d = 0; d < V4_DATA_DEPTH; d++) if (!fits(word, argc, a, b, want, (unsigned)d + 1u, 0)) break; + for (r = 0; r < V4_RET_DEPTH; r++) if (!fits(word, argc, a, b, want, 0, (unsigned)r + 1u)) break; + *dh = d; *rh = r; + printf(" %s headroom: data %d below canary, return %d below its return address\n", name, d, r); +} + +/* ---- the C reference ---------------------------------------------------- */ + +#define LIMBS (2 * V4_CELL_BITS / 16) + +/* The digits of the unsigned double hi:lo in `base` (2..36), most + * significant first, "0" for zero, by short division on 16-bit limbs. */ +static unsigned ref_digits(v4_ucell lo, v4_ucell hi, unsigned base, char *out) +{ + uint32_t l[LIMBS]; + char tmp[2 * V4_CELL_BITS + 1]; + unsigned i, len = 0; + for (i = 0; i < LIMBS / 2; i++) { + l[i] = (uint32_t)((lo >> (16 * i)) & 0xFFFFu); + l[i + LIMBS / 2] = (uint32_t)((hi >> (16 * i)) & 0xFFFFu); + } + for (;;) { + uint32_t rem = 0; + int nonzero = 0; + for (i = LIMBS; i-- > 0; ) { + uint32_t v = (rem << 16) | l[i]; + l[i] = v / base; + rem = v % base; + if (l[i]) nonzero = 1; + } + tmp[len++] = (char)(rem < 10 ? '0' + rem : 'A' + (rem - 10)); + if (!nonzero) break; + } + for (i = 0; i < len; i++) out[i] = tmp[len - 1 - i]; + out[len] = 0; + return len; +} + +/* What the buffer holds after the characters of `full` have been held from + * its last to its first: the last HCAP of them, and whether any were + * dropped (D-13). */ +static int ref_truncate(const char *full, char *out) +{ + size_t len = strlen(full); + if (len > HCAP) { strcpy(out, full + (len - HCAP)); return 1; } + strcpy(out, full); + return 0; +} + +static unsigned eff_base(v4_cell b) { return (b < 2 || b > 36) ? 10u : (unsigned)b; } + +static const v4_cell vec[] = { + 0, 1, 2, 9, 10, 35, 36, 255, 12345, -1, -2, -12345, + (v4_cell)(V4_MSB - 1u), (v4_cell)V4_MSB, (v4_cell)(MAXU / 3u) +}; +#define NVEC (sizeof vec / sizeof vec[0]) + +static const v4_cell bases[] = { 10, 16, 2, 8, 36, 3, 0, 1, 37, -5 }; +#define NBASE (sizeof bases / sizeof bases[0]) + +int main(void) +{ + char got[4 * V4_CELL_BITS], full[4 * V4_CELL_BITS], want[4 * V4_CELL_BITS]; + + printf("v4 pictured-output tests: V4_CELL_BITS=%d\n", V4_CELL_BITS); + + v4_node_reset(&n); + v4_asm_begin(&as, &n, 16); + build_dependencies(); + build_pictured(); + CHECK(v4_asm_ok(&as), "pictured-output words assemble"); + CHECK(v4_asm_label(&as) < HLD, "code stays below the variables"); + + for (unsigned bi = 0; bi < NBASE; bi++) { + unsigned base = eff_base(bases[bi]); + + /* <# #S #> on unsigned doubles */ + for (unsigned i = 0; i < NVEC; i++) + for (unsigned j = 0; j < NVEC; j++) { + int over; + (void)ref_digits((v4_ucell)vec[i], (v4_ucell)vec[j], base, full); + over = ref_truncate(full, want); + v4_node_store(&n, BASE, bases[bi]); + v4_node_store(&n, NODE_ERROR, 0); + CHECK(call(t_ud, 2, vec[i], vec[j]) && result_string(got, sizeof got) >= 0 + && strcmp(got, want) == 0 + && v4_node_load(&n, NODE_ERROR) == (over ? -1 : 0), + "<# #S #> base %ld [%u,%u]: got \"%s\" want \"%s\"", + (long)bases[bi], i, j, got, want); + + /* <# # # 46 HOLD #S #> */ + { + size_t len = strlen(full); + char pad[4 * V4_CELL_BITS], pic[4 * V4_CELL_BITS]; + if (len < 3) { memset(pad, '0', 3 - len); strcpy(pad + (3 - len), full); } + else strcpy(pad, full); + len = strlen(pad); + memcpy(pic, pad, len - 2); + pic[len - 2] = '.'; + memcpy(pic + len - 1, pad + len - 2, 2); + pic[len + 1] = 0; + over = ref_truncate(pic, want); + v4_node_store(&n, NODE_ERROR, 0); + CHECK(call(t_money, 2, vec[i], vec[j]) && result_string(got, sizeof got) >= 0 + && strcmp(got, want) == 0 + && v4_node_load(&n, NODE_ERROR) == (over ? -1 : 0), + "<# # # . #S #> base %ld [%u,%u]: got \"%s\" want \"%s\"", + (long)bases[bi], i, j, got, want); + } + } + + /* dup push ABS 0 <# #S pop SIGN #> on signed singles */ + for (unsigned i = 0; i < NVEC; i++) { + v4_cell v = vec[i]; + v4_ucell mag = v < 0 ? (v4_ucell)0 - (v4_ucell)v : (v4_ucell)v; + int over; + full[0] = '-'; + (void)ref_digits(mag, 0, base, full + (v < 0 ? 1 : 0)); + over = ref_truncate(full, want); + v4_node_store(&n, BASE, bases[bi]); + v4_node_store(&n, NODE_ERROR, 0); + CHECK(call(t_signed, 1, v, 0) && result_string(got, sizeof got) >= 0 + && strcmp(got, want) == 0 + && v4_node_load(&n, NODE_ERROR) == (over ? -1 : 0), + "signed base %ld [%u]: got \"%s\" want \"%s\"", (long)bases[bi], i, got, want); + } + } + + /* HOLD: any byte is kept; anything else is dropped and flagged. */ + { + static const v4_cell hv[] = { 0, 1, 32, 45, 65, 127, 128, 255, 256, 257, -1, 65536 }; + for (unsigned i = 0; i < sizeof hv / sizeof hv[0]; i++) { + int ok = hv[i] >= 0 && hv[i] <= 255, len; + v4_node_store(&n, NODE_ERROR, 0); + CHECK(call(t_hold1, 1, hv[i], 0), "HOLD returns [%u]", i); + { + v4_cell u = v4_dstack_pop(&n.ds), baddr = v4_dstack_pop(&n.ds); + v4_ucell w = (v4_ucell)v4_node_load(&n, (HEND - 1) >> 2); + len = (int)u; + CHECK(v4_dstack_pop(&n.ds) == CANARY, "HOLD canary [%u]", i); + CHECK(len == (ok ? 1 : 0) && baddr == HEND - len, "HOLD count [%u]: %d", i, len); + if (ok) + CHECK(((w >> (8u * (unsigned)((HEND - 1) & 3))) & 0xFFu) == (v4_ucell)hv[i], + "HOLD stores [%u]", i); + } + CHECK(v4_node_load(&n, NODE_ERROR) == (ok ? 0 : -1), "HOLD NODE-ERROR [%u]", i); + } + } + + /* The cell just below the buffer and the variables above it are never + * written by a number that overflows (base 2, all ones). */ + { + v4_node_store(&n, HBUF - 1, (v4_cell)0x5EED5EED); + v4_node_store(&n, BASE, 2); + v4_node_store(&n, NODE_ERROR, 0); + CHECK(call(t_ud, 2, -1, -1) && result_string(got, sizeof got) == HCAP, + "overflowing number leaves %d characters", HCAP); + CHECK(v4_node_load(&n, NODE_ERROR) == -1, "overflowing number sets NODE-ERROR"); + CHECK(v4_node_load(&n, HBUF - 1) == (v4_cell)0x5EED5EED, "cell below the buffer untouched"); + CHECK(v4_node_load(&n, BASE) == 2, "BASE untouched"); + /* the first byte of the buffer is the one v3 also leaves spare */ + CHECK(v4_node_load(&n, HLD) == HEND - HCAP, "HLD stops one byte above the buffer's start"); + } + + /* What the pictures leave their caller (D-2). */ + { + int dh, rh; + v4_node_store(&n, BASE, 10); + headroom("<# #S #>", t_ud, 2, 12345, 0, "12345", &dh, &rh); + CHECK(dh >= 2 && rh >= 2, "<# #S #> leaves room"); + headroom("signed picture", t_signed, 1, -12345, 0, "-12345", &dh, &rh); + CHECK(dh >= 2 && rh >= 1, "the signed picture leaves room"); + } + + CHECK(v4_node_guards_intact(&n), "guards intact"); + + printf(" %d checks, %d failures\n", checks, failures); + return failures ? 1 : 0; +} -- 2.54.0 From 638aeb66361bf4ee7baad77b9a8426b1481daf42 Mon Sep 17 00:00:00 2001 From: rajames Date: Sat, 3 Oct 2026 11:45:52 -0400 Subject: [PATCH 031/135] feat(v4.0.0): call-free C! C! as written in 5.3 called RSHIFT and LSHIFT (which call SWAP) and OR. It is now one straight-line case per byte position: the byte is shifted up with a `2* unext` loop, that byte of the cell cleared with a constant mask, and the two added. The word address is `2/ 2/` of the byte address. The upper half of a 64-bit cell is still preserved. Headroom (data cells under args / return entries): 5/4 -> 7/7. Same checks as before (every byte of two adjacent words, eight values, neighbours and the upper half untouched) at 32- and 64-bit cells, optimised and ASan+UBSan (`make test`, `make sanitize`). Four mutations fail, one of them only at 64-bit cells, where it differs. test_pictured.c carries the same C!. The pictured words did not gain return-stack room from this: <# #S #> still leaves 2 entries and the signed picture 1. With C! shallow, the deepest point is now inside `#`, which holds the high quotient on the return stack across its second UM/MOD. Recorded in 5.8; `#` is unchanged. Test results on the amd64 host only. This is a development check, not acceptance (JUSTIFICATION.md section 16). Co-Authored-By: Claude Opus 5.5 --- docs/v4.0.0/DECOMPOSITION.md | 19 +++++++++------ v4/tests/test_foundation.c | 45 ++++++++++++++++++++++++++++-------- v4/tests/test_pictured.c | 44 +++++++++++++++++++++++++++-------- 3 files changed, 82 insertions(+), 26 deletions(-) diff --git a/docs/v4.0.0/DECOMPOSITION.md b/docs/v4.0.0/DECOMPOSITION.md index 5b062896..db348f1d 100644 --- a/docs/v4.0.0/DECOMPOSITION.md +++ b/docs/v4.0.0/DECOMPOSITION.md @@ -332,7 +332,7 @@ Section numbers match the v3 primitive reference. | `2@` | CAP | `a! @+ @` (low cell at `addr`, high at `addr+1`, as in v3) | | `2!` | CAP | `a! SWAP !+ !` | | `C@` | CAP | See below (D-1). Executed on the golden model (2026-10-03). | -| `C!` | CAP | See below (D-1). Executed on the golden model (2026-10-03). | +| `C!` | CAP | See below (D-1). Call-free. Executed on the golden model (2026-10-03). | | `FILL` | CAP | See below. | | `MOVE` | CAP | `push 2DUP U< IF pop CMOVE> ELSE pop CMOVE THEN` | | `ERASE` | CAP | `0 FILL` | @@ -345,12 +345,17 @@ Section numbers match the v3 primitive reference. : C@ ( baddr -- c ) dup 3 and 3 LSHIFT SWAP 2 RSHIFT a! @ SWAP RSHIFT 255 and ; +\ C! is call-free: one case per byte position. The byte is shifted up with a +\ 2* loop, that byte of the cell cleared with a constant mask, and the two added. +\ It replaces a version built on LSHIFT, RSHIFT, SWAP and OR calls, which was +\ correct but left its caller 4 return-stack entries; this leaves 7. : C! ( c baddr -- ) - dup 2 RSHIFT a! \ A = word address - 3 and 3 LSHIFT \ c bits - SWAP 255 and over LSHIFT \ bits c' - SWAP 255 SWAP LSHIFT inv \ c' ~mask - @ and OR ! ; + dup 2/ 2/ a! 3 and push 255 and pop \ c' k A: word address + if K0 -1 + if K1 -1 + if K2 + drop 23 FOR 2* UNEXT @ 4278190080 inv and + ! ; \ byte 3 + K2: drop 15 FOR 2* UNEXT @ -16711681 and + ! ; \ byte 2 + K1: drop 7 FOR 2* UNEXT @ -65281 and + ! ; \ byte 1 + K0: drop @ -256 and + ! ; \ byte 0 : FILL ( baddr u c -- ) SWAP BEGIN dup WHILE 1- push 2DUP SWAP C! SWAP 1+ SWAP pop REPEAT 2DROP drop ; @@ -447,7 +452,7 @@ All output reaches the console through `EMIT` (DEV). | Word | Fate | Notes | | --- | --- | --- | -| `<#` `#` `#S` `HOLD` `SIGN` `#>` | CAP | Pictured output over `UM/MOD` and a 64-byte hold buffer, filled backwards from its end `HEND` through the pointer `HLD`. Standard stack effects (v3 took its double low cell on top, and its tolerant `#>` popped `ud` only if present; neither is kept). Otherwise v3's behaviour: digits `0`–`9` then `A`–`Z`; `BASE` outside 2–36 reads as 10; 63 characters; `HOLD` of a value outside 0–255 or into a full buffer stores nothing and sets `NODE-ERROR` (D-13). Definitions below. Executed on the golden model (2026-10-03) against a C reference in bases 2, 3, 8, 10, 16, 36 and four invalid ones. `<# #S #>` leaves its caller 3 data cells and 2 return entries; the signed picture `dup push ABS 0 <# #S pop SIGN #>` leaves 1 return entry, the depth being `C!`'s as written (`C!` → `LSHIFT` → `SWAP`). `#`, `#S`, `HOLD` and `SIGN` clobber `A` and `B`. | +| `<#` `#` `#S` `HOLD` `SIGN` `#>` | CAP | Pictured output over `UM/MOD` and a 64-byte hold buffer, filled backwards from its end `HEND` through the pointer `HLD`. Standard stack effects (v3 took its double low cell on top, and its tolerant `#>` popped `ud` only if present; neither is kept). Otherwise v3's behaviour: digits `0`–`9` then `A`–`Z`; `BASE` outside 2–36 reads as 10; 63 characters; `HOLD` of a value outside 0–255 or into a full buffer stores nothing and sets `NODE-ERROR` (D-13). Definitions below. Executed on the golden model (2026-10-03) against a C reference in bases 2, 3, 8, 10, 16, 36 and four invalid ones. `<# #S #>` leaves its caller 3 data cells and 2 return entries; the signed picture `dup push ABS 0 <# #S pop SIGN #>` leaves 1 return entry. The deepest point is inside `#`, which holds the high quotient on the return stack across its second `UM/MOD`. `#`, `#S`, `HOLD` and `SIGN` clobber `A` and `B`. | | `HLD` | CAP | Variable: byte address of the first held character. | | `.` `.R` `U.` `U.R` `D.` `D.R` | CAP | Built on pictured output and `TYPE`. | | `.S` | RET | No visible stack pointer (D-2). | diff --git a/v4/tests/test_foundation.c b/v4/tests/test_foundation.c index 25bc2b3e..6acb5aaa 100644 --- a/v4/tests/test_foundation.c +++ b/v4/tests/test_foundation.c @@ -1354,25 +1354,50 @@ static void build(void) O(DROP); O(DROP); O(SEMI); } - /* Byte access on a word-addressed node (D-1), as written in 5.3: four + /* Byte access on a word-addressed node (D-1), 5.3 (C@ as written): four * bytes to a cell, little-endian; a byte address is 4 * word address + * byte index. `@` and `!` here are the opcodes, addressing through A. * : C@ ( baddr -- c ) * dup 3 and 3 LSHIFT SWAP 2 RSHIFT a! @ SWAP RSHIFT 255 and ; - * : C! ( c baddr -- ) - * dup 2 RSHIFT a! 3 and 3 LSHIFT SWAP 255 and over LSHIFT - * SWAP 255 SWAP LSHIFT inv @ and OR ! ; */ + * : C! ( c baddr -- ) call-free + * dup 2/ 2/ a! 3 and push 255 and pop c' k A: word address + * if K0 -1 + if K1 -1 + if K2 + * drop 23 FOR 2* UNEXT @ 4278190080 inv and + ! ; byte 3 + * K2: drop 15 FOR 2* UNEXT @ -16711681 and + ! ; byte 2 + * K1: drop 7 FOR 2* UNEXT @ -65281 and + ! ; byte 1 + * K0: drop @ -256 and + ! ; byte 0 + * One case per byte position: the byte is shifted up, that byte of the + * cell cleared with a constant mask, and the two added. */ w_cfetch = v4_asm_label(&as); O(DUP); LIT(3); O(AND); LIT(3); CALL(w_lshift); CALL(w_swap); LIT(2); CALL(w_rshift); O(BANG_A); O(FETCH_A); CALL(w_swap); CALL(w_rshift); LIT(255); O(AND); O(SEMI); - w_cstore = v4_asm_label(&as); - O(DUP); LIT(2); CALL(w_rshift); O(BANG_A); - LIT(3); O(AND); LIT(3); CALL(w_lshift); - CALL(w_swap); LIT(255); O(AND); O(OVER); CALL(w_lshift); - CALL(w_swap); LIT(255); CALL(w_swap); CALL(w_lshift); O(INV); - O(FETCH_A); O(AND); CALL(w_or); O(STORE_A); O(SEMI); + { + v4_asm_ref k0, k1, k2; + w_cstore = v4_asm_label(&as); + O(DUP); O(TWO_SLASH); O(TWO_SLASH); O(BANG_A); + LIT(3); O(AND); O(PUSH); LIT(255); O(AND); O(RPOP); + k0 = v4_asm_branch_fwd(&as, V4_OP_IF); + LIT(-1); O(ADD); k1 = v4_asm_branch_fwd(&as, V4_OP_IF); + LIT(-1); O(ADD); k2 = v4_asm_branch_fwd(&as, V4_OP_IF); + O(DROP); LIT(23); O(PUSH); + (void)v4_asm_label(&as); + O(TWO_STAR); O(UNEXT); + O(FETCH_A); LIT((v4_cell)(v4_ucell)0xFF000000u); O(INV); O(AND); O(ADD); O(STORE_A); O(SEMI); + v4_asm_resolve(&as, k2, v4_asm_label(&as)); + O(DROP); LIT(15); O(PUSH); + (void)v4_asm_label(&as); + O(TWO_STAR); O(UNEXT); + O(FETCH_A); LIT(-16711681); O(AND); O(ADD); O(STORE_A); O(SEMI); + v4_asm_resolve(&as, k1, v4_asm_label(&as)); + O(DROP); LIT(7); O(PUSH); + (void)v4_asm_label(&as); + O(TWO_STAR); O(UNEXT); + O(FETCH_A); LIT(-65281); O(AND); O(ADD); O(STORE_A); O(SEMI); + v4_asm_resolve(&as, k0, v4_asm_label(&as)); + O(DROP); O(FETCH_A); LIT(-256); O(AND); O(ADD); O(STORE_A); O(SEMI); + } CHECK(v4_asm_ok(&as), "foundation words assemble"); } diff --git a/v4/tests/test_pictured.c b/v4/tests/test_pictured.c index 0df5b10e..0a6f1ad5 100644 --- a/v4/tests/test_pictured.c +++ b/v4/tests/test_pictured.c @@ -150,15 +150,41 @@ static void build_dependencies(void) O(DROP); O(DROP); O(SEMI); } - /* : C! ( c baddr -- ) - * dup 2 RSHIFT a! 3 and 3 LSHIFT SWAP 255 and over LSHIFT - * SWAP 255 SWAP LSHIFT inv @ and OR ! ; */ - w_cstore = v4_asm_label(&as); - O(DUP); LIT(2); CALL(w_rshift); O(BANG_A); - LIT(3); O(AND); LIT(3); CALL(w_lshift); - CALL(w_swap); LIT(255); O(AND); O(OVER); CALL(w_lshift); - CALL(w_swap); LIT(255); CALL(w_swap); CALL(w_lshift); O(INV); - O(FETCH_A); O(AND); CALL(w_or); O(STORE_A); O(SEMI); + /* C!, call-free, as in test_foundation.c. + * : C! ( c baddr -- ) call-free + * dup 2/ 2/ a! 3 and push 255 and pop c' k A: word address + * if K0 -1 + if K1 -1 + if K2 + * drop 23 FOR 2* UNEXT @ 4278190080 inv and + ! ; byte 3 + * K2: drop 15 FOR 2* UNEXT @ -16711681 and + ! ; byte 2 + * K1: drop 7 FOR 2* UNEXT @ -65281 and + ! ; byte 1 + * K0: drop @ -256 and + ! ; byte 0 + * One case per byte position: the byte is shifted up, that byte of the + * cell cleared with a constant mask, and the two added. */ + { + v4_asm_ref k0, k1, k2; + w_cstore = v4_asm_label(&as); + O(DUP); O(TWO_SLASH); O(TWO_SLASH); O(BANG_A); + LIT(3); O(AND); O(PUSH); LIT(255); O(AND); O(RPOP); + k0 = v4_asm_branch_fwd(&as, V4_OP_IF); + LIT(-1); O(ADD); k1 = v4_asm_branch_fwd(&as, V4_OP_IF); + LIT(-1); O(ADD); k2 = v4_asm_branch_fwd(&as, V4_OP_IF); + O(DROP); LIT(23); O(PUSH); + (void)v4_asm_label(&as); + O(TWO_STAR); O(UNEXT); + O(FETCH_A); LIT((v4_cell)(v4_ucell)0xFF000000u); O(INV); O(AND); O(ADD); O(STORE_A); O(SEMI); + v4_asm_resolve(&as, k2, v4_asm_label(&as)); + O(DROP); LIT(15); O(PUSH); + (void)v4_asm_label(&as); + O(TWO_STAR); O(UNEXT); + O(FETCH_A); LIT(-16711681); O(AND); O(ADD); O(STORE_A); O(SEMI); + v4_asm_resolve(&as, k1, v4_asm_label(&as)); + O(DROP); LIT(7); O(PUSH); + (void)v4_asm_label(&as); + O(TWO_STAR); O(UNEXT); + O(FETCH_A); LIT(-65281); O(AND); O(ADD); O(STORE_A); O(SEMI); + v4_asm_resolve(&as, k0, v4_asm_label(&as)); + O(DROP); O(FETCH_A); LIT(-256); O(AND); O(ADD); O(STORE_A); O(SEMI); + } } /* Pictured output, 5.8. */ -- 2.54.0 From 7a21f07ad5b393d8992a26b9f721968207522336 Mon Sep 17 00:00:00 2001 From: rajames Date: Sat, 3 Oct 2026 11:51:03 -0400 Subject: [PATCH 032/135] feat(v4.0.0): # keeps its high quotient on the data stack `#` held the high quotient on the return stack across its second UM/MOD, which was the deepest point of pictured output once C! was made call-free. It now rotates it under the division on the data stack (-ROT in line: SWAP push SWAP pop). Headroom, return entries: <# #S #> 2 -> 3, the signed picture 1 -> 2. Data room is unchanged. Same 4716 checks per width at 32- and 64-bit cells, optimised and ASan+UBSan (`make test`, `make sanitize`); the headroom checks now require the new figures. Test results on the amd64 host only. This is a development check, not acceptance (JUSTIFICATION.md section 16). Co-Authored-By: Claude Opus 5.5 --- docs/v4.0.0/DECOMPOSITION.md | 8 +++++--- v4/tests/test_pictured.c | 15 +++++++++------ 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/docs/v4.0.0/DECOMPOSITION.md b/docs/v4.0.0/DECOMPOSITION.md index db348f1d..4d5446b3 100644 --- a/docs/v4.0.0/DECOMPOSITION.md +++ b/docs/v4.0.0/DECOMPOSITION.md @@ -452,7 +452,7 @@ All output reaches the console through `EMIT` (DEV). | Word | Fate | Notes | | --- | --- | --- | -| `<#` `#` `#S` `HOLD` `SIGN` `#>` | CAP | Pictured output over `UM/MOD` and a 64-byte hold buffer, filled backwards from its end `HEND` through the pointer `HLD`. Standard stack effects (v3 took its double low cell on top, and its tolerant `#>` popped `ud` only if present; neither is kept). Otherwise v3's behaviour: digits `0`–`9` then `A`–`Z`; `BASE` outside 2–36 reads as 10; 63 characters; `HOLD` of a value outside 0–255 or into a full buffer stores nothing and sets `NODE-ERROR` (D-13). Definitions below. Executed on the golden model (2026-10-03) against a C reference in bases 2, 3, 8, 10, 16, 36 and four invalid ones. `<# #S #>` leaves its caller 3 data cells and 2 return entries; the signed picture `dup push ABS 0 <# #S pop SIGN #>` leaves 1 return entry. The deepest point is inside `#`, which holds the high quotient on the return stack across its second `UM/MOD`. `#`, `#S`, `HOLD` and `SIGN` clobber `A` and `B`. | +| `<#` `#` `#S` `HOLD` `SIGN` `#>` | CAP | Pictured output over `UM/MOD` and a 64-byte hold buffer, filled backwards from its end `HEND` through the pointer `HLD`. Standard stack effects (v3 took its double low cell on top, and its tolerant `#>` popped `ud` only if present; neither is kept). Otherwise v3's behaviour: digits `0`–`9` then `A`–`Z`; `BASE` outside 2–36 reads as 10; 63 characters; `HOLD` of a value outside 0–255 or into a full buffer stores nothing and sets `NODE-ERROR` (D-13). Definitions below. Executed on the golden model (2026-10-03) against a C reference in bases 2, 3, 8, 10, 16, 36 and four invalid ones. `<# #S #>` leaves its caller 4 data cells and 3 return entries; the signed picture `dup push ABS 0 <# #S pop SIGN #>` leaves 2 return entries. `#`, `#S`, `HOLD` and `SIGN` clobber `A` and `B`. | | `HLD` | CAP | Variable: byte address of the first held character. | | `.` `.R` `U.` `U.R` `D.` `D.R` | CAP | Built on pictured output and `TYPE`. | | `.S` | RET | No visible stack pointer (D-2). | @@ -472,7 +472,8 @@ All output reaches the console through `EMIT` (DEV). ROOM: drop HLD b! @b -1 + dup !b jump C! : SIGN ( n -- ) -if L1 drop 45 jump HOLD L1: drop ; : # ( ud1 -- ud2 ) - 0 (BASE) UM/MOD push (BASE) UM/MOD pop ROT \ qlo qhi rem + 0 (BASE) UM/MOD -ROT \ qhi lo rem1 + (BASE) UM/MOD -ROT \ qlo qhi rem dup -10 + -if L1 drop 48 + jump L2 L1: drop 55 + L2: jump HOLD : #S ( ud -- 0 0 ) L: # over over OR if L1 drop jump L L1: drop ; : #> ( ud -- baddr u ) drop drop HLD b! @b HEND over push inv pop + inv ; @@ -481,7 +482,8 @@ All output reaches the console through `EMIT` (DEV). `#` divides the double by the base in two `UM/MOD` steps, the high cell first and its remainder leading the low cell; the last remainder is the digit. `HOLD`, `SIGN` and `#` end with a jump to the next word rather than a call, so `C!` returns straight to their caller and two return-stack entries -are saved. `ROT` is in line. +are saved. `#` keeps the high quotient under the second division on the data stack, not on the +return stack. `-ROT` is in line (`SWAP push SWAP pop`). ### 5.9 Strings, parsing, and input diff --git a/v4/tests/test_pictured.c b/v4/tests/test_pictured.c index 0a6f1ad5..8662f9ac 100644 --- a/v4/tests/test_pictured.c +++ b/v4/tests/test_pictured.c @@ -57,7 +57,7 @@ static v4_cell w_swap, w_or, w_ummod, w_lshift, w_rshift, w_cstore, #define VGET(a) do { LIT(a); O(BANG_B); O(FETCH_B); } while (0) #define VSET(a) do { LIT(a); O(BANG_B); O(STORE_B); } while (0) #define SWAP_INLINE() do { O(OVER); O(PUSH); O(PUSH); O(DROP); O(RPOP); O(RPOP); } while (0) -#define ROT_INLINE() do { O(PUSH); SWAP_INLINE(); O(RPOP); SWAP_INLINE(); } while (0) +#define NROT_INLINE() do { SWAP_INLINE(); O(PUSH); SWAP_INLINE(); O(RPOP); } while (0) #define SUB_INLINE() do { O(PUSH); O(INV); O(RPOP); O(ADD); O(INV); } while (0) /* The words pictured output rests on, as in test_foundation.c. */ @@ -238,11 +238,14 @@ static void build_pictured(void) /* : # ( ud1 -- ud2 ) * ud1 / base in two UM/MOD steps, the high cell first and its remainder * leading the low cell; the last remainder is the digit. - * 0 (BASE) UM/MOD push (BASE) UM/MOD pop ROT qlo qhi rem + * 0 (BASE) UM/MOD -ROT qhi lo rem1 + * (BASE) UM/MOD -ROT qlo qhi rem + * The high quotient waits under the second division on the data stack, + * not on the return stack. -ROT in line is SWAP push SWAP pop. * dup -10 + -if L1 drop 48 + jump L2 L1: drop 55 + L2: jump HOLD */ w_hash = v4_asm_label(&as); - LIT(0); CALL(w_base); CALL(w_ummod); O(PUSH); - CALL(w_base); CALL(w_ummod); O(RPOP); ROT_INLINE(); + LIT(0); CALL(w_base); CALL(w_ummod); NROT_INLINE(); + CALL(w_base); CALL(w_ummod); NROT_INLINE(); O(DUP); LIT(-10); O(ADD); a = FWD(MINUS_IF); O(DROP); LIT(48); O(ADD); b = FWD(JUMP); HERE_(a); @@ -510,9 +513,9 @@ int main(void) int dh, rh; v4_node_store(&n, BASE, 10); headroom("<# #S #>", t_ud, 2, 12345, 0, "12345", &dh, &rh); - CHECK(dh >= 2 && rh >= 2, "<# #S #> leaves room"); + CHECK(dh >= 2 && rh >= 3, "<# #S #> leaves room"); headroom("signed picture", t_signed, 1, -12345, 0, "-12345", &dh, &rh); - CHECK(dh >= 2 && rh >= 1, "the signed picture leaves room"); + CHECK(dh >= 2 && rh >= 2, "the signed picture leaves room"); } CHECK(v4_node_guards_intact(&n), "guards intact"); -- 2.54.0 From 7e3932a4ad7fe986d6f1c7be889111ef36d61385 Mon Sep 17 00:00:00 2001 From: rajames Date: Sat, 3 Oct 2026 11:57:49 -0400 Subject: [PATCH 033/135] feat(v4.0.0): CONSOLE-TX capture register on the single-node model EMIT is a device service: a character sent to the console node. The mesh and its ports are development step 2 and the memory map is open (D-4), so the single-node model now stands in for the console with one memory-mapped register, so that printing words can be run and their output compared with v3's. v4_node_console_attach(n, addr): after it, a store to word address `addr` appends the low 8 bits of the value to a buffer on the node (V4_CONSOLE_CAP characters, 4096 by default) and does not write memory; a load from `addr` reads the memory word as before. Characters past the capacity are counted in console_dropped and discarded. The hook is in v4_node_store, which all four store opcodes use. It is off by default: v4_node_reset detaches the console (address -1) and empties the capture, so the ISA's behaviour and every existing test are unchanged unless a console is attached. The address is the caller's choice. New test v4/tests/test_console.c, 22 checks per width: direct stores, !b, ! and !+ through the executor printing "Hi!", memory at and around the register untouched, the low byte only, overflow, detach, a console at word 0, and reset. At 32- and 64-bit cells, optimised and ASan+UBSan (`make test`, `make sanitize`); all other v4 tests still pass. Four mutations of the hook each fail. DECOMPOSITION.md section 7 gains the CONSOLE-TX row. No printing word is defined here; EMIT and the words on it are still to do. Test results on the amd64 host only. This is a development check, not acceptance (JUSTIFICATION.md section 16). Co-Authored-By: Claude Opus 5.5 --- docs/v4.0.0/DECOMPOSITION.md | 1 + v4/README.md | 3 +- v4/include/v4/node.h | 32 +++++++++ v4/src/node.c | 17 +++++ v4/tests/test_console.c | 126 +++++++++++++++++++++++++++++++++++ 5 files changed, 178 insertions(+), 1 deletion(-) create mode 100644 v4/tests/test_console.c diff --git a/docs/v4.0.0/DECOMPOSITION.md b/docs/v4.0.0/DECOMPOSITION.md index 4d5446b3..930b4179 100644 --- a/docs/v4.0.0/DECOMPOSITION.md +++ b/docs/v4.0.0/DECOMPOSITION.md @@ -813,3 +813,4 @@ Addresses are assigned in the node memory map (D-4). Names only here. | `REC-ENABLE` | R/W | DoE recorder on/off (`HB-ON` / `HB-OFF`). | | `PORT-STATUS` | R | Per-port ready flags, for non-blocking polls. | | `NODE-ERROR` | R/W | Arithmetic error flag: set to −1 by `Q./` on division by zero (D-11), by `Q.SQRT` / `Q.LOG` outside their domain (D-12) and by `HOLD` on a bad character or a full buffer (D-13), cleared by writing 0. `VM-ERROR?` reads it. | +| `CONSOLE-TX` | W | Console transmit: a store sends the low 8 bits of the value as one character. This is what `EMIT` writes to. On the single-node golden model it is a capture register: the character is appended to a buffer on the node and memory is not written (`v4_node_console_attach`, `v4/include/v4/node.h`), so printing words can be run and their output compared with v3's. With the mesh (step 2) it becomes the port to the console node. | diff --git a/v4/README.md b/v4/README.md index 5315f636..df8a231a 100644 --- a/v4/README.md +++ b/v4/README.md @@ -14,7 +14,8 @@ and every ISA, hosted and bare metal, must still reach its `ok` prompt. `make -C v4 test` passing is a development check, not acceptance. What exists so far is the single node: registers, circular stacks, memory, all -32 opcodes, and per-opcode and per-call-target heat. `make -C v4 test` builds +32 opcodes, per-opcode and per-call-target heat, and a console capture +register (`CONSOLE-TX`) standing in for the console node until the mesh exists. `make -C v4 test` builds and runs the tests at both cell widths; `make -C v4 sanitize` repeats them under ASan and UBSan. There is no compiler capsule, no POST and no K measurement yet. diff --git a/v4/include/v4/node.h b/v4/include/v4/node.h index f794c30d..b8cee3e1 100644 --- a/v4/include/v4/node.h +++ b/v4/include/v4/node.h @@ -49,6 +49,11 @@ * build time, which is why the percentage is a macro and not baked in. */ #define V4_MEM_BOUND V4_GUARD_ELEMS(V4_NODE_WORDS) +/* Characters the console capture holds. Overridable at build time. */ +#ifndef V4_CONSOLE_CAP +#define V4_CONSOLE_CAP 4096u +#endif + typedef struct { v4_cell p; /* P -- program counter */ v4_cell a; /* A -- address register */ @@ -60,6 +65,13 @@ typedef struct { v4_cell mem_guard_head[V4_MEM_BOUND]; v4_cell mem[V4_NODE_WORDS]; v4_cell mem_guard_tail[V4_MEM_BOUND]; + + /* CONSOLE-TX capture (DECOMPOSITION.md section 7). See + * v4_node_console_attach below. */ + v4_cell console_tx; /* its word address, or -1: no console */ + unsigned console_len; /* characters captured */ + unsigned console_dropped; /* characters that did not fit */ + unsigned char console[V4_CONSOLE_CAP]; } v4_node; /* Zero P, A and B, empty the stacks, and clear memory. Installs every @@ -111,4 +123,24 @@ int v4_node_guards_intact(const v4_node *n); v4_cell v4_node_load(const v4_node *n, v4_cell addr); void v4_node_store(v4_node *n, v4_cell addr, v4_cell value); +/* CONSOLE-TX, the console's transmit register, on the single-node model. + * + * EMIT is a device service: one character sent to the console node + * (DECOMPOSITION.md 5.10). The mesh and its ports are development step 2, + * and the memory map is open (D-4), so until then the model stands in for + * the console with one memory-mapped register and a capture buffer. That is + * enough to run every printing word and compare what it prints with v3. + * + * After v4_node_console_attach(n, addr), a store to word address `addr` + * appends the low 8 bits of the value to n->console instead of writing + * memory; n->mem[addr] is never changed by it, and a load from `addr` reads + * that memory word as before. All four store opcodes go through + * v4_node_store, so all four reach it. Once V4_CONSOLE_CAP characters are + * held, further ones are counted in n->console_dropped and discarded. + * + * A node has no console until one is attached: v4_node_reset detaches it + * (console_tx = -1) and empties the capture. Attaching empties it too. + * Passing -1 detaches. The address is the caller's choice. */ +void v4_node_console_attach(v4_node *n, v4_cell addr); + #endif /* V4_NODE_H */ diff --git a/v4/src/node.c b/v4/src/node.c index d654f181..52788c69 100644 --- a/v4/src/node.c +++ b/v4/src/node.c @@ -11,6 +11,7 @@ void v4_node_reset(v4_node *n) v4_guard_fill(n->mem_guard_tail, V4_MEM_BOUND, V4_GUARD_PATTERN_TAIL); v4_dstack_reset(&n->ds); v4_rstack_reset(&n->rs); + v4_node_console_attach(n, -1); } int v4_node_guards_intact(const v4_node *n) @@ -31,5 +32,21 @@ v4_cell v4_node_load(const v4_node *n, v4_cell addr) void v4_node_store(v4_node *n, v4_cell addr, v4_cell value) { + /* CONSOLE-TX: capture the character, leave memory alone. console_tx is + * -1 when no console is attached, which no valid address equals. */ + if (addr == n->console_tx) { + if (n->console_len < V4_CONSOLE_CAP) + n->console[n->console_len++] = (unsigned char)((v4_ucell)value & 0xFFu); + else + n->console_dropped++; + return; + } n->mem[(unsigned)addr] = value; } + +void v4_node_console_attach(v4_node *n, v4_cell addr) +{ + n->console_tx = addr; + n->console_len = 0; + n->console_dropped = 0; +} diff --git a/v4/tests/test_console.c b/v4/tests/test_console.c new file mode 100644 index 00000000..35d4ecde --- /dev/null +++ b/v4/tests/test_console.c @@ -0,0 +1,126 @@ +/* test_console.c -- the CONSOLE-TX capture register (node.h). + * + * EMIT is a device service (DECOMPOSITION.md 5.10) and the mesh is not built + * yet, so the single-node model stands in for the console with one + * memory-mapped register: a store to it appends a character to a buffer on + * the node. This file checks that register and nothing else: no printing + * word is defined here. + */ +#include "v4/asm.h" +#include "v4/testcode.h" +#include +#include + +static int failures = 0, checks = 0; +#define CHECK(c,...) do{checks++; if(!(c)){failures++; printf("FAIL %s:%d: ",__FILE__,__LINE__); printf(__VA_ARGS__); printf("\n");}}while(0) + +/* The memory map is open (D-4); the test chooses the address. */ +#define CONSOLE_TX ((v4_cell)(V4_NODE_WORDS - 4u)) +#define MARK ((v4_cell)0x1234) + +static v4_node n; +static v4_exec_state es; +static v4_heat h; +static v4_asm as; + +#define O(name) v4_asm_op(&as, V4_OP_##name) +#define LIT(v) v4_asm_lit(&as, (v4_cell)(v)) + +static int run(v4_cell word) +{ + v4_dstack_reset(&n.ds); + v4_rstack_reset(&n.rs); + v4_exec_reset(&es); + v4_heat_reset(&h); + return v4_test_call(&n, &es, &h, word, 1000) > 0; +} + +int main(void) +{ + v4_cell w_hi; + unsigned i; + + printf("v4 console tests: V4_CELL_BITS=%d, capture %u characters\n", + V4_CELL_BITS, (unsigned)V4_CONSOLE_CAP); + + /* A fresh node has no console: every store is a memory store. */ + v4_node_reset(&n); + CHECK(n.console_tx == -1 && n.console_len == 0 && n.console_dropped == 0, + "reset leaves no console attached"); + v4_node_store(&n, CONSOLE_TX, MARK); + CHECK(v4_node_load(&n, CONSOLE_TX) == MARK && n.console_len == 0, + "with no console the address is ordinary memory"); + + /* Attached: a store is captured and memory is left alone. */ + v4_node_console_attach(&n, CONSOLE_TX); + v4_node_store(&n, CONSOLE_TX, 'A'); + CHECK(n.console_len == 1 && n.console[0] == 'A', "a store is captured"); + CHECK(n.mem[CONSOLE_TX] == MARK, "and does not write memory"); + CHECK(v4_node_load(&n, CONSOLE_TX) == MARK, "a load reads the memory word, as before"); + + /* Only the low byte is the character. */ + v4_node_store(&n, CONSOLE_TX, 0x141); + v4_node_store(&n, CONSOLE_TX, -1); + v4_node_store(&n, CONSOLE_TX, 0); + CHECK(n.console_len == 4 && n.console[1] == 'A' && n.console[2] == 0xFF && n.console[3] == 0, + "the low 8 bits are the character"); + + /* Other addresses are still memory. */ + v4_node_store(&n, CONSOLE_TX - 1, 'x'); + v4_node_store(&n, CONSOLE_TX + 1, 'y'); + CHECK(n.console_len == 4 && n.mem[CONSOLE_TX - 1] == 'x' && n.mem[CONSOLE_TX + 1] == 'y', + "neighbouring addresses are ordinary memory"); + + /* Through the executor: !b, ! and !+ each reach the register, in order. */ + v4_asm_begin(&as, &n, 16); + w_hi = v4_asm_label(&as); + LIT('H'); LIT(CONSOLE_TX); O(BANG_B); O(STORE_B); /* !b */ + LIT('i'); LIT(CONSOLE_TX); O(BANG_A); O(STORE_A); /* ! */ + LIT('!'); LIT(CONSOLE_TX); O(BANG_A); O(STORE_INC); /* !+ */ + O(SEMI); + CHECK(v4_asm_ok(&as), "test word assembles"); + + n.mem[CONSOLE_TX - 1] = 0; + n.mem[CONSOLE_TX + 1] = 0; + v4_node_console_attach(&n, CONSOLE_TX); + CHECK(n.console_len == 0 && n.console_dropped == 0, "attaching empties the capture"); + CHECK(run(w_hi), "the word returns"); + CHECK(n.console_len == 3 && memcmp(n.console, "Hi!", 3) == 0, "!b, ! and !+ print \"Hi!\""); + CHECK(n.a == CONSOLE_TX + 1, "!+ still advances A"); + CHECK(n.mem[CONSOLE_TX] == MARK && n.mem[CONSOLE_TX - 1] == 0 && n.mem[CONSOLE_TX + 1] == 0, + "memory at and around the register is untouched"); + + /* Run it again: the capture appends. */ + CHECK(run(w_hi) && n.console_len == 6 && memcmp(n.console, "Hi!Hi!", 6) == 0, + "a second run appends"); + + /* A full buffer drops and counts; nothing past it is written. */ + v4_node_console_attach(&n, CONSOLE_TX); + for (i = 0; i < V4_CONSOLE_CAP + 5u; i++) v4_node_store(&n, CONSOLE_TX, (v4_cell)('a' + i % 26u)); + CHECK(n.console_len == V4_CONSOLE_CAP, "the capture stops at its capacity"); + CHECK(n.console_dropped == 5, "and counts what it dropped: %u", n.console_dropped); + CHECK(n.console[0] == 'a' && n.console[V4_CONSOLE_CAP - 1] == (unsigned char)('a' + (V4_CONSOLE_CAP - 1u) % 26u), + "the first and last captured characters are intact"); + CHECK(n.console_tx == CONSOLE_TX, "the register address survives an overflow"); + + /* Detaching returns the address to memory. */ + v4_node_console_attach(&n, -1); + v4_node_store(&n, CONSOLE_TX, 77); + CHECK(n.console_len == 0 && n.mem[CONSOLE_TX] == 77, "detached, the address is memory again"); + + /* The console can sit anywhere, including word 0. */ + v4_node_console_attach(&n, 0); + n.mem[0] = MARK; + v4_node_store(&n, 0, 'z'); + CHECK(n.console_len == 1 && n.console[0] == 'z' && n.mem[0] == MARK, "a console at word 0"); + + CHECK(v4_node_guards_intact(&n), "guards intact"); + + /* Reset detaches and empties. */ + v4_node_reset(&n); + CHECK(n.console_tx == -1 && n.console_len == 0 && n.console_dropped == 0, + "reset detaches the console and empties the capture"); + + printf(" %d checks, %d failures\n", checks, failures); + return failures ? 1 : 0; +} -- 2.54.0 From 40178098e9f372e6fc1f48be5be6f8c3a5ba27a4 Mon Sep 17 00:00:00 2001 From: rajames Date: Sat, 3 Oct 2026 12:13:25 -0400 Subject: [PATCH 034/135] feat(v4.0.0): EMIT, CR, SPACE and TYPE on the console register : EMIT ( c -- ) CONSOLE-TX b! !b ; : CR ( -- ) 10 jump EMIT : SPACE ( -- ) 32 jump EMIT : TYPE ( baddr u -- ) -if OK drop drop NODE-ERROR b! -1 !b ; OK: if DONE over C@ EMIT push 1 + pop -1 + jump OK DONE: drop drop ; They follow v3 (v3/src/word_source/io_words.c): EMIT prints the low byte of the cell, CR character 10, SPACE a blank; TYPE prints u bytes, nothing for u = 0, and for u < 0 nothing, with NODE-ERROR set where v3 raised its error flag. TYPE does not check the address range, which v3 does; out-of-range addressing is still an open question in node.h. New test v4/tests/test_terminal.c, on a node of its own with the console attached, 939 checks per width. Two transcripts of the real v3 binary are recorded as expected output: 65 EMIT 66 EMIT SPACE 67 EMIT CR 68 EMIT 321 EMIT -> "AB C\nDA" S" Hello, v3" TYPE 91 EMIT 0 TYPE 93 EMIT -> "Hello, v3[]" Also: EMIT of every byte and of wider values, CR, SPACE, TYPE from every start within a cell at lengths 0..40, bytes with the top bit set and zero bytes, negative counts, and that TYPE writes no memory. At 32- and 64-bit cells, optimised and ASan+UBSan (`make test`, `make sanitize`). Five mutations each fail. Headroom (data cells under args / return entries): EMIT 8/8, TYPE 4/3. TYPE's depth is C@'s, which is still as written (C@ -> RSHIFT -> SWAP). Test results on the amd64 host only. This is a development check, not acceptance (JUSTIFICATION.md section 16). Co-Authored-By: Claude Opus 5.5 --- docs/v4.0.0/DECOMPOSITION.md | 12 +- v4/tests/test_terminal.c | 282 +++++++++++++++++++++++++++++++++++ 2 files changed, 288 insertions(+), 6 deletions(-) create mode 100644 v4/tests/test_terminal.c diff --git a/docs/v4.0.0/DECOMPOSITION.md b/docs/v4.0.0/DECOMPOSITION.md index 930b4179..dfc9974d 100644 --- a/docs/v4.0.0/DECOMPOSITION.md +++ b/docs/v4.0.0/DECOMPOSITION.md @@ -147,8 +147,8 @@ IF body1 ELSE body2 THEN → if L1 drop body1 jump L2 times, as on the F18. `FOR ... UNEXT` is the same but the body must fit in one instruction word. **Register conventions.** `A` and `B` are caller-saved. A word that uses them says so. Words in this -document that clobber `A`: `@ ! +! -! 2@ 2! C@ C! UM* * UM/MOD Q.FROM-INT Q.TO-INT Q.* Q./ Q.EXP Q.SQRT Q.LOG Q.SIN Q.COS HOLD SIGN # #S SEND RECV`. Words that clobber `B`: -`Q./ Q.EXP Q.SQRT Q.LOG Q.SIN Q.COS <# HOLD SIGN # #S #> SEND RECV`. +document that clobber `A`: `@ ! +! -! 2@ 2! C@ C! UM* * UM/MOD Q.FROM-INT Q.TO-INT Q.* Q./ Q.EXP Q.SQRT Q.LOG Q.SIN Q.COS HOLD SIGN # #S TYPE SEND RECV`. Words that clobber `B`: +`Q./ Q.EXP Q.SQRT Q.LOG Q.SIN Q.COS <# HOLD SIGN # #S #> EMIT CR SPACE TYPE SEND RECV`. **Return-stack words** (`>R R> R@ 2>R 2R> 2R@ I J UNLOOP` and the loop runtimes) are always IN. @@ -517,12 +517,12 @@ return stack. `-ROT` is in line (`SWAP push SWAP pop`). | Word | Fate | Notes | | --- | --- | --- | -| `EMIT` | DEV | Console service: one-character message. | +| `EMIT` | DEV | Console service: one-character message. Until the mesh exists it is a store to the `CONSOLE-TX` register (§7): `CONSOLE-TX b! !b`. As in v3, the low byte of the cell is the character. Executed on the golden model (2026-10-03). Clobbers `B`. | | `KEY` | DEV | Console service: blocking receive. | | `?TERMINAL` | DEV | Console service: non-blocking status. | -| `TYPE` | CAP | Loop of `C@ EMIT`, or one string message to the console node. | -| `CR` | CAP | `10 EMIT` | -| `SPACE` | CAP | `BL EMIT` | +| `TYPE` | CAP | `( baddr u -- )`. Loop of `C@ EMIT`, or one string message to the console node: `-if OK drop drop NODE-ERROR b! -1 !b ; OK: if DONE over C@ EMIT push 1 + pop -1 + jump OK DONE: drop drop ;` — nothing for `u = 0`; for `u < 0` nothing is printed and `NODE-ERROR` is set, where v3 printed nothing and raised its error flag. The address range is not checked (out-of-range addressing is still open, `node.h`). Executed on the golden model (2026-10-03). Leaves its caller 4 data cells and 3 return entries, the depth being `C@`'s as written. Clobbers `A` and `B`. | +| `CR` | CAP | `10 EMIT`, as `10 jump EMIT` — executed on the golden model (2026-10-03). Character 10, as v3; the console turns it into a new line. | +| `SPACE` | CAP | `BL EMIT`, as `32 jump EMIT` — executed on the golden model (2026-10-03). | | `SPACES` | CAP | `BEGIN dup 0> WHILE SPACE 1- REPEAT drop` | | `."` `(do-string)` | CC | Compiler words. | diff --git a/v4/tests/test_terminal.c b/v4/tests/test_terminal.c new file mode 100644 index 00000000..359ab414 --- /dev/null +++ b/v4/tests/test_terminal.c @@ -0,0 +1,282 @@ +/* test_terminal.c -- EMIT, CR, SPACE and TYPE, executed. + * + * DECOMPOSITION.md 5.10. EMIT is a device service; on the single-node model + * it is a store to the CONSOLE-TX capture register (node.h), so what these + * words print can be read back and compared with v3. + * + * v3 (v3/src/word_source/io_words.c): EMIT prints the low byte of the cell; + * CR prints character 10; SPACE prints a blank; TYPE ( addr u -- ) prints u + * bytes, nothing for u = 0, and for u < 0 prints nothing and raises its error + * flag. v4 sets NODE-ERROR in that last case, as D-13 does for HOLD. + * + * Two transcripts of the real v3 binary are recorded below as expected + * output. They were taken on 2026-10-03 from + * printf '