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.

Files changed (97) hide show
  1. pyedb/__init__.py +1 -1
  2. pyedb/configuration/cfg_common.py +12 -15
  3. pyedb/configuration/cfg_data.py +2 -2
  4. pyedb/configuration/cfg_modeler.py +163 -234
  5. pyedb/configuration/cfg_ports_sources.py +6 -8
  6. pyedb/configuration/cfg_stackup.py +62 -249
  7. pyedb/configuration/configuration.py +272 -170
  8. pyedb/dotnet/database/cell/hierarchy/model.py +1 -1
  9. pyedb/dotnet/database/cell/layout.py +1 -1
  10. pyedb/dotnet/database/cell/layout_obj.py +3 -3
  11. pyedb/dotnet/database/cell/primitive/path.py +1 -1
  12. pyedb/dotnet/database/cell/primitive/primitive.py +8 -8
  13. pyedb/dotnet/database/cell/terminal/pingroup_terminal.py +1 -1
  14. pyedb/dotnet/database/cell/terminal/point_terminal.py +1 -1
  15. pyedb/dotnet/database/cell/terminal/terminal.py +24 -26
  16. pyedb/dotnet/database/components.py +33 -27
  17. pyedb/dotnet/database/definition/component_def.py +3 -3
  18. pyedb/dotnet/database/definition/component_model.py +1 -1
  19. pyedb/dotnet/database/definition/package_def.py +1 -1
  20. pyedb/dotnet/database/dotnet/database.py +47 -38
  21. pyedb/dotnet/database/dotnet/primitive.py +16 -16
  22. pyedb/dotnet/database/edb_data/hfss_extent_info.py +6 -6
  23. pyedb/dotnet/database/edb_data/layer_data.py +17 -15
  24. pyedb/dotnet/database/edb_data/padstacks_data.py +12 -12
  25. pyedb/dotnet/database/edb_data/primitives_data.py +3 -3
  26. pyedb/dotnet/database/edb_data/sources.py +6 -6
  27. pyedb/dotnet/database/edb_data/variables.py +7 -3
  28. pyedb/dotnet/database/geometry/point_data.py +1 -1
  29. pyedb/dotnet/database/geometry/polygon_data.py +2 -4
  30. pyedb/dotnet/database/hfss.py +7 -7
  31. pyedb/dotnet/database/materials.py +2 -2
  32. pyedb/dotnet/database/modeler.py +8 -11
  33. pyedb/dotnet/database/nets.py +1 -1
  34. pyedb/dotnet/database/padstack.py +72 -1
  35. pyedb/dotnet/database/sim_setup_data/data/settings.py +24 -0
  36. pyedb/dotnet/database/sim_setup_data/io/siwave.py +26 -1
  37. pyedb/dotnet/database/siwave.py +19 -5
  38. pyedb/dotnet/database/stackup.py +80 -137
  39. pyedb/dotnet/database/utilities/heatsink.py +4 -4
  40. pyedb/dotnet/database/utilities/obj_base.py +1 -1
  41. pyedb/dotnet/database/utilities/simulation_setup.py +1 -1
  42. pyedb/dotnet/database/utilities/siwave_cpa_simulation_setup.py +894 -0
  43. pyedb/dotnet/database/utilities/siwave_simulation_setup.py +15 -0
  44. pyedb/dotnet/database/utilities/value.py +116 -0
  45. pyedb/dotnet/edb.py +58 -45
  46. pyedb/generic/design_types.py +39 -1
  47. pyedb/generic/grpc_warnings.py +5 -0
  48. pyedb/grpc/__init__.py +0 -0
  49. pyedb/grpc/database/components.py +155 -98
  50. pyedb/grpc/database/control_file.py +240 -193
  51. pyedb/grpc/database/definition/materials.py +23 -30
  52. pyedb/grpc/database/definition/package_def.py +15 -15
  53. pyedb/grpc/database/definition/padstack_def.py +51 -51
  54. pyedb/grpc/database/definitions.py +7 -5
  55. pyedb/grpc/database/geometry/arc_data.py +7 -5
  56. pyedb/grpc/database/geometry/point_3d_data.py +8 -7
  57. pyedb/grpc/database/geometry/polygon_data.py +3 -2
  58. pyedb/grpc/database/hierarchy/component.py +43 -38
  59. pyedb/grpc/database/hierarchy/pin_pair_model.py +15 -14
  60. pyedb/grpc/database/hierarchy/pingroup.py +9 -9
  61. pyedb/grpc/database/layers/stackup_layer.py +45 -44
  62. pyedb/grpc/database/layout/layout.py +9 -8
  63. pyedb/grpc/database/layout/voltage_regulator.py +7 -7
  64. pyedb/grpc/database/layout_validation.py +13 -12
  65. pyedb/grpc/database/modeler.py +156 -131
  66. pyedb/grpc/database/nets.py +42 -31
  67. pyedb/grpc/database/padstacks.py +270 -175
  68. pyedb/grpc/database/ports/ports.py +5 -6
  69. pyedb/grpc/database/primitive/bondwire.py +8 -7
  70. pyedb/grpc/database/primitive/circle.py +4 -4
  71. pyedb/grpc/database/primitive/padstack_instance.py +18 -18
  72. pyedb/grpc/database/primitive/path.py +7 -7
  73. pyedb/grpc/database/primitive/polygon.py +3 -3
  74. pyedb/grpc/database/primitive/primitive.py +13 -17
  75. pyedb/grpc/database/primitive/rectangle.py +13 -13
  76. pyedb/grpc/database/simulation_setup/hfss_general_settings.py +1 -1
  77. pyedb/grpc/database/simulation_setup/hfss_simulation_setup.py +10 -0
  78. pyedb/grpc/database/simulation_setup/siwave_cpa_simulation_setup.py +961 -0
  79. pyedb/grpc/database/simulation_setup/siwave_simulation_setup.py +17 -1
  80. pyedb/grpc/database/siwave.py +44 -24
  81. pyedb/grpc/database/source_excitations.py +333 -229
  82. pyedb/grpc/database/stackup.py +164 -147
  83. pyedb/grpc/database/terminal/bundle_terminal.py +17 -7
  84. pyedb/grpc/database/terminal/edge_terminal.py +10 -0
  85. pyedb/grpc/database/terminal/padstack_instance_terminal.py +15 -4
  86. pyedb/grpc/database/terminal/pingroup_terminal.py +11 -10
  87. pyedb/grpc/database/terminal/point_terminal.py +4 -3
  88. pyedb/grpc/database/terminal/terminal.py +9 -9
  89. pyedb/grpc/database/utility/value.py +109 -0
  90. pyedb/grpc/edb.py +129 -45
  91. pyedb/grpc/edb_init.py +0 -7
  92. pyedb/siwave_core/cpa/simulation_setup_data_model.py +132 -0
  93. pyedb/siwave_core/product_properties.py +198 -0
  94. {pyedb-0.52.0.dist-info → pyedb-0.54.0.dist-info}/METADATA +15 -13
  95. {pyedb-0.52.0.dist-info → pyedb-0.54.0.dist-info}/RECORD +97 -89
  96. {pyedb-0.52.0.dist-info → pyedb-0.54.0.dist-info}/WHEEL +1 -1
  97. {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
- "automatic_mesh": True,
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
@@ -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.edb_api
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.edb_api.ProductId.SIWave
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.edb_api.ProductId.SIWave
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.edb_api.ProductId.SIWave
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.edb_api.ProductId.SIWave
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)
@@ -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.edb_api.cell._cell.LayerCollection(edb_object)
71
+ self._edb_object = self._pedb.core.cell._cell.LayerCollection(edb_object)
72
72
  else:
