mirror of https://codeberg.org/topola/topola.git
refactor(autorouter/autorouter): Do some more refactors, renamings, struct-wrappings
This commit is contained in:
parent
0311aee613
commit
5c39bd60de
|
|
@ -27,15 +27,15 @@ allowed_scopes = [
|
||||||
"autorouter/invoker",
|
"autorouter/invoker",
|
||||||
"autorouter/measure_length",
|
"autorouter/measure_length",
|
||||||
"autorouter/multilayer_autoroute",
|
"autorouter/multilayer_autoroute",
|
||||||
|
"autorouter/multilayer_preconfigurer",
|
||||||
"autorouter/multilayer_reconfigurator",
|
"autorouter/multilayer_reconfigurator",
|
||||||
"autorouter/multilayer_reconfigurer",
|
"autorouter/multilayer_reconfigurer",
|
||||||
"autorouter/place_via",
|
"autorouter/place_via",
|
||||||
"autorouter/planar_autoroute",
|
"autorouter/planar_autoroute",
|
||||||
|
"autorouter/planar_preconfigurer",
|
||||||
"autorouter/planar_reconfigurator",
|
"autorouter/planar_reconfigurator",
|
||||||
"autorouter/planar_reconfigurer",
|
"autorouter/planar_reconfigurer",
|
||||||
"autorouter/planner",
|
|
||||||
"autorouter/pointroute",
|
"autorouter/pointroute",
|
||||||
"autorouter/presorter",
|
|
||||||
"autorouter/ratsnest",
|
"autorouter/ratsnest",
|
||||||
"autorouter/ratsnests",
|
"autorouter/ratsnests",
|
||||||
"autorouter/ratline",
|
"autorouter/ratline",
|
||||||
|
|
|
||||||
|
|
@ -13,13 +13,10 @@ use thiserror::Error;
|
||||||
use crate::{
|
use crate::{
|
||||||
autorouter::{
|
autorouter::{
|
||||||
multilayer_autoroute::MultilayerAutorouteOptions,
|
multilayer_autoroute::MultilayerAutorouteOptions,
|
||||||
multilayer_reconfigurator::{
|
multilayer_preconfigurer::MultilayerAutoroutePreconfigurerInput,
|
||||||
MultilayerAutorouteReconfigurator, MultilayerAutorouteReconfiguratorInput,
|
multilayer_reconfigurator::MultilayerAutorouteReconfigurator,
|
||||||
},
|
planar_preconfigurer::PlanarAutoroutePreconfigurerInput,
|
||||||
planar_reconfigurator::{
|
planar_reconfigurator::PlanarAutorouteReconfigurator, ratsnests::Ratsnests,
|
||||||
PlanarAutorouteReconfigurator, PlanarAutorouteReconfiguratorInput,
|
|
||||||
},
|
|
||||||
ratsnests::Ratsnests,
|
|
||||||
},
|
},
|
||||||
board::{AccessMesadata, Board},
|
board::{AccessMesadata, Board},
|
||||||
drawing::{band::BandTermsegIndex, graph::MakePrimitiveRef},
|
drawing::{band::BandTermsegIndex, graph::MakePrimitiveRef},
|
||||||
|
|
@ -33,7 +30,6 @@ use crate::{
|
||||||
use super::{
|
use super::{
|
||||||
measure_length::MeasureLengthExecutionStepper,
|
measure_length::MeasureLengthExecutionStepper,
|
||||||
place_via::PlaceViaExecutionStepper,
|
place_via::PlaceViaExecutionStepper,
|
||||||
planar_autoroute::PlanarAutorouteExecutionStepper,
|
|
||||||
pointroute::PointrouteExecutionStepper,
|
pointroute::PointrouteExecutionStepper,
|
||||||
ratline::RatlineUid,
|
ratline::RatlineUid,
|
||||||
ratsnest::RatvertexNodeIndex,
|
ratsnest::RatvertexNodeIndex,
|
||||||
|
|
@ -125,7 +121,7 @@ impl<M: AccessMesadata> Autorouter<M> {
|
||||||
) -> Result<MultilayerAutorouteReconfigurator, AutorouterError> {
|
) -> Result<MultilayerAutorouteReconfigurator, AutorouterError> {
|
||||||
MultilayerAutorouteReconfigurator::new(
|
MultilayerAutorouteReconfigurator::new(
|
||||||
self,
|
self,
|
||||||
MultilayerAutorouteReconfiguratorInput {
|
MultilayerAutoroutePreconfigurerInput {
|
||||||
ratlines: self.selected_ratlines(selection, options.planar.principal_layer),
|
ratlines: self.selected_ratlines(selection, options.planar.principal_layer),
|
||||||
},
|
},
|
||||||
options,
|
options,
|
||||||
|
|
@ -139,7 +135,7 @@ impl<M: AccessMesadata> Autorouter<M> {
|
||||||
) -> Result<PlanarAutorouteReconfigurator, AutorouterError> {
|
) -> Result<PlanarAutorouteReconfigurator, AutorouterError> {
|
||||||
PlanarAutorouteReconfigurator::new(
|
PlanarAutorouteReconfigurator::new(
|
||||||
self,
|
self,
|
||||||
PlanarAutorouteReconfiguratorInput {
|
PlanarAutoroutePreconfigurerInput {
|
||||||
ratlines: self.selected_planar_ratlines(selection, options.principal_layer),
|
ratlines: self.selected_planar_ratlines(selection, options.principal_layer),
|
||||||
},
|
},
|
||||||
options,
|
options,
|
||||||
|
|
|
||||||
|
|
@ -11,15 +11,15 @@ pub mod history;
|
||||||
pub mod invoker;
|
pub mod invoker;
|
||||||
pub mod measure_length;
|
pub mod measure_length;
|
||||||
pub mod multilayer_autoroute;
|
pub mod multilayer_autoroute;
|
||||||
|
pub mod multilayer_preconfigurer;
|
||||||
pub mod multilayer_reconfigurator;
|
pub mod multilayer_reconfigurator;
|
||||||
pub mod multilayer_reconfigurer;
|
pub mod multilayer_reconfigurer;
|
||||||
pub mod place_via;
|
pub mod place_via;
|
||||||
pub mod planar_autoroute;
|
pub mod planar_autoroute;
|
||||||
|
pub mod planar_preconfigurer;
|
||||||
pub mod planar_reconfigurator;
|
pub mod planar_reconfigurator;
|
||||||
pub mod planar_reconfigurer;
|
pub mod planar_reconfigurer;
|
||||||
pub mod planner;
|
|
||||||
pub mod pointroute;
|
pub mod pointroute;
|
||||||
pub mod presorter;
|
|
||||||
pub mod ratline;
|
pub mod ratline;
|
||||||
pub mod ratsnest;
|
pub mod ratsnest;
|
||||||
pub mod ratsnests;
|
pub mod ratsnests;
|
||||||
|
|
|
||||||
|
|
@ -11,10 +11,8 @@ use crate::{
|
||||||
autorouter::{
|
autorouter::{
|
||||||
anterouter::{Anterouter, AnterouterOptions, AnterouterPlan},
|
anterouter::{Anterouter, AnterouterOptions, AnterouterPlan},
|
||||||
invoker::GetDebugOverlayData,
|
invoker::GetDebugOverlayData,
|
||||||
planar_reconfigurator::{
|
planar_preconfigurer::PlanarAutoroutePreconfigurerInput,
|
||||||
PlanarAutorouteReconfigurator, PlanarAutorouteReconfiguratorInput,
|
planar_reconfigurator::{PlanarAutorouteReconfigurator, PlanarReconfiguratorStatus},
|
||||||
PlanarReconfiguratorStatus,
|
|
||||||
},
|
|
||||||
Autorouter, AutorouterError, PlanarAutorouteOptions,
|
Autorouter, AutorouterError, PlanarAutorouteOptions,
|
||||||
},
|
},
|
||||||
board::edit::BoardEdit,
|
board::edit::BoardEdit,
|
||||||
|
|
@ -27,7 +25,7 @@ use crate::{
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct MultilayerAutorouteConfiguration {
|
pub struct MultilayerAutorouteConfiguration {
|
||||||
pub plan: AnterouterPlan,
|
pub plan: AnterouterPlan,
|
||||||
pub planar: PlanarAutorouteReconfiguratorInput,
|
pub planar: PlanarAutoroutePreconfigurerInput,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Deserialize, Serialize)]
|
#[derive(Clone, Copy, Debug, Deserialize, Serialize)]
|
||||||
|
|
|
||||||
|
|
@ -21,17 +21,26 @@ use crate::{
|
||||||
graph::MakeRef,
|
graph::MakeRef,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub struct MultilayerAutoroutePreconfigurerInput {
|
||||||
|
pub ratlines: Vec<RatlineUid>,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Getters)]
|
#[derive(Getters)]
|
||||||
pub struct Planner {
|
pub struct MultilayerPreconfigurer {
|
||||||
plan: AnterouterPlan,
|
plan: AnterouterPlan,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Planner {
|
impl MultilayerPreconfigurer {
|
||||||
pub fn new(autorouter: &Autorouter<impl AccessMesadata>, ratlines: &[RatlineUid]) -> Self {
|
pub fn new(
|
||||||
|
autorouter: &Autorouter<impl AccessMesadata>,
|
||||||
|
input: MultilayerAutoroutePreconfigurerInput,
|
||||||
|
) -> Self {
|
||||||
Self::new_from_layer_map(
|
Self::new_from_layer_map(
|
||||||
autorouter,
|
autorouter,
|
||||||
ratlines,
|
&input.ratlines,
|
||||||
ratlines
|
input
|
||||||
|
.ratlines
|
||||||
.iter()
|
.iter()
|
||||||
.enumerate()
|
.enumerate()
|
||||||
.map(|(i, ratline)| (*ratline, i % 2))
|
.map(|(i, ratline)| (*ratline, i % 2))
|
||||||
|
|
@ -13,10 +13,12 @@ use crate::{
|
||||||
MultilayerAutorouteConfiguration, MultilayerAutorouteExecutionStepper,
|
MultilayerAutorouteConfiguration, MultilayerAutorouteExecutionStepper,
|
||||||
MultilayerAutorouteOptions,
|
MultilayerAutorouteOptions,
|
||||||
},
|
},
|
||||||
|
multilayer_preconfigurer::{
|
||||||
|
MultilayerAutoroutePreconfigurerInput, MultilayerPreconfigurer,
|
||||||
|
},
|
||||||
multilayer_reconfigurer::MultilayerReconfigurer,
|
multilayer_reconfigurer::MultilayerReconfigurer,
|
||||||
planar_reconfigurator::{PlanarAutorouteReconfiguratorInput, PlanarReconfiguratorStatus},
|
planar_preconfigurer::PlanarAutoroutePreconfigurerInput,
|
||||||
planner::Planner,
|
planar_reconfigurator::PlanarReconfiguratorStatus,
|
||||||
ratline::RatlineUid,
|
|
||||||
Autorouter, AutorouterError,
|
Autorouter, AutorouterError,
|
||||||
},
|
},
|
||||||
board::edit::BoardEdit,
|
board::edit::BoardEdit,
|
||||||
|
|
@ -26,10 +28,6 @@ use crate::{
|
||||||
stepper::{Abort, EstimateProgress, ReconfiguratorStatus, Reconfigure, Step},
|
stepper::{Abort, EstimateProgress, ReconfiguratorStatus, Reconfigure, Step},
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct MultilayerAutorouteReconfiguratorInput {
|
|
||||||
pub ratlines: Vec<RatlineUid>,
|
|
||||||
}
|
|
||||||
|
|
||||||
pub type MultilayerReconfiguratorStatus = ReconfiguratorStatus<(), PlanarReconfiguratorStatus>;
|
pub type MultilayerReconfiguratorStatus = ReconfiguratorStatus<(), PlanarReconfiguratorStatus>;
|
||||||
|
|
||||||
pub struct MultilayerAutorouteReconfigurator {
|
pub struct MultilayerAutorouteReconfigurator {
|
||||||
|
|
@ -43,13 +41,13 @@ pub struct MultilayerAutorouteReconfigurator {
|
||||||
impl MultilayerAutorouteReconfigurator {
|
impl MultilayerAutorouteReconfigurator {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
autorouter: &mut Autorouter<impl AccessMesadata>,
|
autorouter: &mut Autorouter<impl AccessMesadata>,
|
||||||
input: MultilayerAutorouteReconfiguratorInput,
|
input: MultilayerAutoroutePreconfigurerInput,
|
||||||
options: MultilayerAutorouteOptions,
|
options: MultilayerAutorouteOptions,
|
||||||
) -> Result<Self, AutorouterError> {
|
) -> Result<Self, AutorouterError> {
|
||||||
let planner = Planner::new(autorouter, &input.ratlines);
|
let planner = MultilayerPreconfigurer::new(autorouter, input.clone());
|
||||||
let preconfiguration = MultilayerAutorouteConfiguration {
|
let preconfiguration = MultilayerAutorouteConfiguration {
|
||||||
plan: planner.plan().clone(),
|
plan: planner.plan().clone(),
|
||||||
planar: PlanarAutorouteReconfiguratorInput {
|
planar: PlanarAutoroutePreconfigurerInput {
|
||||||
ratlines: input.ratlines.clone(),
|
ratlines: input.ratlines.clone(),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -7,8 +7,8 @@ use std::time::SystemTime;
|
||||||
use specctra_core::mesadata::AccessMesadata;
|
use specctra_core::mesadata::AccessMesadata;
|
||||||
|
|
||||||
use crate::autorouter::{
|
use crate::autorouter::{
|
||||||
anterouter::AnterouterPlan, multilayer_autoroute::MultilayerAutorouteOptions, planner::Planner,
|
anterouter::AnterouterPlan, multilayer_autoroute::MultilayerAutorouteOptions,
|
||||||
ratline::RatlineUid, Autorouter,
|
multilayer_preconfigurer::MultilayerPreconfigurer, ratline::RatlineUid, Autorouter,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct MultilayerReconfigurer {
|
pub struct MultilayerReconfigurer {
|
||||||
|
|
@ -30,7 +30,7 @@ impl MultilayerReconfigurer {
|
||||||
&mut self,
|
&mut self,
|
||||||
autorouter: &Autorouter<impl AccessMesadata>,
|
autorouter: &Autorouter<impl AccessMesadata>,
|
||||||
) -> Option<AnterouterPlan> {
|
) -> Option<AnterouterPlan> {
|
||||||
let planner = Planner::new_from_layer_map(
|
let planner = MultilayerPreconfigurer::new_from_layer_map(
|
||||||
autorouter,
|
autorouter,
|
||||||
&self.original_ratlines,
|
&self.original_ratlines,
|
||||||
self.original_ratlines
|
self.original_ratlines
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,15 @@ use enum_dispatch::enum_dispatch;
|
||||||
use petgraph::algo::tarjan_scc;
|
use petgraph::algo::tarjan_scc;
|
||||||
use specctra_core::mesadata::AccessMesadata;
|
use specctra_core::mesadata::AccessMesadata;
|
||||||
|
|
||||||
use crate::autorouter::{ratline::RatlineUid, scc::Scc, Autorouter, PlanarAutorouteOptions};
|
use crate::autorouter::{
|
||||||
|
planar_autoroute::PlanarAutorouteConfiguration, ratline::RatlineUid, scc::Scc, Autorouter,
|
||||||
|
PlanarAutorouteOptions,
|
||||||
|
};
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub struct PlanarAutoroutePreconfigurerInput {
|
||||||
|
pub ratlines: Vec<RatlineUid>,
|
||||||
|
}
|
||||||
|
|
||||||
pub struct PresortParams {
|
pub struct PresortParams {
|
||||||
pub intersector_count_weight: f64,
|
pub intersector_count_weight: f64,
|
||||||
|
|
@ -15,28 +23,28 @@ pub struct PresortParams {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[enum_dispatch]
|
#[enum_dispatch]
|
||||||
pub trait PresortRatlines {
|
pub trait PreconfigurePlanarAutoroute {
|
||||||
fn presort_ratlines(
|
fn preconfigure(
|
||||||
&self,
|
&self,
|
||||||
autorouter: &mut Autorouter<impl AccessMesadata>,
|
autorouter: &mut Autorouter<impl AccessMesadata>,
|
||||||
ratlines: &[RatlineUid],
|
input: PlanarAutoroutePreconfigurerInput,
|
||||||
) -> Vec<RatlineUid>;
|
) -> PlanarAutorouteConfiguration;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[enum_dispatch(PresortRatlines)]
|
#[enum_dispatch(PresortRatlines)]
|
||||||
pub enum RatlinesPresorter {
|
pub enum PlanarAutoroutePreconfigurer {
|
||||||
SccIntersectionsLength(SccIntersectionsAndLengthPresorter),
|
SccIntersectionsLength(SccIntersectionsAndLengthRatlinePlanarAutoroutePreconfigurer),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Getters, Dissolve)]
|
#[derive(Getters, Dissolve)]
|
||||||
pub struct SccIntersectionsAndLengthPresorter {
|
pub struct SccIntersectionsAndLengthRatlinePlanarAutoroutePreconfigurer {
|
||||||
sccs: Vec<Scc>,
|
sccs: Vec<Scc>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SccIntersectionsAndLengthPresorter {
|
impl SccIntersectionsAndLengthRatlinePlanarAutoroutePreconfigurer {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
autorouter: &mut Autorouter<impl AccessMesadata>,
|
autorouter: &mut Autorouter<impl AccessMesadata>,
|
||||||
ratlines: &[RatlineUid],
|
input: PlanarAutoroutePreconfigurerInput,
|
||||||
params: &PresortParams,
|
params: &PresortParams,
|
||||||
options: &PlanarAutorouteOptions,
|
options: &PlanarAutorouteOptions,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
|
|
@ -46,11 +54,19 @@ impl SccIntersectionsAndLengthPresorter {
|
||||||
.on_principal_layer(options.principal_layer)
|
.on_principal_layer(options.principal_layer)
|
||||||
.graph()
|
.graph()
|
||||||
.clone();
|
.clone();
|
||||||
filtered_ratsnest.retain_edges(|_g, i| ratlines.iter().any(|ratline| ratline.index == i));
|
filtered_ratsnest
|
||||||
|
.retain_edges(|_g, i| input.ratlines.iter().any(|ratline| ratline.index == i));
|
||||||
|
|
||||||
let mut sccs: Vec<_> = tarjan_scc(&filtered_ratsnest)
|
let mut sccs: Vec<_> = tarjan_scc(&filtered_ratsnest)
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|node_indices| Scc::new(autorouter, ratlines, &filtered_ratsnest, node_indices))
|
.map(|node_indices| {
|
||||||
|
Scc::new(
|
||||||
|
autorouter,
|
||||||
|
&input.ratlines,
|
||||||
|
&filtered_ratsnest,
|
||||||
|
node_indices,
|
||||||
|
)
|
||||||
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
sccs.sort_unstable_by(|a, b| {
|
sccs.sort_unstable_by(|a, b| {
|
||||||
|
|
@ -66,22 +82,24 @@ impl SccIntersectionsAndLengthPresorter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PresortRatlines for SccIntersectionsAndLengthPresorter {
|
impl PreconfigurePlanarAutoroute for SccIntersectionsAndLengthRatlinePlanarAutoroutePreconfigurer {
|
||||||
fn presort_ratlines(
|
fn preconfigure(
|
||||||
&self,
|
&self,
|
||||||
autorouter: &mut Autorouter<impl AccessMesadata>,
|
autorouter: &mut Autorouter<impl AccessMesadata>,
|
||||||
ratlines: &[RatlineUid],
|
input: PlanarAutoroutePreconfigurerInput,
|
||||||
) -> Vec<RatlineUid> {
|
) -> PlanarAutorouteConfiguration {
|
||||||
let mut presorted_ratlines = vec![];
|
let mut presorted_ratlines = vec![];
|
||||||
|
|
||||||
for scc in self.sccs.iter() {
|
for scc in self.sccs.iter() {
|
||||||
for ratline in ratlines.iter() {
|
for ratline in input.ratlines.iter() {
|
||||||
if scc.scc_ref(autorouter).contains(*ratline) {
|
if scc.scc_ref(autorouter).contains(*ratline) {
|
||||||
presorted_ratlines.push(*ratline);
|
presorted_ratlines.push(*ratline);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
presorted_ratlines
|
PlanarAutorouteConfiguration {
|
||||||
|
ratlines: presorted_ratlines,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -13,9 +13,11 @@ use crate::{
|
||||||
PlanarAutorouteConfiguration, PlanarAutorouteConfigurationResult,
|
PlanarAutorouteConfiguration, PlanarAutorouteConfigurationResult,
|
||||||
PlanarAutorouteContinueStatus, PlanarAutorouteExecutionStepper,
|
PlanarAutorouteContinueStatus, PlanarAutorouteExecutionStepper,
|
||||||
},
|
},
|
||||||
planar_reconfigurer::{PermuteRatlines, PlanarReconfigurer},
|
planar_preconfigurer::{
|
||||||
presorter::{PresortParams, PresortRatlines, SccIntersectionsAndLengthPresorter},
|
PlanarAutoroutePreconfigurerInput, PreconfigurePlanarAutoroute, PresortParams,
|
||||||
ratline::RatlineUid,
|
SccIntersectionsAndLengthRatlinePlanarAutoroutePreconfigurer,
|
||||||
|
},
|
||||||
|
planar_reconfigurer::{MakeNextPlanarAutorouteConfiguration, PlanarAutorouteReconfigurer},
|
||||||
Autorouter, AutorouterError, PlanarAutorouteOptions,
|
Autorouter, AutorouterError, PlanarAutorouteOptions,
|
||||||
},
|
},
|
||||||
board::edit::BoardEdit,
|
board::edit::BoardEdit,
|
||||||
|
|
@ -25,40 +27,37 @@ use crate::{
|
||||||
stepper::{Abort, EstimateProgress, ReconfiguratorStatus, Reconfigure, Step},
|
stepper::{Abort, EstimateProgress, ReconfiguratorStatus, Reconfigure, Step},
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
|
||||||
pub struct PlanarAutorouteReconfiguratorInput {
|
|
||||||
pub ratlines: Vec<RatlineUid>,
|
|
||||||
}
|
|
||||||
|
|
||||||
pub type PlanarReconfiguratorStatus =
|
pub type PlanarReconfiguratorStatus =
|
||||||
ReconfiguratorStatus<PlanarAutorouteConfigurationResult, PlanarAutorouteContinueStatus>;
|
ReconfiguratorStatus<PlanarAutorouteConfigurationResult, PlanarAutorouteContinueStatus>;
|
||||||
|
|
||||||
pub struct PlanarAutorouteReconfigurator {
|
pub struct PlanarAutorouteReconfigurator {
|
||||||
stepper: PlanarAutorouteExecutionStepper,
|
stepper: PlanarAutorouteExecutionStepper,
|
||||||
reconfigurer: PlanarReconfigurer,
|
reconfigurer: PlanarAutorouteReconfigurer,
|
||||||
options: PlanarAutorouteOptions,
|
options: PlanarAutorouteOptions,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PlanarAutorouteReconfigurator {
|
impl PlanarAutorouteReconfigurator {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
autorouter: &mut Autorouter<impl AccessMesadata>,
|
autorouter: &mut Autorouter<impl AccessMesadata>,
|
||||||
input: PlanarAutorouteReconfiguratorInput,
|
input: PlanarAutoroutePreconfigurerInput,
|
||||||
options: PlanarAutorouteOptions,
|
options: PlanarAutorouteOptions,
|
||||||
) -> Result<Self, AutorouterError> {
|
) -> Result<Self, AutorouterError> {
|
||||||
let presorter = SccIntersectionsAndLengthPresorter::new(
|
let preconfigurer = SccIntersectionsAndLengthRatlinePlanarAutoroutePreconfigurer::new(
|
||||||
autorouter,
|
autorouter,
|
||||||
&input.ratlines,
|
input.clone(),
|
||||||
&PresortParams {
|
&PresortParams {
|
||||||
intersector_count_weight: 1.0,
|
intersector_count_weight: 1.0,
|
||||||
length_weight: 0.001,
|
length_weight: 0.001,
|
||||||
},
|
},
|
||||||
&options,
|
&options,
|
||||||
);
|
);
|
||||||
let preconfiguration = PlanarAutorouteConfiguration {
|
let preconfiguration = preconfigurer.preconfigure(autorouter, input);
|
||||||
ratlines: presorter.presort_ratlines(autorouter, &input.ratlines),
|
let reconfigurer = PlanarAutorouteReconfigurer::new(
|
||||||
};
|
autorouter,
|
||||||
let reconfigurer =
|
preconfiguration.clone(),
|
||||||
PlanarReconfigurer::new(autorouter, preconfiguration.clone(), presorter, &options);
|
preconfigurer,
|
||||||
|
&options,
|
||||||
|
);
|
||||||
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
stepper: PlanarAutorouteExecutionStepper::new(autorouter, preconfiguration, options)?,
|
stepper: PlanarAutorouteExecutionStepper::new(autorouter, preconfiguration, options)?,
|
||||||
|
|
@ -89,9 +88,9 @@ impl<M: AccessMesadata> Step<Autorouter<M>, Option<BoardEdit>, PlanarReconfigura
|
||||||
}
|
}
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let Some(permutation) = self
|
let Some(configuration) = self
|
||||||
.reconfigurer
|
.reconfigurer
|
||||||
.permute_ratlines(autorouter, &self.stepper)
|
.next_configuration(autorouter, &self.stepper)
|
||||||
else {
|
else {
|
||||||
return Ok(ControlFlow::Break(None));
|
return Ok(ControlFlow::Break(None));
|
||||||
};
|
};
|
||||||
|
|
@ -99,7 +98,7 @@ impl<M: AccessMesadata> Step<Autorouter<M>, Option<BoardEdit>, PlanarReconfigura
|
||||||
match self.stepper.reconfigure(
|
match self.stepper.reconfigure(
|
||||||
autorouter,
|
autorouter,
|
||||||
PlanarAutorouteConfiguration {
|
PlanarAutorouteConfiguration {
|
||||||
ratlines: permutation,
|
ratlines: configuration,
|
||||||
},
|
},
|
||||||
) {
|
) {
|
||||||
Ok(result) => {
|
Ok(result) => {
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ use specctra_core::mesadata::AccessMesadata;
|
||||||
use crate::{
|
use crate::{
|
||||||
autorouter::{
|
autorouter::{
|
||||||
planar_autoroute::{PlanarAutorouteConfiguration, PlanarAutorouteExecutionStepper},
|
planar_autoroute::{PlanarAutorouteConfiguration, PlanarAutorouteExecutionStepper},
|
||||||
presorter::SccIntersectionsAndLengthPresorter,
|
planar_preconfigurer::SccIntersectionsAndLengthRatlinePlanarAutoroutePreconfigurer,
|
||||||
ratline::RatlineUid,
|
ratline::RatlineUid,
|
||||||
scc::Scc,
|
scc::Scc,
|
||||||
Autorouter, PlanarAutorouteOptions,
|
Autorouter, PlanarAutorouteOptions,
|
||||||
|
|
@ -22,49 +22,51 @@ use crate::{
|
||||||
};
|
};
|
||||||
|
|
||||||
#[enum_dispatch]
|
#[enum_dispatch]
|
||||||
pub trait PermuteRatlines {
|
pub trait MakeNextPlanarAutorouteConfiguration {
|
||||||
fn permute_ratlines(
|
fn next_configuration(
|
||||||
&mut self,
|
&mut self,
|
||||||
autorouter: &mut Autorouter<impl AccessMesadata>,
|
autorouter: &mut Autorouter<impl AccessMesadata>,
|
||||||
stepper: &PlanarAutorouteExecutionStepper,
|
stepper: &PlanarAutorouteExecutionStepper,
|
||||||
) -> Option<Vec<RatlineUid>>;
|
) -> Option<Vec<RatlineUid>>;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[enum_dispatch(PermuteRatlines)]
|
#[enum_dispatch(MakeNextPlanarAutorouteConfiguration)]
|
||||||
pub enum PlanarReconfigurer {
|
pub enum PlanarAutorouteReconfigurer {
|
||||||
RatlineCuts(RatlineCutsPlanarReconfigurer),
|
RatlineCuts(RatlineCutsPlanarAutorouteReconfigurer),
|
||||||
SccPermutations(SccPermutationsPlanarReconfigurer),
|
SccPermutations(SccPermutationsPlanarAutorouteReconfigurer),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PlanarReconfigurer {
|
impl PlanarAutorouteReconfigurer {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
autorouter: &mut Autorouter<impl AccessMesadata>,
|
autorouter: &mut Autorouter<impl AccessMesadata>,
|
||||||
input_configuration: PlanarAutorouteConfiguration,
|
input_configuration: PlanarAutorouteConfiguration,
|
||||||
presorter: SccIntersectionsAndLengthPresorter,
|
presorter: SccIntersectionsAndLengthRatlinePlanarAutoroutePreconfigurer,
|
||||||
options: &PlanarAutorouteOptions,
|
options: &PlanarAutorouteOptions,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
PlanarReconfigurer::SccPermutations(SccPermutationsPlanarReconfigurer::new(
|
PlanarAutorouteReconfigurer::SccPermutations(
|
||||||
autorouter,
|
SccPermutationsPlanarAutorouteReconfigurer::new(
|
||||||
input_configuration,
|
autorouter,
|
||||||
presorter,
|
input_configuration,
|
||||||
options,
|
presorter,
|
||||||
))
|
options,
|
||||||
|
),
|
||||||
|
)
|
||||||
/*RatlinesPermuter::RatlineCuts(RatlineCutsRatlinePermuter::new(
|
/*RatlinesPermuter::RatlineCuts(RatlineCutsRatlinePermuter::new(
|
||||||
autorouter, ratlines, presorter, options,
|
autorouter, ratlines, presorter, options,
|
||||||
))*/
|
))*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct SccPermutationsPlanarReconfigurer {
|
pub struct SccPermutationsPlanarAutorouteReconfigurer {
|
||||||
sccs_permutations_iter: Skip<Permutations<std::vec::IntoIter<Scc>>>,
|
sccs_permutations_iter: Skip<Permutations<std::vec::IntoIter<Scc>>>,
|
||||||
input_configuration: PlanarAutorouteConfiguration,
|
initial_configuration: PlanarAutorouteConfiguration,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SccPermutationsPlanarReconfigurer {
|
impl SccPermutationsPlanarAutorouteReconfigurer {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
_autorouter: &mut Autorouter<impl AccessMesadata>,
|
_autorouter: &mut Autorouter<impl AccessMesadata>,
|
||||||
input_configuration: PlanarAutorouteConfiguration,
|
input_configuration: PlanarAutorouteConfiguration,
|
||||||
presorter: SccIntersectionsAndLengthPresorter,
|
presorter: SccIntersectionsAndLengthRatlinePlanarAutoroutePreconfigurer,
|
||||||
_options: &PlanarAutorouteOptions,
|
_options: &PlanarAutorouteOptions,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
// TODO: Instead of instantiating presorter again here, get it from
|
// TODO: Instead of instantiating presorter again here, get it from
|
||||||
|
|
@ -74,13 +76,13 @@ impl SccPermutationsPlanarReconfigurer {
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
sccs_permutations_iter: sccs.into_iter().permutations(sccs_len).skip(1),
|
sccs_permutations_iter: sccs.into_iter().permutations(sccs_len).skip(1),
|
||||||
input_configuration,
|
initial_configuration: input_configuration,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PermuteRatlines for SccPermutationsPlanarReconfigurer {
|
impl MakeNextPlanarAutorouteConfiguration for SccPermutationsPlanarAutorouteReconfigurer {
|
||||||
fn permute_ratlines(
|
fn next_configuration(
|
||||||
&mut self,
|
&mut self,
|
||||||
autorouter: &mut Autorouter<impl AccessMesadata>,
|
autorouter: &mut Autorouter<impl AccessMesadata>,
|
||||||
_stepper: &PlanarAutorouteExecutionStepper,
|
_stepper: &PlanarAutorouteExecutionStepper,
|
||||||
|
|
@ -89,7 +91,7 @@ impl PermuteRatlines for SccPermutationsPlanarReconfigurer {
|
||||||
let mut ratlines = vec![];
|
let mut ratlines = vec![];
|
||||||
|
|
||||||
for scc in scc_permutation {
|
for scc in scc_permutation {
|
||||||
for ratline in self.input_configuration.ratlines.iter() {
|
for ratline in self.initial_configuration.ratlines.iter() {
|
||||||
if scc.node_indices().contains(
|
if scc.node_indices().contains(
|
||||||
&autorouter
|
&autorouter
|
||||||
.ratsnests()
|
.ratsnests()
|
||||||
|
|
@ -116,15 +118,15 @@ impl PermuteRatlines for SccPermutationsPlanarReconfigurer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct RatlineCutsPlanarReconfigurer {
|
pub struct RatlineCutsPlanarAutorouteReconfigurer {
|
||||||
//sccs: Vec<Vec<NodeIndex<usize>>>,
|
//sccs: Vec<Vec<NodeIndex<usize>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl RatlineCutsPlanarReconfigurer {
|
impl RatlineCutsPlanarAutorouteReconfigurer {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
_autorouter: &mut Autorouter<impl AccessMesadata>,
|
_autorouter: &mut Autorouter<impl AccessMesadata>,
|
||||||
_ratlines: Vec<RatlineUid>,
|
_ratlines: Vec<RatlineUid>,
|
||||||
_presorter: SccIntersectionsAndLengthPresorter,
|
_presorter: SccIntersectionsAndLengthRatlinePlanarAutoroutePreconfigurer,
|
||||||
_options: &PlanarAutorouteOptions,
|
_options: &PlanarAutorouteOptions,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
/*Self {
|
/*Self {
|
||||||
|
|
@ -134,8 +136,8 @@ impl RatlineCutsPlanarReconfigurer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PermuteRatlines for RatlineCutsPlanarReconfigurer {
|
impl MakeNextPlanarAutorouteConfiguration for RatlineCutsPlanarAutorouteReconfigurer {
|
||||||
fn permute_ratlines(
|
fn next_configuration(
|
||||||
&mut self,
|
&mut self,
|
||||||
autorouter: &mut Autorouter<impl AccessMesadata>,
|
autorouter: &mut Autorouter<impl AccessMesadata>,
|
||||||
stepper: &PlanarAutorouteExecutionStepper,
|
stepper: &PlanarAutorouteExecutionStepper,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue