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/...)
This commit is contained in:
Alain Emilia Anna Zscheile 2024-12-06 20:48:23 +01:00 committed by mikolaj
parent 5a26c02b4e
commit 1fd61f773c
5 changed files with 327 additions and 365 deletions

View File

@ -16,32 +16,8 @@ pub struct PinSelector {
pub layer: String, pub layer: String,
} }
#[derive(Debug, Default, Clone, Serialize, Deserialize)] impl PinSelector {
pub struct PinSelection { pub fn try_from_node(
selectors: HashSet<PinSelector>,
}
impl PinSelection {
pub fn new() -> Self {
Self::default()
}
pub fn new_select_layer(board: &Board<impl AccessMesadata>, 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,
board: &Board<impl AccessMesadata>, board: &Board<impl AccessMesadata>,
node: NodeIndex, node: NodeIndex,
) -> Option<PinSelector> { ) -> Option<PinSelector> {
@ -74,22 +50,35 @@ impl PinSelection {
None None
} }
} }
}
fn select(&mut self, selector: PinSelector) { #[derive(Debug, Default, Clone, Serialize, Deserialize)]
self.selectors.insert(selector); pub struct PinSelection(HashSet<PinSelector>);
impl PinSelection {
pub fn new() -> Self {
Self::default()
} }
fn deselect(&mut self, selector: &PinSelector) { pub fn new_select_layer(board: &Board<impl AccessMesadata>, layer: usize) -> Self {
self.selectors.remove(selector); 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<impl AccessMesadata>, node: NodeIndex) -> bool { pub fn contains_node(&self, board: &Board<impl AccessMesadata>, node: NodeIndex) -> bool {
self.node_selector(board, node) PinSelector::try_from_node(board, node).map_or(false, |selector| self.0.contains(&selector))
.map_or(false, |selector| self.selectors.contains(&selector))
} }
pub fn selectors(&self) -> impl Iterator<Item = &PinSelector> { pub fn selectors(&self) -> impl Iterator<Item = &PinSelector> {
self.selectors.iter() self.0.iter()
} }
} }
@ -98,18 +87,8 @@ pub struct BandSelector {
pub band: BandName, pub band: BandName,
} }
#[derive(Debug, Default, Clone, Serialize, Deserialize)] impl BandSelector {
pub struct BandSelection { pub fn try_from_node(
selectors: HashSet<BandSelector>,
}
impl BandSelection {
pub fn new() -> Self {
Self::default()
}
fn node_selector(
&self,
board: &Board<impl AccessMesadata>, board: &Board<impl AccessMesadata>,
node: NodeIndex, node: NodeIndex,
) -> Option<BandSelector> { ) -> Option<BandSelector> {
@ -131,22 +110,23 @@ impl BandSelection {
.clone(), .clone(),
}) })
} }
}
fn select(&mut self, selector: BandSelector) { #[derive(Debug, Default, Clone, Serialize, Deserialize)]
self.selectors.insert(selector); pub struct BandSelection(HashSet<BandSelector>);
}
fn deselect(&mut self, selector: &BandSelector) { impl BandSelection {
self.selectors.remove(selector); pub fn new() -> Self {
Self::default()
} }
pub fn contains_node(&self, board: &Board<impl AccessMesadata>, node: NodeIndex) -> bool { pub fn contains_node(&self, board: &Board<impl AccessMesadata>, node: NodeIndex) -> bool {
self.node_selector(board, node) BandSelector::try_from_node(board, node)
.map_or(false, |selector| self.selectors.contains(&selector)) .map_or(false, |selector| self.0.contains(&selector))
} }
pub fn selectors(&self) -> impl Iterator<Item = &BandSelector> { pub fn selectors(&self) -> impl Iterator<Item = &BandSelector> {
self.selectors.iter() self.0.iter()
} }
} }
@ -162,17 +142,17 @@ impl Selection {
} }
pub fn toggle_at_node(&mut self, board: &Board<impl AccessMesadata>, node: NodeIndex) { pub fn toggle_at_node(&mut self, board: &Board<impl AccessMesadata>, node: NodeIndex) {
if let Some(selector) = self.pin_selection.node_selector(board, node) { if let Some(selector) = PinSelector::try_from_node(board, node) {
if self.pin_selection.contains_node(board, node) { if self.pin_selection.0.contains(&selector) {
self.pin_selection.deselect(&selector); self.pin_selection.0.remove(&selector);
} else { } else {
self.pin_selection.select(selector); self.pin_selection.0.insert(selector);
} }
} else if let Some(selector) = self.band_selection.node_selector(board, node) { } else if let Some(selector) = BandSelector::try_from_node(board, node) {
if self.band_selection.contains_node(board, node) { if self.band_selection.0.contains(&selector) {
self.band_selection.deselect(&selector); self.band_selection.0.remove(&selector);
} else { } else {
self.band_selection.select(selector); self.band_selection.0.insert(selector);
} }
} }
} }

View File

