pyedb 0.40.0__py3-none-any.whl → 0.41.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 CHANGED
@@ -44,7 +44,7 @@ deprecation_warning()
44
44
  #
45
45
 
46
46
  pyedb_path = os.path.dirname(__file__)
47
- __version__ = "0.40.0"
47
+ __version__ = "0.41.0"
48
48
  version = __version__
49
49
 
50
50
  #
@@ -510,7 +510,7 @@ class EDBPadstack(object):
510
510
  list
511
511
  List of layers.
512
512
  """
513
- return self._padstack_def_data.GetLayerNames()
513
+ return list(self._padstack_def_data.GetLayerNames())
514
514
 
515
515
  @property
516
516
  def via_start_layer(self):
@@ -521,7 +521,7 @@ class EDBPadstack(object):
521
521
  str
522
522
  Name of the starting layer.
523
523
  """
524
- return list(self.via_layers)[0]
524
+ return self.via_layers[0]
525
525
 
526
526
  @property
527
527
  def via_stop_layer(self):
@@ -532,7 +532,7 @@ class EDBPadstack(object):
532
532
  str
533
533
  Name of the stopping layer.
534
534
  """
535
- return list(self.via_layers)[-1]
535
+ return self.via_layers[-1]
536
536
 
537
537
  @property
538
538
  def hole_params(self):
@@ -2141,3 +2141,80 @@ class EDBPadstackInstance(Primitive):
2141
2141
  max_limit=max_limit,
2142
2142
  component_only=component_only,
2143
2143
  )
2144
+
2145
+ def split(self):
2146
+ """Split padstack instance into multiple instances. The new instances only connect adjacent layers."""
2147
+ pdef_name = self.padstack_definition
2148
+ position = self.position
2149
+ net_name = self.net_name
2150
+ name = self.name
2151
+ stackup_layer_range = list(self._pedb.stackup.signal_layers.keys())
2152
+ start_idx = stackup_layer_range.index(self.start_layer)
2153
+ stop_idx = stackup_layer_range.index(self.stop_layer)
2154
+ for idx, (l1, l2) in enumerate(
2155
+ list(zip(stackup_layer_range[start_idx:stop_idx], stackup_layer_range[start_idx + 1 : stop_idx + 1]))
2156
+ ):
2157
+ self._pedb.padstacks.place(position, pdef_name, net_name, f"{name}_{idx}", fromlayer=l1, tolayer=l2)
2158
+ self.delete()
2159
+
2160
+ def convert_hole_to_conical_shape(self, angle=75):
2161
+ """Convert actual padstack instance to microvias 3D Objects with a given aspect ratio.
2162
+
2163
+ Parameters
2164
+ ----------
2165
+ angle : float, optional
2166
+ Angle of laser penetration in degrees. The angle defines the lowest hole diameter with this formula:
2167
+ HoleDiameter -2*tan(laser_angle* Hole depth). Hole depth is the height of the via (dielectric thickness).
2168
+ The default is ``75``.
2169
+ The lowest hole is ``0.75*HoleDepth/HoleDiam``.
2170
+
2171
+ Returns
2172
+ -------
2173
+ """
2174
+ pos = self.position
2175
+ stackup_layers = self._pedb.stackup.stackup_layers
2176
+ signal_layers = self._pedb.stackup.signal_layers
2177
+ layer_idx = list(signal_layers.keys()).index(self.start_layer)
2178
+
2179
+ _layer_idx = list(stackup_layers.keys()).index(self.start_layer)
2180
+ diel_layer_idx = list(stackup_layers.keys())[_layer_idx + 1]
2181
+ diel_thickness = stackup_layers[diel_layer_idx].thickness
2182
+
2183
+ rad_large = self.definition.hole_diameter / 2
2184
+ rad_small = rad_large - diel_thickness * 1 / math.tan(math.radians(angle))
2185
+
2186
+ if layer_idx + 1 < len(signal_layers) / 2: # upper half of stack
2187
+ rad_u = rad_large
2188
+ rad_l = rad_small
2189
+ else:
2190
+ rad_u = rad_small
2191
+ rad_l = rad_large
2192
+
2193
+ layout = self._pedb.active_layout
2194
+ cloned_circle = self._edb.cell.primitive.circle.create(
2195
+ layout,
2196
+ self.start_layer,
2197
+ self._edb_padstackinstance.GetNet(),
2198
+ self._pedb.edb_value(pos[0]),
2199
+ self._pedb.edb_value(pos[1]),
2200
+ self._pedb.edb_value(rad_u),
2201
+ )
2202
+ cloned_circle2 = self._edb.cell.primitive.circle.create(
2203
+ layout,
2204
+ self.stop_layer,
2205
+ self._edb_padstackinstance.GetNet(),
2206
+ self._pedb.edb_value(pos[0]),
2207
+ self._pedb.edb_value(pos[1]),
2208
+ self._pedb.edb_value(rad_l),
2209
+ )
2210
+ s3d = self._pedb._edb.Cell.Hierarchy.Structure3D.Create(
2211
+ layout, generate_unique_name("via3d_" + self.aedt_name.replace("via_", ""), n=3)
2212
+ )
2213
+ s3d.AddMember(cloned_circle.prim_obj)
2214
+ s3d.AddMember(cloned_circle2.prim_obj)
2215
+ s3d.SetMaterial(self.definition.material)
2216
+ s3d.SetMeshClosureProp(self._pedb._edb.Cell.Hierarchy.Structure3D.TClosure.EndsClosed)
2217
+
2218
+ hole_override_enabled = True
2219
+ hole_override_diam = 0
2220
+ self._edb_object.SetHoleOverride(hole_override_enabled, self._pedb.edb_value(hole_override_diam))
pyedb/dotnet/edb.py CHANGED
@@ -46,6 +46,7 @@ from pyedb.dotnet.database.Variables import decompose_variable_value
46
46
  from pyedb.dotnet.database.cell.layout import Layout
47
47
  from pyedb.dotnet.database.cell.terminal.terminal import Terminal
48
48
  from pyedb.dotnet.database.components import Components
49
+ import pyedb.dotnet.database.dotnet.database
49
50
  from pyedb.dotnet.database.dotnet.database import Database
50
51
  from pyedb.dotnet.database.edb_data.control_file import (
51
52
  ControlFile,
@@ -761,6 +762,23 @@ class Edb(Database):
761
762
  """Active cell."""
762
763
  return self._active_cell
763
764
 
765
+ @active_cell.setter
766
+ def active_cell(self, value):
767
+ if isinstance(value, str):
768
+ _cell = [cell for cell in self.circuit_cells if cell.GetName() == value]
769
+ if _cell:
770
+ self._active_cell = _cell[0]
771
+ self._init_objects()
772
+ self.logger.info(f"Cell {value} set as active")
773
+ else:
774
+ raise f"Design {value} not found in database."
775
+ elif isinstance(value, pyedb.dotnet.database.dotnet.database.CellClassDotNet):
776
+ self._active_cell = value
777
+ self._init_objects()
778
+ self.logger.info(f"Cell {value.GetName()} set as active")
779
+ else:
780
+ raise "No valid design."
781
+
764
782
  @property
765
783
  def core_components(self): # pragma: no cover
766
784
  """Edb Components methods and properties.
pyedb/grpc/edb.py CHANGED
@@ -39,6 +39,7 @@ import warnings
39
39
  from zipfile import ZipFile as zpf
40
40
 
41
41
  from ansys.edb.core.geometry.polygon_data import PolygonData as GrpcPolygonData
42
+ import ansys.edb.core.layout.cell
42
43
  from ansys.edb.core.simulation_setup.siwave_dcir_simulation_setup import (
43
44
  SIWaveDCIRSimulationSetup as GrpcSIWaveDCIRSimulationSetup,
44
45
  )
@@ -801,6 +802,23 @@ class Edb(EdbInit):
801
802
  """
802
803
  return self._active_cell
803
804
 
805
+ @active_cell.setter
806
+ def active_cell(self, value):
807
+ if isinstance(value, str):
808
+ _cell = [cell for cell in self.circuit_cells if cell.name == value]
809
+ if _cell:
810
+ self._active_cell = _cell[0]
811
+ self._init_objects()
812
+ self.logger.info(f"Design {value} set as active")
813
+ else:
814
+ raise f"Design {value} not found in database."
815
+ elif isinstance(value, ansys.edb.core.layout.cell.Cell):
816
+ self._active_cell = value
817
+ self._init_objects()
818
+ self.logger.info(f"Design {value.name} set as active")
819
+ else:
820
+ raise "No valid design."
821
+
804
822
  @property
805
823
  def components(self):
806
824
  """Edb Components methods and properties.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pyedb
