Commit Graph

548 Commits

Author SHA1 Message Date
Mikolaj Wielgus fd23be7a8a router: step on successful probes 2024-07-04 13:52:26 +02:00
Mikolaj Wielgus b48ce70aad egui: add timer to control update frequency 2024-07-04 01:02:40 +02:00
Mikolaj Wielgus def3f84d6a egui,autorouter,router: highlight current obstacle 2024-07-04 00:39:08 +02:00
Mikolaj Wielgus b6cb89c017 egui,autorouter,router: display infringement shapes (aka. "ghosts") 2024-07-03 21:00:50 +02:00
Mikolaj Wielgus 727eb37c6e router: have probing and visiting as separate states
This feels overengineered, but I need something like this for better
debuginfo.
2024-07-03 18:12:07 +02:00
Mikolaj Wielgus 806742736a cleanup: get rid of `*Trait` names for traits, use verbs and sentences 2024-07-03 13:40:37 +02:00
Mikolaj Wielgus b1f60847b3 drawing: move head length measurement methods to new refstruct 2024-07-03 03:37:14 +02:00
Mikolaj Wielgus 3c03b2dfa1 geometry: create `MeasureLength` trait to measure lengths 2024-07-02 23:33:29 +02:00
Mikolaj Wielgus 27d1c9e712 router: step on every probe, not only navvertices 2024-07-02 02:36:42 +02:00
Mikolaj Wielgus 3c578ccada egui: display both CW and CCW navvertices separately 2024-07-01 21:21:08 +02:00
Mikolaj Wielgus 47c888d21b egui,autorouter,router: restore highlighting active navmesh edges 2024-07-01 18:56:41 +02:00
Mikolaj Wielgus 03f996721d egui: restore drawing yellow dots at routing source and target 2024-07-01 14:09:17 +02:00
Mikolaj Wielgus edf81feccc egui: restore highlighting selected node shapes 2024-07-01 12:12:27 +02:00
Mikolaj Wielgus 2259a75d92 egui,autorouter: restore displaying navmesh 2024-07-01 00:50:24 +02:00
Mikolaj Wielgus ee6eeac6d8 egui: step through every band routing step, once per frame
At last! We finally have that implemented without concurrency.
2024-06-29 22:40:06 +02:00
Mikolaj Wielgus 6cadcd3b41 egui: remove most of usages of shared-state parallelism 2024-06-29 17:11:29 +02:00
Mikolaj Wielgus fd5a95103d autorouter: step through every band routing step, not merely over bands 2024-06-29 03:07:20 +02:00
Mikolaj Wielgus ea991314b2 board: remove `.remove_band()` method 2024-06-28 19:35:25 +02:00
Mikolaj Wielgus 00b997b60e egui: fix compilation error -- import `Trace` from trace, not tracer 2024-06-28 17:15:52 +02:00
Mikolaj Wielgus da1438195a router: create new `Router` object, a wrapper over `Layout` 2024-06-28 14:46:15 +02:00
Mikolaj Wielgus 244367c4d7 router: rename `Router` to `Route`
`Router`, soon to be written, will be a wrapper over `Board`.
2024-06-28 01:12:37 +02:00
Mikolaj Wielgus 4fa97509e4 router: split out `Trace` to its own file and give it its own methods
We'll be following this pattern:
* `Autorouter` - `Autoroute`,
* `Router` - `Route` (not yet done),
* `Tracer` - `Trace`.