@ -2,8 +2,7 @@
"done": [ "done": [
{ {
"Autoroute": [ "Autoroute": [
{ [
"selectors": [
{ {
"pin": "R1-2", "pin": "R1-2",
"layer": "F.Cu" "layer": "F.Cu"
@ -12,8 +11,7 @@
"pin": "J1-2", "pin": "J1-2",
"layer": "F.Cu" "layer": "F.Cu"
} }
] ],
},
{ {
"presort_by_pairwise_detours": false, "presort_by_pairwise_detours": false,
"router_options": { "router_options": {
@ -26,8 +24,7 @@
}, },
{ {
"Autoroute": [ "Autoroute": [
{ [
"selectors": [
{ {
"pin": "J1-1", "pin": "J1-1",
"layer": "F.Cu" "layer": "F.Cu"
@ -36,8 +33,7 @@
"pin": "R1-1", "pin": "R1-1",
"layer": "F.Cu" "layer": "F.Cu"
} }
] ],
},
{ {
"presort_by_pairwise_detours": false, "presort_by_pairwise_detours": false,
"router_options": { "router_options": {

View File

@ -2,8 +2,7 @@
"done": [ "done": [
{ {
"Autoroute": [ "Autoroute": [
{ [
"selectors": [
{ {
"pin": "L3-1", "pin": "L3-1",
"layer": "F.Cu" "layer": "F.Cu"
@ -48,8 +47,7 @@
"pin": "L2-1", "pin": "L2-1",
"layer": "F.Cu" "layer": "F.Cu"
} }
] ],
},
{ {
"presort_by_pairwise_detours": false, "presort_by_pairwise_detours": false,
"router_options": { "router_options": {
@ -62,8 +60,7 @@
}, },
{ {
"Autoroute": [ "Autoroute": [
{ [
"selectors": [
{ {
"pin": "C6-1", "pin": "C6-1",
"layer": "F.Cu" "layer": "F.Cu"
@ -108,8 +105,7 @@
"pin": "L4-2", "pin": "L4-2",
"layer": "F.Cu" "layer": "F.Cu"
} }
] ],
},
{ {
"presort_by_pairwise_detours": false, "presort_by_pairwise_detours": false,
"router_options": { "router_options": {
@ -122,8 +118,7 @@
}, },
{ {
"Autoroute": [ "Autoroute": [
{ [
"selectors": [
{ {
"pin": "C9-1", "pin": "C9-1",
"layer": "F.Cu" "layer": "F.Cu"
@ -168,8 +163,7 @@
"pin": "C8-1", "pin": "C8-1",
"layer": "F.Cu" "layer": "F.Cu"
} }
] ],
},
{ {
"presort_by_pairwise_detours": false, "presort_by_pairwise_detours": false,
"router_options": { "router_options": {
@ -182,8 +176,7 @@
}, },
{ {
"Autoroute": [ "Autoroute": [
{ [
"selectors": [
{ {
"pin": "L10-1", "pin": "L10-1",
"layer": "F.Cu" "layer": "F.Cu"
@ -228,8 +221,7 @@
"pin": "J8-1", "pin": "J8-1",
"layer": "F.Cu" "layer": "F.Cu"
} }
] ],
},
{ {
"presort_by_pairwise_detours": false, "presort_by_pairwise_detours": false,
"router_options": { "router_options": {

View File

@ -2,8 +2,7 @@
"done": [ "done": [
{ {
"Autoroute": [ "Autoroute": [
{ [
"selectors": [
{ {
"pin": "J2-2", "pin": "J2-2",
"layer": "F.Cu" "layer": "F.Cu"
@ -28,8 +27,7 @@
"pin": "J1-1", "pin": "J1-1",
"layer": "F.Cu" "layer": "F.Cu"
} }
] ],
},
{ {
"presort_by_pairwise_detours": false, "presort_by_pairwise_detours": false,
"router_options": { "router_options": {

View File

@ -2,8 +2,7 @@
"done": [ "done": [
{ {
"Autoroute": [ "Autoroute": [
{ [
"selectors": [
{ {
"pin": "J2-2", "pin": "J2-2",
"layer": "F.Cu" "layer": "F.Cu"
@ -48,8 +47,7 @@
"pin": "J1-2", "pin": "J1-2",
"layer": "F.Cu" "layer": "F.Cu"
} }
] ],
},
{ {
"presort_by_pairwise_detours": false, "presort_by_pairwise_detours": false,
"router_options": { "router_options": {
@ -62,8 +60,7 @@
}, },
{ {
"Autoroute": [ "Autoroute": [
{ [
"selectors": [
{ {
"pin": "D4-2", "pin": "D4-2",
"layer": "F.Cu" "layer": "F.Cu"
@ -72,8 +69,7 @@
"pin": "J2-2", "pin": "J2-2",
"layer": "F.Cu" "layer": "F.Cu"
} }
] ],
},
{ {
"presort_by_pairwise_detours": false, "presort_by_pairwise_detours": false,
"router_options": { "router_options": {