pyedb 0.41.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.

Files changed (31) hide show
  1. pyedb/__init__.py +1 -1
  2. pyedb/configuration/cfg_boundaries.py +149 -63
  3. pyedb/configuration/cfg_components.py +333 -97
  4. pyedb/configuration/cfg_general.py +30 -12
  5. pyedb/configuration/cfg_modeler.py +161 -67
  6. pyedb/configuration/cfg_nets.py +33 -17
  7. pyedb/configuration/cfg_operations.py +63 -31
  8. pyedb/configuration/cfg_package_definition.py +72 -51
  9. pyedb/configuration/cfg_pin_groups.py +78 -26
  10. pyedb/configuration/cfg_s_parameter_models.py +95 -70
  11. pyedb/configuration/cfg_setup.py +230 -185
  12. pyedb/configuration/cfg_stackup.py +122 -90
  13. pyedb/configuration/configuration.py +342 -194
  14. pyedb/dotnet/database/cell/terminal/padstack_instance_terminal.py +5 -0
  15. pyedb/dotnet/database/cell/terminal/point_terminal.py +12 -0
  16. pyedb/dotnet/database/cell/terminal/terminal.py +0 -14
  17. pyedb/dotnet/database/dotnet/database.py +2 -0
  18. pyedb/dotnet/database/edb_data/padstacks_data.py +7 -2
  19. pyedb/dotnet/database/sim_setup_data/data/sweep_data.py +63 -10
  20. pyedb/dotnet/database/siwave.py +4 -1
  21. pyedb/dotnet/database/utilities/simulation_setup.py +15 -16
  22. pyedb/dotnet/edb.py +77 -110
  23. pyedb/grpc/database/components.py +1 -2
  24. pyedb/grpc/database/hierarchy/component.py +9 -1
  25. pyedb/grpc/database/hierarchy/s_parameter_model.py +2 -2
  26. pyedb/grpc/database/hierarchy/spice_model.py +4 -0
  27. pyedb/grpc/database/utility/hfss_extent_info.py +31 -20
  28. {pyedb-0.41.0.dist-info → pyedb-0.43.0.dist-info}/METADATA +1 -1
  29. {pyedb-0.41.0.dist-info → pyedb-0.43.0.dist-info}/RECORD +31 -31
  30. {pyedb-0.41.0.dist-info → pyedb-0.43.0.dist-info}/LICENSE +0 -0
  31. {pyedb-0.41.0.dist-info → pyedb-0.43.0.dist-info}/WHEEL +0 -0
@@ -36,81 +36,106 @@ class CfgSParameterModel:
36
36
 
37
37
 
38
38
  class CfgSParameters:
39
+ class Grpc:
40
+ def __init__(self, parent):
41
+ self.parent = parent
42
+ self._pedb = parent._pedb
43
+
44
+ def apply(self):
45
+ for s_param in self.parent.s_parameters_models:
46
+ fpath = s_param.file_path
47
+ if not Path(fpath).anchor:
48
+ fpath = str(Path(self.parent.path_libraries) / fpath)
49
+ comp_def = self._pedb.definitions.component[s_param.component_definition]
50
+ if s_param.pin_order:
51
+ comp_def.set_properties(pin_order=s_param.pin_order)
52
+ comp_def.add_n_port_model(fpath, s_param.name)
53
+ comp_list = dict()
54
+ if s_param.apply_to_all:
55
+ comp_list.update(
56
+ {
57
+ refdes: comp
58
+ for refdes, comp in comp_def.components.items()
59
+ if refdes not in s_param.components
60
+ }
61
+ )
62
+ else:
63
+ comp_list.update(
64
+ {refdes: comp for refdes, comp in comp_def.components.items() if refdes in s_param.components}
65
+ )
66
+
67
+ for refdes, comp in comp_list.items():
68
+ if refdes in s_param.reference_net_per_component:
69
+ ref_net = s_param.reference_net_per_component[refdes]
70
+ else:
71
+ ref_net = s_param.reference_net
72
+ comp.use_s_parameter_model(s_param.name, reference_net=ref_net)
73
+
74
+ def get_data_from_db(self, cfg_components):
75
+ db_comp_def = self._pedb.definitions.component
76
+ for name, compdef_obj in db_comp_def.items():
77
+ nport_models = compdef_obj.component_models
78
+ if not nport_models:
79
+ continue
80
+ else:
81
+ pin_order = compdef_obj.get_properties()["pin_order"]
82
+ temp_comps = [i for i in cfg_components if i["definition"] == name]
83
+ for model_name, model_obj in nport_models.items():
84
+ temp_comp_list = []
85
+ reference_net_per_component = {}
86
+ for i in temp_comps:
87
+ s_param_model = i.get("s_parameter_model")
88
+ if s_param_model:
89
+ if s_param_model["model_name"] == model_name:
90
+ temp_comp_list.append(i["reference_designator"])
91
+ reference_net_per_component[i["reference_designator"]] = s_param_model[
92
+ "reference_net"
93
+ ]
94
+ else:
95
+ continue
96
+
97
+ self.parent.s_parameters_models.append(
98
+ CfgSParameterModel(
99
+ name=model_name,
100
+ component_definition=name,
101
+ file_path=model_obj.reference_file,
102
+ apply_to_all=False,
103
+ components=temp_comp_list,
104
+ reference_net_per_component=reference_net_per_component,
105
+ pin_order=pin_order,
106
+ )
107
+ )
108
+
109
+ data = []
110
+ for i in self.parent.s_parameters_models:
111
+ data.append(
112
+ {
113
+ "name": i.name,
114
+ "component_definition": i.component_definition,
115
+ "file_path": i.file_path,
116
+ "apply_to_all": i.apply_to_all,
117
+ "components": i.components,
118
+ "reference_net_per_component": i.reference_net_per_component,
119
+ "pin_order": i.pin_order,
120
+ }
121
+ )
122
+ return data
123
+
124
+ class DotNet(Grpc):
125
+ def __init__(self, parent):
126
+ super().__init__(parent)
127
+
39
128
  def __init__(self, pedb, data, path_lib=None):
40
129
  self._pedb = pedb
130
+ if self._pedb.grpc:
131
+ self.api = self.Grpc(self)
132
+ else:
133
+ self.api = self.DotNet(self)
41
134
  self.path_libraries = path_lib
42
135
  self.s_parameters_models = [CfgSParameterModel(**i) for i in data]
43
136
 
44
137
  def apply(self):
45
- for s_param in self.s_parameters_models:
46
- fpath = s_param.file_path
47
- if not Path(fpath).anchor:
48
- fpath = str(Path(self.path_libraries) / fpath)
49
- comp_def = self._pedb.definitions.component[s_param.component_definition]
50
- if s_param.pin_order:
51
- comp_def.set_properties(pin_order=s_param.pin_order)
52
- comp_def.add_n_port_model(fpath, s_param.name)
53
- comp_list = dict()
54
- if s_param.apply_to_all:
55
- comp_list.update(
56
- {refdes: comp for refdes, comp in comp_def.components.items() if refdes not in s_param.components}
57
- )
58
- else:
59
- comp_list.update(
60
- {refdes: comp for refdes, comp in comp_def.components.items() if refdes in s_param.components}
61
- )
62
-
63
- for refdes, comp in comp_list.items():
64
- if refdes in s_param.reference_net_per_component:
65
- ref_net = s_param.reference_net_per_component[refdes]
66
- else:
67
- ref_net = s_param.reference_net
68
- comp.use_s_parameter_model(s_param.name, reference_net=ref_net)
138
+ self.api.apply()
69
139
 
70
140
  def get_data_from_db(self, cfg_components):
