pyedb 0.55.0__py3-none-any.whl → 0.56.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.

@@ -23,7 +23,7 @@
23
23
  """
24
24
  This module contains these classes: `EdbLayout` and `Shape`.
25
25
  """
26
- from typing import Dict, Union
26
+ from typing import Dict, List, Union
27
27
 
28
28
  from ansys.edb.core.layout.layout import Layout as GrpcLayout
29
29
  import ansys.edb.core.primitive.bondwire
@@ -243,3 +243,76 @@ class Layout(GrpcLayout):
243
243
  prims = [i for i in prims if i.layer_name in layer_name] if layer_name is not None else prims
244
244
  prims = [i for i in prims if i.net_name in net_name] if net_name is not None else prims
245
245
  return prims
246
+
247
+ def find_padstack_instances(
248
+ self,
249
+ aedt_name: Union[str, List[str]] = None,
250
+ component_name: Union[str, List[str]] = None,
251
+ component_pin_name: Union[str, List[str]] = None,
252
+ net_name: Union[str, List[str]] = None,
253
+ instance_id: Union[int, List[int]] = None,
254
+ ) -> List:
255
+ """
256
+ Finds padstack instances matching the specified criteria.
257
+
258
+ This method filters the available padstack instances based on specified attributes such as
259
+ `aedt_name`, `component_name`, `component_pin_name`, `net_name`, or `instance_id`. Criteria
260
+ can be passed as individual values or as a list of values. If no padstack instances match
261
+ the criteria, an error is raised.
262
+
263
+ Parameters
264
+ ----------
265
+ aedt_name : Union[str, List[str]], optional
266
+ Name(s) of the AEDT padstack instance(s) to filter.
267
+ component_name : Union[str, List[str]], optional
268
+ Name(s) of the component(s) to filter padstack instances by.
269
+ component_pin_name : Union[str, List[str]], optional
270
+ Name(s) of the component pin(s) to filter padstack instances by.
271
+ net_name : Union[str, List[str]], optional
272
+ Name(s) of the net(s) to filter padstack instances by.
273
+ instance_id : Union[int, List[int]], optional
274
+ ID(s) of the padstack instance(s) to filter.
275
+
276
+ Returns
277
+ -------
278
+ List
279
+ A list of padstack instances matching the specified criteria.
280
+ """
281
+ padstacks = self.padstack_instances
282
+ instances_found = []
283
+ if instance_id is not None:
284
+ instance_ids = instance_id if isinstance(instance_id, list) else [instance_id]
285
+ if instance_id in instance_ids:
286
+ instances_found.append(padstacks[instance_id])
287
+
288
+ if aedt_name is not None:
289
+ name = aedt_name if isinstance(aedt_name, list) else [aedt_name]
290
+ [instances_found.append(i) for i in list(padstacks.values()) if i.aedt_name in name]
291
+
292
+ if component_name is not None:
293
+ value = component_name if isinstance(component_name, list) else [component_name]
294
+ for inst in padstacks.values():
295
+ if inst.component:
296
+ if inst.component.name in value:
297
+ instances_found.append(inst)
298
+
299
+ if net_name is not None:
300
+ value = net_name if isinstance(net_name, list) else [net_name]
301
+ for inst in padstacks.values():
302
+ if inst.net:
303
+ if inst.net.name in value:
304
+ instances_found.append(inst)
305
+
306
+ if component_pin_name is not None:
307
+ value = component_pin_name if isinstance(component_name, list) else [component_pin_name]
308
+ for inst in padstacks.values():
309
+ if inst.component:
310
+ if hasattr(inst, "name"):
311
+ if inst.name in value:
312
+ instances_found.append(inst)
313
+ if not instances_found: # pragma: no cover
314
+ raise ValueError(
315
+ f"Failed to find padstack instances with aedt_name={aedt_name}, component_name={component_name}, "
316
+ f"net_name={net_name}, component_pin_name={component_pin_name}"
317
+ )
318
+ return instances_found
@@ -354,7 +354,7 @@ class LayoutValidation:
354
354
  temp = []
355
355
  for k, v in inductors.items():
356
356
  model = v.component_property.model
357
- if not len(model.pin_pairs): # pragma: no cover
357
+ if not len(model.pin_pairs()): # pragma: no cover
358
358
  temp.append(k)
359
359
  if fix:
360
360
  v.rlc_values = [0, 1, 0]
@@ -373,7 +373,7 @@ class LayoutValidation:
373
373
  >>> # Automatically assign names to unnamed padstacks
374
374
  >>> edb.layout_validation.padstacks_no_name(fix=True)
