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.
This commit is contained in:
Mikolaj Wielgus 2024-05-07 02:09:48 +02:00
parent 2a97e9bb06
commit 765738f44b
3 changed files with 52 additions and 41 deletions

View File

@ -70,27 +70,27 @@ impl Ratsnest {
let mut triangulations = HashMap::new(); let mut triangulations = HashMap::new();
for node in layout.drawing().primitive_nodes() { for layer in 0..layout.drawing().layer_count() {
for node in layout.drawing().layer_primitive_nodes(layer) {
match node { match node {
PrimitiveIndex::FixedDot(dot) => { PrimitiveIndex::FixedDot(dot) => {
if layout.compounds(dot).next().is_none() { if layout.compounds(dot).next().is_none() {
if let Some(net) = layout.drawing().primitive(dot).maybe_net() { if let Some(net) = layout.drawing().primitive(dot).maybe_net() {
if !triangulations.contains_key(&net) { if !triangulations.contains_key(&(layer, net)) {
triangulations.insert( triangulations.insert(
net, (layer, net),
Triangulation::new( Triangulation::new(
layout.drawing().geometry().graph().node_bound(), layout.drawing().geometry().graph().node_bound(),
), ),
); );
} }
triangulations triangulations.get_mut(&(layer, net)).unwrap().add_vertex(
.get_mut(&net) VertexWeight {
.unwrap()
.add_vertex(VertexWeight {
vertex: RatsnestVertexIndex::FixedDot(dot), vertex: RatsnestVertexIndex::FixedDot(dot),
pos: node.primitive(layout.drawing()).shape().center(), pos: node.primitive(layout.drawing()).shape().center(),
})?; },
)?;
} }
} }
} }
@ -98,17 +98,17 @@ impl Ratsnest {
} }
} }
for zone in layout.zone_nodes() { for zone in layout.layer_zone_nodes(layer) {
if let Some(net) = layout.drawing().compound_weight(zone).maybe_net() { if let Some(net) = layout.drawing().compound_weight(zone).maybe_net() {
if !triangulations.contains_key(&net) { if !triangulations.contains_key(&(layer, net)) {
triangulations.insert( triangulations.insert(
net, (layer, net),
Triangulation::new(layout.drawing().geometry().graph().node_bound()), Triangulation::new(layout.drawing().geometry().graph().node_bound()),
); );
} }
triangulations triangulations
.get_mut(&net) .get_mut(&(layer, net))
.unwrap() .unwrap()
.add_vertex(VertexWeight { .add_vertex(VertexWeight {
vertex: RatsnestVertexIndex::Zone(zone), vertex: RatsnestVertexIndex::Zone(zone),
@ -116,8 +116,9 @@ impl Ratsnest {
})? })?
} }
} }
}
for (net, triangulation) in triangulations { for ((_layer, _net), triangulation) in triangulations {
let mut map = Vec::new(); let mut map = Vec::new();
for element in petgraph::algo::min_spanning_tree(&triangulation) { for element in petgraph::algo::min_spanning_tree(&triangulation) {

View File

@ -838,6 +838,12 @@ impl<CW: Copy, R: RulesTrait> Drawing<CW, R> {
self.geometry_with_rtree.rtree() 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().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()))] #[debug_ensures(self.geometry_with_rtree.graph().edge_count() == old(self.geometry_with_rtree.graph().edge_count()))]
pub fn rules(&self) -> &R { pub fn rules(&self) -> &R {

View File

@ -347,6 +347,10 @@ impl<
} }
} }
pub fn layer_count(&self) -> u64 {
self.layer_count
}
pub fn geometry(&self) -> &Geometry<PW, DW, SW, BW, CW, PI, DI, SI, BI> { pub fn geometry(&self) -> &Geometry<PW, DW, SW, BW, CW, PI, DI, SI, BI> {
&self.geometry &self.geometry
} }