astra/am3352-sbc

A 4-layer AM3352 single-board computer with 128‑MiB DDR3, PMIC power regulation, USB‑C 5‑V PD input, dual USB host ports, HDMI output with ESD protection, microSD/UART/JTAG interfaces, addressable RGB indicators, and a PWM-driven buzzer.

Version
0.1.19
License
unset
Stars
0

scripts/refine-ddr.ts

import {BusLanesSolver,type SimpleRouteJson} from "@tscircuit/bus-lanes-solver";
import {readFile,writeFile} from "node:fs/promises";
const stem=process.argv[2]??"output/ram-seeds/pairs-2";
const input:any=JSON.parse(await readFile(`${stem}.srj.json`,"utf8"));
const original:any=JSON.parse(await readFile("output/ddr.srj.json","utf8"));
const traces:any[]=JSON.parse(await readFile(`${stem}.routes.json`,"utf8"));
input.buses=original.buses.filter((b:any)=>b.connectionNames.length>1);
const escapes:any[]=[];
const lanes=traces.map(t=>{
 const start=t.route.findIndex((p:any)=>p.route_type==="wire"&&p.layer!=="top");
 const end=t.route.findLastIndex((p:any)=>p.route_type==="wire"&&p.layer!=="top");
 const route=t.route.slice(start,end+1);
 escapes.push({...t,pcb_trace_id:t.pcb_trace_id+"_a",route:t.route.slice(0,start+1)},{...t,pcb_trace_id:t.pcb_trace_id+"_b",route:t.route.slice(end)});
 const c=input.connections.find((c:any)=>c.name===t.connection_name);c.pointsToConnect=[route[0],route.at(-1)];
 return {...t,route,coupledSection:t.coupledSection?.map((n:number)=>n-start),curvedSegments:t.curvedSegments?.map((n:number)=>n-start)};
});
input.traces=[...input.traces??[],...escapes];
const solver=BusLanesSolver.forRefinement(input as SimpleRouteJson,lanes,{maxSearchIterations:150000,maxLaneIterations:10000,smoothTuning:process.env.REFINE_SMOOTH!=="0"});
const started=Date.now();
while(!solver.solved&&!solver.failed&&Date.now()-started<120000)solver.step();
await writeFile(`${stem}.refinement.json`,JSON.stringify({solved:solver.solved,failed:solver.failed,error:solver.error,phase:solver.phase,stats:solver.stats},null,2));
console.log({solved:solver.solved,error:solver.error,phase:solver.phase});
if(solver.solved){
 const complete=solver.traces.map(t=>{
  const before=escapes.find(e=>e.pcb_trace_id===t.pcb_trace_id+"_a");
  const after=escapes.find(e=>e.pcb_trace_id===t.pcb_trace_id+"_b");
  return {...t,route:[...before.route.slice(0,-1),...t.route,...after.route.slice(1)]};
 });
 await writeFile(`${stem}.matched.routes.json`,JSON.stringify(complete,null,2));
}