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();
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 {
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) {
if !triangulations.contains_key(&(layer, net)) {
triangulations.insert(
net,
(layer, net),
Triangulation::new(
layout.drawing().geometry().graph().node_bound(),
),
);
}
triangulations
.get_mut(&net)
.unwrap()
.add_vertex(VertexWeight {
triangulations.get_mut(&(layer, net)).unwrap().add_vertex(
VertexWeight {
vertex: RatsnestVertexIndex::FixedDot(dot),
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 !triangulations.contains_key(&net) {
if !triangulations.contains_key(&(layer, net)) {
triangulations.insert(
net,
(layer, net),
Triangulation::new(layout.drawing().geometry().graph().node_bound()),
);
}
triangulations
.get_mut(&net)
.get_mut(&(layer, net))
.unwrap()
.add_vertex(VertexWeight {
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();
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()
}
#[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 {

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> {
&self.geometry
}