pyedb 0.53.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 (84) hide show
  1. pyedb/__init__.py +1 -1
  2. pyedb/configuration/cfg_ports_sources.py +6 -8
  3. pyedb/configuration/configuration.py +2 -1
  4. pyedb/dotnet/database/cell/hierarchy/model.py +1 -1
  5. pyedb/dotnet/database/cell/layout.py +1 -1
  6. pyedb/dotnet/database/cell/layout_obj.py +3 -3
  7. pyedb/dotnet/database/cell/primitive/path.py +1 -1
  8. pyedb/dotnet/database/cell/primitive/primitive.py +8 -8
  9. pyedb/dotnet/database/cell/terminal/pingroup_terminal.py +1 -1
  10. pyedb/dotnet/database/cell/terminal/point_terminal.py +1 -1
  11. pyedb/dotnet/database/cell/terminal/terminal.py +24 -26
  12. pyedb/dotnet/database/components.py +24 -24
  13. pyedb/dotnet/database/definition/component_def.py +3 -3
  14. pyedb/dotnet/database/definition/component_model.py +1 -1
  15. pyedb/dotnet/database/definition/package_def.py +1 -1
  16. pyedb/dotnet/database/dotnet/database.py +43 -38
  17. pyedb/dotnet/database/dotnet/primitive.py +16 -16
  18. pyedb/dotnet/database/edb_data/hfss_extent_info.py +6 -6
  19. pyedb/dotnet/database/edb_data/layer_data.py +14 -14
  20. pyedb/dotnet/database/edb_data/padstacks_data.py +12 -12
  21. pyedb/dotnet/database/edb_data/primitives_data.py +3 -3
  22. pyedb/dotnet/database/edb_data/sources.py +6 -6
  23. pyedb/dotnet/database/edb_data/variables.py +7 -3
  24. pyedb/dotnet/database/geometry/point_data.py +1 -1
  25. pyedb/dotnet/database/geometry/polygon_data.py +2 -4
  26. pyedb/dotnet/database/hfss.py +7 -7
  27. pyedb/dotnet/database/materials.py +2 -2
  28. pyedb/dotnet/database/modeler.py +8 -11
  29. pyedb/dotnet/database/nets.py +1 -1
  30. pyedb/dotnet/database/padstack.py +72 -1
  31. pyedb/dotnet/database/sim_setup_data/data/settings.py +24 -0
  32. pyedb/dotnet/database/sim_setup_data/io/siwave.py +26 -1
  33. pyedb/dotnet/database/siwave.py +5 -5
  34. pyedb/dotnet/database/stackup.py +74 -77
  35. pyedb/dotnet/database/utilities/heatsink.py +4 -4
  36. pyedb/dotnet/database/utilities/obj_base.py +1 -1
  37. pyedb/dotnet/database/utilities/value.py +116 -0
  38. pyedb/dotnet/edb.py +43 -43
  39. pyedb/generic/design_types.py +12 -3
  40. pyedb/grpc/__init__.py +0 -0
  41. pyedb/grpc/database/components.py +53 -17
  42. pyedb/grpc/database/definition/materials.py +23 -30
  43. pyedb/grpc/database/definition/package_def.py +15 -15
  44. pyedb/grpc/database/definition/padstack_def.py +51 -51
  45. pyedb/grpc/database/geometry/arc_data.py +7 -5
  46. pyedb/grpc/database/geometry/point_3d_data.py +8 -7
  47. pyedb/grpc/database/geometry/polygon_data.py +3 -2
  48. pyedb/grpc/database/hierarchy/component.py +43 -38
  49. pyedb/grpc/database/hierarchy/pin_pair_model.py +15 -14
  50. pyedb/grpc/database/hierarchy/pingroup.py +9 -9
  51. pyedb/grpc/database/layers/stackup_layer.py +45 -44
  52. pyedb/grpc/database/layout/layout.py +9 -8
  53. pyedb/grpc/database/layout/voltage_regulator.py +7 -7
  54. pyedb/grpc/database/layout_validation.py +13 -12
  55. pyedb/grpc/database/modeler.py +51 -54
  56. pyedb/grpc/database/nets.py +42 -31
  57. pyedb/grpc/database/padstacks.py +270 -175
  58. pyedb/grpc/database/ports/ports.py +5 -6
  59. pyedb/grpc/database/primitive/bondwire.py +8 -7
  60. pyedb/grpc/database/primitive/circle.py +4 -4
  61. pyedb/grpc/database/primitive/padstack_instance.py +18 -18
  62. pyedb/grpc/database/primitive/path.py +7 -7
  63. pyedb/grpc/database/primitive/polygon.py +3 -3
  64. pyedb/grpc/database/primitive/primitive.py +13 -17
  65. pyedb/grpc/database/primitive/rectangle.py +13 -13
  66. pyedb/grpc/database/simulation_setup/hfss_general_settings.py +1 -1
  67. pyedb/grpc/database/simulation_setup/hfss_simulation_setup.py +10 -0
  68. pyedb/grpc/database/simulation_setup/siwave_simulation_setup.py +17 -1
  69. pyedb/grpc/database/siwave.py +30 -24
  70. pyedb/grpc/database/source_excitations.py +333 -229
  71. pyedb/grpc/database/stackup.py +164 -147
  72. pyedb/grpc/database/terminal/bundle_terminal.py +17 -7
  73. pyedb/grpc/database/terminal/edge_terminal.py +10 -0
  74. pyedb/grpc/database/terminal/padstack_instance_terminal.py +15 -4
  75. pyedb/grpc/database/terminal/pingroup_terminal.py +11 -10
  76. pyedb/grpc/database/terminal/point_terminal.py +4 -3
  77. pyedb/grpc/database/terminal/terminal.py +9 -9
  78. pyedb/grpc/database/utility/value.py +109 -0
  79. pyedb/grpc/edb.py +59 -38
  80. pyedb/grpc/edb_init.py +0 -7
  81. {pyedb-0.53.0.dist-info → pyedb-0.54.0.dist-info}/METADATA +3 -3
  82. {pyedb-0.53.0.dist-info → pyedb-0.54.0.dist-info}/RECORD +84 -81
  83. {pyedb-0.53.0.dist-info → pyedb-0.54.0.dist-info}/WHEEL +0 -0
  84. {pyedb-0.53.0.dist-info → pyedb-0.54.0.dist-info}/licenses/LICENSE +0 -0
