Commit Graph

272 Commits

Author SHA1 Message Date
Mikolaj Wielgus 8f59319902 feat(autorouter/autorouter): Have separate ratsnest for each (principal) layer 2025-10-15 15:15:02 +02:00
Mikolaj Wielgus cd73c766a5 refactor(topola-egui): Move storing principal layer to planar autoroute options
I've done some struct renaming while at it.
2025-10-13 21:38:47 +02:00
Mikolaj Wielgus 4c1a72dc1d refactor(autorouter/autorouter): Put ratsnest in wrapper, mostly transparent for now 2025-10-13 00:32:53 +02:00
Mikolaj Wielgus 60cf00e014 feat(autorouter/anterouter): As second choice, anteroute fanouts in ordinal directions 2025-10-10 18:03:50 +02:00
Mikolaj Wielgus 8235c66c7e fix(autorouter/anterouter): Correctly calculate fanout lengths 2025-10-08 02:18:56 +02:00
Mikolaj Wielgus a3521e7286 feat(autorouter/anterouter): Add option to set fanout clearance 2025-10-07 22:37:50 +02:00
Mikolaj Wielgus 506104a6a7 fix(autorouter/anterouter): Make fanouts axis-aligned with their ratline endpoints 2025-10-07 14:24:13 +02:00
Mikolaj Wielgus 7e1a5857b1 fix(autorouter/compass_direction): Correct flipped North/South 2025-10-07 13:58:29 +02:00
Mikolaj Wielgus c630abcdc1 feat(autorouter/anterouter): Anteroute fanouts farther than other-layer obstacles 2025-10-07 13:28:23 +02:00
Mikolaj Wielgus 8095c3a89a feat(autorouter/anterouter): Don't anteroute fanout vias inside polys 2025-10-06 13:18:19 +02:00
Mikolaj Wielgus 26ed61ad4d feat(autorouter/anterouter): Anteroute fanout segs to fanout vias 2025-10-03 15:55:58 +02:00
Mikolaj Wielgus 2ebd7ce82d feat(autorouter/anterouter): Fanout only in cardinal directions
This works around the falsely positively fillet exclusions our current
navmesh creation method causes.
2025-10-03 13:12:35 +02:00
Mikolaj Wielgus 1bbb068af9 feat(autorouter/compass_direction): Anteroute fanout vias in eight "compass" directions 2025-10-02 17:05:50 +02:00
Mikolaj Wielgus 9fcd12e6e1 Revert "refactor(autorouter/anterouter): Anchor in reference to dot circle, not bbox"
This reverts commit 46b84151fa.

