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.
- pyedb/__init__.py +1 -1
- pyedb/configuration/cfg_stackup.py +35 -1
- pyedb/configuration/configuration.py +13 -13
- pyedb/dotnet/database/cell/hierarchy/component.py +61 -5
- pyedb/dotnet/database/cell/hierarchy/s_parameter_model.py +7 -0
- pyedb/dotnet/database/cell/primitive/primitive.py +8 -1
- pyedb/dotnet/database/cell/terminal/terminal.py +25 -7
- pyedb/dotnet/database/components.py +87 -46
- pyedb/dotnet/database/definition/package_def.py +29 -5
- pyedb/dotnet/database/dotnet/database.py +18 -0
- pyedb/dotnet/database/edb_data/padstacks_data.py +25 -5
- pyedb/dotnet/database/edb_data/ports.py +14 -0
- pyedb/dotnet/database/edb_data/utilities.py +1 -1
- pyedb/dotnet/database/geometry/polygon_data.py +15 -2
- pyedb/dotnet/database/hfss.py +11 -1
- pyedb/dotnet/database/materials.py +78 -0
- pyedb/dotnet/database/modeler.py +21 -10
- pyedb/dotnet/database/padstack.py +7 -5
- pyedb/dotnet/database/sim_setup_data/data/mesh_operation.py +24 -0
- pyedb/dotnet/database/siwave.py +37 -33
- pyedb/dotnet/database/utilities/simulation_setup.py +51 -9
- pyedb/dotnet/database/utilities/siwave_simulation_setup.py +3 -1
- pyedb/dotnet/edb.py +67 -8
- pyedb/grpc/database/components.py +19 -13
- pyedb/grpc/database/hfss.py +3 -3
- pyedb/grpc/database/modeler.py +4 -4
- pyedb/grpc/database/padstacks.py +3 -1
- pyedb/grpc/database/ports/ports.py +4 -0
- pyedb/grpc/database/primitive/path.py +2 -2
- pyedb/grpc/database/primitive/primitive.py +6 -1
- pyedb/grpc/database/source_excitations.py +16 -8
- pyedb/grpc/database/terminal/bundle_terminal.py +1 -1
- pyedb/grpc/edb.py +125 -32
- {pyedb-0.47.1.dist-info → pyedb-0.49.0.dist-info}/METADATA +1 -1
- {pyedb-0.47.1.dist-info → pyedb-0.49.0.dist-info}/RECORD +37 -37
- {pyedb-0.47.1.dist-info → pyedb-0.49.0.dist-info}/LICENSE +0 -0
- {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
|
|
109
|
-
"""
|
|
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
|
-
@
|
|
113
|
-
def
|
|
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.
|
|
@@ -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
|
-
|
|
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
|
|
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)
|
pyedb/dotnet/database/hfss.py
CHANGED
|
@@ -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."""
|
pyedb/dotnet/database/modeler.py
CHANGED
|
@@ -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
|
-
|
|
460
|
-
bound_center =
|
|
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 =
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
633
|
-
|
|
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.
|