mirror of https://codeberg.org/topola/topola.git
feat(autorouter/multilayer_reconfigurer): Only relayer ratlines failed in best case
This commit is contained in:
parent
01b6691257
commit
bd37d2f7f8
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue