From a02bf1541ee0c6dbb0c0789c93034c07ad66944c Mon Sep 17 00:00:00 2001 From: Mikolaj Wielgus Date: Wed, 5 Jun 2024 23:10:11 +0200 Subject: [PATCH] autorouter: implement measurement of band length --- src/autorouter/board.rs | 4 +- src/autorouter/selection.rs | 3 +- src/layout/layout.rs | 37 ++++++++++++++++--- src/router/router.rs | 4 +- ...single_layer_tht_diode_bridge_rectifier.rs | 17 +++++++++ 5 files changed, 54 insertions(+), 11 deletions(-) diff --git a/src/autorouter/board.rs b/src/autorouter/board.rs index dfa9dc7..0ef014d 100644 --- a/src/autorouter/board.rs +++ b/src/autorouter/board.rs @@ -13,14 +13,12 @@ use crate::{ graph::GenericIndex, layout::{ zone::{GetMaybeApex, MakePolyShape, ZoneWeight}, - Layout, + Layout, NodeIndex, }, math::Circle, router::{navmesh::Navmesh, Router, RouterError, RouterObserverTrait}, }; -pub type NodeIndex = GenericNode>; - #[derive(Debug)] pub struct Board { layout: Layout, diff --git a/src/autorouter/selection.rs b/src/autorouter/selection.rs index 16037d7..3f955b4 100644 --- a/src/autorouter/selection.rs +++ b/src/autorouter/selection.rs @@ -3,12 +3,13 @@ use std::collections::HashSet; use serde::{Deserialize, Serialize}; use crate::{ - autorouter::board::{Board, NodeIndex}, + autorouter::board::Board, drawing::{ graph::{GetLayer, MakePrimitive, PrimitiveIndex}, rules::RulesTrait, }, graph::GenericIndex, + layout::NodeIndex, }; #[derive(Debug, Clone, Hash, Eq, PartialEq, Serialize, Deserialize)] diff --git a/src/layout/layout.rs b/src/layout/layout.rs index 6a266e0..0d02e69 100644 --- a/src/layout/layout.rs +++ b/src/layout/layout.rs @@ -10,6 +10,7 @@ use crate::{ bend::LooseBendWeight, dot::{DotIndex, FixedDotIndex, FixedDotWeight, LooseDotIndex, LooseDotWeight}, graph::{GetLayer, GetMaybeNet, PrimitiveIndex, PrimitiveWeight, Retag}, + primitive::{GetJoints, GetOtherJoint}, rules::RulesTrait, seg::{ FixedSegIndex, FixedSegWeight, LoneLooseSegIndex, LoneLooseSegWeight, SeqLooseSegIndex, @@ -20,8 +21,9 @@ use crate::{ Drawing, Infringement, LayoutException, }, geometry::{ - compound::CompoundManagerTrait, poly::PolyShape, shape::ShapeTrait, BendWeightTrait, - DotWeightTrait, GenericNode, Geometry, GeometryLabel, GetWidth, SegWeightTrait, + compound::CompoundManagerTrait, poly::PolyShape, primitive::PrimitiveShapeTrait, + shape::ShapeTrait, BendWeightTrait, DotWeightTrait, GenericNode, Geometry, GeometryLabel, + GetWidth, SegWeightTrait, }, graph::{GenericIndex, GetNodeIndex}, layout::zone::{GetMaybeApex, MakePolyShape, PourZoneIndex, SolidZoneIndex, Zone, ZoneWeight}, @@ -137,9 +139,34 @@ impl Layout { self.drawing.compounds(node) } - pub fn band_length(&self, face: DotIndex) -> f64 { - // TODO. - 0.0 + pub fn band_length(&self, band: BandIndex) -> f64 { + match band { + BandIndex::Straight(seg) => self.drawing.geometry().seg_shape(seg.into()).length(), + BandIndex::Bended(mut start_seg) => { + let mut length = self.drawing.geometry().seg_shape(start_seg.into()).length(); + let mut start_dot = self.drawing.primitive(start_seg).joints().1; + + let bend = self.drawing.primitive(start_dot).bend(); + length += self.drawing.geometry().bend_shape(bend.into()).length(); + + let mut prev_dot = self.drawing.primitive(bend).other_joint(start_dot.into()); + let mut seg = self.drawing.primitive(prev_dot).seg().unwrap(); + length += self.drawing.geometry().seg_shape(seg.into()).length(); + + while let DotIndex::Loose(dot) = + self.drawing.primitive(seg).other_joint(prev_dot.into()) + { + let bend = self.drawing.primitive(dot).bend(); + length += self.drawing.geometry().bend_shape(bend.into()).length(); + + prev_dot = self.drawing.primitive(bend).other_joint(dot); + seg = self.drawing.primitive(prev_dot).seg().unwrap(); + length += self.drawing.geometry().seg_shape(seg.into()).length(); + } + + length + } + } } pub fn zone_nodes(&self) -> impl Iterator> + '_ { diff --git a/src/router/router.rs b/src/router/router.rs index d460df5..d6d7d78 100644 --- a/src/router/router.rs +++ b/src/router/router.rs @@ -114,14 +114,14 @@ impl<'a, RO: RouterObserverTrait, R: RulesTrait> AstarStrategy<&Navmesh, f64, return None; } - let before_probe_length = self.tracer.layout.band_length(self.trace.head.face()); + let before_probe_length = 0.0; //self.tracer.layout.band_length(self.trace.head.face()); let width = self.trace.width; let result = self.tracer.step(&mut self.trace, edge.target(), width); self.observer .on_probe(&self.tracer, &self.trace, edge, result); - let probe_length = self.tracer.layout.band_length(self.trace.head.face()); + let probe_length = 0.0; //self.tracer.layout.band_length(self.trace.head.face()); if result.is_ok() { self.tracer.undo_step(&mut self.trace); diff --git a/tests/single_layer_tht_diode_bridge_rectifier.rs b/tests/single_layer_tht_diode_bridge_rectifier.rs index 0428bf6..4b6c94b 100644 --- a/tests/single_layer_tht_diode_bridge_rectifier.rs +++ b/tests/single_layer_tht_diode_bridge_rectifier.rs @@ -12,6 +12,7 @@ use topola::{ }, dsn::design::DsnDesign, graph::GetNodeIndex, + layout::NodeIndex, triangulation::GetTrianvertexIndex, }; @@ -111,5 +112,21 @@ fn test() { unionfind.find(target_dot.node_index()) ); } + + let source_pinname = autorouter + .board() + .node_pinname(NodeIndex::Primitive(source_dot.into())) + .unwrap(); + let target_pinname = autorouter + .board() + .node_pinname(NodeIndex::Primitive(target_dot.into())) + .unwrap(); + dbg!(source_pinname, target_pinname); + + let band = autorouter + .board() + .band_between_pins(source_pinname, target_pinname) + .unwrap(); + dbg!(autorouter.board().layout().band_length(band)); } }