diff --git a/src/drawing/band.rs b/src/drawing/band.rs index 202d9d9..3fb44c7 100644 --- a/src/drawing/band.rs +++ b/src/drawing/band.rs @@ -1,4 +1,15 @@ -use crate::drawing::seg::{LoneLooseSegIndex, SeqLooseSegIndex}; +use crate::{ + drawing::seg::{LoneLooseSegIndex, SeqLooseSegIndex}, + geometry::shape::MeasureLength, + graph::MakeRef, +}; + +use super::{ + dot::DotIndex, + primitive::{GetJoints, GetOtherJoint}, + rules::AccessRules, + Drawing, +}; #[derive(Debug, Hash, Clone, Copy, Eq, PartialEq)] pub enum BandFirstSegIndex { @@ -6,4 +17,55 @@ pub enum BandFirstSegIndex { Bended(SeqLooseSegIndex), } -pub struct BandRef {} +impl<'a, CW: Copy, R: AccessRules> MakeRef<'a, BandRef<'a, CW, R>, Drawing> + for BandFirstSegIndex +{ + fn ref_(&self, drawing: &'a Drawing) -> BandRef<'a, CW, R> { + BandRef::new(*self, drawing) + } +} + +pub struct BandRef<'a, CW: Copy, R: AccessRules> { + first_seg: BandFirstSegIndex, + drawing: &'a Drawing, +} + +impl<'a, CW: Copy, R: AccessRules> BandRef<'a, CW, R> { + pub fn new(first_seg: BandFirstSegIndex, drawing: &'a Drawing) -> BandRef<'a, CW, R> { + Self { first_seg, drawing } + } +} + +impl<'a, CW: Copy, R: AccessRules> MeasureLength for BandRef<'a, CW, R> { + fn length(&self) -> f64 { + match self.first_seg { + BandFirstSegIndex::Straight(seg) => { + self.drawing.geometry().seg_shape(seg.into()).length() + } + BandFirstSegIndex::Bended(start_seg) => { + let mut length = self.drawing.geometry().seg_shape(start_seg.into()).length(); + let 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 + } + } + } +} diff --git a/src/layout/layout.rs b/src/layout/layout.rs index 94cd28b..14c3eff 100644 --- a/src/layout/layout.rs +++ b/src/layout/layout.rs @@ -208,38 +208,6 @@ impl Layout { self.drawing.remove_band(band); } - pub fn band_length(&self, band: BandFirstSegIndex) -> f64 { - match band { - BandFirstSegIndex::Straight(seg) => { - self.drawing.geometry().seg_shape(seg.into()).length() - } - BandFirstSegIndex::Bended(start_seg) => { - let mut length = self.drawing.geometry().seg_shape(start_seg.into()).length(); - let 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 polys( &self, node: GenericIndex, diff --git a/tests/common/mod.rs b/tests/common/mod.rs index b70679c..37908a5 100644 --- a/tests/common/mod.rs +++ b/tests/common/mod.rs @@ -9,7 +9,8 @@ use topola::{ }, board::{mesadata::AccessMesadata, Board}, drawing::graph::{GetLayer, GetMaybeNet}, - graph::GetPetgraphIndex, + geometry::shape::MeasureLength, + graph::{GetPetgraphIndex, MakeRef}, specctra::{design::SpecctraDesign, mesadata::SpecctraMesadata}, }; @@ -148,7 +149,7 @@ pub fn assert_band_length( epsilon: f64, ) { let band = board.band_between_pins(source, target).unwrap(); - let band_length = board.layout().band_length(band); + let band_length = band.ref_(board.layout().drawing()).length(); assert!((band_length - length).abs() < epsilon); }