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.
- pyedb/__init__.py +1 -1
- pyedb/configuration/cfg_boundaries.py +149 -63
- pyedb/configuration/cfg_components.py +333 -97
- pyedb/configuration/cfg_general.py +30 -12
- pyedb/configuration/cfg_modeler.py +161 -67
- pyedb/configuration/cfg_nets.py +33 -17
- pyedb/configuration/cfg_operations.py +63 -31
- pyedb/configuration/cfg_package_definition.py +72 -51
- pyedb/configuration/cfg_pin_groups.py +78 -26
- pyedb/configuration/cfg_s_parameter_models.py +95 -70
- pyedb/configuration/cfg_setup.py +230 -185
- pyedb/configuration/cfg_stackup.py +122 -90
- pyedb/configuration/configuration.py +342 -194
- pyedb/dotnet/database/cell/terminal/padstack_instance_terminal.py +5 -0
- pyedb/dotnet/database/cell/terminal/point_terminal.py +12 -0
- pyedb/dotnet/database/cell/terminal/terminal.py +0 -14
- pyedb/dotnet/database/dotnet/database.py +2 -0
- pyedb/dotnet/database/edb_data/padstacks_data.py +7 -2
- pyedb/dotnet/database/sim_setup_data/data/sweep_data.py +63 -10
- pyedb/dotnet/database/siwave.py +4 -1
- pyedb/dotnet/database/utilities/simulation_setup.py +15 -16
- pyedb/dotnet/edb.py +77 -110
- pyedb/grpc/database/components.py +1 -2
- pyedb/grpc/database/hierarchy/component.py +9 -1
- pyedb/grpc/database/hierarchy/s_parameter_model.py +2 -2
- pyedb/grpc/database/hierarchy/spice_model.py +4 -0
- pyedb/grpc/database/utility/hfss_extent_info.py +31 -20
- {pyedb-0.41.0.dist-info → pyedb-0.43.0.dist-info}/METADATA +1 -1
- {pyedb-0.41.0.dist-info → pyedb-0.43.0.dist-info}/RECORD +31 -31
- {pyedb-0.41.0.dist-info → pyedb-0.43.0.dist-info}/LICENSE +0 -0
- {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
|
-
|
|
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
|
-
|
|
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)
|
pyedb/configuration/cfg_setup.py
CHANGED
|
@@ -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
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
35
|
-
|
|
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
|
-
|
|
44
|
-
|
|
45
|
-
self.
|
|
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 =
|
|
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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
|
73
|
-
|
|
74
|
-
|
|
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
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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
|
-
|
|
111
|
-
|
|
112
|
-
|
|
142
|
+
class CfgSIwaveDCSetup(CfgSetup):
|
|
143
|
+
class Grpc(CfgSetup.Common):
|
|
144
|
+
def __init__(self, parent):
|
|
145
|
+
super().__init__(parent)
|
|
113
146
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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
|
-
|
|
151
|
-
|
|
152
|
-
|
|
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
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
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.
|
|
258
|
+
self.pedb = pedb
|
|
164
259
|
self.setups = []
|
|
165
260
|
for stp in setups_data:
|
|
166
|
-
if stp
|
|
167
|
-
self.setups.append(CfgHFSSSetup(self.
|
|
168
|
-
elif stp
|
|
169
|
-
self.setups.append(CfgSIwaveACSetup(self.
|
|
170
|
-
elif stp
|
|
171
|
-
self.setups.append(CfgSIwaveDCSetup(self.
|
|
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.
|
|
176
|
-
|
|
177
|
-
def
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
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)
|