diff --git a/examples/01_simple_route.py b/examples/01_simple_route.py index 9cba29f..6bbbcfa 100644 --- a/examples/01_simple_route.py +++ b/examples/01_simple_route.py @@ -26,8 +26,8 @@ def main() -> None: # Precompute the danger map (distance field) for heuristics danger_map.precompute([obstacle]) - evaluator = CostEvaluator(engine, danger_map, 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]) + 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, bend_radii=[10.0], sbend_radii=[10.0]) pf = PathFinder(router, evaluator) # 2. Define Netlist diff --git a/examples/02_congestion_resolution.py b/examples/02_congestion_resolution.py index 0062351..f6265c2 100644 --- a/examples/02_congestion_resolution.py +++ b/examples/02_congestion_resolution.py @@ -16,8 +16,8 @@ def main() -> None: danger_map = DangerMap(bounds=bounds) danger_map.precompute([]) - evaluator = CostEvaluator(engine, danger_map, 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]) + 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, bend_radii=[10.0], sbend_radii=[10.0]) pf = PathFinder(router, evaluator) # 2. Define Netlist diff --git a/examples/03_locked_paths.png b/examples/03_locked_paths.png index 9eb4aec..a83f560 100644 Binary files a/examples/03_locked_paths.png and b/examples/03_locked_paths.png differ diff --git a/examples/03_locked_paths.py b/examples/03_locked_paths.py index 5d9b9bc..a60e944 100644 --- a/examples/03_locked_paths.py +++ b/examples/03_locked_paths.py @@ -18,8 +18,8 @@ def main() -> None: danger_map = DangerMap(bounds=bounds) danger_map.precompute([]) - evaluator = CostEvaluator(engine, danger_map, 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]) + 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, bend_radii=[10.0], sbend_radii=[10.0]) pf = PathFinder(router, evaluator) # 2. Add a 'Pre-routed' net and lock it diff --git a/examples/05_orientation_stress.png b/examples/05_orientation_stress.png index 7d87622..cc07131 100644 Binary files a/examples/05_orientation_stress.png and b/examples/05_orientation_stress.png differ diff --git a/examples/05_orientation_stress.py b/examples/05_orientation_stress.py index b53e846..1a1c8d6 100644 --- a/examples/05_orientation_stress.py +++ b/examples/05_orientation_stress.py @@ -16,8 +16,8 @@ def main() -> None: danger_map = DangerMap(bounds=bounds) danger_map.precompute([]) - evaluator = CostEvaluator(engine, danger_map, 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]) + 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, bend_radii=[10.0], sbend_radii=[10.0]) pf = PathFinder(router, evaluator) # 2. Define Netlist: Complex orientation challenges diff --git a/examples/06_bend_collision_models.png b/examples/06_bend_collision_models.png index 0dc3212..64bd8c9 100644 Binary files a/examples/06_bend_collision_models.png and b/examples/06_bend_collision_models.png differ diff --git a/examples/06_bend_collision_models.py b/examples/06_bend_collision_models.py index 7573930..e061dc4 100644 --- a/examples/06_bend_collision_models.py +++ b/examples/06_bend_collision_models.py @@ -30,18 +30,18 @@ def main() -> None: danger_map.precompute(obstacles) # 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) - 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))} # 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))} # 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))} # 2. Route each scenario diff --git a/examples/07_large_scale_routing.py b/examples/07_large_scale_routing.py index dc4ad42..d26cec6 100644 --- a/examples/07_large_scale_routing.py +++ b/examples/07_large_scale_routing.py @@ -64,23 +64,24 @@ def main() -> None: overlap_matrix = {} # (net_a, net_b) -> count for nid, res in current_results.items(): - if res.path: - for comp in res.path: - for poly in comp.geometry: - # Check what it overlaps with - overlaps = engine.dynamic_index.intersection(poly.bounds) - for other_obj_id in overlaps: - other_nid, other_poly = engine.dynamic_geometries[other_obj_id] - if other_nid != nid: - if poly.intersects(other_poly): - # Record hotspot - cx, cy = poly.centroid.x, poly.centroid.y - grid_key = (int(cx/20)*20, int(cy/20)*20) - hotspots[grid_key] = hotspots.get(grid_key, 0) + 1 + if not res.path: + continue + for comp in res.path: + for poly in comp.geometry: + # Check what it overlaps with + overlaps = engine.dynamic_index.intersection(poly.bounds) + for other_obj_id in overlaps: + other_nid, other_poly = engine.dynamic_geometries[other_obj_id] + if other_nid != nid: + if poly.intersects(other_poly): + # Record hotspot + cx, cy = poly.centroid.x, poly.centroid.y + grid_key = (int(cx/20)*20, int(cy/20)*20) + hotspots[grid_key] = hotspots.get(grid_key, 0) + 1 - # Record pair - pair = tuple(sorted((nid, other_nid))) - overlap_matrix[pair] = overlap_matrix.get(pair, 0) + 1 + # Record pair + pair = tuple(sorted((nid, other_nid))) + overlap_matrix[pair] = overlap_matrix.get(pair, 0) + 1 print(f" Iteration {idx} finished. Successes: {successes}/{len(netlist)}, Collisions: {total_collisions}") if overlap_matrix: diff --git a/examples/08_custom_bend_geometry.png b/examples/08_custom_bend_geometry.png index fea9c69..ecb3f89 100644 Binary files a/examples/08_custom_bend_geometry.png and b/examples/08_custom_bend_geometry.png differ diff --git a/examples/08_custom_bend_geometry.py b/examples/08_custom_bend_geometry.py index 6041158..5ff6a88 100644 --- a/examples/08_custom_bend_geometry.py +++ b/examples/08_custom_bend_geometry.py @@ -18,8 +18,8 @@ def main() -> None: danger_map = DangerMap(bounds=bounds) danger_map.precompute([]) - evaluator = CostEvaluator(engine, danger_map, 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]) + 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, bend_radii=[10.0], sbend_radii=[10.0]) pf = PathFinder(router, evaluator) # 2. Define Netlist @@ -38,7 +38,7 @@ def main() -> None: print("Routing with custom collision model...") # 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( {"custom_model": netlist["custom_bend"]}, {"custom_model": 2.0} ) diff --git a/examples/09_unroutable_best_effort.py b/examples/09_unroutable_best_effort.py index a77cf85..fb0444e 100644 --- a/examples/09_unroutable_best_effort.py +++ b/examples/09_unroutable_best_effort.py @@ -26,9 +26,9 @@ def main() -> None: danger_map = DangerMap(bounds=bounds) 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 - 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 pf = PathFinder(router, evaluator)