pyedb 0.23.0__py3-none-any.whl → 0.24.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 (33) hide show
  1. pyedb/__init__.py +1 -1
  2. pyedb/dotnet/edb.py +35 -33
  3. pyedb/dotnet/edb_core/cell/hierarchy/hierarchy_obj.py +11 -0
  4. pyedb/dotnet/edb_core/cell/layout.py +30 -23
  5. pyedb/dotnet/edb_core/cell/layout_obj.py +0 -9
  6. pyedb/dotnet/edb_core/cell/primitive/__init__.py +3 -0
  7. pyedb/dotnet/edb_core/cell/{primitive.py → primitive/bondwire.py} +1 -146
  8. pyedb/dotnet/edb_core/cell/primitive/path.py +351 -0
  9. pyedb/dotnet/edb_core/cell/primitive/primitive.py +895 -0
  10. pyedb/dotnet/edb_core/cell/terminal/bundle_terminal.py +0 -4
  11. pyedb/dotnet/edb_core/cell/terminal/edge_terminal.py +1 -1
  12. pyedb/dotnet/edb_core/components.py +12 -5
  13. pyedb/dotnet/edb_core/dotnet/database.py +1 -23
  14. pyedb/dotnet/edb_core/dotnet/primitive.py +3 -139
  15. pyedb/dotnet/edb_core/edb_data/nets_data.py +1 -11
  16. pyedb/dotnet/edb_core/edb_data/padstacks_data.py +10 -24
  17. pyedb/dotnet/edb_core/edb_data/primitives_data.py +56 -868
  18. pyedb/dotnet/edb_core/geometry/polygon_data.py +43 -0
  19. pyedb/dotnet/edb_core/hfss.py +26 -22
  20. pyedb/dotnet/edb_core/layout_validation.py +3 -3
  21. pyedb/dotnet/edb_core/modeler.py +64 -81
  22. pyedb/dotnet/edb_core/nets.py +5 -4
  23. pyedb/dotnet/edb_core/padstack.py +12 -13
  24. pyedb/dotnet/edb_core/siwave.py +1 -1
  25. pyedb/dotnet/edb_core/stackup.py +3 -3
  26. pyedb/ipc2581/ecad/cad_data/layer_feature.py +1 -1
  27. pyedb/ipc2581/ecad/cad_data/polygon.py +2 -2
  28. pyedb/ipc2581/ecad/cad_data/step.py +2 -2
  29. pyedb/siwave.py +99 -0
  30. {pyedb-0.23.0.dist-info → pyedb-0.24.0.dist-info}/METADATA +2 -2
  31. {pyedb-0.23.0.dist-info → pyedb-0.24.0.dist-info}/RECORD +33 -30
  32. {pyedb-0.23.0.dist-info → pyedb-0.24.0.dist-info}/LICENSE +0 -0
  33. {pyedb-0.23.0.dist-info → pyedb-0.24.0.dist-info}/WHEEL +0 -0
@@ -43,10 +43,6 @@ class BundleTerminal(Terminal):
43
43
  """Get terminals belonging to this excitation."""
44
44
  return [EdgeTerminal(self._pedb, i) for i in list(self._edb_object.GetTerminals())]
45
45
 
46
- @property
47
- def name(self):
48
- return self.terminals[0].name
49
-
50
46
  def decouple(self):
51
47
  """Ungroup a bundle of terminals."""
52
48
  return self._edb_object.Ungroup()
@@ -47,4 +47,4 @@ class EdgeTerminal(Terminal):
47
47
  temp.extend([i._edb_object for i in port])
48
48
  edb_list = convert_py_list_to_net_list(temp, self._edb.cell.terminal.Terminal)
49
49
  _edb_bundle_terminal = self._edb.cell.terminal.BundleTerminal.Create(edb_list)
50
- return self._pedb.ports[self.name]
50
+ return self._pedb.ports[_edb_bundle_terminal.GetName()]
@@ -1134,7 +1134,7 @@ class Components(object):
1134
1134
  self.create_port_on_pins(
1135
1135
  component,
1136
1136
  [EDBPadstackInstance(pin, self._pedb).name],
1137
- [EDBPadstackInstance(ref_pin[0], self._pedb).id],
1137
+ [EDBPadstackInstance(ref_pin[0]._edb_object, self._pedb).id],
1138
1138
  )
1139
1139
  else:
1140
1140
  self._logger.error("Skipping port creation no reference pin found.")
@@ -1606,6 +1606,7 @@ class Components(object):
1606
1606
  >>> edbapp.components.create(pins, "A1New")
1607
1607
 
1608
1608
  """
1609
+ pins = [p._edb_object for p in pins]
1609
1610
  if not component_name:
1610
1611
  component_name = generate_unique_name("Comp_")
1611
1612
  if component_part_name:
@@ -1619,7 +1620,7 @@ class Components(object):
1619
1620
  )
1620
1621
 
1621
1622
  if isinstance(pins[0], EDBPadstackInstance):
1622
- pins = [i._edb_padstackinstance for i in pins]
1623
+ pins = [i._edb_object for i in pins]
1623
1624
  hosting_component_location = pins[0].GetComponent().GetTransform()
1624
1625
  for pin in pins:
1625
1626
  pin.SetIsLayoutPin(True)
@@ -1746,7 +1747,7 @@ class Components(object):
1746
1747
  """
1747
1748
  if not modelname:
1748
1749
  modelname = get_filename_without_extension(modelpath)
1749
- edbComponent = self.get_component_by_name(componentname)
1750
+ edbComponent = self.get_component_by_name(componentname)._edb_object
1750
1751
  if str(edbComponent.EDBHandle) == "0":
1751
1752
  return False
1752
1753
  edbRlcComponentProperty = edbComponent.GetComponentProperty().Clone()
@@ -1958,7 +1959,7 @@ class Components(object):
1958
1959
  >>> edbapp.components.delete("A1")
1959
1960
 
1960
1961
  """
1961
- edb_cmp = self.get_component_by_name(component_name)
1962
+ edb_cmp = self.get_component_by_name(component_name)._edb_object
1962
1963
  if edb_cmp is not None:
1963
1964
  edb_cmp.Delete()
1964
1965
  if edb_cmp in list(self.instances.keys()):
@@ -1989,6 +1990,7 @@ class Components(object):
1989
1990
  """
1990
1991
  edb_cmp = self.get_component_by_name(component_name)
1991
1992
  if edb_cmp is not None:
1993
+ edb_cmp = edb_cmp._edb_object
1992
1994
  rlc_property = edb_cmp.GetComponentProperty().Clone()
1993
1995
  pin_pair_model = rlc_property.GetModel().Clone()
1994
1996
  pprlc = pin_pair_model.GetPinPairRlc(list(pin_pair_model.PinPairs)[0])
@@ -2149,7 +2151,7 @@ class Components(object):
2149
2151
  self.instances[componentname].is_enabled = False
2150
2152
  self._logger.info("No parameters passed, component %s is disabled.", componentname)
2151
2153
  return True
2152
- edb_component = self.get_component_by_name(componentname)
2154
+ edb_component = self.get_component_by_name(componentname)._edb_object
2153
2155
  edb_rlc_component_property = self._edb.cell.hierarchy._hierarchy.RLCComponentProperty()
2154
2156
  component_pins = self.get_pin_from_component(componentname)
2155
2157
  pin_number = len(component_pins)
@@ -2322,6 +2324,7 @@ class Components(object):
2322
2324
  unmount_comp_list.remove(refdes)
2323
2325
  comp.edbcomponent.Ungroup(True)
2324
2326
 
2327
+ pinlist = [self._pedb.layout.find_object_by_id(i.GetId()) for i in pinlist]
2325
2328
  self.create(pinlist, refdes, p_layer, part_name)
2326
2329
  self.refresh_components()
2327
2330
  comp = self.instances[refdes]
@@ -2522,6 +2525,10 @@ class Components(object):
2522
2525
  >>> edbapp.components.get_pin_position(pin)
2523
2526
 
2524
2527
  """
2528
+ try:
2529
+ pin = pin._edb_object
2530
+ except:
2531
+ pin = pin
2525
2532
  res, pt_pos, rot_pos = pin.GetPositionAndRotation()
2526
2533
 
2527
2534
  if pin.GetComponent().IsNull():
@@ -92,6 +92,7 @@ class PolygonDataDotNet: # pragma: no cover
92
92
  self._pedb = pedb
93
93
  self.dotnetobj = pedb.edb_api.geometry.api_class.PolygonData
94
94
  self.edb_api = api_object
95
+ self._edb_object = api_object
95
96
 
96
97
  @property
97
98
  def api_class(self): # pragma: no cover
@@ -103,16 +104,6 @@ class PolygonDataDotNet: # pragma: no cover
103
104
  """List of Edb.Geometry.ArcData."""
104
105
  return list(self.edb_api.GetArcData())
105
106
 
106
- def get_points(self):
107
- """Get all points in polygon.
108
-
109
- Returns
110
- -------
111
- list[list[edb_value]]
112
- """
113
-
114
- return [[self._pedb.edb_value(i.X), self._pedb.edb_value(i.Y)] for i in list(self.edb_api.Points)]
115
-
116
107
  def add_point(self, x, y, incremental=False):
117
108
  """Add a point at the end of the point list of the polygon.
118
109
 
@@ -217,19 +208,6 @@ class PolygonDataDotNet: # pragma: no cover
217
208
  class NetDotNet:
218
209
  """Net Objects."""
219
210
 
220
- def __getattr__(self, key):
221
- try:
222
- return super().__getattribute__(key)
223
- except AttributeError:
224
- if self.net_obj and key in dir(self.net_obj):
225
- obj = self.net_obj
226
- else:
227
- obj = self.net
228
- try:
229
- return getattr(obj, key)
230
- except AttributeError:
231
- raise AttributeError("Attribute not present")
232
-
233
211
  def __init__(self, app, net_obj=None):
234
212
  self.net = app._edb.Cell.Net
235
213
 
@@ -21,7 +21,7 @@
21
21
  # SOFTWARE.
22
22
 
23
23
  """Primitive."""
24
- from pyedb.dotnet.edb_core.dotnet.database import NetDotNet, PolygonDataDotNet
24
+ from pyedb.dotnet.edb_core.dotnet.database import NetDotNet
25
25
  from pyedb.dotnet.edb_core.general import convert_py_list_to_net_list
26
26
  from pyedb.modeler.geometry_operators import GeometryOperators
27
27
 
@@ -36,8 +36,6 @@ def cast(api, prim_object):
36
36
  prim_type = prim_object.GetPrimitiveType()
37
37
  if prim_type == prim_type.Rectangle:
38
38
  return RectangleDotNet(api, prim_object)
39
- elif prim_type == prim_type.Polygon:
40
- return PolygonDotNet(api, prim_object)
41
39
  elif prim_type == prim_type.Path:
42
40
  return PathDotNet(api, prim_object)
43
41
  elif prim_type == prim_type.Bondwire:
@@ -53,67 +51,17 @@ def cast(api, prim_object):
53
51
  class PrimitiveDotNet:
54
52
  """Base class representing primitive objects."""
55
53
 
56
- def __getattr__(self, key):
57
- try:
58
- return super().__getattribute__(key)
59
- except AttributeError:
60
- if self.prim_obj and key in dir(self.prim_obj):
61
- obj = self.prim_obj
62
- else:
63
- obj = self.api
64
- try:
65
- return getattr(obj, key)
66
- except AttributeError: # pragma: no cover
67
- raise AttributeError("Attribute {} not present".format(key))
68
-
69
54
  def __init__(self, api, prim_object=None):
70
55
  self._app = api
71
56
  self.api = api._edb.Cell.Primitive
72
57
  self.edb_api = api._edb
73
58
  self.prim_obj = prim_object
74
-
75
- @property
76
- def id(self):
77
- return self.prim_obj.GetId()
59
+ self._edb_object = prim_object
78
60
 
79
61
  @property
80
62
  def api_class(self):
81
63
  return self.api
82
64
 
83
- @property
84
- def aedt_name(self):
85
- """Name to be visualized in AEDT.
86
-
87
- Returns
88
- -------
89
- str
90
- Name.
91
- """
92
- from System import String
93
-
94
- val = String("")
95
-
96
- _, name = self.prim_obj.GetProductProperty(self._app._edb.ProductId.Designer, 1, val)
97
- name = str(name).strip("'")
98
- if name == "":
99
- if str(self.primitive_type) == "Path":
100
- ptype = "line"
101
- elif str(self.primitive_type) == "Rectangle":
102
- ptype = "rect"
103
- elif str(self.primitive_type) == "Polygon":
104
- ptype = "poly"
105
- elif str(self.primitive_type) == "Bondwire":
106
- ptype = "bwr"
107
- else:
108
- ptype = str(self.primitive_type).lower()
109
- name = "{}_{}".format(ptype, self.id)
110
- self.prim_obj.SetProductProperty(self._app._edb.ProductId.Designer, 1, name)
111
- return name
112
-
113
- @aedt_name.setter
114
- def aedt_name(self, value):
115
- self.prim_obj.SetProductProperty(self._app._edb.ProductId.Designer, 1, value)
116
-
117
65
  @property
118
66
  def api_object(self):
119
67
  return self.prim_obj
@@ -130,10 +78,6 @@ class PrimitiveDotNet:
130
78
  def circle(self):
131
79
  return CircleDotNet(self._app)
132
80
 
133
- @property
134
- def polygon(self):
135
- return PolygonDotNet(self._app)
136
-
137
81
  @property
138
82
  def text(self):
139
83
  return TextDotNet(self._app)
@@ -160,15 +104,6 @@ class PrimitiveDotNet:
160
104
  except TypeError:
161
105
  self._app.logger.error("Error setting net object")
162
106
 
163
- @property
164
- def polygon_data(self):
165
- """:class:`pyedb.dotnet.edb_core.dotnet.database.PolygonDataDotNet`: Outer contour of the Polygon object."""
166
- return PolygonDataDotNet(self._app, self.prim_obj.GetPolygonData())
167
-
168
- @polygon_data.setter
169
- def polygon_data(self, poly):
170
- return self.prim_obj.SetPolygonData(poly)
171
-
172
107
  @property
173
108
  def primitive_type(self):
174
109
  """:class:`PrimitiveType`: Primitive type of the primitive.
@@ -583,6 +518,7 @@ class CircleDotNet(PrimitiveDotNet):
583
518
 
584
519
  def __init__(self, api, prim_obj=None):
585
520
  PrimitiveDotNet.__init__(self, api, prim_obj)
521
+ self._edb_object = prim_obj
586
522
 
587
523
  def create(self, layout, layer, net, center_x, center_y, radius):
588
524
  """Create a circle.
@@ -772,44 +708,6 @@ class TextDotNet(PrimitiveDotNet):
772
708
  )
773
709
 
774
710
 
