Skip to content

Commit edd5e59

Browse files
authored
Merge pull request #66 from ansys-internal/unittest_iter2
Unittest iter2
2 parents cc8807a + 7d6b074 commit edd5e59

File tree

12 files changed

+474
-530
lines changed

12 files changed

+474
-530
lines changed

src/pyedb/grpc/components.py

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import re
88
import warnings
99
import ansys.edb.definition as definition
10+
import ansys.edb.geometry as geometry
1011
import ansys.edb.hierarchy as hierarchy
1112
import ansys.edb.layer as layer
1213
import ansys.edb.terminal as terminal
@@ -833,12 +834,12 @@ def create_port_on_component(
833834
pin_layers = cmp_pins[0].padstack_def.data.layer_names
834835
if port_type == SourceType.CoaxPort:
835836
pad_params = self._padstack.get_pad_parameters(pin=cmp_pins[0], layername=pin_layers[0], pad_type=0)
836-
if not pad_params[0] == 7:
837-
sball_diam = min([utility.Value(val).value for val in pad_params[1]])
838-
solder_ball_height = 2 * sball_diam / 3
839-
else:
840-
bbox = pad_params[1]
841-
sball_diam = min([abs(bbox[2] - bbox[0]), abs(bbox[3] - bbox[1])]) * 0.8
837+
if isinstance(pad_params[0], definition.PadGeometryType):
838+
sball_diam = min([utility.Value(val).value for val in pad_params[1]])
839+
solder_ball_height = 2 * sball_diam / 3
840+
elif isinstance(pad_params[0], geometry.PolygonData):
841+
bbox = pad_params[0].bbox()
842+
sball_diam = min([abs(bbox[1].x - bbox[0].x), abs(bbox[3] - bbox[1])]) * 0.8
842843
solder_ball_height = 2 * sball_diam / 3
843844
self.set_solder_ball(component, solder_ball_height, sball_diam)
844845
for pin in cmp_pins:
@@ -1221,10 +1222,10 @@ def _is_top_component(self, cmp):
12211222
return False
12221223

12231224
@pyedb_function_handler()
1224-
def _getComponentDefinition(self, name, pins):
1225+
def _get_component_definition(self, name, pins):
12251226
component_definition = definition.ComponentDef.find(self._db, name)
12261227
if component_definition.is_null:
1227-
component_definition = definition.ComponentDef.create(self._db, name, None)
1228+
component_definition = definition.ComponentDef.create(db=self._db, comp_def_name=name, fp=None)
12281229
if component_definition.is_null:
12291230
self._logger.error("Failed to create component definition {}".format(name))
12301231
return None
@@ -1332,12 +1333,12 @@ def create(
13321333
13331334
"""
13341335
if component_part_name:
1335-
compdef = self._getComponentDefinition(component_part_name, pins)
1336+
compdef = self._get_component_definition(component_part_name, pins)
13361337
else:
1337-
compdef = self._getComponentDefinition(component_name, pins)
1338+
compdef = self._get_component_definition(component_name, pins)
13381339
if not compdef:
13391340
return False
1340-
new_cmp = hierarchy.ComponentGroup.create(self._active_layout, component_name, compdef.name)
1341+
new_cmp = hierarchy.ComponentGroup.create(self._layout, component_name, compdef.name)
13411342

13421343
if isinstance(pins[0], EDBPadstackInstance):
13431344
pins = [i._edb_padstackinstance for i in pins]
@@ -1698,7 +1699,8 @@ def set_solder_ball(
16981699
pad_params = self._padstack.get_pad_parameters(pin=pin1, layername=pin_layers[0], pad_type=0)
16991700
_sb_diam = min([utility.Value(val).value for val in pad_params[1]])
17001701
sball_diam = _sb_diam
1701-
sball_height = round(utility.Value(sball_diam).value, 9) / 2
1702+
if not sball_height:
1703+
sball_height = 2 * round(utility.Value(sball_diam).value, 9) / 3
17021704
if not sball_mid_diam:
17031705
sball_mid_diam = sball_diam
17041706

@@ -1709,20 +1711,17 @@ def set_solder_ball(
17091711

17101712
cmp_property = edb_cmp.component_property
17111713
if cmp_type == hierarchy.ComponentType.IC:
1712-
ic_die_prop = cmp_property.die_property
1714+
ic_die_prop = cmp_property.die_property.clone()
17131715
ic_die_prop.type = definition.DieType.FLIPCHIP
17141716
if chip_orientation.lower() == "chip_down":
17151717
ic_die_prop.orientation = definition.DieOrientation.CHIP_DOWN
17161718
if chip_orientation.lower() == "chip_up":
17171719
ic_die_prop.orientation = definition.DieOrientation.CHIP_UP
1718-
else:
1719-
ic_die_prop.orientation = definition.DieOrientation.CHIP_DOWN
17201720
cmp_property.die_property = ic_die_prop
17211721

17221722
solder_ball_prop = cmp_property.solder_ball_property
1723-
solder_ball_prop.diameter = (utility.Value(sball_diam), utility.Value(sball_mid_diam))
1723+
solder_ball_prop.set_diameter(utility.Value(sball_diam), utility.Value(sball_mid_diam))
17241724
solder_ball_prop.height = utility.Value(sball_height)
1725-
17261725
solder_ball_prop.shape = sball_shape
17271726
cmp_property.solder_ball_property = solder_ball_prop
17281727

src/pyedb/grpc/edb.py

Lines changed: 32 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,7 @@ def open_edb(self):
421421
try:
422422
self._db = database.Database.open(self.edbpath, self.isreadonly)
423423
except Exception as e:
424-
self.logger.error("EDB Builder not Initialized.")
424+
self.logger.error(e.args[0])
425425
if not self.active_db:
426426
self.logger.warning("Error Opening db")
427427
self._active_cell = None
@@ -1133,7 +1133,7 @@ def _create_extent(
11331133
reference_list=[],
11341134
include_pingroups=True,
11351135
):
1136-
if extent_type in ["Conforming", self.edb_api.geometry.extent_type.Conforming, 1]:
1136+
if extent_type in ["Conforming", geometry.ExtentType.CONFORMING, 1]:
11371137
if use_pyaedt_extent:
11381138
_poly = self._create_conformal(
11391139
net_signals,
@@ -1148,15 +1148,15 @@ def _create_extent(
11481148
else:
11491149
_poly = self.layout.expanded_extent(
11501150
net_signals,
1151-
self.edb_api.geometry.extent_type.Conforming,
1151+
geometry.ExtentType.CONFORMING,
11521152
expansion_size,
11531153
False,
11541154
use_round_corner,
11551155
1,
11561156
)
1157-
elif extent_type in ["Bounding", self.edb_api.geometry.extent_type.BoundingBox, 0]:
1157+
elif extent_type in ["Bounding", geometry.ExtentType.BOUNDING_BOX, 0]:
11581158
_poly = self.layout.expanded_extent(
1159-
net_signals, self.edb_api.geometry.extent_type.BoundingBox, expansion_size, False, use_round_corner, 1
1159+
net_signals, geometry.ExtentType.BOUNDING_BOX, expansion_size, False, use_round_corner, 1
11601160
)
11611161
else:
11621162
if use_pyaedt_extent:
@@ -1173,14 +1173,14 @@ def _create_extent(
11731173
else:
11741174
_poly = self.layout.expanded_extent(
11751175
net_signals,
1176-
self.edb_api.geometry.extent_type.Conforming,
1176+
geometry.ExtentType.CONFORMING,
11771177
expansion_size,
11781178
False,
11791179
use_round_corner,
11801180
1,
11811181
)
1182-
_poly_list = convert_py_list_to_net_list([_poly])
1183-
_poly = self.edb_api.geometry.polygon_data.get_convex_hull_of_polygons(_poly_list)
1182+
_poly_list = [_poly]
1183+
_poly = geometry.PolygonData.convex_hull(_poly_list)
11841184
return _poly
11851185

11861186
@pyedb_function_handler()
@@ -1201,27 +1201,27 @@ def _create_conformal(
12011201
names.append(net.GetName())
12021202
for prim in self.modeler.primitives:
12031203
if prim is not None and prim.net_name in names:
1204-
obj_data = prim.primitive_object.GetPolygonData().Expand(
1204+
obj_data = prim.primitive_object.polygon_data.expand(
12051205
expansion_size, tolerance, round_corner, round_extension
12061206
)
12071207
if obj_data:
12081208
_polys.extend(list(obj_data))
12091209
if smart_cutout:
12101210
_polys.extend(self._smart_cut(net_signals, reference_list, include_pingroups))
1211-
_poly_unite = self.edb_api.geometry.polygon_data.unite(_polys)
1211+
_poly_unite = geometry.PolygonData.unite(_polys)
12121212
if len(_poly_unite) == 1:
12131213
return _poly_unite[0]
12141214
else:
1215-
areas = [i.Area() for i in _poly_unite]
1215+
areas = [i.area for i in _poly_unite]
12161216
return _poly_unite[areas.index(max(areas))]
12171217

12181218
@pyedb_function_handler()
12191219
def _smart_cut(self, net_signals, reference_list=[], include_pingroups=True):
12201220
_polys = []
1221-
terms = [term for term in self.layout.terminals if int(term.GetBoundaryType()) in [0, 3, 4, 7, 8]]
1221+
terms = [term for term in self.layout.terminals if term.boundary_type.value in [0, 3, 4, 7, 8]]
12221222
locations = []
12231223
for term in terms:
1224-
if term.GetTerminalType().ToString() == "PadstackInstanceTerminal":
1224+
if term.terminal_type == "PadstackInstanceTerminal":
12251225
if term.GetParameters()[1].GetNet().GetName() in reference_list:
12261226
locations.append(self.padstacks.instances[term.GetParameters()[1].GetId()].position)
12271227
elif term.GetTerminalType().ToString() == "PointTerminal" and term.GetNet().GetName() in reference_list:
@@ -1269,14 +1269,22 @@ def _create_convex_hull(
12691269
names = []
12701270
_polys = []
12711271
for net in net_signals:
1272-
names.append(net.GetName())
1272+
names.append(net.name)
12731273
for prim in self.modeler.primitives:
12741274
if prim is not None and prim.net_name in names:
1275-
_polys.append(prim.primitive_object.GetPolygonData())
1275+
if prim.type == "Path":
1276+
path_polygon_data = prim.primitive_object.polygon_data # missing in edb api
1277+
if path_polygon_data:
1278+
_polys.append(path_polygon_data)
1279+
else:
1280+
_polys.append(prim.primitive_object.polygon_data)
12761281
if smart_cut:
12771282
_polys.extend(self._smart_cut(net_signals, reference_list, include_pingroups))
1278-
_poly = self.edb_api.geometry.polygon_data.get_convex_hull_of_polygons(convert_py_list_to_net_list(_polys))
1279-
_poly = _poly.Expand(expansion_size, tolerance, round_corner, round_extension)[0]
1283+
_poly = geometry.PolygonData.convex_hull(_polys)
1284+
_poly = _poly.expand(offset=expansion_size,
1285+
tol=tolerance,
1286+
round_corner=round_corner,
1287+
max_corner_ext=round_extension)[0]
12801288
return _poly
12811289

12821290
@pyedb_function_handler()
@@ -1526,15 +1534,13 @@ def _create_cutout_legacy(
15261534
check_terminals=False,
15271535
include_pingroups=True,
15281536
):
1529-
expansion_size = self.edb_value(expansion_size).ToDouble()
1537+
expansion_size = utility.Value(expansion_size).value
15301538

15311539
# validate nets in layout
1532-
net_signals = [net.api_object for net in self.layout.nets if net.name in signal_list]
1540+
net_signals = [net for net in self.layout.nets if net.name in signal_list]
15331541

15341542
# validate references in layout
1535-
_netsClip = convert_py_list_to_net_list(
1536-
[net.api_object for net in self.layout.nets if net.name in reference_list]
1537-
)
1543+
_netsClip = [net for net in self.layout.nets if net.name in reference_list]
15381544

15391545
_poly = self._create_extent(
15401546
net_signals,
@@ -1549,9 +1555,8 @@ def _create_cutout_legacy(
15491555

15501556
# Create new cutout cell/design
15511557
included_nets_list = signal_list + reference_list
1552-
included_nets = convert_py_list_to_net_list(
1553-
[net.api_object for net in self.layout.nets if net.name in included_nets_list]
1554-
)
1558+
included_nets = [net for net in self.layout.nets if net.name in included_nets_list]
1559+
15551560
_cutout = self.active_cell.CutOut(included_nets, _netsClip, _poly, True)
15561561
# Analysis setups do not come over with the clipped design copy,
15571562
# so add the analysis setups from the original here.
@@ -2808,8 +2813,8 @@ def build_simulation_project(self, simulation_setup):
28082813
]
28092814
self.nets.delete(nets_to_remove)
28102815
self.logger.info("Deleting existing ports.")
2811-
map(lambda port: port.Delete(), self.layout.terminals)
2812-
map(lambda pg: pg.Delete(), self.layout.pin_groups)
2816+
map(lambda port: port.delete(), self.layout.terminals)
2817+
map(lambda pg: pg.delete(), self.layout.pin_groups)
28132818
if simulation_setup.solver_type == SolverType.Hfss3dLayout:
28142819
if simulation_setup.generate_excitations:
28152820
self.logger.info("Creating HFSS ports for signal nets.")

src/pyedb/grpc/edb_core/edb_data/hfss_simulation_setup_data.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1712,18 +1712,16 @@ def __init__(self, edb, name=None, edb_hfss_sim_setup=None):
17121712

17131713
if edb_hfss_sim_setup:
17141714
self._edb_sim_setup = edb_hfss_sim_setup
1715-
self._edb_sim_setup_info = edb_hfss_sim_setup.GetSimSetupInfo()
17161715
self._name = edb_hfss_sim_setup.name
17171716
else:
1718-
self._edb_sim_setup_info = simulation_setup.HfssSimulationSetup().create().settings
17191717
if not name:
1720-
self._edb_sim_setup_info.Name = generate_unique_name("hfss")
1718+
self._name = generate_unique_name("hfss")
17211719
else:
1722-
self._edb_sim_setup_info.Name = name
1723-
self._name = name
1720+
self._name = name
1721+
edb_hfss_sim_setup = simulation_setup.HfssSimulationSetup.create(cell=self._edb.active_cell, name=self.name)
17241722
self.hfss_solver_settings.order_basis = "mixed"
17251723

1726-
self._edb_sim_setup = HfssSimulationSetup(self._edb_sim_setup_info)
1724+
self._edb_sim_setup = HfssSimulationSetup(edb_hfss_sim_setup)
17271725
self._update_setup()
17281726

17291727
@property

src/pyedb/grpc/edb_core/edb_data/ports.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
from pyedb.grpc.edb_core.edb_data.terminals import EdgeTerminal
33
from pyedb.grpc.edb_core.edb_data.terminals import PadstackInstanceTerminal
44
from pyedb.grpc.edb_core.edb_data.terminals import Terminal
5-
from ansys.edb.utility.value import Value
5+
import ansys.edb.utility as utility
6+
import ansys.edb.database as database
67

78

89
class GapPort(EdgeTerminal):
@@ -84,6 +85,7 @@ def horizontal_extent_factor(self):
8485

8586
@horizontal_extent_factor.setter
8687
def horizontal_extent_factor(self, value):
88+
self._edb_object.product_solver_names(database.ProductIdType.HFSS_3D_LAYOUT)
8789
p = self._hfss_port_property
8890
p["Horizontal Extent Factor"] = value
8991
self._hfss_port_property = p
@@ -129,7 +131,7 @@ def deembed_length(self):
129131
@deembed_length.setter
130132
def deembed_length(self, value):
131133
p = self._edb_object.port_post_processing_prop
132-
p.deembed_length = Value(value)
134+
p.deembed_length = utility.Value(value)
133135
self._edb_object.port_post_processing_prop = p
134136

135137

@@ -165,7 +167,7 @@ def magnitude(self):
165167

166168
@magnitude.setter
167169
def magnitude(self, value):
168-
self._edb_object.source_amplitude = Value(value)
170+
self._edb_object.source_amplitude = utility.Value(value)
169171

170172
@property
171173
def phase(self):
@@ -174,7 +176,7 @@ def phase(self):
174176

175177
@phase.setter
176178
def phase(self, value):
177-
self._edb_object.source_phase = Value(value)
179+
self._edb_object.source_phase = utility.Value(value)
178180

179181

180182
class ExcitationProbes(Terminal):

src/pyedb/grpc/edb_core/edb_data/primitives_data.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,10 @@ def type(self):
9595
return f"{str_type[-1][0]}{str_type[-1][1:].lower()}"
9696
return None
9797

98+
@property
99+
def id(self):
100+
return self.primitive_object.id
101+
98102
@property
99103
def net(self):
100104
if self.net_name:

src/pyedb/grpc/edb_core/edb_data/simulation_configuration.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2232,7 +2232,6 @@ def __init__(self, filename=None, edb=None):
22322232
self._solver_type = SolverType.Hfss3dLayout
22332233
if self._filename and os.path.splitext(self._filename)[1] == ".json":
22342234
self.import_json(filename)
2235-
self._read_cfg()
22362235
self._pedb = edb
22372236
self.SOLVER_TYPE = SolverType
22382237

@@ -2395,7 +2394,7 @@ def _dict_to_json(self, dict_out, dict_in=None):
23952394
dict_out[k[1:]] = sources_out
23962395
elif k == "_dc_source_terms_to_ground":
23972396
dc_term_gnd = {}
2398-
for k2 in list(v.Keys): # pragma: no cover
2397+
for k2 in list(v.keys()): # pragma: no cover
23992398
dc_term_gnd[k2] = v[k2]
24002399
dict_out[k[1:]] = dc_term_gnd
24012400
else:

src/pyedb/grpc/edb_core/edb_data/terminals.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,16 @@ def _hfss_port_property(self, value):
5454
@property
5555
def hfss_type(self):
5656
"""HFSS port type."""
57-
return self._hfss_port_property["HFSS Type"]
57+
if self.type.name == "EDGE":
58+
return "Gap"
59+
elif self.type.name == "POINT":
60+
return "Circuit"
61+
elif self.type.name == "PADSTACK_INST":
62+
return "Coax"
63+
elif self.type.name == "BUNDLE":
64+
return "Wave"
65+
else:
66+
return "Terminal"
5867

5968
@hfss_type.setter
6069
def hfss_type(self, value):

0 commit comments

Comments
 (0)