pyedb 0.47.1__py3-none-any.whl → 0.49.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of pyedb might be problematic. Click here for more details.

Files changed (37) hide show
  1. pyedb/__init__.py +1 -1
  2. pyedb/configuration/cfg_stackup.py +35 -1
  3. pyedb/configuration/configuration.py +13 -13
  4. pyedb/dotnet/database/cell/hierarchy/component.py +61 -5
  5. pyedb/dotnet/database/cell/hierarchy/s_parameter_model.py +7 -0
  6. pyedb/dotnet/database/cell/primitive/primitive.py +8 -1
  7. pyedb/dotnet/database/cell/terminal/terminal.py +25 -7
  8. pyedb/dotnet/database/components.py +87 -46
  9. pyedb/dotnet/database/definition/package_def.py +29 -5
  10. pyedb/dotnet/database/dotnet/database.py +18 -0
  11. pyedb/dotnet/database/edb_data/padstacks_data.py +25 -5
  12. pyedb/dotnet/database/edb_data/ports.py +14 -0
  13. pyedb/dotnet/database/edb_data/utilities.py +1 -1
  14. pyedb/dotnet/database/geometry/polygon_data.py +15 -2
  15. pyedb/dotnet/database/hfss.py +11 -1
  16. pyedb/dotnet/database/materials.py +78 -0
  17. pyedb/dotnet/database/modeler.py +21 -10
  18. pyedb/dotnet/database/padstack.py +7 -5
  19. pyedb/dotnet/database/sim_setup_data/data/mesh_operation.py +24 -0
  20. pyedb/dotnet/database/siwave.py +37 -33
  21. pyedb/dotnet/database/utilities/simulation_setup.py +51 -9
  22. pyedb/dotnet/database/utilities/siwave_simulation_setup.py +3 -1
  23. pyedb/dotnet/edb.py +67 -8
  24. pyedb/grpc/database/components.py +19 -13
  25. pyedb/grpc/database/hfss.py +3 -3
  26. pyedb/grpc/database/modeler.py +4 -4
  27. pyedb/grpc/database/padstacks.py +3 -1
  28. pyedb/grpc/database/ports/ports.py +4 -0
  29. pyedb/grpc/database/primitive/path.py +2 -2
  30. pyedb/grpc/database/primitive/primitive.py +6 -1
  31. pyedb/grpc/database/source_excitations.py +16 -8
  32. pyedb/grpc/database/terminal/bundle_terminal.py +1 -1
  33. pyedb/grpc/edb.py +125 -32
  34. {pyedb-0.47.1.dist-info → pyedb-0.49.0.dist-info}/METADATA +1 -1
  35. {pyedb-0.47.1.dist-info → pyedb-0.49.0.dist-info}/RECORD +37 -37
  36. {pyedb-0.47.1.dist-info → pyedb-0.49.0.dist-info}/LICENSE +0 -0
  37. {pyedb-0.47.1.dist-info → pyedb-0.49.0.dist-info}/WHEEL +0 -0
@@ -19,6 +19,7 @@
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 warnings
22
23
 
23
24
  from pyedb.dotnet.database.geometry.polygon_data import PolygonData
24
25
  from pyedb.dotnet.database.utilities.obj_base import ObjBase
@@ -105,15 +106,29 @@ class PackageDef(ObjBase):
105
106
  self._edb_object.SetMaximumPower(value)
106
107
 
107
108
  @property
108
- def therm_cond(self):
109
- """Thermal conductivity of the package."""
109
+ def thermal_conductivity(self):
110
+ """Adding this property for compatibility with grpc."""
110
111
  return self._edb_object.GetTherm_Cond().ToDouble()
111
112
 
112
- @therm_cond.setter
113
- def therm_cond(self, value):
113
+ @thermal_conductivity.setter
114
+ def thermal_conductivity(self, value):
114
115
  value = self._pedb.edb_value(value)
115
116
  self._edb_object.SetTherm_Cond(value)
116
117
 
118
+ @property
119
+ def therm_cond(self):
120
+ """Thermal conductivity of the package.
121
+
122
+ ..deprecated:: 0.48.0
123
+ Use: func:`thermal_conductivity` property instead.
124
+ """
125
+ warnings.warn("Use property thermal_conductivity instead.", DeprecationWarning)
126
+ return self.thermal_conductivity
127
+
128
+ @therm_cond.setter
129
+ def therm_cond(self, value):
130
+ self.thermal_conductivity = value
131
+
117
132
  @property
