From 1fd61f773c0bd95adcd14e24a8e312a1c0ab52d5 Mon Sep 17 00:00:00 2001 From: Alain Emilia Anna Zscheile Date: Fri, 6 Dec 2024 20:48:23 +0100 Subject: [PATCH] feat: improve Selection API (BREAKS HISTORY) Test command files were rewritten using: ``` for f in tests/**/*.cmd; do jq ".done?.[].Autoroute[0] |= .selectors" "$f" | sponge "$f"; done ``` (compatible with bash/zsh/...) --- src/autorouter/selection.rs | 102 ++--- .../0603_breakout/autoroute_all.cmd | 44 +- .../autoroute_signals.cmd | 376 +++++++++--------- .../autoroute_all.cmd | 54 ++- .../autoroute_all.cmd | 116 +++--- 5 files changed, 327 insertions(+), 365 deletions(-) diff --git a/src/autorouter/selection.rs b/src/autorouter/selection.rs index daa6118..0a16935 100644 --- a/src/autorouter/selection.rs +++ b/src/autorouter/selection.rs @@ -16,32 +16,8 @@ pub struct PinSelector { pub layer: String, } -#[derive(Debug, Default, Clone, Serialize, Deserialize)] -pub struct PinSelection { - selectors: HashSet, -} - -impl PinSelection { - pub fn new() -> Self { - Self::default() - } - - pub fn new_select_layer(board: &Board, layer: usize) -> Self { - let mut this = Self::new(); - - for node in board.layout().drawing().layer_primitive_nodes(layer) { - if let Some(selector) = this.node_selector(board, GenericNode::Primitive(node)) { - if !this.contains_node(board, GenericNode::Primitive(node)) { - this.select(selector); - } - } - } - - this - } - - fn node_selector( - &self, +impl PinSelector { + pub fn try_from_node( board: &Board, node: NodeIndex, ) -> Option { @@ -74,22 +50,35 @@ impl PinSelection { None } } +} - fn select(&mut self, selector: PinSelector) { - self.selectors.insert(selector); +#[derive(Debug, Default, Clone, Serialize, Deserialize)] +pub struct PinSelection(HashSet); + +impl PinSelection { + pub fn new() -> Self { + Self::default() } - fn deselect(&mut self, selector: &PinSelector) { - self.selectors.remove(selector); + pub fn new_select_layer(board: &Board, layer: usize) -> Self { + let mut this = Self::default(); + + for node in board.layout().drawing().layer_primitive_nodes(layer) { + if let Some(selector) = PinSelector::try_from_node(board, GenericNode::Primitive(node)) + { + this.0.insert(selector); + } + } + + this } pub fn contains_node(&self, board: &Board, node: NodeIndex) -> bool { - self.node_selector(board, node) - .map_or(false, |selector| self.selectors.contains(&selector)) + PinSelector::try_from_node(board, node).map_or(false, |selector| self.0.contains(&selector)) } pub fn selectors(&self) -> impl Iterator { - self.selectors.iter() + self.0.iter() } } @@ -98,18 +87,8 @@ pub struct BandSelector { pub band: BandName, } -#[derive(Debug, Default, Clone, Serialize, Deserialize)] -pub struct BandSelection { - selectors: HashSet, -} - -impl BandSelection { - pub fn new() -> Self { - Self::default() - } - - fn node_selector( - &self, +impl BandSelector { + pub fn try_from_node( board: &Board, node: NodeIndex, ) -> Option { @@ -131,22 +110,23 @@ impl BandSelection { .clone(), }) } +} - fn select(&mut self, selector: BandSelector) { - self.selectors.insert(selector); - } +#[derive(Debug, Default, Clone, Serialize, Deserialize)] +pub struct BandSelection(HashSet); - fn deselect(&mut self, selector: &BandSelector) { - self.selectors.remove(selector); +impl BandSelection { + pub fn new() -> Self { + Self::default() } pub fn contains_node(&self, board: &Board, node: NodeIndex) -> bool { - self.node_selector(board, node) - .map_or(false, |selector| self.selectors.contains(&selector)) + BandSelector::try_from_node(board, node) + .map_or(false, |selector| self.0.contains(&selector)) } pub fn selectors(&self) -> impl Iterator { - self.selectors.iter() + self.0.iter() } } @@ -162,17 +142,17 @@ impl Selection { } pub fn toggle_at_node(&mut self, board: &Board, node: NodeIndex) { - if let Some(selector) = self.pin_selection.node_selector(board, node) { - if self.pin_selection.contains_node(board, node) { - self.pin_selection.deselect(&selector); + if let Some(selector) = PinSelector::try_from_node(board, node) { + if self.pin_selection.0.contains(&selector) { + self.pin_selection.0.remove(&selector); } else { - self.pin_selection.select(selector); + self.pin_selection.0.insert(selector); } - } else if let Some(selector) = self.band_selection.node_selector(board, node) { - if self.band_selection.contains_node(board, node) { - self.band_selection.deselect(&selector); + } else if let Some(selector) = BandSelector::try_from_node(board, node) { + if self.band_selection.0.contains(&selector) { + self.band_selection.0.remove(&selector); } else { - self.band_selection.select(selector); + self.band_selection.0.insert(selector); } } } diff --git a/tests/single_layer/0603_breakout/autoroute_all.cmd b/tests/single_layer/0603_breakout/autoroute_all.cmd index bf906ab..e70ed00 100644 --- a/tests/single_layer/0603_breakout/autoroute_all.cmd +++ b/tests/single_layer/0603_breakout/autoroute_all.cmd @@ -2,18 +2,16 @@ "done": [ { "Autoroute": [ - { - "selectors": [ - { - "pin": "R1-2", - "layer": "F.Cu" - }, - { - "pin": "J1-2", - "layer": "F.Cu" - } - ] - }, + [ + { + "pin": "R1-2", + "layer": "F.Cu" + }, + { + "pin": "J1-2", + "layer": "F.Cu" + } + ], { "presort_by_pairwise_detours": false, "router_options": { @@ -26,18 +24,16 @@ }, { "Autoroute": [ - { - "selectors": [ - { - "pin": "J1-1", - "layer": "F.Cu" - }, - { - "pin": "R1-1", - "layer": "F.Cu" - } - ] - }, + [ + { + "pin": "J1-1", + "layer": "F.Cu" + }, + { + "pin": "R1-1", + "layer": "F.Cu" + } + ], { "presort_by_pairwise_detours": false, "router_options": { diff --git a/tests/single_layer/4x_3rd_order_smd_lc_filters/autoroute_signals.cmd b/tests/single_layer/4x_3rd_order_smd_lc_filters/autoroute_signals.cmd index 608ef73..da04ee7 100644 --- a/tests/single_layer/4x_3rd_order_smd_lc_filters/autoroute_signals.cmd +++ b/tests/single_layer/4x_3rd_order_smd_lc_filters/autoroute_signals.cmd @@ -2,54 +2,52 @@ "done": [ { "Autoroute": [ - { - "selectors": [ - { - "pin": "L3-1", - "layer": "F.Cu" - }, - { - "pin": "L3-2", - "layer": "F.Cu" - }, - { - "pin": "C3-1", - "layer": "F.Cu" - }, - { - "pin": "L1-2", - "layer": "F.Cu" - }, - { - "pin": "C2-1", - "layer": "F.Cu" - }, - { - "pin": "L2-2", - "layer": "F.Cu" - }, - { - "pin": "J2-1", - "layer": "F.Cu" - }, - { - "pin": "J1-1", - "layer": "F.Cu" - }, - { - "pin": "L1-1", - "layer": "F.Cu" - }, - { - "pin": "C1-1", - "layer": "F.Cu" - }, - { - "pin": "L2-1", - "layer": "F.Cu" - } - ] - }, + [ + { + "pin": "L3-1", + "layer": "F.Cu" + }, + { + "pin": "L3-2", + "layer": "F.Cu" + }, + { + "pin": "C3-1", + "layer": "F.Cu" + }, + { + "pin": "L1-2", + "layer": "F.Cu" + }, + { + "pin": "C2-1", + "layer": "F.Cu" + }, + { + "pin": "L2-2", + "layer": "F.Cu" + }, + { + "pin": "J2-1", + "layer": "F.Cu" + }, + { + "pin": "J1-1", + "layer": "F.Cu" + }, + { + "pin": "L1-1", + "layer": "F.Cu" + }, + { + "pin": "C1-1", + "layer": "F.Cu" + }, + { + "pin": "L2-1", + "layer": "F.Cu" + } + ], { "presort_by_pairwise_detours": false, "router_options": { @@ -62,54 +60,52 @@ }, { "Autoroute": [ - { - "selectors": [ - { - "pin": "C6-1", - "layer": "F.Cu" - }, - { - "pin": "J4-1", - "layer": "F.Cu" - }, - { - "pin": "L5-1", - "layer": "F.Cu" - }, - { - "pin": "J3-1", - "layer": "F.Cu" - }, - { - "pin": "C5-1", - "layer": "F.Cu" - }, - { - "pin": "L6-2", - "layer": "F.Cu" - }, - { - "pin": "L5-2", - "layer": "F.Cu" - }, - { - "pin": "C4-1", - "layer": "F.Cu" - }, - { - "pin": "L6-1", - "layer": "F.Cu" - }, - { - "pin": "L4-1", - "layer": "F.Cu" - }, - { - "pin": "L4-2", - "layer": "F.Cu" - } - ] - }, + [ + { + "pin": "C6-1", + "layer": "F.Cu" + }, + { + "pin": "J4-1", + "layer": "F.Cu" + }, + { + "pin": "L5-1", + "layer": "F.Cu" + }, + { + "pin": "J3-1", + "layer": "F.Cu" + }, + { + "pin": "C5-1", + "layer": "F.Cu" + }, + { + "pin": "L6-2", + "layer": "F.Cu" + }, + { + "pin": "L5-2", + "layer": "F.Cu" + }, + { + "pin": "C4-1", + "layer": "F.Cu" + }, + { + "pin": "L6-1", + "layer": "F.Cu" + }, + { + "pin": "L4-1", + "layer": "F.Cu" + }, + { + "pin": "L4-2", + "layer": "F.Cu" + } + ], { "presort_by_pairwise_detours": false, "router_options": { @@ -122,54 +118,52 @@ }, { "Autoroute": [ - { - "selectors": [ - { - "pin": "C9-1", - "layer": "F.Cu" - }, - { - "pin": "J5-1", - "layer": "F.Cu" - }, - { - "pin": "L7-1", - "layer": "F.Cu" - }, - { - "pin": "J6-1", - "layer": "F.Cu" - }, - { - "pin": "L9-2", - "layer": "F.Cu" - }, - { - "pin": "C7-1", - "layer": "F.Cu" - }, - { - "pin": "L8-2", - "layer": "F.Cu" - }, - { - "pin": "L9-1", - "layer": "F.Cu" - }, - { - "pin": "L8-1", - "layer": "F.Cu" - }, - { - "pin": "L7-2", - "layer": "F.Cu" - }, - { - "pin": "C8-1", - "layer": "F.Cu" - } - ] - }, + [ + { + "pin": "C9-1", + "layer": "F.Cu" + }, + { + "pin": "J5-1", + "layer": "F.Cu" + }, + { + "pin": "L7-1", + "layer": "F.Cu" + }, + { + "pin": "J6-1", + "layer": "F.Cu" + }, + { + "pin": "L9-2", + "layer": "F.Cu" + }, + { + "pin": "C7-1", + "layer": "F.Cu" + }, + { + "pin": "L8-2", + "layer": "F.Cu" + }, + { + "pin": "L9-1", + "layer": "F.Cu" + }, + { + "pin": "L8-1", + "layer": "F.Cu" + }, + { + "pin": "L7-2", + "layer": "F.Cu" + }, + { + "pin": "C8-1", + "layer": "F.Cu" + } + ], { "presort_by_pairwise_detours": false, "router_options": { @@ -182,54 +176,52 @@ }, { "Autoroute": [ - { - "selectors": [ - { - "pin": "L10-1", - "layer": "F.Cu" - }, - { - "pin": "L12-1", - "layer": "F.Cu" - }, - { - "pin": "J7-1", - "layer": "F.Cu" - }, - { - "pin": "L10-2", - "layer": "F.Cu" - }, - { - "pin": "C10-1", - "layer": "F.Cu" - }, - { - "pin": "C12-1", - "layer": "F.Cu" - }, - { - "pin": "L12-2", - "layer": "F.Cu" - }, - { - "pin": "L11-1", - "layer": "F.Cu" - }, - { - "pin": "C11-1", - "layer": "F.Cu" - }, - { - "pin": "L11-2", - "layer": "F.Cu" - }, - { - "pin": "J8-1", - "layer": "F.Cu" - } - ] - }, + [ + { + "pin": "L10-1", + "layer": "F.Cu" + }, + { + "pin": "L12-1", + "layer": "F.Cu" + }, + { + "pin": "J7-1", + "layer": "F.Cu" + }, + { + "pin": "L10-2", + "layer": "F.Cu" + }, + { + "pin": "C10-1", + "layer": "F.Cu" + }, + { + "pin": "C12-1", + "layer": "F.Cu" + }, + { + "pin": "L12-2", + "layer": "F.Cu" + }, + { + "pin": "L11-1", + "layer": "F.Cu" + }, + { + "pin": "C11-1", + "layer": "F.Cu" + }, + { + "pin": "L11-2", + "layer": "F.Cu" + }, + { + "pin": "J8-1", + "layer": "F.Cu" + } + ], { "presort_by_pairwise_detours": false, "router_options": { diff --git a/tests/single_layer/tht_3pin_xlr_to_tht_3pin_xlr/autoroute_all.cmd b/tests/single_layer/tht_3pin_xlr_to_tht_3pin_xlr/autoroute_all.cmd index 40e9331..d59931a 100644 --- a/tests/single_layer/tht_3pin_xlr_to_tht_3pin_xlr/autoroute_all.cmd +++ b/tests/single_layer/tht_3pin_xlr_to_tht_3pin_xlr/autoroute_all.cmd @@ -2,34 +2,32 @@ "done": [ { "Autoroute": [ - { - "selectors": [ - { - "pin": "J2-2", - "layer": "F.Cu" - }, - { - "pin": "J1-2", - "layer": "F.Cu" - }, - { - "pin": "J2-3", - "layer": "F.Cu" - }, - { - "pin": "J2-1", - "layer": "F.Cu" - }, - { - "pin": "J1-3", - "layer": "F.Cu" - }, - { - "pin": "J1-1", - "layer": "F.Cu" - } - ] - }, + [ + { + "pin": "J2-2", + "layer": "F.Cu" + }, + { + "pin": "J1-2", + "layer": "F.Cu" + }, + { + "pin": "J2-3", + "layer": "F.Cu" + }, + { + "pin": "J2-1", + "layer": "F.Cu" + }, + { + "pin": "J1-3", + "layer": "F.Cu" + }, + { + "pin": "J1-1", + "layer": "F.Cu" + } + ], { "presort_by_pairwise_detours": false, "router_options": { diff --git a/tests/single_layer/tht_diode_bridge_rectifier/autoroute_all.cmd b/tests/single_layer/tht_diode_bridge_rectifier/autoroute_all.cmd index 1a0b1c8..c69a4d7 100644 --- a/tests/single_layer/tht_diode_bridge_rectifier/autoroute_all.cmd +++ b/tests/single_layer/tht_diode_bridge_rectifier/autoroute_all.cmd @@ -2,54 +2,52 @@ "done": [ { "Autoroute": [ - { - "selectors": [ - { - "pin": "J2-2", - "layer": "F.Cu" - }, - { - "pin": "J2-1", - "layer": "F.Cu" - }, - { - "pin": "D3-2", - "layer": "F.Cu" - }, - { - "pin": "D2-1", - "layer": "F.Cu" - }, - { - "pin": "D3-1", - "layer": "F.Cu" - }, - { - "pin": "D1-1", - "layer": "F.Cu" - }, - { - "pin": "J1-1", - "layer": "F.Cu" - }, - { - "pin": "D2-2", - "layer": "F.Cu" - }, - { - "pin": "D1-2", - "layer": "F.Cu" - }, - { - "pin": "D4-1", - "layer": "F.Cu" - }, - { - "pin": "J1-2", - "layer": "F.Cu" - } - ] - }, + [ + { + "pin": "J2-2", + "layer": "F.Cu" + }, + { + "pin": "J2-1", + "layer": "F.Cu" + }, + { + "pin": "D3-2", + "layer": "F.Cu" + }, + { + "pin": "D2-1", + "layer": "F.Cu" + }, + { + "pin": "D3-1", + "layer": "F.Cu" + }, + { + "pin": "D1-1", + "layer": "F.Cu" + }, + { + "pin": "J1-1", + "layer": "F.Cu" + }, + { + "pin": "D2-2", + "layer": "F.Cu" + }, + { + "pin": "D1-2", + "layer": "F.Cu" + }, + { + "pin": "D4-1", + "layer": "F.Cu" + }, + { + "pin": "J1-2", + "layer": "F.Cu" + } + ], { "presort_by_pairwise_detours": false, "router_options": { @@ -62,18 +60,16 @@ }, { "Autoroute": [ - { - "selectors": [ - { - "pin": "D4-2", - "layer": "F.Cu" - }, - { - "pin": "J2-2", - "layer": "F.Cu" - } - ] - }, + [ + { + "pin": "D4-2", + "layer": "F.Cu" + }, + { + "pin": "J2-2", + "layer": "F.Cu" + } + ], { "presort_by_pairwise_detours": false, "router_options": {