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/ddr-spacing-intervals.ts

export type SpacingPoint={x:number;y:number}
export type SpacingInterval=[number,number]
export function unionSpacingIntervals(intervals:SpacingInterval[]):SpacingInterval[]{
 const sorted=intervals.filter(([a,b])=>b>a+1e-12).map(([a,b])=>[Math.max(0,a),Math.min(1,b)]as SpacingInterval).sort((a,b)=>a[0]-b[0]),out:SpacingInterval[]=[]
 for(const [a,b]of sorted){if(b<=a)continue;const last=out.at(-1);if(last&&a<=last[1]+1e-10)last[1]=Math.max(last[1],b);else out.push([a,b])}return out
}
/** Exact subject fractions lying within the radius of a finite segment.
 * Split at projections onto the other segment's endpoints, then solve the
 * appropriate line-strip or endpoint-circle quadratic. */
export function segmentProximityIntervals(a:SpacingPoint,b:SpacingPoint,c:SpacingPoint,d:SpacingPoint,radius:number):SpacingInterval[]{
 if(![a.x,a.y,b.x,b.y,c.x,c.y,d.x,d.y,radius].every(Number.isFinite)||radius<=0)throw Error('Finite positive spacing geometry required')
 const vx=b.x-a.x,vy=b.y-a.y,wx=d.x-c.x,wy=d.y-c.y,l2=wx*wx+wy*wy,v2=vx*vx+vy*vy
 if(v2<1e-20)return []
 const u0=l2?((a.x-c.x)*wx+(a.y-c.y)*wy)/l2:0,u1=l2?(vx*wx+vy*wy)/l2:0,cuts=[0,1]
 if(Math.abs(u1)>1e-15)for(const u of[0,1]){const t=(u-u0)/u1;if(t>0&&t<1)cuts.push(t)}cuts.sort((a,b)=>a-b)
 const out:SpacingInterval[]=[]
 for(let i=1;i<cuts.length;i++){
  const lo=cuts[i-1]!,hi=cuts[i]!,u=u0+u1*(lo+hi)/2;let A:number,B:number,C:number
  if(!l2||u<0||u>1){const p=u>1?d:c,px=a.x-p.x,py=a.y-p.y;A=v2;B=2*(px*vx+py*vy);C=px*px+py*py-radius*radius}
  else{const k0=wx*(a.y-c.y)-wy*(a.x-c.x),k1=wx*vy-wy*vx;A=k1*k1;B=2*k0*k1;C=k0*k0-radius*radius*l2}
  if(A<1e-20){if(C<0)out.push([lo,hi]);continue}
  const discriminant=B*B-4*A*C;if(discriminant<=0)continue
  const root=Math.sqrt(discriminant),start=Math.max(lo,(-B-root)/(2*A)),end=Math.min(hi,(-B+root)/(2*A));if(end>start)out.push([start,end])
 }
 return unionSpacingIntervals(out)
}