@@ -70,7 +70,7 @@ class EdbHfss(object):
70
70
  -------
71
71
  Ansys.Ansoft.Edb
72
72
  """
73
- return self._pedb.edb_api
73
+ return self._pedb.core
74
74
 
75
75
  @property
76
76
  def _active_layout(self):
@@ -884,7 +884,7 @@ class EdbHfss(object):
884
884
  ]
885
885
  )
886
886
  pos_edge_term.SetProductSolverOption(
887
- self._pedb.edb_api.ProductId.Designer,
887
+ self._pedb.core.ProductId.Designer,
888
888
  "HFSS",
889
889
  prop,
890
890
  )
@@ -939,7 +939,7 @@ class EdbHfss(object):
939
939
  if not layer_alignment == "Upper":
940
940
  layer_alignment = "Lower"
941
941
  pos_edge_term.SetProductSolverOption(
942
- self._pedb.edb_api.ProductId.Designer,
942
+ self._pedb.core.ProductId.Designer,
943
943
  "HFSS",
944
944
  "HFSS('HFSS Type'='Gap(coax)', Orientation='Horizontal', 'Layer Alignment'='{}')".format(layer_alignment),
945
945
  )
@@ -1144,7 +1144,7 @@ class EdbHfss(object):
1144
1144
  ref_prim = [
1145
1145
  prim
1146
1146
  for prim in reference_net.primitives
1147
- if prim.polygon_data.edb_api.PointInPolygon(mid_pt_data)
1147
+ if prim.polygon_data.core.PointInPolygon(mid_pt_data)
1148
1148
  ]
1149
1149
  if ref_prim:
1150
1150
  self._logger.info("Reference primitive found")
@@ -1401,7 +1401,7 @@ class EdbHfss(object):
1401
1401
  l_inst = layout.GetLayoutInstance()
1402
1402
 
1403
1403
  for inst in simulation_setup.components: # pragma: no cover
1404
- comp = self._pedb.edb_api.cell.hierarchy.component.FindByName(layout, inst)
1404
+ comp = self._pedb.core.cell.hierarchy.component.FindByName(layout, inst)
1405
1405
  if comp.IsNull():
1406
1406
  continue
1407
1407
 
@@ -1473,7 +1473,7 @@ class EdbHfss(object):
1473
1473
  cmp_names = []
1474
1474
  ii = 0
1475
1475
  for cc in cmp_names:
1476
- cmp = self._pedb.edb_api.cell.hierarchy.component.FindByName(self._active_layout, cc)
1476
+ cmp = self._pedb.core.cell.hierarchy.component.FindByName(self._active_layout, cc)
1477
1477
  if cmp.IsNull():
1478
1478
  self._logger.warning("RenamePorts: could not find component {0}".format(cc))
1479
1479
  continue
@@ -1512,7 +1512,7 @@ class EdbHfss(object):
1512
1512
  "'PEC Launch Width'='0mm')"
1513
1513
  )
1514
1514
  for tt in terms:
1515
- tt.SetProductSolverOption(self._edb.edb_api.ProductId.Designer, "HFSS", option)
1515
+ tt.SetProductSolverOption(self._edb.core.ProductId.Designer, "HFSS", option)
1516
1516
  return True
1517
1517
 
1518
1518
  def _get_terminals_bbox(self, comp, l_inst, terminals_only):
@@ -111,7 +111,7 @@ class Material(object):
111
111
 
112
112
  def __init__(self, edb: Edb, material_def):
113
113
  self.__edb: Edb = edb
114
- self.__edb_definition = edb.edb_api.definition
114
+ self.__edb_definition = edb.core.definition
115
115
  self.__name: str = material_def.GetName()
116
116
  self.__material_def = material_def
117
117
  self.__dc_model = material_def.GetDielectricMaterialModel()
@@ -553,7 +553,7 @@ class Materials(object):
553
553
 
554
554
  def __init__(self, edb: Edb):
555
555
  self.__edb = edb
556
- self.__edb_definition = edb.edb_api.definition
556
+ self.__edb_definition = edb.core.definition
557
557
  self.__syslib = os.path.join(self.__edb.base_path, "syslib")
558
558
 
559
559
  def __contains__(self, item):
@@ -70,7 +70,7 @@ class Modeler(object):
70
70
 
71
71
  @property
72
72
  def _edb(self):
73
- return self._pedb.edb_api
73
+ return self._pedb.core
74
74
 
75
75
  def _get_edb_value(self, value):
76
76
  return self._pedb.edb_value(value)
@@ -289,20 +289,20 @@ class Modeler(object):
289
289
  if not isinstance(point, list) and len(point) == 2:
290
290
  self._logger.error("Provided point must be a list of two values")
291
291
  return False
292
- pt = self._edb.geometry.point_data(point[0], point[1])
293
- if isinstance(nets, str):
294
- nets = [nets]
295
- elif nets and not isinstance(nets, list) and len(nets) == len([net for net in nets if isinstance(net, str)]):
292
+ pt = self._edb.geometry.point_data(self._pedb.edb_value(point[0]), self._pedb.edb_value(point[1]))
293
+ if nets:
294
+ if isinstance(nets, str):
295
+ nets = [nets]
296
296
  _nets = []
297
297
  for net in nets:
298
298
  if net not in self._pedb.nets:
299
- self._logger.error(
299
+ self._logger.warning(
300
300
  f"Net {net} used to find primitive from layer point and net not found, skipping it."
301
301
  )
302
302
  else:
303
303
  _nets.append(self._pedb.nets[net].net_obj)
304
304
  if _nets:
305
- nets = _nets
305
+ nets = convert_py_list_to_net_list(_nets)
306
306
  _obj_instances = list(self._pedb.layout_instance.FindLayoutObjInstance(pt, None, nets).Items)
307
307
  returned_obj = []
308
308
  if layer:
@@ -324,10 +324,7 @@ class Modeler(object):
324
324
  else:
325
325
  for obj in _obj_instances:
326
326
  obj_id = obj.GetLayoutObj().GetId()
327
- [
328
- returned_obj.append(Primitive(p, self._pedb))
329
- for p in [obj for obj in self.primitives if obj.id == obj_id]
330
- ]
327
+ [returned_obj.append(p) for p in [obj for obj in self.primitives if obj.id == obj_id]]
331
328
  return returned_obj
332
329
 
333
330
  def get_polygon_bounding_box(self, polygon):
@@ -77,7 +77,7 @@ class EdbNets(CommonNets):
77
77
  @property
78
78
  def _edb(self):
79
79
  """ """
80
- return self._pedb.edb_api
80
+ return self._pedb.core
81
81
 
82
82
  @property
83
83
  def _active_layout(self):
@@ -23,7 +23,9 @@
23
23
  """