3
- Version: 0.40.0
3
+ Version: 0.41.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,4 +1,4 @@
1
- pyedb/__init__.py,sha256=BRJLpM2hZO7sdF_z0jRQy40961hhF4M8Y3h7yreF4h0,1525
1
+ pyedb/__init__.py,sha256=Qc2173U4sGWExvgzT-kHd0vwCC5_K3U7xmq5j8dcwU4,1525
2
2
  pyedb/edb_logger.py,sha256=7KXPvAMCKzlzJ5zioiNO5A3zkqbpCHhWHB4aXKfgu5Y,14959
3
3
  pyedb/exceptions.py,sha256=n94xluzUks6BA24vd_L6HkrvoP_H_l6__hQmqzdCyPo,111
4
4
  pyedb/siwave.py,sha256=Mgg5ZGzOUOtNdlePHcnrgN3rletQ7jrqRi3WfxF58uU,17727
@@ -26,7 +26,7 @@ pyedb/configuration/cfg_stackup.py,sha256=nrjbjArkV4edkgbmpfm4FBWizM7qlN6DKTiNFR
26
26
  pyedb/configuration/configuration.py,sha256=c6SViP7I0Ex7cH12ueDow0DPVKXHIvkg3RZX9qSgnFA,16751
27
27
  pyedb/dotnet/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
28
  pyedb/dotnet/clr_module.py,sha256=EabqZgZgBZOhJD9_V8Ll8sEKgBFj9xe9zARNYIvYM_s,5304
29
- pyedb/dotnet/edb.py,sha256=KPaIxHyhsx0lWNU27tcuuLnG8SuybsPHgQHxqT82-oQ,186767
29
+ pyedb/dotnet/edb.py,sha256=UjdXZQhrhctGAzVKPl7VW-2U1eKThXFI6fN9wh9C1JE,187519
30
30
  pyedb/dotnet/database/Variables.py,sha256=CX12X6u-2tbcgjYJU643TVjIJEGB58a2nM4f4wMVTR8,77687
31
31
  pyedb/dotnet/database/__init__.py,sha256=nIRLJ8VZLcMAp12zmGsnZ5x2BEEl7q_Kj_KAOXxVjpQ,52
32
32
  pyedb/dotnet/database/components.py,sha256=9HldXwn2xV7RPD-C9u_zpHTd6b5SKZkDled-NKrbweo,109471
@@ -81,7 +81,7 @@ pyedb/dotnet/database/edb_data/edbvalue.py,sha256=Vj_11HXsQUNavizKp5FicORm6cjhXR
81
81
  pyedb/dotnet/database/edb_data/hfss_extent_info.py,sha256=Ydzle6moatP89kQdjnzyNabsCW0KXE4WYqDv7sFyLb8,13040
82
82
  pyedb/dotnet/database/edb_data/layer_data.py,sha256=4Z_eaHSfGfwQBKETEmGSwMvwGzvirtwYw4G4TwonNiA,34314
83
83
  pyedb/dotnet/database/edb_data/nets_data.py,sha256=siq2w5CT5D5PeK9tC_vaGM54UOyqnYkcP4kUts459es,10009
