pyedb 0.51.2__py3-none-any.whl → 0.53.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pyedb might be problematic. Click here for more details.
- pyedb/__init__.py +1 -1
- pyedb/configuration/cfg_common.py +12 -15
- pyedb/configuration/cfg_data.py +2 -2
- pyedb/configuration/cfg_modeler.py +163 -234
- pyedb/configuration/cfg_stackup.py +62 -249
- pyedb/configuration/configuration.py +356 -409
- pyedb/dotnet/database/components.py +9 -3
- pyedb/dotnet/database/dotnet/database.py +4 -0
- pyedb/dotnet/database/edb_data/layer_data.py +3 -1
- pyedb/dotnet/database/edb_data/padstacks_data.py +8 -2
- pyedb/dotnet/database/layout_validation.py +3 -13
- pyedb/dotnet/database/siwave.py +14 -0
- pyedb/dotnet/database/stackup.py +8 -61
- pyedb/dotnet/database/utilities/simulation_setup.py +1 -1
- pyedb/dotnet/database/utilities/siwave_cpa_simulation_setup.py +894 -0
- pyedb/dotnet/database/utilities/siwave_simulation_setup.py +15 -0
- pyedb/dotnet/edb.py +50 -3
- pyedb/generic/design_types.py +29 -0
- pyedb/generic/grpc_warnings.py +5 -0
- pyedb/grpc/database/__init__.py +0 -1
- pyedb/grpc/database/components.py +102 -81
- pyedb/grpc/database/control_file.py +240 -193
- pyedb/grpc/database/definition/materials.py +7 -7
- pyedb/grpc/database/definitions.py +7 -5
- pyedb/grpc/database/hierarchy/pin_pair_model.py +1 -1
- pyedb/grpc/database/modeler.py +105 -77
- pyedb/grpc/database/net/differential_pair.py +2 -1
- pyedb/grpc/database/simulation_setup/siwave_cpa_simulation_setup.py +961 -0
- pyedb/grpc/database/siwave.py +14 -0
- pyedb/grpc/database/source_excitations.py +10 -10
- pyedb/grpc/edb.py +156 -180
- pyedb/grpc/edb_init.py +4 -2
- pyedb/siwave_core/cpa/simulation_setup_data_model.py +132 -0
- pyedb/siwave_core/product_properties.py +198 -0
- {pyedb-0.51.2.dist-info → pyedb-0.53.0.dist-info}/METADATA +16 -14
- {pyedb-0.51.2.dist-info → pyedb-0.53.0.dist-info}/RECORD +38 -33
- {pyedb-0.51.2.dist-info → pyedb-0.53.0.dist-info}/WHEEL +1 -1
- {pyedb-0.51.2.dist-info → pyedb-0.53.0.dist-info/licenses}/LICENSE +0 -0
|
@@ -228,14 +228,14 @@ class Material(GrpcMaterialDef):
|
|
|
228
228
|
|
|
229
229
|
"""
|
|
230
230
|
try:
|
|
231
|
-
return self.dielectric_material_model.
|
|
231
|
+
return self.dielectric_material_model.dc_relative_permittivity
|
|
232
232
|
except:
|
|
233
233
|
return None
|
|
234
234
|
|
|
235
235
|
@dc_permittivity.setter
|
|
236
236
|
def dc_permittivity(self, value):
|
|
237
237
|
if self.dielectric_material_model:
|
|
238
|
-
self.dielectric_material_model.
|
|
238
|
+
self.dielectric_material_model.dc_relative_permittivity = float(value)
|
|
239
239
|
|
|
240
240
|
@property
|
|
241
241
|
def loss_tangent_at_frequency(self) -> float:
|
|
@@ -289,14 +289,14 @@ class Material(GrpcMaterialDef):
|
|
|
289
289
|
|
|
290
290
|
"""
|
|
291
291
|
try:
|
|
292
|
-
return self.dielectric_material_model.
|
|
292
|
+
return self.dielectric_material_model.relative_permittivity_at_frequency
|
|
293
293
|
except:
|
|
294
294
|
return None
|
|
295
295
|
|
|
296
296
|
@permittivity_at_frequency.setter
|
|
297
297
|
def permittivity_at_frequency(self, value):
|
|
298
298
|
if self.dielectric_material_model:
|
|
299
|
-
self.dielectric_material_model.
|
|
299
|
+
self.dielectric_material_model.relative_permittivity_at_frequency = float(value)
|
|
300
300
|
|
|
301
301
|
@property
|
|
302
302
|
def permittivity(self) -> float:
|
|
@@ -771,14 +771,14 @@ class Materials(object):
|
|
|
771
771
|
raise ValueError(f"Material names are case-insensitive and {name.lower()} already exists.")
|
|
772
772
|
|
|
773
773
|
material_model = GrpcDjordjecvicSarkarModel.create()
|
|
774
|
-
material_model.
|
|
774
|
+
material_model.relative_permittivity_at_frequency = permittivity_at_frequency
|
|
775
775
|
material_model.loss_tangent_at_frequency = loss_tangent_at_frequency
|
|
776
776
|
material_model.frequency = dielectric_model_frequency
|
|
777
777
|
if dc_conductivity is not None:
|
|
778
778
|
material_model.dc_conductivity = dc_conductivity
|
|
779
779
|
material_model.use_dc_relative_conductivity = True
|
|
780
780
|
if dc_permittivity is not None:
|
|
781
|
-
material_model.
|
|
781
|
+
material_model.dc_relative_permittivity = dc_permittivity
|
|
782
782
|
try:
|
|
783
783
|
material = self.__add_dielectric_material_model(name, material_model)
|
|
784
784
|
for key, value in kwargs.items():
|
|
@@ -841,7 +841,7 @@ class Materials(object):
|
|
|
841
841
|
material_model = GrpcDebyeModel.create()
|
|
842
842
|
material_model.frequency_range = (lower_freqency, higher_frequency)
|
|
843
843
|
material_model.loss_tangent_at_high_low_frequency = (loss_tangent_low, loss_tangent_high)
|
|
844
|
-
material_model.
|
|
844
|
+
material_model.relative_permittivity_at_high_low_frequency = (permittivity_low, permittivity_high)
|
|
845
845
|
try:
|
|
846
846
|
material = self.__add_dielectric_material_model(name, material_model)
|
|
847
847
|
for key, value in kwargs.items():
|
|
@@ -20,7 +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
|
|
|
23
|
-
from typing import Union
|
|
23
|
+
from typing import Dict, List, Optional, Union
|
|
24
24
|
|
|
25
25
|
from ansys.edb.core.geometry.polygon_data import PolygonData as GrpcPolygonData
|
|
26
26
|
|
|
@@ -29,11 +29,11 @@ from pyedb.grpc.database.definition.package_def import PackageDef
|
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
class Definitions:
|
|
32
|
-
def __init__(self, pedb):
|
|
32
|
+
def __init__(self, pedb) -> None:
|
|
33
33
|
self._pedb = pedb
|
|
34
34
|
|
|
35
35
|
@property
|
|
36
|
-
def component(self) ->
|
|
36
|
+
def component(self) -> Dict[str, ComponentDef]:
|
|
37
37
|
"""Component definitions
|
|
38
38
|
|
|
39
39
|
Examples
|
|
@@ -47,7 +47,7 @@ class Definitions:
|
|
|
47
47
|
return {l.name: ComponentDef(self._pedb, l) for l in self._pedb.active_db.component_defs}
|
|
48
48
|
|
|
49
49
|
@property
|
|
50
|
-
def package(self) ->
|
|
50
|
+
def package(self) -> Dict[str, PackageDef]:
|
|
51
51
|
"""Package definitions.
|
|
52
52
|
|
|
53
53
|
Examples
|
|
@@ -60,7 +60,9 @@ class Definitions:
|
|
|
60
60
|
"""
|
|
61
61
|
return {l.name: PackageDef(self._pedb, l) for l in self._pedb.active_db.package_defs}
|
|
62
62
|
|
|
63
|
-
def add_package_def(
|
|
63
|
+
def add_package_def(
|
|
64
|
+
self, name: str, component_part_name: Optional[str] = None, boundary_points: Optional[List[List[float]]] = None
|
|
65
|
+
) -> Union[PackageDef, bool]:
|
|
64
66
|
"""Add a package definition.
|
|
65
67
|
|
|
66
68
|
Parameters
|
pyedb/grpc/database/modeler.py
CHANGED
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
This module contains these classes: `EdbLayout` and `Shape`.
|
|
25
25
|
"""
|
|
26
26
|
import math
|
|
27
|
+
from typing import Any, Dict, List, Optional, Union
|
|
27
28
|
|
|
28
29
|
from ansys.edb.core.geometry.arc_data import ArcData as GrpcArcData
|
|
29
30
|
from ansys.edb.core.geometry.point_data import PointData as GrpcPointData
|
|
@@ -60,8 +61,8 @@ class Modeler(object):
|
|
|
60
61
|
>>> edb_layout = edbapp.modeler
|
|
61
62
|
"""
|
|
62
63
|
|
|
63
|
-
def __getitem__(self, name):
|
|
64
|
-
"""Get a primitive
|
|
64
|
+
def __getitem__(self, name: Union[str, int]) -> Optional[Primitive]:
|
|
65
|
+
"""Get a primitive by name or ID.
|
|
65
66
|
|
|
66
67
|
Parameters
|
|
67
68
|
----------
|
|
@@ -88,13 +89,13 @@ class Modeler(object):
|
|
|
88
89
|
self._pedb.logger.error("Primitive not found.")
|
|
89
90
|
return
|
|
90
91
|
|
|
91
|
-
def __init__(self, p_edb):
|
|
92
|
+
def __init__(self, p_edb) -> None:
|
|
92
93
|
"""Initialize Modeler instance."""
|
|
93
94
|
self._pedb = p_edb
|
|
94
95
|
self._primitives = []
|
|
95
96
|
|
|
96
97
|
@property
|
|
97
|
-
def _edb(self):
|
|
98
|
+
def _edb(self) -> Any:
|
|
98
99
|
"""EDB API object.
|
|
99
100
|
|
|
100
101
|
Returns
|
|
@@ -105,7 +106,7 @@ class Modeler(object):
|
|
|
105
106
|
return self._pedb
|
|
106
107
|
|
|
107
108
|
@property
|
|
108
|
-
def _logger(self):
|
|
109
|
+
def _logger(self) -> Any:
|
|
109
110
|
"""Logger instance.
|
|
110
111
|
|
|
111
112
|
Returns
|
|
@@ -116,7 +117,7 @@ class Modeler(object):
|
|
|
116
117
|
return self._pedb.logger
|
|
117
118
|
|
|
118
119
|
@property
|
|
119
|
-
def _active_layout(self):
|
|
120
|
+
def _active_layout(self) -> Any:
|
|
120
121
|
"""Active layout.
|
|
121
122
|
|
|
122
123
|
Returns
|
|
@@ -127,7 +128,7 @@ class Modeler(object):
|
|
|
127
128
|
return self._pedb.active_layout
|
|
128
129
|
|
|
129
130
|
@property
|
|
130
|
-
def _layout(self):
|
|
131
|
+
def _layout(self) -> Any:
|
|
131
132
|
"""Current layout.
|
|
132
133
|
|
|
133
134
|
Returns
|
|
@@ -138,7 +139,7 @@ class Modeler(object):
|
|
|
138
139
|
return self._pedb.layout
|
|
139
140
|
|
|
140
141
|
@property
|
|
141
|
-
def _cell(self):
|
|
142
|
+
def _cell(self) -> Any:
|
|
142
143
|
"""Active cell.
|
|
143
144
|
|
|
144
145
|
Returns
|
|
@@ -149,18 +150,18 @@ class Modeler(object):
|
|
|
149
150
|
return self._pedb.active_cell
|
|
150
151
|
|
|
151
152
|
@property
|
|
152
|
-
def db(self):
|
|
153
|
+
def db(self) -> Any:
|
|
153
154
|
"""Database object.
|
|
154
155
|
|
|
155
156
|
Returns
|
|
156
157
|
-------
|
|
157
|
-
|
|
158
|
+
ansys.edb.core.database.Database
|
|
158
159
|
Database object.
|
|
159
160
|
"""
|
|
160
161
|
return self._pedb.active_db
|
|
161
162
|
|
|
162
163
|
@property
|
|
163
|
-
def layers(self):
|
|
164
|
+
def layers(self) -> Dict[str, object]:
|
|
164
165
|
"""Dictionary of layers.
|
|
165
166
|
|
|
166
167
|
Returns
|
|
@@ -170,7 +171,7 @@ class Modeler(object):
|
|
|
170
171
|
"""
|
|
171
172
|
return self._pedb.stackup.layers
|
|
172
173
|
|
|
173
|
-
def get_primitive(self, primitive_id):
|
|
174
|
+
def get_primitive(self, primitive_id: int) -> Optional[Primitive]:
|
|
174
175
|
"""Retrieve primitive by ID.
|
|
175
176
|
|
|
176
177
|
Parameters
|
|
@@ -210,7 +211,7 @@ class Modeler(object):
|
|
|
210
211
|
return False
|
|
211
212
|
|
|
212
213
|
@property
|
|
213
|
-
def primitives(self):
|
|
214
|
+
def primitives(self) -> List[Primitive]:
|
|
214
215
|
"""All primitives in the layout.
|
|
215
216
|
|
|
216
217
|
Returns
|
|
@@ -221,7 +222,7 @@ class Modeler(object):
|
|
|
221
222
|
return [self.__mapping_primitive_type(prim) for prim in self._pedb.layout.primitives]
|
|
222
223
|
|
|
223
224
|
@property
|
|
224
|
-
def polygons_by_layer(self):
|
|
225
|
+
def polygons_by_layer(self) -> Dict[str, List[Primitive]]:
|
|
225
226
|
"""Primitives organized by layer names.
|
|
226
227
|
|
|
227
228
|
Returns
|
|
@@ -235,7 +236,7 @@ class Modeler(object):
|
|
|
235
236
|
return _primitives_by_layer
|
|
236
237
|
|
|
237
238
|
@property
|
|
238
|
-
def primitives_by_net(self):
|
|
239
|
+
def primitives_by_net(self) -> Dict[str, List[Primitive]]:
|
|
239
240
|
"""Primitives organized by net names.
|
|
240
241
|
|
|
241
242
|
Returns
|
|
@@ -249,7 +250,7 @@ class Modeler(object):
|
|
|
249
250
|
return _prim_by_net
|
|
250
251
|
|
|
251
252
|
@property
|
|
252
|
-
def primitives_by_layer(self):
|
|
253
|
+
def primitives_by_layer(self) -> Dict[str, List[Primitive]]:
|
|
253
254
|
"""Primitives organized by layer names.
|
|
254
255
|
|
|
255
256
|
Returns
|
|
@@ -272,7 +273,7 @@ class Modeler(object):
|
|
|
272
273
|
return _primitives_by_layer
|
|
273
274
|
|
|
274
275
|
@property
|
|
275
|
-
def rectangles(self):
|
|
276
|
+
def rectangles(self) -> List[Rectangle]:
|
|
276
277
|
"""All rectangle primitives.
|
|
277
278
|
|
|
278
279
|
Returns
|
|
@@ -283,7 +284,7 @@ class Modeler(object):
|
|
|
283
284
|
return [Rectangle(self._pedb, i) for i in self.primitives if i.type == "rectangle"]
|
|
284
285
|
|
|
285
286
|
@property
|
|
286
|
-
def circles(self):
|
|
287
|
+
def circles(self) -> List[Circle]:
|
|
287
288
|
"""All circle primitives.
|
|
288
289
|
|
|
289
290
|
Returns
|
|
@@ -294,7 +295,7 @@ class Modeler(object):
|
|
|
294
295
|
return [Circle(self._pedb, i) for i in self.primitives if i.type == "circle"]
|
|
295
296
|
|
|
296
297
|
@property
|
|
297
|
-
def paths(self):
|
|
298
|
+
def paths(self) -> List[Path]:
|
|
298
299
|
"""All path primitives.
|
|
299
300
|
|
|
300
301
|
Returns
|
|
@@ -305,7 +306,7 @@ class Modeler(object):
|
|
|
305
306
|
return [Path(self._pedb, i) for i in self.primitives if i.type == "path"]
|
|
306
307
|
|
|
307
308
|
@property
|
|
308
|
-
def polygons(self):
|
|
309
|
+
def polygons(self) -> List[Polygon]:
|
|
309
310
|
"""All polygon primitives.
|
|
310
311
|
|
|
311
312
|
Returns
|
|
@@ -315,7 +316,7 @@ class Modeler(object):
|
|
|
315
316
|
"""
|
|
316
317
|
return [Polygon(self._pedb, i) for i in self.primitives if i.type == "polygon"]
|
|
317
318
|
|
|
318
|
-
def get_polygons_by_layer(self, layer_name, net_list=None):
|
|
319
|
+
def get_polygons_by_layer(self, layer_name: str, net_list: Optional[List[str]] = None) -> List[Primitive]:
|
|
319
320
|
"""Retrieve polygons by layer.
|
|
320
321
|
|
|
321
322
|
Parameters
|
|
@@ -340,7 +341,12 @@ class Modeler(object):
|
|
|
340
341
|
objinst.append(el)
|
|
341
342
|
return objinst
|
|
342
343
|
|
|
343
|
-
def get_primitive_by_layer_and_point(
|
|
344
|
+
def get_primitive_by_layer_and_point(
|
|
345
|
+
self,
|
|
346
|
+
point: Optional[List[float]] = None,
|
|
347
|
+
layer: Optional[Union[str, List[str]]] = None,
|
|
348
|
+
nets: Optional[Union[str, List[str]]] = None,
|
|
349
|
+
) -> List[Primitive]:
|
|
344
350
|
"""Get primitive at specified point on layer.
|
|
345
351
|
|
|
346
352
|
Parameters
|
|
@@ -405,7 +411,7 @@ class Modeler(object):
|
|
|
405
411
|
return returned_obj
|
|
406
412
|
|
|
407
413
|
@staticmethod
|
|
408
|
-
def get_polygon_bounding_box(polygon):
|
|
414
|
+
def get_polygon_bounding_box(polygon: Primitive) -> List[float]:
|
|
409
415
|
"""Get bounding box of polygon.
|
|
410
416
|
|
|
411
417
|
Parameters
|
|
@@ -427,7 +433,7 @@ class Modeler(object):
|
|
|
427
433
|
]
|
|
428
434
|
|
|
429
435
|
@staticmethod
|
|
430
|
-
def get_polygon_points(polygon):
|
|
436
|
+
def get_polygon_points(polygon) -> List[List[float]]:
|
|
431
437
|
"""Get points defining a polygon.
|
|
432
438
|
|
|
433
439
|
Parameters
|
|
@@ -460,7 +466,7 @@ class Modeler(object):
|
|
|
460
466
|
continue_iterate = False
|
|
461
467
|
return points
|
|
462
468
|
|
|
463
|
-
def parametrize_polygon(self, polygon, selection_polygon, offset_name="offsetx", origin=None):
|
|
469
|
+
def parametrize_polygon(self, polygon, selection_polygon, offset_name="offsetx", origin=None) -> bool:
|
|
464
470
|
"""Parametrize polygon points based on another polygon.
|
|
465
471
|
|
|
466
472
|
Parameters
|
|
@@ -629,14 +635,14 @@ class Modeler(object):
|
|
|
629
635
|
|
|
630
636
|
def create_trace(
|
|
631
637
|
self,
|
|
632
|
-
path_list,
|
|
633
|
-
layer_name,
|
|
634
|
-
width=1,
|
|
635
|
-
net_name="",
|
|
636
|
-
start_cap_style="Round",
|
|
637
|
-
end_cap_style="Round",
|
|
638
|
-
corner_style="Round",
|
|
639
|
-
):
|
|
638
|
+
path_list: List[List[float]],
|
|
639
|
+
layer_name: str,
|
|
640
|
+
width: float = 1,
|
|
641
|
+
net_name: str = "",
|
|
642
|
+
start_cap_style: str = "Round",
|
|
643
|
+
end_cap_style: str = "Round",
|
|
644
|
+
corner_style: str = "Round",
|
|
645
|
+
) -> Optional[Primitive]:
|
|
640
646
|
"""Create trace path.
|
|
641
647
|
|
|
642
648
|
Parameters
|
|
@@ -674,7 +680,13 @@ class Modeler(object):
|
|
|
674
680
|
|
|
675
681
|
return primitive
|
|
676
682
|
|
|
677
|
-
def create_polygon(
|
|
683
|
+
def create_polygon(
|
|
684
|
+
self,
|
|
685
|
+
points: Union[List[List[float]], GrpcPolygonData],
|
|
686
|
+
layer_name: str,
|
|
687
|
+
voids: Optional[List[Any]] = [],
|
|
688
|
+
net_name: str = "",
|
|
689
|
+
) -> Optional[Primitive]:
|
|
678
690
|
"""Create polygon primitive.
|
|
679
691
|
|
|
680
692
|
Parameters
|
|
@@ -726,17 +738,17 @@ class Modeler(object):
|
|
|
726
738
|
|
|
727
739
|
def create_rectangle(
|
|
728
740
|
self,
|
|
729
|
-
layer_name,
|
|
730
|
-
net_name="",
|
|
731
|
-
lower_left_point="",
|
|
732
|
-
upper_right_point="",
|
|
733
|
-
center_point="",
|
|
734
|
-
width="",
|
|
735
|
-
height="",
|
|
736
|
-
representation_type="lower_left_upper_right",
|
|
737
|
-
corner_radius="0mm",
|
|
738
|
-
rotation="0deg",
|
|
739
|
-
):
|
|
741
|
+
layer_name: str,
|
|
742
|
+
net_name: str = "",
|
|
743
|
+
lower_left_point: str = "",
|
|
744
|
+
upper_right_point: str = "",
|
|
745
|
+
center_point: str = "",
|
|
746
|
+
width: Union[str, float] = "",
|
|
747
|
+
height: Union[str, float] = "",
|
|
748
|
+
representation_type: str = "lower_left_upper_right",
|
|
749
|
+
corner_radius: str = "0mm",
|
|
750
|
+
rotation: str = "0deg",
|
|
751
|
+
) -> Optional[Primitive]:
|
|
740
752
|
"""Create rectangle primitive.
|
|
741
753
|
|
|
742
754
|
Parameters
|
|
@@ -814,7 +826,9 @@ class Modeler(object):
|
|
|
814
826
|
return Rectangle(self._pedb, rect)
|
|
815
827
|
return False
|
|
816
828
|
|
|
817
|
-
def create_circle(
|
|
829
|
+
def create_circle(
|
|
830
|
+
self, layer_name: str, x: Union[float, str], y: Union[float, str], radius: Union[float, str], net_name: str = ""
|
|
831
|
+
) -> Optional[Primitive]:
|
|
818
832
|
"""Create circle primitive.
|
|
819
833
|
|
|
820
834
|
Parameters
|
|
@@ -849,7 +863,7 @@ class Modeler(object):
|
|
|
849
863
|
return Circle(self._pedb, circle)
|
|
850
864
|
return False
|
|
851
865
|
|
|
852
|
-
def delete_primitives(self, net_names):
|
|
866
|
+
def delete_primitives(self, net_names: Union[str, List[str]]) -> bool:
|
|
853
867
|
"""Delete primitives by net name(s).
|
|
854
868
|
|
|
855
869
|
Parameters
|
|
@@ -870,7 +884,13 @@ class Modeler(object):
|
|
|
870
884
|
p.delete()
|
|
871
885
|
return True
|
|
872
886
|
|
|
873
|
-
def get_primitives(
|
|
887
|
+
def get_primitives(
|
|
888
|
+
self,
|
|
889
|
+
net_name: Optional[str] = None,
|
|
890
|
+
layer_name: Optional[str] = None,
|
|
891
|
+
prim_type: Optional[str] = None,
|
|
892
|
+
is_void: bool = False,
|
|
893
|
+
) -> List[Primitive]:
|
|
874
894
|
"""Get primitives with filtering.
|
|
875
895
|
|
|
876
896
|
Parameters
|
|
@@ -907,7 +927,7 @@ class Modeler(object):
|
|
|
907
927
|
prims.append(el)
|
|
908
928
|
return prims
|
|
909
929
|
|
|
910
|
-
def fix_circle_void_for_clipping(self):
|
|
930
|
+
def fix_circle_void_for_clipping(self) -> bool:
|
|
911
931
|
"""Fix circle void clipping issues.
|
|
912
932
|
|
|
913
933
|
Returns
|
|
@@ -934,7 +954,8 @@ class Modeler(object):
|
|
|
934
954
|
return True
|
|
935
955
|
|
|
936
956
|
@staticmethod
|
|
937
|
-
|
|
957
|
+
@staticmethod
|
|
958
|
+
def add_void(shape: "Primitive", void_shape: Union["Primitive", List["Primitive"]]) -> bool:
|
|
938
959
|
"""Add void to shape.
|
|
939
960
|
|
|
940
961
|
Parameters
|
|
@@ -1106,11 +1127,11 @@ class Modeler(object):
|
|
|
1106
1127
|
|
|
1107
1128
|
def parametrize_trace_width(
|
|
1108
1129
|
self,
|
|
1109
|
-
nets_name,
|
|
1110
|
-
layers_name=None,
|
|
1111
|
-
parameter_name="trace_width",
|
|
1112
|
-
variable_value=None,
|
|
1113
|
-
):
|
|
1130
|
+
nets_name: Union[str, List[str]],
|
|
1131
|
+
layers_name: Optional[Union[str, List[str]]] = None,
|
|
1132
|
+
parameter_name: str = "trace_width",
|
|
1133
|
+
variable_value: Optional[Union[float, str]] = None,
|
|
1134
|
+
) -> bool:
|
|
1114
1135
|
"""Parametrize trace width.
|
|
1115
1136
|
|
|
1116
1137
|
Parameters
|
|
@@ -1152,7 +1173,12 @@ class Modeler(object):
|
|
|
1152
1173
|
p.width = GrpcValue(_parameter_name, self._pedb.active_cell)
|
|
1153
1174
|
return True
|
|
1154
1175
|
|
|
1155
|
-
def unite_polygons_on_layer(
|
|
1176
|
+
def unite_polygons_on_layer(
|
|
1177
|
+
self,
|
|
1178
|
+
layer_name: Optional[Union[str, List[str]]] = None,
|
|
1179
|
+
delete_padstack_gemometries: bool = False,
|
|
1180
|
+
net_names_list: Optional[List[str]] = None,
|
|
1181
|
+
) -> bool:
|
|
1156
1182
|
"""Unite polygons on layer.
|
|
1157
1183
|
|
|
1158
1184
|
Parameters
|
|
@@ -1223,7 +1249,7 @@ class Modeler(object):
|
|
|
1223
1249
|
self._pedb.padstacks.remove_pads_from_padstack(pad)
|
|
1224
1250
|
return True
|
|
1225
1251
|
|
|
1226
|
-
def defeature_polygon(self, poly, tolerance=0.001):
|
|
1252
|
+
def defeature_polygon(self, poly: Polygon, tolerance: float = 0.001) -> bool:
|
|
1227
1253
|
"""Defeature polygon.
|
|
1228
1254
|
|
|
1229
1255
|
Parameters
|
|
@@ -1247,7 +1273,9 @@ class Modeler(object):
|
|
|
1247
1273
|
poly.polygon_data = new_poly
|
|
1248
1274
|
return True
|
|
1249
1275
|
|
|
1250
|
-
def get_layout_statistics(
|
|
1276
|
+
def get_layout_statistics(
|
|
1277
|
+
self, evaluate_area: bool = False, net_list: Optional[List[str]] = None
|
|
1278
|
+
) -> LayoutStatistics:
|
|
1251
1279
|
"""Get layout statistics.
|
|
1252
1280
|
|
|
1253
1281
|
Parameters
|
|
@@ -1300,21 +1328,21 @@ class Modeler(object):
|
|
|
1300
1328
|
|
|
1301
1329
|
def create_bondwire(
|
|
1302
1330
|
self,
|
|
1303
|
-
definition_name,
|
|
1304
|
-
placement_layer,
|
|
1305
|
-
width,
|
|
1306
|
-
material,
|
|
1307
|
-
start_layer_name,
|
|
1308
|
-
start_x,
|
|
1309
|
-
start_y,
|
|
1310
|
-
end_layer_name,
|
|
1311
|
-
end_x,
|
|
1312
|
-
end_y,
|
|
1313
|
-
net,
|
|
1314
|
-
start_cell_instance_name=None,
|
|
1315
|
-
end_cell_instance_name=None,
|
|
1316
|
-
bondwire_type="jedec4",
|
|
1317
|
-
):
|
|
1331
|
+
definition_name: str,
|
|
1332
|
+
placement_layer: str,
|
|
1333
|
+
width: Union[float, str],
|
|
1334
|
+
material: str,
|
|
1335
|
+
start_layer_name: str,
|
|
1336
|
+
start_x: Union[float, str],
|
|
1337
|
+
start_y: Union[float, str],
|
|
1338
|
+
end_layer_name: str,
|
|
1339
|
+
end_x: Union[float, str],
|
|
1340
|
+
end_y: Union[float, str],
|
|
1341
|
+
net: str,
|
|
1342
|
+
start_cell_instance_name: Optional[str] = None,
|
|
1343
|
+
end_cell_instance_name: Optional[str] = None,
|
|
1344
|
+
bondwire_type: str = "jedec4",
|
|
1345
|
+
) -> Optional[Primitive]:
|
|
1318
1346
|
"""Create bondwire.
|
|
1319
1347
|
|
|
1320
1348
|
Parameters
|
|
@@ -1407,10 +1435,10 @@ class Modeler(object):
|
|
|
1407
1435
|
def create_pin_group(
|
|
1408
1436
|
self,
|
|
1409
1437
|
name: str,
|
|
1410
|
-
pins_by_id=None,
|
|
1411
|
-
pins_by_aedt_name=None,
|
|
1412
|
-
pins_by_name=None,
|
|
1413
|
-
):
|
|
1438
|
+
pins_by_id: Optional[List[int]] = None,
|
|
1439
|
+
pins_by_aedt_name: Optional[List[str]] = None,
|
|
1440
|
+
pins_by_name: Optional[List[str]] = None,
|
|
1441
|
+
) -> bool:
|
|
1414
1442
|
"""Create pin group.
|
|
1415
1443
|
|
|
1416
1444
|
Parameters
|
|
@@ -85,10 +85,11 @@ class DifferentialPairs:
|
|
|
85
85
|
-------
|
|
86
86
|
list
|
|
87
87
|
A list containing identified differential pair names.
|
|
88
|
+
|
|
88
89
|
Examples
|
|
89
90
|
--------
|
|
90
91
|
>>> from pyedb import Edb
|
|
91
|
-
>>> edbapp = Edb("myaedbfolder", edbversion="
|
|
92
|
+
>>> edbapp = Edb("myaedbfolder", edbversion="2025.2")
|
|
92
93
|
>>> edb_nets = edbapp.differential_pairs.auto_identify()
|
|
93
94
|
"""
|
|
94
95
|
nets = self._pedb.nets.nets
|