Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
1df26cb
hfsspi SimsetupInfo bug fixed
svandenb-dev Jun 21, 2024
08113cd
Merge remote-tracking branch 'origin/main'
svandenb-dev Jun 24, 2024
80b8b48
Merge remote-tracking branch 'origin/main'
svandenb-dev Jun 24, 2024
f33aaed
Merge remote-tracking branch 'origin/main'
svandenb-dev Jun 25, 2024
1935556
temp
svandenb-dev Jun 25, 2024
66fb218
Merge remote-tracking branch 'origin/main'
svandenb-dev Jun 28, 2024
14846b7
Merge remote-tracking branch 'origin/main'
svandenb-dev Jul 1, 2024
54e6d7f
Merge remote-tracking branch 'origin/main'
svandenb-dev Jul 2, 2024
fa3f4cd
Merge remote-tracking branch 'origin/main'
svandenb-dev Jul 3, 2024
7267ca7
Merge remote-tracking branch 'origin/main'
svandenb-dev Jul 11, 2024
bae0c6d
Merge remote-tracking branch 'origin/main'
svandenb-dev Jul 11, 2024
f0ac95c
Merge remote-tracking branch 'origin/main'
svandenb-dev Jul 12, 2024
b5717ac
Merge remote-tracking branch 'origin/main'
svandenb-dev Jul 24, 2024
6065327
Merge remote-tracking branch 'origin/main'
svandenb-dev Jul 24, 2024
a62b8f8
Merge remote-tracking branch 'origin/main'
svandenb-dev Jul 24, 2024
a800262
Merge remote-tracking branch 'origin/main'
svandenb-dev Jul 25, 2024
e14256f
Merge remote-tracking branch 'origin/main'
svandenb-dev Aug 19, 2024
54e2691
Merge remote-tracking branch 'origin/main'
svandenb-dev Aug 20, 2024
7471fa1
create port in pin exception handling
svandenb-dev Aug 20, 2024
4f989d1
Merge remote-tracking branch 'origin/main'
svandenb-dev Aug 21, 2024
9061774
Merge remote-tracking branch 'origin/main'
svandenb-dev Aug 22, 2024
e53bac6
Merge remote-tracking branch 'origin/main'
svandenb-dev Aug 29, 2024
f87902a
Merge remote-tracking branch 'origin/main'
svandenb-dev Aug 30, 2024
99e73b9
Merge remote-tracking branch 'origin/main'
svandenb-dev Sep 2, 2024
cdb58c1
Merge remote-tracking branch 'origin/main'
svandenb-dev Sep 2, 2024
bd6cfd6
Merge remote-tracking branch 'origin/main'
svandenb-dev Sep 4, 2024
8d2ee7c
Merge remote-tracking branch 'origin/main'
svandenb-dev Sep 4, 2024
08cf92f
Merge remote-tracking branch 'origin/main'
svandenb-dev Sep 5, 2024
c441ad5
Merge remote-tracking branch 'origin/main'
svandenb-dev Sep 11, 2024
44fc86f
Merge remote-tracking branch 'origin/main'
svandenb-dev Sep 11, 2024
90574c0
Merge remote-tracking branch 'origin/main'
svandenb-dev Sep 16, 2024
b5831ec
Merge remote-tracking branch 'origin/main'
svandenb-dev Sep 20, 2024
db43e79
Merge remote-tracking branch 'origin/main'
svandenb-dev Oct 1, 2024
dcb9a14
Merge remote-tracking branch 'origin/main'
svandenb-dev Oct 2, 2024
9287c2a
Merge remote-tracking branch 'origin/main'
svandenb-dev Oct 24, 2024
ad01710
Merge remote-tracking branch 'origin/main'
svandenb-dev Oct 25, 2024
1e907ee
Merge remote-tracking branch 'origin/main'
svandenb-dev Nov 5, 2024
347a3a8
Merge remote-tracking branch 'origin/main'
svandenb-dev Nov 12, 2024
5cc5819
Merge remote-tracking branch 'origin/main'
svandenb-dev Nov 21, 2024
ed49db0
Merge remote-tracking branch 'origin/main'
svandenb-dev Nov 21, 2024
28b65e1
Merge remote-tracking branch 'origin/main'
svandenb-dev Nov 29, 2024
a73662b
Merge remote-tracking branch 'origin/main'
svandenb-dev Dec 2, 2024
054467d
Merge remote-tracking branch 'origin/main'
svandenb-dev Dec 11, 2024
1e6a353
via clustering backend
svandenb-dev Dec 12, 2024
159eb02
new feature via clustering
svandenb-dev Dec 13, 2024
bf6731f
Merge remote-tracking branch 'origin/main'
svandenb-dev Dec 17, 2024
59a2f8e
Merge branch 'main' into via-clustering
svandenb-dev Dec 17, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
102 changes: 100 additions & 2 deletions src/pyedb/dotnet/edb_core/padstack.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@
import math
import warnings

import numpy as np
import rtree
from scipy.spatial import ConvexHull