71
- db_comp_def = self._pedb.definitions.component
72
- for name, compdef_obj in db_comp_def.items():
73
- nport_models = compdef_obj.component_models
74
- if not nport_models:
75
- continue
76
- else:
77
- pin_order = compdef_obj.get_properties()["pin_order"]
78
- temp_comps = [i for i in cfg_components if i["definition"] == name]
79
- for model_name, model_obj in nport_models.items():
80
- temp_comp_list = []
81
- reference_net_per_component = {}
82
- for i in temp_comps:
83
- s_param_model = i.get("s_parameter_model")
84
- if s_param_model:
85
- if s_param_model["model_name"] == model_name:
86
- temp_comp_list.append(i["reference_designator"])
87
- reference_net_per_component[i["reference_designator"]] = s_param_model["reference_net"]
88
- else:
89
- continue
90
-
91
- self.s_parameters_models.append(
92
- CfgSParameterModel(
93
- name=model_name,
94
- component_definition=name,
95
- file_path=model_obj.reference_file,
96
- apply_to_all=False,
97
- components=temp_comp_list,
98
- reference_net_per_component=reference_net_per_component,
99
- pin_order=pin_order,
100
- )
101
- )
102
-
103
- data = []
104
- for i in self.s_parameters_models:
105
- data.append(
106
- {
107
- "name": i.name,
108
- "component_definition": i.component_definition,
109
- "file_path": i.file_path,
110
- "apply_to_all": i.apply_to_all,
111
- "components": i.components,
112
- "reference_net_per_component": i.reference_net_per_component,
113
- "pin_order": i.pin_order,
114
- }
115
- )
116
- return data
141
+ return self.api.get_data_from_db(cfg_components)
@@ -20,225 +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
 
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
25
60
 
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"))))
61
+ class Grpc(Common):
62
+ def __init__(self, parent):
63
+ super().__init__(parent)
32
64
 
65
+ def set_parameters_to_edb(self):
66
+ pass
33
67
 
34
- class CfgSweepData(CfgBase):
35
- def __init__(self, **kwargs):
36
- 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))
68
+ def retrieve_parameters_from_edb(self):
69
+ pass
41
70
 
71
+ class DotNet(Grpc):
72
+ def __init__(self, parent):
73
+ super().__init__(parent)
42
74
 
43
- class CfgSetup(CfgBase):
44
- def __init__(self, pedb, **kwargs):
45
- self._pedb = pedb
75
+ def __init__(self, pedb, pedb_obj, **kwargs):
76
+ self.pedb = pedb
77
+ self.pyedb_obj = pedb_obj
46
78
  self.name = kwargs.get("name")
47
- self.type = kwargs.get("type").lower() if kwargs.get("type") else None
79
+ self.type = ""
48
80
 
49
81
  self.freq_sweep = []
50
- for i in kwargs.get("freq_sweep", []):
51
- self.freq_sweep.append(CfgSweepData(**i))
52
-
53
- def _apply_freq_sweep(self, edb_setup):
54
- for i in self.freq_sweep:
55
- f_set = []
56
- kw = {}
57
- for attr in i.get_attributes(exclude="name"):
58
- if attr == "frequencies":
59
- for f in i.frequencies:
60
- f_set.append([f.distribution, f.start, f.stop, f.increment])
61
- else:
62
- kw[attr] = getattr(i, attr)
63
- edb_setup.add_sweep(i.name, frequency_set=f_set, **kw)
64
82
 
83
+ self.freq_sweep = kwargs.get("freq_sweep", [])
65
84
 
66
- class CfgSIwaveACSetup(CfgSetup):
67
- def __init__(self, pedb, **kwargs):
68
- super().__init__(pedb, **kwargs)
69
- self.si_slider_position = kwargs.get("si_slider_position")
70
- self.pi_slider_position = kwargs.get("pi_slider_position")
85
+ if self.pedb.grpc:
86
+ self.api = self.Grpc(self)
87
+ else:
88
+ self.api = self.DotNet(self)
71
89
 
72
- def apply(self):
73
- if self.name in self._pedb.setups:
74
- raise "Setup {} already existing. Editing it.".format(self.name)
90
+ def _to_dict_setup(self):
91
+ return {
92
+ "name": self.name,
93
+ "type": self.type,
94
+ }
75
95
 
76
- kwargs = (
77
- {"si_slider_position": self.si_slider_position}
78
- if self.si_slider_position is not None
79
- else {"pi_slider_position": self.pi_slider_position}
80
- )
81
-
82
- edb_setup = self._pedb.create_siwave_syz_setup(name=self.name, **kwargs)
83
- self._apply_freq_sweep(edb_setup)
84
96
 
97
+ class CfgSIwaveACSetup(CfgSetup):
98
+ class Grpc(CfgSetup.Common):
99
+ def __init__(self, parent):
100
+ super().__init__(parent)
85
101
 