775
- class PolygonDotNet(PrimitiveDotNet):
776
- """Class representing a polygon object."""
777
-
778
- def __init__(self, api, prim_obj=None):
779
- PrimitiveDotNet.__init__(self, api, prim_obj)
780
-
781
- def create(self, layout, layer, net, polygon_data):
782
- """Create a polygon.
783
-
784
- Parameters
785
- ----------
786
- layout : :class:`Layout <ansys.edb.layout.Layout>`
787
- Layout the polygon will be in.
788
- layer : str or :class:`Layer <ansys.edb.layer.Layer>`
789
- Layer this Polygon will be in.
790
- net : str or :class:`Net <ansys.edb.net.Net>` or None
791
- Net of the Polygon object.
792
- polygon_data : :class:`PolygonData <ansys.edb.geometry.PolygonData>`
793
- The outer contour of the Polygon.
794
-
795
- Returns
796
- -------
797
- :class:`pyedb.dotnet.edb_core.dotnet.primitive.PolygonDotNet`
798
- Polygon object created.
799
- """
800
- if isinstance(net, NetDotNet):
801
- net = net.api_object
802
- return PolygonDotNet(self._app, self.api.Polygon.Create(layout, layer, net, polygon_data))
803
-
804
- @property
805
- def can_be_zone_primitive(self):
806
- """:obj:`bool`: If a polygon can be a zone.
807
-
808
- Read-Only.
809
- """
810
- return True
811
-
812
-
813
711
  class PathDotNet(PrimitiveDotNet):
814
712
  """Class representing a path object."""
815
713
 
@@ -866,40 +764,6 @@ class PathDotNet(PrimitiveDotNet):
866
764
  polygon_data = self._edb.geometry.polygon_data.dotnetobj(convert_py_list_to_net_list(points), False)
867
765
  self.prim_obj.SetCenterLine(polygon_data)
868
766
 
869
- @property
870
- def end_cap_style(self):
871
- """Get path end cap styles.
872
-
873
- Returns
874
- -------
875
- tuple[
876
- :class:`PathEndCapType`,
877
- :class:`PathEndCapType`
878
- ]
879
-
880
- Returns a tuple of the following format:
881
-
882
- **(end_cap1, end_cap2)**
883
-
884
- **end_cap1** : End cap style of path start end cap.
885
-
886
- **end_cap2** : End cap style of path end end cap.
887
- """
888
- return self._edb_object.GetEndCapStyle()
889
-
890
- @end_cap_style.setter
891
- def end_cap_style(self, end_cap1, end_cap2):
892
- """Set path end cap styles.
893
-
894
- Parameters
895
- ----------
896
- end_cap1: :class:`PathEndCapType`
897
- End cap style of path start end cap.
898
- end_cap2: :class:`PathEndCapType`
899
- End cap style of path end end cap.
900
- """
901
- self._edb_object.SetEndCapStyle(end_cap1, end_cap2)
902
-
903
767
  @property
904
768
  def get_clip_info(self):
905
769
  """Get data used to clip the path.
@@ -27,7 +27,6 @@ from pyedb.dotnet.edb_core.dotnet.database import (
27
27
  NetDotNet,
28
28
  )
29
29
  from pyedb.dotnet.edb_core.edb_data.padstacks_data import EDBPadstackInstance
30
- from pyedb.dotnet.edb_core.edb_data.primitives_data import cast
31
30
 
32
31
 
33
32
  class EDBNetsData(NetDotNet):
@@ -43,15 +42,6 @@ class EDBNetsData(NetDotNet):
43
42
  >>> edb_net.name # EDB Object Property
44
43
  """
45
44
 
46
- def __getattr__(self, key):
47
- try:
48
- return self[key]
49
- except:
50
- try:
51
- return getattr(self.net_object, key)
52
- except AttributeError:
53
- raise AttributeError("Attribute not present")
54
-
55
45
  def __init__(self, raw_net, core_app):
56
46
  self._app = core_app
57
47
  self._core_components = core_app.components
@@ -68,7 +58,7 @@ class EDBNetsData(NetDotNet):
68
58
  -------
69
59
  list of :class:`pyedb.dotnet.edb_core.edb_data.primitives_data.EDBPrimitives`
