diff --git a/src/autorouter/autoroute.rs b/src/autorouter/autoroute.rs index 7dd5f7a..17bac13 100644 --- a/src/autorouter/autoroute.rs +++ b/src/autorouter/autoroute.rs @@ -3,7 +3,7 @@ use petgraph::graph::EdgeIndex; use crate::{ autorouter::{Autorouter, AutorouterError, AutorouterStatus}, board::mesadata::MesadataTrait, - router::navmesh::Navmesh, + router::{navmesh::Navmesh, Router}, }; pub struct Autoroute { @@ -54,23 +54,24 @@ impl Autoroute { (None, None) }; - match autorouter.board.route_band( - std::mem::replace(&mut self.navmesh, new_navmesh).unwrap(), - 100.0, - ) { - Ok(band) => { - autorouter - .ratsnest - .assign_band_to_ratline(self.cur_ratline.unwrap(), band); - self.cur_ratline = new_ratline; + let navmesh = std::mem::replace(&mut self.navmesh, new_navmesh).unwrap(); + let mut router = Router::new(autorouter.board.layout_mut()); - if self.navmesh.is_some() { - Ok(AutorouterStatus::Running) - } else { - Ok(AutorouterStatus::Finished) - } - } - Err(err) => Err(AutorouterError::Router(err)), + let band = router.route(navmesh.source(), navmesh.target(), 100.0)?; + + autorouter + .ratsnest + .assign_band_to_ratline(self.cur_ratline.unwrap(), band); + self.cur_ratline = new_ratline; + + autorouter + .board + .try_set_band_between_nodes(navmesh.source(), navmesh.target(), band); + + if self.navmesh.is_some() { + Ok(AutorouterStatus::Running) + } else { + Ok(AutorouterStatus::Finished) } } diff --git a/src/board/board.rs b/src/board/board.rs index 14bf3cb..681aae4 100644 --- a/src/board/board.rs +++ b/src/board/board.rs @@ -115,31 +115,6 @@ impl Board { zone } - pub fn route_band( - &mut self, - navmesh: Navmesh, - width: f64, - ) -> Result { - let source_pinname = self - .node_pinname(GenericNode::Primitive(navmesh.source().into())) - .unwrap() - .to_string(); - let target_pinname = self - .node_pinname(GenericNode::Primitive(navmesh.target().into())) - .unwrap() - .to_string(); - - let mut router = Router::new(self.layout_mut()); - let result = router.route(navmesh.source(), navmesh.target(), width); - - if let Ok(band) = result { - self.pinname_pair_to_band - .insert((source_pinname, target_pinname), band); - } - - result - } - pub fn zone_apex(&mut self, zone: GenericIndex) -> FixedDotIndex { if let Some(apex) = self.layout.zone(zone).maybe_apex() { apex @@ -162,6 +137,24 @@ impl Board { self.node_to_pinname.get(&node) } + pub fn try_set_band_between_nodes( + &mut self, + source: FixedDotIndex, + target: FixedDotIndex, + band: BandFirstSegIndex, + ) { + let source_pinname = self + .node_pinname(GenericNode::Primitive(source.into())) + .unwrap() + .to_string(); + let target_pinname = self + .node_pinname(GenericNode::Primitive(target.into())) + .unwrap() + .to_string(); + self.pinname_pair_to_band + .insert((source_pinname, target_pinname), band); + } + pub fn band_between_pins(&self, pinname1: &str, pinname2: &str) -> Option { if let Some(band) = self .pinname_pair_to_band