From 4cbd15bc0d40d7a97f4cc34b119d8b0a3071f3f4 Mon Sep 17 00:00:00 2001 From: Jan Petykiewicz Date: Sun, 8 Mar 2026 22:57:42 -0700 Subject: [PATCH] add various direction examples --- README.md | 2 ++ examples/05_orientation_stress.py | 56 ++++++++++++++++++++++++++++++ examples/orientation_stress.png | Bin 0 -> 64673 bytes inire/router/danger_map.py | 6 +++- 4 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 examples/05_orientation_stress.py create mode 100644 examples/orientation_stress.png diff --git a/README.md b/README.md index 4aea8d0..6b9858d 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,8 @@ Check the `examples/` directory for ready-to-run scripts demonstrating core feat * **`examples/01_simple_route.py`**: Basic single-net routing with visualization. * **`examples/02_congestion_resolution.py`**: Multi-net routing resolving bottlenecks using Negotiated Congestion. * **`examples/03_locked_paths.py`**: Incremental workflow using `lock_net()` to route around previously fixed paths. +* **`examples/04_sbends_and_radii.py`**: Complex paths using parametric S-bends and multiple bend radii. +* **`examples/05_orientation_stress.py`**: Stress test for various port orientation combinations (U-turns, opposite directions). Run an example: ```bash diff --git a/examples/05_orientation_stress.py b/examples/05_orientation_stress.py new file mode 100644 index 0000000..1f48487 --- /dev/null +++ b/examples/05_orientation_stress.py @@ -0,0 +1,56 @@ +from inire.geometry.collision import CollisionEngine +from inire.geometry.primitives import Port +from inire.router.astar import AStarRouter +from inire.router.cost import CostEvaluator +from inire.router.danger_map import DangerMap +from inire.router.pathfinder import PathFinder +from inire.utils.visualization import plot_routing_results + + +def main() -> None: + print("Running Example 05: Orientation Stress Test...") + + # 1. Setup Environment + # Give some breathing room (-20 to 120) for U-turns and flips (R=10) + bounds = (-20, -20, 120, 120) + engine = CollisionEngine(clearance=2.0) + danger_map = DangerMap(bounds=bounds) + danger_map.precompute([]) + + evaluator = CostEvaluator(engine, danger_map, greedy_h_weight=1.1) + router = AStarRouter(evaluator, node_limit=100000) + pf = PathFinder(router, evaluator) + + # 2. Define Netlist with various orientation challenges + netlist = { + # Opposite directions: requires two 90-degree bends to flip orientation + "opposite": (Port(10, 80, 0), Port(90, 80, 180)), + + # 90-degree turn: standard L-shape + "turn_90": (Port(10, 60, 0), Port(40, 90, 90)), + + # Output behind input: requires a full U-turn + "behind": (Port(80, 40, 0), Port(20, 40, 0)), + + # Sharp return: output is behind and oriented towards the input + "return_loop": (Port(80, 20, 0), Port(40, 10, 180)), + } + net_widths = {nid: 2.0 for nid in netlist} + + # 3. Route + results = pf.route_all(netlist, net_widths) + + # 4. Check Results + for nid, res in results.items(): + status = "Success" if res.is_valid else "Failed" + total_len = sum(comp.length for comp in res.path) if res.path else 0 + print(f" {nid:12}: {status}, total_length={total_len:.1f}") + + # 5. Visualize + fig, ax = plot_routing_results(results, [], bounds, netlist=netlist) + fig.savefig("examples/orientation_stress.png") + print("Saved plot to examples/orientation_stress.png") + + +if __name__ == "__main__": + main() diff --git a/examples/orientation_stress.png b/examples/orientation_stress.png new file mode 100644 index 0000000000000000000000000000000000000000..20556c3e44c9b2f5fc3606478eaf501dc8ff465b GIT binary patch literal 64673 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 bool: + """Check if a coordinate is within the design bounds.""" + return self.minx <= x <= self.maxx and self.miny <= y <= self.maxy + def get_cost(self, x: float, y: float) -> float: """Get the proximity cost at a specific coordinate.""" ix = int((x - self.minx) / self.resolution) @@ -77,4 +81,4 @@ class DangerMap: if 0 <= ix < self.width_cells and 0 <= iy < self.height_cells: return float(self.grid[ix, iy]) - return 1e6 # Outside bounds is expensive + return 1e15 # Outside bounds is impossible