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,54 +70,55 @@ 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() {
match node { for node in layout.drawing().layer_primitive_nodes(layer) {
PrimitiveIndex::FixedDot(dot) => { match node {
if layout.compounds(dot).next().is_none() { PrimitiveIndex::FixedDot(dot) => {
if let Some(net) = layout.drawing().primitive(dot).maybe_net() { if layout.compounds(dot).next().is_none() {
if !triangulations.contains_key(&net) { if let Some(net) = layout.drawing().primitive(dot).maybe_net() {
triangulations.insert( if !triangulations.contains_key(&(layer, net)) {
net, triangulations.insert(
Triangulation::new( (layer, net),
layout.drawing().geometry().graph().node_bound(), Triangulation::new(
), layout.drawing().geometry().graph().node_bound(),
); ),
} );
}
triangulations triangulations.get_mut(&(layer, net)).unwrap().add_vertex(
.get_mut(&net) VertexWeight {
.unwrap() vertex: RatsnestVertexIndex::FixedDot(dot),
.add_vertex(VertexWeight { pos: node.primitive(layout.drawing()).shape().center(),
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() { for ((_layer, _net), triangulation) in triangulations {
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 {
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
} }