mirror of https://codeberg.org/topola/topola.git
refactor(autorouter/multilayer_reconfigurer): Process planar autoroute result in separate method
This commit is contained in:
parent
5d41e7d784
commit
2e507b7cab
|
|
@ -74,7 +74,7 @@ impl MultilayerAutorouteReconfigurator {
|
||||||
preconfiguration,
|
preconfiguration,
|
||||||
options,
|
options,
|
||||||
)?,
|
)?,
|
||||||
reconfiguration_trigger: SmaRateReconfigurationTrigger::new(10, 0.5, 0.5),
|
reconfiguration_trigger: SmaRateReconfigurationTrigger::new(4, 0.5, 0.5),
|
||||||
reconfigurer,
|
reconfigurer,
|
||||||
options,
|
options,
|
||||||
})
|
})
|
||||||
|
|
@ -90,10 +90,10 @@ impl MultilayerAutorouteReconfigurator {
|
||||||
self.reconfiguration_trigger = SmaRateReconfigurationTrigger::new(4, 0.5, 0.5);
|
self.reconfiguration_trigger = SmaRateReconfigurationTrigger::new(4, 0.5, 0.5);
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let configuration = match self
|
self.reconfigurer
|
||||||
.reconfigurer
|
.process_planar_result(autorouter, planar_result.clone());
|
||||||
.next_configuration(autorouter, planar_result.clone())
|
|
||||||
{
|
let configuration = match self.reconfigurer.next_configuration(autorouter) {
|
||||||
ControlFlow::Continue(()) => {
|
ControlFlow::Continue(()) => {
|
||||||
return Ok(ControlFlow::Continue(ReconfiguratorStatus::Running(
|
return Ok(ControlFlow::Continue(ReconfiguratorStatus::Running(
|
||||||
ReconfiguratorStatus::Reconfigured(planar_result?),
|
ReconfiguratorStatus::Reconfigured(planar_result?),
|
||||||
|
|
|
||||||
|
|
@ -16,10 +16,15 @@ use crate::autorouter::{
|
||||||
|
|
||||||
#[enum_dispatch]
|
#[enum_dispatch]
|
||||||
pub trait MakeNextMultilayerAutorouteConfiguration {
|
pub trait MakeNextMultilayerAutorouteConfiguration {
|
||||||
fn next_configuration(
|
fn process_planar_result(
|
||||||
&mut self,
|
&mut self,
|
||||||
autorouter: &Autorouter<impl AccessMesadata>,
|
autorouter: &Autorouter<impl AccessMesadata>,
|
||||||
planar_result: Result<PlanarAutorouteConfigurationStatus, AutorouterError>,
|
planar_result: Result<PlanarAutorouteConfigurationStatus, AutorouterError>,
|
||||||
|
);
|
||||||
|
|
||||||
|
fn next_configuration(
|
||||||
|
&mut self,
|
||||||
|
autorouter: &Autorouter<impl AccessMesadata>,
|
||||||
) -> ControlFlow<Option<MultilayerAutorouteConfiguration>>;
|
) -> ControlFlow<Option<MultilayerAutorouteConfiguration>>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -53,15 +58,15 @@ impl IncrementFailedRatlineLayersMultilayerAutorouteReconfigurer {
|
||||||
impl MakeNextMultilayerAutorouteConfiguration
|
impl MakeNextMultilayerAutorouteConfiguration
|
||||||
for IncrementFailedRatlineLayersMultilayerAutorouteReconfigurer
|
for IncrementFailedRatlineLayersMultilayerAutorouteReconfigurer
|
||||||
{
|
{
|
||||||
fn next_configuration(
|
fn process_planar_result(
|
||||||
&mut self,
|
&mut self,
|
||||||
autorouter: &Autorouter<impl AccessMesadata>,
|
_autorouter: &Autorouter<impl AccessMesadata>,
|
||||||
planar_result: Result<PlanarAutorouteConfigurationStatus, AutorouterError>,
|
planar_result: Result<PlanarAutorouteConfigurationStatus, AutorouterError>,
|
||||||
) -> ControlFlow<Option<MultilayerAutorouteConfiguration>> {
|
) {
|
||||||
self.planar_autoroute_reconfiguration_count += 1;
|
self.planar_autoroute_reconfiguration_count += 1;
|
||||||
|
|
||||||
let Ok(planar_status) = planar_result else {
|
let Ok(planar_status) = planar_result else {
|
||||||
return ControlFlow::Break(None);
|
return;
|
||||||
};
|
};
|
||||||
|
|
||||||
self.maybe_last_planar_status = Some(planar_status.clone());
|
self.maybe_last_planar_status = Some(planar_status.clone());
|
||||||
|
|
@ -73,7 +78,12 @@ impl MakeNextMultilayerAutorouteConfiguration
|
||||||
{
|
{
|
||||||
self.maybe_best_planar_status = Some(planar_status.clone());
|
self.maybe_best_planar_status = Some(planar_status.clone());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn next_configuration(
|
||||||
|
&mut self,
|
||||||
|
autorouter: &Autorouter<impl AccessMesadata>,
|
||||||
|
) -> ControlFlow<Option<MultilayerAutorouteConfiguration>> {
|
||||||
if self.planar_autoroute_reconfiguration_count < 10 {
|
if self.planar_autoroute_reconfiguration_count < 10 {
|
||||||
return ControlFlow::Continue(());
|
return ControlFlow::Continue(());
|
||||||
}
|
}
|
||||||
|
|
@ -82,17 +92,21 @@ impl MakeNextMultilayerAutorouteConfiguration
|
||||||
|
|
||||||
let mut new_anterouter_plan = self.last_configuration.plan.clone();
|
let mut new_anterouter_plan = self.last_configuration.plan.clone();
|
||||||
|
|
||||||
|
let Some(ref last_planar_status) = self.maybe_last_planar_status else {
|
||||||
|
return ControlFlow::Break(None);
|
||||||
|
};
|
||||||
|
|
||||||
if let Some(ref best_planar_status) = self.maybe_best_planar_status {
|
if let Some(ref best_planar_status) = self.maybe_best_planar_status {
|
||||||
for ratline_index in
|
for ratline_index in best_planar_status.costs.lengths.len()
|
||||||
best_planar_status.costs.lengths.len()..planar_status.configuration.ratlines.len()
|
..last_planar_status.configuration.ratlines.len()
|
||||||
{
|
{
|
||||||
*new_anterouter_plan
|
*new_anterouter_plan
|
||||||
.layer_map
|
.layer_map
|
||||||
.get_mut(&planar_status.configuration.ratlines[ratline_index])
|
.get_mut(&last_planar_status.configuration.ratlines[ratline_index])
|
||||||
.unwrap() += 1;
|
.unwrap() += 1;
|
||||||
*new_anterouter_plan
|
*new_anterouter_plan
|
||||||
.layer_map
|
.layer_map
|
||||||
.get_mut(&planar_status.configuration.ratlines[ratline_index])
|
.get_mut(&last_planar_status.configuration.ratlines[ratline_index])
|
||||||
.unwrap() %= autorouter.board().layout().drawing().layer_count();
|
.unwrap() %= autorouter.board().layout().drawing().layer_count();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue