pixalynx/cm5-minimal-carrier

A 4-layer Raspberry Pi CM5 carrier board routes USB‑C 5V power through an RT9742 load switch with TVS protection and capacitive filtering, while providing ESD-protected HDMI output, CM5 connectors, test points, and ground/power planes.

Version
0.1.1
License
unset
Stars
0

scripts/build.ts

import { existsSync } from 'node:fs'
const kicadCli=process.env.KICAD_CLI ?? (existsSync('/Applications/KiCad/KiCad.app/Contents/MacOS/kicad-cli')?'/Applications/KiCad/KiCad.app/Contents/MacOS/kicad-cli':'kicad-cli')
const kicadPython=process.env.KICAD_PYTHON ?? (existsSync('/Applications/KiCad/KiCad.app/Contents/Frameworks/Python.framework/Versions/Current/bin/python3')?'/Applications/KiCad/KiCad.app/Contents/Frameworks/Python.framework/Versions/Current/bin/python3':'python3')
async function run(args:string[],log?:string){
 const p=Bun.spawn(args,{stdout:'pipe',stderr:'pipe'});const [a,b,code]=await Promise.all([new Response(p.stdout).text(),new Response(p.stderr).text(),p.exited]);if(log)await Bun.write(log,a+b)
 if(code){console.error(a+b);throw Error(`Command failed (${code}): ${args.join(' ')}`)}
 console.log(`${args.slice(0,3).join(' ')}: OK`)
}
await run(['python3','scripts/design.py'])
await run(['python3','scripts/route.py'])
await run(['python3','scripts/prepare-cad.py'])
await run(['bun','run','typecheck'])
await run(['bunx','tsci','build','index.circuit.tsx','--svgs','--disable-parts-engine'],'output/tscircuit-build.log')
await run([kicadPython,'scripts/export-kicad.py'],'output/kicad-export.log')
await run([kicadCli,'pcb','drc','--format','json','--exit-code-violations','-o','output/drc.json','output/cm5-minimal.kicad_pcb'],'output/kicad-drc.log')
await run(['bun','scripts/validate.ts','--design-only'])
await run(['bun','scripts/render.ts'])
await run(['python3','scripts/deliverables.py'])
await run([kicadCli,'pcb','render','--width','1400','--height','1000','--quality','high','--rotate','325,0,25','--zoom','0.78','--output','output/assembly-3d.png','output/cm5-minimal.kicad_pcb'],'output/render-3d.log')
await run([kicadCli,'pcb','render','--width','1400','--height','1000','--quality','high','--side','bottom','--zoom','0.78','--output','output/assembly-bottom-3d.png','output/cm5-minimal.kicad_pcb'],'output/render-bottom-3d.log')
await run([kicadCli,'pcb','export','gerbers','--use-drill-file-origin','--layers','F.Cu,In1.Cu,In2.Cu,B.Cu,F.Mask,B.Mask,F.Paste,B.Paste,F.SilkS,B.SilkS,Edge.Cuts','-o','output/fabrication-REVIEW/','output/cm5-minimal.kicad_pcb'],'output/gerber-export.log')
await run([kicadCli,'pcb','export','drill','--drill-origin','plot','--excellon-separate-th','--excellon-oval-format','route','--generate-map','--map-format','svg','--generate-report','--report-path','output/drill-report.txt','-o','output/fabrication-REVIEW/','output/cm5-minimal.kicad_pcb'],'output/drill-export.log')
await run([kicadCli,'pcb','export','ipcd356','-o','output/cm5-minimal.ipc','output/cm5-minimal.kicad_pcb'],'output/ipc-export.log')
await run([kicadPython,'scripts/audit-manufacturing.py'],'output/manufacturing-audit.log')
await run(['bun','scripts/validate.ts'])
await Bun.write('output/fabrication-REVIEW/READ-BEFORE-ORDERING.txt','ENGINEERING REVIEW EXPORT — NOT RELEASED FOR FABRICATION.\nRead ../../docs/fabrication-checklist.md. Use specified controlled-impedance stack-up, not default 4-layer.\nNo board or assembly order has been placed.\n')
await run(['python3','scripts/package-review.py'])
console.log('Build and checks complete. See output/review.html. Fabrication release remains pending the documented external checks.')