86
- class CfgSIwaveDCSetup(CfgSetup):
87
- def __init__(self, pedb, **kwargs):
88
- super().__init__(pedb, **kwargs)
89
- self.dc_slider_position = kwargs.get("dc_slider_position")
90
- self.dc_ir_settings = CfgDcIrSettings(**kwargs.get("dc_ir_settings", {}))
91
- self.freq_sweep = None
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)
92
105
 
93
- def apply(self):
94
- edb_setup = self._pedb.create_siwave_dc_setup(name=self.name, dc_slider_position=self.dc_slider_position)
95
- for k, v in self.dc_ir_settings.get_attributes().items():
96
- if k == "dc_slider_postion":
97
- edb_setup.dc_settings.dc_slider_position = v
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
98
109
  else:
99
- setattr(edb_setup.dc_ir_settings, k, v)
100
-
101
-
102
- class CfgHFSSSetup(CfgSetup):
103
- def __init__(self, pedb, **kwargs):
104
- super().__init__(pedb, **kwargs)
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
+ }
138
+ )
139
+ return temp
105
140
 
106
- self.f_adapt = kwargs.get("f_adapt")
107
- self.max_num_passes = kwargs.get("max_num_passes")
108
- self.max_mag_delta_s = kwargs.get("max_mag_delta_s")
109
141
 
110
- self.mesh_operations = []
111
- for i in kwargs.get("mesh_operations", []):
112
- self.mesh_operations.append(CfgLengthMeshOperation(**i))
142
+ class CfgSIwaveDCSetup(CfgSetup):
143
+ class Grpc(CfgSetup.Common):
144
+ def __init__(self, parent):
145
+ super().__init__(parent)
113
146
 
114
- def apply(self):
115
- if self.name in self._pedb.setups:
116
- raise "Setup {} already existing. Editing it.".format(self.name)
117
-
118
- edb_setup = self._pedb.create_hfss_setup(self.name)
119
- edb_setup.set_solution_single_frequency(self.f_adapt, self.max_num_passes, self.max_mag_delta_s)
120
-
121
- self._apply_freq_sweep(edb_setup)
122
-
123
- for i in self.mesh_operations:
124
- edb_setup.add_length_mesh_operation(
125
- net_layer_list=i.nets_layers_list,
126
- name=i.name,
127
- # max_elements=i.max_elements,
128
- max_length=i.max_length,
129
- # restrict_elements=i.restrict_max_elements,
130
- restrict_length=i.restrict_length,
131
- refine_inside=i.refine_inside,
132
- # mesh_region=i.mesh_region
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
133
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"
169
+ self.dc_slider_position = kwargs.get("dc_slider_position")
170
+ self.dc_ir_settings = kwargs.get("dc_ir_settings", {})
134
171
 
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
135
176
 
136
- class CfgDcIrSettings(CfgBase):
137
- def __init__(self, **kwargs):
138
- self.export_dc_thermal_data = kwargs.get("export_dc_thermal_data")
139
177
 
178
+ class CfgHFSSSetup(CfgSetup):
179
+ class Grpc(CfgSetup.Common):
180
+ def __init__(self, parent):
181
+ super().__init__(parent)
140
182
 
141
- class CfgMeshOperation(CfgBase):
142
- def __init__(self, **kwargs):
143
- self.name = kwargs.get("name")
144
- self.type = kwargs.get("type")
145
- # self.mesh_region = kwargs.get("mesh_region")
146
- self.nets_layers_list = kwargs.get("nets_layers_list", {})
147
- self.refine_inside = kwargs.get("refine_inside", False)
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)
148
186
 
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
190
+ )
149
191
 
150
- class CfgLengthMeshOperation(CfgMeshOperation):
151
- def __init__(self, **kwargs):
152
- super().__init__(**kwargs)
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
+ )
204
+
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
+ )
228
+
229
+ class DotNet(Grpc):
230
+ def __init__(self, parent):
231
+ super().__init__(parent)
232
+
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")
153
239
 