118
133
  def theta_jb(self):
119
134
  """Theta Junction-to-Board of the package."""
@@ -153,10 +168,19 @@ class PackageDef(ObjBase):
153
168
  heatsink.fin_orientation = fin_orientation
154
169
  heatsink.fin_spacing = fin_spacing
155
170
  heatsink.fin_thickness = fin_thickness
156
- self._edb_object.SetHeatSink(heatsink._edb_object)
171
+ return self._edb_object.SetHeatSink(heatsink._edb_object)
157
172
 
158
173
  @property
159
174
  def heatsink(self):
175
+ """Component heatsink.
176
+
177
+ ..deprecated:: 0.48.0
178
+ Use: func:`heat_sink` property instead.
179
+ """
180
+ return self.heat_sink
181
+
182
+ @property
183
+ def heat_sink(self):
160
184
  """Component heatsink."""
161
185
  from pyedb.dotnet.database.utilities.heatsink import HeatSink
162
186
 
@@ -484,6 +484,24 @@ class CellClassDotNet:
484
484
 
485
485
  return PrimitiveDotNet(self._app)
486
486
 
487
+ @property
488
+ def simulation_setups(self):
489
+ return self._app.setups
490
+
491
+ def get_all_variable_names(self):
492
+ """Method added for compatibility with grpc.
493
+
494
+ Returns
495
+ -------
496
+ List[Str]
497
+ List of variables name.
498
+
499
+ """
500
+ return list(self._app.variable_exists("")[1].GetAllVariableNames())
501
+
502
+ def get_variable_value(self, variable_name):
503
+ return self._app.variables[variable_name]
504
+
487
505
 
488
506
  class UtilityDotNet:
489
507
  """Utility Edb class."""
@@ -1261,6 +1261,8 @@ class EDBPadstackInstance(Primitive):
1261
1261
  """
1262
1262
  terminal = self.create_terminal(name)
1263
1263
  if reference:
1264
+ if isinstance(reference, tuple):
1265
+ reference = reference[1]
1264
1266
  ref_terminal = reference.create_terminal(terminal.name + "_ref")
1265
1267
  if reference._edb_object.ToString() == "PinGroup":
1266
1268
  is_circuit_port = True
@@ -1463,6 +1465,19 @@ class EDBPadstackInstance(Primitive):
1463
1465
  else:
1464
1466
  return self._edb_padstackinstance.SetBackDrillParameters(layer, val, False)
1465
1467
 
1468
+ @property
1469
+ def backdrill_type(self):
1470
+ """Adding grpc compatibility. DotNet is supporting only layer drill type with adding stub length."""
1471
+ return "layer_drill"
1472
+
1473
+ def get_back_drill_by_layer(self):
1474
+ params = self.backdrill_parameters["from_bottom"]
1475
+ return (
1476
+ params["drill_to_layer"],
1477
+ round(self._pedb.edb_value(params["stub_length"]).ToDouble(), 6),
1478
+ round(self._pedb.edb_value(params["diameter"]).ToDouble(), 6),
1479
+ )
1480
+
1466
1481
  @property
1467
1482
  def backdrill_bottom(self):
1468
1483
  """Backdrill layer from bottom.
@@ -1539,6 +1554,11 @@ class EDBPadstackInstance(Primitive):
1539
1554
  False,
1540
1555
  )
1541
1556
 
1557
+ def set_back_drill_by_layer(self, drill_to_layer, diameter, offset):
1558
+ """Method added to bring compatibility with grpc."""
1559
+
1560
+ self.set_backdrill_bottom(drill_depth=drill_to_layer.name, drill_diameter=diameter, offset=offset)
1561
+
1542
1562
  def set_backdrill_bottom(self, drill_depth, drill_diameter, offset=0.0):
