63 lines
2.3 KiB
Python
63 lines
2.3 KiB
Python
from inire.geometry.collision import CollisionEngine
|
|
from inire.geometry.components import Bend90
|
|
from inire.geometry.primitives import Port
|
|
from inire.router.astar import AStarContext
|
|
from inire.router.cost import CostEvaluator
|
|
from inire.router.danger_map import DangerMap
|
|
from inire.router.pathfinder import PathFinder
|
|
|
|
|
|
def test_arc_resolution_sagitta() -> None:
|
|
start = Port(0, 0, 0)
|
|
# R=10, 90 deg bend.
|
|
# High tolerance (0.5um) -> few segments
|
|
res_coarse = Bend90.generate(start, radius=10.0, width=2.0, direction="CCW", sagitta=0.5)
|
|
# Low tolerance (1nm) -> many segments
|
|
res_fine = Bend90.generate(start, radius=10.0, width=2.0, direction="CCW", sagitta=0.001)
|
|
|
|
|
|
# Check number of points in the polygon exterior
|
|
# (num_segments + 1) * 2 points usually
|
|
pts_coarse = len(res_coarse.geometry[0].exterior.coords)
|
|
pts_fine = len(res_fine.geometry[0].exterior.coords)
|
|
|
|
assert pts_fine > pts_coarse
|
|
|
|
|
|
def test_locked_paths() -> None:
|
|
engine = CollisionEngine(clearance=2.0)
|
|
danger_map = DangerMap(bounds=(0, -50, 100, 50))
|
|
danger_map.precompute([])
|
|
evaluator = CostEvaluator(engine, danger_map)
|
|
context = AStarContext(evaluator, bend_radii=[5.0, 10.0])
|
|
pf = PathFinder(context)
|
|
|
|
# 1. Route Net A
|
|
netlist_a = {"netA": (Port(0, 0, 0), Port(50, 0, 0))}
|
|
results_a = pf.route_all(netlist_a, {"netA": 2.0})
|
|
assert results_a["netA"].is_valid
|
|
|
|
# 2. Lock Net A
|
|
engine.lock_net("netA")
|
|
|
|
# 3. Route Net B through the same space. It should detour or fail.
|
|
# We'll place Net B's start/target such that it MUST cross Net A's physical path.
|
|
netlist_b = {"netB": (Port(0, -5, 0), Port(50, 5, 0))}
|
|
|
|
# Route Net B
|
|
results_b = pf.route_all(netlist_b, {"netB": 2.0})
|
|
|
|
# Net B should be is_valid (it detoured) or at least not have collisions
|
|
# with Net A in the dynamic set (because netA is now static).
|
|
# Since netA is static, netB will see it as a HARD collision if it tries to cross.
|
|
|
|
# Our A* will find a detour around the static obstacle.
|
|
assert results_b["netB"].is_valid
|
|
|
|
# Verify geometry doesn't intersect locked netA (physical check)
|
|
poly_a = [p.geometry[0] for p in results_a["netA"].path]
|
|
poly_b = [p.geometry[0] for p in results_b["netB"].path]
|
|
|
|
for pa in poly_a:
|
|
for pb in poly_b:
|
|
assert not pa.intersects(pb)
|