375
375
  """
376
- pds = self._pedb.layout.padstack_instances
376
+ pds = list(self._pedb.layout.padstack_instances.values())
377
377
  counts = 0
378
378
  via_count = 1
379
379
  for obj in pds:
@@ -603,17 +603,20 @@ class Modeler(object):
603
603
  else:
604
604
  corner_style = GrpcPathCornerType.MITER
605
605
  _points = []
606
- for pt in points:
607
- _pt = []
608
- for coord in pt:
609
- coord = Value(coord, self._pedb.active_cell)
610
- _pt.append(coord)
611
- _points.append(_pt)
612
- points = _points
613
-
614
- width = Value(width, self._pedb.active_cell)
615
-
616
- polygon_data = GrpcPolygonData(points=[GrpcPointData(i) for i in points])
606
+ if isinstance(points, list):
607
+ for pt in points:
608
+ _pt = []
609
+ for coord in pt:
610
+ coord = Value(coord, self._pedb.active_cell)
611
+ _pt.append(coord)
612
+ _points.append(_pt)
613
+ points = _points
614
+ width = Value(width, self._pedb.active_cell)
615
+ polygon_data = GrpcPolygonData(points)
616
+ elif isinstance(points, GrpcPolygonData):
617
+ polygon_data = points
618
+ else:
619
+ raise TypeError("Points must be a list of points or a PolygonData object.")
617
620
  path = Path.create(
618
621
  layout=self._active_layout,
619
622
  layer=layer_name,
@@ -631,7 +634,7 @@ class Modeler(object):
631
634
 
632
635
  def create_trace(
633
636
  self,
634
- path_list: List[List[float]],
637
+ path_list: Union[List[List[float]], GrpcPolygonData],
635
638
  layer_name: str,
636
639
  width: float = 1,
637
640
  net_name: str = "",
@@ -1853,3 +1853,90 @@ class Padstacks(object):
1853
1853
  clusters[int(label)].append(padstack_ids[i])
1854
1854
 
1855
1855
  return dict(clusters)
1856
+
1857
+ def reduce_via_by_density(
1858
+ self, padstacks: List[int], cell_size_x: float = 1e-3, cell_size_y: float = 1e-3, delete: bool = False
1859
+ ) -> tuple[List[int], List[List[List[float]]]]:
1860
+ """
1861
+ Reduce the number of vias by density. Keep only one via which is closest to the center of the cell. The cells
1862
+ are automatically populated based on the input vias.
1863
+
1864
+ Parameters
1865
+ ----------
1866
+ padstacks: List[int]
1867
+ List of padstack ids to be reduced.
1868
+
1869
+ cell_size_x : float
1870
+ Width of each grid cell (default is 1e-3).
1871
+
1872
+ cell_size_y : float
1873
+ Height of each grid cell (default is 1e-3).
1874
+
1875
+ delete: bool
1876
+ If True, delete vias that are not kept (default is False).
1877
+
1878
+ Returns
1879
+ -------
1880
+ List[int]
1881
+ IDs of vias kept after reduction.
1882
+
1883
+ List[List[float]]
1884
+ coordinates for grid lines (for plotting).
1885
+
1886
+ """
1887
+ to_keep = set()
1888
+
1889
+ all_instances = self.instances
1890
+ positions = np.array([all_instances[_id].position for _id in padstacks])
1891
+
1892
+ x_coords, y_coords = positions[:, 0], positions[:, 1]
1893
+ x_min, x_max = np.min(x_coords), np.max(x_coords)
1894
+ y_min, y_max = np.min(y_coords), np.max(y_coords)
1895
+
1896
+ padstacks_array = np.array(padstacks)
1897
+ cell_map = {} # {(cell_x, cell_y): [(id1, [x1, y1]), (id2, [x2, y2), ...]}
1898
+ grid = []
1899
+
1900
+ for idx, pos in enumerate(positions):
1901
+ i = int((pos[0] - x_min) // cell_size_x)
1902
+ j = int((pos[1] - y_min) // cell_size_y)
1903
+ cell_key = (i, j)
1904
+ cell_map.setdefault(cell_key, []).append((padstacks_array[idx], pos))
1905
+
1906
+ for (i, j), items in cell_map.items():
1907
+ # cell center
1908
+ cell_x_min = x_min + i * cell_size_x
1909
+ cell_y_min = y_min + j * cell_size_y
1910
+ cell_x_mid = cell_x_min + 0.5 * cell_size_x
1911
+ cell_y_mid = cell_y_min + 0.5 * cell_size_y
1912
+
1913
+ grid.append(
1914
+ [
1915
+ [
1916
+ cell_x_min,
1917
+ cell_x_min + cell_size_x,
1918
+ cell_x_min + cell_size_x,
1919
+ cell_x_min,
1920
+ cell_x_min,
1921
+ ],
1922
+ [
1923
+ cell_y_min,
1924
+ cell_y_min,
1925
+ cell_y_min + cell_size_y,
1926
+ cell_y_min + cell_size_y,
1927
+ cell_y_min,
1928
+ ],
1929
+ ]
1930
+ )
1931
+
1932
+ # Find closest via to cell center
1933
+ distances = [np.linalg.norm(pos - [cell_x_mid, cell_y_mid]) for _, pos in items]
1934
+ closest_idx = np.argmin(distances)
1935
+ to_keep.add(items[closest_idx][0])
1936
+
1937
+ if delete:
1938
+ to_delete = set(padstacks) - to_keep
1939
+ for _id in to_delete:
1940
+ all_instances[_id].delete()
1941
+
1942
+ return list(to_keep), grid
@@ -271,6 +271,6 @@ class Polygon(GrpcPolygon, Primitive):
271
271
  return False
272
272
 
273
273
  def add_void(self, polygon):
274
- if isinstance(polygon, list):
274
+ if isinstance(polygon, list) or isinstance(polygon, GrpcPolygonData):
275
275
  polygon = self._pedb.modeler.create_polygon(points=polygon, layer_name=self.layer.name)
276
- return self._edb_object.add_void(polygon._edb_object)
276
+ return self._edb_object.add_void(polygon)
@@ -1,7 +1,6 @@
1
1
  from ansys.edb.core.database import ProductIdType as GrpcProductIdType
2
2
  from ansys.edb.core.utility.value import Value as GrpcValue
3
3
 
4
- import pyedb.siwave_core.cpa.simulation_setup_data_model
5
4
  from pyedb.siwave_core.cpa.simulation_setup_data_model import SIwaveCpaSetup, Vrm
6
5
  from pyedb.siwave_core.product_properties import SIwaveProperties
7
6
 
@@ -190,11 +189,13 @@ class ChannelSetup:
190
189
  Raises:
191
190
  ValueError: If the input is not a list.
192
191
  """
192
+ from pyedb.siwave_core.cpa.simulation_setup_data_model import Vrm
193
+
193
194
  if not isinstance(value, list):
194
195
  raise ValueError("vrm setter must have list as input.")
195
196
  vrm_str = ""
196
197
  for vrm in value:
197
- if isinstance(vrm, pyedb.siwave_core.cpa.simulation_setup_data_model.Vrm):
198
+ if isinstance(vrm, Vrm):
198
199
  if vrm_str:
199
200
  vrm_str += "*"
200
201
  vrm_str += vrm.name
@@ -2799,11 +2799,15 @@ class SourceExcitation:
2799
2799
  self,
2800
2800
  terminal: Union[PadstackInstanceTerminal, EdgeTerminal],
2801
2801
  ref_terminal: Union[PadstackInstanceTerminal, EdgeTerminal],
2802
+ magnitude: Union[int, float] = 1,
2803
+ phase: Union[int, float] = 0,
2802
2804
  ) -> bool:
2803
2805
  """Create a voltage source.
2804
2806
 
2805
2807
  Parameters
2806
2808
  ----------
2809
+ name : str, optional
2810
+ Voltage source name
2807
2811
  terminal : :class:`EdgeTerminal <pyedb.grpc.database.terminals.EdgeTerminal>`,
2808
2812
  :class:`PadstackInstanceTerminal <pyedb.grpc.database.terminals.PadstackInstanceTerminal>`,
2809
2813
  :class:`PointTerminal <pyedb.grpc.database.terminals.PointTerminal>`,
@@ -2814,6 +2818,10 @@ class SourceExcitation:
2814
2818
  :class:`PadstackInstanceTerminal <pyedb.grpc.database.terminals.PointTerminal>`,
2815
2819
  :class:`PinGroupTerminal <pyedb.grpc.database.terminals.PinGroupTerminal>`,
2816
2820
  Negative terminal of the source.
2821
+ magnitude : int, float, optional
2822
+ Magnitude of the source.
2823
+ phase : int, float, optional
2824
+ Phase of the source
2817
2825
 
2818
2826
  Returns
2819
2827
  -------
@@ -2832,7 +2840,8 @@ class SourceExcitation:
2832
2840
 
2833
2841
  ref_term = Terminal(self._pedb, ref_terminal)
2834
2842
  ref_term.boundary_type = "voltage_source"
2835
-
2843
+ term.magnitude = self._pedb.value(magnitude)
2844
+ term.phase = self._pedb.value(phase)
2836
2845
  term.ref_terminal = ref_terminal
2837
2846
  return term
2838
2847
 
@@ -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
+
22
23
  import ansys.edb.core.utility.value
23
24
  from ansys.edb.core.utility.value import Value as GrpcValue
24
25
 
pyedb/grpc/edb.py CHANGED
@@ -371,6 +371,10 @@ class Edb(EdbInit):
371
371
  """Ansys Edb Core module."""
372
372
  return ansys.edb.core
373
373
 
374
+ @property
375
+ def ansys_em_path(self):
376
+ return self.base_path
377
+
374
378
  def _check_remove_project_files(self, edbpath: str, remove_existing_aedt: bool) -> None:
375
379
  aedt_file = os.path.splitext(edbpath)[0] + ".aedt"
376
380
  files = [aedt_file, aedt_file + ".lock"]
@@ -2490,7 +2494,7 @@ class Edb(EdbInit):
2490
2494
  >>> # Export to HFSS project:
2491
2495
  >>> edb.export_hfss(r"C:/output", net_list=["SignalNet"])
2492
2496
  """
2493
- siwave_s = SiwaveSolve(self.edbpath)
2497
+ siwave_s = SiwaveSolve(self)
2494
2498
  return siwave_s.export_3d_cad("HFSS", path_to_output, net_list, num_cores, aedt_file_name, hidden=hidden)
2495
2499
 
