From bd37d2f7f8b38448840ac227e8510e7967369af6 Mon Sep 17 00:00:00 2001 From: Mikolaj Wielgus Date: Tue, 28 Oct 2025 15:09:47 +0100 Subject: [PATCH] feat(autorouter/multilayer_reconfigurer): Only relayer ratlines failed in best case --- src/autorouter/multilayer_reconfigurer.rs | 47 +++++++++++++++-------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/src/autorouter/multilayer_reconfigurer.rs b/src/autorouter/multilayer_reconfigurer.rs index c092def..a280d96 100644 --- a/src/autorouter/multilayer_reconfigurer.rs +++ b/src/autorouter/multilayer_reconfigurer.rs @@ -30,6 +30,7 @@ pub enum MultilayerAutorouteReconfigurer { pub struct IncrementFailedRatlineLayersMultilayerAutorouteReconfigurer { last_configuration: MultilayerAutorouteConfiguration, + maybe_best_planar_status: Option, planar_autoroute_reconfiguration_count: u64, } @@ -41,6 +42,7 @@ impl IncrementFailedRatlineLayersMultilayerAutorouteReconfigurer { ) -> Self { Self { last_configuration: preconfiguration, + maybe_best_planar_status: None, planar_autoroute_reconfiguration_count: 0, } } @@ -54,30 +56,41 @@ impl MakeNextMultilayerAutorouteConfiguration autorouter: &Autorouter, planar_result: Result, ) -> ControlFlow> { - if self.planar_autoroute_reconfiguration_count < 10 { - self.planar_autoroute_reconfiguration_count += 1; - return ControlFlow::Continue(()); - } - - self.planar_autoroute_reconfiguration_count = 0; + self.planar_autoroute_reconfiguration_count += 1; let Ok(planar_status) = planar_result else { return ControlFlow::Break(None); }; + if self + .maybe_best_planar_status + .as_ref() + .is_none_or(|status| status.costs.lengths.len() < planar_status.costs.lengths.len()) + { + self.maybe_best_planar_status = Some(planar_status.clone()); + } + + if self.planar_autoroute_reconfiguration_count < 10 { + return ControlFlow::Continue(()); + } + + self.planar_autoroute_reconfiguration_count = 0; + let mut new_anterouter_plan = self.last_configuration.plan.clone(); - for ratline_index in - planar_status.costs.lengths.len()..planar_status.configuration.ratlines.len() - { - *new_anterouter_plan - .layer_map - .get_mut(&planar_status.configuration.ratlines[ratline_index]) - .unwrap() += 1; - *new_anterouter_plan - .layer_map - .get_mut(&planar_status.configuration.ratlines[ratline_index]) - .unwrap() %= autorouter.board().layout().drawing().layer_count(); + if let Some(ref best_planar_status) = self.maybe_best_planar_status { + for ratline_index in + best_planar_status.costs.lengths.len()..planar_status.configuration.ratlines.len() + { + *new_anterouter_plan + .layer_map + .get_mut(&planar_status.configuration.ratlines[ratline_index]) + .unwrap() += 1; + *new_anterouter_plan + .layer_map + .get_mut(&planar_status.configuration.ratlines[ratline_index]) + .unwrap() %= autorouter.board().layout().drawing().layer_count(); + } } self.last_configuration = MultilayerAutorouteConfiguration {