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/assemble-ddr-dq1-connected.ts
/** Exact DQ1 replacement: revised RAM escape, retired old host, new inner6 host and plane voids. */
import{readFileSync,writeFileSync,mkdirSync}from'node:fs'
import{resolve}from'node:path'
import{createHash}from'node:crypto'
import{verifyDdrCapture}from'./ddr-capture-provenance'
import{objectHash}from'./improve-ddr-a9-power-launches'
import{applyFacingExitReplacements}from'./ddr-facing-context'
import{auditCompositeHostTopology}from'./ddr-composite-routing-context'
import{auditRouteAngles}from'./check-route-angles'
import{auditDdrTraceJunctions}from'./check-ddr-system-copper'
import{checkHostTerminalContract}from'./route-ddr-sequential'
import{refreshDdrPlaneContacts}from'./ddr-plane-contact-audit'
const[capture,parentDir,cacheDir,routeDir,out]=process.argv.slice(2);if(!out)throw Error('Usage: capture original12parent DQ1cache routed-DQ1 output')
const hashes=new Map<string,string>(),fh=(p:string)=>createHash('sha256').update(readFileSync(p)).digest('hex'),read=(p:string)=>{p=resolve(p);hashes.set(p,fh(p));return JSON.parse(readFileSync(p,'utf8'))},bind=(hs:any)=>{for(const[p,h]of Object.entries(hs??{})){if(fh(p)!==h)throw Error(`Stale bound input ${p}`);hashes.set(p,h as string)}}
const{captureHash}=verifyDdrCapture(capture),parent=read(resolve(parentDir,'candidate.circuit.json')),prior=read(resolve(parentDir,'report.json')),cacheCandidate=read(resolve(cacheDir,'candidate.circuit.json')),cacheReport=read(resolve(cacheDir,'report.json')),cacheHost=read(resolve(cacheDir,'host-bundle.json')),changes=read(resolve(cacheDir,'replacements.json')),input=read(resolve(cacheDir,'routing-input.json')),cache=read(resolve(cacheDir,'ram-byte0-facing-progress.trace-paths.json')),contract=read(resolve(cacheDir,'exit-contract.json')),routed=read(resolve(routeDir,'candidate.circuit.json')),host=read(resolve(routeDir,'host-bundle.json')),raw=read(resolve(routeDir,'raw-traces.json')),routeReport=read(resolve(routeDir,'report.json'))
if(!cacheReport.accepted||!routeReport.accepted||[prior,cacheReport,host,routeReport].some(x=>x.captureHash!==captureHash)||prior.candidateCircuitSha256!==objectHash(parent)||cacheReport.candidateCircuitSha256!==objectHash(cacheCandidate)||host.layerSpace!=='physical'||cacheHost.traces.length!==11||host.traces.length!==12||raw.length!==1||raw[0].source_trace_id!=='source_trace_576'||changes.invalidatedHostTraces.length!==1||cache.length!==72||!auditRouteAngles(cache).valid)throw Error('DQ1 capture/count/cache provenance mismatch')
bind(routeReport.inputHashes);bind(cacheReport.inputFileHashes);const removed=changes.invalidatedHostTraces[0];if(removed.source_trace_id!=='source_trace_576'||objectHash(parent.find((e:any)=>e.type==='pcb_trace'&&e.pcb_trace_id===removed.pcb_trace_id))!==objectHash(removed))throw Error('Unexpected retired DQ1 host')
const replay=applyFacingExitReplacements(parent,changes).filter((e:any)=>e.type!=='pcb_trace'||e.pcb_trace_id!==removed.pcb_trace_id);if(objectHash(replay)!==objectHash(cacheCandidate)||objectHash(host.traces)!==objectHash([...cacheHost.traces,...raw]))throw Error('Exact DQ1 RAM/host replay differs')
const planes=routed.filter((e:any)=>e.type==='pcb_copper_pour'),oldPlanes=parent.filter((e:any)=>e.type==='pcb_copper_pour');if(planes.length!==3)throw Error('Unexpected plane count')
const planeChanges=planes.map((after:any)=>{const before=oldPlanes.find((p:any)=>p.pcb_copper_pour_id===after.pcb_copper_pour_id);if(!before||before.layer!==after.layer||before.source_net_id!==after.source_net_id)throw Error('Plane identity changed');return{id:`pcb_copper_pour:${before.pcb_copper_pour_id}`,before,after}}),candidate=[...cacheCandidate.map((e:any)=>e.type==='pcb_copper_pour'?planeChanges.find((p:any)=>p.before.pcb_copper_pour_id===e.pcb_copper_pour_id)!.after:e),...raw],sorted=(xs:any[])=>xs.map(objectHash).sort()
if(objectHash(sorted(candidate))!==objectHash(sorted(routed)))throw Error('Undeclared routing changes')
const topology=auditCompositeHostTopology(candidate,host.traces,input.connections),allAngles=auditRouteAngles(candidate.filter((e:any)=>e.type==='pcb_trace')),allJunctions=auditDdrTraceJunctions(candidate,input.connections),terminal=checkHostTerminalContract(host.traces,input.connections.filter((c:any)=>host.traces.some((t:any)=>t.connection_name===c.name))),planeAudit=refreshDdrPlaneContacts(prior.planeAudit,planes,candidate)
const planar=(r:any[])=>r.reduce((n:number,b:any,i:number)=>{const a=r[i-1];return n+(a?.route_type==='wire'&&b.route_type==='wire'&&a.layer===b.layer?Math.hypot(a.x-b.x,a.y-b.y):0)},0),conn=input.connections.find((c:any)=>c.source_trace_id==='source_trace_576'),escapeMm=conn.pointsToConnect.map((p:any)=>{const e=candidate.find((e:any)=>e.type==='pcb_breakout_point'&&e.pcb_breakout_point_id===p.pointId),ts=candidate.filter((t:any)=>t.type==='pcb_trace'&&t.source_trace_id===e?.source_trace_id&&t.route.at(-1)?.layer===p.layer&&Math.hypot(t.route.at(-1).x-p.x,t.route.at(-1).y-p.y)<1e-7);if(ts.length!==1)throw Error('Ambiguous DQ1 actual escape');return planar(ts[0].route)}),fullPlanarMm=escapeMm.reduce((a:number,b:number)=>a+b,0)+planar(raw[0].route)
if(!topology.valid||!allAngles.valid||!allJunctions.valid||!terminal.valid||topology.physical.connectivity.filter(c=>c.connected).length!==12||Math.abs(fullPlanarMm-routeReport.fullPlanarMm)>1e-7||fullPlanarMm>routeReport.nominalMm+1e-7)throw Error('DQ1 actual physical/length gates fail')
const replacements=[...changes.traces,...changes.breakoutPoints,...planeChanges].map((r:any)=>({...r,id:`${r.before.type}:${r.before[`${r.before.type}_id`]}`})),manifest={captureHash,parentDirectory:resolve(parentDir),parentCircuitSha256:objectHash(parent),candidateCircuitSha256:objectHash(candidate),replacements,removals:[removed],additions:raw,sourceRamExitChanges:changes,allOtherElementsExact:true,inputHashes:Object.fromEntries(hashes)}
const assertUnchanged=()=>{verifyDdrCapture(capture);for(const[p,h]of hashes)if(fh(p)!==h)throw Error('DQ1 assembly input changed')};assertUnchanged();mkdirSync(out,{recursive:true});const write=(n:string,v:any)=>writeFileSync(resolve(out,n),JSON.stringify(v,null,2)+'\n')
const report={...prior,accepted:true,captureHash,candidateCircuitSha256:objectHash(candidate),supportCircuitSha256:objectHash(candidate),hostTracesSha256:objectHash(host.traces),hostBundleSha256:objectHash(host),originalCopperReplacementsSha256:objectHash(manifest),connectedHostCount:12,preservedHostCount:11,physical:topology.physical,topology,terminalContract:terminal,fullCandidateAngles:allAngles,fixedJunctionAudit:allJunctions,planeAudit,ramCacheSha256:objectHash(cache),dq1Evidence:{routeReport,escapeMm,fullPlanarMm},inputFileHashes:Object.fromEntries(hashes),scope:'Twelve physical endpoint-only hosts; old DQ1 host retired, RAM exit oninner6 and replacementhostthroughfullbarrel. DQ1 short of byte target, remaining data/control/power and return-path/stackup/SI qualification incomplete.'}
write('candidate.circuit.json',candidate);write('host-bundle.json',host);write('routing-input.json',{...input,traces:host.traces,obstacles:undefined});write('original-copper-replacements.json',manifest);write('report.json',report);write('host-route-report.json',routeReport);write('source-provenance.json',{inputHashes:Object.fromEntries(hashes),cacheReport,priorReportSha256:objectHash(prior)});write('ram-byte0-facing-progress.trace-paths.json',cache);write('exit-contract.json',{...contract,candidateCircuitSha256:objectHash(candidate),scope:'Actual experimental72-path RAM0 cache: B7/E7/C8/C7 changed,68 unchanged, zero extra padding. DQ1 inner6 now hosted; completeDDRqualification unresolved.'})
for(const script of['audit-ddr-global-power-launches.ts','audit-ddr-host-reference-coverage.ts']){const p=Bun.spawn(['bun',`scripts/${script}`,resolve(out),resolve(capture)],{stdout:'inherit',stderr:'inherit'});if(await p.exited!==0)throw Error(`Audit failed ${script}`)}
const power=JSON.parse(readFileSync(resolve(out,'ram-power-launch-audit.json'),'utf8'));if(power.launchQualified!==56||power.total!==60)throw Error('Power qualification changed');assertUnchanged();write('report.json',{...report,launchAuditSha256:objectHash(power),launchQualified:56,totalRamPowerPads:60});console.log(JSON.stringify({out,hosts:12,power:56,fullPlanarMm}))