1543
1563
  """Set backdrill from bottom.
1544
1564
 
@@ -1676,9 +1696,9 @@ class EDBPadstackInstance(Primitive):
1676
1696
  out = self._edb_padstackinstance.GetPositionAndRotationValue()
1677
1697
  if self._edb_padstackinstance.GetComponent():
1678
1698
  out2 = self._edb_padstackinstance.GetComponent().GetTransform().TransformPoint(out[1])
1679
- self._position = [out2.X.ToDouble(), out2.Y.ToDouble()]
1699
+ self._position = [round(out2.X.ToDouble(), 6), round(out2.Y.ToDouble(), 6)]
1680
1700
  elif out[0]:
1681
- self._position = [out[1].X.ToDouble(), out[1].Y.ToDouble()]
1701
+ self._position = [round(out[1].X.ToDouble(), 6), round(out[1].Y.ToDouble(), 6)]
1682
1702
  return self._position
1683
1703
 
1684
1704
  @position.setter
@@ -1704,7 +1724,7 @@ class EDBPadstackInstance(Primitive):
1704
1724
  out = self._edb_padstackinstance.GetPositionAndRotationValue()
1705
1725
 
1706
1726
  if out[0]:
1707
- return out[2].ToDouble()
1727
+ return round(out[2].ToDouble(), 6)
1708
1728
 
1709
1729
  @property
1710
1730
  def name(self):
@@ -1874,7 +1894,7 @@ class EDBPadstackInstance(Primitive):
1874
1894
  Lower elavation of the placement layer.
1875
1895
  """
1876
1896
  try:
1877
- return self._edb_padstackinstance.GetGroup().GetPlacementLayer().Clone().GetLowerElevation()
1897
+ return round(self._edb_padstackinstance.GetGroup().GetPlacementLayer().Clone().GetLowerElevation(), 6)
1878
1898
  except AttributeError: # pragma: no cover
1879
1899
  return None
1880
1900
 
@@ -1888,7 +1908,7 @@ class EDBPadstackInstance(Primitive):
1888
1908
  Upper elevation of the placement layer.
1889
1909
  """
1890
1910
  try:
1891
- return self._edb_padstackinstance.GetGroup().GetPlacementLayer().Clone().GetUpperElevation()
1911
+ return round(self._edb_padstackinstance.GetGroup().GetPlacementLayer().Clone().GetUpperElevation(), 6)
1892
1912
  except AttributeError: # pragma: no cover
1893
1913
  return None
1894
1914
 
@@ -54,6 +54,16 @@ class GapPort(EdgeTerminal):
54
54
  """Magnitude."""
55
55
  return self._edb_object.GetSourceAmplitude().ToDouble()
56
56
 
57
+ @property
58
+ def source_amplitude(self):
59
+ """Property added for grpc compatibility"""
60
+ return self.magnitude
61
+
62
+ @property
63
+ def source_phase(self):
64
+ """Property added for grpc compatibility"""
65
+ return self.phase
66
+
57
67
  @property
58
68
  def phase(self):
59
69
  """Phase."""
@@ -77,6 +87,10 @@ class GapPort(EdgeTerminal):
77
87
  self._edb_object.GetPortPostProcessingProp().RenormalizionZ0.ToComplex().Item2,
78
88
  )
79
89
 
90
+ @property
91
+ def renormalization_impedance(self):
92
+ return self.renormalize_z0[0]
93
+
80
94
 
81
95
  class CircuitPort(GapPort):
82
96
  """Manages gap port properties.
@@ -69,7 +69,7 @@ class EDBStatistics(object):
69
69
 
70
70
  @property
71
71
  def stackup_thickness(self):
72
- return self._stackup_thickness
72
+ return round(self._stackup_thickness, 6)
73
73
 
74
74
  @stackup_thickness.setter
75
75
  def stackup_thickness(self, value):
@@ -20,6 +20,7 @@
20
20
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  # SOFTWARE.
22
22
  from typing import Union
23
+ import warnings
23
24
 
24
25
  from pyedb.dotnet.database.general import convert_py_list_to_net_list
25
26
  from pyedb.dotnet.database.geometry.point_data import PointData
@@ -82,7 +83,7 @@ class PolygonData:
82
83
  list[list[float]]
