Skip to content

FEAT: Via clustering extending line support #953

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 56 commits into from
Jan 13, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 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
bf6731f
Merge remote-tracking branch 'origin/main'
svandenb-dev Dec 17, 2024
cfb31f2
Merge remote-tracking branch 'origin/main'
svandenb-dev Dec 17, 2024
6ff5c45
Merge remote-tracking branch 'origin/main'
svandenb-dev Dec 18, 2024
d1e6d8c
extending line support
svandenb-dev Dec 18, 2024
b22c44a
extending line support
svandenb-dev Dec 19, 2024
57eeffa
extending line support
svandenb-dev Dec 19, 2024
490037f
Merge remote-tracking branch 'origin/main'
svandenb-dev Dec 20, 2024
d243d00
Merge branch 'main' into via-clustering-extending-line-support
svandenb-dev Dec 20, 2024
e44166e
Merge branch 'main' into via-clustering-extending-line-support
svandenb-dev Jan 8, 2025
c408ce2
extending line support
svandenb-dev Jan 13, 2025
a1343bb
extending line support
svandenb-dev Jan 13, 2025
9b428a1
extending line support
svandenb-dev Jan 13, 2025
749188d
extending line support
svandenb-dev Jan 13, 2025
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
105 changes: 70 additions & 35 deletions src/pyedb/dotnet/edb_core/padstack.py
Original file line number Diff line number Diff line change
Expand Up @@ -1635,8 +1635,7 @@ def merge_via(self, contour_boxes, net_filter=None, start_layer=None, stop_layer
"""
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
raise Exception("No contour box provided, you need to pass a nested list as argument.")
if not start_layer:
start_layer = list(self._pedb.stackup.layers.values())[0].name
if not stop_layer:
Expand All @@ -1648,35 +1647,60 @@ def merge_via(self, contour_boxes, net_filter=None, start_layer=None, stop_layer
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]
if not instances:
raise Exception(f"No padstack instances found inside {contour_box}")
else:
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
x_values = []
y_values = []
for inst in instances:
pos = instances_index[inst]
x_values.append(pos[0])
y_values.append(pos[1])
x_values = list(set(x_values))
y_values = list(set(y_values))
if len(x_values) == 1 or len(y_values) == 1:
create_instances = self.merge_via_along_lines(
net_name=net, padstack_instances_id=instances, minimum_via_number=2
)
merged_via_ids.extend(create_instances)
else:
instances_pts = np.array([instances_index[id] 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,
):
raise Exception(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
self,
net_name="GND",
distance_threshold=5e-3,
minimum_via_number=6,
selected_angles=None,
padstack_instances_id=None,
):
"""Replace padstack instances along lines into a single polygon.

Expand All @@ -1700,11 +1724,15 @@ def merge_via_along_lines(
Specify angle in degrees to detected, for instance [0, 180] is only detecting horizontal and vertical lines.
Other values can be assigned like 45 degrees. When `None` is provided all lines are detected. Default value
is `None`.
padstack_instances_id : List[int]
List of padstack instances ID's to include. If `None`, the algorithm will scan all padstack instances belonging
to the specified net. Default value is `None`.


Returns
-------
bool
``True`` when succeeded ``False`` when failed. <
List[int], list of created padstack instances id.

"""
_def = list(
Expand All @@ -1713,12 +1741,16 @@ def merge_via_along_lines(
if not _def:
self._logger.error(f"No padstack definition found for net {net_name}")
return False
instances_created = []
_instances_to_delete = []
padstack_instances = []
for pdstk_def in _def:
padstack_instances.append(
[inst for inst in self.definitions[pdstk_def].instances if inst.net_name == net_name]
)
if padstack_instances_id:
padstack_instances = [[self.instances[id] for id in padstack_instances_id]]
else:
for pdstk_def in _def:
padstack_instances.append(
[inst for inst in self.definitions[pdstk_def].instances if inst.net_name == net_name]
)
for pdstk_series in padstack_instances:
instances_location = [inst.position for inst in pdstk_series]
lines, line_indexes = GeometryOperators.find_points_along_lines(
Expand Down Expand Up @@ -1750,11 +1782,14 @@ def merge_via_along_lines(
polygon_hole=polygon_data,
):
self._logger.error(f"Failed to create padstack definition {new_padstack_def}")
if not self.place(position=[0, 0], definition_name=new_padstack_def, net_name=net_name):
new_instance = self.place(position=[0, 0], definition_name=new_padstack_def, net_name=net_name)
if not new_instance:
self._logger.error(f"Failed to place padstack instance {new_padstack_def}")
else:
instances_created.append(new_instance.id)
for inst in _instances_to_delete:
inst.delete()
return True
return instances_created

def reduce_via_in_bounding_box(self, bounding_box, x_samples, y_samples, nets=None):
"""
Expand Down
11 changes: 8 additions & 3 deletions tests/legacy/system/test_edb_padstacks.py
Original file line number Diff line number Diff line change
Expand Up @@ -453,9 +453,7 @@ def test_via_fence(self):
assert "via_central" in edbapp.padstacks.definitions
edbapp.close()
edbapp = Edb(target_path2, edbversion=desktop_version)
assert edbapp.padstacks.merge_via_along_lines(
net_name="GND", distance_threshold=2e-3, minimum_via_number=6, selected_angles=[0, 180]
)
assert edbapp.padstacks.merge_via_along_lines(net_name="GND", distance_threshold=2e-3, minimum_via_number=6)
assert "main_via" in edbapp.padstacks.definitions
assert "via_central" in edbapp.padstacks.definitions
edbapp.close()
Expand All @@ -479,3 +477,10 @@ def test_via_merge(self, edb_examples):
result = edbapp.padstacks.merge_via(contour_boxes=polygon, start_layer="1_Top", stop_layer="16_Bottom")
assert len(result) == 1
edbapp.close()

def test_via_merge2(self, edb_examples):
edbapp = edb_examples.get_si_verse()
polygon = [[[123.37e-3, 69.5e-3], [124.83e-3, 69.25e-3], [124.573e-3, 60.23e-3], [123e-3, 60.5e-3]]]
result = edbapp.padstacks.merge_via(contour_boxes=polygon, start_layer="1_Top", stop_layer="16_Bottom")
assert len(result) == 1
edbapp.close()
Loading