pyedb 0.37.0__py3-none-any.whl → 0.38.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_common.py +1 -1
- pyedb/configuration/cfg_components.py +228 -200
- pyedb/configuration/cfg_data.py +3 -1
- pyedb/configuration/cfg_modeler.py +6 -6
- pyedb/configuration/cfg_padstacks.py +345 -289
- pyedb/configuration/cfg_ports_sources.py +191 -46
- pyedb/configuration/configuration.py +5 -2
- pyedb/dotnet/edb.py +1 -1
- pyedb/dotnet/edb_core/cell/layout.py +2 -2
- pyedb/dotnet/edb_core/edb_data/padstacks_data.py +45 -58
- pyedb/dotnet/edb_core/padstack.py +2 -1
- pyedb/dotnet/edb_core/sim_setup_data/data/settings.py +15 -0
- pyedb/dotnet/edb_core/sim_setup_data/data/sweep_data.py +3 -3
- pyedb/dotnet/edb_core/utilities/simulation_setup.py +1 -0
- pyedb/extensions/pre_layout_design_toolkit/via_design.py +1151 -0
- pyedb/ipc2581/ecad/cad_data/step.py +1 -1
- {pyedb-0.37.0.dist-info → pyedb-0.38.0.dist-info}/METADATA +5 -5
- {pyedb-0.37.0.dist-info → pyedb-0.38.0.dist-info}/RECORD +21 -20
- {pyedb-0.37.0.dist-info → pyedb-0.38.0.dist-info}/LICENSE +0 -0
- {pyedb-0.37.0.dist-info → pyedb-0.38.0.dist-info}/WHEEL +0 -0
pyedb/__init__.py
CHANGED
|
@@ -19,244 +19,272 @@
|
|
|
19
19
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
20
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
21
|
# SOFTWARE.
|
|
22
|
+
import os
|
|
22
23
|
|
|
23
24
|
from pyedb.configuration.cfg_common import CfgBase
|
|
24
25
|
from pyedb.dotnet.edb_core.general import pascal_to_snake, snake_to_pascal
|
|
25
26
|
|
|
26
27
|
|
|
27
28
|
class CfgComponent(CfgBase):
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
self
|
|
29
|
+
class Common:
|
|
30
|
+
@property
|
|
31
|
+
def pyedb_obj(self):
|
|
32
|
+
return self.parent.pyedb_obj
|
|
31
33
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
self.type = kwargs["part_type"].lower() if kwargs.get("part_type") else None
|
|
36
|
-
self.placement_layer = kwargs.get("placement_layer", None)
|
|
37
|
-
self.pins = kwargs.get("pins", [])
|
|
34
|
+
def __init__(self, parent):
|
|
35
|
+
self.parent = parent
|
|
36
|
+
self.pedb = parent.pedb
|
|
38
37
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
self.pin_pair_model = kwargs.get("pin_pair_model", [])
|
|
43
|
-
self.spice_model = kwargs.get("spice_model", {})
|
|
44
|
-
self.s_parameter_model = kwargs.get("s_parameter_model", {})
|
|
45
|
-
self.netlist_model = kwargs.get("netlist_model", {})
|
|
38
|
+
def retrieve_model_properties_from_edb(self):
|
|
39
|
+
c_p = self.pyedb_obj.component_property
|
|
40
|
+
model = c_p.GetModel().Clone()
|
|
46
41
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
42
|
+
if model.GetModelType().ToString() == "NetlistModel":
|
|
43
|
+
self.parent.netlist_model["netlist"] = model.GetNetlist()
|
|
44
|
+
elif model.GetModelType().ToString() == "PinPairModel":
|
|
45
|
+
temp = {}
|
|
46
|
+
for i in model.PinPairs:
|
|
47
|
+
temp["first_pin"] = i.FirstPin
|
|
48
|
+
temp["second_pin"] = i.SecondPin
|
|
49
|
+
rlc = model.GetPinPairRlc(i)
|
|
50
|
+
temp["is_parallel"] = rlc.IsParallel
|
|
51
|
+
temp["resistance"] = rlc.R.ToString()
|
|
52
|
+
temp["resistance_enabled"] = rlc.REnabled
|
|
53
|
+
temp["inductance"] = rlc.L.ToString()
|
|
54
|
+
temp["inductance_enabled"] = rlc.LEnabled
|
|
55
|
+
temp["capacitance"] = rlc.C.ToString()
|
|
56
|
+
temp["capacitance_enabled"] = rlc.CEnabled
|
|
57
|
+
self.parent.pin_pair_model.append(temp)
|
|
58
|
+
elif model.GetModelType().ToString() == "SParameterModel":
|
|
59
|
+
self.parent.s_parameter_model["reference_net"] = model.GetReferenceNet()
|
|
60
|
+
self.parent.s_parameter_model["model_name"] = model.GetComponentModelName()
|
|
61
|
+
elif model.GetModelType().ToString() == "SPICEModel":
|
|
62
|
+
self.parent.spice_model["model_name"] = model.GetModelName()
|
|
63
|
+
self.parent.spice_model["model_path"] = model.GetModelPath()
|
|
64
|
+
self.parent.spice_model["sub_circuit"] = model.GetSubCkt()
|
|
65
|
+
self.parent.spice_model["terminal_pairs"] = [
|
|
66
|
+
[i, j] for i, j in dict(model.GetTerminalPinPairs()).items()
|
|
67
|
+
]
|
|
50
68
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
self.
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
p = self._pedb._edb.Utility.PinPair(str(i["first_pin"]), str(i["second_pin"]))
|
|
87
|
-
rlc = self._pedb._edb.Utility.Rlc(
|
|
88
|
-
self._pedb.edb_value(i["resistance"]),
|
|
89
|
-
i["resistance_enabled"],
|
|
90
|
-
self._pedb.edb_value(i["inductance"]),
|
|
91
|
-
i["inductance_enabled"],
|
|
92
|
-
self._pedb.edb_value(i["capacitance"]),
|
|
93
|
-
i["capacitance_enabled"],
|
|
94
|
-
i["is_parallel"],
|
|
69
|
+
def _set_model_properties_to_edb(self):
|
|
70
|
+
c_p = self.pyedb_obj.component_property
|
|
71
|
+
if self.parent.netlist_model:
|
|
72
|
+
m = self.pedb._edb.Cell.Hierarchy.SParameterModel()
|
|
73
|
+
m.SetNetlist(self.parent.netlist_model["netlist"])
|
|
74
|
+
c_p.SetModel(m)
|
|
75
|
+
self.component_property = c_p
|
|
76
|
+
elif self.parent.pin_pair_model:
|
|
77
|
+
m = self.pedb._edb.Cell.Hierarchy.PinPairModel()
|
|
78
|
+
for i in self.parent.pin_pair_model:
|
|
79
|
+
p = self.pedb._edb.Utility.PinPair(str(i["first_pin"]), str(i["second_pin"]))
|
|
80
|
+
rlc = self.pedb._edb.Utility.Rlc(
|
|
81
|
+
self.pedb.edb_value(i["resistance"]),
|
|
82
|
+
i["resistance_enabled"],
|
|
83
|
+
self.pedb.edb_value(i["inductance"]),
|
|
84
|
+
i["inductance_enabled"],
|
|
85
|
+
self.pedb.edb_value(i["capacitance"]),
|
|
86
|
+
i["capacitance_enabled"],
|
|
87
|
+
i["is_parallel"],
|
|
88
|
+
)
|
|
89
|
+
m.SetPinPairRlc(p, rlc)
|
|
90
|
+
c_p.SetModel(m)
|
|
91
|
+
self.pyedb_obj.component_property = c_p
|
|
92
|
+
elif self.parent.s_parameter_model:
|
|
93
|
+
m = self.pedb._edb.Cell.Hierarchy.SParameterModel()
|
|
94
|
+
m.SetComponentModelName(self.parent.s_parameter_model["model_name"])
|
|
95
|
+
m.SetReferenceNet(self.parent.s_parameter_model["reference_net"])
|
|
96
|
+
c_p.SetModel(m)
|
|
97
|
+
self.component_property = c_p
|
|
98
|
+
elif self.parent.spice_model:
|
|
99
|
+
self.pyedb_obj.assign_spice_model(
|
|
100
|
+
self.parent.spice_model["model_path"],
|
|
101
|
+
self.parent.spice_model["model_name"],
|
|
102
|
+
self.parent.spice_model["sub_circuit"],
|
|
103
|
+
self.parent.spice_model["terminal_pairs"],
|
|
95
104
|
)
|
|
96
|
-
m.SetPinPairRlc(p, rlc)
|
|
97
|
-
c_p.SetModel(m)
|
|
98
|
-
self._pyedb_obj.component_property = c_p
|
|
99
|
-
elif self.s_parameter_model:
|
|
100
|
-
m = self._pedb._edb.Cell.Hierarchy.SParameterModel()
|
|
101
|
-
m.SetComponentModelName(self.s_parameter_model["model_name"])
|
|
102
|
-
m.SetReferenceNet(self.s_parameter_model["reference_net"])
|
|
103
|
-
c_p.SetModel(m)
|
|
104
|
-
self.component_property = c_p
|
|
105
|
-
elif self.spice_model:
|
|
106
|
-
self._pyedb_obj.assign_spice_model(
|
|
107
|
-
self.spice_model["model_path"],
|
|
108
|
-
self.spice_model["model_name"],
|
|
109
|
-
self.spice_model["sub_circuit"],
|
|
110
|
-
self.spice_model["terminal_pairs"],
|
|
111
|
-
)
|
|
112
105
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
106
|
+
def _retrieve_ic_die_properties_from_edb(self):
|
|
107
|
+
temp = dict()
|
|
108
|
+
cp = self.pyedb_obj.component_property
|
|
109
|
+
ic_die_prop = cp.GetDieProperty().Clone()
|
|
110
|
+
die_type = pascal_to_snake(ic_die_prop.GetType().ToString())
|
|
111
|
+
temp["type"] = die_type
|
|
112
|
+
if not die_type == "no_die":
|
|
113
|
+
temp["orientation"] = pascal_to_snake(ic_die_prop.GetOrientation().ToString())
|
|
114
|
+
if die_type == "wire_bond":
|
|
115
|
+
temp["height"] = ic_die_prop.GetHeightValue().ToString()
|
|
116
|
+
self.parent.ic_die_properties = temp
|
|
124
117
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
118
|
+
def _set_ic_die_properties_to_edb(self):
|
|
119
|
+
cp = self.pyedb_obj.component_property
|
|
120
|
+
ic_die_prop = cp.GetDieProperty().Clone()
|
|
121
|
+
die_type = self.parent.ic_die_properties.get("type")
|
|
122
|
+
ic_die_prop.SetType(getattr(self.pedb._edb.Definition.DieType, snake_to_pascal(die_type)))
|
|
123
|
+
if not die_type == "no_die":
|
|
124
|
+
orientation = self.parent.ic_die_properties.get("orientation")
|
|
125
|
+
if orientation:
|
|
126
|
+
ic_die_prop.SetOrientation(
|
|
127
|
+
getattr(self.pedb._edb.Definition.DieOrientation, snake_to_pascal(orientation))
|
|
128
|
+
)
|
|
129
|
+
if die_type == "wire_bond":
|
|
130
|
+
height = self.parent.ic_die_properties.get("height")
|
|
131
|
+
if height:
|
|
132
|
+
ic_die_prop.SetHeight(self.pedb.edb_value(height))
|
|
133
|
+
cp.SetDieProperty(ic_die_prop)
|
|
134
|
+
self.pyedb_obj.component_property = cp
|
|
142
135
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
temp["shape"] = pascal_to_snake(shape)
|
|
153
|
-
temp["diameter"] = diam.ToString()
|
|
154
|
-
temp["mid_diameter"] = mid_diam.ToString()
|
|
155
|
-
temp["height"] = height
|
|
156
|
-
self.solder_ball_properties = temp
|
|
136
|
+
def _retrieve_solder_ball_properties_from_edb(self):
|
|
137
|
+
temp = dict()
|
|
138
|
+
cp = self.pyedb_obj.component_property
|
|
139
|
+
solder_ball_prop = cp.GetSolderBallProperty().Clone()
|
|
140
|
+
_, diam, mid_diam = solder_ball_prop.GetDiameterValue()
|
|
141
|
+
height = solder_ball_prop.GetHeightValue().ToString()
|
|
142
|
+
shape = solder_ball_prop.GetShape().ToString()
|
|
143
|
+
material = solder_ball_prop.GetMaterialName()
|
|
144
|
+
uses_solder_ball = solder_ball_prop.UsesSolderball()
|
|
157
145
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
return
|
|
146
|
+
temp["uses_solder_ball"] = uses_solder_ball
|
|
147
|
+
temp["shape"] = pascal_to_snake(shape)
|
|
148
|
+
temp["diameter"] = diam.ToString()
|
|
149
|
+
temp["mid_diameter"] = mid_diam.ToString()
|
|
150
|
+
temp["height"] = height
|
|
151
|
+
temp["material"] = material
|
|
152
|
+
self.parent.solder_ball_properties = temp
|
|
166
153
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
solder_ball_prop.
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
raise ValueError("Solderball shape must be either cylinder or spheroid")
|
|
176
|
-
solder_ball_prop.SetHeight(self._pedb.edb_value(self.solder_ball_properties["height"]))
|
|
177
|
-
cp.SetSolderBallProperty(solder_ball_prop)
|
|
178
|
-
self._pyedb_obj.component_property = cp
|
|
154
|
+
def _set_solder_ball_properties_to_edb(self):
|
|
155
|
+
cp = self.pyedb_obj.component_property
|
|
156
|
+
solder_ball_prop = cp.GetSolderBallProperty().Clone()
|
|
157
|
+
shape = self.parent.solder_ball_properties.get("shape")
|
|
158
|
+
if shape:
|
|
159
|
+
solder_ball_prop.SetShape(getattr(self.pedb._edb.Definition.SolderballShape, snake_to_pascal(shape)))
|
|
160
|
+
else:
|
|
161
|
+
return
|
|
179
162
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
163
|
+
if shape == "cylinder":
|
|
164
|
+
diameter = self.parent.solder_ball_properties["diameter"]
|
|
165
|
+
solder_ball_prop.SetDiameter(self.pedb.edb_value(diameter), self.pedb.edb_value(diameter))
|
|
166
|
+
elif shape == "spheroid":
|
|
167
|
+
diameter = self.parent.solder_ball_properties["diameter"]
|
|
168
|
+
mid_diameter = self.parent.solder_ball_properties["mid_diameter"]
|
|
169
|
+
solder_ball_prop.SetDiameter(self.pedb.edb_value(diameter), self.pedb.edb_value(mid_diameter))
|
|
170
|
+
else:
|
|
171
|
+
raise ValueError("Solderball shape must be either cylinder or spheroid")
|
|
172
|
+
solder_ball_prop.SetHeight(self.pedb.edb_value(self.parent.solder_ball_properties["height"]))
|
|
173
|
+
solder_ball_prop.SetMaterialName(self.parent.solder_ball_properties.get("material", "solder"))
|
|
174
|
+
cp.SetSolderBallProperty(solder_ball_prop)
|
|
175
|
+
self.pyedb_obj.component_property = cp
|
|
176
|
+
|
|
177
|
+
def _retrieve_port_properties_from_edb(self):
|
|
178
|
+
temp = dict()
|
|
179
|
+
cp = self.pyedb_obj.component_property
|
|
180
|
+
c_type = self.parent.type.lower()
|
|
181
|
+
if c_type not in ["ic", "io", "other"]:
|
|
182
|
+
return
|
|
183
|
+
else:
|
|
184
|
+
port_prop = cp.GetPortProperty().Clone()
|
|
185
|
+
reference_height = port_prop.GetReferenceHeightValue().ToString()
|
|
186
|
+
reference_size_auto = port_prop.GetReferenceSizeAuto()
|
|
187
|
+
_, reference_size_x, reference_size_y = port_prop.GetReferenceSize()
|
|
188
|
+
temp["reference_height"] = reference_height
|
|
189
|
+
temp["reference_size_auto"] = reference_size_auto
|
|
190
|
+
temp["reference_size_x"] = str(reference_size_x)
|
|
191
|
+
temp["reference_size_y"] = str(reference_size_y)
|
|
192
|
+
self.parent.port_properties = temp
|
|
193
|
+
|
|
194
|
+
def _set_port_properties_to_edb(self):
|
|
195
|
+
cp = self.pyedb_obj.component_property
|
|
187
196
|
port_prop = cp.GetPortProperty().Clone()
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
self.port_properties
|
|
197
|
+
height = self.parent.port_properties.get("reference_height")
|
|
198
|
+
if height:
|
|
199
|
+
port_prop.SetReferenceHeight(self.pedb.edb_value(height))
|
|
200
|
+
reference_size_auto = self.parent.port_properties.get("reference_size_auto")
|
|
201
|
+
if reference_size_auto is not None:
|
|
202
|
+
port_prop.SetReferenceSizeAuto(reference_size_auto)
|
|
203
|
+
reference_size_x = self.parent.port_properties.get("reference_size_x", 0)
|
|
204
|
+
reference_size_y = self.parent.port_properties.get("reference_size_y", 0)
|
|
205
|
+
port_prop.SetReferenceSize(self.pedb.edb_value(reference_size_x), self.pedb.edb_value(reference_size_y))
|
|
206
|
+
cp.SetPortProperty(port_prop)
|
|
207
|
+
self.pyedb_obj.component_property = cp
|
|
196
208
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
port_prop.SetReferenceHeight(self._pedb.edb_value(height))
|
|
203
|
-
reference_size_auto = self.port_properties.get("reference_size_auto")
|
|
204
|
-
if reference_size_auto is not None:
|
|
205
|
-
port_prop.SetReferenceSizeAuto(reference_size_auto)
|
|
206
|
-
reference_size_x = self.port_properties.get("reference_size_x", 0)
|
|
207
|
-
reference_size_y = self.port_properties.get("reference_size_y", 0)
|
|
208
|
-
port_prop.SetReferenceSize(self._pedb.edb_value(reference_size_x), self._pedb.edb_value(reference_size_y))
|
|
209
|
-
cp.SetPortProperty(port_prop)
|
|
210
|
-
self._pyedb_obj.component_property = cp
|
|
209
|
+
def set_parameters_to_edb(self):
|
|
210
|
+
if self.parent.type:
|
|
211
|
+
self.pyedb_obj.type = self.parent.type
|
|
212
|
+
if self.parent.enabled:
|
|
213
|
+
self.pyedb_obj.enabled = self.parent.enabled
|
|
211
214
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
self.
|
|
215
|
+
self._set_model_properties_to_edb()
|
|
216
|
+
if self.pyedb_obj.type.lower() == "ic":
|
|
217
|
+
self._set_ic_die_properties_to_edb()
|
|
218
|
+
self._set_port_properties_to_edb()
|
|
219
|
+
elif self.pyedb_obj.type.lower() in ["io", "other"]:
|
|
220
|
+
self._set_solder_ball_properties_to_edb()
|
|
221
|
+
self._set_port_properties_to_edb()
|
|
217
222
|
|
|
218
|
-
self
|
|
219
|
-
|
|
220
|
-
self.
|
|
221
|
-
self.
|
|
222
|
-
|
|
223
|
-
self.
|
|
224
|
-
|
|
223
|
+
def retrieve_parameters_from_edb(self):
|
|
224
|
+
self.parent.type = self.pyedb_obj.type
|
|
225
|
+
self.parent.definition = self.pyedb_obj.part_name
|
|
226
|
+
self.parent.reference_designator = self.pyedb_obj.name
|
|
227
|
+
self.retrieve_model_properties_from_edb()
|
|
228
|
+
if self.pyedb_obj.type.lower() == "ic":
|
|
229
|
+
self._retrieve_ic_die_properties_from_edb()
|
|
230
|
+
self._retrieve_port_properties_from_edb()
|
|
231
|
+
elif self.pyedb_obj.type.lower() in ["io", "other"]:
|
|
232
|
+
self._retrieve_solder_ball_properties_from_edb()
|
|
233
|
+
self._retrieve_port_properties_from_edb()
|
|
225
234
|
|
|
226
|
-
|
|
227
|
-
self
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
235
|
+
class Grpc(Common):
|
|
236
|
+
def __init__(self, parent):
|
|
237
|
+
super().__init__(parent)
|
|
238
|
+
|
|
239
|
+
class DotNet(Grpc):
|
|
240
|
+
def __init__(self, parent):
|
|
241
|
+
super().__init__(parent)
|
|
242
|
+
|
|
243
|
+
def __init__(self, pedb, pedb_object, **kwargs):
|
|
244
|
+
self.pedb = pedb
|
|
245
|
+
self.pyedb_obj = pedb_object
|
|
246
|
+
if os.environ["PYEDB_USE_DOTNET"] == "0":
|
|
247
|
+
self.api = self.Grpc(self)
|
|
248
|
+
else:
|
|
249
|
+
self.api = self.DotNet(self)
|
|
250
|
+
|
|
251
|
+
self.enabled = kwargs.get("enabled", None)
|
|
252
|
+
self.reference_designator = kwargs.get("reference_designator", None)
|
|
253
|
+
self.definition = kwargs.get("definition", None)
|
|
254
|
+
self.type = kwargs["part_type"].lower() if kwargs.get("part_type") else None
|
|
255
|
+
self.placement_layer = kwargs.get("placement_layer", None)
|
|
256
|
+
self.pins = kwargs.get("pins", [])
|
|
257
|
+
|
|
258
|
+
self.port_properties = kwargs.get("port_properties", {})
|
|
259
|
+
self.solder_ball_properties = kwargs.get("solder_ball_properties", {})
|
|
260
|
+
self.ic_die_properties = kwargs.get("ic_die_properties", {})
|
|
261
|
+
self.pin_pair_model = kwargs.get("pin_pair_model", [])
|
|
262
|
+
self.spice_model = kwargs.get("spice_model", {})
|
|
263
|
+
self.s_parameter_model = kwargs.get("s_parameter_model", {})
|
|
264
|
+
self.netlist_model = kwargs.get("netlist_model", {})
|
|
237
265
|
|
|
238
266
|
|
|
239
267
|
class CfgComponents:
|
|
240
268
|
def __init__(self, pedb, components_data):
|
|
241
|
-
self.
|
|
269
|
+
self.pedb = pedb
|
|
242
270
|
self.components = []
|
|
243
271
|
|
|
244
272
|
if components_data:
|
|
245
273
|
for comp in components_data:
|
|
246
|
-
obj = self.
|
|
247
|
-
self.components.append(CfgComponent(self.
|
|
274
|
+
obj = self.pedb.layout.find_component_by_name(comp["reference_designator"])
|
|
275
|
+
self.components.append(CfgComponent(self.pedb, obj, **comp))
|
|
248
276
|
|
|
249
277
|
def clean(self):
|
|
250
278
|
self.components = []
|
|
251
279
|
|
|
252
280
|
def apply(self):
|
|
253
281
|
for comp in self.components:
|
|
254
|
-
comp.set_parameters_to_edb()
|
|
282
|
+
comp.api.set_parameters_to_edb()
|
|
255
283
|
|
|
256
284
|
def retrieve_parameters_from_edb(self):
|
|
257
285
|
self.clean()
|
|
258
|
-
comps_in_db = self.
|
|
286
|
+
comps_in_db = self.pedb.components
|
|
259
287
|
for _, comp in comps_in_db.instances.items():
|
|
260
|
-
cfg_comp = CfgComponent(self.
|
|
261
|
-
cfg_comp.retrieve_parameters_from_edb()
|
|
288
|
+
cfg_comp = CfgComponent(self.pedb, comp)
|
|
289
|
+
cfg_comp.api.retrieve_parameters_from_edb()
|
|
262
290
|
self.components.append(cfg_comp)
|
pyedb/configuration/cfg_data.py
CHANGED
|
@@ -31,7 +31,7 @@ from pyedb.configuration.cfg_operations import CfgOperations
|
|
|
31
31
|
from pyedb.configuration.cfg_package_definition import CfgPackageDefinitions
|
|
32
32
|
from pyedb.configuration.cfg_padstacks import CfgPadstacks
|
|
33
33
|
from pyedb.configuration.cfg_pin_groups import CfgPinGroups
|
|
34
|
-
from pyedb.configuration.cfg_ports_sources import CfgPorts, CfgSources
|
|
34
|
+
from pyedb.configuration.cfg_ports_sources import CfgPorts, CfgProbes, CfgSources
|
|
35
35
|
from pyedb.configuration.cfg_s_parameter_models import CfgSParameters
|
|
36
36
|
from pyedb.configuration.cfg_setup import CfgSetups
|
|
37
37
|
from pyedb.configuration.cfg_spice_models import CfgSpiceModel
|
|
@@ -78,3 +78,5 @@ class CfgData(object):
|
|
|
78
78
|
self.modeler = CfgModeler(self._pedb, data=kwargs.get("modeler", {}))
|
|
79
79
|
|
|
80
80
|
self.variables = CfgVariables(self._pedb, data=kwargs.get("variables", []))
|
|
81
|
+
|
|
82
|
+
self.probes = CfgProbes(self._pedb, data=kwargs.get("probes", []))
|
|
@@ -90,8 +90,8 @@ class CfgModeler:
|
|
|
90
90
|
pdef = self._pedb._edb.Definition.PadstackDef.Create(self._pedb.active_db, p.name)
|
|
91
91
|
pdef.SetData(pdata)
|
|
92
92
|
pdef = EDBPadstack(pdef, self._pedb.padstacks)
|
|
93
|
-
p.
|
|
94
|
-
p.set_parameters_to_edb()
|
|
93
|
+
p.pyedb_obj = pdef
|
|
94
|
+
p.api.set_parameters_to_edb()
|
|
95
95
|
|
|
96
96
|
if self.padstack_instances:
|
|
97
97
|
for p in self.padstack_instances:
|
|
@@ -101,8 +101,8 @@ class CfgModeler:
|
|
|
101
101
|
position=p.position,
|
|
102
102
|
definition_name=p.definition,
|
|
103
103
|
)
|
|
104
|
-
p.
|
|
105
|
-
p.set_parameters_to_edb()
|
|
104
|
+
p.pyedb_obj = p_inst
|
|
105
|
+
p.api.set_parameters_to_edb()
|
|
106
106
|
|
|
107
107
|
if self.planes:
|
|
108
108
|
for p in self.planes:
|
|
@@ -136,5 +136,5 @@ class CfgModeler:
|
|
|
136
136
|
placement_layer=c.placement_layer,
|
|
137
137
|
component_part_name=c.definition,
|
|
138
138
|
)
|
|
139
|
-
c.
|
|
140
|
-
c.set_parameters_to_edb()
|
|
139
|
+
c.pyedb_obj = obj
|
|
140
|
+
c.api.set_parameters_to_edb()
|