pyedb 0.38.0__py3-none-any.whl → 0.39.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 (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 +4151 -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.0.dist-info}/METADATA +5 -2
  175. pyedb-0.39.0.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.0.dist-info}/LICENSE +0 -0
  205. {pyedb-0.38.0.dist-info → pyedb-0.39.0.dist-info}/WHEEL +0 -0
@@ -0,0 +1,448 @@
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.hfss_extent_info import HfssExtentInfo as GrpcHfssExtentInfo
24
+ from ansys.edb.core.utility.value import Value as GrpcValue
25
+
26
+
27
+ class HfssExtentInfo(GrpcHfssExtentInfo):
28
+ """Manages EDB functionalities for HFSS extent information.
29
+
30
+ Parameters
31
+ ----------
32
+ pedb : :class:`pyedb.grpc.edb.Edb`
33
+ Inherited EDB object.
34
+ """
35
+
36
+ def __init__(self, pedb):
37
+ self._pedb = pedb
38
+ super().__init__()
39
+ self.extent_type_mapping = {
40
+ "bounding_box": GrpcHfssExtentInfo.HFSSExtentInfoType.BOUNDING_BOX,
41
+ "conforming": GrpcHfssExtentInfo.HFSSExtentInfoType.CONFORMING,
42
+ "convex_hull": GrpcHfssExtentInfo.HFSSExtentInfoType.CONVEX_HUL,
43
+ "polygon": GrpcHfssExtentInfo.HFSSExtentInfoType.POLYGON,
44
+ }
45
+ self._open_region_type = {
46
+ "radiation": GrpcHfssExtentInfo.OpenRegionType.RADIATION,
47
+ "pml": GrpcHfssExtentInfo.OpenRegionType.PML,
48
+ }
49
+ self.hfss_extent_type = self._hfss_extent_info.extent_type
50
+
51
+ def _update_hfss_extent_info(self, hfss_extent):
52
+ return self._pedb.active_cell.set_hfss_extent_info(hfss_extent)
53
+
54
+ @property
55
+ def _hfss_extent_info(self):
56
+ return self._pedb.active_cell.hfss_extent_info
57
+
58
+ @property
59
+ def air_box_horizontal_extent_enabled(self):
60
+ """Whether horizontal extent is enabled for the airbox.
61
+
62
+ Returns
63
+ -------
64
+ bool.
65
+
66
+ """
67
+ return self._hfss_extent_info.air_box_horizontal_extent[1]
68
+
69
+ @air_box_horizontal_extent_enabled.setter
70
+ def air_box_horizontal_extent_enabled(self, value):
71
+ hfss_extent = self._hfss_extent_info
72
+ hfss_extent.air_box_horizontal_extent = value
73
+ self._update_hfss_extent_info(hfss_extent)
74
+
75
+ @property
76
+ def air_box_horizontal_extent(self):
77
+ """Size of horizontal extent for the air box.
78
+
79
+ Returns
80
+ -------
81
+ float
82
+ Air box horizontal extent value.
83
+ """
84
+ return self._hfss_extent_info.air_box_horizontal_extent[0]
85
+
86
+ @air_box_horizontal_extent.setter
87
+ def air_box_horizontal_extent(self, value):
88
+ hfss_extent = self._hfss_extent_info
89
+ hfss_extent.air_box_horizontal_extent = float(value)
90
+ self._update_hfss_extent_info(hfss_extent)
91
+
92
+ @property
93
+ def air_box_positive_vertical_extent_enabled(self):
94
+ """Whether positive vertical extent is enabled for the air box.
95
+
96
+ Returns
97
+ -------
98
+ bool.
99
+
100
+ """
101
+ return self._hfss_extent_info.air_box_positive_vertical_extent[1]
102
+
103
+ @air_box_positive_vertical_extent_enabled.setter
104
+ def air_box_positive_vertical_extent_enabled(self, value):
105
+ hfss_exent = self._hfss_extent_info
106
+ hfss_exent.air_box_positive_vertical_extent = value
107
+ self._update_hfss_extent_info(hfss_exent)
108
+
109
+ @property
110
+ def air_box_positive_vertical_extent(self):
111
+ """Negative vertical extent for the air box.
112
+
113
+ Returns
114
+ -------
115
+ float
116
+ Air box positive vertical extent value.
117
+
118
+ """
119
+ return self._hfss_extent_info.air_box_positive_vertical_extent[0]
120
+
121
+ @air_box_positive_vertical_extent.setter
122
+ def air_box_positive_vertical_extent(self, value):
123
+ hfss_extent = self._hfss_extent_info
124
+ hfss_extent.air_box_positive_vertical_extent = float(value)
125
+ self._update_hfss_extent_info(hfss_extent)
126
+
127
+ @property
128
+ def air_box_negative_vertical_extent_enabled(self):
129
+ """Whether negative vertical extent is enabled for the air box.
130
+
131
+ Returns
132
+ -------
133
+ bool.
134
+
135
+ """
136
+ return self._hfss_extent_info.air_box_negative_vertical_extent[1]
137
+
138
+ @air_box_negative_vertical_extent_enabled.setter
139
+ def air_box_negative_vertical_extent_enabled(self, value):
140
+ hfss_extent = self._hfss_extent_info
141
+ hfss_extent.air_box_negative_vertical_extent = value
142
+ self._update_hfss_extent_info(hfss_extent)
143
+
144
+ @property
145
+ def air_box_negative_vertical_extent(self):
146
+ """Negative vertical extent for the airbox.
147
+
148
+ Returns
149
+ -------
150
+ float
151
+ Air box negative vertical extent value.
152
+
153
+ """
154
+ return self._hfss_extent_info.air_box_negative_vertical_extent[0]
155
+
156
+ @air_box_negative_vertical_extent.setter
157
+ def air_box_negative_vertical_extent(self, value):
158
+ hfss_extent = self._hfss_extent_info
159
+ hfss_extent.air_box_negative_vertical_extent = float(value)
160
+ self._update_hfss_extent_info(hfss_extent)
161
+
162
+ @property
163
+ def base_polygon(self):
164
+ """Base polygon.
165
+
166
+ Returns
167
+ -------
168
+ :class:`Polygon <pyedb.grpc.database.primitive.polygon.Polygon>`
169
+ """
170
+ return self._hfss_extent_info.base_polygon
171
+
172
+ @base_polygon.setter
173
+ def base_polygon(self, value):
174
+ hfss_extent = self._hfss_extent_info
175
+ hfss_extent.base_polygon = value
176
+ self._update_hfss_extent_info(hfss_extent)
177
+
178
+ @property
179
+ def dielectric_base_polygon(self):
180
+ """Dielectric base polygon.
181
+
182
+ Returns
183
+ -------
184
+ :class:`Polygon <pyedb.grpc.database.primitive.polygon.Polygon>`
185
+ """
186
+ return self._hfss_extent_info.dielectric_base_polygon
187
+
188
+ @dielectric_base_polygon.setter
189
+ def dielectric_base_polygon(self, value):
190
+ hfss_extent = self._hfss_extent_info
191
+ hfss_extent.dielectric_base_polygon = value
192
+ self._update_hfss_extent_info(hfss_extent)
193
+
194
+ @property
195
+ def dielectric_extent_size_enabled(self):
196
+ """Whether dielectric extent size is enabled.
197
+
198
+ Returns
199
+ -------
200
+ bool.
201
+ """
202
+ return self._hfss_extent_info.dielectric_extent_size[1]
203
+
204
+ @dielectric_extent_size_enabled.setter
205
+ def dielectric_extent_size_enabled(self, value):
206
+ hfss_extent = self._hfss_extent_info
207
+ hfss_extent.dielectric_extent_size = value
208
+ self._update_hfss_extent_info(hfss_extent)
209
+
210
+ @property
211
+ def dielectric_extent_size(self):
212
+ """Dielectric extent size.
213
+
214
+ Returns
215
+ -------
216
+ float
217
+ Dielectric extent size value.
218
+ """
219
+ return self._hfss_extent_info.dielectric_extent_size[0]
220
+
221
+ @dielectric_extent_size.setter
222
+ def dielectric_extent_size(self, value):
223
+ hfss_extent = self._hfss_extent_info
224
+ hfss_extent.dielectric_extent_size = value
225
+ self._update_hfss_extent_info(hfss_extent)
226
+
227
+ @property
228
+ def dielectric_extent_type(self):
229
+ """Dielectric extent type.
230
+
231
+ Returns
232
+ -------
233
+ str
234
+ Dielectric extent type.
235
+
236
+ """
237
+ return self._hfss_extent_info.dielectric_extent_type.name.lower()
238
+
239
+ @dielectric_extent_type.setter
240
+ def dielectric_extent_type(self, value):
241
+ hfss_extent = self._hfss_extent_info
242
+ hfss_extent.dielectric_extent_type = value
243
+ self._update_hfss_extent_info(hfss_extent)
244
+
245
+ @property
246
+ def extent_type(self):
247
+ """Extent type.
248
+
249
+ Returns
250
+ -------
251
+ str
252
+ Extent type.
253
+ """
254
+ return self._hfss_extent_info.extent_type.name.lower()
255
+
256
+ @extent_type.setter
257
+ def extent_type(self, value):
258
+ hfss_extent = self._hfss_extent_info
259
+ hfss_extent.extent_type = value
260
+ self._update_hfss_extent_info(hfss_extent)
261
+
262
+ @property
263
+ def honor_user_dielectric(self):
264
+ """Honor user dielectric.
265
+
266
+ Returns
267
+ -------
268
+ bool
269
+ """
270
+ return self._hfss_extent_info.honor_user_dielectric
271
+
272
+ @honor_user_dielectric.setter
273
+ def honor_user_dielectric(self, value):
274
+ hfss_extent = self._hfss_extent_info
275
+ hfss_extent.honor_user_dielectric = value
276
+ self._update_hfss_extent_info(hfss_extent)
277
+
278
+ @property
279
+ def is_pml_visible(self):
280
+ """Whether visibility of the PML is enabled.
281
+
282
+ Returns
283
+ -------
284
+ bool
285
+
286
+ """
287
+ return self._hfss_extent_info.is_pml_visible
288
+
289
+ @is_pml_visible.setter
290
+ def is_pml_visible(self, value):
291
+ hfss_extent = self._hfss_extent_info
292
+ hfss_extent.is_pml_visible = value
293
+ self._update_hfss_extent_info(hfss_extent)
294
+
295
+ @property
296
+ def open_region_type(self):
297
+ """Open region type.
298
+
299
+ Returns
300
+ -------
301
+ str
302
+ Open region type.
303
+ """
304
+ return self._hfss_extent_info.open_region_type.name.lower()
305
+
306
+ @open_region_type.setter
307
+ def open_region_type(self, value):
308
+ hfss_extent = self._hfss_extent_info
309
+ hfss_extent.open_region_type = value
310
+ self._update_hfss_extent_info(hfss_extent)
311
+
312
+ @property
313
+ def operating_freq(self):
314
+ """PML Operating frequency.
315
+
316
+ Returns
317
+ -------
318
+ float
319
+ Operating frequency value.
320
+
321
+ """
322
+ return GrpcValue(self._hfss_extent_info.operating_frequency).value
323
+
324
+ @operating_freq.setter
325
+ def operating_freq(self, value):
326
+ hfss_extent = self._hfss_extent_info
327
+ hfss_extent.operating_frequency = GrpcValue(value)
328
+ self._update_hfss_extent_info(hfss_extent)
329
+
330
+ @property
331
+ def radiation_level(self):
332
+ """PML Radiation level to calculate the thickness of boundary.
333
+
334
+ Returns
335
+ -------
336
+ float
337
+ Boundary thickness value.
338
+
339
+ """
340
+ return GrpcValue(self._hfss_extent_info.radiation_level).value
341
+
342
+ @radiation_level.setter
343
+ def radiation_level(self, value):
344
+ hfss_extent = self._hfss_extent_info
345
+ hfss_extent.RadiationLevel = GrpcValue(value)
346
+ self._update_hfss_extent_info(hfss_extent)
347
+
348
+ @property
349
+ def sync_air_box_vertical_extent(self):
350
+ """Vertical extent of the sync air box.
351
+
352
+ Returns
353
+ -------
354
+ bool
355
+ Synchronise vertical extent.
356
+
357
+ """
358
+ return self._hfss_extent_info.sync_air_box_vertical_extent
359
+
360
+ @sync_air_box_vertical_extent.setter
361
+ def sync_air_box_vertical_extent(self, value):
362
+ hfss_extent = self._hfss_extent_info
363
+ hfss_extent.sync_air_box_vertical_extent = value
364
+ self._update_hfss_extent_info(hfss_extent)
365
+
366
+ @property
367
+ def truncate_air_box_at_ground(self):
368
+ """Truncate air box at ground.
369
+
370
+ Returns
371
+ -------
372
+ bool
373
+ Truncate air box at ground.
374
+
375
+ """
376
+ return self._hfss_extent_info.truncate_air_box_at_ground
377
+
378
+ @truncate_air_box_at_ground.setter
379
+ def truncate_air_box_at_ground(self, value):
380
+ hfss_extent = self._hfss_extent_info
381
+ hfss_extent.truncate_air_box_at_ground = value
382
+ self._update_hfss_extent_info(hfss_extent)
383
+
384
+ @property
385
+ def use_open_region(self):
386
+ """Whether using an open region is enabled.
387
+
388
+ Returns
389
+ -------
390
+ bool
391
+ Use open region.
392
+
393
+ """
394
+ return self._hfss_extent_info.use_open_region
395
+
396
+ @use_open_region.setter
397
+ def use_open_region(self, value):
398
+ hfss_extent = self._hfss_extent_info
399
+ hfss_extent.use_open_region = value
400
+ self._update_hfss_extent_info(hfss_extent)
401
+
402
+ @property
403
+ def use_xy_data_extent_for_vertical_expansion(self):
404
+ """Whether using the xy data extent for vertical expansion is enabled.
405
+
406
+ Returns
407
+ -------
408
+ bool
409
+ USe x y data extent for vertical expansion.
410
+
411
+ """
412
+ return self._hfss_extent_info.use_xy_data_extent_for_vertical_expansion
413
+
414
+ @use_xy_data_extent_for_vertical_expansion.setter
415
+ def use_xy_data_extent_for_vertical_expansion(self, value):
416
+ hfss_extent = self._hfss_extent_info
417
+ hfss_extent.use_xy_data_extent_for_vertical_expansion = value
418
+ self._update_hfss_extent_info(hfss_extent)
419
+
420
+ def load_config(self, config):
421
+ """Load HFSS extent configuration.
422
+
423
+ Parameters
424
+ ----------
425
+ config: dict
426
+ Parameters of the HFSS extent information.
427
+ """
428
+ for i, j in config.items():
429
+ if hasattr(self, i):
430
+ setattr(self, i, j)
431
+
432
+ def export_config(self):
433
+ """Export HFSS extent information.
434
+
435
+ Returns
436
+ -------
437
+ dict
438
+ Parameters of the HFSS extent information.
439
+ """
440
+ config = dict()
441
+ for i in dir(self):
442
+ if i.startswith("_"):
443
+ continue
444
+ elif i in ["load_config", "export_config"]:
445
+ continue
446
+ else:
447
+ config[i] = getattr(self, i)
448
+ return config
@@ -0,0 +1,277 @@
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
+ class LayoutStatistics(object):
25
+ """Statistics object
26
+
27
+ Object properties example.
28
+ >>> stat_model = EDBStatistics()
29
+ >>> stat_model.num_capacitors
30
+ >>> stat_model.num_resistors
31
+ >>> stat_model.num_inductors
32
+ >>> stat_model.layout_size
33
+ >>> stat_model.num_discrete_components
34
+ >>> stat_model.num_inductors
35
+ >>> stat_model.num_resistors
36
+ >>> stat_model.num_capacitors
37
+ >>> stat_model.num_nets
38
+ >>> stat_model.num_traces
39
+ >>> stat_model.num_polygons
40
+ >>> stat_model.num_vias
41
+ >>> stat_model.stackup_thickness
42
+ >>> stat_model.occupying_surface
43
+ >>> stat_model.occupying_ratio
44
+ """
45
+
46
+ def __init__(self):
47
+ self._nb_layer = 0
48
+ self._stackup_thickness = 0.0
49
+ self._nb_vias = 0
50
+ self._occupying_ratio = {}
51
+ self._occupying_surface = {}
52
+ self._layout_size = [0.0, 0.0, 0.0, 0.0]
53
+ self._nb_polygons = 0
54
+ self._nb_traces = 0
55
+ self._nb_nets = 0
56
+ self._nb_discrete_components = 0
57
+ self._nb_inductors = 0
58
+ self._nb_capacitors = 0
59
+ self._nb_resistors = 0
60
+
61
+ @property
62
+ def num_layers(self):
63
+ """Layer number.
64
+
65
+ Returns
66
+ -------
67
+ int
68
+ Number of layers.
69
+
70
+ """
71
+ return self._nb_layer
72
+
73
+ @num_layers.setter
74
+ def num_layers(self, value):
75
+ if isinstance(value, int):
76
+ self._nb_layer = value
77
+
78
+ @property
79
+ def stackup_thickness(self):
80
+ """Stackup total thickness.
81
+
82
+ Returns
83
+ -------
84
+ float
85
+ Stack up total thickness value.
86
+
87
+ """
88
+
89
+ return self._stackup_thickness
90
+
91
+ @stackup_thickness.setter
92
+ def stackup_thickness(self, value):
93
+ if isinstance(value, float):
94
+ self._stackup_thickness = value
95
+
96
+ @property
97
+ def num_vias(self):
98
+ """Via number.
99
+
100
+ Returns
101
+ -------
102
+ int
103
+ Total number of vias.
104
+
105
+ """
106
+ return self._nb_vias
107
+
108
+ @num_vias.setter
109
+ def num_vias(self, value):
110
+ if isinstance(value, int):
111
+ self._nb_vias = value
112
+
113
+ @property
114
+ def occupying_ratio(self):
115
+ """Occupying ratio.
116
+
117
+ Returns
118
+ -------
119
+ float
120
+ Occupying ration value.
121
+ Value representing metal coverage versus total layout surface.
122
+
123
+ """
124
+ return self._occupying_ratio
125
+
126
+ @occupying_ratio.setter
127
+ def occupying_ratio(self, value):
128
+ if isinstance(value, float):
129
+ self._occupying_ratio = value
130
+
131
+ @property
132
+ def occupying_surface(self):
133
+ """Occupying surface.
134
+
135
+ Returns
136
+ -------
137
+ float
138
+ Occupying surface value.
139
+
140
+ """
141
+ return self._occupying_surface
142
+
143
+ @occupying_surface.setter
144
+ def occupying_surface(self, value):
145
+ if isinstance(value, float):
146
+ self._occupying_surface = value
147
+
148
+ @property
149
+ def layout_size(self):
150
+ """Layout size.
151
+
152
+ Returns
153
+ -------
154
+ List[(float, float), (float, float)]
155
+ Layout bounding box, lower left corner (x, y) upper right corner (x, y).
156
+
157
+ """
158
+ return self._layout_size
159
+
160
+ @property
161
+ def num_polygons(self):
162
+ """Polygon number.
163
+
164
+ Returns
165
+ -------
166
+ int
167
+ Total number of polygons.
168
+
169
+ """
170
+ return self._nb_polygons
171
+
172
+ @num_polygons.setter
173
+ def num_polygons(self, value):
174
+ if isinstance(value, int):
175
+ self._nb_polygons = value
176
+
177
+ @property
178
+ def num_traces(self):
179
+ """Trace number.
180
+
181
+ Returns
182
+ -------
183
+ int
184
+ Total number of traces.
185
+
186
+ """
187
+ return self._nb_traces
188
+
189
+ @num_traces.setter
190
+ def num_traces(self, value):
191
+ if isinstance(value, int):
192
+ self._nb_traces = value
193
+
194
+ @property
195
+ def num_nets(self):
196
+ """Net number.
197
+
198
+ Returns
199
+ -------
200
+ int
201
+ Total number og nets.
202
+
203
+ """
204
+ return self._nb_nets
205
+
206
+ @num_nets.setter
207
+ def num_nets(self, value):
208
+ if isinstance(value, int):
209
+ self._nb_nets = value
210
+
211
+ @property
212
+ def num_discrete_components(self):
213
+ """Discrete component number.
214
+
215
+ Returns
216
+ -------
217
+ int
218
+ Total number of discrete components.
219
+
220
+ """
221
+ return self._nb_discrete_components
222
+
223
+ @num_discrete_components.setter
224
+ def num_discrete_components(self, value):
225
+ if isinstance(value, int):
226
+ self._nb_discrete_components = value
227
+
228
+ @property
229
+ def num_inductors(self):
230
+ """Inductor number.
231
+
232
+ Returns
233
+ -------
234
+ int
235
+ Total number of inductors.
236
+
237
+ """
238
+ return self._nb_inductors
239
+
240
+ @num_inductors.setter
241
+ def num_inductors(self, value):
242
+ if isinstance(value, int):
243
+ self._nb_inductors = value
244
+
245
+ @property
246
+ def num_capacitors(self):
247
+ """Capacitor number.
248
+
249
+ Returns
250
+ -------
251
+ int
252
+ Total number of capacitors.
253
+
254
+ """
255
+ return self._nb_capacitors
256
+
257
+ @num_capacitors.setter
258
+ def num_capacitors(self, value):
259
+ if isinstance(value, int):
260
+ self._nb_capacitors = value
261
+
262
+ @property
263
+ def num_resistors(self):
264
+ """Resistor number.
265
+
266
+ Returns
267
+ -------
268
+ int
269
+ Total number of resistors.
270
+
271
+ """
272
+ return self._nb_resistors
273
+
274
+ @num_resistors.setter
275
+ def num_resistors(self, value):
276
+ if isinstance(value, int):
277
+ self._nb_resistors = value