From 4afd0d7e3d3544e7c02e7e856053ba6a1daa1109 Mon Sep 17 00:00:00 2001 From: Mikolaj Wielgus Date: Fri, 13 Mar 2026 19:46:02 +0100 Subject: [PATCH] Move primitives to new file and add enum to group them together --- topola/src/board.rs | 6 +- topola/src/layout.rs | 125 +--------------------------------- topola/src/lib.rs | 6 +- topola/src/navmesher.rs | 2 +- topola/src/primitives.rs | 142 +++++++++++++++++++++++++++++++++++++++ topola/src/specctra.rs | 3 +- 6 files changed, 152 insertions(+), 132 deletions(-) create mode 100644 topola/src/primitives.rs diff --git a/topola/src/board.rs b/topola/src/board.rs index de47c53..bd5cacf 100644 --- a/topola/src/board.rs +++ b/topola/src/board.rs @@ -6,9 +6,9 @@ use bimap::BiBTreeMap; use derive_getters::{Dissolve, Getters}; use undoredo::{ApplyDelta, Delta, FlushDelta}; -use crate::layout::{ - Joint, JointId, Layout, LayoutHalfDelta, NetId, PinId, Polygon, PolygonId, Segment, SegmentId, - Via, ViaId, +use crate::{ + layout::{Layout, LayoutHalfDelta, NetId, PinId}, + primitives::{Joint, JointId, Polygon, PolygonId, Segment, SegmentId, Via, ViaId}, }; #[derive(Clone, Debug, Getters)] diff --git a/topola/src/layout.rs b/topola/src/layout.rs index 50ac71b..7fc73cd 100644 --- a/topola/src/layout.rs +++ b/topola/src/layout.rs @@ -10,7 +10,7 @@ use serde::{Deserialize, Serialize}; use stable_vec::StableVec; use undoredo::{ApplyDelta, Delta, FlushDelta, Recorder}; -use crate::selection::PinSelector; +use crate::{Joint, JointId, Polygon, PolygonId, Segment, SegmentId, Via, ViaId}; #[derive( Clone, Constructor, Copy, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize, @@ -57,129 +57,6 @@ impl NetId { } } -#[derive( - Clone, Constructor, Copy, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize, -)] -pub struct JointId(usize); - -impl JointId { - /// Returns the underlying index. - #[inline] - pub fn id(self) -> usize { - self.0 - } -} - -#[derive(Clone, Copy, Debug)] -pub struct Joint { - pub position: [i64; 2], - pub layer: usize, - pub radius: u64, - pub net: NetId, - pub pin: Option, -} - -impl Joint { - pub fn pin_selector(&self) -> Option { - Some(PinSelector { - pin: self.pin?, - layer: self.layer, - }) - } -} - -#[derive( - Clone, Constructor, Copy, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize, -)] -pub struct SegmentId(usize); - -impl SegmentId { - /// Returns the underlying index. - #[inline] - pub fn id(self) -> usize { - self.0 - } -} - -#[derive(Clone, Copy, Debug)] -pub struct Segment { - pub endjoints: [JointId; 2], - pub layer: usize, - pub half_width: u64, - pub net: NetId, - pub pin: Option, -} - -impl Segment { - pub fn pin_selector(&self) -> Option { - Some(PinSelector { - pin: self.pin?, - layer: self.layer, - }) - } -} - -#[derive( - Clone, Constructor, Copy, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize, -)] -pub struct ViaId(usize); - -impl ViaId { - /// Returns the underlying index. - #[inline] - pub fn id(self) -> usize { - self.0 - } -} - -#[derive(Clone, Copy, Debug)] -pub struct Via { - pub endpoints: [JointId; 2], - pub layer: usize, // ??? This should be a range. - pub radius: u64, - pub net: NetId, - pub pin: Option, -} - -impl Via { - pub fn pin_selector(&self) -> Option { - Some(PinSelector { - pin: self.pin?, - layer: self.layer, - }) - } -} - -#[derive( - Clone, Constructor, Copy, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize, -)] -pub struct PolygonId(usize); - -impl PolygonId { - /// Returns the underlying index. - #[inline] - pub fn id(self) -> usize { - self.0 - } -} - -#[derive(Clone, Debug)] -pub struct Polygon { - pub vertices: Vec<[i64; 2]>, - pub layer: usize, - pub net: NetId, - pub pin: Option, -} - -impl Polygon { - pub fn pin_selector(&self) -> Option { - Some(PinSelector { - pin: self.pin?, - layer: self.layer, - }) - } -} - #[derive(Clone, Debug, Getters)] pub struct Layout { boundary: Vec<[i64; 2]>, diff --git a/topola/src/lib.rs b/topola/src/lib.rs index 2f73b3b..f4a5caf 100644 --- a/topola/src/lib.rs +++ b/topola/src/lib.rs @@ -6,11 +6,11 @@ mod board; mod layout; mod math; mod navmesher; +mod primitives; mod selection; mod specctra; pub use crate::board::Board; -pub use crate::layout::{ - Joint, JointId, Layout, Polygon, PolygonId, Segment, SegmentId, Via, ViaId, -}; +pub use crate::layout::Layout; pub use crate::navmesher::NavmesherBoard; +pub use crate::primitives::{Joint, JointId, Polygon, PolygonId, Segment, SegmentId, Via, ViaId}; diff --git a/topola/src/navmesher.rs b/topola/src/navmesher.rs index 4f0a079..eb7ba32 100644 --- a/topola/src/navmesher.rs +++ b/topola/src/navmesher.rs @@ -7,7 +7,7 @@ use derive_getters::Getters; use crate::{ Board, - layout::{Joint, JointId, Polygon, PolygonId, Segment, SegmentId, Via, ViaId}, + primitives::{Joint, JointId, Polygon, PolygonId, Segment, SegmentId, Via, ViaId}, }; #[derive(Clone, Debug, Getters)] diff --git a/topola/src/primitives.rs b/topola/src/primitives.rs new file mode 100644 index 0000000..76a21be --- /dev/null +++ b/topola/src/primitives.rs @@ -0,0 +1,142 @@ +// SPDX-FileCopyrightText: 2026 Topola contributors +// +// SPDX-License-Identifier: MIT OR Apache-2.0 + +use derive_more::{Constructor, From}; +use serde::{Deserialize, Serialize}; + +use crate::{ + layout::{NetId, PinId}, + selection::PinSelector, +}; + +#[derive(Clone, Copy, Debug, Deserialize, Eq, From, Ord, PartialEq, PartialOrd, Serialize)] +pub enum PrimitiveId { + Joint(JointId), + Segment(SegmentId), + Via(ViaId), + Polygon(PolygonId), +} + +#[derive( + Clone, Constructor, Copy, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize, +)] +pub struct JointId(usize); + +impl JointId { + /// Returns the underlying index. + #[inline] + pub fn id(self) -> usize { + self.0 + } +} + +#[derive(Clone, Copy, Debug)] +pub struct Joint { + pub position: [i64; 2], + pub layer: usize, + pub radius: u64, + pub net: NetId, + pub pin: Option, +} + +impl Joint { + pub fn pin_selector(&self) -> Option { + Some(PinSelector { + pin: self.pin?, + layer: self.layer, + }) + } +} + +#[derive( + Clone, Constructor, Copy, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize, +)] +pub struct SegmentId(usize); + +impl SegmentId { + /// Returns the underlying index. + #[inline] + pub fn id(self) -> usize { + self.0 + } +} + +#[derive(Clone, Copy, Debug)] +pub struct Segment { + pub endjoints: [JointId; 2], + pub layer: usize, + pub half_width: u64, + pub net: NetId, + pub pin: Option, +} + +impl Segment { + pub fn pin_selector(&self) -> Option { + Some(PinSelector { + pin: self.pin?, + layer: self.layer, + }) + } +} + +#[derive( + Clone, Constructor, Copy, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize, +)] +pub struct ViaId(usize); + +impl ViaId { + /// Returns the underlying index. + #[inline] + pub fn id(self) -> usize { + self.0 + } +} + +#[derive(Clone, Copy, Debug)] +pub struct Via { + pub endpoints: [JointId; 2], + pub layer: usize, // ??? This should be a range. + pub radius: u64, + pub net: NetId, + pub pin: Option, +} + +impl Via { + pub fn pin_selector(&self) -> Option { + Some(PinSelector { + pin: self.pin?, + layer: self.layer, + }) + } +} + +#[derive( + Clone, Constructor, Copy, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize, +)] +pub struct PolygonId(usize); + +impl PolygonId { + /// Returns the underlying index. + #[inline] + pub fn id(self) -> usize { + self.0 + } +} + +#[derive(Clone, Debug)] +pub struct Polygon { + pub vertices: Vec<[i64; 2]>, + pub layer: usize, + pub net: NetId, + pub pin: Option, +} + +impl Polygon { + pub fn pin_selector(&self) -> Option { + Some(PinSelector { + pin: self.pin?, + layer: self.layer, + }) + } +} diff --git a/topola/src/specctra.rs b/topola/src/specctra.rs index 4db1345..2e9be73 100644 --- a/topola/src/specctra.rs +++ b/topola/src/specctra.rs @@ -13,8 +13,9 @@ use specctra::{ use crate::{ Segment, board::Board, - layout::{Joint, NetId, PinId, Polygon}, + layout::{NetId, PinId}, math::Vector2, + primitives::{Joint, Polygon}, }; impl Board {