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 CHANGED
@@ -44,7 +44,7 @@ deprecation_warning()
44
44
  #
45
45
 
46
46
  pyedb_path = os.path.dirname(__file__)
47
- __version__ = "0.41.0"
47
+ __version__ = "0.42.0"
48
48
  version = __version__
49
49
 
50
50
  #
@@ -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.hfss.hfss_extent_info.radiation_level = self.pml_radiation_factor
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
- self.pml_operation_frequency = self._pedb.hfss.hfss_extent_info.operating_freq.tostring
85
- self.pml_radiation_factor = self._pedb.hfss.hfss_extent_info.radiation_level.tostring
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 Common:
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
- c_p.SetModel(m)
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 os.environ["PYEDB_USE_DOTNET"] == "0":
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.layout.find_component_by_name(comp["reference_designator"])
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
- # TODO check if design_options features exists in grpc
36
- # self._pedb.design_options.antipads_always_on = self.anti_pads_always_on
37
- # self._pedb.design_options.suppress_pads = self.suppress_pads
38
- pass
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
- pins = list(pg_obj.pins.keys())
42
- refdes = list(pg_obj.pins.values())[0].component.name
43
- cfg_pg = CfgPinGroup(
44
- self._pedb,
45
- name=pg_name,
46
- reference_designator=refdes,
47
- pins=pins,
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