70
60
  """
71
- return [cast(i, self._app) for i in self.net_object.Primitives]
61
+ return [self._app.layout.find_object_by_id(i.GetId()) for i in self.net_object.Primitives]
72
62
 
73
63
  @property
74
64
  def padstack_instances(self):
@@ -26,7 +26,7 @@ import re
26
26
  import warnings
27
27
 
28
28
  from pyedb.dotnet.clr_module import String
29
- from pyedb.dotnet.edb_core.cell.primitive import Primitive
29
+ from pyedb.dotnet.edb_core.cell.primitive.primitive import Primitive
30
30
  from pyedb.dotnet.edb_core.dotnet.database import PolygonDataDotNet
31
31
  from pyedb.dotnet.edb_core.edb_data.edbvalue import EdbValue
32
32
  from pyedb.dotnet.edb_core.general import PadGeometryTpe, convert_py_list_to_net_list
@@ -821,11 +821,10 @@ class EDBPadstack(object):
821
821
  pos = via.position
822
822
  started = False
823
823
  if len(self.pad_by_layer[self.via_start_layer].parameters) == 0:
824
- self._edb.cell.primitive.polygon.create(
825
- layout,
826
- self.via_start_layer,
827
- via._edb_padstackinstance.GetNet(),
828
- self.pad_by_layer[self.via_start_layer].polygon_data.edb_api,
824
+ self._ppadstack._pedb.modeler.create_polygon(
825
+ self.pad_by_layer[self.via_start_layer].polygon_data._edb_object,
826
+ layer_name=self.via_start_layer,
827
+ net_name=via._edb_padstackinstance.GetNet().GetName(),
829
828
  )
830
829
  else:
831
830
  self._edb.cell.primitive.circle.create(
@@ -837,11 +836,10 @@ class EDBPadstack(object):
837
836
  self._get_edb_value(self.pad_by_layer[self.via_start_layer].parameters_values[0] / 2),
838
837
  )
839
838
  if len(self.pad_by_layer[self.via_stop_layer].parameters) == 0:
840
- self._edb.cell.primitive.polygon.create(
841
- layout,
842
- self.via_stop_layer,
843
- via._edb_padstackinstance.GetNet(),
844
- self.pad_by_layer[self.via_stop_layer].polygon_data.edb_api,
839
+ self._ppadstack._pedb.modeler.create_polygon(
840
+ self.pad_by_layer[self.via_stop_layer].polygon_data._edb_object,
841
+ layer_name=self.via_stop_layer,
842
+ net_name=via._edb_padstackinstance.GetNet().GetName(),
845
843
  )
846
844
  else:
847
845
  self._edb.cell.primitive.circle.create(
@@ -1027,7 +1025,7 @@ class EDBPadstack(object):
1027
1025
  None,
1028
1026
  None,
1029
1027
  )
1030
- padstack_instance.SetIsLayoutPin(via.is_pin)
1028
+ padstack_instance._edb_object.SetIsLayoutPin(via.is_pin)
1031
1029
  i += 1
1032
1030
  via.delete()
1033
1031
  self._ppadstack._pedb.logger.info("Created {} new microvias.".format(i))
@@ -2058,18 +2056,6 @@ class EDBPadstackInstance(Primitive):
2058
2056
  created_polygon = self._pedb.modeler.create_polygon(path, layer_name)
2059
2057
  return created_polygon
2060
2058
 
2061
- def get_connected_object_id_set(self):
2062
- """Produce a list of all geometries physically connected to a given layout object.
2063
-
2064
- Returns
2065
- -------
2066
- list
2067
- Found connected objects IDs with Layout object.
2068
- """
2069
- layoutInst = self._edb_padstackinstance.GetLayout().GetLayoutInstance()
2070
- layoutObjInst = self.object_instance
2071
- return [loi.GetLayoutObj().GetId() for loi in layoutInst.GetConnectedObjects(layoutObjInst).Items]
2072
-
2073
2059
  def get_reference_pins(self, reference_net="GND", search_radius=5e-3, max_limit=0, component_only=True):
2074
2060
  """Search for reference pins using given criteria.
2075
2061