83
84
  """
84
85
  return [
85
- [self._pedb.edb_value(i.X).ToDouble(), self._pedb.edb_value(i.Y).ToDouble()]
86
+ (self._pedb.edb_value(i.X).ToDouble(), self._pedb.edb_value(i.Y).ToDouble())
86
87
  for i in list(self._edb_object.Points)
87
88
  ]
88
89
 
@@ -132,10 +133,22 @@ class PolygonData:
132
133
  poly = self._edb_object.CreateFromArcs(arcs, flag)
133
134
  return PolygonData(self._pedb, poly)
134
135
 
135
- def point_in_polygon(self, x: Union[str, float], y: Union[str, float]) -> bool:
136
+ def is_inside(self, x: Union[str, float], y: Union[str, float] = None) -> bool:
136
137
  """Determines whether a point is inside the polygon."""
138
+ if isinstance(x, list) and len(x) == 2:
139
+ y = x[1]
140
+ x = x[0]
137
141
  return self._edb_object.PointInPolygon(self._pedb.point_data(x, y))
138
142
 
143
+ def point_in_polygon(self, x: Union[str, float], y: Union[str, float] = None) -> bool:
144
+ """Determines whether a point is inside the polygon.
145
+
146
+ ..deprecated:: 0.48.0
147
+ Use: func:`is_inside` instead.
148
+ """
149
+ warnings.warn("Use method is_inside instead", DeprecationWarning)
150
+ return self.is_inside(x, y)
151
+
139
152
  def get_point(self, index):
140
153
  """Gets the point at the index as a PointData object."""
141
154
  edb_object = self._edb_object.GetPoint(index)
@@ -429,7 +429,7 @@ class EdbHfss(object):
429
429
  source_name,
430
430
  )
431
431
 
432
- def create_coax_port_on_component(self, ref_des_list, net_list):
432
+ def create_coax_port_on_component(self, ref_des_list, net_list, delete_existing_terminal=False):
433
433
  """Create a coaxial port on a component or component list on a net or net list.
434
434
  The name of the new coaxial port is automatically assigned.
435
435
 
@@ -441,6 +441,10 @@ class EdbHfss(object):
441
441
  net_list : list, str
442
442
  List of one or more nets.
443
443
 
444
+ delete_existing_terminal : bool
445
+ Only active with grpc version. This argument is added only to ensure compatibility between DotNet and grpc.
446
+
447
+
444
448
  Returns
445
449
  -------
446
450
  bool
@@ -448,6 +452,8 @@ class EdbHfss(object):
448
452
 
449
453
  """
450
454
  coax = []
455
+ if delete_existing_terminal:
456
+ self._pedb.logger.warning(f"flag delete_existing_terminal is set to True but is only supported with grpc.")
451
457
  if not isinstance(ref_des_list, list):
452
458
  ref_des_list = [ref_des_list]
453
459
  if not isinstance(net_list, list):
@@ -1234,6 +1240,10 @@ class EdbHfss(object):
1234
1240
  self._layout.cell.SetHFSSExtentInfo(hfss_extent) # returns void
1235
1241
  return True
1236
1242
 
1243
+ def add_setup(self, name=None):
1244
+ """Adding method for grpc compatibility"""
1245
+ return self._pedb.create_hfss_setup(name=name)
1246
+
1237
1247
  def configure_hfss_analysis_setup(self, simulation_setup=None):
1238
1248
  """
1239
1249
  Configure HFSS analysis setup.
@@ -116,6 +116,22 @@ class Material(object):
116
116
  self.__material_def = material_def
117
117
  self.__dc_model = material_def.GetDielectricMaterialModel()
118
118
 
119
+ self._pedb = edb
120
+ self._edb_object = material_def
121
+ definition = self.__edb_definition
122
+ self.material_property_id_mapping = {
123
+ "conductivity": definition.MaterialPropertyId.Conductivity,
124
+ "permittivity": definition.MaterialPropertyId.Permittivity,
125
+ "dielectric_loss_tangent": definition.MaterialPropertyId.DielectricLossTangent,
126
+ "magnetic_loss_tangent": definition.MaterialPropertyId.MagneticLossTangent,
127
+ "mass_density": definition.MaterialPropertyId.MassDensity,
128
+ "permeability": definition.MaterialPropertyId.Permeability,
129
+ "poisson_ratio": definition.MaterialPropertyId.PoissonsRatio,
130
+ "specific_heat": definition.MaterialPropertyId.SpecificHeat,
131
+ "thermal_conductivity": definition.MaterialPropertyId.ThermalConductivity,
132
+ "thermal_expansion_coefficient": definition.MaterialPropertyId.ThermalExpansionCoefficient,
133
+ }
134
+
119
135
  @property
