0hmX/am3352
This code suite comprises TypeScript scripts that analyze, verify, and assemble complex DDR memory interface hardware, focusing on physical routing, via and pad placement, electrical clearance, and physical constraints, often involving precise geometric calculations and consistent provenance tracking.
- Version
- 1.0.5
- License
- unset
- Stars
- 0
scripts/experiment-ddr-e2-via-relocation.ts
/** Bounded E2/C1 co-design experiment against the accepted ordered-DM board. */
import{readFileSync,writeFileSync,mkdirSync}from'node:fs'
import{resolve}from'node:path'
import{objectHash}from'./improve-ddr-a9-power-launches'
import{verifyDdrSystemCopper}from'./check-ddr-system-copper'
import{sharedViaApproaches}from'./plan-ddr-ram-power-via-reuse'
const dir=resolve(process.argv[2]??'dist/ddr-dm0-ordered-host'),out=resolve('dist/ddr-e2-relocation-experiment'),read=(n:string)=>JSON.parse(readFileSync(`${dir}/${n}`,'utf8')),parent=read('candidate.circuit.json'),audit=read('ram-power-launch-audit.json'),report=read('report.json'),attempts:any[]=[],hits:any[]=[],witnesses:any[]=[],started=Date.now()
if(audit.launchQualified!==56)throw Error('Expected actual56power parent')
for(const byte of[0,1]){
const row=(term:string)=>audit.rows.find((r:any)=>r.byte===byte&&r.terminal===term),trace=(r:any)=>parent.find((e:any)=>e.type==='pcb_trace'&&e.pcb_trace_id===r.pcbTraceId),e2=trace(row('VDDQ_E2')),c1=trace(row('VDDQ_C1')),d1=trace(row('VSSQ_D1')),target=row('VSS_F2').connectionVia,old=e2.route[2],rendered=parent.filter((e:any)=>e.type==='pcb_via'&&e.pcb_trace_id===e2.pcb_trace_id),pad=parent.find((e:any)=>e.type==='pcb_smtpad'&&e.pcb_smtpad_id===row('VDDQ_E2').padId),users=audit.rows.filter((r:any)=>r.connectionVia&&Math.hypot(r.connectionVia.x-old.x,r.connectionVia.y-old.y)<1e-7)
if(rendered.length!==1||users.length!==2||!users.some((r:any)=>r.terminal==='VDDQ_C1'))throw Error('Expected exactE2/C1sharedbarrel')
witnesses.push({byte,e2,c1,d1,rendered:rendered[0],beforeHashes:{e2:objectHash(e2),c1:objectHash(c1),d1:objectHash(d1),rendered:objectHash(rendered[0])},retainedVrefPad:parent.find((e:any)=>e.type==='pcb_smtpad'&&e.pcb_smtpad_id===(byte?'pcb_smtpad_570':'pcb_smtpad_492'))})
position:for(const dx of[-.1,-.15,-.2,-.25,-.3,-.35,-.4])for(const dy of[-.3,-.2,-.1,0,.1,.2,.3]){
if(Date.now()-started>55000)break position
const v={x:old.x+dx,y:old.y+dy},padHoleGap=Math.hypot(v.x-pad.x,v.y-pad.y)-.127-pad.radius
if(padHoleGap<.1016-1e-8){attempts.push({byte,dx,dy,status:'own-pad-drill-gap',padHoleGap});continue}
const viaGap=Math.min(...parent.filter((e:any)=>e.type==='pcb_via'&&!rendered.includes(e)).map((e:any)=>Math.hypot(v.x-e.x,v.y-e.y)-.2286-e.outer_diameter/2))
if(viaGap<.1016-1e-8){attempts.push({byte,dx,dy,status:'other-barrel-gap',viaGap});continue}
const e2Routes=sharedViaApproaches(e2.route[0],v),c1Routes=sharedViaApproaches(c1.route[0],v)
if(!c1Routes.length){attempts.push({byte,dx,dy,status:'C1-exceeds1.524mm'});continue}
for(const er of e2Routes)for(const cr of c1Routes){
const moved={...e2,route:[...er,{...old,...v}]},shared={...c1,route:cr},newRendered={...rendered[0],...v},fixed=[...parent.filter((e:any)=>e.type!=='pcb_copper_pour'&&e!==e2&&e!==c1&&e!==d1&&!rendered.includes(e)),moved,shared,newRendered],r=verifyDdrSystemCopper(fixed,[moved,shared],[],{},0)
if(r.errors.length||r.violations.length||!r.angles.valid||r.joinedBends.length){attempts.push({byte,dx,dy,status:'relocation-copper-blocked',padHoleGap,viaGap,errors:r.errors,blockers:r.violations.map((w:any)=>({layer:w.layer,gapMm:w.gapMm,a:w.aShape.traceId??w.aShape.join,b:w.bShape.traceId??w.bShape.join})),joined:r.joinedBends});continue}
const a=d1.route[0],ex=target.x-a.x,ey=target.y-a.y,vertical=ey-Math.abs(ex)
for(let k=0;k<=20;k++){
const lead=vertical*k/20,points=[a,{x:a.x,y:a.y+lead},{x:target.x,y:a.y+lead+Math.abs(ex)},target],route:any[]=[a]
for(const p of points.slice(1))if(Math.hypot(p.x-route.at(-1).x,p.y-route.at(-1).y)>1e-8)route.push({route_type:'wire',x:p.x,y:p.y,width:.12,layer:'top'})
const added={...d1,route},check=verifyDdrSystemCopper(fixed,[moved,shared,added],[],{},0),pass=!check.errors.length&&!check.violations.length&&check.angles.valid&&!check.joinedBends.length
attempts.push({byte,dx,dy,lead,status:pass?'conductor-clear-pending-planes':'D1-approach-blocked',padHoleGap,viaGap,minClearanceMm:check.minClearanceMm,blockers:check.violations.map((w:any)=>({layer:w.layer,gapMm:w.gapMm,a:w.aShape.traceId??w.aShape.join,b:w.bShape.traceId??w.bShape.join})),joined:check.joinedBends})
if(pass){hits.push({byte,afterE2:moved,afterC1:shared,afterRendered:newRendered,afterD1:added,conductorReport:check});break position}
}
}
}
}
mkdirSync(out,{recursive:true});writeFileSync(`${out}/report.json`,JSON.stringify({captureHash:report.captureHash,parentDirectory:dir,parentCircuitSha256:objectHash(parent),elapsedMs:Date.now()-started,witnesses,attempts,hits,scope:'Read-only E2opposite-rail barrel relocation plus both existing E2/C1launch replacements, retainingVREFDQpad. All conductor layers checked; any hit requires newplanes/contact/topology audit before acceptance. No canonical changes.'},null,2));console.log(JSON.stringify({elapsedMs:Date.now()-started,attempts:attempts.length,hits:hits.map(h=>({byte:h.byte,via:h.afterRendered}))}))