This commit also added randomization of anchor position. I thought about
it again and decided that it was a bad idea.
2025-10-02 10:26:28 +02:00
Mikolaj Wielgus 46b84151fa refactor(autorouter/anterouter): Anchor in reference to dot circle, not bbox 2025-10-01 00:21:09 +02:00
Mikolaj Wielgus b50e58b0fa feat(autorouter/ratsnest): Have one terminating dot for each layer of ratvertex
Some routes projects still crash while autorouting, but we are
progressing.
2025-09-29 18:22:56 +02:00
Mikolaj Wielgus 9a5b2095d5 feat(autorouter/autorouter): Implement germ of multilayer autorouting 2025-09-27 15:45:10 +02:00
Mikolaj Wielgus 0e12f32db4 chore: Correct copyright lines (MIT, not MIT OR Apache-2.0) 2025-09-26 00:56:08 +02:00
Mikolaj Wielgus 6930f2fb1d feat(autorouter/presorter): Make presorter parametrizable 2025-09-25 17:36:12 +02:00
Mikolaj Wielgus c120a43d04 refactor(autorouter/presorter): Move some SCC code to new file 2025-09-25 16:42:00 +02:00
Mikolaj Wielgus c14f2d2e37 fix(autorouter/ratsnest): Prioritize principal layer ratlines over others 2025-09-24 01:50:55 +02:00
Mikolaj Wielgus a4a000feb9 feat(autorouter/ratsnest): Have ratlines across layers 2025-09-23 13:25:32 +02:00
Mikolaj Wielgus 50597653ad refactor(geometry/geometry): Remove `.graph()` and its remaining usages
This will allow us to store the dots, segs, bends differently than currently.
2025-09-15 22:42:45 +02:00
Mikolaj Wielgus f1e65267da refactor(triangulation): Don't use `.graph()` when creating triangulations 2025-09-15 22:42:45 +02:00
Mikolaj Wielgus 71fdec2f06 refactor(autorouter/ratsnest): Move unionfind to new file, don't use `.graph()` there 2025-09-15 22:42:45 +02:00
Mikolaj Wielgus e0cfc521ef refactor(geometry/geometry): Replace `NodeIndex<usize>` with just `usize`
This is a step towards ceasing to use Petgraph as internal storage for
geometry.
2025-09-15 22:42:45 +02:00
Mikolaj Wielgus 6a2102e0a2 refactor(graph): Rename `GetPetgraphIndex` to `GetIndex` 2025-09-15 22:42:45 +02:00
Mikolaj Wielgus 7c4bc87301 refactor(drawing/primitive): Rename Primitive<...> to PrimitiveRef<...> with its variants 2025-09-15 22:42:45 +02:00
Mikolaj Wielgus aee8c42720 feat(autorouter/presorter): Take into account ratline-pad intersections 2025-09-11 23:25:03 +02:00
Mikolaj Wielgus 1b485e81a6 feat(autorouter/permuter): Implement permutation by ratline cut
Not yet used, and can get stuck in an infinite loop, but the cut seems
to work.
2025-09-09 16:24:15 +02:00
Mikolaj Wielgus fe7c258851 refactor(autorouter/permutator): Move presorting to new file, `presorter.rs` 2025-09-07 16:40:29 +02:00
Mikolaj Wielgus 12ee2f3984 refactor(autorouter/permutator): Move permuter code to new `permuter.rs` file 2025-09-06 23:59:45 +02:00
Mikolaj Wielgus 4326925bbf feat(autorouter/permutator): Preorder and permutate over whole ratline conn. comps
This is not enough to autoroute 4x4_1206_led_matrix_breakout, but is as
usual, is a step forward.
2025-09-06 01:24:00 +02:00
Mikolaj Wielgus 19c6ede09a refactor(autorouter/autorouter): Move ratline sorting to `permutator.rs` 2025-09-05 12:58:30 +02:00
Mikolaj Wielgus f99f31e356 refactor(autorouter/autoroute): Move permutator to new file, `permutator.rs` 2025-09-05 12:33:15 +02:00
Mikolaj Wielgus e5e5f9513e feat(autorouter/ratline): Only count interior ratline intersections
This hardly makes a difference for now, but may become useful later.
2025-09-04 17:03:15 +02:00
Mikolaj Wielgus b49aa9e1b7 fix(autorouter/ratline): Don't count ratlines with shared endpoint as intersecting 2025-09-04 14:37:09 +02:00
Mikolaj Wielgus ce0424b3e6 fix(autorouter/autoroute): Skip permutations that result in nothing undone 2025-09-01 20:22:39 +02:00
Mikolaj Wielgus 3cc2315ebe refactor(autorouter/autoroute): Move permuting to new trait 2025-09-01 16:43:42 +02:00
Mikolaj Wielgus 521bb0598a refactor(specctra/design): Place fillet circles, netless for now 2025-08-30 16:52:17 +02:00
Mikolaj Wielgus 310e983b1d refactor(drawing/drawing): Move infringement and collision detection to drawing/query 2025-08-25 02:23:02 +02:00
Mikolaj Wielgus ca4a2d1cbf refactor(drawing/query): Rename collect.rs to query.rs, change trait to direct impl 2025-08-24 22:31:10 +02:00
Mikolaj Wielgus ac7b24f939 refactor(autorouter/autoroute): Store vecs of edits instead of large edits
This results in a large copy, but it should be possible to refactor the
code later to get rid of this.
2025-08-10 11:30:50 +02:00
Ellen Emilia Anna Zscheile 8732ee7fbb refactor(geometry/edit): Put reverse and merge functionality into trait (DRY) 2025-07-20 12:40:56 +02:00
Mikolaj Wielgus 09c98f2d17 feat(autorouter/autoroute): Add option to toggle permutation
Updated with the following command in Fish shell:

```
for f in tests/**.cmd; jq ".done?.[].Autoroute[1].permutate |= false" $f | sponge $f; end
```
2025-07-19 21:42:47 +02:00
Mikolaj Wielgus d181c7df1b feat(autorouter/autoroute): Implement basic brute-force permutator
Permutates if and until a solution is found. Does not do optimization
so far.

Thanks to this, it is now possible to route the DE-9 to DE-9 test
without having to find the correct sequence of autorouting jobs.
2025-07-19 21:31:31 +02:00
Mikolaj Wielgus d7129354a1 feat(autorouter/autoroute): Record band assigns so undo actually works
Aborting the autoroute stepper was unimplemented and it would make the
autorouting job finish instead. This is fixed now.
2025-07-17 21:08:42 +02:00
Mikolaj Wielgus 1cc75a79e8 feat(autorouter/autoroute): Make it possible to abort autoroute stepper
Aborting the autoroute stepper was unimplemented and it would make the
autorouting job finish instead. This is fixed now.
2025-07-17 12:50:51 +02:00
Mikolaj Wielgus 43005eb864 feat(autorouter/autorouter): Add presorting by ratline intersection count and length
Sadly, this does not work well for the DE-9 to DE-9 test, but it is a
step forward.
2025-07-14 13:26:38 +02:00
Mikolaj Wielgus 0752817538 refactor(autorouter/ratsnest): Split out ratline code to new file, ratline.rs 2025-07-14 13:26:38 +02:00
Mikolaj Wielgus ef78c92506 feat(autorouter/autoroute): Track progress of also past and future ratlines 2025-07-10 22:38:50 +02:00
Mikolaj Wielgus 68d9844d0d feat(topola-egui): Add progress bar for the currently routed ratline
The capability to measure progress will later be useful to choose slower
but better optimization strategies if more time is available.
2025-07-10 22:38:46 +02:00
Mikolaj Wielgus b25ad863ba refactor(autorouter/invoker): Merge debug overlay data traits into one trait
The name of this new trait shall be `GetDebugOverlayData`.
2025-07-06 23:09:08 +02:00
Ellen Emilia Anna Zscheile d3dc826be4 feat: Implement TopoNavmesh DualOuter-DualOuter extraction
This also fixes a sign bug in LineIntersection calculation
2025-06-27 15:15:26 +02:00
Ellen Emilia Anna Zscheile ed06170db5 feat: Debug print various TopoNavmesh structures / updates
- feat(autorouter/execution): Debug-print the whole TopoNavmesh on completion
- feat(router/ng/poly): Emit log output on route_to_exit success
2025-06-27 15:15:26 +02:00
Ellen Emilia Anna Zscheile a561b278fc feat(router/ng/router): Implementation of the topological router
- feat(autorouter): Prepare for population of planar Topo-Navmesh with existing routes
  See also issue #166.
