seveibar/am3352-ram-dogbone-and-single-layer-route-test
AM3352BZCZ100 processor connected to a W631GG6MB-12 DDR3 memory chip through a routed, length-matched 16-bit DDR interface with clock/data-strobe pairs and control/address signals.
- Version
- 0.0.9
- License
- unset
- Stars
- 0
scripts/test-route-shape-audit.py
import importlib.util,math
from pathlib import Path
spec=importlib.util.spec_from_file_location('audit',str(Path(__file__).with_name('audit-route-shape.py')));m=importlib.util.module_from_spec(spec);spec.loader.exec_module(m)
def check(ps):return m.audit([dict(type='pcb_trace',source_trace_id='test',route=[dict(route_type='wire',layer='inner1',x=x,y=y,width=.1) for x,y in ps])])
def subdivide(ps):
out=[]
for a,b in zip(ps,ps[1:]):
for i in range(20):out.append((a[0]+(b[0]-a[0])*i/20,a[1]+(b[1]-a[1])*i/20))
return [*out,ps[-1]]
for ps in [[(0,0),(2,0)],[(0,0),(1,0),(2,1)]]:
for p in [ps,subdivide(ps)]:
r=check(p);assert r['netsWithSelfContact']==r['netsWithSelfClearanceViolations']==r['sharpCornerCount']==r['undersizedCurveVertexCount']==0,r
contact=[(0,0),(1,0),(1,.08),(0,.08)]
for ps in [contact,subdivide(contact)]:assert check(ps)['netsWithSelfContact']==1
assert check([(0,0),(1,0),(1,1)])['sharpCornerCount']==1
for radius,fail in [(.12,False),(.04,True)]:
p=[(radius*math.cos(i*math.pi/36),radius*math.sin(i*math.pi/36)) for i in range(37)]
r=check(p);assert bool(r['undersizedCurveVertexCount'])==fail,r
assert check([(0,0),(math.sqrt(3),1)])['nonOctilinearLongSegmentCount']==1
print('PASS: straight and 45 degree tracks, real-radius arcs, undersized arcs, sharp corners, oblique lines, and sampling-invariant self contact')