From 6b6affb3fc952e15fbd014bda0a2df334ddf461f Mon Sep 17 00:00:00 2001 From: Mikolaj Wielgus Date: Mon, 10 Jun 2024 00:27:10 +0200 Subject: [PATCH] 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. --- src/autorouter/autoroute.rs | 82 ++++++++++++++++++++++++++++++++++++ src/autorouter/autorouter.rs | 80 ++--------------------------------- src/autorouter/invoker.rs | 4 +- src/autorouter/mod.rs | 1 + 4 files changed, 88 insertions(+), 79 deletions(-) create mode 100644 src/autorouter/autoroute.rs diff --git a/src/autorouter/autoroute.rs b/src/autorouter/autoroute.rs new file mode 100644 index 0000000..47255ac --- /dev/null +++ b/src/autorouter/autoroute.rs @@ -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>>, + navmesh: Option, // Useful for debugging. + cur_ratline: Option>, +} + +impl Autoroute { + pub fn new( + ratlines: impl IntoIterator> + 'static, + autorouter: &mut Autorouter, + ) -> Result { + 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( + &mut self, + autorouter: &mut Autorouter, + observer: &mut impl RouterObserverTrait, + ) -> Result { + 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 { + &self.navmesh + } +} diff --git a/src/autorouter/autorouter.rs b/src/autorouter/autorouter.rs index 5f38575..864ca8f 100644 --- a/src/autorouter/autorouter.rs +++ b/src/autorouter/autorouter.rs @@ -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>>, - navmesh: Option, // Useful for debugging. - cur_ratline: Option>, -} - -impl Autoroute { - pub fn new( - ratlines: impl IntoIterator> + 'static, - autorouter: &mut Autorouter, - ) -> Result { - 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( - &mut self, - autorouter: &mut Autorouter, - observer: &mut impl RouterObserverTrait, - ) -> Result { - 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 { - &self.navmesh - } -} - pub struct Autorouter { - board: Board, - ratsnest: Ratsnest, + pub(super) board: Board, + pub(super) ratsnest: Ratsnest, } impl Autorouter { diff --git a/src/autorouter/invoker.rs b/src/autorouter/invoker.rs index 511dfcf..9093563 100644 --- a/src/autorouter/invoker.rs +++ b/src/autorouter/invoker.rs @@ -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}, }; diff --git a/src/autorouter/mod.rs b/src/autorouter/mod.rs index 41fb8d7..5cf5308 100644 --- a/src/autorouter/mod.rs +++ b/src/autorouter/mod.rs @@ -1,3 +1,4 @@ +pub mod autoroute; mod autorouter; pub mod history; pub mod invoker;