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-d11-on-latest.ts
/** Replay only D11 local escape and host onto the latest frozen seventeen-host board. */
import{readFileSync,writeFileSync,mkdirSync,copyFileSync}from'node:fs';import{resolve}from'node:path';import{createHash}from'node:crypto';import{spawnSync}from'node:child_process';import{fanoutTracePath}from'@tscircuit/props';import{objectHash as hash}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{verifyDdrSystemCopper,auditDdrTraceJunctions}from'./check-ddr-system-copper';import{auditDdrLocalEscapeContacts}from'./audit-ddr-local-escape-contacts';import{checkHostTerminalContract}from'./route-ddr-sequential';import{refreshDdrPlaneContacts}from'./ddr-plane-contact-audit';
const[parentArg='dist/ddr-seventeen-byte0-matched',outArg='dist/ddr-eighteen-d11-connected']=process.argv.slice(2),parent=resolve(parentArg),out=resolve(outArg),capture=resolve('dist/ddr-system/host-taps-54af3e346b5e'),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'))},c=read(parent+'/candidate.circuit.json'),prior=read(parent+'/report.json'),oldHost=read(parent+'/host-bundle.json'),input=read(parent+'/routing-input.json'),oldManifest=read(parent+'/original-copper-replacements.json'),oldPower=read(parent+'/ram-power-launch-audit.json'),proposal=read('dist/ddr-d11-facing-host/original-copper-replacements.json'),proposalReport=read('dist/ddr-d11-facing-host/report.json'),changes=proposal.sourceRamExitChanges,raw=proposal.additions,local=applyFacingExitReplacements(c,changes),candidate=[...local,...raw],host={...oldHost,traces:[...oldHost.traces,...raw]},connections=input.connections.map((n:any)=>({...n,pointsToConnect:n.pointsToConnect.map((p:any)=>{const x=changes.breakoutPoints.find((r:any)=>r.before.pcb_breakout_point_id===p.pointId);return x?{...p,x:x.after.x,y:x.after.y,layer:x.after.layer}:p})}));if(parent===out||!proposalReport.accepted||prior.candidateCircuitSha256!==hash(c)||oldHost.traces.length!==17||raw.length!==1||raw[0].source_trace_id!=='source_trace_689'||changes.traces.length!==1||changes.traces[0].before.source_trace_id!=='source_trace_652')throw Error('Unexpectedparent/D11source');
const topology=auditCompositeHostTopology(candidate,host.traces,connections),localContacts=auditDdrLocalEscapeContacts(candidate.filter((e:any)=>e.pcb_trace_id!==raw[0].pcb_trace_id),changes.traces[0].after,connections),allAngles=auditRouteAngles(candidate.filter((e:any)=>e.type==='pcb_trace')),allJunctions=auditDdrTraceJunctions(candidate,connections),terminal=checkHostTerminalContract(host.traces,connections.filter((n:any)=>host.traces.some((t:any)=>t.connection_name===n.name))),planes=candidate.filter((e:any)=>e.type==='pcb_copper_pour'),planeAudit=refreshDdrPlaneContacts(prior.planeAudit,planes,candidate);mkdirSync(out,{recursive:true});const write=(n:string,v:any)=>writeFileSync(out+'/'+n,JSON.stringify(v,null,2)+'\n');write('combined-audit.json',{topology,localContacts,allAngles,allJunctions,terminal,planeAudit});if(!topology.valid||!localContacts.valid||!allAngles.valid||!allJunctions.valid||!terminal.valid||topology.physical.connectivity.filter((n:any)=>n.connected).length!==18)throw Error('Latest18combinedgeometryfailed');
const cache=read(parent+'/ram-byte1-facing-progress.trace-paths.json'),proposedCache=read('dist/ddr-sixteen-d11-facing/ram-byte1-facing-progress.trace-paths.json'),oldContract=read(parent+'/ram-byte1-exit-contract.json'),proposedContract=read('dist/ddr-sixteen-d11-facing/ram-byte1-exit-contract.json'),index=cache.findIndex((p:any)=>p.connection==='U1.ball_C8'),proposedPath=proposedCache.find((p:any)=>p.connection==='U1.ball_C8'),newCache=cache.map((p:any,i:number)=>i===index?proposedPath:p);if(index<0||cache.length!==72||!proposedPath)throw Error('MissingC8cache');for(const p of newCache)fanoutTracePath.parse(p);if(!auditRouteAngles(newCache).valid)throw Error('Cacheanglefailed');const exit=proposedContract.exits.find((e:any)=>e.ball==='C8'),contract={...oldContract,candidateCircuitSha256:hash(candidate),ramCacheSha256:hash(newCache),changedBalls:[...oldContract.changedBalls,'C8'],unchangedPaths:72-new Set([...oldContract.changedBalls,'C8']).size,exits:[...oldContract.exits.filter((e:any)=>e.ball!=='C8'),exit],scope:'RAM1B7,C7,D2,C8facingpaths; 68otherpaths unchanged, noaddedpadding. D11inner6hostnowconnected; fullDDRqualificationincomplete.'};
const manifest={captureHash:prior.captureHash,parentDirectory:parent,parentCircuitSha256:hash(c),candidateCircuitSha256:hash(candidate),replacements:proposal.replacements,additions:raw,removals:[],sourceRamExitChanges:changes,inputHashes:Object.fromEntries(hashes),parentManifestSha256:hash(oldManifest),allOtherElementsExact:true,planesUnchanged:true},report={...prior,accepted:true,candidateCircuitSha256:hash(candidate),supportCircuitSha256:hash(candidate),hostTracesSha256:hash(host.traces),hostBundleSha256:hash(host),originalCopperReplacementsSha256:hash(manifest),parentReportSha256:hash(prior),parentAssemblyManifestSha256:hash(oldManifest),inputFileHashes:Object.fromEntries(hashes),physical:topology.physical,topology,fullCandidateAngles:allAngles,fixedJunctionAudit:allJunctions,terminalContract:terminal,planeAudit,connectedHostCount:18,preservedHostCount:17,addedHostCount:1,modifiedHostCount:0,ramByte1CacheSha256:hash(newCache),d11Evidence:{proposalReport,fullPlanarMm:proposalReport.lengths.fullPlanarMm,nominalMm:proposalReport.lengths.nominalMm},supportValidation:{valid:true,method:'ExactlocalC8replacement andoneD11hostappend; all17priorhosts andplanes retained.'},scope:'Eighteen physicalendpoint-onlyhosts; source-ownedD11shorterthan27.3001nominal, notyetmatchedtoDQS1. Parentbyte0timing andallplanes unchanged.'};
write('candidate.circuit.json',candidate);write('host-bundle.json',host);write('routing-input.json',{...input,traces:host.traces,connections,obstacles:undefined});write('original-copper-replacements.json',manifest);write('report.json',report);write('ram-byte1-facing-progress.trace-paths.json',newCache);write('ram-byte1-exit-contract.json',contract);write('host-route-report.json',{captureHash:prior.captureHash,accepted:true,physical:topology.physical,topology,allAngles,allJunctions,terminal});copyFileSync(parent+'/ram-byte0-facing-progress.trace-paths.json',out+'/ram-byte0-facing-progress.trace-paths.json');write('exit-contract.json',{...read(parent+'/exit-contract.json'),candidateCircuitSha256:hash(candidate)});write('source-provenance.json',{captureHash:prior.captureHash,parentDirectory:parent,parentReportSha256:hash(prior),parentManifestSha256:hash(oldManifest),currentManifestSha256:hash(manifest),inputHashes:Object.fromEntries(hashes)});copyFileSync(parent+'/original-copper-replacements.json',out+'/parent-original-copper-replacements.json');copyFileSync(parent+'/report.json',out+'/parent-report.json');
for(const script of['audit-ddr-global-power-launches.ts','audit-ddr-host-reference-coverage.ts']){const p=spawnSync(process.execPath,[resolve('scripts/'+script),out,capture],{encoding:'utf8'});if(p.status!==0)throw Error(p.stderr)}const power=JSON.parse(readFileSync(out+'/ram-power-launch-audit.json','utf8'));if(power.launchQualified!==56||power.planeConnected!==56||oldPower.rows.some((r:any)=>r.launchWithin1524Mm&&!power.rows.some((n:any)=>n.byte===r.byte&&n.ball===r.ball&&n.launchWithin1524Mm)))throw Error('Powerregression');Object.assign(report,{launchAuditSha256:hash(power),launchQualified:56,hostReferenceCoverageSha256:hash(JSON.parse(readFileSync(out+'/host-reference-coverage.json','utf8')))});write('report.json',report);const budgets=spawnSync(process.execPath,[resolve('scripts/audit-ddr-current-byte-budgets.ts'),capture,out,out+'/current-byte-budgets.json'],{encoding:'utf8'});if(budgets.status!==0)throw Error(budgets.stderr);for(const[p,h]of hashes)if(fh(p)!==h)throw Error('Inputchanged');console.log(JSON.stringify({out,candidateSha:hash(candidate),hosts:18,power:56,d11FullMm:report.d11Evidence.fullPlanarMm}))