pyedb 0.52.0__py3-none-any.whl → 0.54.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_ports_sources.py +6 -8
- pyedb/configuration/cfg_stackup.py +62 -249
- pyedb/configuration/configuration.py +272 -170
- pyedb/dotnet/database/cell/hierarchy/model.py +1 -1
- pyedb/dotnet/database/cell/layout.py +1 -1
- pyedb/dotnet/database/cell/layout_obj.py +3 -3
- pyedb/dotnet/database/cell/primitive/path.py +1 -1
- pyedb/dotnet/database/cell/primitive/primitive.py +8 -8
- pyedb/dotnet/database/cell/terminal/pingroup_terminal.py +1 -1
- pyedb/dotnet/database/cell/terminal/point_terminal.py +1 -1
- pyedb/dotnet/database/cell/terminal/terminal.py +24 -26
- pyedb/dotnet/database/components.py +33 -27
- pyedb/dotnet/database/definition/component_def.py +3 -3
- pyedb/dotnet/database/definition/component_model.py +1 -1
- pyedb/dotnet/database/definition/package_def.py +1 -1
- pyedb/dotnet/database/dotnet/database.py +47 -38
- pyedb/dotnet/database/dotnet/primitive.py +16 -16
- pyedb/dotnet/database/edb_data/hfss_extent_info.py +6 -6
- pyedb/dotnet/database/edb_data/layer_data.py +17 -15
- pyedb/dotnet/database/edb_data/padstacks_data.py +12 -12
- pyedb/dotnet/database/edb_data/primitives_data.py +3 -3
- pyedb/dotnet/database/edb_data/sources.py +6 -6
- pyedb/dotnet/database/edb_data/variables.py +7 -3
- pyedb/dotnet/database/geometry/point_data.py +1 -1
- pyedb/dotnet/database/geometry/polygon_data.py +2 -4
- pyedb/dotnet/database/hfss.py +7 -7
- pyedb/dotnet/database/materials.py +2 -2
- pyedb/dotnet/database/modeler.py +8 -11
- pyedb/dotnet/database/nets.py +1 -1
- pyedb/dotnet/database/padstack.py +72 -1
- pyedb/dotnet/database/sim_setup_data/data/settings.py +24 -0
- pyedb/dotnet/database/sim_setup_data/io/siwave.py +26 -1
- pyedb/dotnet/database/siwave.py +19 -5
- pyedb/dotnet/database/stackup.py +80 -137
- pyedb/dotnet/database/utilities/heatsink.py +4 -4
- pyedb/dotnet/database/utilities/obj_base.py +1 -1
- 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/database/utilities/value.py +116 -0
- pyedb/dotnet/edb.py +58 -45
- pyedb/generic/design_types.py +39 -1
- pyedb/generic/grpc_warnings.py +5 -0
- pyedb/grpc/__init__.py +0 -0
- pyedb/grpc/database/components.py +155 -98
- pyedb/grpc/database/control_file.py +240 -193
- pyedb/grpc/database/definition/materials.py +23 -30
- pyedb/grpc/database/definition/package_def.py +15 -15
- pyedb/grpc/database/definition/padstack_def.py +51 -51
- pyedb/grpc/database/definitions.py +7 -5
- pyedb/grpc/database/geometry/arc_data.py +7 -5
- pyedb/grpc/database/geometry/point_3d_data.py +8 -7
- pyedb/grpc/database/geometry/polygon_data.py +3 -2
- pyedb/grpc/database/hierarchy/component.py +43 -38
- pyedb/grpc/database/hierarchy/pin_pair_model.py +15 -14
- pyedb/grpc/database/hierarchy/pingroup.py +9 -9
- pyedb/grpc/database/layers/stackup_layer.py +45 -44
- pyedb/grpc/database/layout/layout.py +9 -8
- pyedb/grpc/database/layout/voltage_regulator.py +7 -7
- pyedb/grpc/database/layout_validation.py +13 -12
- pyedb/grpc/database/modeler.py +156 -131
- pyedb/grpc/database/nets.py +42 -31
- pyedb/grpc/database/padstacks.py +270 -175
- pyedb/grpc/database/ports/ports.py +5 -6
- pyedb/grpc/database/primitive/bondwire.py +8 -7
- pyedb/grpc/database/primitive/circle.py +4 -4
- pyedb/grpc/database/primitive/padstack_instance.py +18 -18
- pyedb/grpc/database/primitive/path.py +7 -7
- pyedb/grpc/database/primitive/polygon.py +3 -3
- pyedb/grpc/database/primitive/primitive.py +13 -17
- pyedb/grpc/database/primitive/rectangle.py +13 -13
- pyedb/grpc/database/simulation_setup/hfss_general_settings.py +1 -1
- pyedb/grpc/database/simulation_setup/hfss_simulation_setup.py +10 -0
- pyedb/grpc/database/simulation_setup/siwave_cpa_simulation_setup.py +961 -0
- pyedb/grpc/database/simulation_setup/siwave_simulation_setup.py +17 -1
- pyedb/grpc/database/siwave.py +44 -24
- pyedb/grpc/database/source_excitations.py +333 -229
- pyedb/grpc/database/stackup.py +164 -147
- pyedb/grpc/database/terminal/bundle_terminal.py +17 -7
- pyedb/grpc/database/terminal/edge_terminal.py +10 -0
- pyedb/grpc/database/terminal/padstack_instance_terminal.py +15 -4
- pyedb/grpc/database/terminal/pingroup_terminal.py +11 -10
- pyedb/grpc/database/terminal/point_terminal.py +4 -3
- pyedb/grpc/database/terminal/terminal.py +9 -9
- pyedb/grpc/database/utility/value.py +109 -0
- pyedb/grpc/edb.py +129 -45
- pyedb/grpc/edb_init.py +0 -7
- pyedb/siwave_core/cpa/simulation_setup_data_model.py +132 -0
- pyedb/siwave_core/product_properties.py +198 -0
- {pyedb-0.52.0.dist-info → pyedb-0.54.0.dist-info}/METADATA +15 -13
- {pyedb-0.52.0.dist-info → pyedb-0.54.0.dist-info}/RECORD +97 -89
- {pyedb-0.52.0.dist-info → pyedb-0.54.0.dist-info}/WHEEL +1 -1
- {pyedb-0.52.0.dist-info → pyedb-0.54.0.dist-info/licenses}/LICENSE +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.sim_setup_data.data.adaptive_frequency_data import (
|
|
24
25
|
AdaptiveFrequencyData,
|
|
@@ -901,6 +902,24 @@ class HfssSolverSettings(object):
|
|
|
901
902
|
def enhanced_low_freq_accuracy(self):
|
|
902
903
|
"""Whether to enable legacy low-frequency sampling.
|
|
903
904
|
|
|
905
|
+
.. deprecated:: pyedb 0.54.0
|
|
906
|
+
Use :func:`enhanced_low_frequency_accuracy` instead.
|
|
907
|
+
|
|
908
|
+
Returns
|
|
909
|
+
-------
|
|
910
|
+
bool
|
|
911
|
+
``True`` if low frequency accuracy is used, ``False`` otherwise.
|
|
912
|
+
"""
|
|
913
|
+
warnings.warn(
|
|
914
|
+
"`enhanced_low_freq_accuracy` is deprecated, use `enhanced_low_frequency_accuracy` instead.",
|
|
915
|
+
DeprecationWarning,
|
|
916
|
+
)
|
|
917
|
+
return self._hfss_solver_settings.EnhancedLowFreqAccuracy
|
|
918
|
+
|
|
919
|
+
@property
|
|
920
|
+
def enhanced_low_frequency_accuracy(self):
|
|
921
|
+
"""Whether to enable legacy low-frequency sampling.
|
|
922
|
+
|
|
904
923
|
Returns
|
|
905
924
|
-------
|
|
906
925
|
bool
|
|
@@ -913,6 +932,11 @@ class HfssSolverSettings(object):
|
|
|
913
932
|
self._hfss_solver_settings.EnhancedLowFreqAccuracy = value
|
|
914
933
|
self._parent._update_setup()
|
|
915
934
|
|
|
935
|
+
@enhanced_low_frequency_accuracy.setter
|
|
936
|
+
def enhanced_low_frequency_accuracy(self, value):
|
|
937
|
+
self._hfss_solver_settings.EnhancedLowFreqAccuracy = value
|
|
938
|
+
self._parent._update_setup()
|
|
939
|
+
|
|
916
940
|
@property
|
|
917
941
|
def order_basis(self):
|
|
918
942
|
"""Order of the basic functions for HFSS.
|
|
@@ -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
|
|
|
24
25
|
def _parse_value(v):
|
|
@@ -92,7 +93,7 @@ class AdvancedSettings(SettingsBase):
|
|
|
92
93
|
def __init__(self, parent):
|
|
93
94
|
super().__init__(parent)
|
|
94
95
|
self.defaults = {
|
|
95
|
-
"
|
|
96
|
+
"mesh_automatic": True,
|
|
96
97
|
"ignore_non_functional_pads": True,
|
|
97
98
|
"include_coplane_coupling": True,
|
|
98
99
|
"include_fringe_coupling": True,
|
|
@@ -339,6 +340,26 @@ class AdvancedSettings(SettingsBase):
|
|
|
339
340
|
depending on drawing size, number of modes, and/or maximum sweep
|
|
340
341
|
frequency.
|
|
341
342
|
|
|
343
|
+
.. deprecated:: 0.54.0
|
|
344
|
+
Use :func:`automatic_mesh` instead.
|
|
345
|
+
|
|
346
|
+
Returns
|
|
347
|
+
-------
|
|
348
|
+
bool
|
|
349
|
+
``True`` if automatic mesh is used, ``False`` otherwise.
|
|
350
|
+
"""
|
|
351
|
+
warnings.warn(
|
|
352
|
+
"`automatic_mesh` is deprecated." "Use `mesh_automatic` instead.",
|
|
353
|
+
DeprecationWarning,
|
|
354
|
+
)
|
|
355
|
+
return self.sim_setup_info.simulation_settings.AdvancedSettings.MeshAutoMatic
|
|
356
|
+
|
|
357
|
+
@property
|
|
358
|
+
def mesh_automatic(self):
|
|
359
|
+
"""Whether to automatically pick a suitable mesh refinement frequency,
|
|
360
|
+
depending on drawing size, number of modes, and/or maximum sweep
|
|
361
|
+
frequency.
|
|
362
|
+
|
|
342
363
|
Returns
|
|
343
364
|
-------
|
|
344
365
|
bool
|
|
@@ -492,6 +513,10 @@ class AdvancedSettings(SettingsBase):
|
|
|
492
513
|
|
|
493
514
|
@automatic_mesh.setter
|
|
494
515
|
def automatic_mesh(self, value):
|
|
516
|
+
self.mesh_automatic = value
|
|
517
|
+
|
|
518
|
+
@mesh_automatic.setter
|
|
519
|
+
def mesh_automatic(self, value):
|
|
495
520
|
edb_setup_info = self.sim_setup_info
|
|
496
521
|
|
|
497
522
|
edb_setup_info.simulation_settings.AdvancedSettings.MeshAutoMatic = value
|
pyedb/dotnet/database/siwave.py
CHANGED
|
@@ -40,6 +40,9 @@ from pyedb.dotnet.database.edb_data.sources import (
|
|
|
40
40
|
VoltageSource,
|
|
41
41
|
)
|
|
42
42
|
from pyedb.dotnet.database.general import convert_py_list_to_net_list
|
|
43
|
+
from pyedb.dotnet.database.utilities.siwave_cpa_simulation_setup import (
|
|
44
|
+
SIWaveCPASimulationSetup,
|
|
45
|
+
)
|
|
43
46
|
from pyedb.generic.constants import SolverType, SweepType
|
|
44
47
|
from pyedb.generic.general_methods import _retry_ntimes, generate_unique_name
|
|
45
48
|
from pyedb.misc.siw_feature_config.xtalk_scan.scan_config import SiwaveScanConfig
|
|
@@ -67,7 +70,7 @@ class EdbSiwave(object):
|
|
|
67
70
|
@property
|
|
68
71
|
def _edb(self):
|
|
69
72
|
"""EDB."""
|
|
70
|
-
return self._pedb.
|
|
73
|
+
return self._pedb.core
|
|
71
74
|
|
|
72
75
|
def _get_edb_value(self, value):
|
|
73
76
|
"""Get the Edb value."""
|
|
@@ -1489,7 +1492,7 @@ class EdbSiwave(object):
|
|
|
1489
1492
|
"""Icepak default setting. If "True", only resistor are active in Icepak simulation.
|
|
1490
1493
|
The power dissipation of the resistors are calculated from DC results.
|
|
1491
1494
|
"""
|
|
1492
|
-
siwave_id = self._pedb.
|
|
1495
|
+
siwave_id = self._pedb.core.ProductId.SIWave
|
|
1493
1496
|
cell = self._pedb.active_cell._active_cell
|
|
1494
1497
|
_, value = cell.GetProductProperty(siwave_id, 422, "")
|
|
1495
1498
|
return bool(value)
|
|
@@ -1507,23 +1510,34 @@ class EdbSiwave(object):
|
|
|
1507
1510
|
"""
|
|
1508
1511
|
return SiwaveScanConfig(self._pedb, scan_type)
|
|
1509
1512
|
|
|
1513
|
+
def add_cpa_analysis(self, name=None, siwave_cpa_setup_class=None):
|
|
1514
|
+
if not name:
|
|
1515
|
+
from pyedb.generic.general_methods import generate_unique_name
|
|
1516
|
+
|
|
1517
|
+
if not siwave_cpa_setup_class:
|
|
1518
|
+
name = generate_unique_name("cpa_setup")
|
|
1519
|
+
else:
|
|
1520
|
+
name = siwave_cpa_setup_class.name
|
|
1521
|
+
cpa_setup = SIWaveCPASimulationSetup(self._pedb, name=name, siwave_cpa_setup_class=siwave_cpa_setup_class)
|
|
1522
|
+
return cpa_setup
|
|
1523
|
+
|
|
1510
1524
|
@icepak_use_minimal_comp_defaults.setter
|
|
1511
1525
|
def icepak_use_minimal_comp_defaults(self, value):
|
|
1512
1526
|
value = "True" if bool(value) else ""
|
|
1513
|
-
siwave_id = self._pedb.
|
|
1527
|
+
siwave_id = self._pedb.core.ProductId.SIWave
|
|
1514
1528
|
cell = self._pedb.active_cell._active_cell
|
|
1515
1529
|
cell.SetProductProperty(siwave_id, 422, value)
|
|
1516
1530
|
|
|
1517
1531
|
@property
|
|
1518
1532
|
def icepak_component_file(self):
|
|
1519
1533
|
"""Icepak component file path."""
|
|
1520
|
-
siwave_id = self._pedb.
|
|
1534
|
+
siwave_id = self._pedb.core.ProductId.SIWave
|
|
1521
1535
|
cell = self._pedb.active_cell._active_cell
|
|
1522
1536
|
_, value = cell.GetProductProperty(siwave_id, 420, "")
|
|
1523
1537
|
return value
|
|
1524
1538
|
|
|
1525
1539
|
@icepak_component_file.setter
|
|
1526
1540
|
def icepak_component_file(self, value):
|
|
1527
|
-
siwave_id = self._pedb.
|
|
1541
|
+
siwave_id = self._pedb.core.ProductId.SIWave
|
|
1528
1542
|
cell = self._pedb.active_cell._active_cell
|
|
1529
1543
|
cell.SetProductProperty(siwave_id, 420, value)
|
pyedb/dotnet/database/stackup.py
CHANGED
|
@@ -68,20 +68,20 @@ class LayerCollection(object):
|
|
|
68
68
|
self._pedb = pedb
|
|
69
69
|
|
|
70
70
|
if edb_object:
|
|
71
|
-
self._edb_object = self._pedb.
|
|
71
|
+
self._edb_object = self._pedb.core.cell._cell.LayerCollection(edb_object)
|
|
72
72
|
else:
|
|
73
|
-
self._edb_object = self._pedb.
|
|
73
|
+
self._edb_object = self._pedb.core.cell._cell.LayerCollection()
|
|
74
74
|
|
|
75
75
|
self._layer_type_set_mapping = {
|
|
76
|
-
"stackup_layer_set": self._pedb.
|
|
77
|
-
"signal_ayer_et": self._pedb.
|
|
78
|
-
"non_stackup_layer_set": self._pedb.
|
|
79
|
-
"all_layer_et": self._pedb.
|
|
76
|
+
"stackup_layer_set": self._pedb.core.cell.layer_type_set.StackupLayerSet,
|
|
77
|
+
"signal_ayer_et": self._pedb.core.cell.layer_type_set.SignalLayerSet,
|
|
78
|
+
"non_stackup_layer_set": self._pedb.core.cell.layer_type_set.NonStackupLayerSet,
|
|
79
|
+
"all_layer_et": self._pedb.core.cell.layer_type_set.AllLayerSet,
|
|
80
80
|
}
|
|
81
81
|
self._lc_mode_mapping = {
|
|
82
|
-
"laminate": self._pedb.
|
|
83
|
-
"overlapping": self._pedb.
|
|
84
|
-
"multizone": self._pedb.
|
|
82
|
+
"laminate": self._pedb.core.cell._cell.LayerCollectionMode.Laminate,
|
|
83
|
+
"overlapping": self._pedb.core.cell._cell.LayerCollectionMode.Overlapping,
|
|
84
|
+
"multizone": self._pedb.core.cell._cell.LayerCollectionMode.MultiZone,
|
|
85
85
|
}
|
|
86
86
|
|
|
87
87
|
def update_layout(self):
|
|
@@ -95,7 +95,7 @@ class LayerCollection(object):
|
|
|
95
95
|
|
|
96
96
|
def refresh_layer_collection(self):
|
|
97
97
|
"""Refresh layer collection from Edb. This method is run on demand after all edit operations on stackup."""
|
|
98
|
-
self._edb_object = self._pedb.
|
|
98
|
+
self._edb_object = self._pedb.core.cell._cell.LayerCollection(self._pedb.layout.layer_collection)
|
|
99
99
|
self._lc = self._edb_object
|
|
100
100
|
|
|
101
101
|
def _add_layer(self, add_method, base_layer_name="", **kwargs):
|
|
@@ -238,7 +238,7 @@ class LayerCollection(object):
|
|
|
238
238
|
return self._add_layer(add_method="add_layer_bottom", **kwargs)
|
|
239
239
|
|
|
240
240
|
def set_layer_clone(self, layer_clone):
|
|
241
|
-
lc = self._pedb.
|
|
241
|
+
lc = self._pedb.core.cell._cell.LayerCollection() # empty layer collection
|
|
242
242
|
lc.SetMode(self._edb_object.GetMode())
|
|
243
243
|
if self.mode.lower() == "laminate":
|
|
244
244
|
add_method = lc.AddLayerBottom
|
|
@@ -282,7 +282,7 @@ class LayerCollection(object):
|
|
|
282
282
|
@property
|
|
283
283
|
def all_layers(self):
|
|
284
284
|
self.refresh_layer_collection()
|
|
285
|
-
layer_list = list(self._edb_object.Layers(self._pedb.
|
|
285
|
+
layer_list = list(self._edb_object.Layers(self._pedb.core.cell.layer_type_set.AllLayerSet))
|
|
286
286
|
temp = dict()
|
|
287
287
|
for i in layer_list:
|
|
288
288
|
obj = layer_cast(self._pedb, i)
|
|
@@ -306,7 +306,7 @@ class LayerCollection(object):
|
|
|
306
306
|
|
|
307
307
|
def find_layer_by_name(self, name: str):
|
|
308
308
|
"""Finds a layer with the given name."""
|
|
309
|
-
obj = self._pedb.
|
|
309
|
+
obj = self._pedb.core.cell._cell.Layer.FindByName(self._edb_object, name)
|
|
310
310
|
if obj.IsNull():
|
|
311
311
|
raise ValueError("Layer with name '{}' was not found.".format(name))
|
|
312
312
|
else:
|
|
@@ -337,7 +337,7 @@ class Stackup(LayerCollection):
|
|
|
337
337
|
type
|
|
338
338
|
Types of layers.
|
|
339
339
|
"""
|
|
340
|
-
return self._pedb.
|
|
340
|
+
return self._pedb.core.cell.layer_type
|
|
341
341
|
|
|
342
342
|
@property
|
|
343
343
|
def thickness(self):
|
|
@@ -592,7 +592,7 @@ class Stackup(LayerCollection):
|
|
|
592
592
|
|
|
593
593
|
@mode.setter
|
|
594
594
|
def mode(self, value):
|
|
595
|
-
mode = self._pedb.
|
|
595
|
+
mode = self._pedb.core.Cell.LayerCollectionMode
|
|
596
596
|
if value == 0 or value == mode.Laminate or value == "Laminate":
|
|
597
597
|
self._layer_collection.SetMode(mode.Laminate)
|
|
598
598
|
elif value == 1 or value == mode.Overlapping or value == "Overlapping":
|
|
@@ -627,7 +627,7 @@ class Stackup(LayerCollection):
|
|
|
627
627
|
|
|
628
628
|
@property
|
|
629
629
|
def _edb_layer_list(self):
|
|
630
|
-
layer_list = list(self._layer_collection.Layers(self._pedb.
|
|
630
|
+
layer_list = list(self._layer_collection.Layers(self._pedb.core.cell.layer_type_set.AllLayerSet))
|
|
631
631
|
return [i.Clone() for i in layer_list]
|
|
632
632
|
|
|
633
633
|
@property
|
|
@@ -638,7 +638,7 @@ class Stackup(LayerCollection):
|
|
|
638
638
|
-------
|
|
639
639
|
Dict[str, :class:`pyedb.dotnet.database.edb_data.layer_data.LayerEdbClass`]
|
|
640
640
|
"""
|
|
641
|
-
layer_type = self._pedb.
|
|
641
|
+
layer_type = self._pedb.core.cell.layer_type.SignalLayer
|
|
642
642
|
_lays = OrderedDict()
|
|
643
643
|
for name, obj in self.layers.items():
|
|
644
644
|
if obj._edb_layer.GetLayerType() == layer_type:
|
|
@@ -654,7 +654,7 @@ class Stackup(LayerCollection):
|
|
|
654
654
|
dict[str, :class:`dotnet.database.edb_data.layer_data.EDBLayer`]
|
|
655
655
|
Dictionary of dielectric layers.
|
|
656
656
|
"""
|
|
657
|
-
layer_type = self._pedb.
|
|
657
|
+
layer_type = self._pedb.core.cell.layer_type.DielectricLayer
|
|
658
658
|
_lays = OrderedDict()
|
|
659
659
|
for name, obj in self.layers.items():
|
|
660
660
|
if obj._edb_layer.GetLayerType() == layer_type:
|
|
@@ -684,14 +684,13 @@ class Stackup(LayerCollection):
|
|
|
684
684
|
if operation in ["change_position", "change_attribute", "change_name"]:
|
|
685
685
|
lc_readonly = self._pedb.layout.layer_collection
|
|
686
686
|
layers = [
|
|
687
|
-
i.Clone()
|
|
688
|
-
for i in list(list(lc_readonly.Layers(self._pedb.edb_api.cell.layer_type_set.StackupLayerSet)))
|
|
687
|
+
i.Clone() for i in list(list(lc_readonly.Layers(self._pedb.core.cell.layer_type_set.StackupLayerSet)))
|
|
689
688
|
]
|
|
690
689
|
non_stackup = [
|
|
691
690
|
i.Clone()
|
|
692
|
-
for i in list(list(lc_readonly.Layers(self._pedb.
|
|
691
|
+
for i in list(list(lc_readonly.Layers(self._pedb.core.cell.layer_type_set.NonStackupLayerSet)))
|
|
693
692
|
]
|
|
694
|
-
_lc = self._pedb.
|
|
693
|
+
_lc = self._pedb.core.cell._cell.LayerCollection()
|
|
695
694
|
mode = lc_readonly.GetMode()
|
|
696
695
|
_lc.SetMode(lc_readonly.GetMode())
|
|
697
696
|
if str(mode) == "Overlapping":
|
|
@@ -727,11 +726,11 @@ class Stackup(LayerCollection):
|
|
|
727
726
|
|
|
728
727
|
def _create_stackup_layer(self, layer_name, thickness, layer_type="signal"):
|
|
729
728
|
if layer_type == "signal":
|
|
730
|
-
_layer_type = self._pedb.
|
|
729
|
+
_layer_type = self._pedb.core.cell.layer_type.SignalLayer
|
|
731
730
|
else:
|
|
732
|
-
_layer_type = self._pedb.
|
|
731
|
+
_layer_type = self._pedb.core.cell.layer_type.DielectricLayer
|
|
733
732
|
|
|
734
|
-
result = self._pedb.
|
|
733
|
+
result = self._pedb.core.cell._cell.StackupLayer(
|
|
735
734
|
layer_name,
|
|
736
735
|
_layer_type,
|
|
737
736
|
self._edb_value(thickness),
|
|
@@ -743,39 +742,39 @@ class Stackup(LayerCollection):
|
|
|
743
742
|
|
|
744
743
|
def _create_nonstackup_layer(self, layer_name, layer_type):
|
|
745
744
|
if layer_type == "conducting": # pragma: no cover
|
|
746
|
-
_layer_type = self._pedb.
|
|
745
|
+
_layer_type = self._pedb.core.cell.layer_type.ConductingLayer
|
|
747
746
|
elif layer_type == "airlines": # pragma: no cover
|
|
748
|
-
_layer_type = self._pedb.
|
|
747
|
+
_layer_type = self._pedb.core.cell.layer_type.AirlinesLayer
|
|
749
748
|
elif layer_type == "error": # pragma: no cover
|
|
750
|
-
_layer_type = self._pedb.
|
|
749
|
+
_layer_type = self._pedb.core.cell.layer_type.ErrorsLayer
|
|
751
750
|
elif layer_type == "symbol": # pragma: no cover
|
|
752
|
-
_layer_type = self._pedb.
|
|
751
|
+
_layer_type = self._pedb.core.cell.layer_type.SymbolLayer
|
|
753
752
|
elif layer_type == "measure": # pragma: no cover
|
|
754
|
-
_layer_type = self._pedb.
|
|
753
|
+
_layer_type = self._pedb.core.cell.layer_type.MeasureLayer
|
|
755
754
|
elif layer_type == "assembly": # pragma: no cover
|
|
756
|
-
_layer_type = self._pedb.
|
|
755
|
+
_layer_type = self._pedb.core.cell.layer_type.AssemblyLayer
|
|
757
756
|
elif layer_type == "silkscreen": # pragma: no cover
|
|
758
|
-
_layer_type = self._pedb.
|
|
757
|
+
_layer_type = self._pedb.core.cell.layer_type.SilkscreenLayer
|
|
759
758
|
elif layer_type == "soldermask": # pragma: no cover
|
|
760
|
-
_layer_type = self._pedb.
|
|
759
|
+
_layer_type = self._pedb.core.cell.layer_type.SolderMaskLayer
|
|
761
760
|
elif layer_type == "solderpaste": # pragma: no cover
|
|
762
|
-
_layer_type = self._pedb.
|
|
761
|
+
_layer_type = self._pedb.core.cell.layer_type.SolderPasteLayer
|
|
763
762
|
elif layer_type == "glue": # pragma: no cover
|
|
764
|
-
_layer_type = self._pedb.
|
|
763
|
+
_layer_type = self._pedb.core.cell.layer_type.GlueLayer
|
|
765
764
|
elif layer_type == "wirebond": # pragma: no cover
|
|
766
|
-
_layer_type = self._pedb.
|
|
765
|
+
_layer_type = self._pedb.core.cell.layer_type.WirebondLayer
|
|
767
766
|
elif layer_type == "user": # pragma: no cover
|
|
768
|
-
_layer_type = self._pedb.
|
|
767
|
+
_layer_type = self._pedb.core.cell.layer_type.UserLayer
|
|
769
768
|
elif layer_type == "siwavehfsssolverregions": # pragma: no cover
|
|
770
|
-
_layer_type = self._pedb.
|
|
769
|
+
_layer_type = self._pedb.core.cell.layer_type.SIwaveHFSSSolverRegions
|
|
771
770
|
elif layer_type == "outline": # pragma: no cover
|
|
772
|
-
_layer_type = self._pedb.
|
|
771
|
+
_layer_type = self._pedb.core.cell.layer_type.OutlineLayer
|
|
773
772
|
elif layer_type == "postprocessing": # pragma: no cover
|
|
774
|
-
_layer_type = self._pedb.
|
|
773
|
+
_layer_type = self._pedb.core.cell.layer_type.PostprocessingLayer
|
|
775
774
|
else: # pragma: no cover
|
|
776
|
-
_layer_type = self._pedb.
|
|
775
|
+
_layer_type = self._pedb.core.cell.layer_type.UndefinedLayerType
|
|
777
776
|
|
|
778
|
-
result = self._pedb.
|
|
777
|
+
result = self._pedb.core.cell.layer(layer_name, _layer_type)
|
|
779
778
|
self.refresh_layer_collection()
|
|
780
779
|
return result
|
|
781
780
|
|
|
@@ -901,7 +900,7 @@ class Stackup(LayerCollection):
|
|
|
901
900
|
-------
|
|
902
901
|
|
|
903
902
|
"""
|
|
904
|
-
new_layer_collection = self._pedb.
|
|
903
|
+
new_layer_collection = self._pedb.core.Cell.LayerCollection()
|
|
905
904
|
for lyr in self._edb_layer_list:
|
|
906
905
|
if not (lyr.GetName() == name):
|
|
907
906
|
new_layer_collection.AddLayerBottom(lyr)
|
|
@@ -1122,9 +1121,9 @@ class Stackup(LayerCollection):
|
|
|
1122
1121
|
``True`` when successful, ``False`` when failed.
|
|
1123
1122
|
"""
|
|
1124
1123
|
if only_metals:
|
|
1125
|
-
input_layers = self._pedb.
|
|
1124
|
+
input_layers = self._pedb.core.cell.layer_type_set.SignalLayerSet
|
|
1126
1125
|
else:
|
|
1127
|
-
input_layers = self._pedb.
|
|
1126
|
+
input_layers = self._pedb.core.cell.layer_type_set.StackupLayerSet
|
|
1128
1127
|
|
|
1129
1128
|
res, topl, topz, bottoml, bottomz = self._layer_collection.GetTopBottomStackupLayers(input_layers)
|
|
1130
1129
|
return topl.GetName(), topz, bottoml.GetName(), bottomz
|
|
@@ -1146,18 +1145,18 @@ class Stackup(LayerCollection):
|
|
|
1146
1145
|
"""
|
|
1147
1146
|
try:
|
|
1148
1147
|
lc = self._layer_collection
|
|
1149
|
-
new_lc = self._pedb.
|
|
1148
|
+
new_lc = self._pedb.core.Cell.LayerCollection()
|
|
1150
1149
|
lc_mode = lc.GetMode()
|
|
1151
1150
|
new_lc.SetMode(lc_mode)
|
|
1152
1151
|
max_elevation = 0.0
|
|
1153
|
-
for layer in lc.Layers(self._pedb.
|
|
1152
|
+
for layer in lc.Layers(self._pedb.core.cell.layer_type_set.StackupLayerSet):
|
|
1154
1153
|
if "RadBox" not in layer.GetName(): # Ignore RadBox
|
|
1155
1154
|
lower_elevation = layer.Clone().GetLowerElevation() * 1.0e6
|
|
1156
1155
|
upper_elevation = layer.Clone().GetUpperElevation() * 1.0e6
|
|
1157
1156
|
max_elevation = max([max_elevation, lower_elevation, upper_elevation])
|
|
1158
1157
|
|
|
1159
1158
|
non_stackup_layers = []
|
|
1160
|
-
for layer in lc.Layers(self._pedb.
|
|
1159
|
+
for layer in lc.Layers(self._pedb.core.cell.layer_type_set.AllLayerSet):
|
|
1161
1160
|
cloned_layer = layer.Clone()
|
|
1162
1161
|
if not cloned_layer.IsStackupLayer():
|
|
1163
1162
|
non_stackup_layers.append(cloned_layer)
|
|
@@ -1169,18 +1168,16 @@ class Stackup(LayerCollection):
|
|
|
1169
1168
|
cloned_layer.SetLowerElevation(val)
|
|
1170
1169
|
if (
|
|
1171
1170
|
cloned_layer.GetTopBottomAssociation()
|
|
1172
|
-
== self._pedb.
|
|
1171
|
+
== self._pedb.core.Cell.TopBottomAssociation.TopAssociated
|
|
1173
1172
|
):
|
|
1174
|
-
cloned_layer.SetTopBottomAssociation(
|
|
1175
|
-
self._pedb.edb_api.Cell.TopBottomAssociation.BottomAssociated
|
|
1176
|
-
)
|
|
1173
|
+
cloned_layer.SetTopBottomAssociation(self._pedb.core.Cell.TopBottomAssociation.BottomAssociated)
|
|
1177
1174
|
else:
|
|
1178
|
-
cloned_layer.SetTopBottomAssociation(self._pedb.
|
|
1175
|
+
cloned_layer.SetTopBottomAssociation(self._pedb.core.Cell.TopBottomAssociation.TopAssociated)
|
|
1179
1176
|
new_lc.AddStackupLayerAtElevation(cloned_layer)
|
|
1180
1177
|
|
|
1181
1178
|
vialayers = [
|
|
1182
1179
|
lay
|
|
1183
|
-
for lay in lc.Layers(self._pedb.
|
|
1180
|
+
for lay in lc.Layers(self._pedb.core.cell.layer_type_set.StackupLayerSet)
|
|
1184
1181
|
if lay.Clone().IsViaLayer()
|
|
1185
1182
|
]
|
|
1186
1183
|
for layer in vialayers:
|
|
@@ -1189,19 +1186,19 @@ class Stackup(LayerCollection):
|
|
|
1189
1186
|
lower_ref_name = cloned_via_layer.GetRefLayerName(False)
|
|
1190
1187
|
upper_ref = [
|
|
1191
1188
|
lay
|
|
1192
|
-
for lay in lc.Layers(self._pedb.
|
|
1189
|
+
for lay in lc.Layers(self._pedb.core.cell.layer_type_set.AllLayerSet)
|
|
1193
1190
|
if lay.GetName() == upper_ref_name
|
|
1194
1191
|
][0]
|
|
1195
1192
|
lower_ref = [
|
|
1196
1193
|
lay
|
|
1197
|
-
for lay in lc.Layers(self._pedb.
|
|
1194
|
+
for lay in lc.Layers(self._pedb.core.cell.layer_type_set.AllLayerSet)
|
|
1198
1195
|
if lay.GetName() == lower_ref_name
|
|
1199
1196
|
][0]
|
|
1200
1197
|
cloned_via_layer.SetRefLayer(lower_ref, True)
|
|
1201
1198
|
cloned_via_layer.SetRefLayer(upper_ref, False)
|
|
1202
1199
|
ref_layer_in_flipped_stackup = [
|
|
1203
1200
|
lay
|
|
1204
|
-
for lay in new_lc.Layers(self._pedb.
|
|
1201
|
+
for lay in new_lc.Layers(self._pedb.core.cell.layer_type_set.AllLayerSet)
|
|
1205
1202
|
if lay.GetName() == upper_ref_name
|
|
1206
1203
|
][0]
|
|
1207
1204
|
via_layer_lower_elevation = (
|
|
@@ -1246,7 +1243,7 @@ class Stackup(LayerCollection):
|
|
|
1246
1243
|
cmp_prop.SetDieProperty(die_prop)
|
|
1247
1244
|
cmp.SetComponentProperty(cmp_prop)
|
|
1248
1245
|
|
|
1249
|
-
lay_list = list(new_lc.Layers(self._pedb.
|
|
1246
|
+
lay_list = list(new_lc.Layers(self._pedb.core.cell.layer_type_set.SignalLayerSet))
|
|
1250
1247
|
for padstack in list(self._pedb.padstacks.instances.values()):
|
|
1251
1248
|
start_layer_id = [lay.GetLayerId() for lay in list(lay_list) if lay.GetName() == padstack.start_layer]
|
|
1252
1249
|
stop_layer_id = [lay.GetLayerId() for lay in list(lay_list) if lay.GetName() == padstack.stop_layer]
|
|
@@ -1397,7 +1394,7 @@ class Stackup(LayerCollection):
|
|
|
1397
1394
|
list_cells = self._pedb.copy_cells([edb_cell.api_object])
|
|
1398
1395
|
edb_cell = list_cells[0]
|
|
1399
1396
|
self._pedb.layout.cell.SetBlackBox(True)
|
|
1400
|
-
cell_inst2 = self._pedb.
|
|
1397
|
+
cell_inst2 = self._pedb.core.cell.hierarchy.cell_instance.Create(
|
|
1401
1398
|
edb_cell.GetLayout(), self._pedb.layout.cell.GetName(), self._pedb.active_layout
|
|
1402
1399
|
)
|
|
1403
1400
|
cell_trans = cell_inst2.GetTransform()
|
|
@@ -1411,11 +1408,11 @@ class Stackup(LayerCollection):
|
|
|
1411
1408
|
|
|
1412
1409
|
if place_on_top:
|
|
1413
1410
|
cell_inst2.SetPlacementLayer(
|
|
1414
|
-
list(stackup_target.Layers(self._pedb.
|
|
1411
|
+
list(stackup_target.Layers(self._pedb.core.cell.layer_type_set.SignalLayerSet))[0]
|
|
1415
1412
|
)
|
|
1416
1413
|
else:
|
|
1417
1414
|
cell_inst2.SetPlacementLayer(
|
|
1418
|
-
list(stackup_target.Layers(self._pedb.
|
|
1415
|
+
list(stackup_target.Layers(self._pedb.core.cell.layer_type_set.SignalLayerSet))[-1]
|
|
1419
1416
|
)
|
|
1420
1417
|
self.refresh_layer_collection()
|
|
1421
1418
|
return True
|
|
@@ -1505,23 +1502,23 @@ class Stackup(LayerCollection):
|
|
|
1505
1502
|
list_cells = self._pedb.copy_cells(edb_cell.api_object)
|
|
1506
1503
|
edb_cell = list_cells[0]
|
|
1507
1504
|
self._pedb.layout.cell.SetBlackBox(True)
|
|
1508
|
-
cell_inst2 = self._pedb.
|
|
1505
|
+
cell_inst2 = self._pedb.core.cell.hierarchy.cell_instance.Create(
|
|
1509
1506
|
edb_cell.GetLayout(), self._pedb.layout.cell.GetName(), self._pedb.active_layout
|
|
1510
1507
|
)
|
|
1511
1508
|
|
|
1512
|
-
stackup_target = self._pedb.
|
|
1513
|
-
stackup_source = self._pedb.
|
|
1509
|
+
stackup_target = self._pedb.core.Cell.LayerCollection(edb_cell.GetLayout().GetLayerCollection())
|
|
1510
|
+
stackup_source = self._pedb.core.Cell.LayerCollection(self._pedb.layout.layer_collection)
|
|
1514
1511
|
|
|
1515
1512
|
if place_on_top:
|
|
1516
1513
|
cell_inst2.SetPlacementLayer(
|
|
1517
|
-
list(stackup_target.Layers(self._pedb.
|
|
1514
|
+
list(stackup_target.Layers(self._pedb.core.cell.layer_type_set.SignalLayerSet))[0]
|
|
1518
1515
|
)
|
|
1519
1516
|
else:
|
|
1520
1517
|
cell_inst2.SetPlacementLayer(
|
|
1521
|
-
list(stackup_target.Layers(self._pedb.
|
|
1518
|
+
list(stackup_target.Layers(self._pedb.core.cell.layer_type_set.SignalLayerSet))[-1]
|
|
1522
1519
|
)
|
|
1523
1520
|
cell_inst2.SetIs3DPlacement(True)
|
|
1524
|
-
sig_set = self._pedb.
|
|
1521
|
+
sig_set = self._pedb.core.cell.layer_type_set.SignalLayerSet
|
|
1525
1522
|
res = stackup_target.GetTopBottomStackupLayers(sig_set)
|
|
1526
1523
|
target_top_elevation = res[2]
|
|
1527
1524
|
target_bottom_elevation = res[4]
|
|
@@ -1656,23 +1653,23 @@ class Stackup(LayerCollection):
|
|
|
1656
1653
|
|
|
1657
1654
|
instance_name = generate_unique_name(edb_cell.GetName(), n=2)
|
|
1658
1655
|
|
|
1659
|
-
cell_inst2 = self._pedb.
|
|
1656
|
+
cell_inst2 = self._pedb.core.cell.hierarchy.cell_instance.Create(
|
|
1660
1657
|
self._pedb.active_layout, instance_name, edb_cell.GetLayout()
|
|
1661
1658
|
)
|
|
1662
1659
|
|
|
1663
|
-
stackup_source = self._pedb.
|
|
1664
|
-
stackup_target = self._pedb.
|
|
1660
|
+
stackup_source = self._pedb.core.Cell.LayerCollection(edb_cell.GetLayout().GetLayerCollection())
|
|
1661
|
+
stackup_target = self._pedb.core.Cell.LayerCollection(self._pedb.layout.layer_collection)
|
|
1665
1662
|
|
|
1666
1663
|
if place_on_top:
|
|
1667
1664
|
cell_inst2.SetPlacementLayer(
|
|
1668
|
-
list(stackup_target.Layers(self._pedb.
|
|
1665
|
+
list(stackup_target.Layers(self._pedb.core.cell.layer_type_set.SignalLayerSet))[0]
|
|
1669
1666
|
)
|
|
1670
1667
|
else:
|
|
1671
1668
|
cell_inst2.SetPlacementLayer(
|
|
1672
|
-
list(stackup_target.Layers(self._pedb.
|
|
1669
|
+
list(stackup_target.Layers(self._pedb.core.cell.layer_type_set.SignalLayerSet))[-1]
|
|
1673
1670
|
)
|
|
1674
1671
|
cell_inst2.SetIs3DPlacement(True)
|
|
1675
|
-
sig_set = self._pedb.
|
|
1672
|
+
sig_set = self._pedb.core.cell.layer_type_set.SignalLayerSet
|
|
1676
1673
|
res = stackup_target.GetTopBottomStackupLayers(sig_set)
|
|
1677
1674
|
target_top_elevation = res[2]
|
|
1678
1675
|
target_bottom_elevation = res[4]
|
|
@@ -1755,8 +1752,8 @@ class Stackup(LayerCollection):
|
|
|
1755
1752
|
_angle = angle * math.pi / 180.0
|
|
1756
1753
|
rotation_axis_to = self._pedb.point_3d(math.cos(_angle), -1 * math.sin(_angle), 0.0)
|
|
1757
1754
|
|
|
1758
|
-
stackup_target = self._pedb.
|
|
1759
|
-
sig_set = self._pedb.
|
|
1755
|
+
stackup_target = self._pedb.core.cell._cell.LayerCollection(self._pedb.layout.layer_collection)
|
|
1756
|
+
sig_set = self._pedb.core.cell.layer_type_set.SignalLayerSet
|
|
1760
1757
|
res = stackup_target.GetTopBottomStackupLayers(sig_set)
|
|
1761
1758
|
target_top_elevation = res[2]
|
|
1762
1759
|
target_bottom_elevation = res[4]
|
|
@@ -1769,7 +1766,7 @@ class Stackup(LayerCollection):
|
|
|
1769
1766
|
h_stackup = self._edb_value(elevation)
|
|
1770
1767
|
location = self._pedb.point_3d(offset_x, offset_y, h_stackup)
|
|
1771
1768
|
|
|
1772
|
-
mcad_model = self._pedb.
|
|
1769
|
+
mcad_model = self._pedb.core.McadModel.Create3DComp(self._pedb.active_layout, a3dcomp_path)
|
|
1773
1770
|
if mcad_model.IsNull(): # pragma: no cover
|
|
1774
1771
|
logger.error("Failed to create MCAD model from a3dcomp")
|
|
1775
1772
|
return False
|
|
@@ -2002,7 +1999,7 @@ class Stackup(LayerCollection):
|
|
|
2002
1999
|
if not str(layer_info.Dielectric_Fill) == "nan":
|
|
2003
2000
|
layer.dielectric_fill = layer_info.Dielectric_Fill
|
|
2004
2001
|
|
|
2005
|
-
lc_new = self._pedb.
|
|
2002
|
+
lc_new = self._pedb.core.Cell.LayerCollection()
|
|
2006
2003
|
for name, _ in df.iterrows():
|
|
2007
2004
|
layer = self.layers[name]
|
|
2008
2005
|
lc_new.AddLayerBottom(layer._edb_layer)
|
|
@@ -2235,10 +2232,7 @@ class Stackup(LayerCollection):
|
|
|
2235
2232
|
return True
|
|
2236
2233
|
|
|
2237
2234
|
def _import_xml(self, file_path):
|
|
2238
|
-
"""
|
|
2239
|
-
You can use xml file to import layer stackup but using json file is recommended.
|
|
2240
|
-
see :class:`pyedb.dotnet.database.edb_data.simulation_configuration.SimulationConfiguration´ class to
|
|
2241
|
-
generate files`.
|
|
2235
|
+
"""Load stackup from a XML file.
|
|
2242
2236
|
|
|
2243
2237
|
Parameters
|
|
2244
2238
|
----------
|
|
@@ -2250,62 +2244,11 @@ class Stackup(LayerCollection):
|
|
|
2250
2244
|
bool
|
|
2251
2245
|
``True`` when successful, ``False`` when failed.
|
|
2252
2246
|
"""
|
|
2253
|
-
|
|
2254
|
-
|
|
2255
|
-
|
|
2256
|
-
|
|
2257
|
-
|
|
2258
|
-
stackup = root.find("Stackup")
|
|
2259
|
-
stackup_dict = {}
|
|
2260
|
-
if stackup.find("Materials"):
|
|
2261
|
-
mats = []
|
|
2262
|
-
for m in stackup.find("Materials").findall("Material"):
|
|
2263
|
-
temp = dict()
|
|
2264
|
-
for i in list(m):
|
|
2265
|
-
value = list(i)[0].text
|
|
2266
|
-
temp[i.tag] = value
|
|
2267
|
-
mat = {"name": m.attrib["Name"]}
|
|
2268
|
-
temp_dict = {
|
|
2269
|
-
"Permittivity": "permittivity",
|
|
2270
|
-
"Conductivity": "conductivity",
|
|
2271
|
-
"DielectricLossTangent": "dielectric_loss_tangent",
|
|
2272
|
-
}
|
|
2273
|
-
for i in temp_dict.keys():
|
|
2274
|
-
value = temp.get(i, None)
|
|
2275
|
-
if value:
|
|
2276
|
-
mat[temp_dict[i]] = value
|
|
2277
|
-
mats.append(mat)
|
|
2278
|
-
stackup_dict["materials"] = mats
|
|
2279
|
-
|
|
2280
|
-
stackup_section = stackup.find("Layers")
|
|
2281
|
-
if stackup_section:
|
|
2282
|
-
length_unit = stackup_section.attrib["LengthUnit"]
|
|
2283
|
-
layers = []
|
|
2284
|
-
for l in stackup.find("Layers").findall("Layer"):
|
|
2285
|
-
temp = l.attrib
|
|
2286
|
-
layer = dict()
|
|
2287
|
-
temp_dict = {
|
|
2288
|
-
"Name": "name",
|
|
2289
|
-
"Color": "color",
|
|
2290
|
-
"Material": "material",
|
|
2291
|
-
"Thickness": "thickness",
|
|
2292
|
-
"Type": "type",
|
|
2293
|
-
"FillMaterial": "fill_material",
|
|
2294
|
-
}
|
|
2295
|
-
for i in temp_dict.keys():
|
|
2296
|
-
value = temp.get(i, None)
|
|
2297
|
-
if value:
|
|
2298
|
-
if i == "Thickness":
|
|
2299
|
-
value = str(round(float(value), 6)) + length_unit
|
|
2300
|
-
value = "signal" if value == "conductor" else value
|
|
2301
|
-
if i == "Color":
|
|
2302
|
-
value = [int(x * 255) for x in list(colors.to_rgb(value))]
|
|
2303
|
-
layer[temp_dict[i]] = value
|
|
2304
|
-
layers.append(layer)
|
|
2305
|
-
stackup_dict["layers"] = layers
|
|
2306
|
-
cfg = {"stackup": stackup_dict}
|
|
2307
|
-
self._pedb.configuration.load(cfg)
|
|
2308
|
-
return self._pedb.configuration.run()
|
|
2247
|
+
|
|
2248
|
+
self._edb_object.ImportFromControlFile(file_path)
|
|
2249
|
+
flag = self._pedb.layout._edb_object.SetLayerCollection(self._edb_object)
|
|
2250
|
+
self.refresh_layer_collection()
|
|
2251
|
+
return flag
|
|
2309
2252
|
|
|
2310
2253
|
def _export_xml(self, file_path):
|
|
2311
2254
|
"""Export stackup information to an external XMLfile.
|