pyedb 0.23.0__py3-none-any.whl → 0.25.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/component_libraries/ansys_components.py +48 -2
- pyedb/configuration/cfg_operations.py +38 -4
- pyedb/configuration/cfg_ports_sources.py +16 -2
- pyedb/configuration/configuration.py +8 -0
- pyedb/dotnet/edb.py +39 -37
- pyedb/dotnet/edb_core/cell/hierarchy/hierarchy_obj.py +11 -0
- pyedb/dotnet/edb_core/cell/layout.py +47 -23
- pyedb/dotnet/edb_core/cell/layout_obj.py +0 -9
- pyedb/dotnet/edb_core/cell/primitive/__init__.py +3 -0
- pyedb/dotnet/edb_core/cell/{primitive.py → primitive/bondwire.py} +1 -146
- pyedb/dotnet/edb_core/cell/primitive/path.py +351 -0
- pyedb/dotnet/edb_core/cell/primitive/primitive.py +895 -0
- pyedb/dotnet/edb_core/cell/terminal/bundle_terminal.py +0 -4
- pyedb/dotnet/edb_core/cell/terminal/edge_terminal.py +1 -1
- pyedb/dotnet/edb_core/cell/terminal/terminal.py +2 -2
- pyedb/dotnet/edb_core/components.py +48 -25
- pyedb/dotnet/edb_core/dotnet/database.py +1 -23
- pyedb/dotnet/edb_core/dotnet/primitive.py +3 -139
- pyedb/dotnet/edb_core/edb_data/nets_data.py +1 -11
- pyedb/dotnet/edb_core/edb_data/padstacks_data.py +10 -24
- pyedb/dotnet/edb_core/edb_data/primitives_data.py +56 -868
- pyedb/dotnet/edb_core/geometry/polygon_data.py +43 -0
- pyedb/dotnet/edb_core/hfss.py +26 -22
- pyedb/dotnet/edb_core/layout_validation.py +3 -3
- pyedb/dotnet/edb_core/modeler.py +64 -81
- pyedb/dotnet/edb_core/nets.py +5 -4
- pyedb/dotnet/edb_core/padstack.py +12 -13
- pyedb/dotnet/edb_core/siwave.py +1 -1
- pyedb/dotnet/edb_core/stackup.py +3 -3
- pyedb/ipc2581/ecad/cad_data/layer_feature.py +1 -1
- pyedb/ipc2581/ecad/cad_data/polygon.py +2 -2
- pyedb/ipc2581/ecad/cad_data/step.py +2 -2
- pyedb/siwave.py +99 -0
- {pyedb-0.23.0.dist-info → pyedb-0.25.0.dist-info}/METADATA +4 -4
- {pyedb-0.23.0.dist-info → pyedb-0.25.0.dist-info}/RECORD +38 -35
- {pyedb-0.23.0.dist-info → pyedb-0.25.0.dist-info}/LICENSE +0 -0
- {pyedb-0.23.0.dist-info → pyedb-0.25.0.dist-info}/WHEEL +0 -0
|
@@ -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
|
|
|
23
|
+
from pyedb.dotnet.edb_core.general import convert_py_list_to_net_list
|
|
23
24
|
from pyedb.dotnet.edb_core.geometry.point_data import PointData
|
|
24
25
|
from pyedb.dotnet.edb_core.utilities.obj_base import BBox
|
|
25
26
|
|
|
@@ -50,6 +51,14 @@ class PolygonData:
|
|
|
50
51
|
else: # pragma: no cover
|
|
51
52
|
self._edb_object = edb_object
|
|
52
53
|
|
|
54
|
+
@property
|
|
55
|
+
def arcs(self):
|
|
56
|
+
"""Get the Primitive Arc Data."""
|
|
57
|
+
from pyedb.dotnet.edb_core.edb_data.primitives_data import EDBArcs
|
|
58
|
+
|
|
59
|
+
arcs = [EDBArcs(self._pedb, i) for i in self._edb_object.GetArcData()]
|
|
60
|
+
return arcs
|
|
61
|
+
|
|
53
62
|
@property
|
|
54
63
|
def points(self):
|
|
55
64
|
"""Get all points in polygon.
|
|
@@ -72,3 +81,37 @@ class PolygonData:
|
|
|
72
81
|
def create_from_bounding_box(self, points):
|
|
73
82
|
bbox = BBox(self._pedb, point_1=points[0], point_2=points[1])
|
|
74
83
|
return self._pedb.edb_api.geometry.api_class.PolygonData.CreateFromBBox(bbox._edb_object)
|
|
84
|
+
|
|
85
|
+
def expand(self, offset=0.001, tolerance=1e-12, round_corners=True, maximum_corner_extension=0.001):
|
|
86
|
+
"""Expand the polygon shape by an absolute value in all direction.
|
|
87
|
+
Offset can be negative for negative expansion.
|
|
88
|
+
|
|
89
|
+
Parameters
|
|
90
|
+
----------
|
|
91
|
+
offset : float, optional
|
|
92
|
+
Offset value in meters.
|
|
93
|
+
tolerance : float, optional
|
|
94
|
+
Tolerance in meters.
|
|
95
|
+
round_corners : bool, optional
|
|
96
|
+
Whether to round corners or not.
|
|
97
|
+
If True, use rounded corners in the expansion otherwise use straight edges (can be degenerate).
|
|
98
|
+
maximum_corner_extension : float, optional
|
|
99
|
+
The maximum corner extension (when round corners are not used) at which point the corner is clipped.
|
|
100
|
+
"""
|
|
101
|
+
new_poly = self._edb_object.Expand(offset, tolerance, round_corners, maximum_corner_extension)
|
|
102
|
+
self._edb_object = new_poly[0]
|
|
103
|
+
return True
|
|
104
|
+
|
|
105
|
+
def create_from_arcs(self, arcs, flag):
|
|
106
|
+
"""Edb Dotnet Api Database `Edb.Geometry.CreateFromArcs`.
|
|
107
|
+
|
|
108
|
+
Parameters
|
|
109
|
+
----------
|
|
110
|
+
arcs : list or `Edb.Geometry.ArcData`
|
|
111
|
+
List of ArcData.
|
|
112
|
+
flag : bool
|
|
113
|
+
"""
|
|
114
|
+
if isinstance(arcs, list):
|
|
115
|
+
arcs = convert_py_list_to_net_list(arcs)
|
|
116
|
+
poly = self._edb_object.CreateFromArcs(arcs, flag)
|
|
117
|
+
return PolygonData(self._pedb, poly)
|
pyedb/dotnet/edb_core/hfss.py
CHANGED
|
@@ -27,7 +27,7 @@ import math
|
|
|
27
27
|
|
|
28
28
|
from pyedb.dotnet.edb_core.edb_data.hfss_extent_info import HfssExtentInfo
|
|
29
29
|
from pyedb.dotnet.edb_core.edb_data.ports import BundleWavePort, WavePort
|
|
30
|
-
from pyedb.dotnet.edb_core.edb_data.primitives_data import
|
|
30
|
+
from pyedb.dotnet.edb_core.edb_data.primitives_data import Primitive
|
|
31
31
|
from pyedb.dotnet.edb_core.edb_data.simulation_configuration import (
|
|
32
32
|
SimulationConfiguration,
|
|
33
33
|
)
|
|
@@ -523,10 +523,10 @@ class EdbHfss(object):
|
|
|
523
523
|
if not port_name:
|
|
524
524
|
port_name = generate_unique_name("diff")
|
|
525
525
|
|
|
526
|
-
if isinstance(positive_primitive_id,
|
|
526
|
+
if isinstance(positive_primitive_id, Primitive):
|
|
527
527
|
positive_primitive_id = positive_primitive_id.id
|
|
528
528
|
|
|
529
|
-
if isinstance(negative_primitive_id,
|
|
529
|
+
if isinstance(negative_primitive_id, Primitive):
|
|
530
530
|
negative_primitive_id = negative_primitive_id.id
|
|
531
531
|
|
|
532
532
|
_, pos_term = self.create_wave_port(
|
|
@@ -547,8 +547,10 @@ class EdbHfss(object):
|
|
|
547
547
|
[pos_term._edb_object, neg_term._edb_object], self._edb.cell.terminal.Terminal
|
|
548
548
|
)
|
|
549
549
|
_edb_boundle_terminal = self._edb.cell.terminal.BundleTerminal.Create(edb_list)
|
|
550
|
-
|
|
551
|
-
|
|
550
|
+
_edb_boundle_terminal.SetName(port_name)
|
|
551
|
+
pos, neg = list(_edb_boundle_terminal.GetTerminals())
|
|
552
|
+
pos.SetName(port_name + ":T1")
|
|
553
|
+
neg.SetName(port_name + ":T2")
|
|
552
554
|
return port_name, BundleWavePort(self._pedb, _edb_boundle_terminal)
|
|
553
555
|
|
|
554
556
|
def create_bundle_wave_port(
|
|
@@ -591,7 +593,7 @@ class EdbHfss(object):
|
|
|
591
593
|
if not port_name:
|
|
592
594
|
port_name = generate_unique_name("bundle_port")
|
|
593
595
|
|
|
594
|
-
if isinstance(primitives_id[0],
|
|
596
|
+
if isinstance(primitives_id[0], Primitive):
|
|
595
597
|
primitives_id = [i.id for i in primitives_id]
|
|
596
598
|
|
|
597
599
|
terminals = []
|
|
@@ -718,10 +720,10 @@ class EdbHfss(object):
|
|
|
718
720
|
)
|
|
719
721
|
if not port_name:
|
|
720
722
|
port_name = generate_unique_name("Port_")
|
|
721
|
-
edge = self._edb.cell.terminal.PrimitiveEdge.Create(polygon.
|
|
723
|
+
edge = self._edb.cell.terminal.PrimitiveEdge.Create(polygon._edb_object, terminal_point)
|
|
722
724
|
edges = convert_py_list_to_net_list(edge, self._edb.cell.terminal.Edge)
|
|
723
725
|
edge_term = self._edb.cell.terminal.EdgeTerminal.Create(
|
|
724
|
-
polygon.GetLayout(), polygon.GetNet(), port_name, edges, isRef=False
|
|
726
|
+
polygon._edb_object.GetLayout(), polygon._edb_object.GetNet(), port_name, edges, isRef=False
|
|
725
727
|
)
|
|
726
728
|
if force_circuit_port:
|
|
727
729
|
edge_term.SetIsCircuitPort(True)
|
|
@@ -732,10 +734,14 @@ class EdbHfss(object):
|
|
|
732
734
|
edge_term.SetImpedance(self._pedb.edb_value(port_impedance))
|
|
733
735
|
edge_term.SetName(port_name)
|
|
734
736
|
if reference_polygon and reference_point:
|
|
735
|
-
ref_edge = self._edb.cell.terminal.PrimitiveEdge.Create(reference_polygon.
|
|
737
|
+
ref_edge = self._edb.cell.terminal.PrimitiveEdge.Create(reference_polygon._edb_object, reference_point)
|
|
736
738
|
ref_edges = convert_py_list_to_net_list(ref_edge, self._edb.cell.terminal.Edge)
|
|
737
739
|
ref_edge_term = self._edb.cell.terminal.EdgeTerminal.Create(
|
|
738
|
-
reference_polygon.GetLayout(),
|
|
740
|
+
reference_polygon._edb_object.GetLayout(),
|
|
741
|
+
reference_polygon._edb_object.GetNet(),
|
|
742
|
+
port_name + "_ref",
|
|
743
|
+
ref_edges,
|
|
744
|
+
isRef=True,
|
|
739
745
|
)
|
|
740
746
|
if reference_layer:
|
|
741
747
|
ref_edge_term.SetReferenceLayer(reference_layer)
|
|
@@ -763,7 +769,7 @@ class EdbHfss(object):
|
|
|
763
769
|
|
|
764
770
|
Parameters
|
|
765
771
|
----------
|
|
766
|
-
prim_id : int,
|
|
772
|
+
prim_id : int, Primitive
|
|
767
773
|
Primitive ID.
|
|
768
774
|
point_on_edge : list
|
|
769
775
|
Coordinate of the point to define the edge terminal.
|
|
@@ -792,7 +798,7 @@ class EdbHfss(object):
|
|
|
792
798
|
if not port_name:
|
|
793
799
|
port_name = generate_unique_name("Terminal_")
|
|
794
800
|
|
|
795
|
-
if isinstance(prim_id,
|
|
801
|
+
if isinstance(prim_id, Primitive):
|
|
796
802
|
prim_id = prim_id.id
|
|
797
803
|
|
|
798
804
|
pos_edge_term = self._create_edge_terminal(prim_id, point_on_edge, port_name)
|
|
@@ -1097,27 +1103,25 @@ class EdbHfss(object):
|
|
|
1097
1103
|
net_polygons = [
|
|
1098
1104
|
pp
|
|
1099
1105
|
for pp in net.primitives
|
|
1100
|
-
if pp.GetPrimitiveType() == self._edb.cell.primitive.PrimitiveType.Polygon
|
|
1106
|
+
if pp._edb_object.GetPrimitiveType() == self._edb.cell.primitive.api.PrimitiveType.Polygon
|
|
1101
1107
|
]
|
|
1102
1108
|
for poly in net_polygons:
|
|
1103
1109
|
mid_points = [[arc.mid_point.X.ToDouble(), arc.mid_point.Y.ToDouble()] for arc in poly.arcs]
|
|
1104
1110
|
for mid_point in mid_points:
|
|
1105
1111
|
if GeometryOperators.point_in_polygon(mid_point, user_defined_extent) == 0:
|
|
1106
|
-
port_name = generate_unique_name("{}_{}".format(poly.
|
|
1107
|
-
term = self._create_edge_terminal(poly.
|
|
1112
|
+
port_name = generate_unique_name("{}_{}".format(poly.net.name, poly.id))
|
|
1113
|
+
term = self._create_edge_terminal(poly.id, mid_point, port_name) # pragma no cover
|
|
1108
1114
|
if not term.IsNull():
|
|
1109
1115
|
self._logger.info("Terminal {} created".format(term.GetName()))
|
|
1110
1116
|
term.SetIsCircuitPort(True)
|
|
1111
|
-
terminal_info.append(
|
|
1112
|
-
[poly.GetNet().GetName(), mid_point[0], mid_point[1], term.GetName()]
|
|
1113
|
-
)
|
|
1117
|
+
terminal_info.append([poly.net.name, mid_point[0], mid_point[1], term.GetName()])
|
|
1114
1118
|
mid_pt_data = self._edb.geometry.point_data(
|
|
1115
1119
|
self._edb.utility.value(mid_point[0]), self._edb.utility.value(mid_point[1])
|
|
1116
1120
|
)
|
|
1117
1121
|
ref_prim = [
|
|
1118
1122
|
prim
|
|
1119
1123
|
for prim in reference_net.primitives
|
|
1120
|
-
if prim.polygon_data.
|
|
1124
|
+
if prim.polygon_data._edb_object.PointInPolygon(mid_pt_data)
|
|
1121
1125
|
]
|
|
1122
1126
|
if not ref_prim:
|
|
1123
1127
|
self._logger.warning("no reference primitive found, trying to extend scanning area")
|
|
@@ -1442,7 +1446,7 @@ class EdbHfss(object):
|
|
|
1442
1446
|
as argument."
|
|
1443
1447
|
)
|
|
1444
1448
|
return False
|
|
1445
|
-
net_names = [net.name for net in self._layout.nets if not net.IsPowerGround()]
|
|
1449
|
+
net_names = [net.name for net in self._layout.nets if not net._edb_object.IsPowerGround()]
|
|
1446
1450
|
if simulation_setup.components and isinstance(simulation_setup.components[0], str):
|
|
1447
1451
|
cmp_names = (
|
|
1448
1452
|
simulation_setup.components
|
|
@@ -1552,8 +1556,8 @@ class EdbHfss(object):
|
|
|
1552
1556
|
Number of ports.
|
|
1553
1557
|
|
|
1554
1558
|
"""
|
|
1555
|
-
terms = [term for term in self._layout.terminals if int(term.GetBoundaryType()) == 0]
|
|
1556
|
-
return len([i for i in terms if not i.
|
|
1559
|
+
terms = [term for term in self._layout.terminals if int(term._edb_object.GetBoundaryType()) == 0]
|
|
1560
|
+
return len([i for i in terms if not i.is_reference_terminal])
|
|
1557
1561
|
|
|
1558
1562
|
def layout_defeaturing(self, simulation_setup=None):
|
|
1559
1563
|
"""Defeature the layout by reducing the number of points for polygons based on surface deviation criteria.
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
import re
|
|
24
24
|
|
|
25
25
|
from pyedb.dotnet.edb_core.edb_data.padstacks_data import EDBPadstackInstance
|
|
26
|
-
from pyedb.dotnet.edb_core.edb_data.primitives_data import
|
|
26
|
+
from pyedb.dotnet.edb_core.edb_data.primitives_data import Primitive
|
|
27
27
|
from pyedb.generic.general_methods import generate_unique_name
|
|
28
28
|
|
|
29
29
|
|
|
@@ -204,7 +204,7 @@ class LayoutValidation:
|
|
|
204
204
|
sum = 0
|
|
205
205
|
for el in elem:
|
|
206
206
|
try:
|
|
207
|
-
if isinstance(obj_dict[el],
|
|
207
|
+
if isinstance(obj_dict[el], Primitive):
|
|
208
208
|
if not obj_dict[el].is_void:
|
|
209
209
|
sum += obj_dict[el].area()
|
|
210
210
|
except:
|
|
@@ -246,7 +246,7 @@ class LayoutValidation:
|
|
|
246
246
|
new_net_name = generate_unique_name(net, n=6)
|
|
247
247
|
net_obj = self._pedb.nets.find_or_create_net(new_net_name)
|
|
248
248
|
if net_obj:
|
|
249
|
-
new_nets.append(net_obj.
|
|
249
|
+
new_nets.append(net_obj.name)
|
|
250
250
|
for geo in disjoints:
|
|
251
251
|
try:
|
|
252
252
|
obj_dict[geo].net_name = net_obj
|
pyedb/dotnet/edb_core/modeler.py
CHANGED
|
@@ -26,14 +26,9 @@ This module contains these classes: `EdbLayout` and `Shape`.
|
|
|
26
26
|
import math
|
|
27
27
|
import warnings
|
|
28
28
|
|
|
29
|
-
from pyedb.dotnet.edb_core.cell.primitive import Bondwire
|
|
30
|
-
from pyedb.dotnet.edb_core.dotnet.primitive import
|
|
31
|
-
|
|
32
|
-
PathDotNet,
|
|
33
|
-
PolygonDotNet,
|
|
34
|
-
RectangleDotNet,
|
|
35
|
-
)
|
|
36
|
-
from pyedb.dotnet.edb_core.edb_data.primitives_data import EDBPrimitives, cast
|
|
29
|
+
from pyedb.dotnet.edb_core.cell.primitive.bondwire import Bondwire
|
|
30
|
+
from pyedb.dotnet.edb_core.dotnet.primitive import CircleDotNet, RectangleDotNet
|
|
31
|
+
from pyedb.dotnet.edb_core.edb_data.primitives_data import Primitive, cast
|
|
37
32
|
from pyedb.dotnet.edb_core.edb_data.utilities import EDBStatistics
|
|
38
33
|
from pyedb.dotnet.edb_core.general import convert_py_list_to_net_list
|
|
39
34
|
|
|
@@ -128,7 +123,7 @@ class Modeler(object):
|
|
|
128
123
|
|
|
129
124
|
Returns
|
|
130
125
|
-------
|
|
131
|
-
list of :class:`pyedb.dotnet.edb_core.edb_data.primitives_data.
|
|
126
|
+
list of :class:`pyedb.dotnet.edb_core.edb_data.primitives_data.Primitive`
|
|
132
127
|
List of primitives.
|
|
133
128
|
"""
|
|
134
129
|
for p in self._layout.primitives:
|
|
@@ -145,16 +140,10 @@ class Modeler(object):
|
|
|
145
140
|
|
|
146
141
|
Returns
|
|
147
142
|
-------
|
|
148
|
-
list of :class:`pyedb.dotnet.edb_core.edb_data.primitives_data.
|
|
143
|
+
list of :class:`pyedb.dotnet.edb_core.edb_data.primitives_data.Primitive`
|
|
149
144
|
List of primitives.
|
|
150
145
|
"""
|
|
151
|
-
|
|
152
|
-
return self._primitives
|
|
153
|
-
self._primitives = []
|
|
154
|
-
if self._active_layout:
|
|
155
|
-
for lay_obj in self._layout.primitives:
|
|
156
|
-
self._primitives.append(cast(lay_obj, self._pedb))
|
|
157
|
-
return self._primitives
|
|
146
|
+
return self._pedb.layout.primitives
|
|
158
147
|
|
|
159
148
|
@property
|
|
160
149
|
def polygons_by_layer(self):
|
|
@@ -181,7 +170,7 @@ class Modeler(object):
|
|
|
181
170
|
"""
|
|
182
171
|
_prim_by_net = {}
|
|
183
172
|
for net, net_obj in self._pedb.nets.nets.items():
|
|
184
|
-
_prim_by_net[net] = [
|
|
173
|
+
_prim_by_net[net] = [i for i in net_obj.primitives]
|
|
185
174
|
return _prim_by_net
|
|
186
175
|
|
|
187
176
|
@property
|
|
@@ -199,13 +188,9 @@ class Modeler(object):
|
|
|
199
188
|
for lay in self._pedb.stackup.non_stackup_layers:
|
|
200
189
|
_primitives_by_layer[lay] = []
|
|
201
190
|
for i in self._layout.primitives:
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
_primitives_by_layer[lay].append(cast(i, self._pedb))
|
|
206
|
-
except:
|
|
207
|
-
self._logger.warning(f"Failed to get layer on primitive {i}, skipping.")
|
|
208
|
-
continue
|
|
191
|
+
lay = i.layer.name
|
|
192
|
+
if lay in _primitives_by_layer:
|
|
193
|
+
_primitives_by_layer[lay].append(i)
|
|
209
194
|
return _primitives_by_layer
|
|
210
195
|
|
|
211
196
|
@property
|
|
@@ -214,7 +199,7 @@ class Modeler(object):
|
|
|
214
199
|
|
|
215
200
|
Returns
|
|
216
201
|
-------
|
|
217
|
-
list of :class:`pyedb.dotnet.edb_core.edb_data.primitives_data.
|
|
202
|
+
list of :class:`pyedb.dotnet.edb_core.edb_data.primitives_data.Primitive`
|
|
218
203
|
List of rectangles.
|
|
219
204
|
|
|
220
205
|
"""
|
|
@@ -226,7 +211,7 @@ class Modeler(object):
|
|
|
226
211
|
|
|
227
212
|
Returns
|
|
228
213
|
-------
|
|
229
|
-
list of :class:`pyedb.dotnet.edb_core.edb_data.primitives_data.
|
|
214
|
+
list of :class:`pyedb.dotnet.edb_core.edb_data.primitives_data.Primitive`
|
|
230
215
|
List of circles.
|
|
231
216
|
|
|
232
217
|
"""
|
|
@@ -238,10 +223,10 @@ class Modeler(object):
|
|
|
238
223
|
|
|
239
224
|
Returns
|
|
240
225
|
-------
|
|
241
|
-
list of :class:`pyedb.dotnet.edb_core.edb_data.primitives_data.
|
|
226
|
+
list of :class:`pyedb.dotnet.edb_core.edb_data.primitives_data.Primitive`
|
|
242
227
|
List of paths.
|
|
243
228
|
"""
|
|
244
|
-
return [i for i in self.primitives if
|
|
229
|
+
return [i for i in self.primitives if i.primitive_type == "path"]
|
|
245
230
|
|
|
246
231
|
@property
|
|
247
232
|
def polygons(self):
|
|
@@ -249,10 +234,10 @@ class Modeler(object):
|
|
|
249
234
|
|
|
250
235
|
Returns
|
|
251
236
|
-------
|
|
252
|
-
list of :class:`pyedb.dotnet.edb_core.edb_data.primitives_data.
|
|
237
|
+
list of :class:`pyedb.dotnet.edb_core.edb_data.primitives_data.Primitive`
|
|
253
238
|
List of polygons.
|
|
254
239
|
"""
|
|
255
|
-
return [i for i in self.primitives if
|
|
240
|
+
return [i for i in self.primitives if i.primitive_type == "polygon"]
|
|
256
241
|
|
|
257
242
|
def get_polygons_by_layer(self, layer_name, net_list=None):
|
|
258
243
|
"""Retrieve polygons by a layer.
|
|
@@ -271,14 +256,11 @@ class Modeler(object):
|
|
|
271
256
|
"""
|
|
272
257
|
objinst = []
|
|
273
258
|
for el in self.polygons:
|
|
274
|
-
|
|
275
|
-
if el.
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
objinst.append(el)
|
|
280
|
-
except:
|
|
281
|
-
self._logger.warning(f"Failed to retrieve layer on polygon {el}")
|
|
259
|
+
if el.layer.name == layer_name:
|
|
260
|
+
if net_list and el.net.name in net_list:
|
|
261
|
+
objinst.append(el)
|
|
262
|
+
else:
|
|
263
|
+
objinst.append(el)
|
|
282
264
|
return objinst
|
|
283
265
|
|
|
284
266
|
def get_primitive_by_layer_and_point(self, point=None, layer=None, nets=None):
|
|
@@ -297,7 +279,7 @@ class Modeler(object):
|
|
|
297
279
|
|
|
298
280
|
Returns
|
|
299
281
|
-------
|
|
300
|
-
list of :class:`pyedb.dotnet.edb_core.edb_data.primitives_data.
|
|
282
|
+
list of :class:`pyedb.dotnet.edb_core.edb_data.primitives_data.Primitive`
|
|
301
283
|
List of primitives, polygons, paths and rectangles.
|
|
302
284
|
"""
|
|
303
285
|
if isinstance(layer, str) and layer not in list(self._pedb.stackup.signal_layers.keys()):
|
|
@@ -379,7 +361,7 @@ class Modeler(object):
|
|
|
379
361
|
Parameters
|
|
380
362
|
----------
|
|
381
363
|
polygon :
|
|
382
|
-
class: `dotnet.edb_core.edb_data.primitives_data.
|
|
364
|
+
class: `dotnet.edb_core.edb_data.primitives_data.Primitive`
|
|
383
365
|
|
|
384
366
|
Returns
|
|
385
367
|
-------
|
|
@@ -536,28 +518,28 @@ class Modeler(object):
|
|
|
536
518
|
|
|
537
519
|
Returns
|
|
538
520
|
-------
|
|
539
|
-
:class:`pyedb.dotnet.edb_core.edb_data.primitives_data.
|
|
521
|
+
:class:`pyedb.dotnet.edb_core.edb_data.primitives_data.Primitive`
|
|
540
522
|
``True`` when successful, ``False`` when failed.
|
|
541
523
|
"""
|
|
542
524
|
net = self._pedb.nets.find_or_create_net(net_name)
|
|
543
525
|
if start_cap_style.lower() == "round":
|
|
544
|
-
start_cap_style = self._edb.cell.primitive.PathEndCapStyle.Round
|
|
526
|
+
start_cap_style = self._edb.cell.primitive.api.PathEndCapStyle.Round
|
|
545
527
|
elif start_cap_style.lower() == "extended":
|
|
546
|
-
start_cap_style = self._edb.cell.primitive.PathEndCapStyle.Extended # pragma: no cover
|
|
528
|
+
start_cap_style = self._edb.cell.primitive.api.PathEndCapStyle.Extended # pragma: no cover
|
|
547
529
|
else:
|
|
548
|
-
start_cap_style = self._edb.cell.primitive.PathEndCapStyle.Flat # pragma: no cover
|
|
530
|
+
start_cap_style = self._edb.cell.primitive.api.PathEndCapStyle.Flat # pragma: no cover
|
|
549
531
|
if end_cap_style.lower() == "round":
|
|
550
|
-
end_cap_style = self._edb.cell.primitive.PathEndCapStyle.Round # pragma: no cover
|
|
532
|
+
end_cap_style = self._edb.cell.primitive.api.PathEndCapStyle.Round # pragma: no cover
|
|
551
533
|
elif end_cap_style.lower() == "extended":
|
|
552
|
-
end_cap_style = self._edb.cell.primitive.PathEndCapStyle.Extended # pragma: no cover
|
|
534
|
+
end_cap_style = self._edb.cell.primitive.api.PathEndCapStyle.Extended # pragma: no cover
|
|
553
535
|
else:
|
|
554
|
-
end_cap_style = self._edb.cell.primitive.PathEndCapStyle.Flat
|
|
536
|
+
end_cap_style = self._edb.cell.primitive.api.PathEndCapStyle.Flat
|
|
555
537
|
if corner_style.lower() == "round":
|
|
556
|
-
corner_style = self._edb.cell.primitive.PathCornerStyle.RoundCorner
|
|
538
|
+
corner_style = self._edb.cell.primitive.api.PathCornerStyle.RoundCorner
|
|
557
539
|
elif corner_style.lower() == "sharp":
|
|
558
|
-
corner_style = self._edb.cell.primitive.PathCornerStyle.SharpCorner # pragma: no cover
|
|
540
|
+
corner_style = self._edb.cell.primitive.api.PathCornerStyle.SharpCorner # pragma: no cover
|
|
559
541
|
else:
|
|
560
|
-
corner_style = self._edb.cell.primitive.PathCornerStyle.MiterCorner # pragma: no cover
|
|
542
|
+
corner_style = self._edb.cell.primitive.api.PathCornerStyle.MiterCorner # pragma: no cover
|
|
561
543
|
|
|
562
544
|
pointlists = [self._pedb.point_data(i[0], i[1]) for i in path_list.points]
|
|
563
545
|
polygonData = self._edb.geometry.polygon_data.dotnetobj(convert_py_list_to_net_list(pointlists), False)
|
|
@@ -571,10 +553,12 @@ class Modeler(object):
|
|
|
571
553
|
corner_style,
|
|
572
554
|
polygonData,
|
|
573
555
|
)
|
|
574
|
-
|
|
556
|
+
|
|
557
|
+
if polygon.prim_obj.IsNull(): # pragma: no cover
|
|
575
558
|
self._logger.error("Null path created")
|
|
576
559
|
return False
|
|
577
|
-
|
|
560
|
+
polygon = self._pedb.layout.find_object_by_id(polygon.prim_obj.GetId())
|
|
561
|
+
return polygon
|
|
578
562
|
|
|
579
563
|
def create_trace(
|
|
580
564
|
self,
|
|
@@ -613,7 +597,7 @@ class Modeler(object):
|
|
|
613
597
|
|
|
614
598
|
Returns
|
|
615
599
|
-------
|
|
616
|
-
:class:`pyedb.dotnet.edb_core.edb_data.primitives_data.
|
|
600
|
+
:class:`pyedb.dotnet.edb_core.edb_data.primitives_data.Primitive`
|
|
617
601
|
"""
|
|
618
602
|
path = self.Shape("Polygon", points=path_list)
|
|
619
603
|
primitive = self._create_path(
|
|
@@ -648,7 +632,7 @@ class Modeler(object):
|
|
|
648
632
|
|
|
649
633
|
Returns
|
|
650
634
|
-------
|
|
651
|
-
bool, :class:`dotnet.edb_core.edb_data.primitives.
|
|
635
|
+
bool, :class:`dotnet.edb_core.edb_data.primitives.Primitive`
|
|
652
636
|
Polygon when successful, ``False`` when failed.
|
|
653
637
|
"""
|
|
654
638
|
net = self._pedb.nets.find_or_create_net(net_name)
|
|
@@ -683,12 +667,15 @@ class Modeler(object):
|
|
|
683
667
|
elif isinstance(void, Modeler.Shape):
|
|
684
668
|
voidPolygonData = self.shape_to_polygon_data(void)
|
|
685
669
|
else:
|
|
686
|
-
voidPolygonData = void
|
|
670
|
+
voidPolygonData = void.polygon_data._edb_object
|
|
671
|
+
|
|
687
672
|
if voidPolygonData is False or voidPolygonData is None or voidPolygonData.IsNull():
|
|
688
673
|
self._logger.error("Failed to create void polygon data")
|
|
689
674
|
return False
|
|
690
675
|
polygonData.AddHole(voidPolygonData)
|
|
691
|
-
polygon = self._edb.
|
|
676
|
+
polygon = self._pedb._edb.Cell.Primitive.Polygon.Create(
|
|
677
|
+
self._active_layout, layer_name, net.net_obj, polygonData
|
|
678
|
+
)
|
|
692
679
|
if polygon.IsNull() or polygonData is False: # pragma: no cover
|
|
693
680
|
self._logger.error("Null polygon created")
|
|
694
681
|
return False
|
|
@@ -716,7 +703,7 @@ class Modeler(object):
|
|
|
716
703
|
|
|
717
704
|
Returns
|
|
718
705
|
-------
|
|
719
|
-
:class:`pyedb.dotnet.edb_core.edb_data.primitives_data.
|
|
706
|
+
:class:`pyedb.dotnet.edb_core.edb_data.primitives_data.Primitive`
|
|
720
707
|
"""
|
|
721
708
|
warnings.warn(
|
|
722
709
|
"Use :func:`create_polygon` method instead. It now supports point lists as arguments.", DeprecationWarning
|
|
@@ -764,12 +751,12 @@ class Modeler(object):
|
|
|
764
751
|
|
|
765
752
|
Returns
|
|
766
753
|
-------
|
|
767
|
-
:class:`pyedb.dotnet.edb_core.edb_data.primitives_data.
|
|
754
|
+
:class:`pyedb.dotnet.edb_core.edb_data.primitives_data.Primitive`
|
|
768
755
|
Rectangle when successful, ``False`` when failed.
|
|
769
756
|
"""
|
|
770
757
|
edb_net = self._pedb.nets.find_or_create_net(net_name)
|
|
771
758
|
if representation_type == "LowerLeftUpperRight":
|
|
772
|
-
rep_type = self._edb.cell.primitive.RectangleRepresentationType.LowerLeftUpperRight
|
|
759
|
+
rep_type = self._edb.cell.primitive.api.RectangleRepresentationType.LowerLeftUpperRight
|
|
773
760
|
rect = self._edb.cell.primitive.rectangle.create(
|
|
774
761
|
self._active_layout,
|
|
775
762
|
layer_name,
|
|
@@ -783,7 +770,7 @@ class Modeler(object):
|
|
|
783
770
|
self._get_edb_value(rotation),
|
|
784
771
|
)
|
|
785
772
|
else:
|
|
786
|
-
rep_type = self._edb.cell.primitive.RectangleRepresentationType.CenterWidthHeight
|
|
773
|
+
rep_type = self._edb.cell.primitive.api.RectangleRepresentationType.CenterWidthHeight
|
|
787
774
|
rect = self._edb.cell.primitive.rectangle.create(
|
|
788
775
|
self._active_layout,
|
|
789
776
|
layer_name,
|
|
@@ -797,7 +784,7 @@ class Modeler(object):
|
|
|
797
784
|
self._get_edb_value(rotation),
|
|
798
785
|
)
|
|
799
786
|
if rect:
|
|
800
|
-
return
|
|
787
|
+
return self._pedb.layout.find_object_by_id(rect._edb_object.GetId())
|
|
801
788
|
return False # pragma: no cover
|
|
802
789
|
|
|
803
790
|
def create_circle(self, layer_name, x, y, radius, net_name=""):
|
|
@@ -819,7 +806,7 @@ class Modeler(object):
|
|
|
819
806
|
|
|
820
807
|
Returns
|
|
821
808
|
-------
|
|
822
|
-
:class:`pyedb.dotnet.edb_core.edb_data.primitives_data.
|
|
809
|
+
:class:`pyedb.dotnet.edb_core.edb_data.primitives_data.Primitive`
|
|
823
810
|
Objects of the circle created when successful.
|
|
824
811
|
"""
|
|
825
812
|
edb_net = self._pedb.nets.find_or_create_net(net_name)
|
|
@@ -833,7 +820,7 @@ class Modeler(object):
|
|
|
833
820
|
self._get_edb_value(radius),
|
|
834
821
|
)
|
|
835
822
|
if circle:
|
|
836
|
-
return
|
|
823
|
+
return self._pedb.layout.find_object_by_id(circle._edb_object.GetId())
|
|
837
824
|
return False # pragma: no cover
|
|
838
825
|
|
|
839
826
|
def delete_primitives(self, net_names):
|
|
@@ -940,12 +927,12 @@ class Modeler(object):
|
|
|
940
927
|
Shape of the voids.
|
|
941
928
|
"""
|
|
942
929
|
flag = False
|
|
943
|
-
if isinstance(shape,
|
|
930
|
+
if isinstance(shape, Primitive):
|
|
944
931
|
shape = shape.primitive_object
|
|
945
932
|
if not isinstance(void_shape, list):
|
|
946
933
|
void_shape = [void_shape]
|
|
947
934
|
for void in void_shape:
|
|
948
|
-
if isinstance(void,
|
|
935
|
+
if isinstance(void, Primitive):
|
|
949
936
|
flag = shape.AddVoid(void.primitive_object)
|
|
950
937
|
else:
|
|
951
938
|
flag = shape.AddVoid(void)
|
|
@@ -1188,23 +1175,23 @@ class Modeler(object):
|
|
|
1188
1175
|
for net_name in nets_name:
|
|
1189
1176
|
var_server = False
|
|
1190
1177
|
for p in self.paths:
|
|
1191
|
-
if p.
|
|
1178
|
+
if p.net.name == net_name:
|
|
1192
1179
|
if not layers_name:
|
|
1193
1180
|
if not var_server:
|
|
1194
1181
|
if not variable_value:
|
|
1195
|
-
variable_value = p.
|
|
1182
|
+
variable_value = p.width
|
|
1196
1183
|
result, var_server = self._pedb.add_design_variable(
|
|
1197
1184
|
parameter_name, variable_value, is_parameter=True
|
|
1198
1185
|
)
|
|
1199
|
-
p.
|
|
1200
|
-
elif p.
|
|
1186
|
+
p.width = self._pedb.edb_value(parameter_name)
|
|
1187
|
+
elif p.layer.name in layers_name:
|
|
1201
1188
|
if not var_server:
|
|
1202
1189
|
if not variable_value:
|
|
1203
|
-
variable_value = p.
|
|
1190
|
+
variable_value = p.width
|
|
1204
1191
|
result, var_server = self._pedb.add_design_variable(
|
|
1205
1192
|
parameter_name, variable_value, is_parameter=True
|
|
1206
1193
|
)
|
|
1207
|
-
p.
|
|
1194
|
+
p.width = self._pedb.edb_value(parameter_name)
|
|
1208
1195
|
return True
|
|
1209
1196
|
|
|
1210
1197
|
def unite_polygons_on_layer(self, layer_name=None, delete_padstack_gemometries=False, net_names_list=[]):
|
|
@@ -1237,6 +1224,7 @@ class Modeler(object):
|
|
|
1237
1224
|
delete_list = []
|
|
1238
1225
|
if lay in list(self.polygons_by_layer.keys()):
|
|
1239
1226
|
for poly in self.polygons_by_layer[lay]:
|
|
1227
|
+
poly = poly._edb_object
|
|
1240
1228
|
if not poly.GetNet().GetName() in list(poly_by_nets.keys()):
|
|
1241
1229
|
if poly.GetNet().GetName():
|
|
1242
1230
|
poly_by_nets[poly.GetNet().GetName()] = [poly]
|
|
@@ -1255,12 +1243,7 @@ class Modeler(object):
|
|
|
1255
1243
|
for void in v:
|
|
1256
1244
|
if int(item.GetIntersectionType(void.GetPolygonData())) == 2:
|
|
1257
1245
|
item.AddHole(void.GetPolygonData())
|
|
1258
|
-
|
|
1259
|
-
self._active_layout,
|
|
1260
|
-
lay,
|
|
1261
|
-
self._pedb.nets.nets[net],
|
|
1262
|
-
item,
|
|
1263
|
-
)
|
|
1246
|
+
self.create_polygon(item, layer_name=lay, voids=[], net_name=net)
|
|
1264
1247
|
for v in all_voids:
|
|
1265
1248
|
for void in v:
|
|
1266
1249
|
for poly in poly_by_nets[net]: # pragma no cover
|
|
@@ -1299,8 +1282,8 @@ class Modeler(object):
|
|
|
1299
1282
|
``True`` when successful, ``False`` when failed.
|
|
1300
1283
|
"""
|
|
1301
1284
|
poly_data = poly.polygon_data
|
|
1302
|
-
new_poly = poly_data.
|
|
1303
|
-
poly.
|
|
1285
|
+
new_poly = poly_data._edb_object.Defeature(tolerance)
|
|
1286
|
+
poly._edb_object.SetPolygonData(new_poly)
|
|
1304
1287
|
return True
|
|
1305
1288
|
|
|
1306
1289
|
def get_layout_statistics(self, evaluate_area=False, net_list=None):
|
|
@@ -1350,7 +1333,7 @@ class Modeler(object):
|
|
|
1350
1333
|
if prim.type == "Path":
|
|
1351
1334
|
surface += prim.length * prim.width
|
|
1352
1335
|
if prim.type == "Polygon":
|
|
1353
|
-
surface += prim.polygon_data.
|
|
1336
|
+
surface += prim.polygon_data._edb_object.Area()
|
|
1354
1337
|
stat_model.occupying_surface[layer] = surface
|
|
1355
1338
|
stat_model.occupying_ratio[layer] = surface / outline_surface
|
|
1356
1339
|
return stat_model
|
pyedb/dotnet/edb_core/nets.py
CHANGED
|
@@ -206,10 +206,11 @@ class EdbNets(object):
|
|
|
206
206
|
for net in self._layout.nets[:]:
|
|
207
207
|
total_plane_area = 0.0
|
|
208
208
|
total_trace_area = 0.0
|
|
209
|
-
for primitive in net.
|
|
210
|
-
|
|
209
|
+
for primitive in net.primitives:
|
|
210
|
+
primitive = primitive._edb_object
|
|
211
|
+
if primitive.GetPrimitiveType() == self._edb.cell.primitive.api_class.PrimitiveType.Bondwire:
|
|
211
212
|
continue
|
|
212
|
-
if primitive.GetPrimitiveType() != self._edb.cell.primitive.PrimitiveType.Path:
|
|
213
|
+
if primitive.GetPrimitiveType() != self._edb.cell.primitive.api_class.PrimitiveType.Path:
|
|
213
214
|
total_plane_area += float(primitive.GetPolygonData().Area())
|
|
214
215
|
else:
|
|
215
216
|
total_trace_area += float(primitive.GetPolygonData().Area())
|
|
@@ -1088,7 +1089,7 @@ class EdbNets(object):
|
|
|
1088
1089
|
else:
|
|
1089
1090
|
if not start_with and not contain and not end_with:
|
|
1090
1091
|
net = self._edb.cell.net.find_by_name(self._active_layout, net_name)
|
|
1091
|
-
if net.
|
|
1092
|
+
if net.is_null:
|
|
1092
1093
|
net = self._edb.cell.net.create(self._active_layout, net_name)
|
|
1093
1094
|
return net
|
|
1094
1095
|
elif start_with:
|