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:
Mikolaj Wielgus 2024-06-10 00:27:10 +02:00
parent 5d082d81c0
commit 6b6affb3fc
4 changed files with 88 additions and 79 deletions

View File

@ -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
}
}

View File

@ -14,6 +14,7 @@ use thiserror::Error;
use crate::{
autorouter::{
autoroute::Autoroute,
ratsnest::{Ratsnest, RatvertexIndex},
selection::Selection,
},
@ -45,84 +46,9 @@ pub enum AutorouterStatus {
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> {
board: Board<M>,
ratsnest: Ratsnest,
pub(super) board: Board<M>,
pub(super) ratsnest: Ratsnest,
}
impl<M: MesadataTrait> Autorouter<M> {

View File

@ -3,12 +3,12 @@ use thiserror::Error;
use crate::{
autorouter::{
autoroute::Autoroute,
history::{History, HistoryError},
selection::Selection,
Autoroute, Autorouter, AutorouterError, AutorouterStatus,
Autorouter, AutorouterError, AutorouterStatus,
},
board::mesadata::MesadataTrait,
layout::Layout,
router::{EmptyRouterObserver, RouterObserverTrait},
};

View File

@ -1,3 +1,4 @@
pub mod autoroute;
mod autorouter;
pub mod history;
pub mod invoker;