120
136
  def name(self):
121
137
  """Material name."""
@@ -442,6 +458,68 @@ class Material(object):
442
458
  # # Trigger get value on the property
443
459
  # _ = getattr(self, name)
444
460
 
461
+ def set_thermal_modifier(
462
+ self,
463
+ property_name: str,
464
+ basic_quadratic_temperature_reference: float = 21,
465
+ basic_quadratic_c1: float = 0.1,
466
+ basic_quadratic_c2: float = 0.1,
467
+ advanced_quadratic_lower_limit: float = -270,
468
+ advanced_quadratic_upper_limit: float = 1001,
469
+ advanced_quadratic_auto_calculate: bool = False,
470
+ advanced_quadratic_lower_constant: float = 1.1,
471
+ advanced_quadratic_upper_constant: float = 1.1,
472
+ ):
473
+ """Sets the material property thermal modifier of a given material property.
474
+
475
+ Parameters
476
+ ----------
477
+ property_name : str
478
+ Name of the property to modify.
479
+ basic_quadratic_temperature_reference : float, optional
480
+ The TempRef value in the quadratic model.
481
+ basic_quadratic_c1 : float, optional
482
+ The C1 value in the quadratic model.
483
+ basic_quadratic_c2 : float, optional
484
+ The C2 value in the quadratic model.
485
+ advanced_quadratic_lower_limit : float, optional
486
+ The lower temperature limit where the quadratic model is valid.
487
+ advanced_quadratic_upper_limit : float, optional
488
+ The upper temperature limit where the quadratic model is valid.
489
+ advanced_quadratic_auto_calculate : bool, optional
490
+ The flag indicating whether or the LowerConstantThermalModifierVal and UpperConstantThermalModifierVal
491
+ values should be auto calculated.
492
+ advanced_quadratic_lower_constant : float, optional
493
+ The constant thermal modifier value for temperatures lower than LowerConstantThermalModifierVal.
494
+ advanced_quadratic_upper_constant : float, optional
495
+ The constant thermal modifier value for temperatures greater than UpperConstantThermalModifierVal.
496
+
497
+ Returns
498
+ -------
499
+
500
+ """
501
+ _edb = self._pedb._edb
502
+ basic = _edb.Utility.BasicQuadraticParams(
503
+ _edb.Utility.Value(basic_quadratic_temperature_reference),
504
+ _edb.Utility.Value(basic_quadratic_c1),
505
+ _edb.Utility.Value(basic_quadratic_c2),
506
+ )
507
+ advanced = _edb.Utility.AdvancedQuadraticParams(
508
+ _edb.Utility.Value(advanced_quadratic_lower_limit),
509
+ _edb.Utility.Value(advanced_quadratic_upper_limit),
510
+ advanced_quadratic_auto_calculate,
511
+ _edb.Utility.Value(advanced_quadratic_lower_constant),
512
+ _edb.Utility.Value(advanced_quadratic_upper_constant),
513
+ )
514
+
515
+ thermal_modifier = _edb.Definition.MaterialPropertyThermalModifier(basic, advanced)
516
+ if not self.__material_def.SetThermalModifier(
517
+ self.material_property_id_mapping[property_name], thermal_modifier
518
+ ):
519
+ raise ValueError(f"Fail to set thermal modifier for property {property_name}")
520
+ else:
521
+ return True
522
+
445
523
 
446
524
  class Materials(object):
447
525
  """Manages EDB methods for material management accessible from `Edb.materials` property."""
@@ -455,9 +455,16 @@ class Modeler(object):
455
455
  xcoeff = str(xcoeff)
456
456
  return xcoeff, ycoeff
457
457
 
458
+ from pyedb.dotnet.database.edb_data.primitives_data import EdbPolygon
459
+
460
+ if isinstance(selection_polygon, EdbPolygon):
461
+ selection_polygon = selection_polygon._edb_object
462
+ if isinstance(polygon, EdbPolygon):
463
+ polygon = polygon._edb_object
464
+
458
465
  selection_polygon_data = selection_polygon.GetPolygonData()
