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/ddr-facing-context.ts
/** Revalidate the complete support/exit replacement chain before routing. */
import{readFileSync,existsSync}from'node:fs'
import{resolve}from'node:path'
import{createHash}from'node:crypto'
import{verifyDdrCapture}from'./ddr-capture-provenance'
import{objectHash,validateDeclaredDdrReplacements}from'./improve-ddr-a9-power-launches'
import{loadDdrSupportRoutingContext,supportCopperObstacles}from'./ddr-support-routing-context'
import{verifyDdrSystemCopper}from'./check-ddr-system-copper'
import{assertRouteAngles}from'./check-route-angles'
export function applyFacingExitReplacements(parent:any[],changes:any){
if(changes.traces?.length!==1||changes.breakoutPoints?.length!==1)throw Error('Expected one exact exit change')
const trace=changes.traces[0],exit=changes.breakoutPoints[0]
if(trace.before.type!=='pcb_trace'||exit.before.type!=='pcb_breakout_point'||!trace.before.source_trace_id||trace.before.source_trace_id!==exit.before.source_trace_id||!trace.before.connectsTo?.includes(exit.before.pcb_breakout_point_id))throw Error('Exit replacement is not a source-owned trace/terminal pair')
const metadata=(e:any,keys:readonly string[])=>Object.fromEntries(Object.entries(e).filter(([key])=>!keys.includes(key)))
for(const [r,keys]of[[trace,['route']],[exit,['x','y','layer']]]as const)if(objectHash(metadata(r.before,keys))!==objectHash(metadata(r.after,keys)))throw Error('Exit replacement changed non-geometric metadata')
const viaIndex=trace.before.route.findIndex((p:any)=>p.route_type==='via')
if(viaIndex<0||objectHash(trace.before.route.slice(0,viaIndex))!==objectHash(trace.after.route.slice(0,viaIndex)))throw Error('Exit replacement changed original pad launch')
const barrels=(route:any[])=>route.filter((p:any)=>p.route_type==='via').map((p:any)=>metadata(p,['to_layer']))
if(objectHash(barrels(trace.before.route))!==objectHash(barrels(trace.after.route)))throw Error('Exit replacement changed physical barrels')
const last=trace.after.route.at(-1)
if(last?.route_type!=='wire'||last.layer!==exit.after.layer||Math.hypot(last.x-exit.after.x,last.y-exit.after.y)>1e-7)throw Error('Exit terminal does not match actual copper')
assertRouteAngles([trace.after])
const next=structuredClone(parent)
for(const r of[...changes.traces,...changes.breakoutPoints]){
const key=`${r.before.type}_id`,index=next.findIndex((e:any)=>e.type===r.before.type&&e[key]===r.before[key])
if(index<0||objectHash(next[index])!==objectHash(r.before)||r.after.type!==r.before.type||r.after[key]!==r.before[key])throw Error('Exit replacement identity or before state differs')
for(const field of['source_trace_id','source_net_id','source_port_id','subcircuit_id'])if(r.after[field]!==r.before[field])throw Error('Exit replacement changed source ownership')
next[index]=r.after
}
return next
}
export async function loadFacingContext(capture:string,supportDir:string,facingDir:string){
const hashes=new Map<string,string>(),hashFile=(p:string)=>createHash('sha256').update(readFileSync(p)).digest('hex'),read=(p:string)=>{p=resolve(p);hashes.set(p,hashFile(p));return JSON.parse(readFileSync(p,'utf8'))}
const{captureHash}=verifyDdrCapture(capture),original=read(resolve(capture,'unrouted.circuit.json')),input=read(resolve(capture,'routing-input.json')),map=read(resolve(capture,'signal-map.json')),host=read(resolve(facingDir,'host-bundle.json')),candidate=read(resolve(facingDir,'candidate.circuit.json')),report=read(resolve(facingDir,'report.json'))
const seen=new Set<string>(),chain:any[]=[]
const validateSupport=async(dir:string):Promise<any[]>=>{
dir=resolve(dir);if(seen.has(dir)||seen.size>8)throw Error('Invalid support ancestry');seen.add(dir)
const c=read(resolve(dir,'candidate.circuit.json')),r=read(resolve(dir,'report.json')),h=read(resolve(dir,'host-bundle.json'))
if(r.captureHash!==captureHash||h.captureHash!==captureHash||objectHash(h.traces)!==objectHash(host.traces))throw Error('Support/host capture mismatch')
const path=resolve(dir,'original-copper-replacements.json')
if(existsSync(path)){
const m=read(path);if(m.captureHash!==captureHash||r.originalCopperReplacementsSha256!==objectHash(m))throw Error('Stale replacement manifest')
const parent=await validateSupport(m.parentDirectory);chain.push(validateDeclaredDdrReplacements(parent,c,m))
}else{const v=await loadDdrSupportRoutingContext(capture,resolve(dir,'candidate.circuit.json'),original,host.traces,captureHash);chain.push(v.evidence)}
return c
}
const support=await validateSupport(supportDir)
if(report.captureHash!==captureHash||report.parentSupportCircuitSha256!==objectHash(support)||report.candidateCircuitSha256!==objectHash(candidate)||objectHash(applyFacingExitReplacements(support,report.exitReplacement))!==objectHash(candidate))throw Error('Facing candidate does not match the complete declared parent')
const ids=new Set(host.traces.map((t:any)=>t.pcb_trace_id))
for(const t of host.traces)if(objectHash(candidate.find((e:any)=>e.pcb_trace_id===t.pcb_trace_id))!==objectHash(t))throw Error('Host seed differs from actual copper')
const fixed=candidate.filter((e:any)=>!ids.has(e.pcb_trace_id))
const connections=input.connections.map((c:any)=>({...c,pointsToConnect:c.pointsToConnect.map((p:any)=>{const exit=candidate.find((e:any)=>e.type==='pcb_breakout_point'&&e.pcb_breakout_point_id===p.pointId);if(!exit)throw Error('Missing actual exit');return{...p,x:exit.x,y:exit.y,layer:exit.layer}})}))
assertRouteAngles(candidate.filter((e:any)=>e.type==='pcb_trace'))
const revisedTraces=report.exitReplacement.traces.map((r:any)=>r.after),revisedIds=new Set(revisedTraces.map((t:any)=>t.pcb_trace_id))
const physical=verifyDdrSystemCopper(fixed.filter((e:any)=>!revisedIds.has(e.pcb_trace_id)),[...host.traces,...revisedTraces],connections,{})
if(physical.errors.length||physical.violations.length||!physical.angles.valid||physical.joinedBends.length||physical.connectivity.filter((c:any)=>c.connected).length!==host.traces.length)throw Error('Fresh complete-candidate check failed')
const ownerPath=resolve('/Users/ankan/Documents/Codex/2026-09-10/what-x20/outputs/mt41k512m8da-107-it-p-fanout/scripts/audit-am3352-obstacle-ownership.ts');hashes.set(ownerPath,hashFile(ownerPath))
const{getSourceNetOwnerForAudit}=await import(ownerPath),owner=getSourceNetOwnerForAudit(candidate)
const names=new Map<string,string[]>()
for(const c of connections){const net=owner(c.source_trace_id??c.name);if(!net)throw Error('Unresolved source net');names.set(net,[...new Set([...(names.get(net)??[]),c.name])])}
const obstacles=fixed.filter((e:any)=>['pcb_trace','pcb_via','pcb_smtpad'].includes(e.type)).flatMap((e:any)=>supportCopperObstacles([e]).map(o=>({...o,...((e.type==='pcb_smtpad'&&e.shape==='circle')||e.type==='pcb_via'||o.obstacleId.startsWith('fixed_via_')||o.obstacleId.endsWith('_cap')?{shape:'circle'}:{}),connectedTo:names.get(owner(e[`${e.type}_id`]))??[`reserved:${e[`${e.type}_id`]}`]})))
const assertUnchanged=()=>{verifyDdrCapture(capture);for(const[p,h]of hashes)if(hashFile(p)!==h)throw Error(`Routing source changed: ${p}`)}
assertUnchanged()
return{captureHash,candidate,host,report,input:{...input,connections,obstacles,traces:host.traces},map,fixed,chain,assertUnchanged,evidence:{captureHash,candidateSha256:objectHash(candidate),supportChain:chain,inputFileHashes:Object.fromEntries(hashes),obstacleCount:obstacles.length,scope:'Actual copper from a revalidated replacement chain; all inline barrels included on every physical layer, exact rotated wire rectangles and circular caps.'}}
}