64 lines
3.6 KiB
Markdown
64 lines
3.6 KiB
Markdown
|
|
# Implementation Plan
|
||
|
|
|
||
|
|
This plan outlines the step-by-step implementation of the `inire` auto-router. For detailed test cases, refer to [Testing Plan](./testing_plan.md).
|
||
|
|
|
||
|
|
## Phase 1: Core Geometry & Move Generation
|
||
|
|
**Goal:** Implement Ports, Polygons, and Component Library with high geometric fidelity.
|
||
|
|
1. **Project Setup:** Initialize `inire/` structure and `pytest` configuration. Include `hypothesis` for property-based testing.
|
||
|
|
2. **`geometry.primitives`:**
|
||
|
|
* `Port` with **1nm** snapping.
|
||
|
|
* Basic 2D transformations (rotate, translate).
|
||
|
|
* **Property-Based Tests:** Verify transform invariants (e.g., $90^\circ$ rotation cycles).
|
||
|
|
3. **`geometry.components`:**
|
||
|
|
* `Straight`, `Bend90`, `SBend`.
|
||
|
|
* **Search Grid Snapping:** Implement 1µm snapping for expanded ports.
|
||
|
|
* **Small S-Bends ($O < 2R$):** Logic for parametric generation.
|
||
|
|
* **Edge Cases:** Handle $O=2R$ and $L < 1\mu m$.
|
||
|
|
4. **Tests:**
|
||
|
|
* Verify geometric correctness (refer to Testing Plan Section 1).
|
||
|
|
* Unit tests for `Port` snapping and component transformations.
|
||
|
|
|
||
|
|
## Phase 2: Collision Engine & Cost
|
||
|
|
**Goal:** Build the R-Tree wrapper and the analytic cost function.
|
||
|
|
1. **`geometry.collision`:** Implement `CollisionEngine`.
|
||
|
|
* **Pre-dilation:** Obstacles/Paths dilated by $Clearance/2$.
|
||
|
|
* **Safety Zone:** Ignore collisions within **2nm** of start/end ports.
|
||
|
|
2. **`router.danger_map`:**
|
||
|
|
* Implement **1µm** pre-computed proximity grid.
|
||
|
|
* Optimize for design sizes up to **20x20mm** (< 2GB memory).
|
||
|
|
3. **`router.cost`:** Implement `CostEvaluator`.
|
||
|
|
* Bend cost: $10 \times (\text{Manhattan distance between ports})$.
|
||
|
|
* Integrate R-Tree for strict checks and Danger Map for heuristic.
|
||
|
|
4. **Tests:**
|
||
|
|
* Verify collision detection with simple overlapping shapes (Testing Plan Section 2.1).
|
||
|
|
* Verify Danger Map accuracy and memory footprint (Testing Plan Section 2.2).
|
||
|
|
* **Post-Route Validator:** Implement the independent `validate_path` utility.
|
||
|
|
|
||
|
|
## Phase 3: Single-Net A* Search
|
||
|
|
**Goal:** Route a single net from A to B with 1nm precision.
|
||
|
|
1. **`router.astar`:** Implement the priority queue loop.
|
||
|
|
* State representation: `(x_µm, y_µm, theta)`.
|
||
|
|
* Move expansion loop with 1µm grid.
|
||
|
|
* **Natural S-Bends:** Ensure search can find $O \ge 2R$ shifts by combining moves.
|
||
|
|
* **Look-ahead Snapping:** Actively bridge to the 1nm target when in the capture radius (10µm).
|
||
|
|
2. **Heuristic:** Manhattan distance $h(n)$ + orientation penalty + Danger Map lookup.
|
||
|
|
3. **Tests:**
|
||
|
|
* Solve simple maze problems and verify path optimality (Testing Plan Section 3).
|
||
|
|
* Verify snap-to-target precision at 1nm resolution.
|
||
|
|
* **Determinism:** Verify same seed = same path.
|
||
|
|
|
||
|
|
## Phase 4: Multi-Net PathFinder
|
||
|
|
**Goal:** Implement the "Negotiated Congestion" loop for multiple nets.
|
||
|
|
1. **`router.pathfinder`:**
|
||
|
|
* Sequential routing -> Identify congestion -> Inflate cost -> Reroute.
|
||
|
|
* **R-Tree Congestion:** Store dilated path geometries.
|
||
|
|
2. **Explicit Results:** Return `RoutingResult` objects with `is_valid` and `collisions` metadata.
|
||
|
|
3. **Tests:**
|
||
|
|
* Full multi-net benchmarks (Testing Plan Section 4).
|
||
|
|
* Verify rerouting behavior in crowded environments.
|
||
|
|
|
||
|
|
## Phase 5: Visualization, Benchmarking & Fuzzing
|
||
|
|
1. **`utils.visualization`:** Plot paths using `matplotlib`. Highlight collisions in red.
|
||
|
|
2. **Benchmarks:** Stress test with 50+ nets. Verify performance and node limits (Testing Plan Section 5).
|
||
|
|
3. **Fuzzing:** Run A* on randomized layouts to ensure stability.
|
||
|
|
4. **Final Validation:** Ensure all `is_valid=True` results pass the independent `validate_path` check.
|