84
- pyedb/dotnet/database/edb_data/padstacks_data.py,sha256=18VZaivT9tT7-KCXbXsEZbokRRi_CQCTqCQFcAj-FtU,78343
84
+ pyedb/dotnet/database/edb_data/padstacks_data.py,sha256=cdnJg5uiZIXRyTAMZ0-YVvkH-bOF6HTFvoDJKYx1MPs,81692
85
85
  pyedb/dotnet/database/edb_data/ports.py,sha256=ycOETLruRl4wwL372Jftm_rFg2vfluyb_Rv39C5OSKA,7061
86
86
  pyedb/dotnet/database/edb_data/primitives_data.py,sha256=gBW7GiaPxDWBUj1wgOIiNHJ3QKM2ZDU0SJh0JWUlFHc,16826
87
87
  pyedb/dotnet/database/edb_data/raptor_x_simulation_setup_data.py,sha256=f_09VvuDHeaIuTivSi2OiAEv8aJ52vBasuBoSS9sCQE,20953
@@ -119,7 +119,7 @@ pyedb/generic/general_methods.py,sha256=Lg4k53Ny9LraiU6AQX5WwBiPFqtvGaZ3Ik7LcWil
119
119
  pyedb/generic/plot.py,sha256=4zCA5lpk-FhPmWR7xi6yecc5lZtRpxJdd3B8FLGXmxE,4705
120
120
  pyedb/generic/process.py,sha256=i0poMbEnFFAsnNOPWN-myMnUaG7hMClKi9kGPMFyvCM,11148
121
121
  pyedb/generic/settings.py,sha256=QTX5OVZ8sVPIy_QaSxRODUWvoXkYkVpzh3l6pQPseKQ,9220
122
- pyedb/grpc/edb.py,sha256=eZ88P7SXtnhyPHyJt4-SbpsbbJ7Cx35SrFPHKicP-ac,159519
122
+ pyedb/grpc/edb.py,sha256=pi9uENpgwm5fs1mVBD4iRkSEwujc4VPWKiFYD768UZI,160232
123
123
  pyedb/grpc/edb_init.py,sha256=7uhG2VjHvS9N8CU-zDyW8jh_dWe8MWkfyU2k4-B8sX8,14513
124
124
  pyedb/grpc/rpc_session.py,sha256=UvxDSXuJFvemFJbQQtbI6nhYI9KBN366fw-jjoWysmE,6979
125
125
  pyedb/grpc/database/__init__.py,sha256=nIRLJ8VZLcMAp12zmGsnZ5x2BEEl7q_Kj_KAOXxVjpQ,52
@@ -282,7 +282,7 @@ pyedb/misc/siw_feature_config/xtalk_scan/scan_config.py,sha256=YmYI6WTQulL5Uf8Wx
282
282
  pyedb/misc/siw_feature_config/xtalk_scan/td_xtalk_config.py,sha256=KHa-UqcXuabiVfT2CV-UvWl5Q2qGYHF2Ye9azcAlnXc,3966
283
283
  pyedb/modeler/geometry_operators.py,sha256=YhR-QE0dvIkbp4SsjWp309KDE1OZa6wUzr8a634MuJ4,74195
284
284
  pyedb/siwave_core/icepak.py,sha256=WnZ-t8mik7LDY06V8hZFV-TxRZJQWK7bu_8Ichx-oBs,5206
285
- pyedb-0.40.0.dist-info/LICENSE,sha256=qQWivZ12ETN5l3QxvTARY-QI5eoRRlyHdwLlAj0Bg5I,1089
286
- pyedb-0.40.0.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
287
- pyedb-0.40.0.dist-info/METADATA,sha256=7P1bJJjTnkTqyvvDU_LtCdNtEIzUrkcAQ8rdZZN3374,8617
288
- pyedb-0.40.0.dist-info/RECORD,,
285
+ pyedb-0.41.0.dist-info/LICENSE,sha256=qQWivZ12ETN5l3QxvTARY-QI5eoRRlyHdwLlAj0Bg5I,1089
286
+ pyedb-0.41.0.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
287
+ pyedb-0.41.0.dist-info/METADATA,sha256=IswncXth5JHws3hiVReYJSdvSlC6gyHpyQ2g9KzQn4s,8617
288
+ pyedb-0.41.0.dist-info/RECORD,,
File without changes