24
24
  This module contains the `EdbPadstacks` class.
25
25
  """
26
+ from collections import defaultdict
26
27
  import math
28
+ from typing import Dict, List
27
29
  import warnings
28
30
 
29
31
  import numpy as np
@@ -82,7 +84,7 @@ class EdbPadstacks(object):
82
84
  @property
83
85
  def _edb(self):
84
86
  """ """
85
- return self._pedb.edb_api
87
+ return self._pedb.core
86
88
 
87
89
  def _get_edb_value(self, value):
88
90
  return self._pedb.edb_value(value)
@@ -1871,3 +1873,72 @@ class EdbPadstacks(object):
1871
1873
  all_instances[item].delete()
1872
1874
 
1873
1875
  return True
1876
+
1877
+ @staticmethod
1878
+ def dbscan(
1879
+ padstack: Dict[int, List[float]], max_distance: float = 1e-3, min_samples: int = 5
1880
+ ) -> Dict[int, List[str]]:
1881
+ """
1882
+ density based spatial clustering for padstack instances
1883
+
1884
+ Parameters
1885
+ ----------
1886
+ padstack : dict.
1887
+ padstack id: [x, y]
1888
+
1889
+ max_distance: float
1890
+ maximum distance between two points to be included in one cluster
1891
+
1892
+ min_samples: int
1893
+ minimum number of points that a cluster must have
1894
+
1895
+ Returns
1896
+ -------
1897
+ dict
1898
+ clusters {cluster label: [padstack ids]} <
1899
+ """
1900
+
1901
+ padstack_ids = list(padstack.keys())
1902
+ xy_array = np.array([padstack[pid] for pid in padstack_ids])
1903
+ n = len(padstack_ids)
1904
+
1905
+ labels = -1 * np.ones(n, dtype=int)
1906
+ visited = np.zeros(n, dtype=bool)
1907
+ cluster_id = 0
1908
+
1909
+ def region_query(point_idx):
1910
+ distances = np.linalg.norm(xy_array - xy_array[point_idx], axis=1)
1911
+ return np.where(distances <= max_distance)[0]
1912
+
1913
+ def expand_cluster(point_idx, neighbors):
1914
+ nonlocal cluster_id
1915
+ labels[point_idx] = cluster_id
1916
+ i = 0
1917
+ while i < len(neighbors):
1918
+ neighbor_idx = neighbors[i]
1919
+ if not visited[neighbor_idx]:
1920
+ visited[neighbor_idx] = True
1921
+ neighbor_neighbors = region_query(neighbor_idx)
1922
+ if len(neighbor_neighbors) >= min_samples:
1923
+ neighbors = np.concatenate((neighbors, neighbor_neighbors))
1924
+ if labels[neighbor_idx] == -1:
1925
+ labels[neighbor_idx] = cluster_id
1926
+ i += 1
1927
+
1928
+ for point_idx in range(n):
1929
+ if visited[point_idx]:
1930
+ continue
1931
+ visited[point_idx] = True
1932
+ neighbors = region_query(point_idx)
1933
+ if len(neighbors) < min_samples:
1934
+ labels[point_idx] = -1
1935
+ else:
1936
+ expand_cluster(point_idx, neighbors)
1937
+ cluster_id += 1
1938
+
1939
+ # group point IDs by label
1940
+ clusters = defaultdict(list)
1941
+ for i, label in enumerate(labels):
1942
+ clusters[int(label)].append(padstack_ids[i])
1943
+
1944
+ return dict(clusters)
@@ -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
@@ -70,7 +70,7 @@ class EdbSiwave(object):
70
70
  @property
71
71
  def _edb(self):
72
72
  """EDB."""
73
- return self._pedb.edb_api
73
+ return self._pedb.core
74
74
 
75
75
  def _get_edb_value(self, value):
76
76
  """Get the Edb value."""
@@ -1492,7 +1492,7 @@ class EdbSiwave(object):
1492
1492
  """Icepak default setting. If "True", only resistor are active in Icepak simulation.
