Add method to locate all component-component repulsions for given component

This commit is contained in:
Mikolaj Wielgus 2026-06-03 00:19:25 +02:00
parent b3dc4089a4
commit 6cebbb2816
3 changed files with 158 additions and 128 deletions

View File

@ -4,7 +4,6 @@
use std::collections::BTreeSet; use std::collections::BTreeSet;
use derive_getters::Getters;
use derive_more::Constructor; use derive_more::Constructor;
use rstar::{ use rstar::{
AABB, RTree, AABB, RTree,
@ -12,18 +11,28 @@ use rstar::{
}; };
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::board::Board;
use crate::primitives::PrimitiveId; use crate::primitives::PrimitiveId;
use super::Layout;
use super::compounds::{ComponentId, NetId}; use super::compounds::{ComponentId, NetId};
use super::primitives::{JointId, PolygonId, SegmentId, ViaId}; use super::primitives::{JointId, PolygonId, SegmentId, ViaId};
#[derive( #[derive(
Clone, Copy, Constructor, Debug, Deserialize, Eq, Getters, Ord, PartialEq, PartialOrd, Serialize, Clone, Copy, Constructor, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize,
)] )]
pub struct Infringement<I = PrimitiveId, E = PrimitiveId> { pub struct Infringement<T = PrimitiveId, U = PrimitiveId> {
infringer: I, infringer: T,
infringee: E, infringee: U,
}
impl<T: Copy, U: Copy> Infringement<T, U> {
pub fn infringer(&self) -> T {
self.infringer
}
pub fn infringee(&self) -> U {
self.infringee
}
} }
mod sealed { mod sealed {
@ -39,12 +48,12 @@ mod sealed {
impl IntoPrimitiveId for PolygonId {} impl IntoPrimitiveId for PolygonId {}
} }
impl<I: sealed::IntoPrimitiveId, E: sealed::IntoPrimitiveId> From<Infringement<I, E>> impl<T: sealed::IntoPrimitiveId, U: sealed::IntoPrimitiveId> From<Infringement<T, U>>
for Infringement<I, PrimitiveId> for Infringement<T, PrimitiveId>
where where
E: sealed::IntoPrimitiveId, U: sealed::IntoPrimitiveId,
{ {
fn from(from: Infringement<I, E>) -> Self { fn from(from: Infringement<T, U>) -> Self {
Infringement { Infringement {
infringer: from.infringer, infringer: from.infringer,
infringee: from.infringee.into(), infringee: from.infringee.into(),
@ -52,10 +61,10 @@ where
} }
} }
impl<I: sealed::IntoPrimitiveId, E: sealed::IntoPrimitiveId> From<Infringement<I, E>> impl<T: sealed::IntoPrimitiveId, U: sealed::IntoPrimitiveId> From<Infringement<T, U>>
for Infringement for Infringement
{ {
fn from(from: Infringement<I, E>) -> Self { fn from(from: Infringement<T, U>) -> Self {
Infringement { Infringement {
infringer: from.infringer.into(), infringer: from.infringer.into(),
infringee: from.infringee.into(), infringee: from.infringee.into(),
@ -63,8 +72,8 @@ impl<I: sealed::IntoPrimitiveId, E: sealed::IntoPrimitiveId> From<Infringement<I
} }
} }
impl<I: sealed::IntoPrimitiveId> From<Infringement<I, PrimitiveId>> for Infringement { impl<T: sealed::IntoPrimitiveId> From<Infringement<T, PrimitiveId>> for Infringement {
fn from(from: Infringement<I, PrimitiveId>) -> Self { fn from(from: Infringement<T, PrimitiveId>) -> Self {
Infringement { Infringement {
infringer: from.infringer.into(), infringer: from.infringer.into(),
infringee: from.infringee, infringee: from.infringee,
@ -72,15 +81,16 @@ impl<I: sealed::IntoPrimitiveId> From<Infringement<I, PrimitiveId>> for Infringe
} }
} }
impl Board { impl Layout {
pub fn locate_component_component_infringements( pub fn locate_component_infringements(
&self, &self,
infringer: ComponentId, infringer: ComponentId,
) -> impl Iterator<Item = Infringement<ComponentId, ComponentId>> + '_ { ) -> impl Iterator<Item = Infringement<ComponentId, ComponentId>> + '_ {
let mut infringee_components = BTreeSet::new(); let mut infringee_components = BTreeSet::new();
for infringement in self.locate_component_primitive_infringements(infringer) { for infringement in self.locate_component_primitive_infringements(infringer) {
let Some(infringee_component) = self.primitive_component(*infringement.infringee()) else { let Some(infringee_component) = self.primitive_component(infringement.infringee())
else {
continue; continue;
}; };
@ -93,14 +103,17 @@ impl Board {
infringee_components infringee_components
.into_iter() .into_iter()
.map(move |infringee| Infringement::new(infringer, infringee)) .map(move |infringee| Infringement {
infringer,
infringee,
})
} }
pub fn locate_component_primitive_infringements( pub fn locate_component_primitive_infringements(
&self, &self,
infringer: ComponentId, infringer: ComponentId,
) -> impl Iterator<Item = Infringement> + '_ { ) -> impl Iterator<Item = Infringement> + '_ {
let component = self.layout().component(infringer); let component = self.component(infringer);
let joint_infringements = component let joint_infringements = component
.joints .joints
@ -151,28 +164,28 @@ impl Board {
&self, &self,
infringer: JointId, infringer: JointId,
) -> impl Iterator<Item = Infringement<JointId, JointId>> + '_ { ) -> impl Iterator<Item = Infringement<JointId, JointId>> + '_ {
self.locate_same_infringements(infringer, self.layout().joints_rtree().as_ref()) self.locate_same_infringements(infringer, self.joints_rtree().as_ref())
} }
pub fn locate_joint_segment_infringements( pub fn locate_joint_segment_infringements(
&self, &self,
infringer: JointId, infringer: JointId,
) -> impl Iterator<Item = Infringement<JointId, SegmentId>> + '_ { ) -> impl Iterator<Item = Infringement<JointId, SegmentId>> + '_ {
self.locate_cross_infringements(infringer, self.layout().segments_rtree().as_ref()) self.locate_cross_infringements(infringer, self.segments_rtree().as_ref())
} }
pub fn locate_joint_via_infringements( pub fn locate_joint_via_infringements(
&self, &self,
infringer: JointId, infringer: JointId,
) -> impl Iterator<Item = Infringement<JointId, ViaId>> + '_ { ) -> impl Iterator<Item = Infringement<JointId, ViaId>> + '_ {
self.locate_cross_infringements(infringer, self.layout().vias_rtree().as_ref()) self.locate_cross_infringements(infringer, self.vias_rtree().as_ref())
} }
pub fn locate_joint_polygon_infringements( pub fn locate_joint_polygon_infringements(
&self, &self,
infringer: JointId, infringer: JointId,
) -> impl Iterator<Item = Infringement<JointId, PolygonId>> + '_ { ) -> impl Iterator<Item = Infringement<JointId, PolygonId>> + '_ {
self.locate_cross_infringements(infringer, self.layout().polygons_rtree().as_ref()) self.locate_cross_infringements(infringer, self.polygons_rtree().as_ref())
} }
pub fn locate_segment_infringements( pub fn locate_segment_infringements(
@ -199,28 +212,28 @@ impl Board {
&self, &self,
infringer: SegmentId, infringer: SegmentId,
) -> impl Iterator<Item = Infringement<SegmentId, JointId>> + '_ { ) -> impl Iterator<Item = Infringement<SegmentId, JointId>> + '_ {
self.locate_cross_infringements(infringer, self.layout().joints_rtree().as_ref()) self.locate_cross_infringements(infringer, self.joints_rtree().as_ref())
} }
pub fn locate_segment_segment_infringements( pub fn locate_segment_segment_infringements(
&self, &self,
infringer: SegmentId, infringer: SegmentId,
) -> impl Iterator<Item = Infringement<SegmentId, SegmentId>> + '_ { ) -> impl Iterator<Item = Infringement<SegmentId, SegmentId>> + '_ {
self.locate_same_infringements(infringer, self.layout().segments_rtree().as_ref()) self.locate_same_infringements(infringer, self.segments_rtree().as_ref())
} }
pub fn locate_segment_via_infringements( pub fn locate_segment_via_infringements(
&self, &self,
infringer: SegmentId, infringer: SegmentId,
) -> impl Iterator<Item = Infringement<SegmentId, ViaId>> + '_ { ) -> impl Iterator<Item = Infringement<SegmentId, ViaId>> + '_ {
self.locate_cross_infringements(infringer, self.layout().vias_rtree().as_ref()) self.locate_cross_infringements(infringer, self.vias_rtree().as_ref())
} }
pub fn locate_segment_polygon_infringements( pub fn locate_segment_polygon_infringements(
&self, &self,
infringer: SegmentId, infringer: SegmentId,
) -> impl Iterator<Item = Infringement<SegmentId, PolygonId>> + '_ { ) -> impl Iterator<Item = Infringement<SegmentId, PolygonId>> + '_ {
self.locate_cross_infringements(infringer, self.layout().polygons_rtree().as_ref()) self.locate_cross_infringements(infringer, self.polygons_rtree().as_ref())
} }
pub fn locate_via_infringements( pub fn locate_via_infringements(
@ -244,28 +257,28 @@ impl Board {
&self, &self,
infringer: ViaId, infringer: ViaId,
) -> impl Iterator<Item = Infringement<ViaId, JointId>> + '_ { ) -> impl Iterator<Item = Infringement<ViaId, JointId>> + '_ {
self.locate_cross_infringements(infringer, self.layout().joints_rtree().as_ref()) self.locate_cross_infringements(infringer, self.joints_rtree().as_ref())
} }
pub fn locate_via_segment_infringements( pub fn locate_via_segment_infringements(
&self, &self,
infringer: ViaId, infringer: ViaId,
) -> impl Iterator<Item = Infringement<ViaId, SegmentId>> + '_ { ) -> impl Iterator<Item = Infringement<ViaId, SegmentId>> + '_ {
self.locate_cross_infringements(infringer, self.layout().segments_rtree().as_ref()) self.locate_cross_infringements(infringer, self.segments_rtree().as_ref())
} }
pub fn locate_via_via_infringements( pub fn locate_via_via_infringements(
&self, &self,
infringer: ViaId, infringer: ViaId,
) -> impl Iterator<Item = Infringement<ViaId, ViaId>> + '_ { ) -> impl Iterator<Item = Infringement<ViaId, ViaId>> + '_ {
self.locate_same_infringements(infringer, self.layout().vias_rtree().as_ref()) self.locate_same_infringements(infringer, self.vias_rtree().as_ref())
} }
pub fn locate_via_polygon_infringements( pub fn locate_via_polygon_infringements(
&self, &self,
infringer: ViaId, infringer: ViaId,
) -> impl Iterator<Item = Infringement<ViaId, PolygonId>> + '_ { ) -> impl Iterator<Item = Infringement<ViaId, PolygonId>> + '_ {
self.locate_cross_infringements(infringer, self.layout().polygons_rtree().as_ref()) self.locate_cross_infringements(infringer, self.polygons_rtree().as_ref())
} }
pub fn locate_polygon_infringements( pub fn locate_polygon_infringements(
@ -292,39 +305,39 @@ impl Board {
&self, &self,
infringer: PolygonId, infringer: PolygonId,
) -> impl Iterator<Item = Infringement<PolygonId, JointId>> + '_ { ) -> impl Iterator<Item = Infringement<PolygonId, JointId>> + '_ {
self.locate_cross_infringements(infringer, self.layout().joints_rtree().as_ref()) self.locate_cross_infringements(infringer, self.joints_rtree().as_ref())
} }
pub fn locate_polygon_segment_infringements( pub fn locate_polygon_segment_infringements(
&self, &self,
infringer: PolygonId, infringer: PolygonId,
) -> impl Iterator<Item = Infringement<PolygonId, SegmentId>> + '_ { ) -> impl Iterator<Item = Infringement<PolygonId, SegmentId>> + '_ {
self.locate_cross_infringements(infringer, self.layout().segments_rtree().as_ref()) self.locate_cross_infringements(infringer, self.segments_rtree().as_ref())
} }
pub fn locate_polygon_via_infringements( pub fn locate_polygon_via_infringements(
&self, &self,
infringer: PolygonId, infringer: PolygonId,
) -> impl Iterator<Item = Infringement<PolygonId, ViaId>> + '_ { ) -> impl Iterator<Item = Infringement<PolygonId, ViaId>> + '_ {
self.locate_cross_infringements(infringer, self.layout().vias_rtree().as_ref()) self.locate_cross_infringements(infringer, self.vias_rtree().as_ref())
} }
pub fn locate_polygon_polygon_infringements( pub fn locate_polygon_polygon_infringements(
&self, &self,
infringer: PolygonId, infringer: PolygonId,
) -> impl Iterator<Item = Infringement<PolygonId, PolygonId>> + '_ { ) -> impl Iterator<Item = Infringement<PolygonId, PolygonId>> + '_ {
self.locate_same_infringements(infringer, self.layout().polygons_rtree().as_ref()) self.locate_same_infringements(infringer, self.polygons_rtree().as_ref())
} }
fn locate_cross_infringements< fn locate_cross_infringements<
'a, 'a,
I: Copy + Into<PrimitiveId> + 'a, T: Copy + Into<PrimitiveId> + 'a,
E: Copy + Into<PrimitiveId>, U: Copy + Into<PrimitiveId>,
>( >(
&'a self, &'a self,
infringer: I, infringer: T,
infringee_tree: &'a RTree<GeomWithData<Rectangle<[i64; 3]>, E>>, infringee_tree: &'a RTree<GeomWithData<Rectangle<[i64; 3]>, U>>,
) -> impl Iterator<Item = Infringement<I, E>> + 'a { ) -> impl Iterator<Item = Infringement<T, U>> + 'a {
infringee_tree infringee_tree
.locate_in_envelope_intersecting(&self.primitive_bbox_envelope(infringer.into())) .locate_in_envelope_intersecting(&self.primitive_bbox_envelope(infringer.into()))
.map(|infringee_geom| infringee_geom.data) .map(|infringee_geom| infringee_geom.data)
@ -340,11 +353,11 @@ impl Board {
}) })
} }
fn locate_same_infringements<'a, I: Copy + PartialEq + Into<PrimitiveId> + 'a>( fn locate_same_infringements<'a, T: Copy + PartialEq + Into<PrimitiveId> + 'a>(
&'a self, &'a self,
infringer: I, infringer: T,
rtree: &'a RTree<GeomWithData<Rectangle<[i64; 3]>, I>>, rtree: &'a RTree<GeomWithData<Rectangle<[i64; 3]>, T>>,
) -> impl Iterator<Item = Infringement<I, I>> + 'a { ) -> impl Iterator<Item = Infringement<T, T>> + 'a {
rtree rtree
.locate_in_envelope_intersecting(&self.primitive_bbox_envelope(infringer.into())) .locate_in_envelope_intersecting(&self.primitive_bbox_envelope(infringer.into()))
.map(|infringee_geom| infringee_geom.data) .map(|infringee_geom| infringee_geom.data)
@ -363,28 +376,28 @@ impl Board {
fn primitive_component(&self, primitive: PrimitiveId) -> Option<ComponentId> { fn primitive_component(&self, primitive: PrimitiveId) -> Option<ComponentId> {
match primitive { match primitive {
PrimitiveId::Joint(joint_id) => self.layout().joint(joint_id).spec.component, PrimitiveId::Joint(joint_id) => self.joint(joint_id).spec.component,
PrimitiveId::Segment(segment_id) => self.layout().segment(segment_id).spec.component, PrimitiveId::Segment(segment_id) => self.segment(segment_id).spec.component,
PrimitiveId::Via(via_id) => self.layout().via(via_id).spec.component, PrimitiveId::Via(via_id) => self.via(via_id).spec.component,
PrimitiveId::Polygon(polygon_id) => self.layout().polygon(polygon_id).component, PrimitiveId::Polygon(polygon_id) => self.polygon(polygon_id).component,
} }
} }
fn primitive_bbox_envelope(&self, primitive: PrimitiveId) -> AABB<[i64; 3]> { fn primitive_bbox_envelope(&self, primitive: PrimitiveId) -> AABB<[i64; 3]> {
match primitive { match primitive {
PrimitiveId::Joint(joint_id) => self.layout().joint(joint_id).bbox().aabb(), PrimitiveId::Joint(joint_id) => self.joint(joint_id).bbox().aabb(),
PrimitiveId::Segment(segment_id) => self.layout().segment(segment_id).bbox().aabb(), PrimitiveId::Segment(segment_id) => self.segment(segment_id).bbox().aabb(),
PrimitiveId::Via(via_id) => self.layout().via(via_id).bbox().aabb(), PrimitiveId::Via(via_id) => self.via(via_id).bbox().aabb(),
PrimitiveId::Polygon(polygon_id) => self.layout().polygon(polygon_id).bbox().aabb(), PrimitiveId::Polygon(polygon_id) => self.polygon(polygon_id).bbox().aabb(),
} }
} }
fn primitive_net(&self, primitive: PrimitiveId) -> Option<NetId> { fn primitive_net(&self, primitive: PrimitiveId) -> Option<NetId> {
match primitive { match primitive {
PrimitiveId::Joint(joint_id) => self.layout().joint(joint_id).spec.net, PrimitiveId::Joint(joint_id) => self.joint(joint_id).spec.net,
PrimitiveId::Segment(segment_id) => self.layout().segment(segment_id).net, PrimitiveId::Segment(segment_id) => self.segment(segment_id).net,
PrimitiveId::Via(via_id) => self.layout().via(via_id).net, PrimitiveId::Via(via_id) => self.via(via_id).net,
PrimitiveId::Polygon(polygon_id) => self.layout().polygon(polygon_id).net, PrimitiveId::Polygon(polygon_id) => self.polygon(polygon_id).net,
} }
} }

View File

@ -4,18 +4,20 @@
use crate::{ use crate::{
Rect2, Rect2,
board::Board, layout::{
primitives::{JointId, PolygonId, SegmentId, ViaId}, Layout,
primitives::{JointId, PolygonId, SegmentId, ViaId},
},
}; };
impl Board { impl Layout {
pub fn joint_joint_rect_overlap( pub fn joint_joint_rect_overlap(
&self, &self,
infringer: JointId, infringer: JointId,
infringee: JointId, infringee: JointId,
) -> Option<Rect2<i64>> { ) -> Option<Rect2<i64>> {
let infringer_bbox = self.layout().joint(infringer).bbox().xy(); let infringer_bbox = self.joint(infringer).bbox().xy();
let infringee_bbox = self.layout().joint(infringee).bbox().xy(); let infringee_bbox = self.joint(infringee).bbox().xy();
infringer_bbox.intersection(infringee_bbox) infringer_bbox.intersection(infringee_bbox)
} }
@ -25,8 +27,8 @@ impl Board {
infringer: JointId, infringer: JointId,
infringee: SegmentId, infringee: SegmentId,
) -> Option<Rect2<i64>> { ) -> Option<Rect2<i64>> {
let infringer_bbox = self.layout().joint(infringer).bbox().xy(); let infringer_bbox = self.joint(infringer).bbox().xy();
let infringee_bbox = self.layout().segment(infringee).bbox().xy(); let infringee_bbox = self.segment(infringee).bbox().xy();
infringer_bbox.intersection(infringee_bbox) infringer_bbox.intersection(infringee_bbox)
} }
@ -36,8 +38,8 @@ impl Board {
infringer: JointId, infringer: JointId,
infringee: ViaId, infringee: ViaId,
) -> Option<Rect2<i64>> { ) -> Option<Rect2<i64>> {
let infringer_bbox = self.layout().joint(infringer).bbox().xy(); let infringer_bbox = self.joint(infringer).bbox().xy();
let infringee_bbox = self.layout().via(infringee).bbox().xy(); let infringee_bbox = self.via(infringee).bbox().xy();
infringer_bbox.intersection(infringee_bbox) infringer_bbox.intersection(infringee_bbox)
} }
@ -47,8 +49,8 @@ impl Board {
infringer: JointId, infringer: JointId,
infringee: PolygonId, infringee: PolygonId,
) -> Option<Rect2<i64>> { ) -> Option<Rect2<i64>> {
let infringer_bbox = self.layout().joint(infringer).bbox().xy(); let infringer_bbox = self.joint(infringer).bbox().xy();
let infringee_bbox = self.layout().polygon(infringee).bbox().xy(); let infringee_bbox = self.polygon(infringee).bbox().xy();
infringer_bbox.intersection(infringee_bbox) infringer_bbox.intersection(infringee_bbox)
} }
@ -58,8 +60,8 @@ impl Board {
infringer: SegmentId, infringer: SegmentId,
infringee: JointId, infringee: JointId,
) -> Option<Rect2<i64>> { ) -> Option<Rect2<i64>> {
let infringer_bbox = self.layout().segment(infringer).bbox().xy(); let infringer_bbox = self.segment(infringer).bbox().xy();
let infringee_bbox = self.layout().joint(infringee).bbox().xy(); let infringee_bbox = self.joint(infringee).bbox().xy();
infringer_bbox.intersection(infringee_bbox) infringer_bbox.intersection(infringee_bbox)
} }
@ -69,8 +71,8 @@ impl Board {
infringer: SegmentId, infringer: SegmentId,
infringee: SegmentId, infringee: SegmentId,
) -> Option<Rect2<i64>> { ) -> Option<Rect2<i64>> {
let infringer_bbox = self.layout().segment(infringer).bbox().xy(); let infringer_bbox = self.segment(infringer).bbox().xy();
let infringee_bbox = self.layout().segment(infringee).bbox().xy(); let infringee_bbox = self.segment(infringee).bbox().xy();
infringer_bbox.intersection(infringee_bbox) infringer_bbox.intersection(infringee_bbox)
} }
@ -80,8 +82,8 @@ impl Board {
infringer: SegmentId, infringer: SegmentId,
infringee: ViaId, infringee: ViaId,
) -> Option<Rect2<i64>> { ) -> Option<Rect2<i64>> {
let infringer_bbox = self.layout().segment(infringer).bbox().xy(); let infringer_bbox = self.segment(infringer).bbox().xy();
let infringee_bbox = self.layout().via(infringee).bbox().xy(); let infringee_bbox = self.via(infringee).bbox().xy();
infringer_bbox.intersection(infringee_bbox) infringer_bbox.intersection(infringee_bbox)
} }
@ -91,8 +93,8 @@ impl Board {
infringer: SegmentId, infringer: SegmentId,
infringee: PolygonId, infringee: PolygonId,
) -> Option<Rect2<i64>> { ) -> Option<Rect2<i64>> {
let infringer_bbox = self.layout().segment(infringer).bbox().xy(); let infringer_bbox = self.segment(infringer).bbox().xy();
let infringee_bbox = self.layout().polygon(infringee).bbox().xy(); let infringee_bbox = self.polygon(infringee).bbox().xy();
infringer_bbox.intersection(infringee_bbox) infringer_bbox.intersection(infringee_bbox)
} }
@ -102,8 +104,8 @@ impl Board {
infringer: ViaId, infringer: ViaId,
infringee: JointId, infringee: JointId,
) -> Option<Rect2<i64>> { ) -> Option<Rect2<i64>> {
let infringer_bbox = self.layout().via(infringer).bbox().xy(); let infringer_bbox = self.via(infringer).bbox().xy();
let infringee_bbox = self.layout().joint(infringee).bbox().xy(); let infringee_bbox = self.joint(infringee).bbox().xy();
infringer_bbox.intersection(infringee_bbox) infringer_bbox.intersection(infringee_bbox)
} }
@ -113,8 +115,8 @@ impl Board {
infringer: ViaId, infringer: ViaId,
infringee: SegmentId, infringee: SegmentId,
) -> Option<Rect2<i64>> { ) -> Option<Rect2<i64>> {
let infringer_bbox = self.layout().via(infringer).bbox().xy(); let infringer_bbox = self.via(infringer).bbox().xy();
let infringee_bbox = self.layout().segment(infringee).bbox().xy(); let infringee_bbox = self.segment(infringee).bbox().xy();
infringer_bbox.intersection(infringee_bbox) infringer_bbox.intersection(infringee_bbox)
} }
@ -124,8 +126,8 @@ impl Board {
infringer: ViaId, infringer: ViaId,
infringee: ViaId, infringee: ViaId,
) -> Option<Rect2<i64>> { ) -> Option<Rect2<i64>> {
let infringer_bbox = self.layout().via(infringer).bbox().xy(); let infringer_bbox = self.via(infringer).bbox().xy();
let infringee_bbox = self.layout().via(infringee).bbox().xy(); let infringee_bbox = self.via(infringee).bbox().xy();
infringer_bbox.intersection(infringee_bbox) infringer_bbox.intersection(infringee_bbox)
} }
@ -135,8 +137,8 @@ impl Board {
infringer: ViaId, infringer: ViaId,
infringee: PolygonId, infringee: PolygonId,
) -> Option<Rect2<i64>> { ) -> Option<Rect2<i64>> {
let infringer_bbox = self.layout().via(infringer).bbox().xy(); let infringer_bbox = self.via(infringer).bbox().xy();
let infringee_bbox = self.layout().polygon(infringee).bbox().xy(); let infringee_bbox = self.polygon(infringee).bbox().xy();
infringer_bbox.intersection(infringee_bbox) infringer_bbox.intersection(infringee_bbox)
} }
@ -146,8 +148,8 @@ impl Board {
infringer: PolygonId, infringer: PolygonId,
infringee: JointId, infringee: JointId,
) -> Option<Rect2<i64>> { ) -> Option<Rect2<i64>> {
let infringer_bbox = self.layout().polygon(infringer).bbox().xy(); let infringer_bbox = self.polygon(infringer).bbox().xy();
let infringee_bbox = self.layout().joint(infringee).bbox().xy(); let infringee_bbox = self.joint(infringee).bbox().xy();
infringer_bbox.intersection(infringee_bbox) infringer_bbox.intersection(infringee_bbox)
} }
@ -157,8 +159,8 @@ impl Board {
infringer: PolygonId, infringer: PolygonId,
infringee: SegmentId, infringee: SegmentId,
) -> Option<Rect2<i64>> { ) -> Option<Rect2<i64>> {
let infringer_bbox = self.layout().polygon(infringer).bbox().xy(); let infringer_bbox = self.polygon(infringer).bbox().xy();
let infringee_bbox = self.layout().segment(infringee).bbox().xy(); let infringee_bbox = self.segment(infringee).bbox().xy();
infringer_bbox.intersection(infringee_bbox) infringer_bbox.intersection(infringee_bbox)
} }
@ -168,8 +170,8 @@ impl Board {
infringer: PolygonId, infringer: PolygonId,
infringee: ViaId, infringee: ViaId,
) -> Option<Rect2<i64>> { ) -> Option<Rect2<i64>> {
let infringer_bbox = self.layout().polygon(infringer).bbox().xy(); let infringer_bbox = self.polygon(infringer).bbox().xy();
let infringee_bbox = self.layout().via(infringee).bbox().xy(); let infringee_bbox = self.via(infringee).bbox().xy();
infringer_bbox.intersection(infringee_bbox) infringer_bbox.intersection(infringee_bbox)
} }
@ -179,8 +181,8 @@ impl Board {
infringer: PolygonId, infringer: PolygonId,
infringee: PolygonId, infringee: PolygonId,
) -> Option<Rect2<i64>> { ) -> Option<Rect2<i64>> {
let infringer_bbox = self.layout().polygon(infringer).bbox().xy(); let infringer_bbox = self.polygon(infringer).bbox().xy();
let infringee_bbox = self.layout().polygon(infringee).bbox().xy(); let infringee_bbox = self.polygon(infringee).bbox().xy();
infringer_bbox.intersection(infringee_bbox) infringer_bbox.intersection(infringee_bbox)
} }

View File

@ -3,14 +3,29 @@
// SPDX-License-Identifier: MIT OR Apache-2.0 // SPDX-License-Identifier: MIT OR Apache-2.0
use crate::{ use crate::{
Board, Rect2, Vector2, Rect2, Vector2,
compass::CompassDirection, compass::CompassDirection,
layout::compounds::ComponentId, layout::{Layout, compounds::ComponentId},
orientation::Orientation, orientation::Orientation,
primitives::{JointId, PolygonId, PrimitiveId, SegmentId, ViaId}, primitives::{JointId, PolygonId, PrimitiveId, SegmentId, ViaId},
}; };
impl Board { impl Layout {
pub fn locate_component_repulsions(
&self,
infringer: ComponentId,
orientation: Orientation,
) -> impl Iterator<Item = Vector2<i64>> {
self.locate_component_infringements(infringer)
.map(move |infringement| {
self.component_component_repulsion(
infringement.infringer(),
infringement.infringee(),
orientation,
)
})
}
pub fn component_component_repulsion( pub fn component_component_repulsion(
&self, &self,
infringer: ComponentId, infringer: ComponentId,
@ -20,8 +35,8 @@ impl Board {
let mut max_repulsion = Vector2::new(0, 0); let mut max_repulsion = Vector2::new(0, 0);
let mut max_repulsion_magnitude = 0; let mut max_repulsion_magnitude = 0;
for infringer_primitive in self.layout().component(infringer).primitives() { for infringer_primitive in self.component(infringer).primitives() {
for infringee_primitive in self.layout().component(infringee).primitives() { for infringee_primitive in self.component(infringee).primitives() {
let repulsion = self.primitive_primitive_repulsion( let repulsion = self.primitive_primitive_repulsion(
infringer_primitive, infringer_primitive,
infringee_primitive, infringee_primitive,
@ -69,8 +84,8 @@ impl Board {
) -> Vector2<i64> { ) -> Vector2<i64> {
Self::repulsion_from_rect_overlap( Self::repulsion_from_rect_overlap(
self.joint_joint_rect_overlap(infringer, infringee), self.joint_joint_rect_overlap(infringer, infringee),
self.layout().joint(infringer).center(), self.joint(infringer).center(),
self.layout().joint(infringee).center(), self.joint(infringee).center(),
orientation, orientation,
) )
} }
@ -83,8 +98,8 @@ impl Board {
) -> Vector2<i64> { ) -> Vector2<i64> {
Self::repulsion_from_rect_overlap( Self::repulsion_from_rect_overlap(
self.joint_segment_rect_overlap(infringer, infringee), self.joint_segment_rect_overlap(infringer, infringee),
self.layout().joint(infringer).center(), self.joint(infringer).center(),
self.layout().segment(infringee).center(), self.segment(infringee).center(),
orientation, orientation,
) )
} }
@ -97,8 +112,8 @@ impl Board {
) -> Vector2<i64> { ) -> Vector2<i64> {
Self::repulsion_from_rect_overlap( Self::repulsion_from_rect_overlap(
self.joint_via_rect_overlap(infringer, infringee), self.joint_via_rect_overlap(infringer, infringee),
self.layout().joint(infringer).center(), self.joint(infringer).center(),
self.layout().via(infringee).position, self.via(infringee).position,
orientation, orientation,
) )
} }
@ -111,8 +126,8 @@ impl Board {
) -> Vector2<i64> { ) -> Vector2<i64> {
Self::repulsion_from_rect_overlap( Self::repulsion_from_rect_overlap(
self.joint_polygon_rect_overlap(infringer, infringee), self.joint_polygon_rect_overlap(infringer, infringee),
self.layout().joint(infringer).center(), self.joint(infringer).center(),
self.layout().polygon(infringee).center(), self.polygon(infringee).center(),
orientation, orientation,
) )
} }
@ -147,8 +162,8 @@ impl Board {
) -> Vector2<i64> { ) -> Vector2<i64> {
Self::repulsion_from_rect_overlap( Self::repulsion_from_rect_overlap(
self.segment_joint_rect_overlap(infringer, infringee), self.segment_joint_rect_overlap(infringer, infringee),
self.layout().segment(infringer).center(), self.segment(infringer).center(),
self.layout().joint(infringee).center(), self.joint(infringee).center(),
orientation, orientation,
) )
} }
@ -161,8 +176,8 @@ impl Board {
) -> Vector2<i64> { ) -> Vector2<i64> {
Self::repulsion_from_rect_overlap( Self::repulsion_from_rect_overlap(
self.segment_segment_rect_overlap(infringer, infringee), self.segment_segment_rect_overlap(infringer, infringee),
self.layout().segment(infringer).center(), self.segment(infringer).center(),
self.layout().segment(infringee).center(), self.segment(infringee).center(),
orientation, orientation,
) )
} }
@ -175,8 +190,8 @@ impl Board {
) -> Vector2<i64> { ) -> Vector2<i64> {
Self::repulsion_from_rect_overlap( Self::repulsion_from_rect_overlap(
self.segment_via_rect_overlap(infringer, infringee), self.segment_via_rect_overlap(infringer, infringee),
self.layout().segment(infringer).center(), self.segment(infringer).center(),
self.layout().via(infringee).position, self.via(infringee).position,
orientation, orientation,
) )
} }
@ -189,8 +204,8 @@ impl Board {
) -> Vector2<i64> { ) -> Vector2<i64> {
Self::repulsion_from_rect_overlap( Self::repulsion_from_rect_overlap(
self.segment_polygon_rect_overlap(infringer, infringee), self.segment_polygon_rect_overlap(infringer, infringee),
self.layout().segment(infringer).center(), self.segment(infringer).center(),
self.layout().polygon(infringee).center(), self.polygon(infringee).center(),
orientation, orientation,
) )
} }
@ -225,8 +240,8 @@ impl Board {
) -> Vector2<i64> { ) -> Vector2<i64> {
Self::repulsion_from_rect_overlap( Self::repulsion_from_rect_overlap(
self.via_joint_rect_overlap(infringer, infringee), self.via_joint_rect_overlap(infringer, infringee),
self.layout().via(infringer).position, self.via(infringer).position,
self.layout().joint(infringee).center(), self.joint(infringee).center(),
orientation, orientation,
) )
} }
@ -239,8 +254,8 @@ impl Board {
) -> Vector2<i64> { ) -> Vector2<i64> {
Self::repulsion_from_rect_overlap( Self::repulsion_from_rect_overlap(
self.via_segment_rect_overlap(infringer, infringee), self.via_segment_rect_overlap(infringer, infringee),
self.layout().via(infringer).position, self.via(infringer).position,
self.layout().segment(infringee).center(), self.segment(infringee).center(),
orientation, orientation,
) )
} }
@ -253,8 +268,8 @@ impl Board {
) -> Vector2<i64> { ) -> Vector2<i64> {
Self::repulsion_from_rect_overlap( Self::repulsion_from_rect_overlap(
self.via_via_rect_overlap(infringer, infringee), self.via_via_rect_overlap(infringer, infringee),
self.layout().via(infringer).position, self.via(infringer).position,
self.layout().via(infringee).position, self.via(infringee).position,
orientation, orientation,
) )
} }
@ -267,8 +282,8 @@ impl Board {
) -> Vector2<i64> { ) -> Vector2<i64> {
Self::repulsion_from_rect_overlap( Self::repulsion_from_rect_overlap(
self.via_polygon_rect_overlap(infringer, infringee), self.via_polygon_rect_overlap(infringer, infringee),
self.layout().via(infringer).position, self.via(infringer).position,
self.layout().polygon(infringee).center(), self.polygon(infringee).center(),
orientation, orientation,
) )
} }
@ -303,8 +318,8 @@ impl Board {
) -> Vector2<i64> { ) -> Vector2<i64> {
Self::repulsion_from_rect_overlap( Self::repulsion_from_rect_overlap(
self.polygon_joint_rect_overlap(infringer, infringee), self.polygon_joint_rect_overlap(infringer, infringee),
self.layout().polygon(infringer).center(), self.polygon(infringer).center(),
self.layout().joint(infringee).center(), self.joint(infringee).center(),
orientation, orientation,
) )
} }
@ -317,8 +332,8 @@ impl Board {
) -> Vector2<i64> { ) -> Vector2<i64> {
Self::repulsion_from_rect_overlap( Self::repulsion_from_rect_overlap(
self.polygon_segment_rect_overlap(infringer, infringee), self.polygon_segment_rect_overlap(infringer, infringee),
self.layout().polygon(infringer).center(), self.polygon(infringer).center(),
self.layout().segment(infringee).center(), self.segment(infringee).center(),
orientation, orientation,
) )
} }
@ -331,8 +346,8 @@ impl Board {
) -> Vector2<i64> { ) -> Vector2<i64> {
Self::repulsion_from_rect_overlap( Self::repulsion_from_rect_overlap(
self.polygon_via_rect_overlap(infringer, infringee), self.polygon_via_rect_overlap(infringer, infringee),
self.layout().polygon(infringer).center(), self.polygon(infringer).center(),
self.layout().via(infringee).position, self.via(infringee).position,
orientation, orientation,
) )
} }
@ -345,8 +360,8 @@ impl Board {
) -> Vector2<i64> { ) -> Vector2<i64> {
Self::repulsion_from_rect_overlap( Self::repulsion_from_rect_overlap(
self.polygon_polygon_rect_overlap(infringer, infringee), self.polygon_polygon_rect_overlap(infringer, infringee),
self.layout().polygon(infringer).center(), self.polygon(infringer).center(),
self.layout().polygon(infringee).center(), self.polygon(infringee).center(),
orientation, orientation,
) )
} }