Agent nouns (ending with -er) denote the object that holds large and
"unportable" parts of the state (such as `Board`, `Layout`, `Drawing`,
`Geometry`), while verbs (ending with -e) denote holders of other, more
"portable" parts of the state.
2024-06-27 23:58:02 +02:00
Mikolaj Wielgus 664bbee0b9 router: make `Astar` own the navmesh 2024-06-27 21:24:49 +02:00
Mikolaj Wielgus 0b3ebdbe3c router: make it possible for `Astar` to own its graph
We aren't using this yet however because it requires a substantial
rearrangement of `Router`'s code.
2024-06-27 15:07:58 +02:00
Mikolaj Wielgus 0419904b3f router: re-encapsulate graph in `Navmesh` and vertices in `VertexIndex`
As in previous commit, this was done in the past, but I removed it when
improving `Navmesh` to hold each navvertex instead of calculating tem
during access.
2024-06-26 22:34:59 +02:00
Mikolaj Wielgus 5254f768e5 router: implement (again) graph traversal traits for `Navmesh`
These were implemented in the past, but I removed it when I made
`Navmesh` store each navvertex instead of calculating tem on the fly.
2024-06-26 20:27:29 +02:00
Mikolaj Wielgus 114329a1ef router: don't store `&'a mut Layout` in `Router`
First step towards removing multithreading in code in favor of stepping
over the routing process.
2024-06-26 13:39:57 +02:00
Mikolaj Wielgus 43d84dc29e router: restore calculation of probe length (was temp. hardcoded to 0.0) 2024-06-26 00:47:16 +02:00
Mikolaj Wielgus 3fe305b99a sdl2-demo: fix compilation errors 2024-06-25 15:31:21 +02:00
Mikolaj Wielgus b6cfcc8518 router: don't panic if wraparound navvertex has no cw
This may happen if target's guidecircle is in line of sight but its
center is not.
2024-06-25 15:00:15 +02:00
Mikolaj Wielgus 3ce8cfcabc autorouter: fix redo operation
Redone operation was only dispatched, not truly executed.
2024-06-25 11:20:59 +02:00
Mikolaj Wielgus 514eab683a egui: fix painting bends: circles of these are actually inner circles
I've changed field names to avoid repeating this mistake in the future.
2024-06-25 10:47:49 +02:00
Mikolaj Wielgus bd26f5fef8 layout: fix via placement contract for number of nodes 2024-06-25 00:40:53 +02:00
Mikolaj Wielgus e2552a156b egui: use smaller via size 2024-06-25 00:40:32 +02:00
Mikolaj Wielgus b35e6fc66a egui: fix painted bend direction 2024-06-25 00:40:06 +02:00
Mikolaj Wielgus 1706d5ae8c drawing: add invariant contract for pairwise non-infringement of looses 2024-06-24 16:36:05 +02:00
Mikolaj Wielgus c3fe91aabe drawing: split finding infringers into multiple methods 2024-06-24 13:55:46 +02:00
Mikolaj Wielgus 0777b781f4 router: have two navvertices, CW and CCW, for each trianvertex 2024-06-22 17:33:11 +02:00
Mikolaj Wielgus d34554f075 egui: fix selecting nodes whose bboxes overlap other bboxes 2024-06-21 07:11:41 +02:00
Mikolaj Wielgus 169ddf7d80 egui: add button to toggle showing navmesh 2024-06-20 19:33:18 +02:00
Mikolaj Wielgus 5161eecd49 egui: don't clear navmesh after routing is done 2024-06-20 18:55:57 +02:00
Mikolaj Wielgus 4540f5c96b router: impl. forgotten addition of edges to navmesh 2024-06-20 18:50:50 +02:00
Mikolaj Wielgus c24d748bea autorouter: don't save in history until command is successfully finished 2024-06-20 12:14:51 +02:00
Mikolaj Wielgus ae2a862e0e router: store every vertex (fails tests but almost functional)
Previously, rail vertices were not stored but generated on demand from
data stored in a `Triangulation<...>`. This functionality is removed in
favor of storing every vertex in `Navmesh`'s own graph built from the
`Triangulation<...>`, which is now afterwards discarded.

Tests still fail and rails aren't added yet, but this is close enough to
completion for me to commit so that I can now go to sleep without
worrying.
2024-06-20 01:32:27 +02:00
Mikolaj Wielgus d4a310a5c0 graph: disambiguate naming of different kinds of indices
Disambiguate between node indices and (teir inner) petgraph indices.
Rename "band index" to "band first seg index", as we identify bands by
teir first segs. Rename "trianvertex index" and "navvertex index"
respectively to "trianvertex node index" and "navvertex node index", as
these point to nodes on the geometry graph and only indirectly to
vertices on the vertex graph.
2024-06-18 15:30:33 +02:00
Mikolaj Wielgus 7f46d436af egui: fix sign of Y displayed on the bottom bar 2024-06-18 02:07:38 +02:00
Mikolaj Wielgus e15e1efe5e router: remove observers
The observer "pattern", arguably, is an anti-pattern that managed to get
into textbooks. It causes a lot of problems, it was a bad idea to use
it.
2024-06-18 01:37:45 +02:00
Mikolaj Wielgus d193ea6565 drawing: rename "segbends" to "canes"
In addition to a seg and a bend, a segbend actually also contains a dot,
so let's rename it to "cane", which is also easier to translate.
2024-06-18 01:16:12 +02:00
Mikolaj Wielgus a7b4a84b98 layout: remove inserted dots if placing via fails 2024-06-17 23:59:36 +02:00
Mikolaj Wielgus 7dd0f3e629 egui: fix painting zones (forgot to replace literal with var earlier) 2024-06-17 23:59:36 +02:00
Mikolaj Wielgus d56d6046a4 egui: add bottom bar displaying cursor position
Useful for writing tests.
2024-06-17 23:59:36 +02:00
Tomasz Cichoń 13c8237da6 specctra: remove casts, accept floating point precision used internally 2024-06-16 22:34:11 +02:00
Tomasz Cichoń f37e7ce88d specctra: pass errors to app instead of panicking 2024-06-16 20:02:51 +02:00
Tomasz Cichoń aa0616840c specctra: remove old file reader based on serde 2024-06-16 19:02:54 +02:00
Mikolaj Wielgus 9d00e95457 specctra: change "dsn" to "specctra" where it's about both DSN and SES 2024-06-16 18:04:20 +02:00
Mikolaj Wielgus 8c2ad87bf0 dsn: replace structure with new renamed structure2 2024-06-16 14:05:49 +02:00
Mikolaj Wielgus c4788c0277 drawing: remove hardcoded layer count of 2 2024-06-15 01:06:50 +02:00
Mikolaj Wielgus e723c28f26 egui: add default colors for middle layers in 4-layer boards 2024-06-14 05:14:37 +02:00
Mikolaj Wielgus 008dcfeca0 geometry: store layer in `usize`, not `u64` 2024-06-14 04:58:52 +02:00
Mikolaj Wielgus 1cca9fe6e1 egui: support displaying an arbitrary number of layers 2024-06-14 03:47:27 +02:00
Mikolaj Wielgus 300529ea75 egui: hide layers marked as hidden 2024-06-13 18:47:47 +02:00
Mikolaj Wielgus 339387c657 drawing: remove forgotten leftover dbg!() traces 2024-06-13 18:46:27 +02:00
Mikolaj Wielgus cff6b5aaf6 cleanup: cargo fix, cargo fmt 2024-06-13 13:38:12 +02:00
Mikolaj Wielgus 6d66558a72 egui: move viewport to its own file 2024-06-13 13:37:54 +02:00
Mikolaj Wielgus ce1a070a70 egui: move the top panel to its own file 2024-06-13 02:22:17 +02:00
Mikolaj Wielgus 5067fb55d9 egui: impl. layer display manager sidebar (not affecting display yet) 2024-06-13 02:21:32 +02:00
Mikolaj Wielgus c5842b7821 drawing: fix contracts on placement failures 2024-06-12 14:44:26 +02:00
Tomasz Cichoń 7d9bf1346a dsn: add new parser/writer and .ses export prototype 2024-06-12 13:39:42 +02:00
Mikolaj Wielgus 90bc90350d tests: test via placement failure 2024-06-12 01:51:04 +02:00
Mikolaj Wielgus f91dadf4d3 drawing,layout,board: categorize methods as possibly infringing and not 2024-06-11 23:57:47 +02:00
Mikolaj Wielgus 9e65a28c3d drawing: cosmetic renamings and rearrangements 2024-06-11 13:53:43 +02:00
Mikolaj Wielgus 3b4614b16b egui: consume the click when toggling Place Via mode 2024-06-11 00:00:55 +02:00
Mikolaj Wielgus 8c9a13e712 layout: use inclusive range to describe via layers 2024-06-10 23:51:15 +02:00
Mikolaj Wielgus 6884ca6531 egui: add button to modally invoke via placement 2024-06-10 16:49:05 +02:00
Mikolaj Wielgus b09ffad9b3 autorouter: create new command for placing vias
Undoing it is not implemented yet.
2024-06-10 02:38:24 +02:00
Mikolaj Wielgus 6b6affb3fc autorouter: move autoroute command to its own file
Since it accesses `Autorouter`'s fields, I made these `pub(super)`. This
feels unidiomatic, but let's give it a shot.
2024-06-10 02:38:03 +02:00
Mikolaj Wielgus 5d082d81c0 layout: implement `MakePrimitiveShape` for vias 2024-06-09 21:29:03 +02:00
Mikolaj Wielgus fc1f7e2613 layout: implement storage for vias 2024-06-09 17:24:12 +02:00
Mikolaj Wielgus e5829d929a dsn: don't divide widths and clearances by 100 2024-06-08 23:07:28 +02:00
Mikolaj Wielgus 7a02877eb4 board,dsn: move layer and net name bidirectional lookup to `Mesadata` 2024-06-08 21:39:25 +02:00
Mikolaj Wielgus 98363fbfd1 drawing: remove unnecessary contracts on `&self` methods 2024-06-08 18:28:34 +02:00
Mikolaj Wielgus 19a4766cb5 board,dsn: introduce `MesadataTrait`, an extension of `RulesTrait`
The trait's contents aren't implemented yet.

"mesa" is supposed to mean the opposite of "meta". By "mesadata" I don't
mean mere content or payload: I mean data that is stored *inside* or
*under* such content or payload.

I found this meaning of "mesa" -- as opposite of "meta" -- by browsing
somewhere on the internet. Fair chance many classicists would think
poorly of this usage. But I don't care about etymology: I just need a
word to close a lexical gap.
2024-06-08 16:36:21 +02:00
Mikolaj Wielgus 1dc3718159 board: move board to its own directory 2024-06-08 13:37:27 +02:00
Mikolaj Wielgus 91480453b3 tests: add 3-pin XLR THT female to THT female test
Hardly functional so far.
2024-06-07 02:14:05 +02:00
Tomasz Cichoń af1bb7069f dsn: add support of keepouts
Includes some ugly hacks to get the deserializer to accept the relevant
structs for now.
2024-06-06 23:31:12 +02:00
Mikolaj Wielgus e574043c2f tests: move common code to new common module 2024-06-06 02:30:25 +02:00
Mikolaj Wielgus a02bf1541e autorouter: implement measurement of band length 2024-06-05 23:20:55 +02:00
Mikolaj Wielgus 86d2555b36 autorouter: accessibly store pin-pairs between which routed bands are 2024-06-05 20:26:23 +02:00
Mikolaj Wielgus 5eeeb5a004 autorouter: select nodes with pin-layer pairs, not only pins
We call these pairs "selectors".

The command file format has been thus changed. I've upgraded the command
files in tests with the following command:

    jq ".done?.[].Autoroute |= {selectors: ([.pins.[] | {pin: ., layer: \"F.Cu\"}])}" $FILE | sponge $FILE

Where $FILE is the name of the upgraded command file.
2024-06-04 01:54:10 +02:00
Mikolaj Wielgus bb6d975dac autorouter: store layer to layer names map in `Board` 2024-06-03 13:44:09 +02:00
Mikolaj Wielgus fa8c11fa36 autorouter: move lazy apex accessor to `Board` 2024-06-03 12:46:36 +02:00
Mikolaj Wielgus a80dfc10be autorouter,router: shorten and clarify terminology
Rename "triangulation vertex" to just "trianvertex".
Rename "navigation vertex" to just "navvertex".

The standalone word "vertex" was overused and in some cases confusing.
2024-06-03 12:46:27 +02:00
Mikolaj Wielgus 765d8495c6 tests: add four 3rd order SMD LC filters test 2024-06-01 00:34:09 +02:00
Mikolaj Wielgus 540d9707dc autorouter: store a net to netname map in `Board` 2024-05-31 23:13:57 +02:00
Mikolaj Wielgus 7e022aa2cf sdl2-demo: fix compilation errors 2024-05-31 02:09:11 +02:00
Mikolaj Wielgus de17adb01c layout: move pin information to a new parent object, `Board` 2024-05-31 01:47:51 +02:00
Mikolaj Wielgus b22e3dce1a router,autorouter: stop hiding layout behind an arc-mutex
This was preventing us from creating a new abstraction layer over
layout.
2024-05-30 22:57:20 +02:00
Mikolaj Wielgus dcbc5be5f3 router,autorouter: improve error handling
Avoid unwrapping and use `Result<...>` instead as well-written code
should.
2024-05-30 19:54:14 +02:00
Mikolaj Wielgus a4503a42c6 router: improve error handling -- more error types, remove some unwraps 2024-05-29 23:49:24 +02:00
Mikolaj Wielgus af9cbeba61 router: don't assume start dot to have a net 2024-05-29 16:52:30 +02:00
Mikolaj Wielgus 499564e6cf router: make A* a walker, i.e. make it runnable in a while loop 2024-05-27 23:50:12 +02:00
Mikolaj Wielgus 3dd311c5fc contracts: use `disable_contracts` feature instead of checking channel 2024-05-25 22:46:06 +02:00
Mikolaj Wielgus 93b628ae02 sdl2-demo: fix compile error 2024-05-25 21:23:24 +02:00
Mikolaj Wielgus a757576fe3 tests: fix 0603 breakout test by passing a command file 2024-05-25 02:33:10 +02:00
Mikolaj Wielgus 06150f5167 autorouter: don't cache nodes in `Selection`
This solves the problem of having to use stateful deserialization.
2024-05-23 20:00:43 +02:00
Mikolaj Wielgus 53fa89d02c egui: implement loading the history (not functional yet)
Committing this non-functional and half-baked because loading the
history requires implementing stateful deserialization, which is quite
an effort to implement with Serde, as there are no applicable derive
macros.
2024-05-23 19:34:19 +02:00
Mikolaj Wielgus 02bfe1105b egui: Implement saving command file 2024-05-22 14:38:59 +02:00
Mikolaj Wielgus fb501ac072 autorouter: encapsulate command history in a `History` object 2024-05-22 01:12:55 +02:00
Mikolaj Wielgus 8999fcb160 egui: add button to toggle showing ratsnest 2024-05-20 21:15:57 +02:00
Mikolaj Wielgus f03545124f autorouter: keep track of clicked pins
Pin names provide us stable references that we can use to replay actions
later. We'll use this information to serialize the selection.
2024-05-19 04:37:26 +02:00
Mikolaj Wielgus 530f81557a layout: keep track of node pins
For the time being we're storing pin names in a hashmap with nodes as
keys. We need to know which node belongs to which pin because pins
provide stable identifiers for continents (connected components) that
we need for replayable command files.
2024-05-17 02:22:48 +02:00
Mikolaj Wielgus 84a1842f3d egui: add Ctrl+Z and Ctrl+Y key shortcuts for Undo and Redo 2024-05-15 04:05:11 +02:00
Mikolaj Wielgus 4a4f18f558 egui,autorouter: implement undo/redo in GUI 2024-05-15 03:40:48 +02:00
Mikolaj Wielgus 114fb747c8 router: return band index once the routing finishes 2024-05-15 01:45:36 +02:00
Mikolaj Wielgus 1c09483873 autorouter: implement simple undo (untested, not in GUI yet) 2024-05-14 14:22:47 +02:00
Mikolaj Wielgus c006dcfd47 drawing: create `BandIndex` object to pass around bands 2024-05-14 00:28:32 +02:00
Mikolaj Wielgus 4c6fa0e5d3 layout: remove concepts of connectivity, bands, and continents for now
We'll use `UnionFind` where needed for now.
2024-05-13 18:43:42 +02:00
Mikolaj Wielgus 8a3bf45fd8 egui: store invoker in state instead of reconstructing it each time 2024-05-13 04:28:13 +02:00
Mikolaj Wielgus 7bcb3926d4 autorouter: put autorouter in new `Invoker` object for Command pattern 2024-05-13 03:20:57 +02:00
Mikolaj Wielgus d9ff08477c autorouter: encapsulate selection in `Selection` object
Just a thin wrapper over `HashSet` for now, but will contain more
complicated logic later.
2024-05-13 03:20:47 +02:00
Mikolaj Wielgus f893f73cd8 autorouter: autoroute only selected 2024-05-12 20:29:07 +02:00
Mikolaj Wielgus a6fb1157e3 egui,tests: fix compilation errors 2024-05-12 01:57:40 +02:00
Mikolaj Wielgus 42a0777e7f sdl2-demo: disable painting of bends
These cause stack overflows due to a bug in Pathfinder.
2024-05-12 01:56:01 +02:00
Mikolaj Wielgus 9bd63d3f0d tests: change project name of THT female to THT female test 2024-05-12 01:55:35 +02:00
Mikolaj Wielgus e86ce9836a drawing: don't intersect with objects on other layers 2024-05-11 22:29:44 +02:00
Mikolaj Wielgus 36bc606401 autorouter: fix off-by-one error when walking over ratlines 2024-05-11 05:00:53 +02:00
Mikolaj Wielgus 2cd33dac60 sdl2-demo: use `Autorouter` object 2024-05-11 03:54:43 +02:00
Mikolaj Wielgus b3f36d22b4 layout: fix apex detection - these can be joined with loose segs 2024-05-11 02:39:50 +02:00
Mikolaj Wielgus 452bcaf09d sdl2-demo: fix compilation errors 2024-05-10 23:01:42 +02:00
Mikolaj Wielgus a5dcacdd69 egui: draw routing start and stop 2024-05-10 20:37:13 +02:00
Mikolaj Wielgus 9ac4c780b5 router: store origin and target in navmesh 2024-05-10 19:54:03 +02:00
Mikolaj Wielgus c1db44c25f autorouter: reorder code to avoid peeking in the edges iterator 2024-05-10 19:38:14 +02:00
Mikolaj Wielgus 83f3245e55 router: exclude same-net nodes from navmesh (except for start and stop) 2024-05-10 01:25:00 +02:00
Mikolaj Wielgus 91f9466d74 autorouter,router: route only single layer at a time
It makes no sense to route multiple layers at once until we implement
automatic via placement, which is going to take a lot of time.
2024-05-07 20:06:54 +02:00
Mikolaj Wielgus 765738f44b autorouter: treat (layer, net) pairs like separate nets for ratsnest
Most likely we won't be having via placement anytime soon, so let's
narrow our routing capabilities to single layer at a time.
2024-05-07 02:09:48 +02:00
Mikolaj Wielgus 95674a9a53 dsn: skip dot coincident with preceding dot 2024-05-06 20:48:23 +02:00
Mikolaj Wielgus 4efc2d482b egui: paint currently probed edges in bold yellow 2024-05-06 12:05:50 +02:00
Mikolaj Wielgus eaecb99146 egui: draw the navmesh
This required some considerable rearrangements in `Router`.
2024-05-06 02:35:43 +02:00
Mikolaj Wielgus 63561e6a4a layout: make apices have the same net as teir zones 2024-05-05 21:39:17 +02:00
Mikolaj Wielgus 946f2dbd6c autorouter: make it possible to delegate the loop outside `.autoroute()` 2024-05-05 17:55:47 +02:00
Mikolaj Wielgus b82f5417c3 egui: animate routing as it goes, show attempted traces 2024-05-05 12:55:08 +02:00
Mikolaj Wielgus a2c8ae7e70 autorouter: put `Layout` in a mutex 2024-05-04 18:02:34 +02:00
Mikolaj Wielgus ea854abfc7 Revert "egui: perform routing in separate thread or task"
This reverts commit 4144ee361f.

Instead of mutexing the autorouter, we'll mutex the layout.
2024-05-04 15:03:36 +02:00
Mikolaj Wielgus 4144ee361f egui: perform routing in separate thread or task 2024-05-03 19:50:38 +02:00
Mikolaj Wielgus 682f179cad egui: draw bounding boxes 2024-05-03 02:42:42 +02:00
Mikolaj Wielgus 2be8baab55 autorouter: route all ratline endpoint pairs
Routed bands are intersecting with each other for some reason, but at
least this doesn't crash.
2024-05-03 01:36:07 +02:00
Mikolaj Wielgus 531bc6d22c autorouter: as a starter, route the endpoints of only the first ratline 2024-05-03 01:36:04 +02:00
Mikolaj Wielgus 9c332bdde3 egui: add "Autoroute" button
Not functional yet as I still haven't implemented
`Autorouter::autoroute()`
2024-05-02 18:53:43 +02:00
Mikolaj Wielgus 5664b73494 layout: implement creation and return of the apex
Apex is the dot positioned at the center of a zone that is used to
terminate and tie any band ending in the zone.
2024-05-02 01:21:00 +02:00
Mikolaj Wielgus ea22ba705c layout: create `Zone` struct for accessing zone properties 2024-05-01 20:57:49 +02:00