73
- self._edb_object = self._pedb.edb_api.cell._cell.LayerCollection()
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.edb_api.cell.layer_type_set.StackupLayerSet,
77
- "signal_ayer_et": self._pedb.edb_api.cell.layer_type_set.SignalLayerSet,
78
- "non_stackup_layer_set": self._pedb.edb_api.cell.layer_type_set.NonStackupLayerSet,
79
- "all_layer_et": self._pedb.edb_api.cell.layer_type_set.AllLayerSet,
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.edb_api.cell._cell.LayerCollectionMode.Laminate,
83
- "overlapping": self._pedb.edb_api.cell._cell.LayerCollectionMode.Overlapping,
84
- "multizone": self._pedb.edb_api.cell._cell.LayerCollectionMode.MultiZone,
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.edb_api.cell._cell.LayerCollection(self._pedb.layout.layer_collection)
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.edb_api.cell._cell.LayerCollection() # empty layer collection
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.edb_api.cell.layer_type_set.AllLayerSet))
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.edb_api.cell._cell.Layer.FindByName(self._edb_object, name)
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.edb_api.cell.layer_type
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.edb_api.Cell.LayerCollectionMode
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.edb_api.cell.layer_type_set.AllLayerSet))
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.edb_api.cell.layer_type.SignalLayer
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.edb_api.cell.layer_type.DielectricLayer
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.edb_api.cell.layer_type_set.NonStackupLayerSet)))
691
+ for i in list(list(lc_readonly.Layers(self._pedb.core.cell.layer_type_set.NonStackupLayerSet)))
693
692
  ]
