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,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) {
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue