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-dm1-connected.ts
/** Exact DM1 replacement: revised RAM escape, retired old host, new inner2 host. */
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 DM1cache routed-DM1 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-byte1-facing-progress.trace-paths.json')),contract=read(resolve(cacheDir,'ram-byte1-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_674'||changes.invalidatedHostTraces.length!==1||cache.length!==72||!auditRouteAngles(cache).valid)throw Error('DM1 capture/count/cache provenance mismatch')
const routeEvidence=read(resolve(routeDir,'input-evidence.json'));bind(routeEvidence.inputHashes);if(routeReport.parentCandidateSha256!==objectHash(cacheCandidate))throw Error('Route seed differs from cache candidate');bind(cacheReport.inputFileHashes);const removed=changes.invalidatedHostTraces[0];if(removed.source_trace_id!=='source_trace_674'||objectHash(parent.find((e:any)=>e.type==='pcb_trace'&&e.pcb_trace_id===removed.pcb_trace_id))!==objectHash(removed))throw Error('Unexpected retired DM1 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 DM1 RAM/host replay differs')
if(!Number.isFinite(routeReport.lengths?.fullPlanarMm)||!Number.isFinite(routeReport.lengths?.nominalMm))throw Error('Missing measured DM1 length');
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_674'),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 DM1 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.lengths.fullPlanarMm)>1e-7||fullPlanarMm>routeReport.lengths.nominalMm+1e-7)throw Error('DM1 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('DM1 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,ramByte1CacheSha256:objectHash(cache),dm1Evidence:{routeReport,escapeMm,fullPlanarMm},inputFileHashes:Object.fromEntries(hashes),scope:'Twelve physical endpoint-only hosts; old DM1 host retired, RAM exit on inner2 and same-layer replacement host. DM1 below byte nominal maximum; DQS1 currently exceeds its nominal maximum, 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-byte1-facing-progress.trace-paths.json',cache);write('ram-byte1-exit-contract.json',{...contract,candidateCircuitSha256:objectHash(candidate),scope:'Actual experimental72-path RAM1 cache: B7 changed,71 unchanged, zero extra padding. DM1 inner2 now hosted; completeDDRqualification unresolved.'})
write('ram-byte0-facing-progress.trace-paths.json',read(resolve(parentDir,'ram-byte0-facing-progress.trace-paths.json')));write('exit-contract.json',{...read(resolve(parentDir,'exit-contract.json')),candidateCircuitSha256:objectHash(candidate)});
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}))