pyedb 0.42.0__py3-none-any.whl → 0.44.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pyedb might be problematic. Click here for more details.
- pyedb/__init__.py +1 -1
- pyedb/configuration/cfg_boundaries.py +155 -72
- pyedb/configuration/cfg_components.py +1 -1
- pyedb/configuration/cfg_general.py +34 -16
- pyedb/configuration/cfg_modeler.py +162 -67
- pyedb/configuration/cfg_nets.py +33 -17
- pyedb/configuration/cfg_operations.py +63 -31
- pyedb/configuration/cfg_package_definition.py +113 -52
- pyedb/configuration/cfg_padstacks.py +611 -256
- pyedb/configuration/cfg_pin_groups.py +75 -33
- pyedb/configuration/cfg_ports_sources.py +75 -15
- pyedb/configuration/cfg_s_parameter_models.py +125 -70
- pyedb/configuration/cfg_setup.py +301 -257
- pyedb/configuration/cfg_stackup.py +166 -90
- pyedb/configuration/configuration.py +342 -209
- pyedb/dotnet/database/edb_data/design_options.py +19 -1
- pyedb/dotnet/database/edb_data/padstacks_data.py +16 -6
- pyedb/dotnet/database/geometry/polygon_data.py +4 -2
- pyedb/dotnet/database/padstack.py +6 -2
- pyedb/dotnet/database/sim_setup_data/data/sweep_data.py +63 -10
- pyedb/dotnet/database/utilities/simulation_setup.py +14 -30
- pyedb/dotnet/database/utilities/siwave_simulation_setup.py +30 -0
- pyedb/dotnet/edb.py +75 -105
- pyedb/grpc/database/components.py +1 -1
- pyedb/grpc/database/definition/component_def.py +15 -0
- pyedb/grpc/database/definition/component_pin.py +1 -1
- pyedb/grpc/database/definition/materials.py +27 -0
- pyedb/grpc/database/definition/package_def.py +20 -2
- pyedb/grpc/database/definition/padstack_def.py +5 -2
- pyedb/grpc/database/hierarchy/component.py +4 -2
- pyedb/grpc/database/hierarchy/pingroup.py +12 -8
- pyedb/grpc/database/layers/layer.py +28 -0
- pyedb/grpc/database/layers/stackup_layer.py +281 -40
- pyedb/grpc/database/layout/layout.py +12 -6
- pyedb/grpc/database/modeler.py +8 -8
- pyedb/grpc/database/primitive/bondwire.py +3 -3
- pyedb/grpc/database/primitive/circle.py +1 -1
- pyedb/grpc/database/primitive/padstack_instance.py +13 -3
- pyedb/grpc/database/primitive/path.py +2 -2
- pyedb/grpc/database/primitive/polygon.py +3 -3
- pyedb/grpc/database/primitive/primitive.py +1 -1
- pyedb/grpc/database/primitive/rectangle.py +2 -2
- pyedb/grpc/database/simulation_setup/hfss_simulation_setup.py +73 -30
- pyedb/grpc/database/source_excitations.py +7 -7
- pyedb/grpc/database/stackup.py +14 -6
- pyedb/grpc/database/terminal/bundle_terminal.py +3 -3
- pyedb/grpc/database/terminal/edge_terminal.py +2 -2
- pyedb/grpc/database/terminal/padstack_instance_terminal.py +42 -2
- pyedb/grpc/database/terminal/pingroup_terminal.py +35 -2
- pyedb/grpc/database/terminal/point_terminal.py +10 -1
- pyedb/grpc/database/terminal/terminal.py +4 -4
- pyedb/grpc/database/utility/hfss_extent_info.py +14 -10
- pyedb/grpc/edb.py +8 -8
- pyedb/misc/misc.py +13 -0
- {pyedb-0.42.0.dist-info → pyedb-0.44.0.dist-info}/METADATA +1 -1
- {pyedb-0.42.0.dist-info → pyedb-0.44.0.dist-info}/RECORD +58 -58
- {pyedb-0.42.0.dist-info → pyedb-0.44.0.dist-info}/LICENSE +0 -0
- {pyedb-0.42.0.dist-info → pyedb-0.44.0.dist-info}/WHEEL +0 -0
pyedb/configuration/cfg_setup.py
CHANGED
|
@@ -20,299 +20,343 @@
|
|
|
20
20
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
21
|
# SOFTWARE.
|
|
22
22
|
|
|
23
|
-
from pyedb.configuration.cfg_common import CfgBase
|
|
24
23
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
24
|
+
class CfgSetup:
|
|
25
|
+
"""
|
|
26
|
+
Parameters
|
|
27
|
+
----------
|
|
28
|
+
name : str, optional
|
|
29
|
+
type : str
|
|
30
|
+
Type of the setup. Optionals are ``"hfss"``, ``"siwave_ac"``, ``"siwave_dc"``.
|
|
31
|
+
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
class Common:
|
|
35
|
+
@property
|
|
36
|
+
def pyedb_obj(self):
|
|
37
|
+
return self.parent.pyedb_obj
|
|
38
|
+
|
|
39
|
+
def __init__(self, parent):
|
|
40
|
+
self.parent = parent
|
|
41
|
+
self.pedb = parent.pedb
|
|
42
|
+
|
|
43
|
+
def _retrieve_parameters_from_edb_common(self):
|
|
44
|
+
self.parent.name = self.pyedb_obj.name
|
|
45
|
+
self.parent.type = self.pyedb_obj.type
|
|
46
|
+
|
|
47
|
+
def _apply_freq_sweep(self, edb_setup):
|
|
48
|
+
for i in self.parent.freq_sweep:
|
|
49
|
+
f_set = []
|
|
50
|
+
freq_string = []
|
|
51
|
+
for f in i.get("frequencies", []):
|
|
52
|
+
if isinstance(f, dict):
|
|
53
|
+
increment = f.get("increment", f.get("points", f.get("samples", f.get("step"))))
|
|
54
|
+
f_set.append([f["distribution"], f["start"], f["stop"], increment])
|
|
55
|
+
else:
|
|
56
|
+
freq_string.append(f)
|
|
57
|
+
sweep = edb_setup.add_sweep(i["name"], frequency_set=f_set, sweep_type=i["type"])
|
|
58
|
+
if len(freq_string) > 0:
|
|
59
|
+
sweep.frequency_string = freq_string
|
|
60
|
+
|
|
61
|
+
class Grpc(Common):
|
|
62
|
+
def __init__(self, parent):
|
|
63
|
+
super().__init__(parent)
|
|
64
|
+
|
|
65
|
+
def set_parameters_to_edb(self):
|
|
66
|
+
pass
|
|
67
|
+
|
|
68
|
+
def retrieve_parameters_from_edb(self):
|
|
69
|
+
pass
|
|
70
|
+
|
|
71
|
+
class DotNet(Grpc):
|
|
72
|
+
def __init__(self, parent):
|
|
73
|
+
super().__init__(parent)
|
|
74
|
+
|
|
75
|
+
def __init__(self, pedb, pedb_obj, **kwargs):
|
|
76
|
+
self.pedb = pedb
|
|
77
|
+
self.pyedb_obj = pedb_obj
|
|
36
78
|
self.name = kwargs.get("name")
|
|
37
|
-
self.type =
|
|
38
|
-
self.frequencies = []
|
|
39
|
-
for kw in kwargs.get("frequencies", []):
|
|
40
|
-
self.frequencies.append(CfgFrequencies(**kw))
|
|
79
|
+
self.type = ""
|
|
41
80
|
|
|
81
|
+
self.freq_sweep = []
|
|
42
82
|
|
|
43
|
-
|
|
44
|
-
def __init__(self, pedb, **kwargs):
|
|
45
|
-
self._pedb = pedb
|
|
46
|
-
self.name = kwargs.get("name")
|
|
47
|
-
self.type = kwargs.get("type").lower() if kwargs.get("type") else None
|
|
83
|
+
self.freq_sweep = kwargs.get("freq_sweep", [])
|
|
48
84
|
|
|
49
|
-
self.
|
|
50
|
-
|
|
51
|
-
|
|
85
|
+
if self.pedb.grpc:
|
|
86
|
+
self.api = self.Grpc(self)
|
|
87
|
+
else:
|
|
88
|
+
self.api = self.DotNet(self)
|
|
52
89
|
|
|
53
|
-
def
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
edb_setup.add_sweep(i.name, frequency_set=f_set, sweep_type=i.type)
|
|
90
|
+
def _to_dict_setup(self):
|
|
91
|
+
return {
|
|
92
|
+
"name": self.name,
|
|
93
|
+
"type": self.type,
|
|
94
|
+
}
|
|
59
95
|
|
|
60
96
|
|
|
61
97
|
class CfgSIwaveACSetup(CfgSetup):
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
self.pi_slider_position = kwargs.get("pi_slider_position")
|
|
98
|
+
class Grpc(CfgSetup.Common):
|
|
99
|
+
def __init__(self, parent):
|
|
100
|
+
super().__init__(parent)
|
|
66
101
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
102
|
+
def set_parameters_to_edb(self):
|
|
103
|
+
if self.parent.name in self.pedb.setups:
|
|
104
|
+
raise "Setup {} already existing. Editing it.".format(self.parent.name)
|
|
70
105
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
else
|
|
106
|
+
edb_setup = self.pedb.create_siwave_syz_setup(name=self.parent.name)
|
|
107
|
+
if self.parent.si_slider_position is not None:
|
|
108
|
+
edb_setup.si_slider_position = self.parent.si_slider_position
|
|
109
|
+
else:
|
|
110
|
+
edb_setup.pi_slider_position = self.parent.pi_slider_position
|
|
111
|
+
self._apply_freq_sweep(edb_setup)
|
|
112
|
+
|
|
113
|
+
def retrieve_parameters_from_edb(self):
|
|
114
|
+
self._retrieve_parameters_from_edb_common()
|
|
115
|
+
self.parent.use_si_settings = self.pyedb_obj.use_si_settings
|
|
116
|
+
self.parent.si_slider_position = self.pyedb_obj.si_slider_position
|
|
117
|
+
self.parent.pi_slider_position = self.pyedb_obj.pi_slider_position
|
|
118
|
+
|
|
119
|
+
class DotNet(Grpc):
|
|
120
|
+
def __init__(self, parent):
|
|
121
|
+
super().__init__(parent)
|
|
122
|
+
|
|
123
|
+
def __init__(self, pedb, pyedb_obj, **kwargs):
|
|
124
|
+
super().__init__(pedb, pyedb_obj, **kwargs)
|
|
125
|
+
self.type = "siwave_ac"
|
|
126
|
+
self.use_si_settings = kwargs.get("use_si_settings", True)
|
|
127
|
+
self.si_slider_position = kwargs.get("si_slider_position", 1)
|
|
128
|
+
self.pi_slider_position = kwargs.get("pi_slider_position", 1)
|
|
129
|
+
|
|
130
|
+
def to_dict(self):
|
|
131
|
+
temp = self._to_dict_setup()
|
|
132
|
+
temp.update(
|
|
133
|
+
{
|
|
134
|
+
"use_si_settings": self.use_si_settings,
|
|
135
|
+
"si_slider_position": self.si_slider_position,
|
|
136
|
+
"pi_slider_position": self.pi_slider_position,
|
|
137
|
+
}
|
|
75
138
|
)
|
|
76
|
-
|
|
77
|
-
edb_setup = self._pedb.create_siwave_syz_setup(name=self.name, **kwargs)
|
|
78
|
-
self._apply_freq_sweep(edb_setup)
|
|
139
|
+
return temp
|
|
79
140
|
|
|
80
141
|
|
|
81
142
|
class CfgSIwaveDCSetup(CfgSetup):
|
|
82
|
-
|
|
83
|
-
|
|
143
|
+
class Grpc(CfgSetup.Common):
|
|
144
|
+
def __init__(self, parent):
|
|
145
|
+
super().__init__(parent)
|
|
146
|
+
|
|
147
|
+
def set_parameters_to_edb(self):
|
|
148
|
+
edb_setup = self.pedb.create_siwave_dc_setup(
|
|
149
|
+
name=self.parent.name, dc_slider_position=self.parent.dc_slider_position
|
|
150
|
+
)
|
|
151
|
+
edb_setup.settings.dc.dc_slider_pos = self.parent.dc_slider_position
|
|
152
|
+
edb_setup.settings.export_dc_thermal_data = self.parent.dc_ir_settings["export_dc_thermal_data"]
|
|
153
|
+
|
|
154
|
+
def retrieve_parameters_from_edb(self):
|
|
155
|
+
self._retrieve_parameters_from_edb_common()
|
|
156
|
+
self.parent.dc_slider_position = self.pyedb_obj.dc_settings.dc_slider_position
|
|
157
|
+
dc_ir_settings = dict()
|
|
158
|
+
dc_ir_settings["export_dc_thermal_data"] = self.pyedb_obj.dc_ir_settings.export_dc_thermal_data
|
|
159
|
+
self.parent.dc_ir_settings = dc_ir_settings
|
|
160
|
+
|
|
161
|
+
class DotNet(Grpc):
|
|
162
|
+
def __init__(self, parent):
|
|
163
|
+
super().__init__(parent)
|
|
164
|
+
|
|
165
|
+
def set_parameters_to_edb(self):
|
|
166
|
+
edb_setup = self.pedb.create_siwave_dc_setup(
|
|
167
|
+
name=self.parent.name, dc_slider_position=self.parent.dc_slider_position
|
|
168
|
+
)
|
|
169
|
+
edb_setup.dc_settings.dc_slider_position = self.parent.dc_slider_position
|
|
170
|
+
dc_ir_settings = self.parent.dc_ir_settings
|
|
171
|
+
edb_setup.dc_ir_settings.export_dc_thermal_data = dc_ir_settings["export_dc_thermal_data"]
|
|
172
|
+
|
|
173
|
+
def __init__(self, pedb, pyedb_obj, **kwargs):
|
|
174
|
+
super().__init__(pedb, pyedb_obj, **kwargs)
|
|
175
|
+
self.type = "siwave_dc"
|
|
84
176
|
self.dc_slider_position = kwargs.get("dc_slider_position")
|
|
85
|
-
self.dc_ir_settings =
|
|
86
|
-
self.freq_sweep = None
|
|
177
|
+
self.dc_ir_settings = kwargs.get("dc_ir_settings", {})
|
|
87
178
|
|
|
88
|
-
def
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
edb_setup.dc_settings.dc_slider_position = v
|
|
93
|
-
else:
|
|
94
|
-
setattr(edb_setup.dc_ir_settings, k, v)
|
|
179
|
+
def to_dict(self):
|
|
180
|
+
temp = self._to_dict_setup()
|
|
181
|
+
temp.update({"dc_slider_position": self.dc_slider_position, "dc_ir_settings": self.dc_ir_settings})
|
|
182
|
+
return temp
|
|
95
183
|
|
|
96
184
|
|
|
97
185
|
class CfgHFSSSetup(CfgSetup):
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
self.f_adapt = kwargs.get("f_adapt")
|
|
102
|
-
self.max_num_passes = kwargs.get("max_num_passes")
|
|
103
|
-
self.max_mag_delta_s = kwargs.get("max_mag_delta_s")
|
|
186
|
+
class Grpc(CfgSetup.Common):
|
|
187
|
+
def __init__(self, parent):
|
|
188
|
+
super().__init__(parent)
|
|
104
189
|
|
|
105
|
-
self
|
|
106
|
-
|
|
107
|
-
|
|
190
|
+
def set_parameters_to_edb(self):
|
|
191
|
+
if self.parent.name in self.pedb.setups:
|
|
192
|
+
raise "Setup {} already existing. Editing it.".format(self.parent.name)
|
|
108
193
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
edb_setup = self._pedb.create_hfss_setup(self.name)
|
|
114
|
-
edb_setup.set_solution_single_frequency(self.f_adapt, self.max_num_passes, self.max_mag_delta_s)
|
|
115
|
-
|
|
116
|
-
self._apply_freq_sweep(edb_setup)
|
|
117
|
-
|
|
118
|
-
for i in self.mesh_operations:
|
|
119
|
-
edb_setup.add_length_mesh_operation(
|
|
120
|
-
net_layer_list=i.nets_layers_list,
|
|
121
|
-
name=i.name,
|
|
122
|
-
# max_elements=i.max_elements,
|
|
123
|
-
max_length=i.max_length,
|
|
124
|
-
# restrict_elements=i.restrict_max_elements,
|
|
125
|
-
restrict_length=i.restrict_length,
|
|
126
|
-
refine_inside=i.refine_inside,
|
|
127
|
-
# mesh_region=i.mesh_region
|
|
194
|
+
edb_setup = self.pedb.create_hfss_setup(self.parent.name)
|
|
195
|
+
edb_setup.set_solution_single_frequency(
|
|
196
|
+
self.parent.f_adapt, self.parent.max_num_passes, self.parent.max_mag_delta_s
|
|
128
197
|
)
|
|
129
198
|
|
|
199
|
+
self._apply_freq_sweep(edb_setup)
|
|
200
|
+
|
|
201
|
+
for i in self.parent.mesh_operations:
|
|
202
|
+
edb_setup.add_length_mesh_operation(
|
|
203
|
+
name=i["name"],
|
|
204
|
+
max_elements=i.get("max_elements", 1000),
|
|
205
|
+
max_length=i.get("max_length", "1mm"),
|
|
206
|
+
restrict_length=i.get("restrict_length", True),
|
|
207
|
+
refine_inside=i.get("refine_inside", False),
|
|
208
|
+
# mesh_region=i.get(mesh_region),
|
|
209
|
+
net_layer_list=i.get("nets_layers_list", {}),
|
|
210
|
+
)
|
|
130
211
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
212
|
+
def retrieve_parameters_from_edb(self):
|
|
213
|
+
self._retrieve_parameters_from_edb_common()
|
|
214
|
+
single_frequency_adaptive_solution = self.pyedb_obj.settings.general.single_frequency_adaptive_solution
|
|
215
|
+
self.parent.f_adapt = single_frequency_adaptive_solution.adaptive_frequency
|
|
216
|
+
self.parent.max_num_passes = single_frequency_adaptive_solution.max_passes
|
|
217
|
+
self.parent.max_mag_delta_s = float(single_frequency_adaptive_solution.max_delta)
|
|
218
|
+
self.parent.freq_sweep = []
|
|
219
|
+
for sw in self.pyedb_obj.sweep_data:
|
|
220
|
+
self.parent.freq_sweep.append({"name": sw.name, "type": sw.type, "frequencies": sw.frequency_string})
|
|
221
|
+
|
|
222
|
+
self.parent.mesh_operations = []
|
|
223
|
+
from ansys.edb.core.simulation_setup.mesh_operation import (
|
|
224
|
+
LengthMeshOperation as GrpcLengthMeshOperation,
|
|
225
|
+
)
|
|
135
226
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
227
|
+
for mesh_op in self.pyedb_obj.mesh_operations:
|
|
228
|
+
if isinstance(mesh_op, GrpcLengthMeshOperation):
|
|
229
|
+
mop_type = "length"
|
|
230
|
+
else:
|
|
231
|
+
mop_type = "skin"
|
|
232
|
+
self.parent.mesh_operations.append(
|
|
233
|
+
{
|
|
234
|
+
"name": mesh_op.name,
|
|
235
|
+
"type": mop_type,
|
|
236
|
+
"max_elements": mesh_op.max_elements,
|
|
237
|
+
"max_length": mesh_op.max_length,
|
|
238
|
+
"restrict_length": mesh_op.restrict_max_length,
|
|
239
|
+
"refine_inside": mesh_op.refine_inside,
|
|
240
|
+
"nets_layers_list": mesh_op.net_layer_info,
|
|
241
|
+
}
|
|
242
|
+
)
|
|
143
243
|
|
|
244
|
+
class DotNet(Grpc):
|
|
245
|
+
def __init__(self, parent):
|
|
246
|
+
super().__init__(parent)
|
|
247
|
+
|
|
248
|
+
def retrieve_parameters_from_edb(self):
|
|
249
|
+
self._retrieve_parameters_from_edb_common()
|
|
250
|
+
adaptive_frequency_data_list = list(self.pyedb_obj.adaptive_settings.adaptive_frequency_data_list)[0]
|
|
251
|
+
self.parent.f_adapt = adaptive_frequency_data_list.adaptive_frequency
|
|
252
|
+
self.parent.max_num_passes = adaptive_frequency_data_list.max_passes
|
|
253
|
+
self.parent.max_mag_delta_s = adaptive_frequency_data_list.max_delta
|
|
254
|
+
self.parent.freq_sweep = []
|
|
255
|
+
for name, sw in self.pyedb_obj.sweeps.items():
|
|
256
|
+
self.parent.freq_sweep.append({"name": name, "type": sw.type, "frequencies": sw.frequency_string})
|
|
257
|
+
|
|
258
|
+
self.parent.mesh_operations = []
|
|
259
|
+
for name, mop in self.pyedb_obj.mesh_operations.items():
|
|
260
|
+
self.parent.mesh_operations.append(
|
|
261
|
+
{
|
|
262
|
+
"name": name,
|
|
263
|
+
"type": mop.type,
|
|
264
|
+
"max_elements": mop.max_elements,
|
|
265
|
+
"max_length": mop.max_length,
|
|
266
|
+
"restrict_length": mop.restrict_length,
|
|
267
|
+
"refine_inside": mop.refine_inside,
|
|
268
|
+
"nets_layers_list": mop.nets_layers_list,
|
|
269
|
+
}
|
|
270
|
+
)
|
|
144
271
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
272
|
+
def __init__(self, pedb, pyedb_obj, **kwargs):
|
|
273
|
+
super().__init__(pedb, pyedb_obj, **kwargs)
|
|
274
|
+
self.type = "hfss"
|
|
275
|
+
self.f_adapt = kwargs.get("f_adapt")
|
|
276
|
+
self.max_num_passes = kwargs.get("max_num_passes")
|
|
277
|
+
self.max_mag_delta_s = kwargs.get("max_mag_delta_s")
|
|
148
278
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
279
|
+
self.mesh_operations = kwargs.get("mesh_operations", [])
|
|
280
|
+
|
|
281
|
+
def to_dict(self):
|
|
282
|
+
temp = self._to_dict_setup()
|
|
283
|
+
temp.update(
|
|
284
|
+
{
|
|
285
|
+
"f_adapt": self.f_adapt,
|
|
286
|
+
"max_num_passes": self.max_num_passes,
|
|
287
|
+
"max_mag_delta_s": self.max_mag_delta_s,
|
|
288
|
+
"mesh_operations": self.mesh_operations,
|
|
289
|
+
"freq_sweep": self.freq_sweep,
|
|
290
|
+
}
|
|
291
|
+
)
|
|
292
|
+
return temp
|
|
154
293
|
|
|
155
294
|
|
|
156
295
|
class CfgSetups:
|
|
296
|
+
class Grpc:
|
|
297
|
+
def __init__(self, parent):
|
|
298
|
+
self.parent = parent
|
|
299
|
+
self._pedb = parent.pedb
|
|
300
|
+
|
|
301
|
+
def retrieve_parameters_from_edb(self):
|
|
302
|
+
self.parent.setups = []
|
|
303
|
+
for _, setup in self._pedb.setups.items():
|
|
304
|
+
if setup.type.name.lower() == "hfss":
|
|
305
|
+
hfss = CfgHFSSSetup(self._pedb, setup)
|
|
306
|
+
hfss.api.retrieve_parameters_from_edb()
|
|
307
|
+
self.parent.setups.append(hfss)
|
|
308
|
+
elif setup.type.name.lower() == "si_wave_dcir":
|
|
309
|
+
siwave_dc = CfgSIwaveDCSetup(self._pedb, setup)
|
|
310
|
+
siwave_dc.api.retrieve_parameters_from_edb()
|
|
311
|
+
self.parent.setups.append(siwave_dc)
|
|
312
|
+
elif setup.type.name.lower() == "si_wave":
|
|
313
|
+
siwave_ac = CfgSIwaveACSetup(self._pedb, setup)
|
|
314
|
+
siwave_ac.api.retrieve_parameters_from_edb()
|
|
315
|
+
self.parent.setups.append(siwave_ac)
|
|
316
|
+
elif setup.type.name.lower() == "raptor_x":
|
|
317
|
+
pass
|
|
318
|
+
|
|
319
|
+
class DotNet(Grpc):
|
|
320
|
+
def __init__(self, parent):
|
|
321
|
+
super().__init__(parent)
|
|
322
|
+
|
|
323
|
+
def retrieve_parameters_from_edb(self):
|
|
324
|
+
self.parent.setups = []
|
|
325
|
+
for _, setup in self._pedb.setups.items():
|
|
326
|
+
if setup.type == "hfss":
|
|
327
|
+
hfss = CfgHFSSSetup(self._pedb, setup)
|
|
328
|
+
hfss.api.retrieve_parameters_from_edb()
|
|
329
|
+
self.parent.setups.append(hfss)
|
|
330
|
+
elif setup.type == "siwave_dc":
|
|
331
|
+
siwave_dc = CfgSIwaveDCSetup(self._pedb, setup)
|
|
332
|
+
siwave_dc.api.retrieve_parameters_from_edb()
|
|
333
|
+
self.parent.setups.append(siwave_dc)
|
|
334
|
+
elif setup.type == "siwave_ac":
|
|
335
|
+
siwave_ac = CfgSIwaveACSetup(self._pedb, setup)
|
|
336
|
+
siwave_ac.api.retrieve_parameters_from_edb()
|
|
337
|
+
self.parent.setups.append(siwave_ac)
|
|
338
|
+
|
|
157
339
|
def __init__(self, pedb, setups_data):
|
|
158
|
-
self.
|
|
340
|
+
self.pedb = pedb
|
|
159
341
|
self.setups = []
|
|
342
|
+
if self.pedb.grpc:
|
|
343
|
+
self.api = self.Grpc(self)
|
|
344
|
+
else:
|
|
345
|
+
self.api = self.DotNet(self)
|
|
160
346
|
for stp in setups_data:
|
|
161
|
-
if stp
|
|
162
|
-
self.setups.append(CfgHFSSSetup(self.
|
|
163
|
-
elif stp
|
|
164
|
-
self.setups.append(CfgSIwaveACSetup(self.
|
|
165
|
-
elif stp
|
|
166
|
-
self.setups.append(CfgSIwaveDCSetup(self.
|
|
347
|
+
if stp["type"].lower() == "hfss":
|
|
348
|
+
self.setups.append(CfgHFSSSetup(self.pedb, None, **stp))
|
|
349
|
+
elif stp["type"].lower() in ["siwave_ac", "siwave_syz"]:
|
|
350
|
+
self.setups.append(CfgSIwaveACSetup(self.pedb, None, **stp))
|
|
351
|
+
elif stp["type"].lower() == "siwave_dc":
|
|
352
|
+
self.setups.append(CfgSIwaveDCSetup(self.pedb, None, **stp))
|
|
167
353
|
|
|
168
354
|
def apply(self):
|
|
169
355
|
for s in self.setups:
|
|
170
|
-
s.
|
|
171
|
-
|
|
172
|
-
def get_data_from_db(self):
|
|
173
|
-
setups = []
|
|
174
|
-
for _, s in self._pedb.setups.items():
|
|
175
|
-
if float(self._pedb.edbversion) < 2025.1:
|
|
176
|
-
if not s.type == "hfss":
|
|
177
|
-
self._pedb.logger.warning("Only HFSS setups are exported in 2024 R2 and earlier version.")
|
|
178
|
-
continue
|
|
179
|
-
|
|
180
|
-
stp = {}
|
|
181
|
-
if self._pedb.grpc:
|
|
182
|
-
from ansys.edb.core.simulation_setup.mesh_operation import (
|
|
183
|
-
LengthMeshOperation as GrpcLengthMeshOperation,
|
|
184
|
-
)
|
|
356
|
+
s.api.set_parameters_to_edb()
|
|
185
357
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
elif p_name == "type":
|
|
192
|
-
stp[p_name] = s.type.name.lower()
|
|
193
|
-
elif p_name == "f_adapt":
|
|
194
|
-
stp[p_name] = s.settings.general.single_frequency_adaptive_solution.adaptive_frequency
|
|
195
|
-
elif p_name == "max_num_passes":
|
|
196
|
-
stp[p_name] = s.settings.general.single_frequency_adaptive_solution.max_passes
|
|
197
|
-
elif p_name == "max_mag_delta_s":
|
|
198
|
-
stp[p_name] = s.settings.general.single_frequency_adaptive_solution.max_delta
|
|
199
|
-
elif p_name == "freq_sweep":
|
|
200
|
-
f_sweep = []
|
|
201
|
-
for sw in s.sweep_data:
|
|
202
|
-
sweep_data = {}
|
|
203
|
-
for sw_p_name in CfgSweepData().__dict__:
|
|
204
|
-
if sw_p_name == "frequencies":
|
|
205
|
-
pass # Frequencies cannot be read from EDB
|
|
206
|
-
else:
|
|
207
|
-
sweep_data[sw_p_name] = getattr(sw, sw_p_name)
|
|
208
|
-
f_sweep.append(sweep_data)
|
|
209
|
-
stp["freq_sweep"] = f_sweep
|
|
210
|
-
elif p_name == "mesh_operations":
|
|
211
|
-
mops = []
|
|
212
|
-
for i in s.mesh_operations:
|
|
213
|
-
mop = {}
|
|
214
|
-
for mop_p_name in CfgLengthMeshOperation().__dict__:
|
|
215
|
-
if mop_p_name == "type":
|
|
216
|
-
if isinstance(i, GrpcLengthMeshOperation):
|
|
217
|
-
mop[mop_p_name] = "length"
|
|
218
|
-
elif mop_p_name == "nets_layers_list":
|
|
219
|
-
mop[mop_p_name] = i.__dict__["_net_layer_info"]
|
|
220
|
-
elif mop_p_name == "restrict_length":
|
|
221
|
-
mop[mop_p_name] = i.__dict__["_restrict_max_length"]
|
|
222
|
-
else:
|
|
223
|
-
mop[mop_p_name] = i.__dict__[f"_{mop_p_name}"]
|
|
224
|
-
mops.append(mop)
|
|
225
|
-
stp["mesh_operations"] = mops
|
|
226
|
-
else:
|
|
227
|
-
stp[p_name] = getattr(s, p_name)
|
|
228
|
-
|
|
229
|
-
elif s_type == "siwave_ac":
|
|
230
|
-
for p_name in CfgSIwaveACSetup(self._pedb).__dict__:
|
|
231
|
-
if p_name.startswith("_"):
|
|
232
|
-
continue
|
|
233
|
-
elif p_name == "freq_sweep":
|
|
234
|
-
pass # Bug in EDB API
|
|
235
|
-
else:
|
|
236
|
-
stp[p_name] = getattr(s, p_name)
|
|
237
|
-
elif s_type == "siwave_dc":
|
|
238
|
-
for p_name in CfgSIwaveDCSetup(self._pedb).__dict__:
|
|
239
|
-
if p_name.startswith("_"):
|
|
240
|
-
continue
|
|
241
|
-
elif p_name == "freq_sweep":
|
|
242
|
-
pass
|
|
243
|
-
elif p_name == "dc_ir_settings":
|
|
244
|
-
dc_ir_s = {}
|
|
245
|
-
for dcir_p_name in CfgDcIrSettings().__dict__:
|
|
246
|
-
dc_ir_s[dcir_p_name] = getattr(s.dc_ir_settings, dcir_p_name)
|
|
247
|
-
stp["dc_ir_settings"] = dc_ir_s
|
|
248
|
-
elif p_name == "dc_slider_position":
|
|
249
|
-
stp[p_name] = getattr(s.dc_settings, p_name)
|
|
250
|
-
else:
|
|
251
|
-
stp[p_name] = getattr(s, p_name)
|
|
252
|
-
else:
|
|
253
|
-
for _, s in self._pedb.setups.items():
|
|
254
|
-
if float(self._pedb.edbversion) < 2025.1:
|
|
255
|
-
if not s.type == "hfss":
|
|
256
|
-
self._pedb.logger.warning("Only HFSS setups are exported in 2024 R2 and earlier version.")
|
|
257
|
-
continue
|
|
258
|
-
if s.type == "hfss":
|
|
259
|
-
for p_name in CfgHFSSSetup(self._pedb).__dict__:
|
|
260
|
-
if p_name.startswith("_"):
|
|
261
|
-
continue
|
|
262
|
-
elif p_name == "type":
|
|
263
|
-
stp[p_name] = s.type
|
|
264
|
-
elif p_name == "f_adapt":
|
|
265
|
-
stp[p_name] = list(s.adaptive_settings.adaptive_frequency_data_list)[
|
|
266
|
-
0
|
|
267
|
-
].adaptive_frequency
|
|
268
|
-
elif p_name == "max_num_passes":
|
|
269
|
-
stp[p_name] = list(s.adaptive_settings.adaptive_frequency_data_list)[0].max_passes
|
|
270
|
-
elif p_name == "max_mag_delta_s":
|
|
271
|
-
stp[p_name] = list(s.adaptive_settings.adaptive_frequency_data_list)[0].max_delta
|
|
272
|
-
elif p_name == "freq_sweep":
|
|
273
|
-
f_sweep = []
|
|
274
|
-
for sw in s.sweeps.items():
|
|
275
|
-
sweep_data = {}
|
|
276
|
-
for sw_p_name in CfgSweepData().__dict__:
|
|
277
|
-
if sw_p_name == "frequencies":
|
|
278
|
-
pass # Frequencies cannot be read from EDB
|
|
279
|
-
else:
|
|
280
|
-
sweep_data[sw_p_name] = getattr(sw[1], sw_p_name)
|
|
281
|
-
f_sweep.append(sweep_data)
|
|
282
|
-
stp["freq_sweep"] = f_sweep
|
|
283
|
-
elif p_name == "mesh_operations":
|
|
284
|
-
mops = []
|
|
285
|
-
for _, i in s.mesh_operations.items():
|
|
286
|
-
mop = {}
|
|
287
|
-
for mop_p_name in CfgLengthMeshOperation().__dict__:
|
|
288
|
-
mop[mop_p_name] = getattr(i, mop_p_name)
|
|
289
|
-
mops.append(mop)
|
|
290
|
-
stp["mesh_operations"] = mops
|
|
291
|
-
else:
|
|
292
|
-
stp[p_name] = getattr(s, p_name)
|
|
293
|
-
|
|
294
|
-
elif s.type == "siwave_ac":
|
|
295
|
-
for p_name in CfgSIwaveACSetup(self._pedb).__dict__:
|
|
296
|
-
if p_name.startswith("_"):
|
|
297
|
-
continue
|
|
298
|
-
elif p_name == "freq_sweep":
|
|
299
|
-
pass # Bug in EDB API
|
|
300
|
-
else:
|
|
301
|
-
stp[p_name] = getattr(s, p_name)
|
|
302
|
-
elif s.type == "siwave_dc":
|
|
303
|
-
for p_name in CfgSIwaveDCSetup(self._pedb).__dict__:
|
|
304
|
-
if p_name.startswith("_"):
|
|
305
|
-
continue
|
|
306
|
-
elif p_name == "freq_sweep":
|
|
307
|
-
pass
|
|
308
|
-
elif p_name == "dc_ir_settings":
|
|
309
|
-
dc_ir_s = {}
|
|
310
|
-
for dcir_p_name in CfgDcIrSettings().__dict__:
|
|
311
|
-
dc_ir_s[dcir_p_name] = getattr(s.dc_ir_settings, dcir_p_name)
|
|
312
|
-
stp["dc_ir_settings"] = dc_ir_s
|
|
313
|
-
elif p_name == "dc_slider_position":
|
|
314
|
-
stp[p_name] = getattr(s.dc_settings, p_name)
|
|
315
|
-
else:
|
|
316
|
-
stp[p_name] = getattr(s, p_name)
|
|
317
|
-
setups.append(stp)
|
|
318
|
-
return setups
|
|
358
|
+
def to_dict(self):
|
|
359
|
+
return [i.to_dict() for i in self.setups]
|
|
360
|
+
|
|
361
|
+
def retrieve_parameters_from_edb(self):
|
|
362
|
+
self.api.retrieve_parameters_from_edb()
|