694
- _lc = self._pedb.edb_api.cell._cell.LayerCollection()
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.edb_api.cell.layer_type.SignalLayer
729
+ _layer_type = self._pedb.core.cell.layer_type.SignalLayer
731
730
  else:
732
- _layer_type = self._pedb.edb_api.cell.layer_type.DielectricLayer
731
+ _layer_type = self._pedb.core.cell.layer_type.DielectricLayer
733
732
 
734
- result = self._pedb.edb_api.cell._cell.StackupLayer(
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.edb_api.cell.layer_type.ConductingLayer
745
+ _layer_type = self._pedb.core.cell.layer_type.ConductingLayer
747
746
  elif layer_type == "airlines": # pragma: no cover
748
- _layer_type = self._pedb.edb_api.cell.layer_type.AirlinesLayer
747
+ _layer_type = self._pedb.core.cell.layer_type.AirlinesLayer
749
748
  elif layer_type == "error": # pragma: no cover
750
- _layer_type = self._pedb.edb_api.cell.layer_type.ErrorsLayer
749
+ _layer_type = self._pedb.core.cell.layer_type.ErrorsLayer
751
750
  elif layer_type == "symbol": # pragma: no cover
752
- _layer_type = self._pedb.edb_api.cell.layer_type.SymbolLayer
751
+ _layer_type = self._pedb.core.cell.layer_type.SymbolLayer
753
752
  elif layer_type == "measure": # pragma: no cover
754
- _layer_type = self._pedb.edb_api.cell.layer_type.MeasureLayer
753
+ _layer_type = self._pedb.core.cell.layer_type.MeasureLayer
755
754
  elif layer_type == "assembly": # pragma: no cover
756
- _layer_type = self._pedb.edb_api.cell.layer_type.AssemblyLayer
755
+ _layer_type = self._pedb.core.cell.layer_type.AssemblyLayer
757
756
  elif layer_type == "silkscreen": # pragma: no cover
758
- _layer_type = self._pedb.edb_api.cell.layer_type.SilkscreenLayer
757
+ _layer_type = self._pedb.core.cell.layer_type.SilkscreenLayer
759
758
  elif layer_type == "soldermask": # pragma: no cover
760
- _layer_type = self._pedb.edb_api.cell.layer_type.SolderMaskLayer
759
+ _layer_type = self._pedb.core.cell.layer_type.SolderMaskLayer
761
760
  elif layer_type == "solderpaste": # pragma: no cover
762
- _layer_type = self._pedb.edb_api.cell.layer_type.SolderPasteLayer
761
+ _layer_type = self._pedb.core.cell.layer_type.SolderPasteLayer
763
762
  elif layer_type == "glue": # pragma: no cover
764
- _layer_type = self._pedb.edb_api.cell.layer_type.GlueLayer
763
+ _layer_type = self._pedb.core.cell.layer_type.GlueLayer
765
764
  elif layer_type == "wirebond": # pragma: no cover
766
- _layer_type = self._pedb.edb_api.cell.layer_type.WirebondLayer
765
+ _layer_type = self._pedb.core.cell.layer_type.WirebondLayer
767
766
  elif layer_type == "user": # pragma: no cover
768
- _layer_type = self._pedb.edb_api.cell.layer_type.UserLayer
767
+ _layer_type = self._pedb.core.cell.layer_type.UserLayer
769
768
  elif layer_type == "siwavehfsssolverregions": # pragma: no cover
770
- _layer_type = self._pedb.edb_api.cell.layer_type.SIwaveHFSSSolverRegions
769
+ _layer_type = self._pedb.core.cell.layer_type.SIwaveHFSSSolverRegions
771
770
  elif layer_type == "outline": # pragma: no cover
772
- _layer_type = self._pedb.edb_api.cell.layer_type.OutlineLayer
771
+ _layer_type = self._pedb.core.cell.layer_type.OutlineLayer
773
772
  elif layer_type == "postprocessing": # pragma: no cover
774
- _layer_type = self._pedb.edb_api.cell.layer_type.PostprocessingLayer
773
+ _layer_type = self._pedb.core.cell.layer_type.PostprocessingLayer
775
774
  else: # pragma: no cover
776
- _layer_type = self._pedb.edb_api.cell.layer_type.UndefinedLayerType
775
+ _layer_type = self._pedb.core.cell.layer_type.UndefinedLayerType
777
776
 
778
- result = self._pedb.edb_api.cell.layer(layer_name, _layer_type)
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.edb_api.Cell.LayerCollection()
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.edb_api.cell.layer_type_set.SignalLayerSet
1124
+ input_layers = self._pedb.core.cell.layer_type_set.SignalLayerSet
1126
1125
  else:
1127
- input_layers = self._pedb.edb_api.cell.layer_type_set.StackupLayerSet
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.edb_api.Cell.LayerCollection()
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.edb_api.cell.layer_type_set.StackupLayerSet):
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.edb_api.cell.layer_type_set.AllLayerSet):
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.edb_api.Cell.TopBottomAssociation.TopAssociated
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.edb_api.Cell.TopBottomAssociation.TopAssociated)
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.edb_api.cell.layer_type_set.StackupLayerSet)
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.edb_api.cell.layer_type_set.AllLayerSet)
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.edb_api.cell.layer_type_set.AllLayerSet)
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.edb_api.cell.layer_type_set.AllLayerSet)
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.edb_api.cell.layer_type_set.SignalLayerSet))
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.edb_api.cell.hierarchy.cell_instance.Create(
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.edb_api.cell.layer_type_set.SignalLayerSet))[0]
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.edb_api.cell.layer_type_set.SignalLayerSet))[-1]
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.edb_api.cell.hierarchy.cell_instance.Create(
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.edb_api.Cell.LayerCollection(edb_cell.GetLayout().GetLayerCollection())
1513
- stackup_source = self._pedb.edb_api.Cell.LayerCollection(self._pedb.layout.layer_collection)
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.edb_api.cell.layer_type_set.SignalLayerSet))[0]
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.edb_api.cell.layer_type_set.SignalLayerSet))[-1]
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.edb_api.cell.layer_type_set.SignalLayerSet
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.edb_api.cell.hierarchy.cell_instance.Create(
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.edb_api.Cell.LayerCollection(edb_cell.GetLayout().GetLayerCollection())
1664
- stackup_target = self._pedb.edb_api.Cell.LayerCollection(self._pedb.layout.layer_collection)
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.edb_api.cell.layer_type_set.SignalLayerSet))[0]
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.edb_api.cell.layer_type_set.SignalLayerSet))[-1]
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.edb_api.cell.layer_type_set.SignalLayerSet
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.edb_api.cell._cell.LayerCollection(self._pedb.layout.layer_collection)
1759
- sig_set = self._pedb.edb_api.cell.layer_type_set.SignalLayerSet
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.edb_api.McadModel.Create3DComp(self._pedb.active_layout, a3dcomp_path)
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.edb_api.Cell.LayerCollection()
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
- """Read external xml file and convert into json file.
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
- if not colors:
2254
- self._pedb.logger.error("Matplotlib is needed. Please, install it first.")
2255
- return False
2256
- tree = ET.parse(file_path)
2257
- root = tree.getroot()
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.