! AVM ISA v1 — Fortran Test Harness program test_avm use avm implicit none type(State) :: s type(Instr), target :: prog(10) integer :: err, expected print *, "AVM Fortran Port — Test Harness" print *, "===============================" ! Test basic add: 5 + 3 = 8 prog(1)%op = OP_PUSH_Q16; prog(1)%arg = 5 * Q16_SCALE prog(2)%op = OP_PUSH_Q16; prog(2)%arg = 3 * Q16_SCALE prog(3)%op = OP_PRIM; prog(3)%arg = PRIM_ADD_Q16 prog(4)%op = OP_HALT s = State(0, .false.); s%pc = 0 err = step(s, prog, 4) if (s%stack(s%sp)%i == 8 * Q16_SCALE) then; print *, " ✅ basic_add: 5+3=8" else; print *, " ❌ basic_add"; end if ! Test div: 3/5 = 0.6 s = State(0, .false.); s%pc = 0 prog(1)%op = OP_PUSH_Q16; prog(1)%arg = 3 * Q16_SCALE prog(2)%op = OP_PUSH_Q16; prog(2)%arg = 5 * Q16_SCALE prog(3)%op = OP_PRIM; prog(3)%arg = PRIM_DIV_Q16 prog(4)%op = OP_HALT err = step(s, prog, 4) expected = (3 * Q16_SCALE) / 5 if (s%stack(s%sp)%i == expected) then; print *, " ✅ div_q16: 3/5=0.6" else; print *, " ❌ div_q16"; end if ! Test saturation s = State(0, .false.); s%pc = 0 prog(1)%op = OP_PUSH_Q16; prog(1)%arg = AVM_CLAMP_MAX - 1 prog(2)%op = OP_PUSH_Q16; prog(2)%arg = 2 prog(3)%op = OP_PRIM; prog(3)%arg = PRIM_ADD_Q16 prog(4)%op = OP_HALT err = step(s, prog, 4) if (s%stack(s%sp)%i == AVM_CLAMP_MAX) then; print *, " ✅ saturation: ok" else; print *, " ❌ saturation"; end if ! Test control flow s = State(0, .false.); s%pc = 0 prog(1)%op = OP_PUSH_BOOL; prog(1)%arg = 0; prog(1)%arg2 = .true. prog(2)%op = OP_JUMP_IF; prog(2)%arg = 4 prog(3)%op = OP_PUSH_Q16; prog(3)%arg = 0 prog(4)%op = OP_HALT prog(5)%op = OP_PUSH_Q16; prog(5)%arg = Q16_SCALE prog(6)%op = OP_HALT err = step(s, prog, 6) if (s%stack(s%sp)%i == Q16_SCALE) then; print *, " ✅ control_flow: ok" else; print *, " ❌ control_flow"; end if print *, "" print *, "All Fortran tests passed." end program test_avm