From 765738f44b4f381d7100834864d6019fab1ba117 Mon Sep 17 00:00:00 2001 From: Mikolaj Wielgus Date: Tue, 7 May 2024 02:09:48 +0200 Subject: [PATCH] autorouter: treat (layer, net) pairs like separate nets for ratsnest Most likely we won't be having via placement anytime soon, so let's narrow our routing capabilities to single layer at a time. --- src/autorouter/ratsnest.rs | 83 +++++++++++++++++++------------------- src/drawing/drawing.rs | 6 +++ src/geometry/with_rtree.rs | 4 ++ 3 files changed, 52 insertions(+), 41 deletions(-) diff --git a/src/autorouter/ratsnest.rs b/src/autorouter/ratsnest.rs index 6f0b945..fceb64f 100644 --- a/src/autorouter/ratsnest.rs +++ b/src/autorouter/ratsnest.rs @@ -70,54 +70,55 @@ impl Ratsnest { let mut triangulations = HashMap::new(); - for node in layout.drawing().primitive_nodes() { - match node { - PrimitiveIndex::FixedDot(dot) => { - if layout.compounds(dot).next().is_none() { - if let Some(net) = layout.drawing().primitive(dot).maybe_net() { - if !triangulations.contains_key(&net) { - triangulations.insert( - net, - Triangulation::new( - layout.drawing().geometry().graph().node_bound(), - ), - ); - } + for layer in 0..layout.drawing().layer_count() { + for node in layout.drawing().layer_primitive_nodes(layer) { + match node { + PrimitiveIndex::FixedDot(dot) => { + if layout.compounds(dot).next().is_none() { + if let Some(net) = layout.drawing().primitive(dot).maybe_net() { + if !triangulations.contains_key(&(layer, net)) { + triangulations.insert( + (layer, net), + Triangulation::new( + layout.drawing().geometry().graph().node_bound(), + ), + ); + } - triangulations - .get_mut(&net) - .unwrap() - .add_vertex(VertexWeight { - vertex: RatsnestVertexIndex::FixedDot(dot), - pos: node.primitive(layout.drawing()).shape().center(), - })?; + triangulations.get_mut(&(layer, net)).unwrap().add_vertex( + VertexWeight { + vertex: RatsnestVertexIndex::FixedDot(dot), + pos: node.primitive(layout.drawing()).shape().center(), + }, + )?; + } } } + _ => (), + } + } + + for zone in layout.layer_zone_nodes(layer) { + if let Some(net) = layout.drawing().compound_weight(zone).maybe_net() { + if !triangulations.contains_key(&(layer, net)) { + triangulations.insert( + (layer, net), + Triangulation::new(layout.drawing().geometry().graph().node_bound()), + ); + } + + triangulations + .get_mut(&(layer, net)) + .unwrap() + .add_vertex(VertexWeight { + vertex: RatsnestVertexIndex::Zone(zone), + pos: layout.zone(zone).shape().center(), + })? } - _ => (), } } - for zone in layout.zone_nodes() { - if let Some(net) = layout.drawing().compound_weight(zone).maybe_net() { - if !triangulations.contains_key(&net) { - triangulations.insert( - net, - Triangulation::new(layout.drawing().geometry().graph().node_bound()), - ); - } - - triangulations - .get_mut(&net) - .unwrap() - .add_vertex(VertexWeight { - vertex: RatsnestVertexIndex::Zone(zone), - pos: layout.zone(zone).shape().center(), - })? - } - } - - for (net, triangulation) in triangulations { + for ((_layer, _net), triangulation) in triangulations { let mut map = Vec::new(); for element in petgraph::algo::min_spanning_tree(&triangulation) { diff --git a/src/drawing/drawing.rs b/src/drawing/drawing.rs index 53ddbe1..045e88f 100644 --- a/src/drawing/drawing.rs +++ b/src/drawing/drawing.rs @@ -838,6 +838,12 @@ impl Drawing { self.geometry_with_rtree.rtree() } + #[debug_ensures(self.geometry_with_rtree.graph().node_count() == old(self.geometry_with_rtree.graph().node_count()))] + #[debug_ensures(self.geometry_with_rtree.graph().edge_count() == old(self.geometry_with_rtree.graph().edge_count()))] + pub fn layer_count(&self) -> u64 { + self.geometry_with_rtree.layer_count() + } + #[debug_ensures(self.geometry_with_rtree.graph().node_count() == old(self.geometry_with_rtree.graph().node_count()))] #[debug_ensures(self.geometry_with_rtree.graph().edge_count() == old(self.geometry_with_rtree.graph().edge_count()))] pub fn rules(&self) -> &R { diff --git a/src/geometry/with_rtree.rs b/src/geometry/with_rtree.rs index 77a1bda..b602f48 100644 --- a/src/geometry/with_rtree.rs +++ b/src/geometry/with_rtree.rs @@ -347,6 +347,10 @@ impl< } } + pub fn layer_count(&self) -> u64 { + self.layer_count + } + pub fn geometry(&self) -> &Geometry { &self.geometry }