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/check-ddr-host-router.ts

import type { GenericLocalAutorouter, SimpleRouteJson } from '@tscircuit/core'
import { readFileSync, writeFileSync, mkdirSync, mkdtempSync } from 'node:fs'
/** Integration-only router scope: explicitly route external signal traces.
 * CPU power is verified by independent plane-contact checks, not re-autorouted.
 * All original obstacles and preloaded traces remain present. */
export async function routeHostSignals(input: SimpleRouteJson, direct=process.argv.includes('--direct')): Promise<GenericLocalAutorouter> {
 const signalInput={...input,connections:input.connections.filter(c=>Boolean(c.source_trace_id))}
 mkdirSync('dist/ddr-host',{recursive:true})
 writeFileSync('dist/ddr-host/signal-router-input.json',JSON.stringify(signalInput,null,2))
 if(direct) {
  const traces=signalInput.connections.map(c=>{
   if(c.pointsToConnect.length!==2)throw new Error('Direct fixture requires exactly two real exits')
   const [a,b]=c.pointsToConnect
   if(a!.layer!==b!.layer)throw new Error('Direct fixture does not invent layer transitions')
   if(Math.hypot(a!.x-b!.x,a!.y-b!.y)<1)throw new Error('Host exits must be noncoincident')
   const width=.12
   const corner={x:a!.x+Math.sign(b!.x-a!.x)*Math.abs(b!.y-a!.y),y:b!.y}
   if(corner.x<Math.min(a!.x,b!.x)||corner.x>Math.max(a!.x,b!.x))throw new Error('45 degree fixture requires enough horizontal span')
   return {type:'pcb_trace' as const,pcb_trace_id:`host:${c.name}`,connection_name:c.name,source_trace_id:c.source_trace_id,route:[a!,corner,b!].map(p=>({route_type:'wire' as const,x:p.x,y:p.y,layer:a!.layer,width}))}
  })
  const handlers: Record<string, Array<(e:any)=>void>>={complete:[],error:[],progress:[]}
  return {input:signalInput,isRouting:false,start(){queueMicrotask(()=>handlers.complete.forEach(h=>h({type:'complete',traces})))},stop(){},on(e,h){handlers[e].push(h)},solveSync(){return traces}}
 }
 const jobDir=mkdtempSync('dist/ddr-host/capacity-job-')
 const inputPath=`${jobDir}/input.json`
 const outputPath=`${jobDir}/output.json`
 writeFileSync(inputPath,JSON.stringify(signalInput))
 const child=Bun.spawn(['bun',new URL('./check-ddr-host-solver.ts',import.meta.url).pathname,inputPath,outputPath],{stdout:'pipe',stderr:'pipe'})
 let timedOut=false
 const timer=setTimeout(()=>{timedOut=true;child.kill()},30000)
 const exitCode=await child.exited
 clearTimeout(timer)
 if(timedOut)throw new Error('Host capacity router exceeded 30 second wall-clock diagnostic limit')
 if(exitCode!==0)throw new Error(`Host capacity router failed: ${await new Response(child.stderr).text()}`)
 const traces=JSON.parse(readFileSync(outputPath,'utf8'))
 const handlers: Record<string, Array<(e:any)=>void>>={complete:[],error:[],progress:[]}
 return {input:signalInput,isRouting:false,start(){queueMicrotask(()=>handlers.complete.forEach(h=>h({type:'complete',traces})))},stop(){},on(e,h){handlers[e].push(h)},solveSync(){return traces}}
}