0hmX/am3352-ddr-track-a-local-dfm-wip-20261007

Experimental RJ45-corrected board with isolated PG indication. 1005/1005 source joins pass; 15 expanded-guard physical errors, sourcing and qualification gates remain. Not fabrication-ready.

Version
0.0.4
License
unset
Stars
0

support.tsx

import parts from './data/support-components.json'
import library from './data/support-footprints.json'
import mechanics from './data/support-mechanics.json'
import placement from './data/support-placement-draft.json'
const safe=(p:any,s:string)=>'pin'+(Object.keys(p.pinLabels).indexOf(s)+1)
function ImportedFootprint({part}:{part:any}) {
 const lib=(library as any)[part.footprintKey]
 if(!lib) {
  if(part.name.startsWith('TP_UART'))return <footprint><smtpad portHints={['pin1']} shape="circle" radius={0.6} pcbX={0} pcbY={0}/></footprint>
  return part.footprint??'0402'
 }
 const court=(mechanics as any).courtyards[part.footprintKey]?.bounds
 return <footprint>{court&&<courtyardrect pcbX={(court[0]+court[2])/2} pcbY={(court[1]+court[3])/2} width={court[2]-court[0]} height={court[3]-court[1]}/>} {lib.pads.map((p:any,i:number)=>{
  const hints=p.pin?[safe(part,p.pin)]:[]
  if(p.type==='np_thru_hole')return <hole key={i} pcbX={p.x} pcbY={p.y} diameter={Number(p.drill?.[0]??p.width)}/>
  if(p.type==='thru_hole') {
   if(p.drill?.[0]==='oval')return <platedhole key={i} portHints={hints} pcbX={p.x} pcbY={p.y} shape="pill" holeWidth={Number(p.drill[1])} holeHeight={Number(p.drill[2])} outerWidth={p.width} outerHeight={p.height} pcbRotation={p.rotation}/>
   return <platedhole key={i} portHints={hints} pcbX={p.x} pcbY={p.y} shape="circle" holeDiameter={Number(p.drill?.[0])} outerDiameter={Math.max(p.width,p.height)}/>
  }
  if(p.shape==='circle')return <smtpad key={i} portHints={hints} pcbX={p.x} pcbY={p.y} shape="circle" radius={p.width/2}/>
  return <smtpad key={i} portHints={hints} pcbX={p.x} pcbY={p.y} shape="rect" width={Math.abs(p.rotation)%180===90?p.height:p.width} height={Math.abs(p.rotation)%180===90?p.width:p.height}/>
 })}</footprint>
}
export function Support(){return <>{parts.map((p:any,i:number)=>{
 if(p.kind==='capacitor' && p.package==='1210' && !p.useImportedFootprint)throw Error(`Declared 1210 capacitor ${p.name} cannot use a fallback footprint`)
 const props={name:p.name,manufacturerPartNumber:p.mpn??undefined,connections:Object.fromEntries(Object.entries(p.connections).map(([pin,net])=>[p.kind==='chip'?safe(p,pin):'pin'+pin,`net.${net}`])),...(placement as any)[p.name],schX:((i%10)-5)*8,schY:Math.floor(i/10)*-5}
 if(p.kind==='resistor')return <resistor key={p.name} {...props} resistance={p.value} footprint={p.useImportedFootprint?<ImportedFootprint part={p}/>:p.footprint??'0402'}/>
 if(p.kind==='capacitor')return <capacitor key={p.name} {...props} capacitance={p.value} footprint={p.useImportedFootprint?<ImportedFootprint part={p}/>:p.footprint??'0402'}/>
 if(p.kind==='inductor')return <inductor key={p.name} {...props} inductance={p.value} footprint={<ImportedFootprint part={p}/>}/>
 return <chip key={p.name} {...props} pinLabels={Object.fromEntries(Object.entries(p.pinLabels).map(([pin,label])=>[safe(p,pin),[pin,String(label)+'_'+pin]]))} noConnect={p.noConnect.map((s:string)=>safe(p,s))} footprint={<ImportedFootprint part={p}/>}/>
 })}</>}