diff --git a/src/autorouter/autorouter.rs b/src/autorouter/autorouter.rs index c3b50d3..c8c97b1 100644 --- a/src/autorouter/autorouter.rs +++ b/src/autorouter/autorouter.rs @@ -14,7 +14,7 @@ use crate::{ use super::{ autoroute::AutorouteExecutionStepper, compare_detours::CompareDetoursExecutionStepper, - measure_length::MeasureLengthExecutionStepper, + measure_length::MeasureLength, place_via::PlaceViaExecutionStepper, ratsnest::{Ratsnest, RatvertexIndex}, remove_bands::RemoveBandsExecutionStepper, @@ -138,11 +138,8 @@ impl Autorouter { CompareDetoursExecutionStepper::new(self, ratline1, ratline2, options) } - pub fn measure_length( - &mut self, - selection: &BandSelection, - ) -> Result { - MeasureLengthExecutionStepper::new(selection) + pub fn measure_length(&mut self, selection: &BandSelection) -> MeasureLength { + MeasureLength(selection.clone()) } pub fn ratline_endpoints( diff --git a/src/autorouter/execution.rs b/src/autorouter/execution.rs index f5b6fe5..e4b2c31 100644 --- a/src/autorouter/execution.rs +++ b/src/autorouter/execution.rs @@ -5,14 +5,14 @@ use serde::{Deserialize, Serialize}; use crate::{ board::mesadata::AccessMesadata, layout::via::ViaWeight, - stepper::{PollStep, Step, StepError}, + stepper::{EvalImmut, PollStep, Step, StepError}, }; use super::{ autoroute::{AutorouteExecutionStepper, AutorouteStatus}, compare_detours::CompareDetoursExecutionStepper, invoker::{Invoker, InvokerError}, - measure_length::MeasureLengthExecutionStepper, + measure_length::MeasureLength, place_via::PlaceViaExecutionStepper, remove_bands::RemoveBandsExecutionStepper, selection::{BandSelection, PinSelection}, @@ -36,7 +36,7 @@ pub enum ExecutionStepper { PlaceVia(PlaceViaExecutionStepper), RemoveBands(RemoveBandsExecutionStepper), CompareDetours(CompareDetoursExecutionStepper), - MeasureLength(MeasureLengthExecutionStepper), + MeasureLength(MeasureLength), } impl ExecutionStepper { @@ -70,7 +70,7 @@ impl ExecutionStepper { }); } ExecutionStepper::MeasureLength(measure_length) => { - let length = measure_length.doit(autorouter)?; + let length = measure_length.eval(autorouter)?; Poll::Ready(format!("Total length of selected bands: {}", length)) } } diff --git a/src/autorouter/invoker.rs b/src/autorouter/invoker.rs index 0f70a77..31a39f2 100644 --- a/src/autorouter/invoker.rs +++ b/src/autorouter/invoker.rs @@ -18,7 +18,7 @@ use super::{ compare_detours::CompareDetoursExecutionStepper, execution::{Command, ExecutionStepper}, history::{History, HistoryError}, - measure_length::MeasureLengthExecutionStepper, + measure_length::MeasureLength, place_via::PlaceViaExecutionStepper, remove_bands::RemoveBandsExecutionStepper, Autorouter, AutorouterError, @@ -26,22 +26,30 @@ use super::{ #[enum_dispatch] pub trait GetMaybeNavmesh { - fn maybe_navmesh(&self) -> Option<&Navmesh>; + fn maybe_navmesh(&self) -> Option<&Navmesh> { + None + } } #[enum_dispatch] pub trait GetMaybeTrace { - fn maybe_trace(&self) -> Option<&TraceStepper>; + fn maybe_trace(&self) -> Option<&TraceStepper> { + None + } } #[enum_dispatch] pub trait GetGhosts { - fn ghosts(&self) -> &[PrimitiveShape]; + fn ghosts(&self) -> &[PrimitiveShape] { + &[] + } } #[enum_dispatch] pub trait GetObstacles { - fn obstacles(&self) -> &[PrimitiveIndex]; + fn obstacles(&self) -> &[PrimitiveIndex] { + &[] + } } #[derive(Debug, Clone)] @@ -128,7 +136,7 @@ impl Invoker { self.autorouter.compare_detours(selection, *options)?, ), Command::MeasureLength(selection) => { - ExecutionStepper::MeasureLength(self.autorouter.measure_length(selection)?) + ExecutionStepper::MeasureLength(self.autorouter.measure_length(selection)) } }) } diff --git a/src/autorouter/measure_length.rs b/src/autorouter/measure_length.rs index c20e70a..12c1366 100644 --- a/src/autorouter/measure_length.rs +++ b/src/autorouter/measure_length.rs @@ -3,11 +3,8 @@ //! the length of specified band selections. use crate::{ - board::mesadata::AccessMesadata, - drawing::graph::PrimitiveIndex, - geometry::{primitive::PrimitiveShape, shape::MeasureLength as MeasureLengthTrait}, - graph::MakeRef, - router::{navmesh::Navmesh, trace::TraceStepper}, + board::mesadata::AccessMesadata, geometry::shape::MeasureLength as MeasureLengthTrait, + graph::MakeRef, stepper::EvalImmut, }; use super::{ @@ -16,65 +13,28 @@ use super::{ Autorouter, AutorouterError, }; -pub struct MeasureLengthExecutionStepper { - selection: BandSelection, - maybe_length: Option, -} +pub struct MeasureLength(pub BandSelection); -impl MeasureLengthExecutionStepper { - pub fn new(selection: &BandSelection) -> Result { - Ok(Self { - selection: selection.clone(), - maybe_length: None, - }) - } +impl EvalImmut, f64> for MeasureLength { + type Error = AutorouterError; - pub fn doit( - &mut self, - autorouter: &mut Autorouter, - ) -> Result { - let length = if let Some(length) = self.maybe_length { - length - } else { - let mut length = 0.0; + fn eval(&self, autorouter: &Autorouter) -> Result { + let mut length = 0.0; - for selector in self.selection.selectors() { - let band = autorouter - .board - .bandname_band(selector.band.clone()) - .unwrap() - .0; - length += band.ref_(autorouter.board.layout().drawing()).length(); - } - - self.maybe_length = Some(length); - length - }; + for selector in self.0.selectors() { + let band = autorouter + .board + .bandname_band(selector.band.clone()) + .unwrap() + .0; + length += band.ref_(autorouter.board.layout().drawing()).length(); + } Ok(length) } } -impl GetMaybeNavmesh for MeasureLengthExecutionStepper { - fn maybe_navmesh(&self) -> Option<&Navmesh> { - None - } -} - -impl GetMaybeTrace for MeasureLengthExecutionStepper { - fn maybe_trace(&self) -> Option<&TraceStepper> { - None - } -} - -impl GetGhosts for MeasureLengthExecutionStepper { - fn ghosts(&self) -> &[PrimitiveShape] { - &[] - } -} - -impl GetObstacles for MeasureLengthExecutionStepper { - fn obstacles(&self) -> &[PrimitiveIndex] { - &[] - } -} +impl GetMaybeNavmesh for MeasureLength {} +impl GetMaybeTrace for MeasureLength {} +impl GetGhosts for MeasureLength {} +impl GetObstacles for MeasureLength {} diff --git a/src/stepper.rs b/src/stepper.rs index 5e15753..db9e367 100644 --- a/src/stepper.rs +++ b/src/stepper.rs @@ -47,3 +47,11 @@ pub trait StepBack: StepError { pub trait Abort { fn abort(&mut self, context: &mut C); } + +/// Evaluations which don't modify the context +/// (basically calculating derived values) +pub trait EvalImmut { + type Error; + + fn eval(&self, context: &C) -> Result; +}