459
- poligon_data = polygon.GetPolygonData()
460
- bound_center = poligon_data.GetBoundingCircleCenter()
466
+ polygon_data = polygon.GetPolygonData()
467
+ bound_center = polygon_data.GetBoundingCircleCenter()
461
468
  bound_center2 = selection_polygon_data.GetBoundingCircleCenter()
462
469
  center = [bound_center.X.ToDouble(), bound_center.Y.ToDouble()]
463
470
  center2 = [bound_center2.X.ToDouble(), bound_center2.Y.ToDouble()]
@@ -471,7 +478,7 @@ class Modeler(object):
471
478
  prev_point = None
472
479
  while continue_iterate:
473
480
  try:
474
- point = poligon_data.GetPoint(i)
481
+ point = polygon_data.GetPoint(i)
475
482
  if prev_point != point:
476
483
  check_inside = selection_polygon_data.PointInPolygon(point)
477
484
  if check_inside:
@@ -481,14 +488,14 @@ class Modeler(object):
481
488
  point.X.ToString() + "{}*{}".format(xcoeff, offset_name),
482
489
  point.Y.ToString() + "{}*{}".format(ycoeff, offset_name),
483
490
  )
484
- poligon_data.SetPoint(i, new_points)
491
+ polygon_data.SetPoint(i, new_points)
485
492
  prev_point = point
486
493
  i += 1
487
494
  else:
488
495
  continue_iterate = False
489
496
  except:
490
497
  continue_iterate = False
491
- polygon.SetPolygonData(poligon_data)
498
+ polygon.SetPolygonData(polygon_data)
492
499
  return True
493
500
 
