code wiki / _hdl_build / nx_simlab_wasm_vm_gate.nx

nx_simlab_wasm_vm_gate.nx source

↩ module page · 75 lines · 5404 B

1// nx_simlab_wasm_vm_gate.nx -- RUN (not just compile) the browser sim's wasm in our OWN sovereign WASM VM 2// (nx_wasm_vm), no browser / node / wasmtime. Loads web_assets/nx_simlab.wasm, instantiates, calls the exported 3// init()/tick(0)/render() (the VM supports i64 div, so the integer leapfrog orbit physics executes), then reads 4// the framebuffer + step counter back out of the VM's linear memory and checks them. This closes the 5// compile-vs-execute gap: the shipped wasm bytes genuinely COMPUTE the orbit, sovereignly verified. GREEN iff 6/6. 6// license_tier: ORIGINAL 7import "nx_syscalls.nx" 8import "nx_wasm_vm.nx" 9 10func g_w(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 11func g_n(v: i64) -> i64 { var m: i64=v; if m<0{g_w("-");m=0-m} let t:*u8=sys_mmap(24); var k:i64=0; if m==0{t[0]=48 as u8;k=1}; while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1}; var i:i64=0; let o:*u8=sys_mmap(24); while i<k{o[i]=t[k-1-i];i=i+1}; sys_write(1,o,k); return 0 } 12func g_row(id: *u8, ok: i64, pass: *i64) -> i64 { g_w(" "); g_w(id); g_w(": "); if ok==1 { g_w("OK\n"); pass[0]=pass[0]+1 } else { g_w("FAIL\n") } return 0 } 13func rd64(m: *u8, o: i64) -> i64 { var v: i64=0; var i: i64=0; while i<8 { v = v | ((m[o+i] as i64) << (i*8)); i=i+1 } return v } 14 15func main() -> i64 { 16 let pass: *i64 = sys_mmap(8) as *i64; pass[0]=0 17 g_w("=== NX-SIMLAB WASM-VM gate (run the shipped sim wasm in our sovereign VM; no browser/node) ===\n") 18 let box: *i64 = sys_mmap(16) as *i64 19 let wasm: *u8 = sys_read_file("/mnt/c/Users/elder/nishi-core/nxc2/web_assets/nx_simlab.wasm" as *u8, box) 20 if (wasm as i64) == 0 { g_w(" FAIL cannot read nx_simlab.wasm\n"); sys_exit(1); return 1 } 21 let mod: *WasmMod = wm_new(wasm, box[0]) 22 let parsed: i64 = (wm_parse(mod)==0) as i64 23 mod.mem = sys_mmap(2097152) as *u8 // 2 MB = 32 pages (matches the declared memory) 24 mod.mem_bytes = 2097152 25 26 let fi: i64 = wm_find_export(mod, "init" as *u8) 27 let ft: i64 = wm_find_export(mod, "tick" as *u8) 28 let fr: i64 = wm_find_export(mod, "render" as *u8) 29 let fw: i64 = wm_find_export(mod, "ww" as *u8) 30 let fh: i64 = wm_find_export(mod, "hh" as *u8) 31 let fo: i64 = wm_find_export(mod, "fb_off" as *u8) 32 var exports_ok: i64=0 33 if fi>=0 { if ft>=0 { if fr>=0 { if fw>=0 { if fh>=0 { if fo>=0 { exports_ok=1 } } } } } } 34 35 let W: i64 = wm_run(mod, "ww" as *u8, 0,0,0,0,0, 0) 36 let H: i64 = wm_run(mod, "hh" as *u8, 0,0,0,0,0, 0) 37 let OFF: i64 = wm_run(mod, "fb_off" as *u8, 0,0,0,0,0, 0) 38 var iface_ok: i64=0; if W==256 { if H==256 { if OFF==0 { iface_ok=1 } } } 39 40 // execute: init + a few ticks (each advances 32 leapfrog sub-steps) + render. Few ticks keeps the (much slower 41 // than native) interpreter well under the runner's time budget while still proving execute+render. 42 wm_run(mod, "init" as *u8, 0,0,0,0,0, 0) 43 var t: i64=0; while t<3 { wm_run(mod, "tick" as *u8, 0,0,0,0,0, 1); t=t+1 } 44 wm_run(mod, "render" as *u8, 0,0,0,0,0, 0) 45 46 let steps: i64 = rd64(mod.mem, 524288 + 5*8) // O_ST + st[5] = step counter 47 let star_off: i64 = (128*256+128)*8 // central star pixel (CY*W+CX)*8 48 let sr: i64 = mod.mem[star_off] as i64; let sg: i64 = mod.mem[star_off+1] as i64; let sb: i64 = mod.mem[star_off+2] as i64 49 var star_ok: i64=0; if sr==250 { if sg==210 { if sb==70 { star_ok=1 } } } 50 // count non-background pixels (bg = rgb(10,14,24)) 51 var nb: i64=0; var i: i64=0 52 while i<256*256 { let b: i64=i*8; if (mod.mem[b] as i64)!=10 { nb=nb+1 } else { if (mod.mem[b+1] as i64)!=14 { nb=nb+1 } else { if (mod.mem[b+2] as i64)!=24 { nb=nb+1 } } } i=i+1 } 53 54 // determinism: a 2nd init+ticks+render reproduces the same star pixel 55 wm_run(mod, "init" as *u8, 0,0,0,0,0, 0) 56 t=0; while t<3 { wm_run(mod, "tick" as *u8, 0,0,0,0,0, 1); t=t+1 } 57 wm_run(mod, "render" as *u8, 0,0,0,0,0, 0) 58 let steps2: i64 = rd64(mod.mem, 524288 + 5*8) 59 let sr2: i64 = mod.mem[star_off] as i64 60 61 g_w(" parsed="); g_n(parsed); g_w(" funcs="); g_n(mod.n_funcs); g_w(" exports="); g_n(mod.n_exports); g_w("\n") 62 g_w(" ww="); g_n(W); g_w(" hh="); g_n(H); g_w(" fb_off="); g_n(OFF); g_w(" steps="); g_n(steps); g_w(" star=("); g_n(sr); g_w(","); g_n(sg); g_w(","); g_n(sb); g_w(") non-bg-px="); g_n(nb); g_w("\n") 63 64 g_row("PARSE + EXPORTS: wasm parses in our VM; init/tick/render/ww/hh/fb_off all exported" as *u8, parsed*exports_ok, pass) 65 g_row("INTERFACE: the wasm returns ww=256, hh=256, fb_off=0 (the sim interface is intact)" as *u8, iface_ok, pass) 66 g_row("EXECUTES: init + 3 ticks ran the integer leapfrog in the VM (step counter = 96 = 3*32)" as *u8, (steps==96) as i64, pass) 67 g_row("RENDERED STAR: the wasm rasterizer drew the central mass pixel rgb(250,210,70) correctly" as *u8, star_ok, pass) 68 g_row("NON-TRIVIAL FRAME: >100 non-background pixels drawn (star disc + body + trail)" as *u8, (nb>100) as i64, pass) 69 var det: i64=0; if steps2==96 { if sr2==sr { det=1 } } 70 g_row("DETERMINISTIC: a 2nd run reproduces the same step count + star pixel (reproducible sovereign execution)" as *u8, det, pass) 71 72 g_w("NX-SIMLAB-WASM-VM-GATE rows=6 pass="); g_n(pass[0]) 73 if pass[0]==6 { g_w(" verdict=GREEN (shipped wasm EXECUTES correctly in our sovereign VM -- run, not just compiled)\n"); sys_exit(0); return 0 } 74 g_w(" verdict=RED\n"); sys_exit(1); return 1 75}