mirror of https://codeberg.org/topola/topola.git
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:
parent
2a97e9bb06
commit
765738f44b
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue