imrishabh18/corne-keyboard

The code defines and renders two surface-mount chip components with SMT pads, silkscreen outlines, and 3D CAD models (OBJ and STEP) for PCB assembly.

Version
2.0.21
License
unset
Stars
1

analyze.ts

import fs from 'node:fs/promises'
import { runAllRoutingChecks, runAllPlacementChecks, dedupePcbDrcErrors } from '@tscircuit/checks'
const out='../../outputs'
await fs.mkdir(out,{recursive:true})
const summary:any={}
for(const side of ['left','right']){
 const file=`${side}/circuit.json`; const files=[];
 if(!file) throw Error(`No output for ${side}: ${files}`)
 const cj=JSON.parse(await fs.readFile(`dist/${file}`,'utf8'))
 const errors=cj.filter((x:any)=>x.type.includes('error'))
 const routing=dedupePcbDrcErrors(await runAllRoutingChecks(cj))
 const placement=dedupePcbDrcErrors(await runAllPlacementChecks(cj))
 const byType=(a:any[])=>Object.fromEntries([...new Set(a.map(x=>x.type))].map(t=>[t,a.filter(x=>x.type===t).length]))
 const byId=new Map(cj.flatMap((x:any)=>Object.entries(x).filter(([k,v])=>k===`${x.type}_id`).map(([k,v])=>[v,x])))
 const describe=(id:string):any=>{const x:any=byId.get(id);if(!x)return id; if(x.type==='source_component')return x.name;if(x.type==='source_trace')return {id,ports:x.connected_source_port_ids?.map(describe),nets:x.connected_source_net_ids?.map(describe)};if(x.type==='source_net')return x.name; if(x.type==='source_port')return `${describe(x.source_component_id)}.${x.name}`;return {id,type:x.type,component:x.source_component_id?describe(x.source_component_id):x.pcb_component_id?describe(x.pcb_component_id):undefined,trace:x.source_trace_id?describe(x.source_trace_id):undefined,port:x.source_port_id?describe(x.source_port_id):undefined,center:x.center,layer:x.layer}}
 const enrich=(e:any)=>({...e,objects:Object.fromEntries(Object.entries(e).filter(([k,v])=>k!=='type'&&!k.endsWith('error_id')&&(k.endsWith('_ids')||k.endsWith('_id'))).map(([k,v])=>[k,Array.isArray(v)?v.map(describe):describe(v as string)]))})
 summary[side]={file,builtErrors:byType(errors),routingErrors:byType(routing),placementErrors:byType(placement),traces:cj.filter((x:any)=>x.type==='pcb_trace').length,vias:cj.filter((x:any)=>x.type==='pcb_via').length}
 await fs.writeFile(`${out}/${side}-drc-errors.json`,JSON.stringify({builtErrors:errors.map(enrich),routingErrors:routing.map(enrich),placementErrors:placement.map(enrich)},null,2))
 await fs.copyFile(`dist/${file}`,`${out}/${side}.circuit.json`)
}
await fs.writeFile(`${out}/summary.json`,JSON.stringify(summary,null,2))
console.log(JSON.stringify(summary,null,2))