494
501
  def _create_path(
@@ -1317,7 +1324,7 @@ class Modeler(object):
1317
1324
  stat_model.num_resistors = len(self._pedb.components.resistors)
1318
1325
  stat_model.num_inductors = len(self._pedb.components.inductors)
1319
1326
  bbox = self._pedb._hfss.get_layout_bounding_box(self._active_layout)
1320
- stat_model._layout_size = bbox[2] - bbox[0], bbox[3] - bbox[1]
1327
+ stat_model._layout_size = round(bbox[2] - bbox[0], 6), round(bbox[3] - bbox[1], 6)
1321
1328
  stat_model.num_discrete_components = (
1322
1329
  len(self._pedb.components.Others) + len(self._pedb.components.ICs) + len(self._pedb.components.IOs)
1323
1330
  )
@@ -1328,7 +1335,7 @@ class Modeler(object):
1328
1335
  stat_model.num_traces = len(self._pedb.modeler.paths)
1329
1336
  stat_model.num_polygons = len(self._pedb.modeler.polygons)
1330
1337
  stat_model.num_vias = len(self._pedb.padstacks.instances)
1331
- stat_model.stackup_thickness = self._pedb.stackup.get_layout_thickness()
1338
+ stat_model.stackup_thickness = round(self._pedb.stackup.get_layout_thickness(), 6)
1332
1339
  if evaluate_area:
1333
1340
  outline_surface = stat_model.layout_size[0] * stat_model.layout_size[1]
1334
1341
  if net_list:
@@ -1343,8 +1350,8 @@ class Modeler(object):
1343
1350
  surface += prim.length * prim.width
1344
1351
  if prim.type == "Polygon":
1345
1352
  surface += prim.polygon_data._edb_object.Area()
1346
- stat_model.occupying_surface[layer] = surface
1347
- stat_model.occupying_ratio[layer] = surface / outline_surface
1353
+ stat_model.occupying_surface[layer] = round(surface, 6)
1354
+ stat_model.occupying_ratio[layer] = round(surface / outline_surface, 6)
1348
1355
  return stat_model
1349
1356
 
1350
1357
  def create_bondwire(
@@ -1361,6 +1368,7 @@ class Modeler(object):
1361
1368
  end_y,
1362
1369
  net,
1363
1370
  bondwire_type="jedec4",
1371
+ start_cell_instance_name=None,
1364
1372
  ):
1365
1373
  """Create a bondwire object.
1366
1374
 
@@ -1390,13 +1398,16 @@ class Modeler(object):
1390
1398
  Y value of end point.
1391
1399
  net : str or :class:`Net <ansys.edb.net.Net>` or None
1392
1400
  Net of the Bondwire.
1401
+ start_cell_instance_name : None
1402
+ Added for grpc compatibility.
1393
1403
 
1394
1404
  Returns
1395
1405
  -------
1396
1406
  :class:`pyedb.dotnet.database.dotnet.primitive.BondwireDotNet`
1397
1407
  Bondwire object created.
1398
1408
  """
1399
-
1409
+ if start_cell_instance_name:
1410
+ self._pedb.logger.warning(f"start_cell_instance_name {start_cell_instance_name} is only valid with grpc.")
1400
1411
  return Bondwire(
1401
1412
  pedb=self._pedb,
1402
1413
  bondwire_type=bondwire_type,
@@ -629,9 +629,11 @@ class EdbPadstacks(object):
629
629
  if "PadstackDef" in str(type(pin)):
630
630
  padparams = pin.GetData().GetPadParametersValue(layername, self.int_to_pad_type(pad_type))
631
631
  else:
632
- padparams = self._edb.definition.PadstackDefData(pin.GetPadstackDef().GetData()).GetPadParametersValue(
633
- layername, self.int_to_pad_type(pad_type)
634
- )
632
+ if not isinstance(pin, EDBPadstackInstance):
633
+ pin = EDBPadstackInstance(pin, self._pedb)
634
+ padparams = self._edb.definition.PadstackDefData(
635
+ pin._edb_object.GetPadstackDef().GetData()
636
+ ).GetPadParametersValue(layername, self.int_to_pad_type(pad_type))
635
637
  if padparams[2]:
636
638
  geometry_type = int(padparams[1])
637
639
  parameters = [i.ToString() for i in padparams[2]]
@@ -646,7 +648,7 @@ class EdbPadstacks(object):
646
648
  )
647
649
  else:
648
650
  padparams = self._edb.definition.PadstackDefData(
649
- pin.GetPadstackDef().GetData()
651
+ pin._edb_object.GetPadstackDef().GetData()
650
652
  ).GetPolygonalPadParameters(layername, self.int_to_pad_type(pad_type))
651
653
 
652
654
  if padparams[0]:
@@ -1076,7 +1078,7 @@ class EdbPadstacks(object):
1076
1078
  return padstackname
1077
1079
 
1078
1080
  def _get_pin_layer_range(self, pin):
1079
- res, fromlayer, tolayer = pin.GetLayerRange()
1081
+ res, fromlayer, tolayer = pin._edb_object.GetLayerRange()
1080
1082
  if res:
1081
1083
  return fromlayer, tolayer
1082
1084
  else:
@@ -47,6 +47,20 @@ class MeshOperation(object):
47
47
  "kNumMeshOpTypes": self._edb_object.TMeshOpType.kNumMeshOpTypes,
48
48
  }
49
49
 
50
+ @property
51
+ def net_layer_info(self):
52
+ """Adding property for grpc compatibility.
53
+
54
+ Returns
55
+ -------
56
+ The tuple is in this form: (net_name, layer_name, is_sheet)``.
57
+ """
58
+ layer_inf = []
59
+ for net_name, mesh_op in self.nets_layers_list.items():
60
+ for layer in mesh_op:
61
+ layer_inf.append((net_name, layer, True))
62
+ return layer_inf
63
+
50
64
  @property
51
65
  def enabled(self):
52
66
  """Whether if mesh operation is enabled.
@@ -220,6 +234,11 @@ class LengthMeshOperation(MeshOperation, object):
220
234
  """
221
235
  return self._edb_object.MaxLength
222
236
 
237
+ @property
238
+ def restrict_max_length(self):
239
+ """Adding property for grpc compatibility."""
240
+ return self.restrict_length
241
+
223
242
  @property
224
243
  def restrict_length(self):
225
244
  """Whether to restrict length of elements.
@@ -286,6 +305,11 @@ class SkinDepthMeshOperation(MeshOperation, object):
286
305
  def surface_triangle_length(self, value):
287
306
  self._edb_object.SurfTriLength = value
288
307
 
308
+ @property
309
+ def number_of_layers(self):
310
+ """Adding property for grpc compatibility."""
311
+ return self.number_of_layer_elements
312
+
289
313
  @property
290
314
  def number_of_layer_elements(self):
291
315
  """Number of layer elements.