pyedb 0.42.0__py3-none-any.whl → 0.43.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.

@@ -20,299 +20,270 @@
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.dc_settings.dc_slider_position = self.parent.dc_slider_position
152
+ dc_ir_settings = self.parent.dc_ir_settings
153
+ edb_setup.dc_ir_settings.export_dc_thermal_data = dc_ir_settings["export_dc_thermal_data"]
154
+
155
+ def retrieve_parameters_from_edb(self):
156
+ self._retrieve_parameters_from_edb_common()
157
+ self.parent.dc_slider_position = self.pyedb_obj.dc_settings.dc_slider_position
158
+ dc_ir_settings = dict()
159
+ dc_ir_settings["export_dc_thermal_data"] = self.pyedb_obj.dc_ir_settings.export_dc_thermal_data
160
+ self.parent.dc_ir_settings = dc_ir_settings
161
+
162
+ class DotNet(Grpc):
163
+ def __init__(self, parent):
164
+ super().__init__(parent)
165
+
166
+ def __init__(self, pedb, pyedb_obj, **kwargs):
167
+ super().__init__(pedb, pyedb_obj, **kwargs)
168
+ self.type = "siwave_dc"
84
169
  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
170
+ self.dc_ir_settings = kwargs.get("dc_ir_settings", {})
87
171
 
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)
172
+ def to_dict(self):
173
+ temp = self._to_dict_setup()
174
+ temp.update({"dc_slider_position": self.dc_slider_position, "dc_ir_settings": self.dc_ir_settings})
175
+ return temp
95
176
 
96
177
 
97
178
  class CfgHFSSSetup(CfgSetup):
98
- def __init__(self, pedb, **kwargs):
99
- super().__init__(pedb, **kwargs)
179
+ class Grpc(CfgSetup.Common):
180
+ def __init__(self, parent):
181
+ super().__init__(parent)
100
182
 
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")
183
+ def set_parameters_to_edb(self):
184
+ if self.parent.name in self.pedb.setups:
185
+ raise "Setup {} already existing. Editing it.".format(self.parent.name)
104
186
 
105
- self.mesh_operations = []
106
- for i in kwargs.get("mesh_operations", []):
107
- self.mesh_operations.append(CfgLengthMeshOperation(**i))
108
-
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
187
+ edb_setup = self.pedb.create_hfss_setup(self.parent.name)
188
+ edb_setup.set_solution_single_frequency(
189
+ self.parent.f_adapt, self.parent.max_num_passes, self.parent.max_mag_delta_s
128
190
  )
129
191
 
192
+ self._apply_freq_sweep(edb_setup)
193
+
194
+ for i in self.parent.mesh_operations:
195
+ edb_setup.add_length_mesh_operation(
196
+ name=i["name"],
197
+ max_elements=i.get("max_elements", 1000),
198
+ max_length=i.get("max_length", "1mm"),
199
+ restrict_length=i.get("restrict_length", True),
200
+ refine_inside=i.get("refine_inside", False),
201
+ # mesh_region=i.get(mesh_region),
202
+ net_layer_list=i.get("nets_layers_list", {}),
203
+ )
130
204
 
