code wiki / _hdl_build / nx_cleanroom_gate.nx
nx_cleanroom_gate.nx source
↩ module page · 56 lines · 4114 B
1// nx_cleanroom_gate.nx -- GATE: can an ENCLOSED (3D-printer-type) chamber match a clean room? Required cleanliness
2// scales with feature size, so the answer depends on the node.
3// T1 OUR NODE -- at 10um (our sovereign/doomsday node) the required class is ISO 7; an enclosed HEPA laminar chamber
4// achieves ISO 5 -> it MEETS, with CMU-class yield. An enclosed system = clean-room-equivalent here.
5// T2 OPEN AIR -- a bare open bench (ISO 9) does NOT meet even the 10um requirement: you DO need an enclosure (not raw air).
6// T3 CROSSOVER -- enclosed ULPA (ISO 3) handles down to ~100nm, but NOT a 5nm leading-edge node -- THAT still needs a
7// full ISO-1 clean room. The honest limit: enclosure suffices for micron/sub-micron, not nanometer.
8// T4 YIELD -- meeting the requirement gives 943 permil yield vs 120 when contaminated.
9// T5 NEVER-BRICK-- deterministic.
10// GREEN iff all. Sovereign nx_cc->nxasm. expect_exit: 0 license_tier: ORIGINAL
11import "nx_cleanroom.nx"
12import "nx_syscalls.nx"
13
14func w(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
15func wn(v: i64) -> i64 { var m: i64=v; if m<0{w("-" as *u8);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 }
16
17func main() -> i64 {
18 w("=== nx_cleanroom_gate: can an ENCLOSED chamber match a clean room? (depends on the node) ===\n" as *u8)
19 var pass: i64 = 0; var total: i64 = 0
20
21 // T1 our node: 10um
22 let req10: i64 = clean_required_iso(10000)
23 let enc: i64 = clean_achievable_iso(1) // enclosed HEPA laminar
24 let m1: i64 = clean_meets(enc, req10)
25 let y1: i64 = clean_yield_permil(enc, req10)
26 total=total+1; if m1==1 { if y1==943 { pass=pass+1; w(" [PASS] " as *u8) } else { w(" [FAIL] " as *u8) } } else { w(" [FAIL] " as *u8) }
27 w("T1 OUR NODE (10um): required ISO" as *u8); wn(req10); w(" ; enclosed HEPA = ISO" as *u8); wn(enc); w(" -> meets=" as *u8); wn(m1); w(" yield=" as *u8); wn(y1); w(" (enclosed = clean-room-equivalent here)\n" as *u8)
28
29 // T2 open bench fails
30 let open: i64 = clean_achievable_iso(0)
31 let m2: i64 = clean_meets(open, req10)
32 total=total+1; if m2==0 { pass=pass+1; w(" [PASS] " as *u8) } else { w(" [FAIL] " as *u8) }
33 w("T2 OPEN AIR (ISO" as *u8); wn(open); w("): meets 10um=" as *u8); wn(m2); w(" -> you DO need the enclosure (not raw room air)\n" as *u8)
34
35 // T3 crossover: ULPA handles 100nm, not 5nm
36 let ulpa: i64 = clean_achievable_iso(2)
37 let m_100: i64 = clean_meets(ulpa, clean_required_iso(100))
38 let m_5: i64 = clean_meets(ulpa, clean_required_iso(5))
39 let m_5_cr: i64 = clean_meets(clean_achievable_iso(3), clean_required_iso(5))
40 total=total+1; if m_100==1 { if m_5==0 { if m_5_cr==1 { pass=pass+1; w(" [PASS] " as *u8) } else { w(" [FAIL] " as *u8) } } else { w(" [FAIL] " as *u8) } } else { w(" [FAIL] " as *u8) }
41 w("T3 CROSSOVER: enclosed ULPA meets 100nm=" as *u8); wn(m_100); w(" but 5nm=" as *u8); wn(m_5); w(" (only a full clean room=" as *u8); wn(m_5_cr); w("); nanometer is the honest limit\n" as *u8)
42
43 // T4 yield contrast
44 let yf: i64 = clean_yield_permil(open, req10)
45 total=total+1; if y1 > yf { pass=pass+1; w(" [PASS] " as *u8) } else { w(" [FAIL] " as *u8) }
46 w("T4 YIELD: met=" as *u8); wn(y1); w(" vs contaminated=" as *u8); wn(yf); w(" permil\n" as *u8)
47
48 // T5 never-brick
49 let a: i64 = clean_meets(enc, req10)
50 total=total+1; if a==m1 { pass=pass+1; w(" [PASS] " as *u8) } else { w(" [FAIL] " as *u8) }
51 w("T5 never-brick: deterministic (" as *u8); wn(a); w("==" as *u8); wn(m1); w(")\n" as *u8)
52
53 w("\n=== nx_cleanroom_gate " as *u8); wn(pass); w("/" as *u8); wn(total)
54 if pass == total { w(" GREEN (YES for micron/sub-micron nodes an enclosed HEPA/ULPA chamber matches a clean room; nanometer still needs a true clean room)\n" as *u8); sys_exit(0); return 0 }
55 w(" RED\n" as *u8); sys_exit(1); return 1
56}