From 0b756907be7f8a828eaa5251ccab79205d4e304d Mon Sep 17 00:00:00 2001 From: svandenb-dev Date: Sun, 22 Mar 2026 13:43:37 +0100 Subject: [PATCH 1/7] port fixed --- src/pyedb/grpc/database/inner/base.py | 9 +++++++ src/pyedb/grpc/database/primitive/path.py | 6 ----- src/pyedb/grpc/database/source_excitations.py | 6 ++--- .../grpc/database/terminal/edge_terminal.py | 3 +-- src/pyedb/grpc/database/terminal/terminal.py | 26 +++++++++++++++++++ tests/system/test_edb.py | 4 +++ 6 files changed, 43 insertions(+), 11 deletions(-) diff --git a/src/pyedb/grpc/database/inner/base.py b/src/pyedb/grpc/database/inner/base.py index 0b1c8c8cd1..7ae3d2a0a8 100644 --- a/src/pyedb/grpc/database/inner/base.py +++ b/src/pyedb/grpc/database/inner/base.py @@ -7,6 +7,15 @@ # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is +# Copyright (C) 2023 - 2026 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all diff --git a/src/pyedb/grpc/database/primitive/path.py b/src/pyedb/grpc/database/primitive/path.py index cfb5ecd910..6234a0396d 100644 --- a/src/pyedb/grpc/database/primitive/path.py +++ b/src/pyedb/grpc/database/primitive/path.py @@ -280,12 +280,6 @@ def create_edge_port( """ center_line = self.get_center_line() pos = center_line[-1] if position.lower() == "end" else center_line[0] - - # if port_type.lower() == "wave": - # return self._pedb.excitation_manager.create_wave_port( - # self.id, pos, name, 50, horizontal_extent_factor, vertical_extent_factor, pec_launch_width - # ) - # else: return self._pedb.excitation_manager.create_edge_port_vertical( self.edb_uid, pos, diff --git a/src/pyedb/grpc/database/source_excitations.py b/src/pyedb/grpc/database/source_excitations.py index 93b4be28aa..50381097f0 100644 --- a/src/pyedb/grpc/database/source_excitations.py +++ b/src/pyedb/grpc/database/source_excitations.py @@ -2014,7 +2014,7 @@ def create_edge_port_vertical( horizontal_extent_factor: Union[int, float] = 5, vertical_extent_factor: Union[int, float] = 3, pec_launch_width: str = "0.01mm", - ) -> str: + ) -> str | None: """Create a vertical edge port. Parameters @@ -2077,9 +2077,9 @@ def create_edge_port_vertical( prop, ) if not pos_edge_term.is_null: - return pos_edge_term + return pos_edge_term.name else: - return False + return None def create_edge_port_horizontal( self, diff --git a/src/pyedb/grpc/database/terminal/edge_terminal.py b/src/pyedb/grpc/database/terminal/edge_terminal.py index b14e72c753..afcd36accd 100644 --- a/src/pyedb/grpc/database/terminal/edge_terminal.py +++ b/src/pyedb/grpc/database/terminal/edge_terminal.py @@ -108,8 +108,7 @@ def port_post_processing_prop(self, value): @property def is_wave_port(self) -> bool: if self._hfss_port_property: - return True - return False + return True if "Wave" in self._hfss_port_property else False @property def is_reference_terminal(self) -> bool: diff --git a/src/pyedb/grpc/database/terminal/terminal.py b/src/pyedb/grpc/database/terminal/terminal.py index 2c14bd90ff..8e225d69ee 100644 --- a/src/pyedb/grpc/database/terminal/terminal.py +++ b/src/pyedb/grpc/database/terminal/terminal.py @@ -38,6 +38,7 @@ ) from pyedb.grpc.database.primitive.primitive import Primitive +from pyedb.grpc.database.terminal.port_post_processing_properties import PortPostProcessingProperties from pyedb.grpc.database.utility.port_post_processing_prop import PortPostProcessingProp from pyedb.grpc.database.utility.value import Value from pyedb.misc.decorators import deprecated_property @@ -213,6 +214,31 @@ def do_renormalize(self) -> bool: def do_renormalize(self, value): self.port_post_processing_prop.do_renormalize = value + @property + def do_deembed(self) -> bool: + """Determine whether port deembed is enabled. + Returns + """ + return self.port_post_processing_prop.do_deembed + + @do_deembed.setter + def do_deembed(self, value): + self.port_post_processing_prop.do_deembed = value + + @property + @deprecated_property("use do_deembed property instead") + def deembed(self) -> bool: + """Determine whether port deembed is enabled. + + .. deprecated:: 0.71.0 + The `deembed` property is deprecated. Please use `do_deembed` instead. + """ + return self.port_post_processing_prop.do_deembed + + @deembed.setter + def deembed(self, value): + self.port_post_processing_prop.do_deembed = value + @property def renormalization_impedance(self) -> float: """Get the renormalization impedance value. diff --git a/tests/system/test_edb.py b/tests/system/test_edb.py index 8490a7411c..81bc93f783 100644 --- a/tests/system/test_edb.py +++ b/tests/system/test_edb.py @@ -338,11 +338,15 @@ def test_create_edge_port_on_polygon(self): gap_port = edb.ports["pcb_port_2"] if edb.grpc: assert gap_port.component.is_null + assert not gap_port.is_circuit_port else: assert not gap_port.component assert gap_port.source_amplitude == 0.0 assert gap_port.source_phase == 0.0 assert gap_port.impedance + # temp + from ansys.edb.core.database import ProductIdType + assert not gap_port.deembed gap_port.name = "gap_port" assert gap_port.name == "gap_port" From f0d57cac0f99f7e54812e5420154f154932100da Mon Sep 17 00:00:00 2001 From: svandenb-dev Date: Sun, 22 Mar 2026 16:11:20 +0100 Subject: [PATCH 2/7] issue #1991 fix --- src/pyedb/dotnet/database/cell/hierarchy/component.py | 4 ++++ src/pyedb/grpc/database/hierarchy/component.py | 2 ++ tests/system/test_edb_components.py | 4 +++- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/pyedb/dotnet/database/cell/hierarchy/component.py b/src/pyedb/dotnet/database/cell/hierarchy/component.py index beb921e698..2dc9ac1f95 100644 --- a/src/pyedb/dotnet/database/cell/hierarchy/component.py +++ b/src/pyedb/dotnet/database/cell/hierarchy/component.py @@ -335,6 +335,8 @@ def solder_ball_shape(self): return "cylinder" elif shape.value__ == 2: return "spheroid" + elif shape.value__ == 3: + return "unknown" @solder_ball_shape.setter def solder_ball_shape(self, value): @@ -353,6 +355,8 @@ def solder_ball_shape(self, value): shape = self._edb.Definition.SolderballShape.Cylinder elif value == 2: shape = self._edb.Definition.SolderballShape.Spheroid + if shape is None: + shape = self._edb.Definition.SolderballShape.NoSolderball if shape: cmp_property = self.component_property.core solder_ball_prop = cmp_property.GetSolderBallProperty().Clone() diff --git a/src/pyedb/grpc/database/hierarchy/component.py b/src/pyedb/grpc/database/hierarchy/component.py index 016f6e3197..9b2aafcf12 100644 --- a/src/pyedb/grpc/database/hierarchy/component.py +++ b/src/pyedb/grpc/database/hierarchy/component.py @@ -566,6 +566,8 @@ def solder_ball_shape(self) -> str | None: return "cylinder" elif shape == SolderballShape.SOLDERBALL_SPHEROID: return "spheroid" + elif shape == SolderballShape.UNKNOWN_SOLDERBALL_SHAPE: + return "unknown" return None @solder_ball_shape.setter diff --git a/tests/system/test_edb_components.py b/tests/system/test_edb_components.py index 10809f1892..99907fbc03 100644 --- a/tests/system/test_edb_components.py +++ b/tests/system/test_edb_components.py @@ -301,13 +301,15 @@ def test_convert_resistor_value(self): def test_components_create_solder_ball_on_component(self): """Set cylindrical solder balls on a given component""" - # Done edb = self.edb_examples.get_si_verse() assert edb.components.set_solder_ball("U1", shape="Spheroid") assert edb.components.set_solder_ball("U6", sball_height=None) assert edb.components.set_solder_ball( "U6", sball_height="100um", auto_reference_size=False, chip_orientation="chip_up" ) + assert edb.components["U6"].solder_ball_shape == "cylinder" + edb.components["U6"].solder_ball_shape = None + assert edb.components["U6"].solder_ball_shape == "none" edb.close(terminate_rpc_session=False) def test_components_short_component(self): From e2a808ba2f3f6e5e0c78a44383fb780f30767447 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 22 Mar 2026 15:13:14 +0000 Subject: [PATCH 3/7] CHORE: Auto fixes from pre-commit hooks --- src/pyedb/grpc/database/terminal/terminal.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pyedb/grpc/database/terminal/terminal.py b/src/pyedb/grpc/database/terminal/terminal.py index 8e225d69ee..7f14d14d1b 100644 --- a/src/pyedb/grpc/database/terminal/terminal.py +++ b/src/pyedb/grpc/database/terminal/terminal.py @@ -36,9 +36,9 @@ BoundaryType as CoreBoundaryType, TerminalType as CoreTerminalType, ) +from pyedb.grpc.database.terminal.port_post_processing_properties import PortPostProcessingProperties from pyedb.grpc.database.primitive.primitive import Primitive -from pyedb.grpc.database.terminal.port_post_processing_properties import PortPostProcessingProperties from pyedb.grpc.database.utility.port_post_processing_prop import PortPostProcessingProp from pyedb.grpc.database.utility.value import Value from pyedb.misc.decorators import deprecated_property From a20b009ba1f504681c3668ecbf015acf88054232 Mon Sep 17 00:00:00 2001 From: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> Date: Sun, 22 Mar 2026 15:17:11 +0000 Subject: [PATCH 4/7] chore: adding changelog file 1946.fixed.md [dependabot-skip] --- doc/changelog.d/1946.fixed.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/changelog.d/1946.fixed.md diff --git a/doc/changelog.d/1946.fixed.md b/doc/changelog.d/1946.fixed.md new file mode 100644 index 0000000000..59fda3d4dc --- /dev/null +++ b/doc/changelog.d/1946.fixed.md @@ -0,0 +1 @@ +Issue#1407 solder ball shape none From a16a0a1a1651c4f283fc7e0c2dc322882f1b6a36 Mon Sep 17 00:00:00 2001 From: svandenb-dev Date: Sun, 22 Mar 2026 19:23:33 +0100 Subject: [PATCH 5/7] issue #1063 fixed --- src/pyedb/grpc/database/terminal/terminal.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pyedb/grpc/database/terminal/terminal.py b/src/pyedb/grpc/database/terminal/terminal.py index 7f14d14d1b..a2a058112f 100644 --- a/src/pyedb/grpc/database/terminal/terminal.py +++ b/src/pyedb/grpc/database/terminal/terminal.py @@ -36,7 +36,6 @@ BoundaryType as CoreBoundaryType, TerminalType as CoreTerminalType, ) -from pyedb.grpc.database.terminal.port_post_processing_properties import PortPostProcessingProperties from pyedb.grpc.database.primitive.primitive import Primitive from pyedb.grpc.database.utility.port_post_processing_prop import PortPostProcessingProp From 5520e766494e7457ca0ba97b9771cc70102b2940 Mon Sep 17 00:00:00 2001 From: svandenb-dev Date: Mon, 23 Mar 2026 07:14:28 +0100 Subject: [PATCH 6/7] update --- src/pyedb/grpc/database/hierarchy/component.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/pyedb/grpc/database/hierarchy/component.py b/src/pyedb/grpc/database/hierarchy/component.py index 9b2aafcf12..0b40ff64a8 100644 --- a/src/pyedb/grpc/database/hierarchy/component.py +++ b/src/pyedb/grpc/database/hierarchy/component.py @@ -573,14 +573,17 @@ def solder_ball_shape(self) -> str | None: @solder_ball_shape.setter def solder_ball_shape(self, value): if not self.component_property.solder_ball_property.is_null: - shape = None - if isinstance(value, str): + if value is None: + shape = SolderballShape.NO_SOLDERBALL + elif isinstance(value, str): if value.lower() == "cylinder": shape = SolderballShape.SOLDERBALL_CYLINDER elif value.lower() == "none": shape = SolderballShape.NO_SOLDERBALL elif value.lower() == "spheroid": shape = SolderballShape.SOLDERBALL_SPHEROID + elif value.lower() == "none": + shape = SolderballShape.NO_SOLDERBALL if shape: cmp_property = self.core.component_property solder_ball_prop = cmp_property.solder_ball_property From b6b5c861f4fdb79f0df9b69eca6cc5a9fc3db3d1 Mon Sep 17 00:00:00 2001 From: svandenb-dev Date: Mon, 23 Mar 2026 07:17:12 +0100 Subject: [PATCH 7/7] update --- src/pyedb/grpc/database/hierarchy/component.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pyedb/grpc/database/hierarchy/component.py b/src/pyedb/grpc/database/hierarchy/component.py index 0b40ff64a8..52a25a1bf5 100644 --- a/src/pyedb/grpc/database/hierarchy/component.py +++ b/src/pyedb/grpc/database/hierarchy/component.py @@ -573,6 +573,7 @@ def solder_ball_shape(self) -> str | None: @solder_ball_shape.setter def solder_ball_shape(self, value): if not self.component_property.solder_ball_property.is_null: + shape = None if value is None: shape = SolderballShape.NO_SOLDERBALL elif isinstance(value, str):