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/improve-ddr-d9-ground-launches.ts
/** D9 repair with recursively checked original-copper replacements. */
import{readFileSync,writeFileSync,mkdirSync,copyFileSync,existsSync}from'node:fs'
import{resolve}from'node:path'
import{spawnSync}from'node:child_process'
import{objectHash,validateDeclaredDdrReplacements}from'./improve-ddr-a9-power-launches'
import{loadDdrSupportRoutingContext}from'./ddr-support-routing-context'
import{verifyDdrCapture}from'./ddr-capture-provenance'
import{verifyDdrSystemCopper}from'./check-ddr-system-copper'
import{planDdrGroundAntipads}from'./ddr-ground-plane-antipads'
import{refreshDdrPlaneContacts}from'./ddr-plane-contact-audit'
const read=(p:string)=>JSON.parse(readFileSync(p,'utf8'))
export async function validateDdrReplacementChain(folder:string,capture:string,original:any[],hosts:any[],captureHash:string,seen=new Set<string>()):Promise<any>{
folder=resolve(folder);if(seen.has(folder)||seen.size>=16)throw Error('Invalid recursive support chain');seen.add(folder)
const circuit=read(`${folder}/candidate.circuit.json`),report=read(`${folder}/report.json`),path=`${folder}/original-copper-replacements.json`
if(report.captureHash!==captureHash||report.physical.errors.length||report.physical.violations.length||!report.physical.angles.valid||report.physical.joinedBends.length)throw Error('Invalid parent evidence')
if(!existsSync(path))return{directory:folder,baseline:(await loadDdrSupportRoutingContext(capture,`${folder}/candidate.circuit.json`,original,hosts,captureHash)).evidence}
const m=read(path)
if(m.captureHash!==captureHash||objectHash(m)!==report.originalCopperReplacementsSha256)throw Error('Replacement manifest provenance mismatch')
const previous=await validateDdrReplacementChain(m.parentDirectory,capture,original,hosts,captureHash,seen),parent=read(`${m.parentDirectory}/candidate.circuit.json`)
return{directory:folder,parent:previous,validation:validateDeclaredDdrReplacements(parent,circuit,m),manifestSha256:objectHash(m)}
}
export async function improveD9(parentDir:string,captureDir:string,outDir:string){
if(resolve(parentDir)===resolve(outDir))throw Error('Output must be isolated')
const parent=read(`${parentDir}/candidate.circuit.json`),prior=read(`${parentDir}/report.json`),host=read(`${parentDir}/host-bundle.json`),priorAudit=read(`${parentDir}/ram-power-launch-audit.json`),original=read(`${captureDir}/unrouted.circuit.json`),connections=read(`${captureDir}/routing-input.json`).connections,{captureHash}=verifyDdrCapture(captureDir)
if(host.captureHash!==captureHash||host.layerSpace!=='physical'||prior.launchAuditSha256!==objectHash(priorAudit)||priorAudit.launchQualified!==54)throw Error('Stale power54 parent')
const hostIds=new Set(host.traces.map((t:any)=>t.pcb_trace_id)),hosts=parent.filter((e:any)=>e.type==='pcb_trace'&&hostIds.has(e.pcb_trace_id)),parentChain=await validateDdrReplacementChain(parentDir,captureDir,original,hosts,captureHash)
if(hosts.length!==host.traces.length)throw Error('Missing actual host')
const child=structuredClone(parent),replacements:any[]=[],newVias:any[]=[],changedIds=new Set<string>()
const replace=(index:number,after:any,reason:string)=>{const before=parent[index];child[index]=after;replacements.push({id:`${before.type}:${before[`${before.type}_id`]}`,before,after,beforeSha256:objectHash(before),afterSha256:objectHash(after),reason})}
for(const byte of[0,1]){
const row=priorAudit.unresolved.find((r:any)=>r.byte===byte&&r.terminal==='VSSQ_D9'),tailId=`saved_fanout_pcb_group_${byte?5:3}_38`,tailIndex=child.findIndex((e:any)=>e.type==='pcb_trace'&&e.pcb_trace_id===tailId),tail=parent[tailIndex],tailAudit=priorAudit.rows.find((r:any)=>r.pcbTraceId===tailId)
if(!row||!tailAudit?.launchWithin1524Mm||tailAudit.terminal!=='VDD_D7'||tailAudit.connectionVia.annulusSamplesInPlane!==32||tail.route[2].route_type!=='via'||tail.route.slice(3).some((p:any)=>p.route_type!=='wire'||p.layer!=='bottom'))throw Error('Expected plane-connected D7 tail')
const trimmed={...structuredClone(tail),route:tail.route.slice(0,3),connectsTo:(tail.connectsTo??[]).filter((id:string)=>!id.startsWith('pcb_breakout_point_'))};delete trimmed.connection_name
replace(tailIndex,trimmed,'Remove only bottom tail after existing plane-connected D7 power via. Pad and via retained exactly; edge handoff retired.')
const index=child.findIndex((e:any)=>e.type==='pcb_trace'&&e.pcb_trace_id===row.pcbTraceId),before=parent[index],start=before.route[0],x=start.x-.55,y=start.y
const after={...structuredClone(before),route:[start,{route_type:'wire',x,y,width:.12,layer:'top'},{route_type:'via',x,y,from_layer:'top',to_layer:'inner1',via_diameter:.4572,via_hole_diameter:.254}],connectsTo:(before.connectsTo??[]).filter((id:string)=>!id.startsWith('pcb_breakout_point_'))};delete after.connection_name
replace(index,after,'Replace D9 edge stub with straight0.55mm ground launch into inner1; new through via, historical edge handoff retired.');changedIds.add(before.pcb_trace_id)
const oldVias=parent.flatMap((e:any)=>e.type==='pcb_via'?[{x:e.x,y:e.y,d:e.outer_diameter}]:e.type==='pcb_trace'?e.route.filter((p:any)=>p.route_type==='via').map((p:any)=>({x:p.x,y:p.y,d:p.via_diameter})):[]),minimumExistingViaCopperEdgeGapMm=Math.min(...oldVias.map((p:any)=>Math.hypot(x-p.x,y-p.y)-(p.d+.4572)/2))
if(!Number.isFinite(minimumExistingViaCopperEdgeGapMm)||minimumExistingViaCopperEdgeGapMm<.1016-1e-8)throw Error('Via barrel spacing failed')
newVias.push({byte,x,y,diameter:.4572,net:'GND',traceId:before.pcb_trace_id,padToViaMm:.55,minimumExistingViaCopperEdgeGapMm})
}
// Ground is foreign only to inner3 supply. Ground planes must remain filled.
const powerPlanes=parent.filter((e:any)=>e.type==='pcb_copper_pour'&&e.layer==='inner3'),antipads=planDdrGroundAntipads(powerPlanes,newVias.map(v=>({...v,net:'foreign-to-inner3-supply'})))
for(const plane of antipads.planes)replace(child.findIndex((e:any)=>e.type==='pcb_copper_pour'&&e.pcb_copper_pour_id===plane.pcb_copper_pour_id),plane,'Add two ground-via antipads to supply plane; retain outer boundary and old holes.')
const manifest={captureHash,parentDirectory:resolve(parentDir),parentCircuitSha256:objectHash(parent),candidateCircuitSha256:objectHash(child),replacements,newVias},supportValidation=validateDeclaredDdrReplacements(parent,child,manifest)
const witnesses=structuredClone(prior.planeAudit)
for(const p of witnesses.filter((p:any)=>['inner1','inner5'].includes(p.layer))){for(const v of newVias)p.viaContacts.push({id:`${v.traceId}:via:2`,x:v.x,y:v.y,annulusSamplesInPlane:32,total:32});p.uniqueViaCount+=2}
const planeAudit=refreshDdrPlaneContacts(witnesses,child.filter((e:any)=>e.type==='pcb_copper_pour'),child).map((p:any)=>({...p,foreignConductors:p.foreignConductors+(p.layer==='inner3'?2:0),minForeignClearanceMm:p.layer==='inner3'?Math.min(p.minForeignClearanceMm,.1016):p.minForeignClearanceMm}))
const fresh=child.filter((e:any)=>e.type==='pcb_trace'&&(hostIds.has(e.pcb_trace_id)||changedIds.has(e.pcb_trace_id))),freshIds=new Set(fresh.map((t:any)=>t.pcb_trace_id)),physical=verifyDdrSystemCopper(child.filter((e:any)=>e.type!=='pcb_trace'||!freshIds.has(e.pcb_trace_id)),fresh,connections,{})
if(physical.errors.length||physical.violations.length||!physical.angles.valid||physical.joinedBends.length)throw Error(`Full copper failure ${JSON.stringify(physical)}`)
if(hosts.some((t:any)=>!physical.connectivity.some((c:any)=>c.name===t.connection_name&&c.connected)))throw Error('Host connectivity lost')
mkdirSync(outDir,{recursive:true});const write=(n:string,v:any)=>writeFileSync(`${outDir}/${n}`,JSON.stringify(v,null,2));write('candidate.circuit.json',child);copyFileSync(`${parentDir}/host-bundle.json`,`${outDir}/host-bundle.json`);write('original-copper-replacements.json',manifest)
const report={...prior,parentReportSha256:objectHash(prior),supportValidationChain:{parent:parentChain,child:supportValidation},supportValidation,originalCopperReplacementsSha256:objectHash(manifest),planeAudit,planeChanges:{inherited:prior.planeChanges,addedAntipads:antipads.added,newGroundContactWitnesses:4},physical,scope:'Two D9 ground launches and two unused D7 bottom tail removals, recursively declared atop power54. All original parent hosts/support exact except listed trace/plane replacements. Actual source audit required; not complete DDR signoff.'};write('report.json',report)
const run=spawnSync(process.execPath,[resolve(import.meta.dir,'audit-ddr-global-power-launches.ts'),outDir,captureDir],{encoding:'utf8'});if(run.status!==0)throw Error(run.stderr)
const audit=read(`${outDir}/ram-power-launch-audit.json`)
if(audit.total!==60||audit.launchQualified!==56||audit.planeConnected!==56||priorAudit.rows.some((r:any)=>r.launchWithin1524Mm&&!audit.rows.some((n:any)=>n.byte===r.byte&&n.ball===r.ball&&n.launchWithin1524Mm)))throw Error('Source audit does not prove preserved54 and new56')
Object.assign(report,{launchAuditSha256:objectHash(audit),launchQualified:56});write('report.json',report)
return{output:resolve(outDir),candidateCircuitSha256:objectHash(child),launchQualified:56,newVias,errors:physical.errors.length,violations:physical.violations.length,anglesValid:physical.angles.valid,joined:physical.joinedBends.length,connected:physical.connectivity.filter((c:any)=>c.connected).length,minClearanceMm:physical.minClearanceMm}
}
if(import.meta.main){const [parent='dist/ddr-integrated-ten-power54',capture='dist/ddr-system/host-taps-54af3e346b5e',out='dist/ddr-integrated-ten-power56']=process.argv.slice(2);console.log(JSON.stringify(await improveD9(parent,capture,out),null,2))}