diff --git a/topola/src/layout/mod.rs b/topola/src/layout/mod.rs index a9b3cc8..539305b 100644 --- a/topola/src/layout/mod.rs +++ b/topola/src/layout/mod.rs @@ -9,6 +9,7 @@ mod infringement; mod insert; mod locate; mod modify; +mod overlap; pub mod primitives; mod transforms; diff --git a/topola/src/layout/overlap.rs b/topola/src/layout/overlap.rs new file mode 100644 index 0000000..2c640eb --- /dev/null +++ b/topola/src/layout/overlap.rs @@ -0,0 +1,187 @@ +// SPDX-FileCopyrightText: 2026 Topola contributors +// +// SPDX-License-Identifier: MIT OR Apache-2.0 + +use crate::{ + Rect2, + board::Board, + primitives::{JointId, PolygonId, SegmentId, ViaId}, +}; + +impl Board { + pub fn joint_joint_rect_overlap( + &self, + infringer: JointId, + infringee: JointId, + ) -> Option> { + let infringer_bbox = self.layout().joint(infringer).bbox().xy(); + let infringee_bbox = self.layout().joint(infringee).bbox().xy(); + + infringer_bbox.intersection(infringee_bbox) + } + + pub fn joint_segment_rect_overlap( + &self, + infringer: JointId, + infringee: SegmentId, + ) -> Option> { + let infringer_bbox = self.layout().joint(infringer).bbox().xy(); + let infringee_bbox = self.layout().segment(infringee).bbox().xy(); + + infringer_bbox.intersection(infringee_bbox) + } + + pub fn joint_via_rect_overlap( + &self, + infringer: JointId, + infringee: ViaId, + ) -> Option> { + let infringer_bbox = self.layout().joint(infringer).bbox().xy(); + let infringee_bbox = self.layout().via(infringee).bbox().xy(); + + infringer_bbox.intersection(infringee_bbox) + } + + pub fn joint_polygon_rect_overlap( + &self, + infringer: JointId, + infringee: PolygonId, + ) -> Option> { + let infringer_bbox = self.layout().joint(infringer).bbox().xy(); + let infringee_bbox = self.layout().polygon(infringee).bbox().xy(); + + infringer_bbox.intersection(infringee_bbox) + } + + pub fn segment_joint_rect_overlap( + &self, + infringer: SegmentId, + infringee: JointId, + ) -> Option> { + let infringer_bbox = self.layout().segment(infringer).bbox().xy(); + let infringee_bbox = self.layout().joint(infringee).bbox().xy(); + + infringer_bbox.intersection(infringee_bbox) + } + + pub fn segment_segment_rect_overlap( + &self, + infringer: SegmentId, + infringee: SegmentId, + ) -> Option> { + let infringer_bbox = self.layout().segment(infringer).bbox().xy(); + let infringee_bbox = self.layout().segment(infringee).bbox().xy(); + + infringer_bbox.intersection(infringee_bbox) + } + + pub fn segment_via_rect_overlap( + &self, + infringer: SegmentId, + infringee: ViaId, + ) -> Option> { + let infringer_bbox = self.layout().segment(infringer).bbox().xy(); + let infringee_bbox = self.layout().via(infringee).bbox().xy(); + + infringer_bbox.intersection(infringee_bbox) + } + + pub fn segment_polygon_rect_overlap( + &self, + infringer: SegmentId, + infringee: PolygonId, + ) -> Option> { + let infringer_bbox = self.layout().segment(infringer).bbox().xy(); + let infringee_bbox = self.layout().polygon(infringee).bbox().xy(); + + infringer_bbox.intersection(infringee_bbox) + } + + pub fn via_joint_rect_overlap( + &self, + infringer: ViaId, + infringee: JointId, + ) -> Option> { + let infringer_bbox = self.layout().via(infringer).bbox().xy(); + let infringee_bbox = self.layout().joint(infringee).bbox().xy(); + + infringer_bbox.intersection(infringee_bbox) + } + + pub fn via_segment_rect_overlap( + &self, + infringer: ViaId, + infringee: SegmentId, + ) -> Option> { + let infringer_bbox = self.layout().via(infringer).bbox().xy(); + let infringee_bbox = self.layout().segment(infringee).bbox().xy(); + + infringer_bbox.intersection(infringee_bbox) + } + + pub fn via_via_rect_overlap( + &self, + infringer: ViaId, + infringee: ViaId, + ) -> Option> { + let infringer_bbox = self.layout().via(infringer).bbox().xy(); + let infringee_bbox = self.layout().via(infringee).bbox().xy(); + + infringer_bbox.intersection(infringee_bbox) + } + + pub fn via_polygon_rect_overlap( + &self, + infringer: ViaId, + infringee: PolygonId, + ) -> Option> { + let infringer_bbox = self.layout().via(infringer).bbox().xy(); + let infringee_bbox = self.layout().polygon(infringee).bbox().xy(); + + infringer_bbox.intersection(infringee_bbox) + } + + pub fn polygon_joint_rect_overlap( + &self, + infringer: PolygonId, + infringee: JointId, + ) -> Option> { + let infringer_bbox = self.layout().polygon(infringer).bbox().xy(); + let infringee_bbox = self.layout().joint(infringee).bbox().xy(); + + infringer_bbox.intersection(infringee_bbox) + } + + pub fn polygon_segment_rect_overlap( + &self, + infringer: PolygonId, + infringee: SegmentId, + ) -> Option> { + let infringer_bbox = self.layout().polygon(infringer).bbox().xy(); + let infringee_bbox = self.layout().segment(infringee).bbox().xy(); + + infringer_bbox.intersection(infringee_bbox) + } + + pub fn polygon_via_rect_overlap( + &self, + infringer: PolygonId, + infringee: ViaId, + ) -> Option> { + let infringer_bbox = self.layout().polygon(infringer).bbox().xy(); + let infringee_bbox = self.layout().via(infringee).bbox().xy(); + + infringer_bbox.intersection(infringee_bbox) + } + + pub fn polygon_polygon_rect_overlap( + &self, + infringer: PolygonId, + infringee: PolygonId, + ) -> Option> { + let infringer_bbox = self.layout().polygon(infringer).bbox().xy(); + let infringee_bbox = self.layout().polygon(infringee).bbox().xy(); + + infringer_bbox.intersection(infringee_bbox) + } +}