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
tests/normalize-ddr-host-routes.test.ts
import{test,expect}from'bun:test'
import{normalizeDdrHostRoutes}from'../scripts/normalize-ddr-host-routes'
import{auditRouteAngles}from'../scripts/check-route-angles'
const p=(x:number,y:number,layer='inner2')=>({route_type:'wire',x,y,layer,width:.1016})
test('normalizes arbitrary segments and 90 corners while preserving endpoints',()=>{const original=[{pcb_trace_id:'a',route:[p(0,0),p(2,1),p(2,3)]}];const before=JSON.stringify(original),r=normalizeDdrHostRoutes(original);expect(r.complete).toBe(true);expect(auditRouteAngles(r.routes).valid).toBe(true);expect(r.routes[0].route[0]).toEqual(original[0]!.route[0]);expect(r.routes[0].route.at(-1)).toEqual(original[0]!.route.at(-1));expect(JSON.stringify(original)).toBe(before);expect(r.acceptedPhysicalRouting).toBe(false)})
test('preserves via geometry and refuses a rejected clearance candidate',()=>{const via={route_type:'via',x:2,y:1,from_layer:'inner2',to_layer:'inner4',via_diameter:.4572,via_hole_diameter:.254};const input=[{pcb_trace_id:'v',route:[p(0,0),p(2,1),via,p(2,1,'inner4'),p(4,2,'inner4')]}];const r=normalizeDdrHostRoutes(input);expect(r.complete).toBe(true);expect(r.routes[0].route.filter((q:any)=>q.route_type==='via')).toEqual([via]);expect(normalizeDdrHostRoutes(input,{acceptCandidate:()=>false}).complete).toBe(false)})
test('does not force a chamfer into insufficient space',()=>{expect(normalizeDdrHostRoutes([{pcb_trace_id:'tiny',route:[p(0,0),p(.05,0),p(.05,.05)]}]).complete).toBe(false)})
test('coincident terminal vertices retain electrical endpoint metadata',()=>{const r=normalizeDdrHostRoutes([{pcb_trace_id:'ports',route:[{...p(0,0),start_pcb_port_id:'A'},p(1,0),{...p(1,0),end_pcb_port_id:'B'}]}]);expect(r.routes[0].route[0].start_pcb_port_id).toBe('A');expect(r.routes[0].route.at(-1).end_pcb_port_id).toBe('B')})
test('shortcutting requires an explicit full-candidate acceptance predicate',()=>{
const input=[{pcb_trace_id:'shortcut',route:[{...p(0,0),start_pcb_port_id:'A'},p(.05,0),p(.05,.05),p(.1,.05),{...p(2,1),end_pcb_port_id:'B'}]}]
expect(normalizeDdrHostRoutes(input).complete).toBe(false)
let inspected=0
const result=normalizeDdrHostRoutes(input,{acceptCandidate:t=>{inspected++;return auditRouteAngles([t]).valid}})
expect(result.complete).toBe(true);expect(inspected).toBeGreaterThan(0)
expect(result.routes[0].route[0]).toEqual(input[0]!.route[0]);expect(result.routes[0].route.at(-1)).toEqual(input[0]!.route.at(-1))
expect(normalizeDdrHostRoutes(input,{acceptCandidate:()=>false}).complete).toBe(false)
})
test('predicate can reject direct shortcuts and select an intermediate-anchor variant',()=>{
const input=[{pcb_trace_id:'anchor',route:[p(0,0),p(.05,0),p(.05,.05),p(0,2),p(4,2),p(4,0)]}]
const result=normalizeDdrHostRoutes(input,{acceptCandidate:t=>t.route.some((q:any)=>q.y>=2)})
expect(result.complete).toBe(true)
expect(result.routes[0].route.some((q:any)=>q.y>=2)).toBe(true)
})
test('outward terminal collars survive shortcutting at both ends',()=>{
const original=[{pcb_trace_id:'collars',route:[{...p(0,0),start_pcb_port_id:'A'},p(0,.03),p(2,1.03),{...p(2,1),end_pcb_port_id:'B'}]}]
const result=normalizeDdrHostRoutes(original,{acceptCandidate:()=>true,terminalDirections:[{x:0,y:0,layer:'inner2',dx:1,dy:0},{x:2,y:1,layer:'inner2',dx:-1,dy:0}]})
expect(result.complete).toBe(true)
const route=result.routes[0].route
expect(route[0]).toEqual(original[0]!.route[0]);expect(route.at(-1)).toEqual(original[0]!.route.at(-1))
expect(route[1].x).toBeCloseTo(.2);expect(route[1].y).toBe(0)
expect(route.at(-2).x).toBeCloseTo(1.8);expect(route.at(-2).y).toBe(1)
expect(auditRouteAngles(result.routes).valid).toBe(true)
expect(route[1].start_pcb_port_id).toBeUndefined()
})
test('terminal directions and collars must meet physical geometric rules',()=>{
const input=[{pcb_trace_id:'a',route:[p(0,0),p(2,1)]}]
expect(()=>normalizeDdrHostRoutes(input,{terminalDirections:[{x:0,y:0,layer:'inner2',dx:1,dy:.1}]})).toThrow('octilinear')
expect(()=>normalizeDdrHostRoutes(input,{terminalDirections:[{x:0,y:0,layer:'inner2',dx:1,dy:0}],terminalCollarMm:.05})).toThrow('minimum leg')
})
test('outward-facing terminals can wrap through bounded 45-degree doglegs',()=>{
const input=[{pcb_trace_id:'wrap',route:[p(0,0),p(3,0)]}]
const directions=[{x:0,y:0,layer:'inner2',dx:-1,dy:0},{x:3,y:0,layer:'inner2',dx:1,dy:0}]
expect(normalizeDdrHostRoutes(input,{terminalDirections:directions}).complete).toBe(false)
const result=normalizeDdrHostRoutes(input,{terminalDirections:directions,acceptCandidate:()=>true})
expect(result.complete).toBe(true);expect(auditRouteAngles(result.routes).valid).toBe(true)
const route=result.routes[0].route
expect(route[1].x).toBeCloseTo(-.2);expect(route.at(-2).x).toBeCloseTo(3.2)
expect(route.some((q:any)=>Math.abs(q.y)>=.4)).toBe(true)
expect(normalizeDdrHostRoutes(input,{terminalDirections:directions,acceptCandidate:()=>false}).complete).toBe(false)
})