from pyedb.dotnet.clr_module import Array
from pyedb.dotnet.edb_core.edb_data.padstacks_data import (
Expand Down Expand Up @@ -1553,7 +1555,7 @@ def get_padstack_instances_rtree_index(self, nets=None):
padstack_instances_index.insert(inst.id, inst.position)
return padstack_instances_index

def get_padstack_instances_intersecting_bounding_box(self, bounding_box, nets=None):
def get_padstack_instances_id_intersecting_polygon(self, points, nets=None, padstack_instances_index=None):
"""Returns the list of padstack instances ID intersecting a given bounding box and nets.

Parameters
Expand All @@ -1563,20 +1565,116 @@ def get_padstack_instances_intersecting_bounding_box(self, bounding_box, nets=No
nets : str or list, optional
net name of list of nets name applying filtering on padstack instances selection. If ``None`` is provided
all instances are included in the index. Default value is ``None``.
padstack_instances_index : optional, Rtree object.
Can be provided optionally to prevent computing padstack instances Rtree index again.

Returns
-------
List of padstack instances ID intersecting the bounding box.
"""
if not points:
raise Exception("No points defining polygon was provided")
if not padstack_instances_index:
padstack_instances_index = {}
for inst in self.instances:
padstack_instances_index[inst.id] = inst.position
_x = [pt[0] for pt in points]
_y = [pt[1] for pt in points]
points = [_x, _y]
return [
ind for ind, pt in padstack_instances_index.items() if GeometryOperators.is_point_in_polygon(pt, points)
]

def get_padstack_instances_intersecting_bounding_box(self, bounding_box, nets=None, padstack_instances_index=None):
"""Returns the list of padstack instances ID intersecting a given bounding box and nets.

Parameters
----------
bounding_box : tuple or list.
bounding box, [x1, y1, x2, y2]
nets : str or list, optional
net name of list of nets name applying filtering on padstack instances selection. If ``None`` is provided
all instances are included in the index. Default value is ``None``.
padstack_instances_index : optional, Rtree object.
Can be provided optionally to prevent computing padstack instances Rtree index again.

Returns
-------
List of padstack instances ID intersecting the bounding box.
"""
if not bounding_box:
raise Exception("No bounding box was provided")
index = self.get_padstack_instances_rtree_index(nets=nets)
if not padstack_instances_index:
index = self.get_padstack_instances_rtree_index(nets=nets)
else:
index = padstack_instances_index
if not len(bounding_box) == 4:
raise Exception("The bounding box length must be equal to 4")
if isinstance(bounding_box, list):
bounding_box = tuple(bounding_box)
return list(index.intersection(bounding_box))

def merge_via(self, contour_boxes, net_filter=None, start_layer=None, stop_layer=None):
"""Evaluate padstack instances included on the provided point list and replace all by single instance.

Parameters
----------
contour_boxes : List[List[List[float, float]]]
Nested list of polygon with points [x,y].
net_filter : optional
List[str: net_name] apply a net filter, nets included in the filter are excluded from the via merge.
start_layer : optional, str
Padstack instance start layer, if `None` the top layer is selected.
stop_layer : optional, str
Padstack instance stop layer, if `None` the bottom layer is selected.

Return
------
List[str], list of created padstack instances ID.

"""
merged_via_ids = []
if not contour_boxes:
self._pedb.logger.error("No contour box provided, you need to pass a nested list as argument.")
return False
if not start_layer:
start_layer = list(self._pedb.stackup.layers.values())[0].name
if not stop_layer:
stop_layer = list(self._pedb.stackup.layers.values())[-1].name
instances_index = {}
for id, inst in self.instances.items():
instances_index[id] = inst.position
for contour_box in contour_boxes:
instances = self.get_padstack_instances_id_intersecting_polygon(
points=contour_box, padstack_instances_index=instances_index
)
if net_filter:
instances = [self.instances[id] for id in instances if not self.instances[id].net.name in net_filter]
net = self.instances[instances[0]].net.name
instances_pts = np.array([self.instances[id].position for id in instances])
convex_hull_contour = ConvexHull(instances_pts)
contour_points = list(instances_pts[convex_hull_contour.vertices])
layer = list(self._pedb.stackup.layers.values())[0].name
polygon = self._pedb.modeler.create_polygon(main_shape=contour_points, layer_name=layer)
polygon_data = polygon.polygon_data
polygon.delete()
new_padstack_def = generate_unique_name(self.instances[instances[0]].definition.name)
if not self.create(
padstackname=new_padstack_def,
pad_shape="Polygon",
antipad_shape="Polygon",
pad_polygon=polygon_data,
antipad_polygon=polygon_data,
polygon_hole=polygon_data,
start_layer=start_layer,
stop_layer=stop_layer,
):
self._logger.error(f"Failed to create padstack definition {new_padstack_def}")
merged_instance = self.place(position=[0, 0], definition_name=new_padstack_def, net_name=net)
merged_via_ids.append(merged_instance.id)
[self.instances[id].delete() for id in instances]
return merged_via_ids

def merge_via_along_lines(
self, net_name="GND", distance_threshold=5e-3, minimum_via_number=6, selected_angles=None
):
Expand Down
7 changes: 7 additions & 0 deletions tests/legacy/system/test_edb_padstacks.py
Original file line number Diff line number Diff line change
Expand Up @@ -458,3 +458,10 @@ def test_via_fence(self):
assert "main_via" in edbapp.padstacks.definitions
assert "via_central" in edbapp.padstacks.definitions
edbapp.close()

def test_via_merge(self, edb_examples):
edbapp = edb_examples.get_si_verse()
polygon = [[[118e-3, 60e-3], [125e-3, 60e-3], [124e-3, 56e-3], [118e-3, 56e-3]]]
result = edbapp.padstacks.merge_via(contour_boxes=polygon, start_layer="1_Top", stop_layer="16_Bottom")
assert len(result) == 1
edbapp.close()
Loading