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-fourteen-shorter-strobes.ts

import{readFileSync,writeFileSync,mkdirSync}from'node:fs'
import{resolve}from'node:path'
import{createHash}from'node:crypto'
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'
const[baseDir,shortDir,out,capture]=process.argv.slice(2),bound:Record<string,string>={},fh=(p:string)=>createHash('sha256').update(readFileSync(p)).digest('hex'),read=(p:string)=>{p=resolve(p);bound[p]=fh(p);return JSON.parse(readFileSync(p,'utf8'))},hash=(x:any)=>createHash('sha256').update(JSON.stringify(x)).digest('hex')
const base=read(resolve(baseDir,'candidate.circuit.json')),prior=read(resolve(baseDir,'report.json')),host=read(resolve(baseDir,'host-bundle.json')),input=read(resolve(baseDir,'routing-input.json')),m=read(resolve(shortDir,'original-copper-replacements.json')),short=read(resolve(shortDir,'candidate.circuit.json')),source=read(resolve(m.parentDirectory,'candidate.circuit.json')),sr=read(resolve(shortDir,'report.json'))
if(!sr.accepted||!prior.accepted||hash(base)!==prior.candidateCircuitSha256||m.captureHash!==prior.captureHash||hash(source)!==m.parentCircuitSha256||hash(short)!==m.candidateCircuitSha256||m.replacements.length!==2||(m.additions??[]).length||(m.removals??[]).length)throw Error('Two-strobe provenance differs')
const changes=m.replacements;for(const w of changes){if(w.before.type!=='pcb_trace'||w.after.type!=='pcb_trace'||w.before.pcb_trace_id!==w.after.pcb_trace_id||!['source_trace_675','source_trace_676'].includes(w.after.source_trace_id)||hash(base.find((e:any)=>e.type==='pcb_trace'&&e.pcb_trace_id===w.before.pcb_trace_id))!==hash(w.before))throw Error('Actual strobe witness differs')}
const candidate=base.map((e:any)=>changes.find((w:any)=>e.type==='pcb_trace'&&w.before.pcb_trace_id===e.pcb_trace_id)?.after??e),sourceReplay=source.map((e:any)=>changes.find((w:any)=>e.type==='pcb_trace'&&w.before.pcb_trace_id===e.pcb_trace_id)?.after??e);if(hash(sourceReplay)!==hash(short))throw Error('Source contains undeclaredchanges')
const traces=host.traces.map((t:any)=>changes.find((w:any)=>w.before.pcb_trace_id===t.pcb_trace_id)?.after??t),newHost={...host,traces},topology=auditCompositeHostTopology(candidate,traces,input.connections),angles=auditRouteAngles(candidate.filter((e:any)=>e.type==='pcb_trace')),junctions=auditDdrTraceJunctions(candidate,input.connections),terminal=checkHostTerminalContract(traces,input.connections.filter((c:any)=>traces.some((t:any)=>t.connection_name===c.name))),accepted=topology.valid&&angles.valid&&junctions.valid&&terminal.valid&&topology.physical.connectivity.filter(c=>c.connected).length===14
mkdirSync(out,{recursive:true});const write=(n:string,v:any)=>writeFileSync(resolve(out,n),JSON.stringify(v,null,2)+'\n');write('combined-audit.json',{accepted,topology,angles,junctions,terminal});if(!accepted)throw Error('Shorter DQS1 combined14 fails')
const manifest={captureHash:prior.captureHash,parentDirectory:resolve(baseDir),parentCircuitSha256:hash(base),candidateCircuitSha256:hash(candidate),replacements:changes,inputHashes:bound,allOtherElementsExact:true},report={...prior,candidateCircuitSha256:hash(candidate),supportCircuitSha256:hash(candidate),hostTracesSha256:hash(traces),hostBundleSha256:hash(newHost),physical:topology.physical,topology,terminalContract:terminal,fullCandidateAngles:angles,fixedJunctionAudit:junctions,originalCopperReplacementsSha256:hash(manifest),inputFileHashes:bound,scope:'Fourteen geometric hosts and shortened DQS1 pair at27mm mean. Several data lengths remain unmatched; DQS0 reference gap nearjointantipads and fullreturnpath/stackup/SI qualification unresolved.'}
write('candidate.circuit.json',candidate);write('host-bundle.json',newHost);write('routing-input.json',{...input,traces});write('original-copper-replacements.json',manifest);write('report.json',report);write('source-provenance.json',{inputHashes:bound,priorReportSha256:hash(prior),shortenedPairSourceManifest:m});for(const n of['ram-byte0-facing-progress.trace-paths.json','ram-byte1-facing-progress.trace-paths.json'])write(n,read(resolve(baseDir,n)));for(const n of['exit-contract.json','ram-byte1-exit-contract.json'])write(n,{...read(resolve(baseDir,n)),candidateCircuitSha256:hash(candidate),scope:report.scope})
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)throw Error(`Audit failed ${script}`)}const power=read(resolve(out,'ram-power-launch-audit.json'));if(power.launchQualified!==56)throw Error('Power changed');for(const[p,h]of Object.entries(bound))if(fh(p)!==h)throw Error('Input changed');write('report.json',{...report,launchQualified:56,launchAuditSha256:hash(power)});console.log(JSON.stringify({accepted,hosts:14,power:56,candidateCircuitSha256:hash(candidate)}))