131
- class CfgDcIrSettings(CfgBase):
132
- def __init__(self, **kwargs):
133
- self.export_dc_thermal_data = kwargs.get("export_dc_thermal_data")
134
-
135
-
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)
205
+ def retrieve_parameters_from_edb(self):
206
+ self._retrieve_parameters_from_edb_common()
207
+ adaptive_frequency_data_list = list(self.pyedb_obj.adaptive_settings.adaptive_frequency_data_list)[0]
208
+ self.parent.f_adapt = adaptive_frequency_data_list.adaptive_frequency
209
+ self.parent.max_num_passes = adaptive_frequency_data_list.max_passes
210
+ self.parent.max_mag_delta_s = adaptive_frequency_data_list.max_delta
211
+ self.parent.freq_sweep = []
212
+ for name, sw in self.pyedb_obj.sweeps.items():
213
+ self.parent.freq_sweep.append({"name": name, "type": sw.type, "frequencies": sw.frequency_string})
214
+
215
+ self.parent.mesh_operations = []
216
+ for name, mop in self.pyedb_obj.mesh_operations.items():
217
+ self.parent.mesh_operations.append(
218
+ {
219
+ "name": name,
220
+ "type": mop.type,
221
+ "max_elements": mop.max_elements,
222
+ "max_length": mop.max_length,
223
+ "restrict_length": mop.restrict_length,
224
+ "refine_inside": mop.refine_inside,
225
+ "nets_layers_list": mop.nets_layers_list,
226
+ }
227
+ )
143
228
 
229
+ class DotNet(Grpc):
230
+ def __init__(self, parent):
231
+ super().__init__(parent)
144
232
 
145
- class CfgLengthMeshOperation(CfgMeshOperation):
146
- def __init__(self, **kwargs):
147
- super().__init__(**kwargs)
233
+ def __init__(self, pedb, pyedb_obj, **kwargs):
234
+ super().__init__(pedb, pyedb_obj, **kwargs)
235
+ self.type = "hfss"
236
+ self.f_adapt = kwargs.get("f_adapt")
237
+ self.max_num_passes = kwargs.get("max_num_passes")
238
+ self.max_mag_delta_s = kwargs.get("max_mag_delta_s")
148
239
 
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")
240
+ self.mesh_operations = kwargs.get("mesh_operations", [])
241
+
242
+ def to_dict(self):
243
+ temp = self._to_dict_setup()
244
+ temp.update(
245
+ {
246
+ "f_adapt": self.f_adapt,
247
+ "max_num_passes": self.max_num_passes,
248
+ "max_mag_delta_s": self.max_mag_delta_s,
249
+ "mesh_operations": self.mesh_operations,
250
+ "freq_sweep": self.freq_sweep,
251
+ }
252
+ )
253
+ return temp
154
254
 
155
255
 
156
256
  class CfgSetups:
157
257
  def __init__(self, pedb, setups_data):
158
- self._pedb = pedb
258
+ self.pedb = pedb
159
259
  self.setups = []
160
260
  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))
261
+ if stp["type"].lower() == "hfss":
262
+ self.setups.append(CfgHFSSSetup(self.pedb, None, **stp))
263
+ elif stp["type"].lower() in ["siwave_ac", "siwave_syz"]:
264
+ self.setups.append(CfgSIwaveACSetup(self.pedb, None, **stp))
265
+ elif stp["type"].lower() == "siwave_dc":
266
+ self.setups.append(CfgSIwaveDCSetup(self.pedb, None, **stp))
167
267
 
168
268
  def apply(self):
169
269
  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
- )
270
+ s.api.set_parameters_to_edb()
185
271
 
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
272
+ def to_dict(self):
273
+ return [i.to_dict() for i in self.setups]
274
+
275
+ def retrieve_parameters_from_edb(self):
276
+ self.setups = []
277
+ for _, setup in self.pedb.setups.items():
278
+ if setup.type == "hfss":
279
+ hfss = CfgHFSSSetup(self.pedb, setup)
280
+ hfss.api.retrieve_parameters_from_edb()
281
+ self.setups.append(hfss)
282
+ elif setup.type == "siwave_dc":
283
+ siwave_dc = CfgSIwaveDCSetup(self.pedb, setup)
284
+ siwave_dc.api.retrieve_parameters_from_edb()
285
+ self.setups.append(siwave_dc)
286
+ elif setup.type == "siwave_ac":
287
+ siwave_ac = CfgSIwaveACSetup(self.pedb, setup)
288
+ siwave_ac.api.retrieve_parameters_from_edb()
289
+ self.setups.append(siwave_ac)