- feat(topola-egui): Add dialog for topological navmesh layer selection
- feat(router/ng/eval): Optionally restrict set of allowed TopoNavmesh edges
- fix(router/ng/eval): Use poly_ext_handover
2025-06-27 15:15:24 +02:00
Ellen Emilia Anna Zscheile a4b1b3893c feat: Add interaction stepper for route building 2025-06-27 06:02:05 +02:00
Mikolaj Wielgus d0c304adbd feat(router/thetastar): Implement Theta* search algorithm
Closes https://codeberg.org/topola/topola/issues/121
2025-06-12 16:45:07 +02:00
Ellen Emilia Anna Zscheile 3ae298e4e9 feat(topola-egui): AppearancePanel active_layer selection should be explicit 2025-06-01 02:16:41 +02:00
Ellen Emilia Anna Zscheile 864cf9085a fix(drawing/band): BandTermsegIndex computation should be fallible
Fixes #221.
2025-05-26 14:51:23 +02:00
Ellen Emilia Anna Zscheile 56cc737b82 fix(autorouter/autoroute): Only route each pin-pin connection at most once
Fixes #219.
2025-05-26 14:17:11 +02:00
Mikolaj Wielgus 24d119ad04 refactor(router/navmesh): Rename "navvertex" to "navnode"
Easier to pronounce.
2025-05-25 18:01:26 +02:00
Ellen Emilia Anna Zscheile bdebdacd8a chore: Fix 'unused' imports/code warnings 2025-05-17 12:45:03 +02:00
Mikolaj Wielgus f9b1cc2cbf refactor(autorouter/invoker): Add default impls. to invoker's stepper traits 2025-05-16 17:28:10 +00:00
Mikolaj Wielgus 97b1315eee refactor(autorouter/invoker): Expose getter for whole A* stepper, not just navmesh
Besides owning the navmesh, the A* stepper stores g-scores and f-scores,
displaying which will be helpful for debugging, so we want to be able to
access the whole A* stepper instead of only the navmesh.
2025-05-16 17:28:10 +00:00
Mikolaj Wielgus 47371fdf3f refactor(router/navcord): Make it clear that navcord is not a stepper
Rename `NavcordStepper<...>` to `Navcord<...>. Since the navcord is not
actually considered a true stepper, having the word "stepper" in its
identifier would confuse anyone new to source-diving Topola's code.

Rename Navcord's `.step(...)` to `.step_to(...)` to make it clear
that this is not just a step like in a stepper, but a step to a some
specified position.
2025-05-12 00:45:51 +02:00
Ellen Emilia Anna Zscheile 573f49f56f chore(autorouter): fix warnings about unused RemoveBandsExecutionStepper 2025-05-02 01:53:49 +02:00
Mikolaj Wielgus f7cd817457 feat(autorouter/invoker): Create trait to display debug information on navmesh 2025-05-01 01:59:31 +02:00
Ellen Emilia Anna Zscheile 861869ab7c refactor(geometry): introduce CompoundEntryKind to suppport entry metadata
example usages would be marking the apex of a polygon explicitly,
or marking the nodes of a polygon which are part of the convex hull

- make ManageCompounds more generic
- removes unnecessary bounds on handles/refs
2025-04-30 14:11:31 +02:00
Ellen Emilia Anna Zscheile 92e8600452 chore(autorouter): remove unnecessary mutability 2025-04-25 21:37:37 +02:00
Mikolaj Wielgus b736aa2d7d refactor(layout::poly): use `MakeRef<...>` to obtain poly's ref-struct 2025-04-22 21:59:45 +02:00
Ellen Emilia Anna Zscheile 122ff0122f fix(board): make Poly' apex generation non-lazy
- insert polygon parts before polygon compound
2025-04-17 15:03:14 +02:00
Ellen Emilia Anna Zscheile 670ddbe1f7 chore: apply clippy fixes 2025-03-25 00:17:57 +01:00
Ellen Emilia Anna Zscheile 6eb941a137 feat: merge planar-brute-embed into the topola monorepo
- feat: use OrderedPair instead of custon BandName/BandUid (note: changes ordering of BandUid)
- fix(crates): rename planar-brute-embed to planar-incr-embed
2025-02-16 18:31:31 +01:00
Ellen Emilia Anna Zscheile 0fde34204f refactor(drawing,geometry): move GetLayer from drawing::graph to geometry 2025-02-10 11:30:54 +01:00
Ellen Emilia Anna Zscheile 1e690ace11 refactor(drawing): factor out common {Bend,Dot,Seg}Weight fields 2025-02-10 11:29:08 +01:00
Ellen Emilia Anna Zscheile e1d875ae72 chore: fix most warnings 2025-02-10 11:25:55 +01:00
Ellen Emilia Anna Zscheile cf36177097 refactor: don't export modules only containing a single item 2025-02-02 22:03:12 +00:00
Ellen Emilia Anna Zscheile bcb0c4ad5c refactor(drawing::collect): turn Collect into a trait 2025-02-02 22:03:12 +00:00
Ellen Emilia Anna Zscheile ea6df23b95 feat(selection): BBox selection should span all currently visible layers
In Via, is_in_layer, `from_layer` and `to_layer` were swapped,
this has been also fixed here.
2025-01-09 18:59:07 +00:00
Alain Emilia Anna Zscheile 0cbd3c398a refactor(drawing,layout): move 'is_node_in_layer' from Layout to Drawing 2025-01-05 22:14:00 +00:00
Alain Emilia Anna Zscheile 59154c380f fix(BboxSelection): make intersection calculations against Polygons more accurate 2025-01-05 22:14:00 +00:00
Alain Emilia Anna Zscheile c7d50fd79f refactor(geometry::poly): PolyShape should be equal to Polygon 2025-01-05 22:14:00 +00:00
Alain Emilia Anna Zscheile fae1f4d7bc refactor(layout,geometry): Layout::node_bbox(...) → AccessShape::bbox(Layout::node_shape(...), 0.0) 2025-01-05 22:14:00 +00:00
Alain Emilia Anna Zscheile 740019e2e5 feat(selection): BboxSelectionKind (completely inside vs. merely intersects) 2025-01-05 22:14:00 +00:00
Mikolaj Wielgus 9664f1a31a fix: get rid of some indeterminism by using B-trees instead of hash maps
I have replaced all instances of `HashMap<...>` with `BTreeMap<...>`,
of `HashSet<...>` with `BTreeSet<...>`, and all the uses of the `Hash`
trait with `Ord`.

I have done a few manual tests and found the behavior to be
deterministic between the GUI application launches. However, undoing an
autoroute command and then manually executing it once again continues to
produce variable results. I suppose this is because of some bug in the
code where edits are applied. Hence, the issue

https://codeberg.org/topola/topola/issues/46

is only partially resolved.
2025-01-04 01:56:00 +01:00
Alain Emilia Anna Zscheile 53b964b865 feat: implement bounding box selection (#139)
Fixes #138

Reviewed-on: https://codeberg.org/topola/topola/pulls/139
Co-authored-by: Alain Emilia Anna Zscheile <fogti+devel@ytrizja.de>
Co-committed-by: Alain Emilia Anna Zscheile <fogti+devel@ytrizja.de>
2025-01-02 22:12:11 +00:00
Mikolaj Wielgus 44c30caafe chore(licensing): add REUSE license headers to `**.{rs,md,toml}` files
I ran the following command in Fish shell:

```
reuse annotate --skip-unrecognised --copyright="Topola contributors" --license="MIT" **.{rs,md,toml}
```

The choice of year 2024 in the copyright statements is intentional.
2024-12-29 22:47:00 +01:00
Alain Emilia Anna Zscheile ba41ff6837 refactor: get rid of unnecessary bounds on struct generics 2024-12-12 16:38:26 +01:00
Alain Emilia Anna Zscheile 9e0bdb5bc7 refactor: various further refactorings (#128)
These optimize out unnecessary code duplication, reserve vector capacity beforehand by leveraging `Iterator`s and avoid unnecessary double-lookups into HashMaps.

Reviewed-on: https://codeberg.org/topola/topola/pulls/128
Co-authored-by: Alain Emilia Anna Zscheile <fogti+devel@ytrizja.de>
Co-committed-by: Alain Emilia Anna Zscheile <fogti+devel@ytrizja.de>
2024-12-11 14:13:21 +00:00
Alain Emilia Anna Zscheile 1fd61f773c feat: improve Selection API (BREAKS HISTORY)
Test command files were rewritten using:

```
for f in tests/**/*.cmd; do jq ".done?.[].Autoroute[0] |= .selectors" "$f" | sponge "$f"; done
```
(compatible with bash/zsh/...)
2024-12-08 16:20:05 +00:00
Alain Emilia Anna Zscheile 5a26c02b4e refactor(ApplyGeometryEdit): make 'apply' take 'GeometryEdit' by reference 2024-12-08 16:20:05 +00:00
Mikolaj Wielgus 2703f662ac fix(autorouter): have band removal and via placement in undo/redo 2024-12-03 23:54:18 +01:00
Mikolaj Wielgus c2daf9fbfe feat(autorouter): use recorded edit applying for undo/redo 2024-12-03 08:35:11 +01:00
Mikolaj Wielgus d17a34c0f6 fix(geometry,router,autorouter): some more fixes for edit recording 2024-12-03 00:39:02 +01:00
Mikolaj Wielgus fe8fd3909f fix(autorouter,router): actually propagate the edit out of route steppers
I forgot to do this earlier, and didn't notice because I didn't test
it. There are still a few changes to be done before recording and edit
applying is functional.
2024-12-02 05:56:37 +01:00
Mikolaj Wielgus db9d897315 refactor(autorouter): store edits in history entries 2024-11-29 03:45:48 +01:00
Alain Emilia Anna Zscheile 98d237270d chore: fix cargo fmt 2024-11-16 16:10:54 +01:00
hakki 566ce37a6b invoker: resolves 'https://codeberg.org/topola/topola/pulls/101#issuecomment-2438542' 2024-11-15 21:55:08 +00:00
hakki 63804a0297 invoker: added trait description 2024-11-15 21:55:08 +00:00