tune examples for faster completion
|
|
@ -26,8 +26,8 @@ def main() -> None:
|
||||||
# Precompute the danger map (distance field) for heuristics
|
# Precompute the danger map (distance field) for heuristics
|
||||||
danger_map.precompute([obstacle])
|
danger_map.precompute([obstacle])
|
||||||
|
|
||||||
evaluator = CostEvaluator(engine, danger_map, bend_penalty=50.0, sbend_penalty=150.0)
|
evaluator = CostEvaluator(engine, danger_map, greedy_h_weight=1.5, bend_penalty=50.0, sbend_penalty=150.0)
|
||||||
router = AStarRouter(evaluator, snap_size=1.0, straight_lengths=[1.0, 5.0, 25.0], bend_radii=[10.0])
|
router = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0], sbend_radii=[10.0])
|
||||||
pf = PathFinder(router, evaluator)
|
pf = PathFinder(router, evaluator)
|
||||||
|
|
||||||
# 2. Define Netlist
|
# 2. Define Netlist
|
||||||
|
|
|
||||||
|
|
@ -16,8 +16,8 @@ def main() -> None:
|
||||||
danger_map = DangerMap(bounds=bounds)
|
danger_map = DangerMap(bounds=bounds)
|
||||||
danger_map.precompute([])
|
danger_map.precompute([])
|
||||||
|
|
||||||
evaluator = CostEvaluator(engine, danger_map, bend_penalty=50.0, sbend_penalty=150.0)
|
evaluator = CostEvaluator(engine, danger_map, greedy_h_weight=1.5, bend_penalty=50.0, sbend_penalty=150.0)
|
||||||
router = AStarRouter(evaluator, snap_size=1.0, straight_lengths=[1.0, 5.0, 25.0], bend_radii=[10.0])
|
router = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0], sbend_radii=[10.0])
|
||||||
pf = PathFinder(router, evaluator)
|
pf = PathFinder(router, evaluator)
|
||||||
|
|
||||||
# 2. Define Netlist
|
# 2. Define Netlist
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 69 KiB |
|
|
@ -18,8 +18,8 @@ def main() -> None:
|
||||||
danger_map = DangerMap(bounds=bounds)
|
danger_map = DangerMap(bounds=bounds)
|
||||||
danger_map.precompute([])
|
danger_map.precompute([])
|
||||||
|
|
||||||
evaluator = CostEvaluator(engine, danger_map, bend_penalty=50.0, sbend_penalty=150.0)
|
evaluator = CostEvaluator(engine, danger_map, greedy_h_weight=1.5, bend_penalty=50.0, sbend_penalty=150.0)
|
||||||
router = AStarRouter(evaluator, snap_size=1.0, straight_lengths=[1.0, 5.0, 25.0], bend_radii=[10.0])
|
router = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0], sbend_radii=[10.0])
|
||||||
pf = PathFinder(router, evaluator)
|
pf = PathFinder(router, evaluator)
|
||||||
|
|
||||||
# 2. Add a 'Pre-routed' net and lock it
|
# 2. Add a 'Pre-routed' net and lock it
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 92 KiB After Width: | Height: | Size: 86 KiB |
|
|
@ -16,8 +16,8 @@ def main() -> None:
|
||||||
danger_map = DangerMap(bounds=bounds)
|
danger_map = DangerMap(bounds=bounds)
|
||||||
danger_map.precompute([])
|
danger_map.precompute([])
|
||||||
|
|
||||||
evaluator = CostEvaluator(engine, danger_map, bend_penalty=50.0, sbend_penalty=150.0)
|
evaluator = CostEvaluator(engine, danger_map, greedy_h_weight=1.5, bend_penalty=50.0, sbend_penalty=150.0)
|
||||||
router = AStarRouter(evaluator, snap_size=1.0, straight_lengths=[1.0, 5.0, 25.0], bend_radii=[10.0])
|
router = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0], sbend_radii=[10.0])
|
||||||
pf = PathFinder(router, evaluator)
|
pf = PathFinder(router, evaluator)
|
||||||
|
|
||||||
# 2. Define Netlist: Complex orientation challenges
|
# 2. Define Netlist: Complex orientation challenges
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 77 KiB After Width: | Height: | Size: 79 KiB |
|
|
@ -30,18 +30,18 @@ def main() -> None:
|
||||||
danger_map.precompute(obstacles)
|
danger_map.precompute(obstacles)
|
||||||
|
|
||||||
# We'll run three separate routers since collision_type is a router-level config
|
# We'll run three separate routers since collision_type is a router-level config
|
||||||
evaluator = CostEvaluator(engine, danger_map, bend_penalty=50.0, sbend_penalty=150.0)
|
evaluator = CostEvaluator(engine, danger_map, greedy_h_weight=1.5, bend_penalty=50.0, sbend_penalty=150.0)
|
||||||
|
|
||||||
# Scenario 1: Standard 'arc' model (High fidelity)
|
# Scenario 1: Standard 'arc' model (High fidelity)
|
||||||
router_arc = AStarRouter(evaluator, snap_size=1.0, straight_lengths=[1.0, 5.0, 25.0], bend_radii=[10.0], bend_collision_type="arc")
|
router_arc = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0], sbend_radii=[10.0], bend_collision_type="arc")
|
||||||
netlist_arc = {"arc_model": (Port(10, 120, 0), Port(90, 140, 90))}
|
netlist_arc = {"arc_model": (Port(10, 120, 0), Port(90, 140, 90))}
|
||||||
|
|
||||||
# Scenario 2: 'bbox' model (Conservative axis-aligned box)
|
# Scenario 2: 'bbox' model (Conservative axis-aligned box)
|
||||||
router_bbox = AStarRouter(evaluator, snap_size=1.0, straight_lengths=[1.0, 5.0, 25.0], bend_radii=[10.0], bend_collision_type="bbox")
|
router_bbox = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0], sbend_radii=[10.0], bend_collision_type="bbox")
|
||||||
netlist_bbox = {"bbox_model": (Port(10, 70, 0), Port(90, 90, 90))}
|
netlist_bbox = {"bbox_model": (Port(10, 70, 0), Port(90, 90, 90))}
|
||||||
|
|
||||||
# Scenario 3: 'clipped_bbox' model (Balanced)
|
# Scenario 3: 'clipped_bbox' model (Balanced)
|
||||||
router_clipped = AStarRouter(evaluator, snap_size=1.0, straight_lengths=[1.0, 5.0, 25.0], bend_radii=[10.0], bend_collision_type="clipped_bbox", bend_clip_margin=1.0)
|
router_clipped = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0], sbend_radii=[10.0], bend_collision_type="clipped_bbox", bend_clip_margin=1.0)
|
||||||
netlist_clipped = {"clipped_model": (Port(10, 20, 0), Port(90, 40, 90))}
|
netlist_clipped = {"clipped_model": (Port(10, 20, 0), Port(90, 40, 90))}
|
||||||
|
|
||||||
# 2. Route each scenario
|
# 2. Route each scenario
|
||||||
|
|
|
||||||
|
|
@ -64,23 +64,24 @@ def main() -> None:
|
||||||
overlap_matrix = {} # (net_a, net_b) -> count
|
overlap_matrix = {} # (net_a, net_b) -> count
|
||||||
|
|
||||||
for nid, res in current_results.items():
|
for nid, res in current_results.items():
|
||||||
if res.path:
|
if not res.path:
|
||||||
for comp in res.path:
|
continue
|
||||||
for poly in comp.geometry:
|
for comp in res.path:
|
||||||
# Check what it overlaps with
|
for poly in comp.geometry:
|
||||||
overlaps = engine.dynamic_index.intersection(poly.bounds)
|
# Check what it overlaps with
|
||||||
for other_obj_id in overlaps:
|
overlaps = engine.dynamic_index.intersection(poly.bounds)
|
||||||
other_nid, other_poly = engine.dynamic_geometries[other_obj_id]
|
for other_obj_id in overlaps:
|
||||||
if other_nid != nid:
|
other_nid, other_poly = engine.dynamic_geometries[other_obj_id]
|
||||||
if poly.intersects(other_poly):
|
if other_nid != nid:
|
||||||
# Record hotspot
|
if poly.intersects(other_poly):
|
||||||
cx, cy = poly.centroid.x, poly.centroid.y
|
# Record hotspot
|
||||||
grid_key = (int(cx/20)*20, int(cy/20)*20)
|
cx, cy = poly.centroid.x, poly.centroid.y
|
||||||
hotspots[grid_key] = hotspots.get(grid_key, 0) + 1
|
grid_key = (int(cx/20)*20, int(cy/20)*20)
|
||||||
|
hotspots[grid_key] = hotspots.get(grid_key, 0) + 1
|
||||||
|
|
||||||
# Record pair
|
# Record pair
|
||||||
pair = tuple(sorted((nid, other_nid)))
|
pair = tuple(sorted((nid, other_nid)))
|
||||||
overlap_matrix[pair] = overlap_matrix.get(pair, 0) + 1
|
overlap_matrix[pair] = overlap_matrix.get(pair, 0) + 1
|
||||||
|
|
||||||
print(f" Iteration {idx} finished. Successes: {successes}/{len(netlist)}, Collisions: {total_collisions}")
|
print(f" Iteration {idx} finished. Successes: {successes}/{len(netlist)}, Collisions: {total_collisions}")
|
||||||
if overlap_matrix:
|
if overlap_matrix:
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 87 KiB After Width: | Height: | Size: 62 KiB |
|
|
@ -18,8 +18,8 @@ def main() -> None:
|
||||||
danger_map = DangerMap(bounds=bounds)
|
danger_map = DangerMap(bounds=bounds)
|
||||||
danger_map.precompute([])
|
danger_map.precompute([])
|
||||||
|
|
||||||
evaluator = CostEvaluator(engine, danger_map, bend_penalty=50.0, sbend_penalty=150.0)
|
evaluator = CostEvaluator(engine, danger_map, greedy_h_weight=1.5, bend_penalty=50.0, sbend_penalty=150.0)
|
||||||
router = AStarRouter(evaluator, snap_size=1.0, straight_lengths=[1.0, 5.0, 25.0], bend_radii=[10.0])
|
router = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0], sbend_radii=[10.0])
|
||||||
pf = PathFinder(router, evaluator)
|
pf = PathFinder(router, evaluator)
|
||||||
|
|
||||||
# 2. Define Netlist
|
# 2. Define Netlist
|
||||||
|
|
@ -38,7 +38,7 @@ def main() -> None:
|
||||||
|
|
||||||
print("Routing with custom collision model...")
|
print("Routing with custom collision model...")
|
||||||
# Override bend_collision_type with a literal Polygon
|
# Override bend_collision_type with a literal Polygon
|
||||||
router_custom = AStarRouter(evaluator, snap_size=1.0, straight_lengths=[1.0, 5.0, 25.0], bend_radii=[10.0], bend_collision_type=custom_poly)
|
router_custom = AStarRouter(evaluator, snap_size=1.0, bend_radii=[10.0], sbend_radii=[10.0], bend_collision_type=custom_poly)
|
||||||
results_custom = PathFinder(router_custom, evaluator, use_tiered_strategy=False).route_all(
|
results_custom = PathFinder(router_custom, evaluator, use_tiered_strategy=False).route_all(
|
||||||
{"custom_model": netlist["custom_bend"]}, {"custom_model": 2.0}
|
{"custom_model": netlist["custom_bend"]}, {"custom_model": 2.0}
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -26,9 +26,9 @@ def main() -> None:
|
||||||
danger_map = DangerMap(bounds=bounds)
|
danger_map = DangerMap(bounds=bounds)
|
||||||
danger_map.precompute(cage)
|
danger_map.precompute(cage)
|
||||||
|
|
||||||
evaluator = CostEvaluator(engine, danger_map, bend_penalty=50.0, sbend_penalty=150.0)
|
evaluator = CostEvaluator(engine, danger_map, greedy_h_weight=1.5, bend_penalty=50.0, sbend_penalty=150.0)
|
||||||
# Use a low node limit to fail faster
|
# Use a low node limit to fail faster
|
||||||
router = AStarRouter(evaluator, node_limit=2000, snap_size=1.0, straight_lengths=[1.0, 5.0, 25.0], bend_radii=[10.0])
|
router = AStarRouter(evaluator, node_limit=2000, snap_size=1.0, bend_radii=[10.0], sbend_radii=[10.0])
|
||||||
|
|
||||||
# Enable partial path return
|
# Enable partial path return
|
||||||
pf = PathFinder(router, evaluator)
|
pf = PathFinder(router, evaluator)
|
||||||
|
|
|
||||||