From e92ee1d697c9e715481ae5ccb6eeb89cea30ea58 Mon Sep 17 00:00:00 2001 From: Mikolaj Wielgus Date: Sun, 7 Jun 2026 23:53:22 +0200 Subject: [PATCH] Partially encapsulate primitives by adding constructors --- topola/src/layout/insert.rs | 28 +++++-------- topola/src/layout/modify.rs | 25 +++++------ topola/src/layout/primitives/via.rs | 12 +++++- topola/src/navmesher.rs | 6 +-- topola/src/specctra.rs | 65 +++++++++++------------------ 5 files changed, 58 insertions(+), 78 deletions(-) diff --git a/topola/src/layout/insert.rs b/topola/src/layout/insert.rs index ae4540c..48a12ba 100644 --- a/topola/src/layout/insert.rs +++ b/topola/src/layout/insert.rs @@ -60,15 +60,11 @@ impl Layout { } pub fn insert_seg(&mut self, spec: SegSpec) -> SegId { - self.insert_seg_raw(Seg { - spec, - endpoints: [ - self.joint(spec.endjoints[0]).spec.position, - self.joint(spec.endjoints[1]).spec.position, - ], - layer: self.joint(spec.endjoints[0]).spec.layer, - net: self.joint(spec.endjoints[0]).spec.net, - }) + let endjoints = [ + &self.joints[spec.endjoints[0].index()], + &self.joints[spec.endjoints[1].index()], + ]; + self.insert_seg_raw(Seg::new(spec, endjoints)) } pub fn insert_seg_raw(&mut self, seg: Seg) -> SegId { @@ -104,15 +100,11 @@ impl Layout { } pub fn insert_via(&mut self, spec: ViaSpec) -> ViaId { - let joints = [self.joint(spec.endjoints[0]), self.joint(spec.endjoints[1])]; - - self.insert_via_raw(Via { - spec, - position: joints[0].spec.position, - min_layer: std::cmp::min(joints[0].spec.layer, joints[1].spec.layer), - max_layer: std::cmp::max(joints[0].spec.layer, joints[1].spec.layer), - net: joints[0].spec.net, - }) + let endjoints = [ + &self.joints[spec.endjoints[0].index()], + &self.joints[spec.endjoints[1].index()], + ]; + self.insert_via_raw(Via::new(spec, endjoints)) } pub fn insert_via_raw(&mut self, via: Via) -> ViaId { diff --git a/topola/src/layout/modify.rs b/topola/src/layout/modify.rs index b166913..81582f7 100644 --- a/topola/src/layout/modify.rs +++ b/topola/src/layout/modify.rs @@ -7,7 +7,7 @@ use rstar::primitives::GeomWithData; use crate::layout::{ Layout, primitives::{ - Joint, JointId, JointSpec, Poly, PolyId, SegId, SegSpec, ViaId, ViaSpec, + Joint, JointId, JointSpec, Poly, PolyId, Seg, SegId, SegSpec, Via, ViaId, ViaSpec, }, }; @@ -69,14 +69,13 @@ impl Layout { .remove(&GeomWithData::new(old_seg.bbox().rtree_rectangle(), id)); let endjoint_ids = old_seg.spec.endjoints; - let endjoint_specs = [ - self.joints[endjoint_ids[0].index()].spec, - self.joints[endjoint_ids[1].index()].spec, + let endjoints = [ + &self.joints[endjoint_ids[0].index()], + &self.joints[endjoint_ids[1].index()], ]; + let spec = old_seg.spec; self.segs.modify(id.index(), |seg| { - seg.endpoints = [endjoint_specs[0].position, endjoint_specs[1].position]; - seg.layer = endjoint_specs[0].layer; - seg.net = endjoint_specs[0].net; + *seg = Seg::new(spec, endjoints); }); let new_seg = &self.segs[id.index()]; @@ -107,15 +106,13 @@ impl Layout { .remove(&GeomWithData::new(old_via.bbox().rtree_rectangle(), id)); let endjoint_ids = old_via.spec.endjoints; - let endjoint_specs = [ - self.joints[endjoint_ids[0].index()].spec, - self.joints[endjoint_ids[1].index()].spec, + let endjoints = [ + &self.joints[endjoint_ids[0].index()], + &self.joints[endjoint_ids[1].index()], ]; + let spec = old_via.spec; self.vias.modify(id.index(), |via| { - via.position = endjoint_specs[0].position; - via.min_layer = std::cmp::min(endjoint_specs[0].layer, endjoint_specs[1].layer); - via.max_layer = std::cmp::max(endjoint_specs[0].layer, endjoint_specs[1].layer); - via.net = endjoint_specs[0].net; + *via = Via::new(spec, endjoints); }); let new_via = &self.vias[id.index()]; diff --git a/topola/src/layout/primitives/via.rs b/topola/src/layout/primitives/via.rs index aa5d7ed..ed09fe2 100644 --- a/topola/src/layout/primitives/via.rs +++ b/topola/src/layout/primitives/via.rs @@ -9,7 +9,7 @@ use crate::layout::compounds::{ComponentId, NetId, PinId}; use crate::vector::Vector2; use crate::{Rect3, Vector3, layout::LayerId}; -use super::JointId; +use super::{Joint, JointId}; #[derive( Clone, @@ -53,6 +53,16 @@ pub struct Via { } impl Via { + pub fn new(spec: ViaSpec, endjoints: [&Joint; 2]) -> Self { + Self { + spec, + position: endjoints[0].spec.position, + min_layer: std::cmp::min(endjoints[0].spec.layer, endjoints[1].spec.layer), + max_layer: std::cmp::max(endjoints[0].spec.layer, endjoints[1].spec.layer), + net: endjoints[0].spec.net, + } + } + pub fn contains_point2(&self, point: Vector2) -> bool { (point.x - self.position.x).pow(2) as u64 + (point.y - self.position.y).pow(2) as u64 <= self.spec.radius.pow(2) diff --git a/topola/src/navmesher.rs b/topola/src/navmesher.rs index e823098..63391f7 100644 --- a/topola/src/navmesher.rs +++ b/topola/src/navmesher.rs @@ -245,11 +245,7 @@ impl NavmesherBoard { pub fn insert_joint(&mut self, spec: JointSpec) -> JointId { let layer = spec.layer; - let obstacle = Self::joint_bounding_octagon(&Joint { - spec, - segs: Vec::new(), - vias: Vec::new(), - }); + let obstacle = Self::joint_bounding_octagon(&Joint::new(spec)); let joint_id = self.board.insert_joint(spec); self.joint_multiobstacles.insert( joint_id.index(), diff --git a/topola/src/specctra.rs b/topola/src/specctra.rs index eef326c..26ce799 100644 --- a/topola/src/specctra.rs +++ b/topola/src/specctra.rs @@ -12,7 +12,7 @@ use specctra::{ use crate::{ board::{Board, LayerDesc, LayerSide, LayerType}, - layout::primitives::{JointSpec, Poly, PolySpec, Seg, SegSpec}, + layout::primitives::{JointSpec, Poly, PolySpec, SegSpec}, layout::{ LayerId, compounds::{ComponentId, NetId, PinId, PinSpec}, @@ -383,23 +383,18 @@ impl Board { flip: bool, coordinate_scale: f64, ) { - board.insert_poly({ - let spec = PolySpec { - vertices: vec![ - Self::pos(place, pin_pos, x1, y1, flip, coordinate_scale), - Self::pos(place, pin_pos, x2, y1, flip, coordinate_scale), - Self::pos(place, pin_pos, x2, y2, flip, coordinate_scale), - Self::pos(place, pin_pos, x1, y2, flip, coordinate_scale), - ], - layer, - net, - component, - pin, - }; - let centroid = Vector2::::poly_centroid(&spec.vertices); - - Poly { spec, centroid } - }); + board.insert_poly(Poly::new(PolySpec { + vertices: vec![ + Self::pos(place, pin_pos, x1, y1, flip, coordinate_scale), + Self::pos(place, pin_pos, x2, y1, flip, coordinate_scale), + Self::pos(place, pin_pos, x2, y2, flip, coordinate_scale), + Self::pos(place, pin_pos, x1, y2, flip, coordinate_scale), + ], + layer, + net, + component, + pin, + })); } fn place_path( @@ -448,16 +443,11 @@ impl Board { pin, }); - let _ = board.insert_seg_raw(Seg { - spec: SegSpec { - endjoints: [prev_joint, joint], - half_width: Self::scale_size(width / 2.0, coordinate_scale), - component, - pin, - }, - endpoints: [prev_pos, pos], - layer, - net, + let _ = board.insert_seg(SegSpec { + endjoints: [prev_joint, joint], + half_width: Self::scale_size(width / 2.0, coordinate_scale), + component, + pin, }); prev_pos = pos; @@ -482,18 +472,13 @@ impl Board { .iter() .map(|coord| Self::pos(place, pin_pos, coord.x, coord.y, flip, coordinate_scale)) .collect(); - board.insert_poly({ - let spec = PolySpec { - vertices, - layer, - net, - component, - pin, - }; - let centroid = Vector2::::poly_centroid(&spec.vertices); - - Poly { spec, centroid } - }); + board.insert_poly(Poly::new(PolySpec { + vertices, + layer, + net, + component, + pin, + })); } fn layer(_board: &Board, layers: &[Layer], name: &str, front: bool) -> LayerId {