mirror of https://codeberg.org/topola/topola.git
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.
This commit is contained in:
parent
5d082d81c0
commit
6b6affb3fc
|
|
@ -0,0 +1,82 @@
|
||||||
|
use petgraph::graph::EdgeIndex;
|
||||||
|
|
||||||
|
use crate::{
|
||||||
|
autorouter::{Autorouter, AutorouterError, AutorouterStatus},
|
||||||
|
board::mesadata::MesadataTrait,
|
||||||
|
router::{navmesh::Navmesh, RouterObserverTrait},
|
||||||
|
};
|
||||||
|
|
||||||
|
pub struct Autoroute {
|
||||||
|
ratlines_iter: Box<dyn Iterator<Item = EdgeIndex<usize>>>,
|
||||||
|
navmesh: Option<Navmesh>, // Useful for debugging.
|
||||||
|
cur_ratline: Option<EdgeIndex<usize>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Autoroute {
|
||||||
|
pub fn new(
|
||||||
|
ratlines: impl IntoIterator<Item = EdgeIndex<usize>> + 'static,
|
||||||
|
autorouter: &mut Autorouter<impl MesadataTrait>,
|
||||||
|
) -> Result<Self, AutorouterError> {
|
||||||
|
let mut ratlines_iter = Box::new(ratlines.into_iter());
|
||||||
|
|
||||||
|
let Some(cur_ratline) = ratlines_iter.next() else {
|
||||||
|
return Err(AutorouterError::NothingToRoute);
|
||||||
|
};
|
||||||
|
|
||||||
|
let (source, target) = autorouter.ratline_endpoints(cur_ratline);
|
||||||
|
let navmesh = Some(Navmesh::new(autorouter.board.layout(), source, target)?);
|
||||||
|
|
||||||
|
let this = Self {
|
||||||
|
ratlines_iter,
|
||||||
|
navmesh,
|
||||||
|
cur_ratline: Some(cur_ratline),
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn step<M: MesadataTrait>(
|
||||||
|
&mut self,
|
||||||
|
autorouter: &mut Autorouter<M>,
|
||||||
|
observer: &mut impl RouterObserverTrait<M>,
|
||||||
|
) -> Result<AutorouterStatus, AutorouterError> {
|
||||||
|
let (new_navmesh, new_ratline) = if let Some(cur_ratline) = self.ratlines_iter.next() {
|
||||||
|
let (source, target) = autorouter.ratline_endpoints(cur_ratline);
|
||||||
|
|
||||||
|
(
|
||||||
|
Some(
|
||||||
|
Navmesh::new(autorouter.board.layout(), source, target)
|
||||||
|
.ok()
|
||||||
|
.unwrap(),
|
||||||
|
),
|
||||||
|
Some(cur_ratline),
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
(None, None)
|
||||||
|
};
|
||||||
|
|
||||||
|
match autorouter.board.route_band(
|
||||||
|
std::mem::replace(&mut self.navmesh, new_navmesh).unwrap(),
|
||||||
|
100.0,
|
||||||
|
observer,
|
||||||
|
) {
|
||||||
|
Ok(band) => {
|
||||||
|
autorouter
|
||||||
|
.ratsnest
|
||||||
|
.assign_band_to_ratline(self.cur_ratline.unwrap(), band);
|
||||||
|
self.cur_ratline = new_ratline;
|
||||||
|
|
||||||
|
if self.navmesh.is_some() {
|
||||||
|
Ok(AutorouterStatus::Running)
|
||||||
|
} else {
|
||||||
|
Ok(AutorouterStatus::Finished)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(err) => Err(AutorouterError::Router(err)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn navmesh(&self) -> &Option<Navmesh> {
|
||||||
|
&self.navmesh
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -14,6 +14,7 @@ use thiserror::Error;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
autorouter::{
|
autorouter::{
|
||||||
|
autoroute::Autoroute,
|
||||||
ratsnest::{Ratsnest, RatvertexIndex},
|
ratsnest::{Ratsnest, RatvertexIndex},
|
||||||
selection::Selection,
|
selection::Selection,
|
||||||
},
|
},
|
||||||
|
|
@ -45,84 +46,9 @@ pub enum AutorouterStatus {
|
||||||
Finished,
|
Finished,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Autoroute {
|
|
||||||
ratlines_iter: Box<dyn Iterator<Item = EdgeIndex<usize>>>,
|
|
||||||
navmesh: Option<Navmesh>, // Useful for debugging.
|
|
||||||
cur_ratline: Option<EdgeIndex<usize>>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Autoroute {
|
|
||||||
pub fn new(
|
|
||||||
ratlines: impl IntoIterator<Item = EdgeIndex<usize>> + 'static,
|
|
||||||
autorouter: &mut Autorouter<impl MesadataTrait>,
|
|
||||||
) -> Result<Self, AutorouterError> {
|
|
||||||
let mut ratlines_iter = Box::new(ratlines.into_iter());
|
|
||||||
|
|
||||||
let Some(cur_ratline) = ratlines_iter.next() else {
|
|
||||||
return Err(AutorouterError::NothingToRoute);
|
|
||||||
};
|
|
||||||
|
|
||||||
let (source, target) = autorouter.ratline_endpoints(cur_ratline);
|
|
||||||
let navmesh = Some(Navmesh::new(autorouter.board.layout(), source, target)?);
|
|
||||||
|
|
||||||
let this = Self {
|
|
||||||
ratlines_iter,
|
|
||||||
navmesh,
|
|
||||||
cur_ratline: Some(cur_ratline),
|
|
||||||
};
|
|
||||||
|
|
||||||
Ok(this)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn step<M: MesadataTrait>(
|
|
||||||
&mut self,
|
|
||||||
autorouter: &mut Autorouter<M>,
|
|
||||||
observer: &mut impl RouterObserverTrait<M>,
|
|
||||||
) -> Result<AutorouterStatus, AutorouterError> {
|
|
||||||
let (new_navmesh, new_ratline) = if let Some(cur_ratline) = self.ratlines_iter.next() {
|
|
||||||
let (source, target) = autorouter.ratline_endpoints(cur_ratline);
|
|
||||||
|
|
||||||
(
|
|
||||||
Some(
|
|
||||||
Navmesh::new(autorouter.board.layout(), source, target)
|
|
||||||
.ok()
|
|
||||||
.unwrap(),
|
|
||||||
),
|
|
||||||
Some(cur_ratline),
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
(None, None)
|
|
||||||
};
|
|
||||||
|
|
||||||
match autorouter.board.route_band(
|
|
||||||
std::mem::replace(&mut self.navmesh, new_navmesh).unwrap(),
|
|
||||||
100.0,
|
|
||||||
observer,
|
|
||||||
) {
|
|
||||||
Ok(band) => {
|
|
||||||
autorouter
|
|
||||||
.ratsnest
|
|
||||||
.assign_band_to_ratline(self.cur_ratline.unwrap(), band);
|
|
||||||
self.cur_ratline = new_ratline;
|
|
||||||
|
|
||||||
if self.navmesh.is_some() {
|
|
||||||
Ok(AutorouterStatus::Running)
|
|
||||||
} else {
|
|
||||||
Ok(AutorouterStatus::Finished)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Err(err) => Err(AutorouterError::Router(err)),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn navmesh(&self) -> &Option<Navmesh> {
|
|
||||||
&self.navmesh
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct Autorouter<M: MesadataTrait> {
|
pub struct Autorouter<M: MesadataTrait> {
|
||||||
board: Board<M>,
|
pub(super) board: Board<M>,
|
||||||
ratsnest: Ratsnest,
|
pub(super) ratsnest: Ratsnest,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<M: MesadataTrait> Autorouter<M> {
|
impl<M: MesadataTrait> Autorouter<M> {
|
||||||
|
|
|
||||||
|
|
@ -3,12 +3,12 @@ use thiserror::Error;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
autorouter::{
|
autorouter::{
|
||||||
|
autoroute::Autoroute,
|
||||||
history::{History, HistoryError},
|
history::{History, HistoryError},
|
||||||
selection::Selection,
|
selection::Selection,
|
||||||
Autoroute, Autorouter, AutorouterError, AutorouterStatus,
|
Autorouter, AutorouterError, AutorouterStatus,
|
||||||
},
|
},
|
||||||
board::mesadata::MesadataTrait,
|
board::mesadata::MesadataTrait,
|
||||||
layout::Layout,
|
|
||||||
router::{EmptyRouterObserver, RouterObserverTrait},
|
router::{EmptyRouterObserver, RouterObserverTrait},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
pub mod autoroute;
|
||||||
mod autorouter;
|
mod autorouter;
|
||||||
pub mod history;
|
pub mod history;
|
||||||
pub mod invoker;
|
pub mod invoker;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue