pyedb 0.38.0__py3-none-any.whl → 0.39.1__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 (205) hide show
  1. pyedb/__init__.py +1 -1
  2. pyedb/common/nets.py +53 -139
  3. pyedb/configuration/cfg_components.py +1 -1
  4. pyedb/configuration/cfg_general.py +4 -2
  5. pyedb/configuration/cfg_modeler.py +1 -1
  6. pyedb/configuration/cfg_package_definition.py +1 -1
  7. pyedb/configuration/cfg_padstacks.py +1 -1
  8. pyedb/configuration/cfg_ports_sources.py +56 -23
  9. pyedb/configuration/configuration.py +18 -1
  10. pyedb/dotnet/{application → database}/Variables.py +21 -21
  11. pyedb/dotnet/{edb_core → database}/cell/connectable.py +5 -5
  12. pyedb/dotnet/{edb_core → database}/cell/hierarchy/component.py +11 -11
  13. pyedb/dotnet/{edb_core → database}/cell/hierarchy/hierarchy_obj.py +1 -1
  14. pyedb/dotnet/{edb_core → database}/cell/hierarchy/model.py +1 -1
  15. pyedb/dotnet/{edb_core → database}/cell/layout.py +17 -17
  16. pyedb/dotnet/{edb_core → database}/cell/layout_obj.py +3 -3
  17. pyedb/dotnet/{edb_core → database}/cell/primitive/bondwire.py +1 -1
  18. pyedb/dotnet/{edb_core → database}/cell/primitive/path.py +4 -4
  19. pyedb/dotnet/{edb_core → database}/cell/primitive/primitive.py +14 -14
  20. pyedb/dotnet/{edb_core → database}/cell/terminal/bundle_terminal.py +2 -2
  21. pyedb/dotnet/{edb_core → database}/cell/terminal/edge_terminal.py +4 -4
  22. pyedb/dotnet/{edb_core → database}/cell/terminal/padstack_instance_terminal.py +2 -2
  23. pyedb/dotnet/{edb_core → database}/cell/terminal/pingroup_terminal.py +2 -2
  24. pyedb/dotnet/{edb_core → database}/cell/terminal/point_terminal.py +2 -2
  25. pyedb/dotnet/{edb_core → database}/cell/terminal/terminal.py +11 -11
  26. pyedb/dotnet/{edb_core → database}/cell/voltage_regulator.py +2 -2
  27. pyedb/dotnet/{edb_core → database}/components.py +101 -124
  28. pyedb/dotnet/{edb_core → database}/definition/component_def.py +5 -5
  29. pyedb/dotnet/{edb_core → database}/definition/component_model.py +1 -1
  30. pyedb/dotnet/{edb_core → database}/definition/definition_obj.py +1 -1
  31. pyedb/dotnet/{edb_core → database}/definition/definitions.py +2 -2
  32. pyedb/dotnet/{edb_core → database}/definition/package_def.py +4 -4
  33. pyedb/dotnet/{edb_core → database}/dotnet/database.py +8 -8
  34. pyedb/dotnet/{edb_core → database}/dotnet/primitive.py +9 -9
  35. pyedb/dotnet/{edb_core → database}/edb_data/control_file.py +12 -12
  36. pyedb/dotnet/{edb_core → database}/edb_data/hfss_extent_info.py +7 -7
  37. pyedb/dotnet/{edb_core → database}/edb_data/nets_data.py +10 -13
  38. pyedb/dotnet/{edb_core → database}/edb_data/padstacks_data.py +16 -16
  39. pyedb/dotnet/{edb_core → database}/edb_data/ports.py +4 -4
  40. pyedb/dotnet/{edb_core → database}/edb_data/primitives_data.py +5 -5
  41. pyedb/dotnet/{edb_core → database}/edb_data/raptor_x_simulation_setup_data.py +4 -4
  42. pyedb/dotnet/{edb_core → database}/edb_data/simulation_configuration.py +10 -10
  43. pyedb/dotnet/{edb_core → database}/edb_data/sources.py +4 -4
  44. pyedb/dotnet/{edb_core → database}/edb_data/variables.py +1 -1
  45. pyedb/dotnet/{edb_core → database}/geometry/polygon_data.py +4 -4
  46. pyedb/dotnet/{edb_core → database}/hfss.py +8 -8
  47. pyedb/dotnet/{edb_core → database}/layout_obj_instance.py +1 -1
  48. pyedb/dotnet/{edb_core → database}/layout_validation.py +2 -2
  49. pyedb/dotnet/{edb_core → database}/materials.py +23 -8
  50. pyedb/dotnet/{edb_core → database}/modeler.py +27 -27
  51. pyedb/dotnet/{edb_core → database}/net_class.py +8 -8
  52. pyedb/dotnet/{edb_core → database}/nets.py +12 -12
  53. pyedb/dotnet/{edb_core → database}/padstack.py +15 -15
  54. pyedb/dotnet/{edb_core → database}/sim_setup_data/data/mesh_operation.py +1 -1
  55. pyedb/dotnet/{edb_core → database}/sim_setup_data/data/settings.py +3 -3
  56. pyedb/dotnet/{edb_core → database}/sim_setup_data/data/sim_setup_info.py +2 -2
  57. pyedb/dotnet/{edb_core → database}/sim_setup_data/data/simulation_settings.py +1 -1
  58. pyedb/dotnet/{edb_core → database}/sim_setup_data/data/siw_dc_ir_settings.py +1 -1
  59. pyedb/dotnet/{edb_core → database}/sim_setup_data/data/sweep_data.py +1 -1
  60. pyedb/dotnet/{edb_core → database}/siwave.py +10 -10
  61. pyedb/dotnet/{edb_core → database}/stackup.py +12 -12
  62. pyedb/dotnet/{edb_core → database}/utilities/hfss_simulation_setup.py +15 -15
  63. pyedb/dotnet/{edb_core → database}/utilities/obj_base.py +1 -1
  64. pyedb/dotnet/{edb_core → database}/utilities/simulation_setup.py +3 -3
  65. pyedb/dotnet/{edb_core → database}/utilities/siwave_simulation_setup.py +6 -6
  66. pyedb/dotnet/edb.py +117 -112
  67. pyedb/generic/design_types.py +26 -19
  68. pyedb/generic/general_methods.py +1 -1
  69. pyedb/generic/plot.py +0 -2
  70. pyedb/grpc/database/__init__.py +1 -0
  71. pyedb/grpc/database/components.py +2354 -0
  72. pyedb/grpc/database/control_file.py +1277 -0
  73. pyedb/grpc/database/definition/component_def.py +218 -0
  74. pyedb/grpc/database/definition/component_model.py +39 -0
  75. pyedb/grpc/database/definition/component_pin.py +32 -0
  76. pyedb/grpc/database/definition/materials.py +1207 -0
  77. pyedb/grpc/database/definition/n_port_component_model.py +34 -0
  78. pyedb/grpc/database/definition/package_def.py +227 -0
  79. pyedb/grpc/database/definition/padstack_def.py +842 -0
  80. pyedb/grpc/database/definitions.py +70 -0
  81. pyedb/grpc/database/general.py +43 -0
  82. pyedb/grpc/database/geometry/__init__.py +0 -0
  83. pyedb/grpc/database/geometry/arc_data.py +93 -0
  84. pyedb/grpc/database/geometry/point_3d_data.py +79 -0
  85. pyedb/grpc/database/geometry/point_data.py +30 -0
  86. pyedb/grpc/database/geometry/polygon_data.py +133 -0
  87. pyedb/grpc/database/hfss.py +1279 -0
  88. pyedb/grpc/database/hierarchy/__init__.py +0 -0
  89. pyedb/grpc/database/hierarchy/component.py +1301 -0
  90. pyedb/grpc/database/hierarchy/model.py +31 -0
  91. pyedb/grpc/database/hierarchy/netlist_model.py +30 -0
  92. pyedb/grpc/database/hierarchy/pin_pair_model.py +128 -0
  93. pyedb/grpc/database/hierarchy/pingroup.py +245 -0
  94. pyedb/grpc/database/hierarchy/s_parameter_model.py +33 -0
  95. pyedb/grpc/database/hierarchy/spice_model.py +48 -0
  96. pyedb/grpc/database/layers/__init__.py +0 -0
  97. pyedb/grpc/database/layers/layer.py +57 -0
  98. pyedb/grpc/database/layers/stackup_layer.py +410 -0
  99. pyedb/grpc/database/layout/__init__.py +0 -0
  100. pyedb/grpc/database/layout/cell.py +30 -0
  101. pyedb/grpc/database/layout/layout.py +196 -0
  102. pyedb/grpc/database/layout/voltage_regulator.py +149 -0
  103. pyedb/grpc/database/layout_validation.py +319 -0
  104. pyedb/grpc/database/modeler.py +1468 -0
  105. pyedb/grpc/database/net/__init__.py +0 -0
  106. pyedb/grpc/database/net/differential_pair.py +138 -0
  107. pyedb/grpc/database/net/extended_net.py +340 -0
  108. pyedb/grpc/database/net/net.py +198 -0
  109. pyedb/grpc/database/net/net_class.py +93 -0
  110. pyedb/grpc/database/nets.py +633 -0
  111. pyedb/grpc/database/padstacks.py +1500 -0
  112. pyedb/grpc/database/ports/__init__.py +0 -0
  113. pyedb/grpc/database/ports/ports.py +396 -0
  114. pyedb/grpc/database/primitive/__init__.py +3 -0
  115. pyedb/grpc/database/primitive/bondwire.py +181 -0
  116. pyedb/grpc/database/primitive/circle.py +75 -0
  117. pyedb/grpc/database/primitive/padstack_instance.py +1116 -0
  118. pyedb/grpc/database/primitive/path.py +346 -0
  119. pyedb/grpc/database/primitive/polygon.py +276 -0
  120. pyedb/grpc/database/primitive/primitive.py +739 -0
  121. pyedb/grpc/database/primitive/rectangle.py +146 -0
  122. pyedb/grpc/database/simulation_setup/__init__.py +0 -0
  123. pyedb/grpc/database/simulation_setup/adaptive_frequency.py +33 -0
  124. pyedb/grpc/database/simulation_setup/hfss_advanced_meshing_settings.py +32 -0
  125. pyedb/grpc/database/simulation_setup/hfss_advanced_settings.py +59 -0
  126. pyedb/grpc/database/simulation_setup/hfss_dcr_settings.py +35 -0
  127. pyedb/grpc/database/simulation_setup/hfss_general_settings.py +61 -0
  128. pyedb/grpc/database/simulation_setup/hfss_settings_options.py +78 -0
  129. pyedb/grpc/database/simulation_setup/hfss_simulation_settings.py +118 -0
  130. pyedb/grpc/database/simulation_setup/hfss_simulation_setup.py +355 -0
  131. pyedb/grpc/database/simulation_setup/hfss_solver_settings.py +34 -0
  132. pyedb/grpc/database/simulation_setup/mesh_operation.py +34 -0
  133. pyedb/grpc/database/simulation_setup/raptor_x_advanced_settings.py +34 -0
  134. pyedb/grpc/database/simulation_setup/raptor_x_general_settings.py +33 -0
  135. pyedb/grpc/database/simulation_setup/raptor_x_simulation_settings.py +64 -0
  136. pyedb/grpc/database/simulation_setup/raptor_x_simulation_setup.py +125 -0
  137. pyedb/grpc/database/simulation_setup/siwave_dcir_simulation_setup.py +34 -0
  138. pyedb/grpc/database/simulation_setup/siwave_simulation_setup.py +119 -0
  139. pyedb/grpc/database/simulation_setup/sweep_data.py +32 -0
  140. pyedb/grpc/database/siwave.py +1023 -0
  141. pyedb/grpc/database/source_excitations.py +2572 -0
  142. pyedb/grpc/database/stackup.py +2574 -0
  143. pyedb/grpc/database/terminal/__init__.py +0 -0
  144. pyedb/grpc/database/terminal/bundle_terminal.py +218 -0
  145. pyedb/grpc/database/terminal/edge_terminal.py +51 -0
  146. pyedb/grpc/database/terminal/padstack_instance_terminal.py +171 -0
  147. pyedb/grpc/database/terminal/pingroup_terminal.py +162 -0
  148. pyedb/grpc/database/terminal/point_terminal.py +99 -0
  149. pyedb/grpc/database/terminal/terminal.py +470 -0
  150. pyedb/grpc/database/utility/__init__.py +3 -0
  151. pyedb/grpc/database/utility/constants.py +25 -0
  152. pyedb/grpc/database/utility/heat_sink.py +124 -0
  153. pyedb/grpc/database/utility/hfss_extent_info.py +448 -0
  154. pyedb/grpc/database/utility/layout_statistics.py +277 -0
  155. pyedb/grpc/database/utility/rlc.py +80 -0
  156. pyedb/grpc/database/utility/simulation_configuration.py +3305 -0
  157. pyedb/grpc/database/utility/sources.py +388 -0
  158. pyedb/grpc/database/utility/sweep_data_distribution.py +83 -0
  159. pyedb/grpc/database/utility/xml_control_file.py +1277 -0
  160. pyedb/grpc/edb.py +4152 -0
  161. pyedb/grpc/edb_init.py +481 -0
  162. pyedb/grpc/rpc_session.py +177 -0
  163. pyedb/ipc2581/ecad/cad_data/assembly_drawing.py +3 -2
  164. pyedb/ipc2581/ecad/cad_data/feature.py +4 -3
  165. pyedb/ipc2581/ecad/cad_data/layer_feature.py +32 -20
  166. pyedb/ipc2581/ecad/cad_data/outline.py +3 -2
  167. pyedb/ipc2581/ecad/cad_data/package.py +4 -3
  168. pyedb/ipc2581/ecad/cad_data/path.py +82 -31
  169. pyedb/ipc2581/ecad/cad_data/polygon.py +122 -60
  170. pyedb/ipc2581/ecad/cad_data/profile.py +13 -12
  171. pyedb/ipc2581/ecad/cad_data/step.py +53 -21
  172. pyedb/ipc2581/ipc2581.py +47 -49
  173. pyedb/modeler/geometry_operators.py +1 -1
  174. {pyedb-0.38.0.dist-info → pyedb-0.39.1.dist-info}/METADATA +5 -2
  175. pyedb-0.39.1.dist-info/RECORD +288 -0
  176. pyedb-0.38.0.dist-info/RECORD +0 -195
  177. /pyedb/dotnet/{edb_core → database}/__init__.py +0 -0
  178. /pyedb/dotnet/{application → database/cell}/__init__.py +0 -0
  179. /pyedb/dotnet/{edb_core/cell → database/cell/hierarchy}/__init__.py +0 -0
  180. /pyedb/dotnet/{edb_core → database}/cell/hierarchy/netlist_model.py +0 -0
  181. /pyedb/dotnet/{edb_core → database}/cell/hierarchy/pin_pair_model.py +0 -0
  182. /pyedb/dotnet/{edb_core → database}/cell/hierarchy/s_parameter_model.py +0 -0
  183. /pyedb/dotnet/{edb_core → database}/cell/hierarchy/spice_model.py +0 -0
  184. /pyedb/dotnet/{edb_core → database}/cell/primitive/__init__.py +0 -0
  185. /pyedb/dotnet/{edb_core/cell/hierarchy → database/cell/terminal}/__init__.py +0 -0
  186. /pyedb/dotnet/{edb_core/cell/terminal → database/definition}/__init__.py +0 -0
  187. /pyedb/dotnet/{edb_core/definition → database/dotnet}/__init__.py +0 -0
  188. /pyedb/dotnet/{edb_core/dotnet → database/edb_data}/__init__.py +0 -0
  189. /pyedb/dotnet/{edb_core → database}/edb_data/design_options.py +0 -0
  190. /pyedb/dotnet/{edb_core → database}/edb_data/edbvalue.py +0 -0
  191. /pyedb/dotnet/{edb_core → database}/edb_data/layer_data.py +0 -0
  192. /pyedb/dotnet/{edb_core → database}/edb_data/utilities.py +0 -0
  193. /pyedb/dotnet/{edb_core → database}/general.py +0 -0
  194. /pyedb/dotnet/{edb_core/edb_data → database/geometry}/__init__.py +0 -0
  195. /pyedb/dotnet/{edb_core → database}/geometry/point_data.py +0 -0
  196. /pyedb/dotnet/{edb_core → database}/sim_setup_data/__init__.py +0 -0
  197. /pyedb/dotnet/{edb_core → database}/sim_setup_data/data/__init__.py +0 -0
  198. /pyedb/dotnet/{edb_core → database}/sim_setup_data/data/adaptive_frequency_data.py +0 -0
  199. /pyedb/dotnet/{edb_core/geometry → database/sim_setup_data/io}/__init__.py +0 -0
  200. /pyedb/dotnet/{edb_core → database}/sim_setup_data/io/siwave.py +0 -0
  201. /pyedb/dotnet/{edb_core → database}/utilities/__init__.py +0 -0
  202. /pyedb/dotnet/{edb_core → database}/utilities/heatsink.py +0 -0
  203. /pyedb/{dotnet/edb_core/sim_setup_data/io → grpc/database/definition}/__init__.py +0 -0
  204. {pyedb-0.38.0.dist-info → pyedb-0.39.1.dist-info}/LICENSE +0 -0
  205. {pyedb-0.38.0.dist-info → pyedb-0.39.1.dist-info}/WHEEL +0 -0
@@ -0,0 +1,470 @@
1
+ # Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates.
2
+ # SPDX-License-Identifier: MIT
3
+ #
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in all
13
+ # copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ # SOFTWARE.
22
+
23
+ import re
24
+
25
+ from ansys.edb.core.terminal.terminals import BoundaryType as GrpcBoundaryType
26
+ from ansys.edb.core.terminal.terminals import EdgeType as GrpcEdgeType
27
+ from ansys.edb.core.terminal.terminals import Terminal as GrpcTerminal
28
+ from ansys.edb.core.terminal.terminals import TerminalType as GrpcTerminalType
29
+ from ansys.edb.core.utility.value import Value as GrpcValue
30
+
31
+ from pyedb.dotnet.database.edb_data.padstacks_data import EDBPadstackInstance
32
+ from pyedb.dotnet.database.edb_data.primitives_data import cast
33
+
34
+
35
+ class Terminal(GrpcTerminal):
36
+ def __init__(self, pedb, edb_object):
37
+ super().__init__(edb_object.msg)
38
+ self._pedb = pedb
39
+ self._reference_object = None
40
+ self.edb_object = edb_object
41
+
42
+ self._boundary_type_mapping = {
43
+ "port": GrpcBoundaryType.PORT,
44
+ "pec": GrpcBoundaryType.PEC,
45
+ "rlc": GrpcBoundaryType.RLC,
46
+ "current_source": GrpcBoundaryType.CURRENT_SOURCE,
47
+ "voltage_source": GrpcBoundaryType.VOLTAGE_SOURCE,
48
+ "nexxim_ground": GrpcBoundaryType.NEXXIM_GROUND,
49
+ "nxxim_port": GrpcBoundaryType.NEXXIM_PORT,
50
+ "dc_terminal": GrpcBoundaryType.DC_TERMINAL,
51
+ "voltage_probe": GrpcBoundaryType.VOLTAGE_PROBE,
52
+ }
53
+
54
+ self._terminal_type_mapping = {
55
+ "edge": GrpcTerminalType.EDGE,
56
+ "point": GrpcTerminalType.POINT,
57
+ "terminal_instance": GrpcTerminalType.TERM_INST,
58
+ "padstack_instance": GrpcTerminalType.PADSTACK_INST,
59
+ "bundle": GrpcTerminalType.BUNDLE,
60
+ "pin_group": GrpcTerminalType.PIN_GROUP,
61
+ }
62
+
63
+ @property
64
+ def _hfss_port_property(self):
65
+ """HFSS port property."""
66
+ hfss_prop = re.search(r"HFSS\(.*?\)", self._edb_properties)
67
+ p = {}
68
+ if hfss_prop:
69
+ hfss_type = re.search(r"'HFSS Type'='([^']+)'", hfss_prop.group())
70
+ orientation = re.search(r"'Orientation'='([^']+)'", hfss_prop.group())
71
+ horizontal_ef = re.search(r"'Horizontal Extent Factor'='([^']+)'", hfss_prop.group())
72
+ vertical_ef = re.search(r"'Vertical Extent Factor'='([^']+)'", hfss_prop.group())
73
+ radial_ef = re.search(r"'Radial Extent Factor'='([^']+)'", hfss_prop.group())
74
+ pec_w = re.search(r"'PEC Launch Width'='([^']+)'", hfss_prop.group())
75
+
76
+ p["HFSS Type"] = hfss_type.group(1) if hfss_type else ""
77
+ p["Orientation"] = orientation.group(1) if orientation else ""
78
+ p["Horizontal Extent Factor"] = float(horizontal_ef.group(1)) if horizontal_ef else ""
79
+ p["Vertical Extent Factor"] = float(vertical_ef.group(1)) if vertical_ef else ""
80
+ p["Radial Extent Factor"] = float(radial_ef.group(1)) if radial_ef else ""
81
+ p["PEC Launch Width"] = pec_w.group(1) if pec_w else ""
82
+ else:
83
+ p["HFSS Type"] = ""
84
+ p["Orientation"] = ""
85
+ p["Horizontal Extent Factor"] = ""
86
+ p["Vertical Extent Factor"] = ""
87
+ p["Radial Extent Factor"] = ""
88
+ p["PEC Launch Width"] = ""
89
+ return p
90
+
91
+ @property
92
+ def ref_terminal(self):
93
+ """Reference terminal.
94
+
95
+ Returns
96
+ -------
97
+ :class:`PointTerminal <pyedb.grpc.database.terminal.point_terminal.PointTerminal>`
98
+
99
+ """
100
+ return self.reference_terminal
101
+
102
+ @ref_terminal.setter
103
+ def ref_terminal(self, value):
104
+ self.reference_terminal = value
105
+
106
+ @_hfss_port_property.setter
107
+ def _hfss_port_property(self, value):
108
+ txt = []
109
+ for k, v in value.items():
110
+ txt.append("'{}'='{}'".format(k, v))
111
+ txt = ",".join(txt)
112
+ self._edb_properties = "HFSS({})".format(txt)
113
+
114
+ @property
115
+ def hfss_type(self):
116
+ """HFSS port type."""
117
+ return self._hfss_port_property["HFSS Type"]
118
+
119
+ @hfss_type.setter
120
+ def hfss_type(self, value):
121
+ p = self._hfss_port_property
122
+ p["HFSS Type"] = value
123
+ self._hfss_port_property = p
124
+
125
+ @property
126
+ def layer(self):
127
+ """Get layer of the terminal.
128
+
129
+ Returns
130
+ -------
131
+ str : layer name.
132
+ """
133
+ return self.reference_layer.name
134
+
135
+ @layer.setter
136
+ def layer(self, value):
137
+ from ansys.edb.core.layer.layer import Layer
138
+
139
+ if isinstance(value, Layer):
140
+ self.reference_layer = value
141
+ if isinstance(value, str):
142
+ self.reference_layer = self._pedb.stackup.layers[value]
143
+
144
+ @property
145
+ def do_renormalize(self):
146
+ """Determine whether port renormalization is enabled.
147
+
148
+ Returns
149
+ -------
150
+ bool
151
+
152
+ """
153
+ return self.port_post_processing_prop.do_renormalize
154
+
155
+ @do_renormalize.setter
156
+ def do_renormalize(self, value):
157
+ self.port_post_processing_prop.do_renormalize = value
158
+
159
+ @property
160
+ def net_name(self):
161
+ """Net name.
162
+
163
+ Returns
164
+ -------
165
+ str
166
+ Net name.
167
+ """
168
+ return self.net.name
169
+
170
+ @property
171
+ def terminal_type(self):
172
+ """Terminal Type. Accepted values for setter: `"edge"`, `"point"`, `"terminal_instance"`,
173
+ `"padstack_instance"`, `"bundle_terminal"`, `"pin_group"`.
174
+
175
+ Returns
176
+ -------
177
+ str
178
+ """
179
+ return self.type.name.lower()
180
+
181
+ @terminal_type.setter
182
+ def terminal_type(self, value):
183
+ self.type = self._terminal_type_mapping[value]
184
+
185
+ @property
186
+ def boundary_type(self):
187
+ """Boundary type.
188
+
189
+ Returns
190
+ -------
191
+ str
192
+ port, pec, rlc, current_source, voltage_source, nexxim_ground, nexxim_pPort, dc_terminal, voltage_probe.
193
+ """
194
+ return super().boundary_type.name.lower()
195
+
196
+ @boundary_type.setter
197
+ def boundary_type(self, value):
198
+ super(Terminal, self.__class__).boundary_type.__set__(self, self._boundary_type_mapping[value])
199
+
200
+ @property
201
+ def is_port(self):
202
+ """Whether it is a port.
203
+
204
+ Returns
205
+ -------
206
+ bool
207
+
208
+ """
209
+ return True if self.boundary_type == "port" else False
210
+
211
+ @property
212
+ def is_current_source(self):
213
+ """Whether it is a current source.
214
+
215
+ Returns
216
+ -------
217
+ bool
218
+
219
+ """
220
+ return True if self.boundary_type == "current_source" else False
221
+
222
+ @property
223
+ def is_voltage_source(self):
224
+ """Whether it is a voltage source.
225
+
226
+ Returns
227
+ -------
228
+ bool
229
+
230
+ """
231
+ return True if self.boundary_type == "voltage_source" else False
232
+
233
+ @property
234
+ def impedance(self):
235
+ """Impedance of the port.
236
+
237
+ Returns
238
+ -------
239
+ float : impedance value.
240
+
241
+ """
242
+ return self.impedance.value
243
+
244
+ @impedance.setter
245
+ def impedance(self, value):
246
+ self.impedance = GrpcValue(value)
247
+
248
+ @property
249
+ def reference_object(self): # pragma : no cover
250
+ """This returns the object assigned as reference. It can be a primitive or a padstack instance.
251
+
252
+
253
+ Returns
254
+ -------
255
+ :class:`PadstackInstance <pyedb.grpc.database.primitive.padstack_instance.PadstackInstance>` or
256
+ :class:`Primitive <pyedb.grpc.database.primitive.primitives.Primitive>`
257
+ """
258
+ if not self._reference_object:
259
+ if self.terminal_type == "edge":
260
+ edges = self.edges
261
+ edgeType = edges[0].type
262
+ if edgeType == GrpcEdgeType.PADSTACK:
263
+ self._reference_object = self.get_pad_edge_terminal_reference_pin()
264
+ else:
265
+ self._reference_object = self.get_edge_terminal_reference_primitive()
266
+ elif self.terminal_type == "pin_group":
267
+ self._reference_object = self.get_pin_group_terminal_reference_pin()
268
+ elif self.terminal_type == "point":
269
+ self._reference_object = self.get_point_terminal_reference_primitive()
270
+ elif self.terminal_type == "padstack_instance":
271
+ self._reference_object = self.get_padstack_terminal_reference_pin()
272
+ else:
273
+ self._pedb.logger.warning("Invalid Terminal Type={}")
274
+ return False
275
+
276
+ return self._reference_object
277
+
278
+ @property
279
+ def reference_net_name(self):
280
+ """Net name to which reference_object belongs.
281
+
282
+ Returns
283
+ -------
284
+ str : net name.
285
+
286
+ """
287
+ if self.reference_object:
288
+ return self.reference_object.net_name
289
+
290
+ return ""
291
+
292
+ def get_padstack_terminal_reference_pin(self, gnd_net_name_preference=None): # pragma : no cover
293
+ """Get a list of pad stacks instances and serves Coax wave ports,
294
+ pingroup terminals, PadEdge terminals.
295
+
296
+ Parameters
297
+ ----------
298
+ gnd_net_name_preference : str, optional
299
+ Preferred reference net name.
300
+
301
+ Returns
302
+ -------
303
+ :class:`PadstackInstance <pyedb.grpc.database.primitive.padstack_instance.PadstackInstance>`
304
+ """
305
+
306
+ if self.is_circuit_port:
307
+ return self.get_pin_group_terminal_reference_pin()
308
+ _, padStackInstance, _ = self.get_parameters()
309
+
310
+ # Get the pastack instance of the terminal
311
+ pins = self._pedb.components.get_pin_from_component(self.component.name)
312
+ return self._get_closest_pin(padStackInstance, pins, gnd_net_name_preference)
313
+
314
+ def get_pin_group_terminal_reference_pin(self, gnd_net_name_preference=None): # pragma : no cover
315
+ """Return a list of pins and serves terminals connected to pingroups.
316
+
317
+ Parameters
318
+ ----------
319
+ gnd_net_name_preference : str, optional
320
+ Preferred reference net name.
321
+
322
+ Returns
323
+ -------
324
+ :class:`PadstackInstance <pyedb.grpc.database.primitive.padstack_instance.PadstackInstance>`
325
+ """
326
+
327
+ refTerm = self.reference_terminal
328
+ if self.type == GrpcTerminalType.PIN_GROUP:
329
+ padStackInstance = self.pin_group.pins[0]
330
+ pingroup = refTerm.pin_group
331
+ refPinList = pingroup.pins
332
+ return self._get_closest_pin(padStackInstance, refPinList, gnd_net_name_preference)
333
+ elif self.type == GrpcTerminalType.PADSTACK_INST:
334
+ _, padStackInstance, _ = self.get_parameters()
335
+ if refTerm.type == GrpcTerminalType.PIN_GROUP:
336
+ pingroup = refTerm.pin_group
337
+ refPinList = pingroup.pins
338
+ return self._get_closest_pin(padStackInstance, refPinList, gnd_net_name_preference)
339
+ else:
340
+ try:
341
+ _, refTermPSI, _ = refTerm.get_parameters()
342
+ return EDBPadstackInstance(refTermPSI, self._pedb)
343
+ except AttributeError:
344
+ return False
345
+ return False
346
+
347
+ def get_edge_terminal_reference_primitive(self): # pragma : no cover
348
+ """Check and return a primitive instance that serves Edge ports,
349
+ wave-ports and coupled-edge ports that are directly connected to primitives.
350
+
351
+ Returns
352
+ -------
353
+ :class:`Primitive <pyedb.grpc.database.primitive.primitive.Primitive>`
354
+ """
355
+
356
+ ref_layer = self.reference_layer
357
+ edges = self.edges
358
+ _, _, point_data = edges[0].get_parameters()
359
+ # shape_pd = self._pedb.edb_api.geometry.point_data(X, Y)
360
+ layer_name = ref_layer.name
361
+ for primitive in self._pedb.layout.primitives:
362
+ if primitive.layer.name == layer_name:
363
+ if primitive.polygon_data.point_in_polygon(point_data):
364
+ return cast(primitive, self._pedb)
365
+ return None # pragma: no cover
366
+
367
+ def get_point_terminal_reference_primitive(self): # pragma : no cover
368
+ """Find and return the primitive reference for the point terminal or the padstack instance.
369
+
370
+ Returns
371
+ -------
372
+ :class:`PadstackInstance <pyedb.grpc.database.primitive.padstack_instance.PadstackInstance>` or
373
+ :class:`Primitive <pyedb.grpc.database.primitive.primitive.Primitive>`
374
+ """
375
+
376
+ ref_term = self.reference_terminal # return value is type terminal
377
+ _, point_data, layer = ref_term.get_parameters()
378
+ # shape_pd = self._pedb.edb_api.geometry.point_data(X, Y)
379
+ layer_name = layer.name
380
+ for primitive in self._pedb.layout.primitives:
381
+ if primitive.layer.name == layer_name:
382
+ prim_shape_data = primitive.GetPolygonData()
383
+ if primitive.polygon_data.point_in_polygon(point_data):
384
+ return cast(primitive, self._pedb)
385
+ for vias in self._pedb.padstacks.instances.values():
386
+ if layer_name in vias.layer_range_names:
387
+ plane = self._pedb.modeler.Shape(
388
+ "rectangle", pointA=vias.position, pointB=vias.padstack_definition.bounding_box[1]
389
+ )
390
+ rectangle_data = vias._pedb.modeler.shape_to_polygon_data(plane)
391
+ if rectangle_data.point_in_polygon(point_data):
392
+ return vias
393
+ return False
394
+
395
+ def get_pad_edge_terminal_reference_pin(self, gnd_net_name_preference=None):
396
+ """Get the closest pin padstack instances and serves any edge terminal connected to a pad.
397
+
398
+ Parameters
399
+ ----------
400
+ gnd_net_name_preference : str, optional
401
+ Preferred reference net name. Optianal, default is `None` which will auto compute the gnd name.
402
+
403
+ Returns
404
+ -------
405
+ :class:`PadstackInstance <pyedb.grpc.database.primitive.padstack_instance.PadstackInstance>`
406
+ """
407
+ comp_inst = self.component
408
+ pins = self._pedb.components.get_pin_from_component(comp_inst.name)
409
+ edges = self.edges
410
+ _, pad_edge_pstack_inst, _, _ = edges[0].get_parameters()
411
+ return self._get_closest_pin(pad_edge_pstack_inst, pins, gnd_net_name_preference)
412
+
413
+ def _get_closest_pin(self, ref_pin, pin_list, gnd_net=None):
414
+ _, pad_stack_inst_point, _ = ref_pin.position_and_rotation # get the xy of the padstack
415
+ if gnd_net is not None:
416
+ power_ground_net_names = [gnd_net]
417
+ else:
418
+ power_ground_net_names = [net for net in self._pedb.nets.power.keys()]
419
+ comp_ref_pins = [i for i in pin_list if i.net.name in power_ground_net_names]
420
+ if len(comp_ref_pins) == 0: # pragma: no cover
421
+ self._pedb.logger.error(
422
+ "Terminal with PadStack Instance Name {} component has no reference pins.".format(ref_pin.GetName())
423
+ )
424
+ return None
425
+ closest_pin_distance = None
426
+ pin_obj = None
427
+ for pin in comp_ref_pins: # find the distance to all the pins to the terminal pin
428
+ if pin.name == ref_pin.name: # skip the reference psi
429
+ continue # pragma: no cover
430
+ _, pin_point, _ = pin.position_and_rotation
431
+ distance = pad_stack_inst_point.distance(pin_point)
432
+ if closest_pin_distance is None:
433
+ closest_pin_distance = distance
434
+ pin_obj = pin
435
+ elif closest_pin_distance < distance:
436
+ continue
437
+ else:
438
+ closest_pin_distance = distance
439
+ pin_obj = pin
440
+ if pin_obj:
441
+ return EDBPadstackInstance(pin_obj, self._pedb)
442
+
443
+ @property
444
+ def magnitude(self):
445
+ """Get the magnitude of the source.
446
+
447
+ Returns
448
+ -------
449
+ float : source magnitude.
450
+ """
451
+ return self.source_amplitude.value
452
+
453
+ @magnitude.setter
454
+ def magnitude(self, value):
455
+ self.source_amplitude = GrpcValue(value)
456
+
457
+ @property
458
+ def phase(self):
459
+ """Get the phase of the source.
460
+
461
+ Returns
462
+ -------
463
+ float : source phase.
464
+
465
+ """
466
+ return self.source_phase.value
467
+
468
+ @phase.setter
469
+ def phase(self, value):
470
+ self.source_phase = GrpcValue(value)
@@ -0,0 +1,3 @@
1
+ from pathlib import Path
2
+
3
+ workdir = Path(__file__).parent
@@ -0,0 +1,25 @@
1
+ # Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates.
2
+ # SPDX-License-Identifier: MIT
3
+ #
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in all
13
+ # copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ # SOFTWARE.
22
+
23
+
24
+ def get_terminal_supported_boundary_types():
25
+ return ["voltage_source", "current_source", "port", "dc_terminal", "voltage_probe"]
@@ -0,0 +1,124 @@
1
+ # Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates.
2
+ # SPDX-License-Identifier: MIT
3
+ #
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in all
13
+ # copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ # SOFTWARE.
22
+
23
+ from ansys.edb.core.utility.heat_sink import (
24
+ HeatSinkFinOrientation as GrpcHeatSinkFinOrientation,
25
+ )
26
+ from ansys.edb.core.utility.value import Value as GrpcValue
27
+
28
+
29
+ class HeatSink:
30
+
31
+ """Heatsink model description.
32
+
33
+ Parameters
34
+ ----------
35
+ pedb : :class:`Edb < pyedb.grpc.edb.Edb>`
36
+ Inherited object.
37
+ """
38
+
39
+ def __init__(self, pedb, edb_object):
40
+ self._pedb = pedb
41
+ self._edb_object = edb_object
42
+ self._fin_orientation_type = {
43
+ "x_oriented": GrpcHeatSinkFinOrientation.X_ORIENTED,
44
+ "y_oriented": GrpcHeatSinkFinOrientation.Y_ORIENTED,
45
+ "other_oriented": GrpcHeatSinkFinOrientation.OTHER_ORIENTED,
46
+ }
47
+
48
+ @property
49
+ def fin_base_height(self):
50
+ """The base elevation of the fins.
51
+
52
+ Returns
53
+ -------
54
+ float
55
+ Height value.
56
+ """
57
+ return self._edb_object.fin_base_height.value
58
+
59
+ @fin_base_height.setter
60
+ def fin_base_height(self, value):
61
+ self._edb_object.fin_base_height = GrpcValue(value)
62
+
63
+ @property
64
+ def fin_height(self):
65
+ """Fin height.
66
+
67
+ Returns
68
+ -------
69
+ float
70
+ Fin height value.
71
+
72
+ """
73
+ return self._edb_object.fin_height.value
74
+
75
+ @fin_height.setter
76
+ def fin_height(self, value):
77
+ self._edb_object.fin_height = GrpcValue(value)
78
+
79
+ @property
80
+ def fin_orientation(self):
81
+ """Fin orientation.
82
+
83
+ Returns
84
+ -------
85
+ str
86
+ Fin orientation.
87
+ """
88
+ return self._edb_object.fin_orientation.name.lower()
89
+
90
+ @fin_orientation.setter
91
+ def fin_orientation(self, value):
92
+ self._edb_object.fin_orientation = self._fin_orientation_type[value]
93
+
94
+ @property
95
+ def fin_spacing(self):
96
+ """Fin spacing.
97
+
98
+ Returns
99
+ -------
100
+ float
101
+ Fin spacing value.
102
+
103
+ """
104
+ return self._edb_object.fin_spacing.value
105
+
106
+ @fin_spacing.setter
107
+ def fin_spacing(self, value):
108
+ self._edb_object.fin_spacing = GrpcValue(value)
109
+
110
+ @property
111
+ def fin_thickness(self):
112
+ """Fin thickness.
113
+
114
+ Returns
115
+ -------
116
+ float
117
+ Fin thickness value.
118
+
119
+ """
120
+ return self._edb_object.fin_thickness.value
121
+
122
+ @fin_thickness.setter
123
+ def fin_thickness(self, value):
124
+ self._edb_object.fin_thickness = GrpcValue(value)