diff --git a/src/autorouter/autorouter.rs b/src/autorouter/autorouter.rs index e69ecd8..5fc5428 100644 --- a/src/autorouter/autorouter.rs +++ b/src/autorouter/autorouter.rs @@ -95,12 +95,11 @@ impl Autoroute { (None, None) }; - let mut router = Router::new_from_navmesh( - autorouter.board.layout_mut(), + match autorouter.board.route_band( std::mem::replace(&mut self.navmesh, new_navmesh).unwrap(), - ); - - match router.route_band(100.0, observer) { + 100.0, + observer, + ) { Ok(band) => { autorouter .ratsnest diff --git a/src/autorouter/board.rs b/src/autorouter/board.rs index b7bbc5d..dfa9dc7 100644 --- a/src/autorouter/board.rs +++ b/src/autorouter/board.rs @@ -2,6 +2,7 @@ use std::collections::HashMap; use crate::{ drawing::{ + band::BandIndex, dot::{FixedDotIndex, FixedDotWeight}, graph::{GetLayer, GetMaybeNet, PrimitiveIndex}, rules::RulesTrait, @@ -15,6 +16,7 @@ use crate::{ Layout, }, math::Circle, + router::{navmesh::Navmesh, Router, RouterError, RouterObserverTrait}, }; pub type NodeIndex = GenericNode>; @@ -25,6 +27,7 @@ pub struct Board { node_to_pinname: HashMap, layer_to_layername: HashMap, net_to_netname: HashMap, + pinname_pair_to_band: HashMap<(String, String), BandIndex>, } impl Board { @@ -34,6 +37,7 @@ impl Board { node_to_pinname: HashMap::new(), layer_to_layername: HashMap::new(), net_to_netname: HashMap::new(), + pinname_pair_to_band: HashMap::new(), } } @@ -116,6 +120,32 @@ impl Board { zone } + pub fn route_band( + &mut self, + navmesh: Navmesh, + width: f64, + observer: &mut impl RouterObserverTrait, + ) -> 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_from_navmesh(self.layout_mut(), navmesh); + let result = router.route_band(100.0, observer); + + if let Ok(band) = result { + self.pinname_pair_to_band + .insert((source_pinname, target_pinname), band); + } + + result + } + pub fn bename_layer(&mut self, layer: u64, layername: String) { self.layer_to_layername.insert(layer, layername); } @@ -155,6 +185,22 @@ impl Board { self.net_to_netname.get(&net) } + pub fn band_between_pins(&self, pinname1: &String, pinname2: &String) -> Option { + if let Some(band) = self + .pinname_pair_to_band + .get(&(pinname1.to_string(), pinname2.to_string())) + { + Some(*band) + } else if let Some(band) = self + .pinname_pair_to_band + .get(&(pinname2.to_string(), pinname1.to_string())) + { + Some(*band) + } else { + None + } + } + pub fn layout(&self) -> &Layout { &self.layout } diff --git a/src/bin/topola-egui/app.rs b/src/bin/topola-egui/app.rs index 1fefc0a..68ad320 100644 --- a/src/bin/topola-egui/app.rs +++ b/src/bin/topola-egui/app.rs @@ -255,8 +255,8 @@ impl eframe::App for App { let mut execute = invoker.execute_walk(Command::Autoroute(selection)); if let Execute::Autoroute(ref mut autoroute) = execute { - let from = autoroute.navmesh().as_ref().unwrap().from(); - let to = autoroute.navmesh().as_ref().unwrap().to(); + let from = autoroute.navmesh().as_ref().unwrap().source(); + let to = autoroute.navmesh().as_ref().unwrap().target(); { let mut shared_data = shared_data_arc_mutex.lock().unwrap(); diff --git a/src/drawing/band.rs b/src/drawing/band.rs index 52104db..e486a8c 100644 --- a/src/drawing/band.rs +++ b/src/drawing/band.rs @@ -1,6 +1,6 @@ use crate::drawing::seg::{LoneLooseSegIndex, SeqLooseSegIndex}; -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Hash, Clone, Copy, Eq, PartialEq)] pub enum BandIndex { Straight(LoneLooseSegIndex), Bended(SeqLooseSegIndex), diff --git a/src/router/navmesh.rs b/src/router/navmesh.rs index 283ed35..fb67a4b 100644 --- a/src/router/navmesh.rs +++ b/src/router/navmesh.rs @@ -82,8 +82,8 @@ impl HasPosition for TrianvertexWeight { pub struct Navmesh { triangulation: Triangulation, navvertex_to_trianvertex: Vec>, - from: FixedDotIndex, - to: FixedDotIndex, + source: FixedDotIndex, + target: FixedDotIndex, } #[derive(Error, Debug, Clone)] @@ -95,26 +95,29 @@ pub enum NavmeshError { impl Navmesh { pub fn new( layout: &Layout, - from: FixedDotIndex, - to: FixedDotIndex, + source: FixedDotIndex, + target: FixedDotIndex, ) -> Result { let mut this = Self { triangulation: Triangulation::new(layout.drawing().geometry().graph().node_bound()), navvertex_to_trianvertex: Vec::new(), - from, - to, + source, + target, }; this.navvertex_to_trianvertex .resize(layout.drawing().geometry().graph().node_bound(), None); - let layer = layout.drawing().primitive(from).layer(); - let maybe_net = layout.drawing().primitive(from).maybe_net(); + let layer = layout.drawing().primitive(source).layer(); + let maybe_net = layout.drawing().primitive(source).maybe_net(); for node in layout.drawing().layer_primitive_nodes(layer) { let primitive = node.primitive(layout.drawing()); if let Some(primitive_net) = primitive.maybe_net() { - if node == from.into() || node == to.into() || Some(primitive_net) != maybe_net { + if node == source.into() + || node == target.into() + || Some(primitive_net) != maybe_net + { match node { PrimitiveIndex::FixedDot(dot) => { this.triangulation.add_vertex(TrianvertexWeight { @@ -164,12 +167,12 @@ impl Navmesh { } } - pub fn from(&self) -> FixedDotIndex { - self.from + pub fn source(&self) -> FixedDotIndex { + self.source } - pub fn to(&self) -> FixedDotIndex { - self.to + pub fn target(&self) -> FixedDotIndex { + self.target } } diff --git a/src/router/router.rs b/src/router/router.rs index d9b78fd..d460df5 100644 --- a/src/router/router.rs +++ b/src/router/router.rs @@ -169,8 +169,8 @@ impl<'a, R: RulesTrait> Router<'a, R> { width: f64, observer: &mut impl RouterObserverTrait, ) -> Result { - let from = self.navmesh.from(); - let to = self.navmesh.to(); + let from = self.navmesh.source(); + let to = self.navmesh.target(); let mut tracer = Tracer::new(self.layout); let trace = tracer.start(from, width);