1493
1493
  The power dissipation of the resistors are calculated from DC results.
1494
1494
  """
1495
- siwave_id = self._pedb.edb_api.ProductId.SIWave
1495
+ siwave_id = self._pedb.core.ProductId.SIWave
1496
1496
  cell = self._pedb.active_cell._active_cell
1497
1497
  _, value = cell.GetProductProperty(siwave_id, 422, "")
1498
1498
  return bool(value)
@@ -1524,20 +1524,20 @@ class EdbSiwave(object):
1524
1524
  @icepak_use_minimal_comp_defaults.setter
1525
1525
  def icepak_use_minimal_comp_defaults(self, value):
1526
1526
  value = "True" if bool(value) else ""
1527
- siwave_id = self._pedb.edb_api.ProductId.SIWave
1527
+ siwave_id = self._pedb.core.ProductId.SIWave
1528
1528
  cell = self._pedb.active_cell._active_cell
1529
1529
  cell.SetProductProperty(siwave_id, 422, value)
1530
1530
 
1531
1531
  @property
1532
1532
  def icepak_component_file(self):
1533
1533
  """Icepak component file path."""
1534
- siwave_id = self._pedb.edb_api.ProductId.SIWave
1534
+ siwave_id = self._pedb.core.ProductId.SIWave
1535
1535
  cell = self._pedb.active_cell._active_cell
1536
1536
  _, value = cell.GetProductProperty(siwave_id, 420, "")
1537
1537
  return value
1538
1538
 
1539
1539
  @icepak_component_file.setter
1540
1540
  def icepak_component_file(self, value):
1541
- siwave_id = self._pedb.edb_api.ProductId.SIWave
1541
+ siwave_id = self._pedb.core.ProductId.SIWave
1542
1542
  cell = self._pedb.active_cell._active_cell
1543
1543
  cell.SetProductProperty(siwave_id, 420, value)