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/diagnose-ddr-stage-copper.ts
/** Bounded single-layer replay: preserve each installed stage's raw geometry. */
import {readFileSync,writeFileSync,mkdirSync} from 'node:fs'
import {resolve} from 'node:path'
import {AutoroutingPipelineSolver4} from '@tscircuit/capacity-autorouter'
import {preservePipeline4Terminals,checkHostTerminalContract} from './route-ddr-sequential'
import {verifyDdrCapture} from './ddr-capture-provenance'
import {verifyDdrSystemCopper} from './check-ddr-system-copper'
import {auditRouteAngles} from './check-route-angles'
const [directory,inputPath,seedPath,out]=process.argv.slice(2)
if(!directory||!inputPath||!seedPath||!out)throw Error('Usage: capture input seed output')
const read=(p:string)=>JSON.parse(readFileSync(p,'utf8')),write=(name:string,value:any)=>writeFileSync(resolve(out,name),JSON.stringify(value,null,2)+'\n')
const {captureHash}=verifyDdrCapture(directory),input=read(inputPath),seed=read(seedPath),original=read(resolve(directory,'unrouted.circuit.json')),connections=read(resolve(directory,'merged-routing-input.json')).connections
if(seed.captureHash!==captureHash||input.__ddrCaptureHash!==captureHash||input.layerCount!==1)throw Error('Requires coherent single-layer capture')
const selected=connections.filter((c:any)=>input.connections.some((i:any)=>i.name===c.name))
const actualLayers=[...new Set(selected.flatMap((c:any)=>c.pointsToConnect.map((p:any)=>p.layer)))]
if(actualLayers.length!==1)throw Error('Requires one actual terminal layer')
const layer=actualLayers[0],solver:any=new AutoroutingPipelineSolver4(input,{effort:1}),reports:any[]=[]
mkdirSync(out,{recursive:true});preservePipeline4Terminals(solver)
const capture=(stage:string,routes:any[])=>{
const traces=routes.map((r:any,i:number)=>{
if(r.route.some((p:any)=>p.z!==0))throw Error('Unexpected layer transition in single-layer stage')
return {type:'pcb_trace',pcb_trace_id:`${stage}_${i}`,connection_name:r.rootConnectionName??r.connectionName,route:r.route.map((p:any)=>({route_type:'wire',x:p.x,y:p.y,layer,width:p.traceThickness??r.traceThickness??input.minTraceWidth}))}
})
const physical=verifyDdrSystemCopper(original,[...seed.traces,...traces],connections),angles=auditRouteAngles(traces),terminals=checkHostTerminalContract(traces,selected)
write(`${stage}.json`,{captureHash,layerSpace:'physical',traces,hdRoutes:routes,physical,terminals,angles})
const report={stage,traces:traces.length,points:traces.reduce((n:number,t:any)=>n+t.route.length,0),angleViolations:angles.violations.length,headingViolations:angles.violations.filter((v:any)=>v.kind==='non-45-degree heading').length,errors:physical.errors.length,clearanceViolations:physical.violations.length,joinedBends:physical.joinedBends.length,terminalContractValid:terminals.valid,connectedNets:physical.connectivity.filter((c:any)=>c.connected).length}
reports.push(report);write('report.json',{captureHash,reports});console.log(JSON.stringify(report))
}
solver.pipelineDef=solver.pipelineDef.map((step:any)=>({...step,getConstructorParams:(instance:any)=>{const params=step.getConstructorParams(instance);if(Array.isArray(params[0]?.hdRoutes))capture(`before-${step.solverName}`,params[0].hdRoutes);return params}}))
while(!solver.solved&&!solver.failed){if(solver.portPointPathingSolver)solver.portPointPathingSolver.MAX_ITERATIONS=1000000;solver.step()}
if(solver.failed)throw Error(solver.error)
capture('after-globalDrcForceImproveSolver',solver.globalDrcForceImproveSolver.getOutput())