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.

Files changed (58) hide show
  1. pyedb/__init__.py +1 -1
  2. pyedb/configuration/cfg_boundaries.py +155 -72
  3. pyedb/configuration/cfg_components.py +1 -1
  4. pyedb/configuration/cfg_general.py +34 -16
  5. pyedb/configuration/cfg_modeler.py +162 -67
  6. pyedb/configuration/cfg_nets.py +33 -17
  7. pyedb/configuration/cfg_operations.py +63 -31
  8. pyedb/configuration/cfg_package_definition.py +113 -52
  9. pyedb/configuration/cfg_padstacks.py +611 -256
  10. pyedb/configuration/cfg_pin_groups.py +75 -33
  11. pyedb/configuration/cfg_ports_sources.py +75 -15
  12. pyedb/configuration/cfg_s_parameter_models.py +125 -70
  13. pyedb/configuration/cfg_setup.py +301 -257
  14. pyedb/configuration/cfg_stackup.py +166 -90
  15. pyedb/configuration/configuration.py +342 -209
  16. pyedb/dotnet/database/edb_data/design_options.py +19 -1
  17. pyedb/dotnet/database/edb_data/padstacks_data.py +16 -6
  18. pyedb/dotnet/database/geometry/polygon_data.py +4 -2
  19. pyedb/dotnet/database/padstack.py +6 -2
  20. pyedb/dotnet/database/sim_setup_data/data/sweep_data.py +63 -10
  21. pyedb/dotnet/database/utilities/simulation_setup.py +14 -30
  22. pyedb/dotnet/database/utilities/siwave_simulation_setup.py +30 -0
  23. pyedb/dotnet/edb.py +75 -105
  24. pyedb/grpc/database/components.py +1 -1
  25. pyedb/grpc/database/definition/component_def.py +15 -0
  26. pyedb/grpc/database/definition/component_pin.py +1 -1
  27. pyedb/grpc/database/definition/materials.py +27 -0
  28. pyedb/grpc/database/definition/package_def.py +20 -2
  29. pyedb/grpc/database/definition/padstack_def.py +5 -2
  30. pyedb/grpc/database/hierarchy/component.py +4 -2
  31. pyedb/grpc/database/hierarchy/pingroup.py +12 -8
  32. pyedb/grpc/database/layers/layer.py +28 -0
  33. pyedb/grpc/database/layers/stackup_layer.py +281 -40
  34. pyedb/grpc/database/layout/layout.py +12 -6
  35. pyedb/grpc/database/modeler.py +8 -8
  36. pyedb/grpc/database/primitive/bondwire.py +3 -3
  37. pyedb/grpc/database/primitive/circle.py +1 -1
  38. pyedb/grpc/database/primitive/padstack_instance.py +13 -3
  39. pyedb/grpc/database/primitive/path.py +2 -2
  40. pyedb/grpc/database/primitive/polygon.py +3 -3
  41. pyedb/grpc/database/primitive/primitive.py +1 -1
  42. pyedb/grpc/database/primitive/rectangle.py +2 -2
  43. pyedb/grpc/database/simulation_setup/hfss_simulation_setup.py +73 -30
  44. pyedb/grpc/database/source_excitations.py +7 -7
  45. pyedb/grpc/database/stackup.py +14 -6
  46. pyedb/grpc/database/terminal/bundle_terminal.py +3 -3
  47. pyedb/grpc/database/terminal/edge_terminal.py +2 -2
  48. pyedb/grpc/database/terminal/padstack_instance_terminal.py +42 -2
  49. pyedb/grpc/database/terminal/pingroup_terminal.py +35 -2
  50. pyedb/grpc/database/terminal/point_terminal.py +10 -1
  51. pyedb/grpc/database/terminal/terminal.py +4 -4
  52. pyedb/grpc/database/utility/hfss_extent_info.py +14 -10
  53. pyedb/grpc/edb.py +8 -8
  54. pyedb/misc/misc.py +13 -0
  55. {pyedb-0.42.0.dist-info → pyedb-0.44.0.dist-info}/METADATA +1 -1
  56. {pyedb-0.42.0.dist-info → pyedb-0.44.0.dist-info}/RECORD +58 -58
  57. {pyedb-0.42.0.dist-info → pyedb-0.44.0.dist-info}/LICENSE +0 -0
  58. {pyedb-0.42.0.dist-info → pyedb-0.44.0.dist-info}/WHEEL +0 -0
