code wiki / _hdl_build / nx_print_material.nx

nx_print_material.nx source

↩ module page · 115 lines · 5622 B

1// nx_print_material.nx -- LIB: the MULTI-MATERIAL 3D-printing ladder registry (FLAGGED workstream 2// project-nishi-3d-printing-multimaterial-2026-06-23). One sovereign seg-store catalog of print materials 3// across the family ladder FILAMENT -> PASTE/CONCRETE -> METAL; each material carries process params + a 4// capability STATUS (SHIPPING/MODELED/FUTURE) + EVIDENCE (the organ that actually prints it). Cardinal 26 5// (never brick): this is DATA only -- it emits no firmware; shipping materials' evidence is a G-code emitter 6// (file-only, brick-safe). Schema: print:mat:<id> -> name <t> family <t> process <t> nozzle_um <t> layer_um 7// <t> temp_c <t> status <t> evidence; print:matids / print:families = indexes. license_tier: ORIGINAL 8import "nx_food_science.nx" 9import "nx_seg_store.nx" 10import "nx_syscalls.nx" 11 12const PRINT_PREFIX: *u8 = "knowledge/store/print-" 13 14func pm_streq(a: *u8, b: *u8) -> i64 { var i: i64 = 0; while a[i] != (0 as u8) { if a[i] != b[i] { return 0 } i = i + 1 } if b[i] != (0 as u8) { return 0 } return 1 } 15 16func pm_mat_key(id: *u8, out: *u8) -> i64 { 17 var o: i64 = 0 18 o = as_append(out, o, "print:mat:" as *u8) 19 o = as_append(out, o, id) 20 out[o] = 0 as u8 21 return o 22} 23func pm_get(prefix: *u8, id: *u8, ptr: *i64, len: *i64) -> i64 { 24 let key: *u8 = sys_mmap(80) 25 pm_mat_key(id, key) 26 return ss_get(prefix, key, ptr, len) 27} 28func pm_field_str(prefix: *u8, id: *u8, f: i64, out: *u8) -> i64 { 29 let pq: *i64 = sys_mmap(16) as *i64 30 let lq: *i64 = sys_mmap(16) as *i64 31 if pm_get(prefix, id, pq, lq) != 1 { out[0] = 0 as u8; return 0 } 32 return fd_field(pq[0] as *u8, lq[0], f, out) 33} 34func pm_field_int(prefix: *u8, id: *u8, f: i64) -> i64 { 35 let buf: *u8 = sys_mmap(32) 36 if pm_field_str(prefix, id, f, buf) == 0 { return 0 - 1 } 37 return fd_atoi(buf, as_len(buf)) 38} 39// 1 if material `id` has status `status` 40func pm_status_is(prefix: *u8, id: *u8, status: *u8) -> i64 { 41 let buf: *u8 = sys_mmap(32) 42 pm_field_str(prefix, id, 6, buf) 43 return pm_streq(buf, status) 44} 45// walk print:matids -> outids (ptrs to copies); returns count 46func pm_list(prefix: *u8, outids: *i64) -> i64 { 47 let pq: *i64 = sys_mmap(16) as *i64 48 let lq: *i64 = sys_mmap(16) as *i64 49 if ss_get(prefix, "print:matids" as *u8, pq, lq) != 1 { return 0 } 50 let buf: *u8 = pq[0] as *u8 51 let len: i64 = lq[0] 52 var c: i64 = 0 53 var i: i64 = 0 54 var ls: i64 = 0 55 while i <= len { 56 var sep: i64 = 0 57 if i == len { sep = 1 } else { if buf[i] == (9 as u8) { sep = 1 } } 58 if sep == 1 { 59 let tl: i64 = i - ls 60 if tl > 0 { 61 let tok: *u8 = sys_mmap(48) 62 var t: i64 = 0 63 while t < tl { tok[t] = buf[ls + t]; t = t + 1 } tok[tl] = 0 as u8 64 outids[c] = tok as i64; c = c + 1 65 } 66 ls = i + 1 67 } 68 i = i + 1 69 } 70 return c 71} 72// 1 if a Nishi organ source <basename>.nx exists under runtime/ or runtime/_hdl_build/ 73func pm_organ_exists(basename: *u8) -> i64 { 74 let p: *u8 = sys_mmap(256) 75 var o: i64 = 0 76 o = as_append(p, o, "runtime/" as *u8); o = as_append(p, o, basename); o = as_append(p, o, ".nx" as *u8); p[o] = 0 as u8 77 let fd: i64 = sys_openat_rd(p) 78 if fd >= 0 { sys_close(fd); return 1 } 79 o = 0 80 o = as_append(p, o, "runtime/_hdl_build/" as *u8); o = as_append(p, o, basename); o = as_append(p, o, ".nx" as *u8); p[o] = 0 as u8 81 let fd2: i64 = sys_openat_rd(p) 82 if fd2 >= 0 { sys_close(fd2); return 1 } 83 return 0 84} 85 86func pm_seed(prefix: *u8) -> i64 { 87 let keys: *i64 = sys_mmap(8 * 16) as *i64 88 let vals: *i64 = sys_mmap(8 * 16) as *i64 89 var n: i64 = 0 90 keys[n] = "print:families" as *u8 as i64; vals[n] = "FILAMENT\tPASTE\tMETAL" as *u8 as i64; n = n + 1 91 keys[n] = "print:matids" as *u8 as i64; vals[n] = "pla\tpetg\tabs\tconcrete\tclay\tsteel_waam\tsteel_dmls" as *u8 as i64; n = n + 1 92 // FILAMENT (FDM) -- SHIPPING via the existing pipeline; evidence = a real G-code organ 93 keys[n] = "print:mat:pla" as *u8 as i64; vals[n] = "PLA\tFILAMENT\tFDM\t400\t200\t210\tSHIPPING\tnx_gcode_emit" as *u8 as i64; n = n + 1 94 keys[n] = "print:mat:petg" as *u8 as i64; vals[n] = "PETG\tFILAMENT\tFDM\t400\t200\t240\tSHIPPING\tnx_gcode_extrude" as *u8 as i64; n = n + 1 95 keys[n] = "print:mat:abs" as *u8 as i64; vals[n] = "ABS\tFILAMENT\tFDM\t400\t200\t250\tSHIPPING\tnx_klipper_gcode_validator" as *u8 as i64; n = n + 1 96 // PASTE/CONCRETE -- MODELED; evidence = the R-ECO design that DEMANDS concrete printing (the cistern) 97 keys[n] = "print:mat:concrete" as *u8 as i64; vals[n] = "Concrete\tPASTE\tCONSTRUCTION\t25000\t10000\t0\tMODELED\tnx_ecodesign" as *u8 as i64; n = n + 1 98 keys[n] = "print:mat:clay" as *u8 as i64; vals[n] = "Clay\tPASTE\tCONSTRUCTION\t8000\t4000\t0\tMODELED\tnx_ecodesign" as *u8 as i64; n = n + 1 99 // METAL -- FUTURE (honest: not built) 100 keys[n] = "print:mat:steel_waam" as *u8 as i64; vals[n] = "Steel-WAAM\tMETAL\tWAAM\t1200\t1000\t1500\tFUTURE\tfuture" as *u8 as i64; n = n + 1 101 keys[n] = "print:mat:steel_dmls" as *u8 as i64; vals[n] = "Steel-DMLS\tMETAL\tDMLS\t100\t40\t1400\tFUTURE\tfuture" as *u8 as i64; n = n + 1 102 103 let w: *i64 = ss_begin() 104 var tw: i64 = 0 105 var i: i64 = 0 106 while i < n { 107 let k: *u8 = keys[i] as *u8 108 let v: *u8 = vals[i] as *u8 109 let vl: i64 = as_len(v) 110 if fd_streq_store(prefix, k, v, vl) == 0 { ss_add(w, 1, k, v, vl); tw = tw + 1 } 111 i = i + 1 112 } 113 if tw > 0 { let seg: i64 = fd_seg_next(prefix); ss_commit(prefix, w, seg) } 114 return tw 115}