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-d10-connected.ts
/** Exact byte-data host addition and three verified plane antipads; no RAM escape changes. */
import{readFileSync,writeFileSync,mkdirSync}from'node:fs'
import{resolve}from'node:path'
import{createHash}from'node:crypto'
import{spawnSync}from'node:child_process'
import{objectHash}from'./improve-ddr-a9-power-launches'
import{verifyDdrCapture}from'./ddr-capture-provenance'
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,prefixDir,routeDir,out,signal="DDR_D10"]=process.argv.slice(2)
if(!/^DDR_D(?:[0-9]|1[0-5])$/.test(signal))throw Error("Expected explicit DDR_D0 through DDR_D15")
if(!out||[parentDir,prefixDir,routeDir].some(p=>resolve(p)===resolve(out)))throw Error('Usage: capture parent prefix route isolated-output [DDR_D0..DDR_D15]')
const hashes:Record<string,string>={},fh=(p:string)=>createHash('sha256').update(readFileSync(p)).digest('hex'),read=(p:string)=>{p=resolve(p);hashes[p]=fh(p);return JSON.parse(readFileSync(p,'utf8'))},bind=(hs:Record<string,string>)=>{for(const[p,h]of Object.entries(hs)){if(fh(p)!==h)throw Error(`Stale input ${p}`);hashes[p]=h}},write=(n:string,v:any)=>writeFileSync(resolve(out,n),JSON.stringify(v,null,2)+'\n'),{captureHash}=verifyDdrCapture(capture)
const signalMap=read(`${capture}/signal-map.json`),signalEntry=signalMap.find((m:any)=>m.cpuSignal===signal),nominal=read(resolve(capture,'../../ddr-integrated-ten/dqlm-audit.json'));if(!signalEntry||nominal.captureHash!==captureHash)throw Error('Signal/nominal capture mismatch')
const parent=read(`${parentDir}/candidate.circuit.json`),prior=read(`${parentDir}/report.json`),parentPower=read(`${parentDir}/ram-power-launch-audit.json`),parentHost=read(`${parentDir}/host-bundle.json`),input=read(`${parentDir}/routing-input.json`),priorManifest=read(`${parentDir}/original-copper-replacements.json`),plan=read(`${prefixDir}/transition-plan.json`),planes=read(`${prefixDir}/planes.json`),raw=read(`${routeDir}/raw-traces.json`),routed=read(`${routeDir}/candidate.circuit.json`),host=read(`${routeDir}/host-bundle.json`),routeReport=read(`${routeDir}/report.json`)
bind(plan.inputHashes);bind(routeReport.inputHashes)
const expectedHostCount=parentHost.traces.length+1;if(expectedHostCount<1||expectedHostCount>50||parentHost.traces.some((t:any)=>t.source_trace_id===signalEntry.sourceTraceId))throw Error('Signal is already hosted or host inventory is invalid')
if(parentPower.captureHash!==captureHash||parentPower.total!==60||!Number.isInteger(parentPower.launchQualified)||parentPower.launchQualified<0||parentPower.launchQualified>60||!prior.accepted||!routeReport.accepted||[prior,parentHost,plan,host,routeReport].some(p=>p.captureHash!==captureHash)||prior.candidateCircuitSha256!==objectHash(parent)||plan.parentCircuitSha256!==objectHash(parent)||plan.hostTracesSha256!==objectHash(parentHost.traces)||plan.accepted.length!==1||host.traces.length!==expectedHostCount||host.layerSpace!=='physical'||raw.length!==1||raw[0].source_trace_id!==signalEntry.sourceTraceId||objectHash(host.traces)!==objectHash([...parentHost.traces,...raw]))throw Error('Byte-data parent/route provenance mismatch')
const replacements=planes.map((after:any)=>{const before=parent.find((e:any)=>e.type==='pcb_copper_pour'&&e.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}})
if(replacements.length!==3)throw Error('Expected three reference planes')
const candidate=[...parent.map((e:any)=>e.type==='pcb_copper_pour'?replacements.find((r:any)=>r.before.pcb_copper_pour_id===e.pcb_copper_pour_id)!.after:e),...raw],sorted=(a:any[])=>a.map(objectHash).sort()
if(objectHash(sorted(candidate))!==objectHash(sorted(routed)))throw Error('Undeclared change in routed candidate')
const planar=(r:any[])=>r.reduce((n:number,p:any,i:number)=>{const q=r[i-1];return n+(p.route_type==='wire'&&q?.route_type==='wire'&&p.layer===q.layer?Math.hypot(p.x-q.x,p.y-q.y):0)},0),connection=input.connections.find((c:any)=>c.source_trace_id===signalEntry.sourceTraceId),escapes=connection.pointsToConnect.map((p:any)=>{const exit=candidate.find((e:any)=>e.pcb_breakout_point_id===p.pointId),traces=candidate.filter((e:any)=>e.type==='pcb_trace'&&e.source_trace_id===exit?.source_trace_id&&e.route.at(-1)?.layer===p.layer&&Math.hypot(e.route.at(-1).x-p.x,e.route.at(-1).y-p.y)<1e-7);if(traces.length!==1)throw Error('Ambiguous escape');return{pointId:p.pointId,traceSha256:objectHash(traces[0]),planarMm:planar(traces[0].route)}}),fullPlanarMm=planar(raw[0].route)+escapes.reduce((s:number,e:any)=>s+e.planarMm,0)
const nominalMm=nominal.bytes.find((b:any)=>b.byte===connection.ramByte)?.dqlmPairedDataMaximumMm;if(!Number.isFinite(nominalMm)||!Number.isFinite(fullPlanarMm)||Math.abs(routeReport.nominalMm-nominalMm)>1e-7||fullPlanarMm>nominalMm+1e-7||Math.abs(fullPlanarMm-routeReport.fullPlanarMm)>1e-7)throw Error('Actual full length differs')
const topology=auditCompositeHostTopology(candidate,host.traces,input.connections),angles=auditRouteAngles(candidate.filter((e:any)=>e.type==='pcb_trace')),junctions=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)
if(!topology.valid||!angles.valid||!junctions.valid||!terminal.valid||topology.physical.connectivity.filter(c=>c.connected).length!==expectedHostCount)throw Error('Full byte-data assembly gates failed')
const copies:Record<string,any>={};for(const n of['ram-byte0-facing-progress.trace-paths.json','ram-byte1-facing-progress.trace-paths.json','exit-contract.json','ram-byte1-exit-contract.json']){copies[n]=read(`${parentDir}/${n}`);if(n.includes('contract'))copies[n]={...copies[n],candidateCircuitSha256:objectHash(candidate)}}
const source=read(`${parentDir}/source-provenance.json`),manifest={captureHash,parentDirectory:resolve(parentDir),parentCircuitSha256:objectHash(parent),candidateCircuitSha256:objectHash(candidate),replacements,removals:[],additions:raw,allOtherElementsExact:true,inputHashes:hashes},report={...prior,accepted:true,candidateCircuitSha256:objectHash(candidate),supportCircuitSha256:objectHash(candidate),hostTracesSha256:objectHash(host.traces),hostBundleSha256:objectHash(host),originalCopperReplacementsSha256:objectHash(manifest),connectedHostCount:expectedHostCount,preservedHostCount:parentHost.traces.length,planeAudit,topology,physical:topology.physical,fullCandidateAngles:angles,fixedJunctionAudit:junctions,terminalContract:terminal,[`d${signal.slice(5)}Evidence`]:{routeReport,fullPlanarMm,escapes,nominalMm,strobeTargetMm:plan.accepted[0].budget.targetPlanarMm},inputFileHashes:hashes,scope:`${expectedHostCount} physical endpoint-only hosts, all ${parentHost.traces.length} prior hosts preserved. ${signal} within byte nominal maximum; length matching, full DDR timing/SI and remaining nets/power remain incomplete.`}
mkdirSync(out,{recursive:true});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('parent-report.json',prior);write('parent-original-copper-replacements.json',priorManifest);write('host-route-report.json',routeReport);write('topology-report.json',topology);write('source-provenance.json',{inherited:source,parentCircuitSha256:objectHash(parent),candidateCircuitSha256:objectHash(candidate),manifestSha256:objectHash(manifest),inputHashes:hashes});for(const[n,v]of Object.entries(copies))write(n,v)
for(const script of['audit-ddr-global-power-launches.ts','audit-ddr-host-reference-coverage.ts']){const p=spawnSync(process.execPath,[resolve(`scripts/${script}`),resolve(out),resolve(capture)],{encoding:'utf8'});if(p.status!==0)throw Error(p.stderr||p.stdout)}
const power=JSON.parse(readFileSync(`${out}/ram-power-launch-audit.json`,'utf8')),reference=JSON.parse(readFileSync(`${out}/host-reference-coverage.json`,'utf8'));if(power.captureHash!==captureHash||power.total!==60||power.launchQualified!==parentPower.launchQualified||power.planeConnected!==parentPower.planeConnected||parentPower.rows.some((r:any)=>r.launchWithin1524Mm&&!power.rows.some((p:any)=>p.byte===r.byte&&p.ball===r.ball&&p.launchWithin1524Mm&&p.planeContact)))throw Error('Power qualification changed')
Object.assign(report,{launchAuditSha256:objectHash(power),launchQualified:power.launchQualified,hostReferenceCoverageSha256:objectHash(reference)});write('report.json',report)
const budgets=spawnSync(process.execPath,[resolve('scripts/audit-ddr-current-byte-budgets.ts'),resolve(capture),resolve(out),resolve(out,'current-byte-budgets.json')],{encoding:'utf8'});if(budgets.status!==0)throw Error(budgets.stderr||budgets.stdout)
for(const[p,h]of Object.entries(hashes))if(fh(p)!==h)throw Error('Input changed during assembly');verifyDdrCapture(capture)
console.log(JSON.stringify({out,candidateHash:objectHash(candidate),hosts:expectedHostCount,fullPlanarMm,power:power.launchQualified}))