pyedb 0.16.0__py3-none-any.whl → 0.18.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_components.py +47 -1
- pyedb/configuration/configuration.py +2 -0
- pyedb/dotnet/edb.py +133 -64
- pyedb/dotnet/edb_core/cell/hierarchy/component.py +12 -17
- pyedb/dotnet/edb_core/cell/hierarchy/hierarchy_obj.py +50 -0
- pyedb/dotnet/edb_core/cell/layout.py +0 -6
- pyedb/dotnet/edb_core/cell/voltage_regulator.py +0 -5
- pyedb/dotnet/edb_core/components.py +2 -2
- pyedb/dotnet/edb_core/dotnet/primitive.py +129 -3
- pyedb/dotnet/edb_core/edb_data/hfss_pi_simulation_setup_data.py +0 -460
- pyedb/dotnet/edb_core/edb_data/primitives_data.py +38 -38
- pyedb/dotnet/edb_core/edb_data/raptor_x_simulation_setup_data.py +1 -1
- pyedb/dotnet/edb_core/layout.py +21 -0
- pyedb/dotnet/edb_core/layout_validation.py +26 -0
- pyedb/dotnet/edb_core/nets.py +1 -1
- pyedb/dotnet/edb_core/sim_setup_data/data/sim_setup_info.py +1 -1
- pyedb/dotnet/edb_core/sim_setup_data/data/simulation_settings.py +357 -0
- pyedb/dotnet/edb_core/siwave.py +14 -0
- pyedb/dotnet/edb_core/utilities/hfss_simulation_setup.py +83 -0
- pyedb/dotnet/edb_core/utilities/simulation_setup.py +7 -4
- pyedb/misc/siw_feature_config/xtalk_scan/fd_xtalk_scan_config.py +91 -0
- pyedb/misc/siw_feature_config/xtalk_scan/impedance_scan_config.py +70 -0
- pyedb/misc/siw_feature_config/xtalk_scan/net.py +69 -0
- pyedb/misc/siw_feature_config/xtalk_scan/pins.py +60 -0
- pyedb/misc/siw_feature_config/xtalk_scan/scan_config.py +88 -0
- pyedb/misc/siw_feature_config/xtalk_scan/td_xtalk_config.py +104 -0
- pyedb/workflow.py +32 -0
- {pyedb-0.16.0.dist-info → pyedb-0.18.0.dist-info}/METADATA +1 -1
- {pyedb-0.16.0.dist-info → pyedb-0.18.0.dist-info}/RECORD +32 -24
- {pyedb-0.16.0.dist-info → pyedb-0.18.0.dist-info}/LICENSE +0 -0
- {pyedb-0.16.0.dist-info → pyedb-0.18.0.dist-info}/WHEEL +0 -0
pyedb/__init__.py
CHANGED
|
@@ -51,12 +51,13 @@ class CfgRlcModel(CfgBase):
|
|
|
51
51
|
|
|
52
52
|
|
|
53
53
|
class CfgComponent(CfgBase):
|
|
54
|
-
protected_attributes = ["reference_designator"]
|
|
54
|
+
protected_attributes = ["reference_designator", "definition", "location", "angle", "placement_layer"]
|
|
55
55
|
|
|
56
56
|
def __init__(self, **kwargs):
|
|
57
57
|
self.enabled = kwargs.get("enabled", None)
|
|
58
58
|
|
|
59
59
|
self.reference_designator = kwargs.get("reference_designator", None)
|
|
60
|
+
self.definition = kwargs.get("definition", None)
|
|
60
61
|
self.type = kwargs.get("part_type", None)
|
|
61
62
|
self.value = kwargs.get("value", None)
|
|
62
63
|
self.port_properties = CfgPortProperties(**kwargs["port_properties"]) if "port_properties" in kwargs else None
|
|
@@ -67,6 +68,29 @@ class CfgComponent(CfgBase):
|
|
|
67
68
|
|
|
68
69
|
self.rlc_model = [CfgRlcModel(**rlc_m) for rlc_m in rlc_models]
|
|
69
70
|
|
|
71
|
+
self.x_location, self.y_location = kwargs.get("location", [None, None])
|
|
72
|
+
self.angle = kwargs.get("angle", None)
|
|
73
|
+
self.placement_layer = kwargs.get("placement_layer", None)
|
|
74
|
+
|
|
75
|
+
def export_properties(self):
|
|
76
|
+
"""Export component properties.
|
|
77
|
+
|
|
78
|
+
Returns
|
|
79
|
+
-------
|
|
80
|
+
Dict
|
|
81
|
+
"""
|
|
82
|
+
data_comp = {}
|
|
83
|
+
data_comp["enabled"] = self.enabled
|
|
84
|
+
data_comp["reference_designator"] = self.reference_designator
|
|
85
|
+
data_comp["definition"] = self.definition
|
|
86
|
+
data_comp["type"] = self.type
|
|
87
|
+
data_comp["value"] = self.value
|
|
88
|
+
data_comp["x_location"] = self.x_location
|
|
89
|
+
data_comp["y_location"] = self.y_location
|
|
90
|
+
# data_comp["angle"] = self.angle
|
|
91
|
+
data_comp["placement_layer"] = self.placement_layer
|
|
92
|
+
return data_comp
|
|
93
|
+
|
|
70
94
|
|
|
71
95
|
class CfgComponents:
|
|
72
96
|
def __init__(self, pedb, components_data):
|
|
@@ -127,3 +151,25 @@ class CfgComponents:
|
|
|
127
151
|
setattr(c_db, attr, value)
|
|
128
152
|
else:
|
|
129
153
|
raise AttributeError(f"'{attr}' is not valid component attribute.")
|
|
154
|
+
|
|
155
|
+
def _load_data_from_db(self):
|
|
156
|
+
self.components = []
|
|
157
|
+
comps_in_db = self._pedb.components
|
|
158
|
+
for _, comp in comps_in_db.components.items():
|
|
159
|
+
cfg_comp = CfgComponent(
|
|
160
|
+
enabled=comp.enabled,
|
|
161
|
+
reference_designator=comp.name,
|
|
162
|
+
part_type=comp.type,
|
|
163
|
+
value=comp.value,
|
|
164
|
+
definition=comp.component_def,
|
|
165
|
+
location=comp.location,
|
|
166
|
+
placement_layer=comp.placement_layer,
|
|
167
|
+
)
|
|
168
|
+
self.components.append(cfg_comp)
|
|
169
|
+
|
|
170
|
+
def get_data_from_db(self):
|
|
171
|
+
self._load_data_from_db()
|
|
172
|
+
data = []
|
|
173
|
+
for comp in self.components:
|
|
174
|
+
data.append(comp.export_properties())
|
|
175
|
+
return data
|
|
@@ -271,6 +271,8 @@ class Configuration:
|
|
|
271
271
|
data["package_definitions"] = self.cfg_data.package_definitions.get_data_from_db()
|
|
272
272
|
if kwargs.get("setups", False):
|
|
273
273
|
data["setups"] = self.cfg_data.setups.get_data_from_db()
|
|
274
|
+
if kwargs.get("components", False):
|
|
275
|
+
data["components"] = self.cfg_data.components.get_data_from_db()
|
|
274
276
|
|
|
275
277
|
return data
|
|
276
278
|
|
pyedb/dotnet/edb.py
CHANGED
|
@@ -58,9 +58,6 @@ from pyedb.dotnet.edb_core.edb_data.control_file import (
|
|
|
58
58
|
)
|
|
59
59
|
from pyedb.dotnet.edb_core.edb_data.design_options import EdbDesignOptions
|
|
60
60
|
from pyedb.dotnet.edb_core.edb_data.edbvalue import EdbValue
|
|
61
|
-
from pyedb.dotnet.edb_core.edb_data.hfss_pi_simulation_setup_data import (
|
|
62
|
-
HFSSPISimulationSetup,
|
|
63
|
-
)
|
|
64
61
|
from pyedb.dotnet.edb_core.edb_data.ports import (
|
|
65
62
|
BundleWavePort,
|
|
66
63
|
CircuitPort,
|
|
@@ -94,7 +91,10 @@ from pyedb.dotnet.edb_core.nets import EdbNets
|
|
|
94
91
|
from pyedb.dotnet.edb_core.padstack import EdbPadstacks
|
|
95
92
|
from pyedb.dotnet.edb_core.siwave import EdbSiwave
|
|
96
93
|
from pyedb.dotnet.edb_core.stackup import Stackup
|
|
97
|
-
from pyedb.dotnet.edb_core.utilities.hfss_simulation_setup import
|
|
94
|
+
from pyedb.dotnet.edb_core.utilities.hfss_simulation_setup import (
|
|
95
|
+
HFSSPISimulationSetup,
|
|
96
|
+
HfssSimulationSetup,
|
|
97
|
+
)
|
|
98
98
|
from pyedb.dotnet.edb_core.utilities.siwave_simulation_setup import (
|
|
99
99
|
SiwaveDCSimulationSetup,
|
|
100
100
|
SiwaveSimulationSetup,
|
|
@@ -112,6 +112,7 @@ from pyedb.generic.process import SiwaveSolve
|
|
|
112
112
|
from pyedb.generic.settings import settings
|
|
113
113
|
from pyedb.ipc2581.ipc2581 import Ipc2581
|
|
114
114
|
from pyedb.modeler.geometry_operators import GeometryOperators
|
|
115
|
+
from pyedb.workflow import Workflow
|
|
115
116
|
|
|
116
117
|
if is_linux and is_ironpython:
|
|
117
118
|
import subprocessdotnet as subprocess
|
|
@@ -157,7 +158,7 @@ class Edb(Database):
|
|
|
157
158
|
--------
|
|
158
159
|
Create an ``Edb`` object and a new EDB cell.
|
|
159
160
|
|
|
160
|
-
>>> from pyedb
|
|
161
|
+
>>> from pyedb import Edb
|
|
161
162
|
>>> app = Edb()
|
|
162
163
|
|
|
163
164
|
Add a new variable named "s1" to the ``Edb`` instance.
|
|
@@ -517,7 +518,7 @@ class Edb(Database):
|
|
|
517
518
|
vrms = [VoltageRegulator(self, edb_object) for edb_object in list(self.active_layout.VoltageRegulators)]
|
|
518
519
|
_vrms = {}
|
|
519
520
|
for vrm in vrms:
|
|
520
|
-
_vrms[vrm.
|
|
521
|
+
_vrms[vrm.name] = vrm
|
|
521
522
|
return _vrms
|
|
522
523
|
|
|
523
524
|
@property
|
|
@@ -801,7 +802,7 @@ class Edb(Database):
|
|
|
801
802
|
|
|
802
803
|
Examples
|
|
803
804
|
--------
|
|
804
|
-
>>> from pyedb
|
|
805
|
+
>>> from pyedb import Edb
|
|
805
806
|
>>> edbapp = Edb("myproject.aedb")
|
|
806
807
|
>>> comp = edbapp.components.get_component_by_name("J1")
|
|
807
808
|
"""
|
|
@@ -818,7 +819,7 @@ class Edb(Database):
|
|
|
818
819
|
|
|
819
820
|
Examples
|
|
820
821
|
--------
|
|
821
|
-
>>> from pyedb
|
|
822
|
+
>>> from pyedb import Edb
|
|
822
823
|
>>> edbapp = Edb("myproject.aedb")
|
|
823
824
|
>>> comp = edbapp.components.get_component_by_name("J1")
|
|
824
825
|
"""
|
|
@@ -861,7 +862,7 @@ class Edb(Database):
|
|
|
861
862
|
|
|
862
863
|
Examples
|
|
863
864
|
--------
|
|
864
|
-
>>> from pyedb
|
|
865
|
+
>>> from pyedb import Edb
|
|
865
866
|
>>> edbapp = Edb("myproject.aedb")
|
|
866
867
|
>>> edbapp.stackup.layers["TOP"].thickness = 4e-5
|
|
867
868
|
>>> edbapp.stackup.layers["TOP"].thickness == 4e-05
|
|
@@ -879,7 +880,7 @@ class Edb(Database):
|
|
|
879
880
|
|
|
880
881
|
Examples
|
|
881
882
|
--------
|
|
882
|
-
>>> from pyedb
|
|
883
|
+
>>> from pyedb import Edb
|
|
883
884
|
>>> edbapp = Edb()
|
|
884
885
|
>>> edbapp.materials.add_material("air", permittivity=1.0)
|
|
885
886
|
>>> edbapp.materials.add_debye_material("debye_mat", 5, 3, 0.02, 0.05, 1e5, 1e9)
|
|
@@ -903,7 +904,7 @@ class Edb(Database):
|
|
|
903
904
|
|
|
904
905
|
Examples
|
|
905
906
|
--------
|
|
906
|
-
>>> from pyedb
|
|
907
|
+
>>> from pyedb import Edb
|
|
907
908
|
>>> edbapp = Edb("myproject.aedb")
|
|
908
909
|
>>> p = edbapp.padstacks.create(padstackname="myVia_bullet", antipad_shape="Bullet")
|
|
909
910
|
>>> edbapp.padstacks.get_pad_parameters(
|
|
@@ -925,7 +926,7 @@ class Edb(Database):
|
|
|
925
926
|
|
|
926
927
|
Examples
|
|
927
928
|
--------
|
|
928
|
-
>>> from pyedb
|
|
929
|
+
>>> from pyedb import Edb
|
|
929
930
|
>>> edbapp = Edb("myproject.aedb")
|
|
930
931
|
>>> p = edbapp.padstacks.create(padstackname="myVia_bullet", antipad_shape="Bullet")
|
|
931
932
|
>>> edbapp.padstacks.get_pad_parameters(
|
|
@@ -950,7 +951,7 @@ class Edb(Database):
|
|
|
950
951
|
|
|
951
952
|
Examples
|
|
952
953
|
--------
|
|
953
|
-
>>> from pyedb
|
|
954
|
+
>>> from pyedb import Edb
|
|
954
955
|
>>> edbapp = Edb("myproject.aedb")
|
|
955
956
|
>>> p2 = edbapp.siwave.create_circuit_port_on_net("U2A5", "V3P3_S0", "U2A5", "GND", 50, "test")
|
|
956
957
|
"""
|
|
@@ -967,7 +968,7 @@ class Edb(Database):
|
|
|
967
968
|
|
|
968
969
|
Examples
|
|
969
970
|
--------
|
|
970
|
-
>>> from pyedb
|
|
971
|
+
>>> from pyedb import Edb
|
|
971
972
|
>>> edbapp = Edb("myproject.aedb")
|
|
972
973
|
>>> p2 = edbapp.siwave.create_circuit_port_on_net("U2A5", "V3P3_S0", "U2A5", "GND", 50, "test")
|
|
973
974
|
"""
|
|
@@ -988,7 +989,7 @@ class Edb(Database):
|
|
|
988
989
|
|
|
989
990
|
Examples
|
|
990
991
|
--------
|
|
991
|
-
>>> from pyedb
|
|
992
|
+
>>> from pyedb import Edb
|
|
992
993
|
>>> edbapp = Edb("myproject.aedb")
|
|
993
994
|
>>> edbapp.hfss.configure_hfss_analysis_setup(sim_config)
|
|
994
995
|
"""
|
|
@@ -1009,7 +1010,7 @@ class Edb(Database):
|
|
|
1009
1010
|
|
|
1010
1011
|
Examples
|
|
1011
1012
|
--------
|
|
1012
|
-
>>> from pyedb
|
|
1013
|
+
>>> from pyedb import Edb
|
|
1013
1014
|
>>> edbapp = Edb("myproject.aedb")
|
|
1014
1015
|
>>> sim_config = edbapp.new_simulation_configuration()
|
|
1015
1016
|
>>> sim_config.mesh_freq = "10Ghz"
|
|
@@ -1032,7 +1033,7 @@ class Edb(Database):
|
|
|
1032
1033
|
|
|
1033
1034
|
Examples
|
|
1034
1035
|
--------
|
|
1035
|
-
>>> from pyedb
|
|
1036
|
+
>>> from pyedb import Edb
|
|
1036
1037
|
>>> edbapp = Edb("myproject.aedb")
|
|
1037
1038
|
>>> edbapp.nets.find_or_create_net("GND")
|
|
1038
1039
|
>>> edbapp.nets.find_and_fix_disjoint_nets("GND", keep_only_main_net=True)
|
|
@@ -1050,7 +1051,7 @@ class Edb(Database):
|
|
|
1050
1051
|
|
|
1051
1052
|
Examples
|
|
1052
1053
|
--------
|
|
1053
|
-
>>> from pyedb
|
|
1054
|
+
>>> from pyedb import Edb
|
|
1054
1055
|
>>> edbapp = Edb"myproject.aedb")
|
|
1055
1056
|
>>> edbapp.nets.find_or_create_net("GND")
|
|
1056
1057
|
>>> edbapp.nets.find_and_fix_disjoint_nets("GND", keep_only_main_net=True)
|
|
@@ -1071,7 +1072,7 @@ class Edb(Database):
|
|
|
1071
1072
|
|
|
1072
1073
|
Examples
|
|
1073
1074
|
--------
|
|
1074
|
-
>>> from pyedb
|
|
1075
|
+
>>> from pyedb import Edb
|
|
1075
1076
|
>>> edbapp = Edb("myproject.aedb")
|
|
1076
1077
|
>>> edbapp.net_classes
|
|
1077
1078
|
"""
|
|
@@ -1089,7 +1090,7 @@ class Edb(Database):
|
|
|
1089
1090
|
|
|
1090
1091
|
Examples
|
|
1091
1092
|
--------
|
|
1092
|
-
>>> from pyedb
|
|
1093
|
+
>>> from pyedb import Edb
|
|
1093
1094
|
>>> edbapp = Edb("myproject.aedb")
|
|
1094
1095
|
>>> edbapp.extended_nets
|
|
1095
1096
|
"""
|
|
@@ -1107,7 +1108,7 @@ class Edb(Database):
|
|
|
1107
1108
|
|
|
1108
1109
|
Examples
|
|
1109
1110
|
--------
|
|
1110
|
-
>>> from pyedb
|
|
1111
|
+
>>> from pyedb import Edb
|
|
1111
1112
|
>>> edbapp = Edb("myproject.aedb")
|
|
1112
1113
|
>>> edbapp.differential_pairs
|
|
1113
1114
|
"""
|
|
@@ -1129,7 +1130,7 @@ class Edb(Database):
|
|
|
1129
1130
|
|
|
1130
1131
|
Examples
|
|
1131
1132
|
--------
|
|
1132
|
-
>>> from pyedb
|
|
1133
|
+
>>> from pyedb import Edb
|
|
1133
1134
|
>>> edbapp = Edb("myproject.aedb")
|
|
1134
1135
|
>>> top_prims = edbapp.modeler.primitives_by_layer["TOP"]
|
|
1135
1136
|
"""
|
|
@@ -1146,7 +1147,7 @@ class Edb(Database):
|
|
|
1146
1147
|
|
|
1147
1148
|
Examples
|
|
1148
1149
|
--------
|
|
1149
|
-
>>> from pyedb
|
|
1150
|
+
>>> from pyedb import Edb
|
|
1150
1151
|
>>> edbapp = Edb("myproject.aedb")
|
|
1151
1152
|
>>> top_prims = edbapp.modeler.primitives_by_layer["TOP"]
|
|
1152
1153
|
"""
|
|
@@ -1243,7 +1244,7 @@ class Edb(Database):
|
|
|
1243
1244
|
|
|
1244
1245
|
Examples
|
|
1245
1246
|
--------
|
|
1246
|
-
>>> from pyedb
|
|
1247
|
+
>>> from pyedb import Edb
|
|
1247
1248
|
>>> edbapp = Edb("myproject.aedb")
|
|
1248
1249
|
>>> pin_net_name = edbapp.pins[424968329].netname
|
|
1249
1250
|
"""
|
|
@@ -1557,6 +1558,7 @@ class Edb(Database):
|
|
|
1557
1558
|
reference_list=[],
|
|
1558
1559
|
include_pingroups=True,
|
|
1559
1560
|
pins_to_preserve=None,
|
|
1561
|
+
inlcude_voids_in_extents=False,
|
|
1560
1562
|
):
|
|
1561
1563
|
if extent_type in [
|
|
1562
1564
|
"Conforming",
|
|
@@ -1573,6 +1575,7 @@ class Edb(Database):
|
|
|
1573
1575
|
smart_cut,
|
|
1574
1576
|
reference_list,
|
|
1575
1577
|
pins_to_preserve,
|
|
1578
|
+
inlcude_voids_in_extents=inlcude_voids_in_extents,
|
|
1576
1579
|
)
|
|
1577
1580
|
else:
|
|
1578
1581
|
_poly = self.layout.expanded_extent(
|
|
@@ -1631,6 +1634,7 @@ class Edb(Database):
|
|
|
1631
1634
|
smart_cutout=False,
|
|
1632
1635
|
reference_list=[],
|
|
1633
1636
|
pins_to_preserve=None,
|
|
1637
|
+
inlcude_voids_in_extents=False,
|
|
1634
1638
|
):
|
|
1635
1639
|
names = []
|
|
1636
1640
|
_polys = []
|
|
@@ -1648,7 +1652,7 @@ class Edb(Database):
|
|
|
1648
1652
|
|
|
1649
1653
|
for prim in self.modeler.primitives:
|
|
1650
1654
|
if prim is not None and prim.net_name in names:
|
|
1651
|
-
_polys.append(prim
|
|
1655
|
+
_polys.append(prim)
|
|
1652
1656
|
if smart_cutout:
|
|
1653
1657
|
objs_data = self._smart_cut(reference_list, expansion_size)
|
|
1654
1658
|
_polys.extend(objs_data)
|
|
@@ -1657,9 +1661,33 @@ class Edb(Database):
|
|
|
1657
1661
|
while k < 10:
|
|
1658
1662
|
unite_polys = []
|
|
1659
1663
|
for i in _polys:
|
|
1660
|
-
|
|
1664
|
+
if "PolygonData" not in str(i):
|
|
1665
|
+
obj_data = i.primitive_object.GetPolygonData().Expand(
|
|
1666
|
+
expansion_size, tolerance, round_corner, round_extension
|
|
1667
|
+
)
|
|
1668
|
+
else:
|
|
1669
|
+
obj_data = i.Expand(expansion_size, tolerance, round_corner, round_extension)
|
|
1661
1670
|
if obj_data:
|
|
1662
|
-
|
|
1671
|
+
if not inlcude_voids_in_extents:
|
|
1672
|
+
unite_polys.extend(list(obj_data))
|
|
1673
|
+
else:
|
|
1674
|
+
voids_poly = []
|
|
1675
|
+
try:
|
|
1676
|
+
if i.HasVoids():
|
|
1677
|
+
area = i.area()
|
|
1678
|
+
for void in i.Voids:
|
|
1679
|
+
void_polydata = void.GetPolygonData()
|
|
1680
|
+
if void_polydata.Area() >= 0.05 * area:
|
|
1681
|
+
voids_poly.append(void_polydata)
|
|
1682
|
+
if voids_poly:
|
|
1683
|
+
obj_data = obj_data[0].Subtract(
|
|
1684
|
+
convert_py_list_to_net_list(list(obj_data)),
|
|
1685
|
+
convert_py_list_to_net_list(voids_poly),
|
|
1686
|
+
)
|
|
1687
|
+
except:
|
|
1688
|
+
pass
|
|
1689
|
+
finally:
|
|
1690
|
+
unite_polys.extend(list(obj_data))
|
|
1663
1691
|
_poly_unite = self.edb_api.geometry.polygon_data.unite(unite_polys)
|
|
1664
1692
|
if len(_poly_unite) == 1:
|
|
1665
1693
|
self.logger.info("Correctly computed Extension at first iteration.")
|
|
@@ -1760,6 +1788,7 @@ class Edb(Database):
|
|
|
1760
1788
|
preserve_components_with_model=False,
|
|
1761
1789
|
simple_pad_check=True,
|
|
1762
1790
|
keep_lines_as_path=False,
|
|
1791
|
+
include_voids_in_extents=False,
|
|
1763
1792
|
):
|
|
1764
1793
|
"""Create a cutout using an approach entirely based on PyAEDT.
|
|
1765
1794
|
This method replaces all legacy cutout methods in PyAEDT.
|
|
@@ -1836,6 +1865,11 @@ class Edb(Database):
|
|
|
1836
1865
|
This feature works only in Electronics Desktop (3D Layout).
|
|
1837
1866
|
If the flag is set to ``True`` it can cause issues in SiWave once the Edb is imported.
|
|
1838
1867
|
Default is ``False`` to generate PolygonData of cut lines.
|
|
1868
|
+
include_voids_in_extents : bool, optional
|
|
1869
|
+
Whether to compute and include voids in pyaedt extent before the cutout. Cutout time can be affected.
|
|
1870
|
+
It works only with Conforming cutout.
|
|
1871
|
+
Default is ``False`` to generate extent without voids.
|
|
1872
|
+
|
|
1839
1873
|
|
|
1840
1874
|
Returns
|
|
1841
1875
|
-------
|
|
@@ -1845,7 +1879,7 @@ class Edb(Database):
|
|
|
1845
1879
|
|
|
1846
1880
|
Examples
|
|
1847
1881
|
--------
|
|
1848
|
-
>>> from pyedb
|
|
1882
|
+
>>> from pyedb import Edb
|
|
1849
1883
|
>>> edb = Edb(r'C:\\test.aedb', edbversion="2022.2")
|
|
1850
1884
|
>>> edb.logger.info_timer("Edb Opening")
|
|
1851
1885
|
>>> edb.logger.reset_timer()
|
|
@@ -1895,6 +1929,7 @@ class Edb(Database):
|
|
|
1895
1929
|
use_pyaedt_extent_computing=use_pyaedt_extent_computing,
|
|
1896
1930
|
check_terminals=check_terminals,
|
|
1897
1931
|
include_pingroups=include_pingroups,
|
|
1932
|
+
inlcude_voids_in_extents=include_voids_in_extents,
|
|
1898
1933
|
)
|
|
1899
1934
|
else:
|
|
1900
1935
|
legacy_path = self.edbpath
|
|
@@ -1928,6 +1963,7 @@ class Edb(Database):
|
|
|
1928
1963
|
include_partial=include_partial_instances,
|
|
1929
1964
|
simple_pad_check=simple_pad_check,
|
|
1930
1965
|
keep_lines_as_path=keep_lines_as_path,
|
|
1966
|
+
inlcude_voids_in_extents=include_voids_in_extents,
|
|
1931
1967
|
)
|
|
1932
1968
|
if self.are_port_reference_terminals_connected():
|
|
1933
1969
|
if output_aedb_path:
|
|
@@ -1968,6 +2004,7 @@ class Edb(Database):
|
|
|
1968
2004
|
include_partial=include_partial_instances,
|
|
1969
2005
|
simple_pad_check=simple_pad_check,
|
|
1970
2006
|
keep_lines_as_path=keep_lines_as_path,
|
|
2007
|
+
inlcude_voids_in_extents=include_voids_in_extents,
|
|
1971
2008
|
)
|
|
1972
2009
|
if result and not open_cutout_at_end and self.edbpath != legacy_path:
|
|
1973
2010
|
self.save_edb()
|
|
@@ -1989,6 +2026,7 @@ class Edb(Database):
|
|
|
1989
2026
|
remove_single_pin_components=False,
|
|
1990
2027
|
check_terminals=False,
|
|
1991
2028
|
include_pingroups=True,
|
|
2029
|
+
inlcude_voids_in_extents=False,
|
|
1992
2030
|
):
|
|
1993
2031
|
expansion_size = self.edb_value(expansion_size).ToDouble()
|
|
1994
2032
|
|
|
@@ -2009,8 +2047,14 @@ class Edb(Database):
|
|
|
2009
2047
|
smart_cut=check_terminals,
|
|
2010
2048
|
reference_list=reference_list,
|
|
2011
2049
|
include_pingroups=include_pingroups,
|
|
2050
|
+
inlcude_voids_in_extents=inlcude_voids_in_extents,
|
|
2012
2051
|
)
|
|
2013
|
-
|
|
2052
|
+
_poly1 = _poly.CreateFromArcs(_poly.GetArcData(), True)
|
|
2053
|
+
if inlcude_voids_in_extents:
|
|
2054
|
+
for hole in list(_poly.Holes):
|
|
2055
|
+
if hole.Area() >= 0.05 * _poly1.Area():
|
|
2056
|
+
_poly1.AddHole(hole)
|
|
2057
|
+
_poly = _poly1
|
|
2014
2058
|
# Create new cutout cell/design
|
|
2015
2059
|
included_nets_list = signal_list + reference_list
|
|
2016
2060
|
included_nets = convert_py_list_to_net_list(
|
|
@@ -2171,6 +2215,7 @@ class Edb(Database):
|
|
|
2171
2215
|
include_partial=False,
|
|
2172
2216
|
simple_pad_check=True,
|
|
2173
2217
|
keep_lines_as_path=False,
|
|
2218
|
+
inlcude_voids_in_extents=False,
|
|
2174
2219
|
):
|
|
2175
2220
|
if is_ironpython: # pragma: no cover
|
|
2176
2221
|
self.logger.error("Method working only in Cpython")
|
|
@@ -2268,11 +2313,18 @@ class Edb(Database):
|
|
|
2268
2313
|
reference_list=reference_list,
|
|
2269
2314
|
include_pingroups=include_pingroups,
|
|
2270
2315
|
pins_to_preserve=pins_to_preserve,
|
|
2316
|
+
inlcude_voids_in_extents=inlcude_voids_in_extents,
|
|
2271
2317
|
)
|
|
2272
2318
|
if extent_type in ["Conforming", self.edb_api.geometry.extent_type.Conforming, 1]:
|
|
2273
2319
|
if extent_defeature > 0:
|
|
2274
2320
|
_poly = _poly.Defeature(extent_defeature)
|
|
2275
|
-
|
|
2321
|
+
|
|
2322
|
+
_poly1 = _poly.CreateFromArcs(_poly.GetArcData(), True)
|
|
2323
|
+
if inlcude_voids_in_extents:
|
|
2324
|
+
for hole in list(_poly.Holes):
|
|
2325
|
+
if hole.Area() >= 0.05 * _poly1.Area():
|
|
2326
|
+
_poly1.AddHole(hole)
|
|
2327
|
+
_poly = _poly1
|
|
2276
2328
|
if not _poly or _poly.IsNull():
|
|
2277
2329
|
self._logger.error("Failed to create Extent.")
|
|
2278
2330
|
return []
|
|
@@ -2311,29 +2363,39 @@ class Edb(Database):
|
|
|
2311
2363
|
pdata = prim_1.polygon_data.edb_api
|
|
2312
2364
|
int_data = _poly.GetIntersectionType(pdata)
|
|
2313
2365
|
if int_data == 2:
|
|
2314
|
-
|
|
2366
|
+
if not inlcude_voids_in_extents:
|
|
2367
|
+
return
|
|
2368
|
+
skip = False
|
|
2369
|
+
for hole in list(_poly.Holes):
|
|
2370
|
+
if hole.GetIntersectionType(pdata) == 0:
|
|
2371
|
+
prims_to_delete.append(prim_1)
|
|
2372
|
+
return
|
|
2373
|
+
elif hole.GetIntersectionType(pdata) == 1:
|
|
2374
|
+
skip = True
|
|
2375
|
+
if skip:
|
|
2376
|
+
return
|
|
2315
2377
|
elif int_data == 0:
|
|
2316
2378
|
prims_to_delete.append(prim_1)
|
|
2317
|
-
|
|
2318
|
-
|
|
2319
|
-
|
|
2320
|
-
|
|
2321
|
-
|
|
2322
|
-
|
|
2323
|
-
|
|
2324
|
-
|
|
2325
|
-
|
|
2326
|
-
|
|
2327
|
-
|
|
2328
|
-
|
|
2329
|
-
|
|
2330
|
-
|
|
2331
|
-
|
|
2332
|
-
|
|
2333
|
-
|
|
2334
|
-
|
|
2379
|
+
return
|
|
2380
|
+
list_poly = intersect(_poly, pdata)
|
|
2381
|
+
if list_poly:
|
|
2382
|
+
net = prim_1.net_name
|
|
2383
|
+
voids = prim_1.voids
|
|
2384
|
+
for p in list_poly:
|
|
2385
|
+
if p.IsNull():
|
|
2386
|
+
continue
|
|
2387
|
+
# points = list(p.Points)
|
|
2388
|
+
list_void = []
|
|
2389
|
+
if voids:
|
|
2390
|
+
voids_data = [void.polygon_data.edb_api for void in voids]
|
|
2391
|
+
list_prims = subtract(p, voids_data)
|
|
2392
|
+
for prim in list_prims:
|
|
2393
|
+
if not prim.IsNull():
|
|
2394
|
+
poly_to_create.append([prim, prim_1.layer.name, net, list_void])
|
|
2395
|
+
else:
|
|
2396
|
+
poly_to_create.append([p, prim_1.layer.name, net, list_void])
|
|
2335
2397
|
|
|
2336
|
-
|
|
2398
|
+
prims_to_delete.append(prim_1)
|
|
2337
2399
|
|
|
2338
2400
|
def pins_clean(pinst):
|
|
2339
2401
|
if not pinst.in_polygon(_poly, include_partial=include_partial, simple_check=simple_pad_check):
|
|
@@ -2349,7 +2411,9 @@ class Edb(Database):
|
|
|
2349
2411
|
for pin in pins_to_delete:
|
|
2350
2412
|
pin.delete()
|
|
2351
2413
|
|
|
2352
|
-
self.logger.info_timer(
|
|
2414
|
+
self.logger.info_timer(
|
|
2415
|
+
"Padstack Instances removal completed. {} instances removed.".format(len(pins_to_delete))
|
|
2416
|
+
)
|
|
2353
2417
|
self.logger.reset_timer()
|
|
2354
2418
|
|
|
2355
2419
|
# with ThreadPoolExecutor(number_of_threads) as pool:
|
|
@@ -2368,7 +2432,7 @@ class Edb(Database):
|
|
|
2368
2432
|
for prim in prims_to_delete:
|
|
2369
2433
|
prim.delete()
|
|
2370
2434
|
|
|
2371
|
-
self.logger.info_timer("Primitives cleanup completed")
|
|
2435
|
+
self.logger.info_timer("Primitives cleanup completed. {} primitives deleted.".format(len(prims_to_delete)))
|
|
2372
2436
|
self.logger.reset_timer()
|
|
2373
2437
|
|
|
2374
2438
|
i = 0
|
|
@@ -2461,7 +2525,7 @@ class Edb(Database):
|
|
|
2461
2525
|
|
|
2462
2526
|
Examples
|
|
2463
2527
|
--------
|
|
2464
|
-
>>> from pyedb
|
|
2528
|
+
>>> from pyedb import Edb
|
|
2465
2529
|
>>> edb = Edb(r'C:\\test.aedb', edbversion="2022.2")
|
|
2466
2530
|
>>> edb.logger.info_timer("Edb Opening")
|
|
2467
2531
|
>>> edb.logger.reset_timer()
|
|
@@ -2894,7 +2958,7 @@ class Edb(Database):
|
|
|
2894
2958
|
Examples
|
|
2895
2959
|
--------
|
|
2896
2960
|
|
|
2897
|
-
>>> from pyedb
|
|
2961
|
+
>>> from pyedb import Edb
|
|
2898
2962
|
>>> edb = Edb(edbpath=r"C:\temp\myproject.aedb", edbversion="2023.2")
|
|
2899
2963
|
|
|
2900
2964
|
>>> options_config = {'UNITE_NETS' : 1, 'LAUNCH_Q3D' : 0}
|
|
@@ -2937,7 +3001,7 @@ class Edb(Database):
|
|
|
2937
3001
|
Examples
|
|
2938
3002
|
--------
|
|
2939
3003
|
|
|
2940
|
-
>>> from pyedb
|
|
3004
|
+
>>> from pyedb import Edb
|
|
2941
3005
|
>>> edb = Edb(edbpath=r"C:\temp\myproject.aedb", edbversion="2021.2")
|
|
2942
3006
|
>>> options_config = {'UNITE_NETS' : 1, 'LAUNCH_Q3D' : 0}
|
|
2943
3007
|
>>> edb.write_export3d_option_config_file(r"C:\temp", options_config)
|
|
@@ -2987,7 +3051,7 @@ class Edb(Database):
|
|
|
2987
3051
|
Examples
|
|
2988
3052
|
--------
|
|
2989
3053
|
|
|
2990
|
-
>>> from pyedb
|
|
3054
|
+
>>> from pyedb import Edb
|
|
2991
3055
|
|
|
2992
3056
|
>>> edb = Edb(edbpath=r"C:\temp\myproject.aedb", edbversion="2021.2")
|
|
2993
3057
|
|
|
@@ -3146,7 +3210,7 @@ class Edb(Database):
|
|
|
3146
3210
|
Examples
|
|
3147
3211
|
--------
|
|
3148
3212
|
|
|
3149
|
-
>>> from pyedb
|
|
3213
|
+
>>> from pyedb import Edb
|
|
3150
3214
|
>>> edb_app = Edb()
|
|
3151
3215
|
>>> boolean_1, ant_length = edb_app.add_project_variable("my_local_variable", "1cm")
|
|
3152
3216
|
>>> print(edb_app["$my_local_variable"]) #using getitem
|
|
@@ -3182,7 +3246,7 @@ class Edb(Database):
|
|
|
3182
3246
|
Examples
|
|
3183
3247
|
--------
|
|
3184
3248
|
|
|
3185
|
-
>>> from pyedb
|
|
3249
|
+
>>> from pyedb import Edb
|
|
3186
3250
|
>>> edb_app = Edb()
|
|
3187
3251
|
>>> boolean_1, ant_length = edb_app.add_design_variable("my_local_variable", "1cm")
|
|
3188
3252
|
>>> print(edb_app["my_local_variable"]) #using getitem
|
|
@@ -3220,7 +3284,7 @@ class Edb(Database):
|
|
|
3220
3284
|
Examples
|
|
3221
3285
|
--------
|
|
3222
3286
|
|
|
3223
|
-
>>> from pyedb
|
|
3287
|
+
>>> from pyedb import Edb
|
|
3224
3288
|
>>> edb_app = Edb()
|
|
3225
3289
|
>>> boolean, ant_length = edb_app.add_design_variable("ant_length", "1cm")
|
|
3226
3290
|
>>> boolean, ant_length = edb_app.change_design_variable_value("ant_length", "1m")
|
|
@@ -3265,7 +3329,7 @@ class Edb(Database):
|
|
|
3265
3329
|
Examples
|
|
3266
3330
|
--------
|
|
3267
3331
|
|
|
3268
|
-
>>> from pyedb
|
|
3332
|
+
>>> from pyedb import Edb
|
|
3269
3333
|
>>> from pyedb.dotnet.edb_core.edb_data.simulation_configuration import SimulationConfiguration
|
|
3270
3334
|
>>> config_file = path_configuration_file
|
|
3271
3335
|
>>> source_file = path_to_edb_folder
|
|
@@ -3465,7 +3529,7 @@ class Edb(Database):
|
|
|
3465
3529
|
|
|
3466
3530
|
Examples
|
|
3467
3531
|
--------
|
|
3468
|
-
>>> from pyedb
|
|
3532
|
+
>>> from pyedb import Edb
|
|
3469
3533
|
>>>edb = Edb()
|
|
3470
3534
|
>>> edb.hfss.create_edge_port_vertical(prim_1_id, ["-66mm", "-4mm"], "port_ver")
|
|
3471
3535
|
>>> edb.hfss.create_edge_port_horizontal(
|
|
@@ -3620,7 +3684,7 @@ class Edb(Database):
|
|
|
3620
3684
|
|
|
3621
3685
|
Examples
|
|
3622
3686
|
--------
|
|
3623
|
-
>>> from pyedb
|
|
3687
|
+
>>> from pyedb import Edb
|
|
3624
3688
|
>>> edbapp = Edb()
|
|
3625
3689
|
>>> setup1 = edbapp.create_hfss_setup("setup1")
|
|
3626
3690
|
>>> setup1.hfss_port_settings.max_delta_z0 = 0.5
|
|
@@ -3695,7 +3759,7 @@ class Edb(Database):
|
|
|
3695
3759
|
|
|
3696
3760
|
Examples
|
|
3697
3761
|
--------
|
|
3698
|
-
>>> from pyedb
|
|
3762
|
+
>>> from pyedb import Edb
|
|
3699
3763
|
>>> edbapp = Edb()
|
|
3700
3764
|
>>> setup1 = edbapp.create_siwave_syz_setup("setup1")
|
|
3701
3765
|
>>> setup1.add_frequency_sweep(frequency_sweep=[
|
|
@@ -3727,7 +3791,7 @@ class Edb(Database):
|
|
|
3727
3791
|
|
|
3728
3792
|
Examples
|
|
3729
3793
|
--------
|
|
3730
|
-
>>> from pyedb
|
|
3794
|
+
>>> from pyedb import Edb
|
|
3731
3795
|
>>> edbapp = Edb()
|
|
3732
3796
|
>>> setup1 = edbapp.create_siwave_dc_setup("setup1")
|
|
3733
3797
|
>>> setup1.mesh_bondwires = True
|
|
@@ -4456,3 +4520,8 @@ class Edb(Database):
|
|
|
4456
4520
|
from pyedb.dotnet.edb_core.definition.definitions import Definitions
|
|
4457
4521
|
|
|
4458
4522
|
return Definitions(self)
|
|
4523
|
+
|
|
4524
|
+
@property
|
|
4525
|
+
def workflow(self):
|
|
4526
|
+
"""Workflow class."""
|
|
4527
|
+
return Workflow(self)
|