154
- # waiting bug review
155
- # self.restrict_max_elements = kwargs.get("restrict_max_elements", True)
156
- # self.max_elements = kwargs.get("max_elements", 1000)
157
- self.restrict_length = kwargs.get("restrict_length", True)
158
- 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
159
254
 
160
255
 
161
256
  class CfgSetups:
162
257
  def __init__(self, pedb, setups_data):
163
- self._pedb = pedb
258
+ self.pedb = pedb
164
259
  self.setups = []
165
260
  for stp in setups_data:
166
- if stp.get("type").lower() == "hfss":
167
- self.setups.append(CfgHFSSSetup(self._pedb, **stp))
168
- elif stp.get("type").lower() in ["siwave_ac", "siwave_syz"]:
169
- self.setups.append(CfgSIwaveACSetup(self._pedb, **stp))
170
- elif stp.get("type").lower() == "siwave_dc":
171
- 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))
172
267
 
173
268
  def apply(self):
174
269
  for s in self.setups:
175
- s.apply()
176
-
177
- def get_data_from_db(self):
178
- setups = []
179
- for _, s in self._pedb.setups.items():
180
- if float(self._pedb.edbversion) < 2025.1:
181
- if not s.type == "hfss":
182
- self._pedb.logger.warning("Only HFSS setups are exported in 2024 R2 and earlier version.")
183
- continue
184
-
185
- stp = {}
186
- if s.type == "hfss":
187
- for p_name in CfgHFSSSetup(self._pedb).__dict__:
188
- if p_name.startswith("_"):
189
- continue
190
- elif p_name == "type":
191
- stp[p_name] = s.type
192
- elif p_name == "f_adapt":
193
- stp[p_name] = list(s.adaptive_settings.adaptive_frequency_data_list)[0].adaptive_frequency
194
- elif p_name == "max_num_passes":
195
- stp[p_name] = list(s.adaptive_settings.adaptive_frequency_data_list)[0].max_passes
196
- elif p_name == "max_mag_delta_s":
197
- stp[p_name] = list(s.adaptive_settings.adaptive_frequency_data_list)[0].max_delta
198
- elif p_name == "freq_sweep":
199
- f_sweep = []
200
- for _, sw in s.sweeps.items():
201
- sweep_data = {}
202
- for sw_p_name in CfgSweepData().__dict__:
203
- if sw_p_name == "frequencies":
204
- pass # Frequencies cannot be read from EDB
205
- else:
206
- sweep_data[sw_p_name] = getattr(sw, sw_p_name)
207
- f_sweep.append(sweep_data)
208
- stp["freq_sweep"] = f_sweep
209
- elif p_name == "mesh_operations":
210
- mops = []
211
- for _, i in s.mesh_operations.items():
212
- mop = {}
213
- for mop_p_name in CfgLengthMeshOperation().__dict__:
214
- mop[mop_p_name] = getattr(i, mop_p_name)
215
- mops.append(mop)
216
- stp["mesh_operations"] = mops
217
- else:
218
- stp[p_name] = getattr(s, p_name)
219
-
220
- elif s.type == "siwave_ac":
221
- for p_name in CfgSIwaveACSetup(self._pedb).__dict__:
222
- if p_name.startswith("_"):
223
- continue
224
- elif p_name == "freq_sweep":
225
- pass # Bug in EDB API
226
- else:
227
- stp[p_name] = getattr(s, p_name)
228
- elif s.type == "siwave_dc":
229
- for p_name in CfgSIwaveDCSetup(self._pedb).__dict__:
230
- if p_name.startswith("_"):
231
- continue
232
- elif p_name == "freq_sweep":
233
- pass
234
- elif p_name == "dc_ir_settings":
235
- dc_ir_s = {}
236
- for dcir_p_name in CfgDcIrSettings().__dict__:
237
- dc_ir_s[dcir_p_name] = getattr(s.dc_ir_settings, dcir_p_name)
238
- stp["dc_ir_settings"] = dc_ir_s
239
- elif p_name == "dc_slider_position":
240
- stp[p_name] = getattr(s.dc_settings, p_name)
241
- else:
242
- stp[p_name] = getattr(s, p_name)
243
- setups.append(stp)
244
- return setups
270
+ s.api.set_parameters_to_edb()
271
+
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)