2496
2500
  def export_q3d(
@@ -2526,7 +2530,7 @@ class Edb(EdbInit):
2526
2530
  >>> # Export to Q3D project:
2527
2531
  >>> edb.export_q3d(r"C:/output")
2528
2532
  """
2529
- siwave_s = SiwaveSolve(self.edbpath, aedt_installer_path=self.base_path)
2533
+ siwave_s = SiwaveSolve(self)
2530
2534
  return siwave_s.export_3d_cad(
2531
2535
  "Q3D",
2532
2536
  path_to_output,
@@ -2569,7 +2573,7 @@ class Edb(EdbInit):
2569
2573
  >>> # Export to Maxwell project:
2570
2574
  >>> edb.export_maxwell(r"C:/output")
2571
2575
  """
2572
- siwave_s = SiwaveSolve(self.edbpath, aedt_installer_path=self.base_path)
2576
+ siwave_s = SiwaveSolve(self)
2573
2577
  return siwave_s.export_3d_cad(
2574
2578
  "Maxwell",
2575
2579
  path_to_output,
@@ -2592,7 +2596,7 @@ class Edb(EdbInit):
2592
2596
  >>> # Solve with SIwave:
2593
2597
  >>> edb.solve_siwave()
2594
2598
  """
2595
- process = SiwaveSolve(self.edbpath)
2599
+ process = SiwaveSolve(self)
2596
2600
  try:
2597
2601
  self.close()
2598
2602
  except:
@@ -2643,7 +2647,7 @@ class Edb(EdbInit):
2643
2647
  list[str]
2644
2648
  Generated report files.
2645
2649
  """
2646
- process = SiwaveSolve(self.edbpath, aedt_version=self.edbversion)
2650
+ process = SiwaveSolve(self)
2647
2651
  try:
2648
2652
  self.close()
2649
2653
  except:
pyedb/grpc/rpc_session.py CHANGED
@@ -21,7 +21,7 @@
21
21
  # SOFTWARE.
22
22
 
23
23
  import os
24
- from random import randint
24
+ import secrets
25
25
  import sys
26
26
  import time
27
27
 
@@ -170,11 +170,12 @@ class RpcSession:
170
170
  @staticmethod
171
171
  def __get_random_free_port():
172
172
  """"""
173
- port = randint(49152, 65535)
173
+ secure_random = secrets.SystemRandom()
174
+ port = secure_random.randint(49152, 65535)
174
175
  while True:
175
176
  used_ports = [conn.laddr[1] for conn in psutil.net_connections()]
176
177
  if port in used_ports:
177
- port = randint(49152, 65535)
178
+ port = secure_random.randint(49152, 65535)
178
179
  else:
179
180
  break
180
181
  return port
@@ -1456,9 +1456,8 @@ class GeometryOperators(object):
1456
1456
  cross = GeometryOperators.v_cross(va, vb)
1457
1457
  if GeometryOperators.v_norm(cross) < tol:
1458
1458
  return math.pi
1459
- assert GeometryOperators.is_collinear(cross, vn), (
1460
- "vn must be the normal to the " "plane containing va and vb."
1461
- ) # pragma: no cover
1459
+ if not GeometryOperators.is_collinear(cross, vn):
1460
+ raise ValueError("vn must be the normal to the plane containing va and vb") # pragma: no cover
1462
1461
 
1463
1462
  vnn = GeometryOperators.normalize_vector(vn)
1464
1463
  if right_handed:
@@ -1672,10 +1671,11 @@ class GeometryOperators(object):
1672
1671
  float
1673
1672
  ``True`` if the segment intersect the polygon. ``False`` otherwise.
1674
1673
  """
1675
- assert len(a) == 2, "point must be a list in the form [x, y]"
1676
- assert len(b) == 2, "point must be a list in the form [x, y]"
1674
+ if len(a) != 2 or len(b) != 2:
1675
+ raise ValueError("Point must be a list in the form [x, y]")
1677
1676
  pl = len(polygon[0])
1678
- assert len(polygon[1]) == pl, "Polygon x and y lists must be the same length"
1677
+ if len(polygon[1]) != pl:
1678
+ raise ValueError("The two sublists in polygon must have the same length")
1679
1679
 
1680
1680
  a_in = GeometryOperators.is_point_in_polygon(a, polygon)
1681
1681
  b_in = GeometryOperators.is_point_in_polygon(b, polygon)
pyedb/siwave.py CHANGED
@@ -129,17 +129,15 @@ class Siwave(object): # pragma no cover
129
129
  self._main.AEDTVersion = self._main.oSiwave.GetVersion()[0:6]
130
130
  self._main.oSiwave.RestoreWindow()
131
131
  specified_version = self.current_version
132
- assert specified_version in self.version_keys, "Specified version {} is not known.".format(
133
- specified_version
134
- )
132
+ if specified_version not in self.version_keys:
133
+ raise ValueError("Specified version {} is not known.".format(specified_version))
135
134
  version_key = specified_version
136
135
  base_path = os.getenv(self._version_ids[specified_version])
137
136
  self._main.sDesktopinstallDirectory = base_path
138
137
  else:
139
138
  if specified_version:
140
- assert specified_version in self.version_keys, "Specified version {} is not known.".format(
141
- specified_version
142
- )
139
+ if specified_version not in self.version_keys:
140
+ raise ValueError("Specified version {} is not known.".format(specified_version))
143
141
  version_key = specified_version
144
142
  else:
145
143
  version_key = self.current_version
File without changes
File without changes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyedb
3
- Version: 0.55.0
3
+ Version: 0.56.0
4
4
  Summary: Higher-Level Pythonic Ansys Electronics Data Base
5
5
  Author-email: "ANSYS, Inc." <pyansys.core@ansys.com>
6
6
  Maintainer-email: PyEDB developers <simon.vandenbrouck@ansys.com>
@@ -1,7 +1,7 @@
1
- pyedb/__init__.py,sha256=2_p06xO5rFI8ukcVXLGNLkx9ug357T1iz5FbejCP8aU,1327
1
+ pyedb/__init__.py,sha256=oDyw4iwQKc-EmBOQttTARkZ_Gh37Sq52BVcQdWG4C2w,1327
2
2
  pyedb/edb_logger.py,sha256=ySZ_cZFJ09s1k3n3ft2q-MjaxH5pUwq18HNdiikTJNM,14497
3
3
  pyedb/exceptions.py,sha256=n94xluzUks6BA24vd_L6HkrvoP_H_l6__hQmqzdCyPo,111
4
- pyedb/siwave.py,sha256=7b2IyjaJ_HdqDgFVjwtuUKDm-NwRohwgl0S7Jn1Zv3I,17732
4
+ pyedb/siwave.py,sha256=4ttgMbOBnnCMtyNmU8SbOxkA7Cf0c_lV9cawEtq6V1k,17736
5
5
  pyedb/workflow.py,sha256=Y0ya4FUHwlSmoLP45zjdYLsSpyKduHUSpT9GGK9MGd8,814
6
6
  pyedb/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  pyedb/common/nets.py,sha256=a6w_U-dCrWA4l0GUC9mf1nio91BGGOKh3K6cqd4I5vM,17877
@@ -14,11 +14,11 @@ pyedb/configuration/cfg_data.py,sha256=4NYAMEQM4bvSz6dyqwuF889H_gR2jRq6gBaha7P_V
14
14
  pyedb/configuration/cfg_general.py,sha256=K8IZemdHYDj-nAI3Y0FA3KydDqTwsmDZXjcT3-mpYOc,2273
15
15
  pyedb/configuration/cfg_modeler.py,sha256=St71toCcS_4V5zHkHU7sZ285dIbDjs7JS-FH1Y9Z0Vs,6411
16
16
  pyedb/configuration/cfg_nets.py,sha256=ZBs6OWlrUPRM1KFLsPx7_3wXzewQ6czoOzZcySCuvMA,2405
17
- pyedb/configuration/cfg_operations.py,sha256=Oe6XTp5gNsRm27R55EssJMprmQQVIFUDvOwZ_mvmaro,1997
17
+ pyedb/configuration/cfg_operations.py,sha256=2PPa02p_l5Mk0B5dHvl9fiXtarr5SUZFuwxWVapVhGY,2016
18
18
  pyedb/configuration/cfg_package_definition.py,sha256=uO1ARgQCm7glVoaSs-sjVlEbI4rGJtfpNXT2vn1pMRQ,5460
19
19
  pyedb/configuration/cfg_padstacks.py,sha256=6LjPtjGQPVAJQ2GhWHvA9BxHc9H_rMnO_VswhveLC-s,18551
20
20
  pyedb/configuration/cfg_pin_groups.py,sha256=7w1xbzppRTP_RU6TEBAX3AUZvzvTFY4llqHIVIJpp2w,3818
21
- pyedb/configuration/cfg_ports_sources.py,sha256=beYFwklm4JAVDgmqV79a-gTloIj6-Ah0hNUVaQMvYM8,34393
21
+ pyedb/configuration/cfg_ports_sources.py,sha256=aBU2URwY1Wc0qei5r5mgStbtTicNMNuv-CQbx9sQDA4,34395
22
22
  pyedb/configuration/cfg_s_parameter_models.py,sha256=jssa4oEktpR0p5-QqkczaToQLowTB16Xj0d3C1Z-pAg,5356
23
23
  pyedb/configuration/cfg_setup.py,sha256=tLemymxB5XAPeBowD26v8w95VyMJBIhUVJjnk3ql6c0,9306
24
24
  pyedb/configuration/cfg_spice_models.py,sha256=Q_5j2-V6cepSFcnijot8iypTqzanLp7HOz-agmnwKns,2570
@@ -26,10 +26,10 @@ pyedb/configuration/cfg_stackup.py,sha256=EF7Ni_ejxaI-zru1j9mf80AWC_Q2MklxPYmIlf
26
26
  pyedb/configuration/configuration.py,sha256=Ert3D4n_IMaoJV0nHC4gkgSzatb6y6fBCnzIUXHOKlM,25910
27
27
  pyedb/dotnet/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
28
  pyedb/dotnet/clr_module.py,sha256=RNdHGF5lzx_f68xtdeIRgyrbeKj10JrI0kAp73H4EM4,5490
29
- pyedb/dotnet/edb.py,sha256=zyOAujYaD57E3DGa0E9l6z21txkR2MhAE3vW6WRdSIU,192855
30
- pyedb/dotnet/database/Variables.py,sha256=CX12X6u-2tbcgjYJU643TVjIJEGB58a2nM4f4wMVTR8,77687
29
+ pyedb/dotnet/edb.py,sha256=Jh58VStr5XDBHDY9IKvyqqWvmzS6-p8qGrbbaWYDans,192860
30
+ pyedb/dotnet/database/Variables.py,sha256=8_tcbmJNQQemeKdeeU_9gl5Fcg4Hul3NsdrQIwfE7dE,78020
31
31
  pyedb/dotnet/database/__init__.py,sha256=nIRLJ8VZLcMAp12zmGsnZ5x2BEEl7q_Kj_KAOXxVjpQ,52
32
- pyedb/dotnet/database/components.py,sha256=i9Wc779_VnQ3shu6P4PSaNLrzELjWBATYdWz6slFMyI,111969
32
+ pyedb/dotnet/database/components.py,sha256=IurIqI-O_L4YqsT6jvwYrT1erKbneKXPiBGI_LgIU7M,112344
33
33
  pyedb/dotnet/database/general.py,sha256=k2Bcr5VV-QUzEZlYorqYCX1ZchHBH7WqUvc8maMxId0,4716
34
34
  pyedb/dotnet/database/hfss.py,sha256=k9D6UVXXRTc37ciIWHFr6vXwtFyZgESUhSsfeBtZjaE,69066
35
35
  pyedb/dotnet/database/layout_obj_instance.py,sha256=se6eJ2kfQOAZfAwObCBdr0A7CCD3st4aiPPVJR9eQoA,1407
@@ -38,7 +38,7 @@ pyedb/dotnet/database/materials.py,sha256=ibzEq4fJM6b3Re9olHlllhhI5jdGQlpWa3h1aP
38
38
  pyedb/dotnet/database/modeler.py,sha256=r9ukkBRix33-3lZ46ZvAJgCCQdJatMNt3hgYLBXrnd8,57353
39
39
  pyedb/dotnet/database/net_class.py,sha256=NxRX8feIaJyf3NmRfSzZ08ItDbZOucOyAnTHZh-LkUI,11354
40
40
  pyedb/dotnet/database/nets.py,sha256=91wCr1cUXHELcwzBbi3Y5nw9XGVEHU97DJEhFITielQ,25538
41
- pyedb/dotnet/database/padstack.py,sha256=Eaux3ts_x1dEnG3yvlkJOv60i7rSsDc7K6zvfcDL0mw,76004
41
+ pyedb/dotnet/database/padstack.py,sha256=au42Grt7iF7P8HmhLibUtlo5RVwppkIMv9P_Km9NI8o,78981
42
42
  pyedb/dotnet/database/siwave.py,sha256=MDVHPqAzTTfmny13qg6cdJq1W64arNt0ppmlq45Lyug,64770
43
43
  pyedb/dotnet/database/stackup.py,sha256=R-SrRZTKIyuVsAwkDTsXGLSkYKCoXHukDhYDBuvPxIc,119826
44
44
  pyedb/dotnet/database/cell/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -112,33 +112,34 @@ pyedb/dotnet/database/utilities/siwave_cpa_simulation_setup.py,sha256=epqPFxqsmi
112
112
  pyedb/dotnet/database/utilities/siwave_simulation_setup.py,sha256=ShE-3AtgbINCiryPtnkm83YhpM8I9MirzsqaccgGUAs,14309
113
113
  pyedb/dotnet/database/utilities/value.py,sha256=AOafTWhjNF3TbM_r72vi0fxiv_8ldAhF-p9Xqh5L_eI,4821
114
114
  pyedb/extensions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
115
+ pyedb/extensions/create_cell_array.py,sha256=8RUP4x8DmWZrohdnk3D20tSO7K4G4Pi3qJzzSEBH8lc,14860
115
116
  pyedb/extensions/via_design_backend.py,sha256=hpofcNP2s-qw17_FaJeJESxRQoUrjqsdBtGbyJEPQdQ,24481
116
117
  pyedb/generic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
117
118
  pyedb/generic/constants.py,sha256=prWLZH0-SeBIVK6LHZ4SGZFQCofuym2TuQYfdqwhuSQ,28956
118
- pyedb/generic/data_handlers.py,sha256=rfqNe2tPCJRqhXZBCyWxRFu5SjQ92Cdzq4l0TDC4Pvw,6905
119
- pyedb/generic/design_types.py,sha256=jxb6_N-o1xDkjPDl9SIljQRs9-EZ_osXBjgq2S87G4I,11163
120
- pyedb/generic/filesystem.py,sha256=EqsLGwdhCgY3asomjoWZBBYWQiGhVOBlSzQlM6FCZhw,3674
121
- pyedb/generic/general_methods.py,sha256=qPxzziv9ZTo1wWbpWXgzfCyeuvx235N3RtjzOEdX5Pg,38062
119
+ pyedb/generic/data_handlers.py,sha256=ebQXCaelvQlQ_EVyY1FZh7K9Outd92U1X0mSq2yNco4,6876
120
+ pyedb/generic/design_types.py,sha256=DYVaVaJbdZvnFmOhz3QLXDjF4xzsh6X6IFnRwmBbP9Y,11769
121
+ pyedb/generic/filesystem.py,sha256=8ycVoybFTZM2jZQwMt8gVhgeJtI1sI3kDOmofhFzQao,3765
122
+ pyedb/generic/general_methods.py,sha256=uz7sEfwqjgAu-WgBY3lyA7SSTIvKG8O1NULfMWLPU7E,38064
122
123
  pyedb/generic/grpc_warnings.py,sha256=YYW5NhypV8AeeRmV7NZ7ej7Z1n-44z2FPGfQQue3D_Q,277
123
124
  pyedb/generic/plot.py,sha256=4zCA5lpk-FhPmWR7xi6yecc5lZtRpxJdd3B8FLGXmxE,4705
124
125
  pyedb/generic/process.py,sha256=UqogTaWKxFPiJjA0ba8qJVweQZqeA5o0tIHiSZxcZWM,9332
125
- pyedb/generic/settings.py,sha256=f7UwnMQT8tCDAHPWkEGg_AuM_v8nqHcENkzoo9PKOZI,11944
126
+ pyedb/generic/settings.py,sha256=nTVTEvZJOrMSXpIYmmHKKCiVUvECL_aiHcQ3BSX2HMw,12122
126
127
  pyedb/grpc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
127
- pyedb/grpc/edb.py,sha256=T-td2oTISN03ejsCmq38wW2EwArolGxgLLnyaN_xibU,150723
128
+ pyedb/grpc/edb.py,sha256=PLByHxrjUouuUEj8C_35GhfX38fbU0HM-nW1XChDklc,150655
128
129
  pyedb/grpc/edb_init.py,sha256=TqJcK_C81Hepkd8GvjGQ1V0joJqNM3TlBPl6zCyJrUs,15740
129
- pyedb/grpc/rpc_session.py,sha256=bIQja-xKLQbi-Gk-khBdNVCHEmWOvJiJ9i2FSVYMnPc,7094
130
+ pyedb/grpc/rpc_session.py,sha256=espO-OFMeGi4Gms4DZAhnef7LaSvzpLmRI0kQu3ul4c,7157
130
131
  pyedb/grpc/database/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
131
- pyedb/grpc/database/components.py,sha256=Tl1IQ7li4Lbwo1jN3UTiIU3vVThMbKgZL8QKL1JiN1Y,82183
132
+ pyedb/grpc/database/components.py,sha256=CSmftq0MW4zw7lBst27MX56ynCQ9lgv-X56takSPdrQ,82914
132
133
  pyedb/grpc/database/control_file.py,sha256=Hu_BOEtSt0KZWbaxvTjwnNhlT4Z6eeynFQnt7eb0swM,63758
133
134
  pyedb/grpc/database/definitions.py,sha256=W8-pHfEyNfhpoaA0KeXN_HuJ2Pk2KvybTFvITq6l6ag,4412
134
135
  pyedb/grpc/database/general.py,sha256=QBZlMO4Tzec00HcaLVQ8fDTLox-pHjOcH2wpWge2sZw,1633
135
136
  pyedb/grpc/database/hfss.py,sha256=GuYxGJjeAdcnQBf7CvRgQNbEbdnNGzwlRpOus9X7Jw0,42799
136
- pyedb/grpc/database/layout_validation.py,sha256=UeBgyjqu9ylEIpmozjPOQBG02VnQUd1FqGqxWvQMFL0,15684
137
- pyedb/grpc/database/modeler.py,sha256=w8DYdqXtyCFL8xgQZzRtlFZMoEnc8YZ4VXqVM32jxDo,54515
137
+ pyedb/grpc/database/layout_validation.py,sha256=QnqVLHDz1KOK41grN7g22rX1aoYePW3IYgKuC8BXxG4,15701
138
+ pyedb/grpc/database/modeler.py,sha256=gLEOh4ymTLqa_cFB4ywh6vmZVc2hcBgBSfVczcTsU20,54761
138
139
  pyedb/grpc/database/nets.py,sha256=ZRSOtEiiPodT-tBtDEe64zPRlY4ilwyDkJbC7iw_-_U,31130
139
- pyedb/grpc/database/padstacks.py,sha256=l7GR6OHlSMApXf2nOB_Ir2Xx6N3QWwekoq4V6kMJjgY,72999
140
+ pyedb/grpc/database/padstacks.py,sha256=gNmdaezOi8raAWbW6xbbZa265VCGjmMNEbXgSDH41oE,75976
140
141
  pyedb/grpc/database/siwave.py,sha256=L3uY95bTpqNV1n5s8McjdImUSXcJxG3DmkQoeoEAlcs,36847
141
- pyedb/grpc/database/source_excitations.py,sha256=oZbjCYi--WGp0IzI2AUPlXWMi1SCQW0WvCSk-1psrnI,128993
142
+ pyedb/grpc/database/source_excitations.py,sha256=Cq-uQ1Kqthb46HUfeyp8EtP7AAbi6ViwIiYg7tp7pVo,129378
142
143
  pyedb/grpc/database/stackup.py,sha256=GQ6XmxABoRZABJnvf2BxfrrMILYLeySseY_hrP6ZkKI,114598
143
144
  pyedb/grpc/database/definition/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
144
145
  pyedb/grpc/database/definition/component_def.py,sha256=2c5Xz98bdOAdOAX5kat2PY5N9-BiA1T6yw6TsWYRUmg,7579
@@ -166,7 +167,7 @@ pyedb/grpc/database/layers/layer.py,sha256=bPieGISKPGZ_jY8GOq9L6Ywoqcmv_Sq-cM3AS
166
167
  pyedb/grpc/database/layers/stackup_layer.py,sha256=Hwceiu-ZZhejgPUKASEOXL8O2HyntQHjy81Y30clpDU,27481
167
168
  pyedb/grpc/database/layout/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
168
169
  pyedb/grpc/database/layout/cell.py,sha256=5qMqEBvIruIE3Ru1JBYMkGlS31uOJShWm3J3OMd8HiQ,1379
169
- pyedb/grpc/database/layout/layout.py,sha256=V7IXNSHKl8FSLxSh9cwa08sHyW-hqmMwIsRa81SZew8,9561
170
+ pyedb/grpc/database/layout/layout.py,sha256=iQ4R5s3rTuLgUVfgFXKApzlnVHjJ_on-hqlreX6tn9A,12904
170
171
  pyedb/grpc/database/layout/voltage_regulator.py,sha256=RIqcZlxYTRDdq9CFe3BFiIqKWLnVcyF-kUraTAJ76MA,5183
171
172
  pyedb/grpc/database/net/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
172
173
  pyedb/grpc/database/net/differential_pair.py,sha256=68rP66PlS02e3vHs8t6vdk4Qq5TxjoVJXW_KIM3v7Xg,4716
@@ -180,7 +181,7 @@ pyedb/grpc/database/primitive/bondwire.py,sha256=NqST7jhIfooRFV8AubY_meh4ZCrO1lr
180
181
  pyedb/grpc/database/primitive/circle.py,sha256=u8AIRUkAb4GXyyBALL80lzgdQPHBrwH8dkmVKQ-ypWc,2527
181
182
  pyedb/grpc/database/primitive/padstack_instance.py,sha256=4rNi2zPenuxP9iyQhmCJ8g9ZJyMaEDFg-ASDza3K2R4,44753
182
183
  pyedb/grpc/database/primitive/path.py,sha256=VoDcV2Vn58QvnAJ-YXDPkNau7vFNc8BbDeX8LvMtXvY,12077
183
- pyedb/grpc/database/primitive/polygon.py,sha256=TOOFzswCrL6z1LYTfaijWvdBM2lV9fYbhovuUpI92_c,9532
184
+ pyedb/grpc/database/primitive/polygon.py,sha256=PPxIYwtAmX0vq1CS_xl374g6jIUEAzy365FPMzcrd2E,9560
184
185
  pyedb/grpc/database/primitive/primitive.py,sha256=W-4CcO9EjdQCRxfou2cqEsBWeVGhn5kvOvGmD6MAeLw,25096
185
186
  pyedb/grpc/database/primitive/rectangle.py,sha256=JW4N_31TNRDTaQphXd4CWYVnSV4l3wHwSkdJrO-uVI8,5340
186
187
  pyedb/grpc/database/simulation_setup/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -198,7 +199,7 @@ pyedb/grpc/database/simulation_setup/raptor_x_advanced_settings.py,sha256=mo2zHB
198
199
  pyedb/grpc/database/simulation_setup/raptor_x_general_settings.py,sha256=Sp-r6W87FjsWZYY1ugqTCGZ-KMXzCZ96FMl1fj3mdrU,1499
199
200
  pyedb/grpc/database/simulation_setup/raptor_x_simulation_settings.py,sha256=sgyYyVCm6kzURojfGvr8n7bBSsvKeljrD8mQKSGL_wo,2412
200
201
  pyedb/grpc/database/simulation_setup/raptor_x_simulation_setup.py,sha256=31ELFhO6TFB4-tg3rqTsfGkTsozEPq-4gCZucIO061c,4791
201
- pyedb/grpc/database/simulation_setup/siwave_cpa_simulation_setup.py,sha256=DdcAG0F60WxTAEMUnInvB8nwIuaYF0M-55aW4IrCUyQ,36006
202
+ pyedb/grpc/database/simulation_setup/siwave_cpa_simulation_setup.py,sha256=UTMYM9NCJQ2FTg8LGlziAGD3Ej-Kizb93CdGQcJ_0Mk,35974
202
203
  pyedb/grpc/database/simulation_setup/siwave_dcir_simulation_setup.py,sha256=--LrmRx54PkvgzKEc7HbmVtttir3uOAjJaehilasMaA,1524
203
204
  pyedb/grpc/database/simulation_setup/siwave_simulation_setup.py,sha256=8VLOKyM5h-PfzsbSMi6PFGDxlw-ikgJ4UYJ1IEYN99I,6902
204
205
  pyedb/grpc/database/simulation_setup/sweep_data.py,sha256=NfoUdUdgRFTw9SqR0UZhxaFA13MLpicDa7JXhgkBsug,1897
@@ -217,7 +218,7 @@ pyedb/grpc/database/utility/layout_statistics.py,sha256=NFoHEWzGbrkThosROCeZCjBS
217
218
  pyedb/grpc/database/utility/rlc.py,sha256=H0vzzxYPzr-6CTEDjlAs9fEY5emu4ugseKklfnHWO54,2185
218
219
  pyedb/grpc/database/utility/sources.py,sha256=sSU14NaMA9mDBUvwXIx7hNpwmGz4mmwtq92w1urusuk,10448
219
220
  pyedb/grpc/database/utility/sweep_data_distribution.py,sha256=ClGfo8MNH2LPWWZ-swsSpvc_yLxI-GVxLBkjn5-WS0U,3760
220
- pyedb/grpc/database/utility/value.py,sha256=puNoMiwTofZfxraibmRJoqbvu1RJpbnlMFfYi16yygE,4815
221
+ pyedb/grpc/database/utility/value.py,sha256=m7gRElH3qGywByTGmm-FgS6ebMGsca5wbiyrapRujTg,4816
221
222
  pyedb/grpc/database/utility/xml_control_file.py,sha256=Uyvb1YyzrdFOhAlXjk3Xo32hWngerhGpqBiJXAfDVWo,48231
222
223
  pyedb/ipc2581/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
223
224
  pyedb/ipc2581/history_record.py,sha256=s1GjcIgnZHlNCBOeEERBDX7xDuqhXmh2Ctt3ccFDWso,2739
@@ -290,11 +291,13 @@ pyedb/misc/siw_feature_config/xtalk_scan/net.py,sha256=iQBB2iIyvymLzJP4MTiyo_HTf
290
291
  pyedb/misc/siw_feature_config/xtalk_scan/pins.py,sha256=NBZLWFoDLGfBj-zGCcZGHzcuANrlfDu4XSbTeC5F8tU,2237
291
292
  pyedb/misc/siw_feature_config/xtalk_scan/scan_config.py,sha256=YmYI6WTQulL5Uf8WxeUI_sfpcVVPnFAjjygUNNhGMdo,3599
292
293
  pyedb/misc/siw_feature_config/xtalk_scan/td_xtalk_config.py,sha256=KHa-UqcXuabiVfT2CV-UvWl5Q2qGYHF2Ye9azcAlnXc,3966
293
- pyedb/modeler/geometry_operators.py,sha256=YhR-QE0dvIkbp4SsjWp309KDE1OZa6wUzr8a634MuJ4,74195
294
+ pyedb/modeler/geometry_operators.py,sha256=iEIi0BzhJEiRzV5yVgC2m9Pg_9Sc7ZqVktOpg8C3Tgo,74202
295
+ pyedb/siwave_core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
294
296
  pyedb/siwave_core/icepak.py,sha256=WnZ-t8mik7LDY06V8hZFV-TxRZJQWK7bu_8Ichx-oBs,5206
295
297
  pyedb/siwave_core/product_properties.py,sha256=m7HIMeYKJZqfzWbJklEOKqi3KJHwhj7W0SRbkRCng_c,5660
298
+ pyedb/siwave_core/cpa/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
296
299
  pyedb/siwave_core/cpa/simulation_setup_data_model.py,sha256=hQsDCvfSDGv3kdDdkTjJYlQqrP1mT4_-_sR0_iQFxi8,5577
297
- pyedb-0.55.0.dist-info/licenses/LICENSE,sha256=qQWivZ12ETN5l3QxvTARY-QI5eoRRlyHdwLlAj0Bg5I,1089
298
- pyedb-0.55.0.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
299
- pyedb-0.55.0.dist-info/METADATA,sha256=cGa25KnQbhTsEvfWn3h8jJSOK2AGmxIjRRvZGLNnYYM,8698
300
- pyedb-0.55.0.dist-info/RECORD,,
300
+ pyedb-0.56.0.dist-info/licenses/LICENSE,sha256=qQWivZ12ETN5l3QxvTARY-QI5eoRRlyHdwLlAj0Bg5I,1089
301
+ pyedb-0.56.0.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
302
+ pyedb-0.56.0.dist-info/METADATA,sha256=12eyDiggUZbey0FCyXT_3qBpOm-BD32gvxFVR5fe_1Y,8698
303
+ pyedb-0.56.0.dist-info/RECORD,,
File without changes