I've been working on writing an autorouter with massive parallelization using CUDA. More of a learning exercise, but could potentially get somewhat decent (
)with brute force .
The algorithm works like this:
1. The initial board map is loaded
2. The net start and ending locations are marked on the map
3. Each cell (right now each pixel) checks its neighbors. If it's neighbor is the source end of the net or another direction vector, the cell points to it.
4. After a cell points to an adjacent cell, it will check the opposite cell. If the opposite cell is the destination of the net, the location is recorded. This triggers termination of the search.
5. Back on the CPU, the net is traced out starting at the destination by following the direction vectors back to the start.
6. Reset the direction vectors, and repeat.
So the shortest path is guaranteed , with optional preferred directions.
Here are some examples with 6 routes (starting points are random, not actually from a particular pad).
Single Layer:
Multilayer with a low via cost:
Multilayer with a high via cost:
Multilayer with annular rings:
Each route on this board (equivalent to a 5cm square board with 6mil clearance) takes ~0.2 seconds on a Tesla C2050, and ~3 seconds on my laptop's NVS5400M.
Source:
https://github.com/gaddra/Router/tree/Multilayer