feat(autorouter/multilayer_reconfigurer): Only relayer ratlines failed in best case

This commit is contained in:
Mikolaj Wielgus 2025-10-28 15:09:47 +01:00
parent 01b6691257
commit bd37d2f7f8
1 changed files with 30 additions and 17 deletions

View File

@ -30,6 +30,7 @@ pub enum MultilayerAutorouteReconfigurer {
pub struct IncrementFailedRatlineLayersMultilayerAutorouteReconfigurer { pub struct IncrementFailedRatlineLayersMultilayerAutorouteReconfigurer {
last_configuration: MultilayerAutorouteConfiguration, last_configuration: MultilayerAutorouteConfiguration,
maybe_best_planar_status: Option<PlanarAutorouteConfigurationStatus>,
planar_autoroute_reconfiguration_count: u64, planar_autoroute_reconfiguration_count: u64,
} }
@ -41,6 +42,7 @@ impl IncrementFailedRatlineLayersMultilayerAutorouteReconfigurer {
) -> Self { ) -> Self {
Self { Self {
last_configuration: preconfiguration, last_configuration: preconfiguration,
maybe_best_planar_status: None,
planar_autoroute_reconfiguration_count: 0, planar_autoroute_reconfiguration_count: 0,
} }
} }
@ -54,30 +56,41 @@ impl MakeNextMultilayerAutorouteConfiguration
autorouter: &Autorouter<impl AccessMesadata>, autorouter: &Autorouter<impl AccessMesadata>,
planar_result: Result<PlanarAutorouteConfigurationStatus, AutorouterError>, planar_result: Result<PlanarAutorouteConfigurationStatus, AutorouterError>,
) -> ControlFlow<Option<MultilayerAutorouteConfiguration>> { ) -> ControlFlow<Option<MultilayerAutorouteConfiguration>> {
if self.planar_autoroute_reconfiguration_count < 10 { self.planar_autoroute_reconfiguration_count += 1;
self.planar_autoroute_reconfiguration_count += 1;
return ControlFlow::Continue(());
}
self.planar_autoroute_reconfiguration_count = 0;
let Ok(planar_status) = planar_result else { let Ok(planar_status) = planar_result else {
return ControlFlow::Break(None); 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(); let mut new_anterouter_plan = self.last_configuration.plan.clone();
for ratline_index in if let Some(ref best_planar_status) = self.maybe_best_planar_status {
planar_status.costs.lengths.len()..planar_status.configuration.ratlines.len() for ratline_index in
{ best_planar_status.costs.lengths.len()..planar_status.configuration.ratlines.len()
*new_anterouter_plan {
.layer_map *new_anterouter_plan
.get_mut(&planar_status.configuration.ratlines[ratline_index]) .layer_map
.unwrap() += 1; .get_mut(&planar_status.configuration.ratlines[ratline_index])
*new_anterouter_plan .unwrap() += 1;
.layer_map *new_anterouter_plan
.get_mut(&planar_status.configuration.ratlines[ratline_index]) .layer_map
.unwrap() %= autorouter.board().layout().drawing().layer_count(); .get_mut(&planar_status.configuration.ratlines[ratline_index])
.unwrap() %= autorouter.board().layout().drawing().layer_count();
}
} }
self.last_configuration = MultilayerAutorouteConfiguration { self.last_configuration = MultilayerAutorouteConfiguration {