# Python Package Structure

This document outlines the directory structure and module organization for the `inire` auto-router package.

## 1. Directory Layout

```
inire/
├── __init__.py             # Exposes the main `Router` class and key types
├── geometry/               # Core geometric primitives and operations
│   ├── __init__.py
│   ├── primitives.py       # Point, Port, Polygon, Arc classes
│   ├── collision.py        # R-Tree wrapper and intersection logic
│   └── components.py       # Move generators (Straight, Bend90, SBend)
├── router/                 # Search algorithms and pathfinding
│   ├── __init__.py
│   ├── astar.py            # Hybrid State-Lattice A* implementation
│   ├── graph.py            # Node, Edge, and Graph data structures
│   ├── cost.py             # Cost functions (length, bend, proximity)
│   ├── danger_map.py       # Pre-computed grid for heuristic proximity costs
│   └── pathfinder.py       # Multi-net "Negotiated Congestion" manager
├── utils/                  # Utility functions
│   ├── __init__.py
│   └── visualization.py    # Plotting tools for debug/heatmaps (matplotlib/klayout)
└── tests/                  # Unit and integration tests
    ├── __init__.py
    ├── conftest.py         # Pytest fixtures (common shapes, PDK cells)
    ├── test_primitives.py  # Tests for Port and coordinate transforms
    ├── test_components.py  # Tests for Straight, Bend90, SBend generation
    ├── test_collision.py   # Tests for R-Tree and dilation logic
    ├── test_cost.py        # Tests for Danger Map and cost evaluation
    ├── test_astar.py       # Tests for single-net routing (mazes, snapping)
    └── test_pathfinder.py  # Multi-net "Negotiated Congestion" benchmarks
```

## 2. Module Responsibilities

### `inire.geometry`
*   **`primitives.py`**: Defines the `Port` named tuple `(x, y, theta)` and helper functions for coordinate transforms.
*   **`collision.py`**: Wraps the `rtree` or `shapely` library. Handles the "Analytic Correctness" checks (exact polygon distance).
*   **`components.py`**: Logic to generate "Moves" from a start port. E.g., `SBend.generate(start_port, offset, radius)` returns a list of polygons and the end port. Handles $O > 2R$ logic.

### `inire.router`
*   **`astar.py`**: The heavy lifter. Maintains the `OpenSet` (priority queue) and `ClosedSet`. Implements the "Snap-to-Target" logic.
*   **`cost.py`**: compute $f(n) = g(n) + h(n)$. encapsulates the "Danger Map" and Path R-Tree lookups.
*   **`danger_map.py`**: Manages the pre-computed proximity grid used for $O(1)$ heuristic calculations.
*   **`pathfinder.py`**: Orchestrates the multi-net loop. Tracks the Path R-Tree for negotiated congestion and triggers reroutes.

### `inire.tests`
*   **Structure:** Tests are co-located within the package for ease of access.
*   **Fixtures:** `conftest.py` will provide standard PDK cells (e.g., a $10\mu m$ radius bend) to avoid repetition in test cases.

## 3. Dependencies
*   `numpy`: Vector math.
*   `shapely`: Polygon geometry and intersection.
*   `rtree`: Spatial indexing.
*   `networkx` (Optional): Not used for core search to ensure performance.