@@ -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
- class CfgFrequencies(CfgBase):
27
- def __init__(self, **kwargs):
28
- self.distribution = kwargs.get("distribution").replace(" ", "_") if kwargs.get("distribution") else None
29
- self.start = kwargs.get("start")
30
- self.stop = kwargs.get("stop")
31
- self.increment = kwargs.get("increment", kwargs.get("points", kwargs.get("samples", kwargs.get("step"))))
32
-
33
-
34
- class CfgSweepData(CfgBase):
35
- def __init__(self, **kwargs):
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 = kwargs.get("type").lower() if kwargs.get("type") else None
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
- class CfgSetup(CfgBase):
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.freq_sweep = []
50
- for i in kwargs.get("freq_sweep", []):
51
- self.freq_sweep.append(CfgSweepData(**i))
85
+ if self.pedb.grpc:
86
+ self.api = self.Grpc(self)
87
+ else:
88
+ self.api = self.DotNet(self)
52
89
 
53
- def _apply_freq_sweep(self, edb_setup):
54
- for i in self.freq_sweep:
55
- f_set = []
56
- for f in i.frequencies:
57
- f_set.append([f.distribution, f.start, f.stop, f.increment])
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
- def __init__(self, pedb, **kwargs):
63
- super().__init__(pedb, **kwargs)
64
- self.si_slider_position = kwargs.get("si_slider_position")
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
- def apply(self):
68
- if self.name in self._pedb.setups:
69
- raise "Setup {} already existing. Editing it.".format(self.name)
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
- kwargs = (
72
- {"si_slider_position": self.si_slider_position}
73
- if self.si_slider_position is not None
74
- else {"pi_slider_position": self.pi_slider_position}
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
- def __init__(self, pedb, **kwargs):
83
- super().__init__(pedb, **kwargs)
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 = CfgDcIrSettings(**kwargs.get("dc_ir_settings", {}))
86
- self.freq_sweep = None
177
+ self.dc_ir_settings = kwargs.get("dc_ir_settings", {})
87
178
 
88
- def apply(self):
89
- edb_setup = self._pedb.create_siwave_dc_setup(name=self.name, dc_slider_position=self.dc_slider_position)
90
- for k, v in self.dc_ir_settings.get_attributes().items():
91
- if k == "dc_slider_postion":
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
- def __init__(self, pedb, **kwargs):
99
- super().__init__(pedb, **kwargs)
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.mesh_operations = []
106
- for i in kwargs.get("mesh_operations", []):
107
- self.mesh_operations.append(CfgLengthMeshOperation(**i))
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
- def apply(self):
110
- if self.name in self._pedb.setups:
111
- raise "Setup {} already existing. Editing it.".format(self.name)
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
- class CfgDcIrSettings(CfgBase):
132
- def __init__(self, **kwargs):
133
- self.export_dc_thermal_data = kwargs.get("export_dc_thermal_data")
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
- class CfgMeshOperation(CfgBase):
137
- def __init__(self, **kwargs):
138
- self.name = kwargs.get("name")
139
- self.type = kwargs.get("type")
140
- # self.mesh_region = kwargs.get("mesh_region")
141
- self.nets_layers_list = kwargs.get("nets_layers_list", {})
142
- self.refine_inside = kwargs.get("refine_inside", False)
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
- class CfgLengthMeshOperation(CfgMeshOperation):
146
- def __init__(self, **kwargs):
147
- super().__init__(**kwargs)
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
- # waiting bug review
150
- # self.restrict_max_elements = kwargs.get("restrict_max_elements", True)
151
- # self.max_elements = kwargs.get("max_elements", 1000)
152
- self.restrict_length = kwargs.get("restrict_length", True)
153
- self.max_length = kwargs.get("max_length", "1mm")
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._pedb = pedb
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.get("type").lower() == "hfss":
162
- self.setups.append(CfgHFSSSetup(self._pedb, **stp))
163
- elif stp.get("type").lower() in ["siwave_ac", "siwave_syz"]:
164
- self.setups.append(CfgSIwaveACSetup(self._pedb, **stp))
165
- elif stp.get("type").lower() == "siwave_dc":
166
- self.setups.append(CfgSIwaveDCSetup(self._pedb, **stp))
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.apply()
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
- s_type = s.type.name.lower()
187
- if s_type == "hfss":
188
- for p_name in CfgHFSSSetup(self._pedb).__dict__:
189
- if p_name.startswith("_"):
190
- continue
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()