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/audit-ddr-current-cache-envelopes.ts

/** Current-cache form of audit-ddr-e3-cache-envelopes: same full-width/radius bounds, without E3-only assumptions. */
import{readFileSync,writeFileSync}from'node:fs'
import{resolve}from'node:path'
import{createHash}from'node:crypto'
import{verifyDdrCapture}from'./ddr-capture-provenance'
import{auditRouteAngles}from'./check-route-angles'
const[captureArg,dirArg]=process.argv.slice(2),dir=resolve(dirArg!),hash=(v:any)=>createHash('sha256').update(JSON.stringify(v)).digest('hex'),bound:Record<string,string>={},read=(p:string)=>{p=resolve(p);bound[p]=createHash('sha256').update(readFileSync(p)).digest('hex');return JSON.parse(readFileSync(p,'utf8'))},capture=verifyDdrCapture(resolve(captureArg!)),candidate=read(`${dir}/candidate.circuit.json`),report=read(`${dir}/report.json`)
if(report.captureHash!==capture.captureHash||report.candidateCircuitSha256!==hash(candidate))throw Error('Current candidate hash mismatch')
const bounds=(paths:any[],copper:boolean)=>{const q=paths.flatMap(p=>p.route).map(p=>{const diameter=p.route_type==='via'?p.via_diameter:p.width;if(!Number.isFinite(p.x)||!Number.isFinite(p.y)||!Number.isFinite(diameter)||diameter<=0)throw Error('Invalid copper dimension');return{...p,r:copper?diameter/2:0}});return{minX:Math.min(...q.map(p=>p.x-p.r)),maxX:Math.max(...q.map(p=>p.x+p.r)),minY:Math.min(...q.map(p=>p.y-p.r)),maxY:Math.max(...q.map(p=>p.y+p.r))}},growth=(a:any,b:any)=>({left:Math.max(0,a.minX-b.minX),right:Math.max(0,b.maxX-a.maxX),bottom:Math.max(0,a.minY-b.minY),top:Math.max(0,b.maxY-a.maxY)}),near=(a:any,b:any)=>Object.keys(a).every(k=>typeof a[k]==='number'&&typeof b?.[k]==='number'&&Math.abs(a[k]-b[k])<1e-8)
const bytes=[0,1].map(byte=>{const paths=read(`${dir}/ram-byte${byte}-facing-progress.trace-paths.json`),contract=read(`${dir}/${byte?'ram-byte1-exit-contract.json':'exit-contract.json'}`),frozen=capture.snapshot.pathsByByte[byte];if(paths.length!==72||frozen.length!==72||new Set(paths.map((p:any)=>p.connection)).size!==72)throw Error('Incomplete72cache');const changedBalls=paths.filter((p:any)=>hash(p)!==hash(frozen.find((q:any)=>q.connection===p.connection))).map((p:any)=>p.connection.replace('U1.ball_','')).sort(),frozenCenterlineBounds=bounds(frozen,false),currentCenterlineBounds=bounds(paths,false),frozenCopperBounds=bounds(frozen,true),currentCopperBounds=bounds(paths,true),paddingGrowthMm=growth(frozenCenterlineBounds,currentCenterlineBounds),copperPaddingGrowthMm=growth(frozenCopperBounds,currentCopperBounds),issues:string[]=[];if(hash([...(contract.changedBalls??[])].sort())!==hash(changedBalls))issues.push('changedBalls differs from actual frozen-cache comparison');if(contract.pathCount!==72||contract.unchangedPaths!==72-changedBalls.length)issues.push('Path counts mismatch');if(!near(contract.priorCenterlineBounds,frozenCenterlineBounds)||!near(contract.newCenterlineBounds,currentCenterlineBounds))issues.push('Contract centerline bounds stale');if(!near(contract.paddingChangeBySideMm,paddingGrowthMm)||Math.abs(contract.paddingChangeMm-Math.max(...Object.values(paddingGrowthMm)))>1e-8)issues.push('Contract padding claim differs');if(contract.candidateCircuitSha256!==hash(candidate)||contract.ramCacheSha256!==hash(paths))issues.push('Contract candidate/cache binding mismatch');const angles=auditRouteAngles(paths);if(!angles.valid)issues.push('Cache angles invalid');return{byte,pathCount:72,changedBalls,unchangedPaths:72-changedBalls.length,frozenCenterlineBounds,currentCenterlineBounds,frozenCopperBounds,currentCopperBounds,paddingGrowthMm,copperPaddingGrowthMm,zeroCenterlineGrowth:Object.values(paddingGrowthMm).every(v=>v<1e-8),zeroCopperGrowth:Object.values(copperPaddingGrowthMm).every(v=>v<1e-8),cacheObjectSha256:hash(paths),contractObjectSha256:hash(contract),contractScope:contract.scope,issues,anglesValid:angles.valid}})
for(const[p,h]of Object.entries(bound))if(createHash('sha256').update(readFileSync(p)).digest('hex')!==h)throw Error('Input changed');const audit={captureHash:capture.captureHash,candidateCircuitSha256:hash(candidate),reportObjectSha256:hash(report),valid:bytes.every(b=>!b.issues.length),bytes,inputFileHashes:bound,scope:'Actual72paths per byte, full wire half-width and via radius bounding envelope relative to frozen physical-layer RAM caches. Excludes unchanged component pads and separate board support copper. No geometry or contract mutation.'};writeFileSync(`${dir}/cache-envelope-audit.json`,JSON.stringify(audit,null,2)+'\n');console.log(JSON.stringify({valid:audit.valid,bytes:bytes.map(b=>({byte:b.byte,changedBalls:b.changedBalls,unchangedPaths:b.unchangedPaths,copperGrowth:b.copperPaddingGrowthMm,issues:b.issues}))}));if(!audit.valid)process.exitCode=1