pyedb 0.41.0__py3-none-any.whl → 0.42.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 +12 -3
- pyedb/configuration/cfg_components.py +333 -97
- pyedb/configuration/cfg_general.py +6 -4
- pyedb/configuration/cfg_pin_groups.py +18 -8
- pyedb/configuration/cfg_setup.py +139 -65
- pyedb/configuration/configuration.py +26 -11
- 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/siwave.py +4 -1
- pyedb/dotnet/database/utilities/simulation_setup.py +8 -3
- pyedb/dotnet/edb.py +2 -5
- 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.42.0.dist-info}/METADATA +1 -1
- {pyedb-0.41.0.dist-info → pyedb-0.42.0.dist-info}/RECORD +23 -23
- {pyedb-0.41.0.dist-info → pyedb-0.42.0.dist-info}/LICENSE +0 -0
- {pyedb-0.41.0.dist-info → pyedb-0.42.0.dist-info}/WHEEL +0 -0
pyedb/__init__.py
CHANGED
|
@@ -53,7 +53,10 @@ class CfgBoundaries(CfgBase):
|
|
|
53
53
|
if self.pml_operation_frequency:
|
|
54
54
|
self._pedb.hfss.hfss_extent_info.operating_freq = self.pml_operation_frequency
|
|
55
55
|
if self.pml_radiation_factor:
|
|
56
|
-
self._pedb.
|
|
56
|
+
if self._pedb.grpc:
|
|
57
|
+
self._pedb.hfss.hfss_extent_info.pml_radiation_factor = self.pml_radiation_factor
|
|
58
|
+
else:
|
|
59
|
+
self._pedb.hfss.hfss_extent_info.radiation_level = self.pml_radiation_factor
|
|
57
60
|
if self.dielectric_extent_type:
|
|
58
61
|
self._pedb.hfss.hfss_extent_info.extent_type = self.dielectric_extent_type.lower()
|
|
59
62
|
# if self.dielectric_base_polygon:
|
|
@@ -81,8 +84,14 @@ class CfgBoundaries(CfgBase):
|
|
|
81
84
|
self.open_region = self._pedb.hfss.hfss_extent_info.use_open_region
|
|
82
85
|
self.open_region_type = self._pedb.hfss.hfss_extent_info.open_region_type
|
|
83
86
|
self.pml_visible = self._pedb.hfss.hfss_extent_info.is_pml_visible
|
|
84
|
-
|
|
85
|
-
|
|
87
|
+
if self._pedb.grpc:
|
|
88
|
+
self.pml_operation_frequency = self._pedb.hfss.hfss_extent_info.operating_freq
|
|
89
|
+
else:
|
|
90
|
+
self.pml_operation_frequency = self._pedb.hfss.hfss_extent_info.operating_freq.tostring
|
|
91
|
+
if self._pedb.grpc:
|
|
92
|
+
self.pml_radiation_factor = self._pedb.hfss.hfss_extent_info.pml_radiation_factor
|
|
93
|
+
else:
|
|
94
|
+
self.pml_radiation_factor = self._pedb.hfss.hfss_extent_info.radiation_level.tostring
|
|
86
95
|
self.dielectric_extent_type = self._pedb.hfss.hfss_extent_info.extent_type
|
|
87
96
|
# self.dielectric_base_polygon = self._pedb.hfss.hfss_extent_info.dielectric_base_polygon
|
|
88
97
|
self.horizontal_padding = self._pedb.hfss.hfss_extent_info.dielectric_extent_size
|
|
@@ -19,14 +19,13 @@
|
|
|
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
|
|
23
22
|
|
|
24
23
|
from pyedb.configuration.cfg_common import CfgBase
|
|
25
24
|
from pyedb.dotnet.database.general import pascal_to_snake, snake_to_pascal
|
|
26
25
|
|
|
27
26
|
|
|
28
27
|
class CfgComponent(CfgBase):
|
|
29
|
-
class
|
|
28
|
+
class Grpc:
|
|
30
29
|
@property
|
|
31
30
|
def pyedb_obj(self):
|
|
32
31
|
return self.parent.pyedb_obj
|
|
@@ -35,6 +34,263 @@ class CfgComponent(CfgBase):
|
|
|
35
34
|
self.parent = parent
|
|
36
35
|
self.pedb = parent.pedb
|
|
37
36
|
|
|
37
|
+
def retrieve_model_properties_from_edb(self):
|
|
38
|
+
from ansys.edb.core.hierarchy.netlist_model import (
|
|
39
|
+
NetlistModel as GrpcNetlistModel,
|
|
40
|
+
)
|
|
41
|
+
from ansys.edb.core.hierarchy.pin_pair_model import (
|
|
42
|
+
PinPairModel as GrpcPinPairModel,
|
|
43
|
+
)
|
|
44
|
+
from ansys.edb.core.hierarchy.sparameter_model import (
|
|
45
|
+
SParameterModel as GrpcSParameterModel,
|
|
46
|
+
)
|
|
47
|
+
from ansys.edb.core.hierarchy.spice_model import (
|
|
48
|
+
SPICEModel as GrpcSPICEModel,
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
c_p = self.pyedb_obj.component_property
|
|
52
|
+
model = c_p.model
|
|
53
|
+
if isinstance(model, GrpcNetlistModel):
|
|
54
|
+
self.parent.netlist_model["netlist"] = model.netlist
|
|
55
|
+
elif isinstance(model, GrpcPinPairModel):
|
|
56
|
+
temp = {}
|
|
57
|
+
for i in model.pin_pairs():
|
|
58
|
+
temp["first_pin"] = i[0]
|
|
59
|
+
temp["second_pin"] = i[1]
|
|
60
|
+
rlc = model.rlc(i)
|
|
61
|
+
temp["is_parallel"] = rlc.is_parallel
|
|
62
|
+
temp["resistance"] = rlc.r.value
|
|
63
|
+
temp["resistance_enabled"] = rlc.r_enabled
|
|
64
|
+
temp["inductance"] = rlc.l.value
|
|
65
|
+
temp["inductance_enabled"] = rlc.l_enabled
|
|
66
|
+
temp["capacitance"] = rlc.c.value
|
|
67
|
+
temp["capacitance_enabled"] = rlc.c_enabled
|
|
68
|
+
self.parent.pin_pair_model.append(temp)
|
|
69
|
+
elif isinstance(model, GrpcSParameterModel):
|
|
70
|
+
self.parent.s_parameter_model["reference_net"] = model.reference_net
|
|
71
|
+
self.parent.s_parameter_model["model_name"] = model.component_model
|
|
72
|
+
elif isinstance(model, GrpcSPICEModel):
|
|
73
|
+
self.parent.spice_model["model_name"] = model.model_name
|
|
74
|
+
self.parent.spice_model["model_path"] = model.model_path
|
|
75
|
+
self.parent.spice_model["sub_circuit"] = model.sub_circuit
|
|
76
|
+
# check bug #525 status
|
|
77
|
+
self.parent.spice_model["terminal_pairs"] = [[i, j] for i, j in dict(model.terminals.items())]
|
|
78
|
+
|
|
79
|
+
def _set_model_properties_to_edb(self):
|
|
80
|
+
c_p = self.pyedb_obj.component_property
|
|
81
|
+
if self.parent.netlist_model:
|
|
82
|
+
m = self.pedb._edb.Cell.Hierarchy.SParameterModel()
|
|
83
|
+
m.net_list = self.parent.netlist_model["netlist"]
|
|
84
|
+
c_p.model = m
|
|
85
|
+
self.component_property = c_p
|
|
86
|
+
elif self.parent.pin_pair_model:
|
|
87
|
+
from ansys.edb.core.hierarchy.pin_pair_model import (
|
|
88
|
+
PinPairModel as GrpcPinPairModel,
|
|
89
|
+
)
|
|
90
|
+
from ansys.edb.core.utility.rlc import Rlc as GrpcRlc
|
|
91
|
+
from ansys.edb.core.utility.value import Value as GrpcValue
|
|
92
|
+
|
|
93
|
+
m = GrpcPinPairModel.create()
|
|
94
|
+
for i in self.parent.pin_pair_model:
|
|
95
|
+
p = (str(i["first_pin"]), str(i["second_pin"]))
|
|
96
|
+
rlc = GrpcRlc(
|
|
97
|
+
r_enabled=i["resistance_enabled"],
|
|
98
|
+
r=GrpcValue(i["resistance"]),
|
|
99
|
+
l_enabled=i["inductance_enabled"],
|
|
100
|
+
l=GrpcValue(i["inductance"]),
|
|
101
|
+
c_enabled=i["capacitance_enabled"],
|
|
102
|
+
c=GrpcValue(i["capacitance"]),
|
|
103
|
+
is_parallel=i["is_parallel"],
|
|
104
|
+
)
|
|
105
|
+
m.set_rlc(pin_pair=p, rlc=rlc)
|
|
106
|
+
c_p.model = m
|
|
107
|
+
from ansys.edb.core.hierarchy.pin_pair_model import (
|
|
108
|
+
PinPairModel as GrpcPinPairModel,
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
self.pyedb_obj.component_property = c_p
|
|
112
|
+
elif self.parent.s_parameter_model:
|
|
113
|
+
from ansys.edb.core.hierarchy.sparameter_model import (
|
|
114
|
+
SParameterModel as GrpcSParameterModel,
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
m = GrpcSParameterModel.create(
|
|
118
|
+
name=self.parent.s_parameter_model["model_name"],
|
|
119
|
+
ref_net=self.parent.s_parameter_model["reference_net"],
|
|
120
|
+
)
|
|
121
|
+
c_p.model = m
|
|
122
|
+
self.component_property = c_p
|
|
123
|
+
elif self.parent.spice_model:
|
|
124
|
+
self.pyedb_obj.assign_spice_model(
|
|
125
|
+
self.parent.spice_model["model_path"],
|
|
126
|
+
self.parent.spice_model["model_name"],
|
|
127
|
+
self.parent.spice_model["sub_circuit"],
|
|
128
|
+
self.parent.spice_model["terminal_pairs"],
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
def _retrieve_ic_die_properties_from_edb(self):
|
|
132
|
+
temp = dict()
|
|
133
|
+
cp = self.pyedb_obj.component_property
|
|
134
|
+
|
|
135
|
+
ic_die_prop = cp.die_property
|
|
136
|
+
die_type = pascal_to_snake(ic_die_prop.die_type.name)
|
|
137
|
+
temp["type"] = die_type
|
|
138
|
+
if not die_type == "no_die":
|
|
139
|
+
temp["orientation"] = pascal_to_snake(ic_die_prop.die_orientation.name)
|
|
140
|
+
if die_type == "wire_bond":
|
|
141
|
+
temp["height"] = ic_die_prop.height.value
|
|
142
|
+
|
|
143
|
+
self.parent.ic_die_properties = temp
|
|
144
|
+
|
|
145
|
+
def _set_ic_die_properties_to_edb(self):
|
|
146
|
+
from ansys.edb.core.definition.die_property import (
|
|
147
|
+
DieOrientation as GrpcDieOrientation,
|
|
148
|
+
)
|
|
149
|
+
from ansys.edb.core.definition.die_property import DieType as GrpcDieType
|
|
150
|
+
from ansys.edb.core.utility.value import Value as GrpcValue
|
|
151
|
+
|
|
152
|
+
cp = self.pyedb_obj.component_property
|
|
153
|
+
ic_die_prop = cp.die_property
|
|
154
|
+
die_type = self.parent.ic_die_properties.get("type")
|
|
155
|
+
die_type = snake_to_pascal(die_type)
|
|
156
|
+
if die_type == "wirebond":
|
|
157
|
+
ic_die_prop.die_type = GrpcDieType.WIREBOND
|
|
158
|
+
elif die_type == "flipchip":
|
|
159
|
+
ic_die_prop.die_type = GrpcDieType.FLIPCHIP
|
|
160
|
+
elif not die_type == "no_die":
|
|
161
|
+
orientation = self.parent.ic_die_properties.get("orientation")
|
|
162
|
+
if orientation == "chip_up":
|
|
163
|
+
ic_die_prop.die_orientation = GrpcDieOrientation.CHIP_UP
|
|
164
|
+
else:
|
|
165
|
+
ic_die_prop.die_orientation = GrpcDieOrientation.CHIP_DOWN
|
|
166
|
+
if die_type == "wire_bond":
|
|
167
|
+
height = self.parent.ic_die_properties.get("height")
|
|
168
|
+
if height:
|
|
169
|
+
ic_die_prop.height = GrpcValue(height)
|
|
170
|
+
cp.die_property = ic_die_prop
|
|
171
|
+
self.pyedb_obj.component_property = cp
|
|
172
|
+
|
|
173
|
+
def _retrieve_solder_ball_properties_from_edb(self):
|
|
174
|
+
temp = dict()
|
|
175
|
+
cp = self.pyedb_obj.component_property
|
|
176
|
+
solder_ball_prop = None
|
|
177
|
+
try:
|
|
178
|
+
solder_ball_prop = cp.solder_ball_property
|
|
179
|
+
diam, mid_diam = solder_ball_prop.get_diameter()
|
|
180
|
+
height = solder_ball_prop.height
|
|
181
|
+
shape = solder_ball_prop.shape.name
|
|
182
|
+
material = solder_ball_prop.material_name
|
|
183
|
+
uses_solder_ball = solder_ball_prop.uses_solderball
|
|
184
|
+
|
|
185
|
+
temp["uses_solder_ball"] = uses_solder_ball
|
|
186
|
+
temp["shape"] = pascal_to_snake(shape)
|
|
187
|
+
temp["diameter"] = diam
|
|
188
|
+
temp["mid_diameter"] = mid_diam
|
|
189
|
+
temp["height"] = height
|
|
190
|
+
temp["material"] = material
|
|
191
|
+
|
|
192
|
+
self.parent.solder_ball_properties = temp
|
|
193
|
+
except:
|
|
194
|
+
if not solder_ball_prop:
|
|
195
|
+
self.pedb.logger.warning(
|
|
196
|
+
f"Failed retrieving solder balls property on component {self.pyedb_obj.name}"
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
def _set_solder_ball_properties_to_edb(self):
|
|
200
|
+
from ansys.edb.core.definition.solder_ball_property import (
|
|
201
|
+
SolderballShape as GrpcSolderballShape,
|
|
202
|
+
)
|
|
203
|
+
from ansys.edb.core.utility.value import Value as GrpcValue
|
|
204
|
+
|
|
205
|
+
cp = self.pyedb_obj.component_property
|
|
206
|
+
solder_ball_prop = cp.solder_ball_property
|
|
207
|
+
shape = self.parent.solder_ball_properties.get("shape")
|
|
208
|
+
if shape == "cylinder":
|
|
209
|
+
solder_ball_prop.shape = GrpcSolderballShape.SOLDERBALL_CYLINDER
|
|
210
|
+
diameter = self.parent.solder_ball_properties["diameter"]
|
|
211
|
+
solder_ball_prop.set_diameter(GrpcValue(diameter), GrpcValue(diameter))
|
|
212
|
+
elif shape == "spheroid":
|
|
213
|
+
solder_ball_prop.shape = GrpcSolderballShape.SOLDERBALL_SPHEROID
|
|
214
|
+
diameter = self.parent.solder_ball_properties["diameter"]
|
|
215
|
+
mid_diameter = self.parent.solder_ball_properties["mid_diameter"]
|
|
216
|
+
solder_ball_prop.set_diameter(GrpcValue(diameter), GrpcValue(mid_diameter))
|
|
217
|
+
else:
|
|
218
|
+
raise ValueError("Solderball shape must be either cylinder or spheroid")
|
|
219
|
+
|
|
220
|
+
solder_ball_prop.height = GrpcValue(self.parent.solder_ball_properties["height"])
|
|
221
|
+
solder_ball_prop.material_name = self.parent.solder_ball_properties.get("material", "solder")
|
|
222
|
+
cp.solder_ball_property = solder_ball_prop
|
|
223
|
+
self.pyedb_obj.component_property = cp
|
|
224
|
+
|
|
225
|
+
def _retrieve_port_properties_from_edb(self):
|
|
226
|
+
temp = dict()
|
|
227
|
+
cp = self.pyedb_obj.component_property
|
|
228
|
+
c_type = self.parent.type.lower()
|
|
229
|
+
if c_type not in ["ic", "io", "other"]:
|
|
230
|
+
return
|
|
231
|
+
else:
|
|
232
|
+
try:
|
|
233
|
+
port_prop = cp.port_property
|
|
234
|
+
reference_height = port_prop.reference_height.value
|
|
235
|
+
reference_size_auto = port_prop.reference_size_auto
|
|
236
|
+
reference_size_x, reference_size_y = port_prop.get_reference_size()
|
|
237
|
+
temp["reference_height"] = reference_height
|
|
238
|
+
temp["reference_size_auto"] = reference_size_auto
|
|
239
|
+
temp["reference_size_x"] = reference_size_x.value
|
|
240
|
+
temp["reference_size_y"] = reference_size_y.value
|
|
241
|
+
self.parent.port_properties = temp
|
|
242
|
+
except:
|
|
243
|
+
self.pedb.logger.warning(f"No port property found on component {self.pyedb_obj.name}")
|
|
244
|
+
|
|
245
|
+
def _set_port_properties_to_edb(self):
|
|
246
|
+
from ansys.edb.core.utility.value import Value as GrpcValue
|
|
247
|
+
|
|
248
|
+
cp = self.pyedb_obj.component_property
|
|
249
|
+
port_prop = cp.port_property
|
|
250
|
+
height = self.parent.port_properties.get("reference_height")
|
|
251
|
+
if height:
|
|
252
|
+
port_prop.reference_height = GrpcValue(height)
|
|
253
|
+
reference_size_auto = self.parent.port_properties.get("reference_size_auto")
|
|
254
|
+
if reference_size_auto is not None:
|
|
255
|
+
port_prop.reference_size_auto = reference_size_auto
|
|
256
|
+
reference_size_x = self.parent.port_properties.get("reference_size_x", 0)
|
|
257
|
+
reference_size_y = self.parent.port_properties.get("reference_size_y", 0)
|
|
258
|
+
port_prop.set_reference_size(GrpcValue(reference_size_x), GrpcValue(reference_size_y))
|
|
259
|
+
cp.port_property = port_prop
|
|
260
|
+
self.pyedb_obj.component_property = cp
|
|
261
|
+
|
|
262
|
+
def set_parameters_to_edb(self):
|
|
263
|
+
if self.parent.type:
|
|
264
|
+
self.pyedb_obj.type = self.parent.type
|
|
265
|
+
if self.parent.enabled:
|
|
266
|
+
self.pyedb_obj.enabled = self.parent.enabled
|
|
267
|
+
|
|
268
|
+
self._set_model_properties_to_edb()
|
|
269
|
+
if self.pyedb_obj.type.lower() == "ic":
|
|
270
|
+
self._set_ic_die_properties_to_edb()
|
|
271
|
+
self._set_port_properties_to_edb()
|
|
272
|
+
self._set_solder_ball_properties_to_edb()
|
|
273
|
+
elif self.pyedb_obj.type.lower() in ["io", "other"]:
|
|
274
|
+
self._set_solder_ball_properties_to_edb()
|
|
275
|
+
self._set_port_properties_to_edb()
|
|
276
|
+
|
|
277
|
+
def retrieve_parameters_from_edb(self):
|
|
278
|
+
self.parent.type = self.pyedb_obj.type
|
|
279
|
+
self.parent.definition = self.pyedb_obj.part_name
|
|
280
|
+
self.parent.reference_designator = self.pyedb_obj.name
|
|
281
|
+
self.retrieve_model_properties_from_edb()
|
|
282
|
+
if self.pyedb_obj.type.lower() == "ic":
|
|
283
|
+
self._retrieve_ic_die_properties_from_edb()
|
|
284
|
+
self._retrieve_port_properties_from_edb()
|
|
285
|
+
self._retrieve_solder_ball_properties_from_edb()
|
|
286
|
+
elif self.pyedb_obj.type.lower() in ["io", "other"]:
|
|
287
|
+
self._retrieve_solder_ball_properties_from_edb()
|
|
288
|
+
self._retrieve_port_properties_from_edb()
|
|
289
|
+
|
|
290
|
+
class DotNet(Grpc):
|
|
291
|
+
def __init__(self, parent):
|
|
292
|
+
super().__init__(parent)
|
|
293
|
+
|
|
38
294
|
def retrieve_model_properties_from_edb(self):
|
|
39
295
|
c_p = self.pyedb_obj.component_property
|
|
40
296
|
model = c_p.GetModel().Clone()
|
|
@@ -66,6 +322,39 @@ class CfgComponent(CfgBase):
|
|
|
66
322
|
[i, j] for i, j in dict(model.GetTerminalPinPairs()).items()
|
|
67
323
|
]
|
|
68
324
|
|
|
325
|
+
def _set_ic_die_properties_to_edb(self):
|
|
326
|
+
cp = self.pyedb_obj.component_property
|
|
327
|
+
ic_die_prop = cp.GetDieProperty().Clone()
|
|
328
|
+
die_type = self.parent.ic_die_properties.get("type")
|
|
329
|
+
ic_die_prop.SetType(getattr(self.pedb._edb.Definition.DieType, snake_to_pascal(die_type)))
|
|
330
|
+
if not die_type == "no_die":
|
|
331
|
+
orientation = self.parent.ic_die_properties.get("orientation")
|
|
332
|
+
if orientation:
|
|
333
|
+
ic_die_prop.SetOrientation(
|
|
334
|
+
getattr(self.pedb._edb.Definition.DieOrientation, snake_to_pascal(orientation))
|
|
335
|
+
)
|
|
336
|
+
if die_type == "wire_bond":
|
|
337
|
+
height = self.parent.ic_die_properties.get("height")
|
|
338
|
+
if height:
|
|
339
|
+
ic_die_prop.SetHeight(self.pedb.edb_value(height))
|
|
340
|
+
cp.SetDieProperty(ic_die_prop)
|
|
341
|
+
self.pyedb_obj.component_property = cp
|
|
342
|
+
|
|
343
|
+
def _set_port_properties_to_edb(self):
|
|
344
|
+
cp = self.pyedb_obj.component_property
|
|
345
|
+
port_prop = cp.GetPortProperty().Clone()
|
|
346
|
+
height = self.parent.port_properties.get("reference_height")
|
|
347
|
+
if height:
|
|
348
|
+
port_prop.SetReferenceHeight(self.pedb.edb_value(height))
|
|
349
|
+
reference_size_auto = self.parent.port_properties.get("reference_size_auto")
|
|
350
|
+
if reference_size_auto is not None:
|
|
351
|
+
port_prop.SetReferenceSizeAuto(reference_size_auto)
|
|
352
|
+
reference_size_x = self.parent.port_properties.get("reference_size_x", 0)
|
|
353
|
+
reference_size_y = self.parent.port_properties.get("reference_size_y", 0)
|
|
354
|
+
port_prop.SetReferenceSize(self.pedb.edb_value(reference_size_x), self.pedb.edb_value(reference_size_y))
|
|
355
|
+
cp.SetPortProperty(port_prop)
|
|
356
|
+
self.pyedb_obj.component_property = cp
|
|
357
|
+
|
|
69
358
|
def _set_model_properties_to_edb(self):
|
|
70
359
|
c_p = self.pyedb_obj.component_property
|
|
71
360
|
if self.parent.netlist_model:
|
|
@@ -87,7 +376,22 @@ class CfgComponent(CfgBase):
|
|
|
87
376
|
i["is_parallel"],
|
|
88
377
|
)
|
|
89
378
|
m.SetPinPairRlc(p, rlc)
|
|
90
|
-
|
|
379
|
+
c_p.SetModel(m)
|
|
380
|
+
|
|
381
|
+
m = self.pedb._edb.Cell.Hierarchy.PinPairModel()
|
|
382
|
+
for i in self.parent.pin_pair_model:
|
|
383
|
+
p = self.pedb._edb.Utility.PinPair(str(i["first_pin"]), str(i["second_pin"]))
|
|
384
|
+
rlc = self.pedb._edb.Utility.Rlc(
|
|
385
|
+
self.pedb.edb_value(i["resistance"]),
|
|
386
|
+
i["resistance_enabled"],
|
|
387
|
+
self.pedb.edb_value(i["inductance"]),
|
|
388
|
+
i["inductance_enabled"],
|
|
389
|
+
self.pedb.edb_value(i["capacitance"]),
|
|
390
|
+
i["capacitance_enabled"],
|
|
391
|
+
i["is_parallel"],
|
|
392
|
+
)
|
|
393
|
+
m.SetPinPairRlc(p, rlc)
|
|
394
|
+
c_p.SetModel(m)
|
|
91
395
|
self.pyedb_obj.component_property = c_p
|
|
92
396
|
elif self.parent.s_parameter_model:
|
|
93
397
|
m = self.pedb._edb.Cell.Hierarchy.SParameterModel()
|
|
@@ -103,9 +407,33 @@ class CfgComponent(CfgBase):
|
|
|
103
407
|
self.parent.spice_model["terminal_pairs"],
|
|
104
408
|
)
|
|
105
409
|
|
|
410
|
+
def _set_solder_ball_properties_to_edb(self):
|
|
411
|
+
cp = self.pyedb_obj.component_property
|
|
412
|
+
solder_ball_prop = cp.GetSolderBallProperty().Clone()
|
|
413
|
+
shape = self.parent.solder_ball_properties.get("shape")
|
|
414
|
+
if shape:
|
|
415
|
+
solder_ball_prop.SetShape(getattr(self.pedb._edb.Definition.SolderballShape, snake_to_pascal(shape)))
|
|
416
|
+
else:
|
|
417
|
+
return
|
|
418
|
+
|
|
419
|
+
if shape == "cylinder":
|
|
420
|
+
diameter = self.parent.solder_ball_properties["diameter"]
|
|
421
|
+
solder_ball_prop.SetDiameter(self.pedb.edb_value(diameter), self.pedb.edb_value(diameter))
|
|
422
|
+
elif shape == "spheroid":
|
|
423
|
+
diameter = self.parent.solder_ball_properties["diameter"]
|
|
424
|
+
mid_diameter = self.parent.solder_ball_properties["mid_diameter"]
|
|
425
|
+
solder_ball_prop.SetDiameter(self.pedb.edb_value(diameter), self.pedb.edb_value(mid_diameter))
|
|
426
|
+
else:
|
|
427
|
+
raise ValueError("Solderball shape must be either cylinder or spheroid")
|
|
428
|
+
solder_ball_prop.SetHeight(self.pedb.edb_value(self.parent.solder_ball_properties["height"]))
|
|
429
|
+
solder_ball_prop.SetMaterialName(self.parent.solder_ball_properties.get("material", "solder"))
|
|
430
|
+
cp.SetSolderBallProperty(solder_ball_prop)
|
|
431
|
+
self.pyedb_obj.component_property = cp
|
|
432
|
+
|
|
106
433
|
def _retrieve_ic_die_properties_from_edb(self):
|
|
107
434
|
temp = dict()
|
|
108
435
|
cp = self.pyedb_obj.component_property
|
|
436
|
+
|
|
109
437
|
ic_die_prop = cp.GetDieProperty().Clone()
|
|
110
438
|
die_type = pascal_to_snake(ic_die_prop.GetType().ToString())
|
|
111
439
|
temp["type"] = die_type
|
|
@@ -115,24 +443,6 @@ class CfgComponent(CfgBase):
|
|
|
115
443
|
temp["height"] = ic_die_prop.GetHeightValue().ToString()
|
|
116
444
|
self.parent.ic_die_properties = temp
|
|
117
445
|
|
|
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
|
|
135
|
-
|
|
136
446
|
def _retrieve_solder_ball_properties_from_edb(self):
|
|
137
447
|
temp = dict()
|
|
138
448
|
cp = self.pyedb_obj.component_property
|
|
@@ -151,29 +461,6 @@ class CfgComponent(CfgBase):
|
|
|
151
461
|
temp["material"] = material
|
|
152
462
|
self.parent.solder_ball_properties = temp
|
|
153
463
|
|
|
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
|
|
162
|
-
|
|
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
464
|
def _retrieve_port_properties_from_edb(self):
|
|
178
465
|
temp = dict()
|
|
179
466
|
cp = self.pyedb_obj.component_property
|
|
@@ -191,61 +478,10 @@ class CfgComponent(CfgBase):
|
|
|
191
478
|
temp["reference_size_y"] = str(reference_size_y)
|
|
192
479
|
self.parent.port_properties = temp
|
|
193
480
|
|
|
194
|
-
def _set_port_properties_to_edb(self):
|
|
195
|
-
cp = self.pyedb_obj.component_property
|
|
196
|
-
port_prop = cp.GetPortProperty().Clone()
|
|
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
|
|
208
|
-
|
|
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
|
|
214
|
-
|
|
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
|
-
self._set_solder_ball_properties_to_edb()
|
|
220
|
-
elif self.pyedb_obj.type.lower() in ["io", "other"]:
|
|
221
|
-
self._set_solder_ball_properties_to_edb()
|
|
222
|
-
self._set_port_properties_to_edb()
|
|
223
|
-
|
|
224
|
-
def retrieve_parameters_from_edb(self):
|
|
225
|
-
self.parent.type = self.pyedb_obj.type
|
|
226
|
-
self.parent.definition = self.pyedb_obj.part_name
|
|
227
|
-
self.parent.reference_designator = self.pyedb_obj.name
|
|
228
|
-
self.retrieve_model_properties_from_edb()
|
|
229
|
-
if self.pyedb_obj.type.lower() == "ic":
|
|
230
|
-
self._retrieve_ic_die_properties_from_edb()
|
|
231
|
-
self._retrieve_port_properties_from_edb()
|
|
232
|
-
self._retrieve_solder_ball_properties_from_edb()
|
|
233
|
-
elif self.pyedb_obj.type.lower() in ["io", "other"]:
|
|
234
|
-
self._retrieve_solder_ball_properties_from_edb()
|
|
235
|
-
self._retrieve_port_properties_from_edb()
|
|
236
|
-
|
|
237
|
-
class Grpc(Common):
|
|
238
|
-
def __init__(self, parent):
|
|
239
|
-
super().__init__(parent)
|
|
240
|
-
|
|
241
|
-
class DotNet(Grpc):
|
|
242
|
-
def __init__(self, parent):
|
|
243
|
-
super().__init__(parent)
|
|
244
|
-
|
|
245
481
|
def __init__(self, pedb, pedb_object, **kwargs):
|
|
246
482
|
self.pedb = pedb
|
|
247
483
|
self.pyedb_obj = pedb_object
|
|
248
|
-
if
|
|
484
|
+
if self.pedb.grpc:
|
|
249
485
|
self.api = self.Grpc(self)
|
|
250
486
|
else:
|
|
251
487
|
self.api = self.DotNet(self)
|
|
@@ -273,7 +509,7 @@ class CfgComponents:
|
|
|
273
509
|
|
|
274
510
|
if components_data:
|
|
275
511
|
for comp in components_data:
|
|
276
|
-
obj = self.pedb.
|
|
512
|
+
obj = self.pedb.components.instances[comp["reference_designator"]]
|
|
277
513
|
self.components.append(CfgComponent(self.pedb, obj, **comp))
|
|
278
514
|
|
|
279
515
|
def clean(self):
|
|
@@ -32,10 +32,12 @@ class CfgGeneral:
|
|
|
32
32
|
self.suppress_pads = data.get("suppress_pads", True)
|
|
33
33
|
|
|
34
34
|
def apply(self):
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
if self._pedb.grpc:
|
|
36
|
+
self._pedb.active_cell.anti_pads_always_on = self.anti_pads_always_on
|
|
37
|
+
self._pedb.active_cell.suppress_pads = self.suppress_pads
|
|
38
|
+
else:
|
|
39
|
+
self._pedb.design_options.antipads_always_on = self.anti_pads_always_on
|
|
40
|
+
self._pedb.design_options.suppress_pads = self.suppress_pads
|
|
39
41
|
|
|
40
42
|
def get_data_from_db(self):
|
|
41
43
|
self.anti_pads_always_on = self._pedb.design_options.antipads_always_on
|
|
@@ -38,14 +38,24 @@ class CfgPinGroups:
|
|
|
38
38
|
self.pin_groups = []
|
|
39
39
|
layout_pin_groups = self._pedb.siwave.pin_groups
|
|
40
40
|
for pg_name, pg_obj in layout_pin_groups.items():
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
41
|
+
if self._pedb.grpc:
|
|
42
|
+
pins = pg_obj.pins
|
|
43
|
+
refdes = pins[0].component.name
|
|
44
|
+
cfg_pg = CfgPinGroup(
|
|
45
|
+
self._pedb,
|
|
46
|
+
name=pg_name,
|
|
47
|
+
reference_designator=refdes,
|
|
48
|
+
pins=[pin.component_pin for pin in pins],
|
|
49
|
+
)
|
|
50
|
+
else:
|
|
51
|
+
pins = list(pg_obj.pins.keys())
|
|
52
|
+
refdes = list(pg_obj.pins.values())[0].component.name
|
|
53
|
+
cfg_pg = CfgPinGroup(
|
|
54
|
+
self._pedb,
|
|
55
|
+
name=pg_name,
|
|
56
|
+
reference_designator=refdes,
|
|
57
|
+
pins=pins,
|
|
58
|
+
)
|
|
49
59
|
self.pin_groups.append(cfg_pg)
|
|
50
60
|
return self.export_properties()
|
|
51
61
|
|