pyedb 0.37.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 (208) hide show
  1. pyedb/__init__.py +1 -1
  2. pyedb/common/nets.py +53 -139
  3. pyedb/configuration/cfg_common.py +1 -1
  4. pyedb/configuration/cfg_components.py +229 -201
  5. pyedb/configuration/cfg_data.py +3 -1
  6. pyedb/configuration/cfg_general.py +4 -2
  7. pyedb/configuration/cfg_modeler.py +7 -7
  8. pyedb/configuration/cfg_package_definition.py +1 -1
  9. pyedb/configuration/cfg_padstacks.py +346 -290
  10. pyedb/configuration/cfg_ports_sources.py +243 -65
  11. pyedb/configuration/configuration.py +23 -3
  12. pyedb/dotnet/{application → database}/Variables.py +21 -21
  13. pyedb/dotnet/{edb_core → database}/cell/connectable.py +5 -5
  14. pyedb/dotnet/{edb_core → database}/cell/hierarchy/component.py +11 -11
  15. pyedb/dotnet/{edb_core → database}/cell/hierarchy/hierarchy_obj.py +1 -1
  16. pyedb/dotnet/{edb_core → database}/cell/hierarchy/model.py +1 -1
  17. pyedb/dotnet/{edb_core → database}/cell/layout.py +19 -19
  18. pyedb/dotnet/{edb_core → database}/cell/layout_obj.py +3 -3
  19. pyedb/dotnet/{edb_core → database}/cell/primitive/bondwire.py +1 -1
  20. pyedb/dotnet/{edb_core → database}/cell/primitive/path.py +4 -4
  21. pyedb/dotnet/{edb_core → database}/cell/primitive/primitive.py +14 -14
  22. pyedb/dotnet/{edb_core → database}/cell/terminal/bundle_terminal.py +2 -2
  23. pyedb/dotnet/{edb_core → database}/cell/terminal/edge_terminal.py +4 -4
  24. pyedb/dotnet/{edb_core → database}/cell/terminal/padstack_instance_terminal.py +2 -2
  25. pyedb/dotnet/{edb_core → database}/cell/terminal/pingroup_terminal.py +2 -2
  26. pyedb/dotnet/{edb_core → database}/cell/terminal/point_terminal.py +2 -2
  27. pyedb/dotnet/{edb_core → database}/cell/terminal/terminal.py +11 -11
  28. pyedb/dotnet/{edb_core → database}/cell/voltage_regulator.py +2 -2
  29. pyedb/dotnet/{edb_core → database}/components.py +101 -124
  30. pyedb/dotnet/{edb_core → database}/definition/component_def.py +5 -5
  31. pyedb/dotnet/{edb_core → database}/definition/component_model.py +1 -1
  32. pyedb/dotnet/{edb_core → database}/definition/definition_obj.py +1 -1
  33. pyedb/dotnet/{edb_core → database}/definition/definitions.py +2 -2
  34. pyedb/dotnet/{edb_core → database}/definition/package_def.py +4 -4
  35. pyedb/dotnet/{edb_core → database}/dotnet/database.py +8 -8
  36. pyedb/dotnet/{edb_core → database}/dotnet/primitive.py +9 -9
  37. pyedb/dotnet/{edb_core → database}/edb_data/control_file.py +12 -12
  38. pyedb/dotnet/{edb_core → database}/edb_data/hfss_extent_info.py +7 -7
  39. pyedb/dotnet/{edb_core → database}/edb_data/nets_data.py +10 -13
  40. pyedb/dotnet/{edb_core → database}/edb_data/padstacks_data.py +60 -73
  41. pyedb/dotnet/{edb_core → database}/edb_data/ports.py +4 -4
  42. pyedb/dotnet/{edb_core → database}/edb_data/primitives_data.py +5 -5
  43. pyedb/dotnet/{edb_core → database}/edb_data/raptor_x_simulation_setup_data.py +4 -4
  44. pyedb/dotnet/{edb_core → database}/edb_data/simulation_configuration.py +10 -10
  45. pyedb/dotnet/{edb_core → database}/edb_data/sources.py +4 -4
  46. pyedb/dotnet/{edb_core → database}/edb_data/variables.py +1 -1
  47. pyedb/dotnet/{edb_core → database}/geometry/polygon_data.py +4 -4
  48. pyedb/dotnet/{edb_core → database}/hfss.py +8 -8
  49. pyedb/dotnet/{edb_core → database}/layout_obj_instance.py +1 -1
  50. pyedb/dotnet/{edb_core → database}/layout_validation.py +2 -2
  51. pyedb/dotnet/{edb_core → database}/materials.py +23 -8
  52. pyedb/dotnet/{edb_core → database}/modeler.py +27 -27
  53. pyedb/dotnet/{edb_core → database}/net_class.py +8 -8
  54. pyedb/dotnet/{edb_core → database}/nets.py +12 -12
  55. pyedb/dotnet/{edb_core → database}/padstack.py +17 -16
  56. pyedb/dotnet/{edb_core → database}/sim_setup_data/data/mesh_operation.py +1 -1
  57. pyedb/dotnet/{edb_core → database}/sim_setup_data/data/settings.py +18 -3
  58. pyedb/dotnet/{edb_core → database}/sim_setup_data/data/sim_setup_info.py +2 -2
  59. pyedb/dotnet/{edb_core → database}/sim_setup_data/data/simulation_settings.py +1 -1
  60. pyedb/dotnet/{edb_core → database}/sim_setup_data/data/siw_dc_ir_settings.py +1 -1
  61. pyedb/dotnet/{edb_core → database}/sim_setup_data/data/sweep_data.py +4 -4
  62. pyedb/dotnet/{edb_core → database}/siwave.py +10 -10
  63. pyedb/dotnet/{edb_core → database}/stackup.py +12 -12
  64. pyedb/dotnet/{edb_core → database}/utilities/hfss_simulation_setup.py +15 -15
  65. pyedb/dotnet/{edb_core → database}/utilities/obj_base.py +1 -1
  66. pyedb/dotnet/{edb_core → database}/utilities/simulation_setup.py +4 -3
  67. pyedb/dotnet/{edb_core → database}/utilities/siwave_simulation_setup.py +6 -6
  68. pyedb/dotnet/edb.py +118 -113
  69. pyedb/extensions/pre_layout_design_toolkit/via_design.py +1151 -0
  70. pyedb/generic/design_types.py +26 -19
  71. pyedb/generic/general_methods.py +1 -1
  72. pyedb/generic/plot.py +0 -2
  73. pyedb/grpc/database/__init__.py +1 -0
  74. pyedb/grpc/database/components.py +2354 -0
  75. pyedb/grpc/database/control_file.py +1277 -0
  76. pyedb/grpc/database/definition/component_def.py +218 -0
  77. pyedb/grpc/database/definition/component_model.py +39 -0
  78. pyedb/grpc/database/definition/component_pin.py +32 -0
  79. pyedb/grpc/database/definition/materials.py +1207 -0
  80. pyedb/grpc/database/definition/n_port_component_model.py +34 -0
  81. pyedb/grpc/database/definition/package_def.py +227 -0
  82. pyedb/grpc/database/definition/padstack_def.py +842 -0
  83. pyedb/grpc/database/definitions.py +70 -0
  84. pyedb/grpc/database/general.py +43 -0
  85. pyedb/grpc/database/geometry/__init__.py +0 -0
  86. pyedb/grpc/database/geometry/arc_data.py +93 -0
  87. pyedb/grpc/database/geometry/point_3d_data.py +79 -0
  88. pyedb/grpc/database/geometry/point_data.py +30 -0
  89. pyedb/grpc/database/geometry/polygon_data.py +133 -0
  90. pyedb/grpc/database/hfss.py +1279 -0
  91. pyedb/grpc/database/hierarchy/__init__.py +0 -0
  92. pyedb/grpc/database/hierarchy/component.py +1301 -0
  93. pyedb/grpc/database/hierarchy/model.py +31 -0
  94. pyedb/grpc/database/hierarchy/netlist_model.py +30 -0
  95. pyedb/grpc/database/hierarchy/pin_pair_model.py +128 -0
  96. pyedb/grpc/database/hierarchy/pingroup.py +245 -0
  97. pyedb/grpc/database/hierarchy/s_parameter_model.py +33 -0
  98. pyedb/grpc/database/hierarchy/spice_model.py +48 -0
  99. pyedb/grpc/database/layers/__init__.py +0 -0
  100. pyedb/grpc/database/layers/layer.py +57 -0
  101. pyedb/grpc/database/layers/stackup_layer.py +410 -0
  102. pyedb/grpc/database/layout/__init__.py +0 -0
  103. pyedb/grpc/database/layout/cell.py +30 -0
  104. pyedb/grpc/database/layout/layout.py +196 -0
  105. pyedb/grpc/database/layout/voltage_regulator.py +149 -0
  106. pyedb/grpc/database/layout_validation.py +319 -0
  107. pyedb/grpc/database/modeler.py +1468 -0
  108. pyedb/grpc/database/net/__init__.py +0 -0
  109. pyedb/grpc/database/net/differential_pair.py +138 -0
  110. pyedb/grpc/database/net/extended_net.py +340 -0
  111. pyedb/grpc/database/net/net.py +198 -0
  112. pyedb/grpc/database/net/net_class.py +93 -0
  113. pyedb/grpc/database/nets.py +633 -0
  114. pyedb/grpc/database/padstacks.py +1500 -0
  115. pyedb/grpc/database/ports/__init__.py +0 -0
  116. pyedb/grpc/database/ports/ports.py +396 -0
  117. pyedb/grpc/database/primitive/__init__.py +3 -0
  118. pyedb/grpc/database/primitive/bondwire.py +181 -0
  119. pyedb/grpc/database/primitive/circle.py +75 -0
  120. pyedb/grpc/database/primitive/padstack_instance.py +1116 -0
  121. pyedb/grpc/database/primitive/path.py +346 -0
  122. pyedb/grpc/database/primitive/polygon.py +276 -0
  123. pyedb/grpc/database/primitive/primitive.py +739 -0
  124. pyedb/grpc/database/primitive/rectangle.py +146 -0
  125. pyedb/grpc/database/simulation_setup/__init__.py +0 -0
  126. pyedb/grpc/database/simulation_setup/adaptive_frequency.py +33 -0
  127. pyedb/grpc/database/simulation_setup/hfss_advanced_meshing_settings.py +32 -0
  128. pyedb/grpc/database/simulation_setup/hfss_advanced_settings.py +59 -0
  129. pyedb/grpc/database/simulation_setup/hfss_dcr_settings.py +35 -0
  130. pyedb/grpc/database/simulation_setup/hfss_general_settings.py +61 -0
  131. pyedb/grpc/database/simulation_setup/hfss_settings_options.py +78 -0
  132. pyedb/grpc/database/simulation_setup/hfss_simulation_settings.py +118 -0
  133. pyedb/grpc/database/simulation_setup/hfss_simulation_setup.py +355 -0
  134. pyedb/grpc/database/simulation_setup/hfss_solver_settings.py +34 -0
  135. pyedb/grpc/database/simulation_setup/mesh_operation.py +34 -0
  136. pyedb/grpc/database/simulation_setup/raptor_x_advanced_settings.py +34 -0
  137. pyedb/grpc/database/simulation_setup/raptor_x_general_settings.py +33 -0
  138. pyedb/grpc/database/simulation_setup/raptor_x_simulation_settings.py +64 -0
  139. pyedb/grpc/database/simulation_setup/raptor_x_simulation_setup.py +125 -0
  140. pyedb/grpc/database/simulation_setup/siwave_dcir_simulation_setup.py +34 -0
  141. pyedb/grpc/database/simulation_setup/siwave_simulation_setup.py +119 -0
  142. pyedb/grpc/database/simulation_setup/sweep_data.py +32 -0
  143. pyedb/grpc/database/siwave.py +1023 -0
  144. pyedb/grpc/database/source_excitations.py +2572 -0
  145. pyedb/grpc/database/stackup.py +2574 -0
  146. pyedb/grpc/database/terminal/__init__.py +0 -0
  147. pyedb/grpc/database/terminal/bundle_terminal.py +218 -0
  148. pyedb/grpc/database/terminal/edge_terminal.py +51 -0
  149. pyedb/grpc/database/terminal/padstack_instance_terminal.py +171 -0
  150. pyedb/grpc/database/terminal/pingroup_terminal.py +162 -0
  151. pyedb/grpc/database/terminal/point_terminal.py +99 -0
  152. pyedb/grpc/database/terminal/terminal.py +470 -0
  153. pyedb/grpc/database/utility/__init__.py +3 -0
  154. pyedb/grpc/database/utility/constants.py +25 -0
  155. pyedb/grpc/database/utility/heat_sink.py +124 -0
  156. pyedb/grpc/database/utility/hfss_extent_info.py +448 -0
  157. pyedb/grpc/database/utility/layout_statistics.py +277 -0
  158. pyedb/grpc/database/utility/rlc.py +80 -0
  159. pyedb/grpc/database/utility/simulation_configuration.py +3305 -0
  160. pyedb/grpc/database/utility/sources.py +388 -0
  161. pyedb/grpc/database/utility/sweep_data_distribution.py +83 -0
  162. pyedb/grpc/database/utility/xml_control_file.py +1277 -0
  163. pyedb/grpc/edb.py +4151 -0
  164. pyedb/grpc/edb_init.py +481 -0
  165. pyedb/grpc/rpc_session.py +177 -0
  166. pyedb/ipc2581/ecad/cad_data/assembly_drawing.py +3 -2
  167. pyedb/ipc2581/ecad/cad_data/feature.py +4 -3
  168. pyedb/ipc2581/ecad/cad_data/layer_feature.py +32 -20
  169. pyedb/ipc2581/ecad/cad_data/outline.py +3 -2
  170. pyedb/ipc2581/ecad/cad_data/package.py +4 -3
  171. pyedb/ipc2581/ecad/cad_data/path.py +82 -31
  172. pyedb/ipc2581/ecad/cad_data/polygon.py +122 -60
  173. pyedb/ipc2581/ecad/cad_data/profile.py +13 -12
  174. pyedb/ipc2581/ecad/cad_data/step.py +52 -20
  175. pyedb/ipc2581/ipc2581.py +47 -49
  176. pyedb/modeler/geometry_operators.py +1 -1
  177. {pyedb-0.37.0.dist-info → pyedb-0.39.0.dist-info}/METADATA +9 -6
  178. pyedb-0.39.0.dist-info/RECORD +288 -0
  179. pyedb-0.37.0.dist-info/RECORD +0 -194
  180. /pyedb/dotnet/{edb_core → database}/__init__.py +0 -0
  181. /pyedb/dotnet/{application → database/cell}/__init__.py +0 -0
  182. /pyedb/dotnet/{edb_core/cell → database/cell/hierarchy}/__init__.py +0 -0
  183. /pyedb/dotnet/{edb_core → database}/cell/hierarchy/netlist_model.py +0 -0
  184. /pyedb/dotnet/{edb_core → database}/cell/hierarchy/pin_pair_model.py +0 -0
  185. /pyedb/dotnet/{edb_core → database}/cell/hierarchy/s_parameter_model.py +0 -0
  186. /pyedb/dotnet/{edb_core → database}/cell/hierarchy/spice_model.py +0 -0
  187. /pyedb/dotnet/{edb_core → database}/cell/primitive/__init__.py +0 -0
  188. /pyedb/dotnet/{edb_core/cell/hierarchy → database/cell/terminal}/__init__.py +0 -0
  189. /pyedb/dotnet/{edb_core/cell/terminal → database/definition}/__init__.py +0 -0
  190. /pyedb/dotnet/{edb_core/definition → database/dotnet}/__init__.py +0 -0
  191. /pyedb/dotnet/{edb_core/dotnet → database/edb_data}/__init__.py +0 -0
  192. /pyedb/dotnet/{edb_core → database}/edb_data/design_options.py +0 -0
  193. /pyedb/dotnet/{edb_core → database}/edb_data/edbvalue.py +0 -0
  194. /pyedb/dotnet/{edb_core → database}/edb_data/layer_data.py +0 -0
  195. /pyedb/dotnet/{edb_core → database}/edb_data/utilities.py +0 -0
  196. /pyedb/dotnet/{edb_core → database}/general.py +0 -0
  197. /pyedb/dotnet/{edb_core/edb_data → database/geometry}/__init__.py +0 -0
  198. /pyedb/dotnet/{edb_core → database}/geometry/point_data.py +0 -0
  199. /pyedb/dotnet/{edb_core → database}/sim_setup_data/__init__.py +0 -0
  200. /pyedb/dotnet/{edb_core → database}/sim_setup_data/data/__init__.py +0 -0
  201. /pyedb/dotnet/{edb_core → database}/sim_setup_data/data/adaptive_frequency_data.py +0 -0
  202. /pyedb/dotnet/{edb_core/geometry → database/sim_setup_data/io}/__init__.py +0 -0
  203. /pyedb/dotnet/{edb_core → database}/sim_setup_data/io/siwave.py +0 -0
  204. /pyedb/dotnet/{edb_core → database}/utilities/__init__.py +0 -0
  205. /pyedb/dotnet/{edb_core → database}/utilities/heatsink.py +0 -0
  206. /pyedb/{dotnet/edb_core/sim_setup_data/io → grpc/database/definition}/__init__.py +0 -0
  207. {pyedb-0.37.0.dist-info → pyedb-0.39.0.dist-info}/LICENSE +0 -0
  208. {pyedb-0.37.0.dist-info → pyedb-0.39.0.dist-info}/WHEEL +0 -0
@@ -0,0 +1,410 @@
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 __future__ import absolute_import
24
+
25
+ from ansys.edb.core.layer.layer import LayerType as GrpcLayerType
26
+ from ansys.edb.core.layer.stackup_layer import RoughnessRegion as GrpcRoughnessRegion
27
+ from ansys.edb.core.layer.stackup_layer import StackupLayer as GrpcStackupLayer
28
+ from ansys.edb.core.utility.value import Value as GrpcValue
29
+
30
+
31
+ class StackupLayer(GrpcStackupLayer):
32
+ def __init__(self, pedb, edb_object=None):
33
+ super().__init__(edb_object.msg)
34
+ self._pedb = pedb
35
+ self._edb_object = edb_object
36
+
37
+ @property
38
+ def _stackup_layer_mapping(self):
39
+ return {
40
+ "conducting_layer": GrpcLayerType.CONDUCTING_LAYER,
41
+ "silkscreen_layer": GrpcLayerType.SILKSCREEN_LAYER,
42
+ "solder_mask_layer": GrpcLayerType.SOLDER_MASK_LAYER,
43
+ "solder_paste_layer": GrpcLayerType.SOLDER_PASTE_LAYER,
44
+ "glue_layer": GrpcLayerType.GLUE_LAYER,
45
+ "wirebond_layer": GrpcLayerType.WIREBOND_LAYER,
46
+ "user_layer": GrpcLayerType.USER_LAYER,
47
+ "siwave_hfss_solver_regions": GrpcLayerType.SIWAVE_HFSS_SOLVER_REGIONS,
48
+ }
49
+
50
+ @property
51
+ def type(self):
52
+ """Layer type.
53
+
54
+ Returns
55
+ -------
56
+ str
57
+ Layer name.
58
+ """
59
+ return super().type.name.lower()
60
+
61
+ @type.setter
62
+ def type(self, value):
63
+ if value in self._stackup_layer_mapping:
64
+ super(StackupLayer, self.__class__).type.__set__(self, self._stackup_layer_mapping[value])
65
+
66
+ def _create(self, layer_type):
67
+ if layer_type in self._stackup_layer_mapping:
68
+ layer_type = self._stackup_layer_mapping[layer_type]
69
+ self._edb_object = GrpcStackupLayer.create(
70
+ self._name,
71
+ layer_type,
72
+ GrpcValue(0),
73
+ GrpcValue(0),
74
+ "copper",
75
+ )
76
+
77
+ @property
78
+ def lower_elevation(self):
79
+ """Lower elevation.
80
+
81
+ Returns
82
+ -------
83
+ float
84
+ Lower elevation.
85
+ """
86
+ return round(super().lower_elevation.value, 9)
87
+
88
+ @lower_elevation.setter
89
+ def lower_elevation(self, value):
90
+ if self._pedb.stackup.mode == "overlapping":
91
+ super(StackupLayer, self.__class__).lower_elevation.__set__(self, GrpcValue(value))
92
+
93
+ @property
94
+ def fill_material(self):
95
+ """The layer's fill material.
96
+
97
+ Returns
98
+ -------
99
+ str
100
+ Material name.
101
+ """
102
+ if self.is_stackup_layer:
103
+ return self.get_fill_material()
104
+
105
+ @fill_material.setter
106
+ def fill_material(self, value):
107
+ if self.is_stackup_layer:
108
+ self.set_fill_material(value)
109
+
110
+ @property
111
+ def upper_elevation(self):
112
+ """Upper elevation.
113
+
114
+ Returns
115
+ -------
116
+ float
117
+ Upper elevation.
118
+ """
119
+ return round(super().upper_elevation.value, 9)
120
+
121
+ @property
122
+ def is_negative(self):
123
+ """Determine whether this layer is a negative layer.
124
+
125
+ Returns
126
+ -------
127
+ bool
128
+ True if this layer is a negative layer, False otherwise.
129
+ """
130
+ return self.negative
131
+
132
+ @is_negative.setter
133
+ def is_negative(self, value):
134
+ """Layer negative.
135
+
136
+ Returns
137
+ -------
138
+ bool
139
+
140
+ """
141
+ self.negative = value
142
+
143
+ @property
144
+ def material(self):
145
+ """Material.
146
+
147
+ Returns
148
+ -------
149
+ str
150
+ Material name.
151
+ """
152
+ return self.get_material()
153
+
154
+ @material.setter
155
+ def material(self, name):
156
+ self.set_material(name)
157
+
158
+ @property
159
+ def conductivity(self):
160
+ """Material conductivity.
161
+
162
+ Returns
163
+ -------
164
+ float
165
+ Material conductivity value.
166
+ """
167
+ if self.material in self._pedb.materials.materials:
168
+ return self._pedb.materials[self.material].conductivity
169
+ return None
170
+
171
+ @property
172
+ def permittivity(self):
173
+ """Material permittivity.
174
+
175
+ Returns
176
+ -------
177
+ float
178
+ Material permittivity value.
179
+ """
180
+ if self.material in self._pedb.materials.materials:
181
+ return self._pedb.materials[self.material].permittivity
182
+ return None
183
+
184
+ @property
185
+ def loss_tangent(self):
186
+ """Material loss_tangent.
187
+
188
+ Returns
189
+ -------
190
+ float
191
+ Material loss tangent value.
192
+ """
193
+ if self.material in self._pedb.materials.materials:
194
+ return self._pedb.materials[self.material].loss_tangent
195
+ return None
196
+
197
+ @property
198
+ def dielectric_fill(self):
199
+ """Material name of the layer dielectric fill.
200
+
201
+ Returns
202
+ -------
203
+ str
204
+ Material name.
205
+ """
206
+ if self.type == "signal":
207
+ return self.get_fill_material()
208
+ else:
209
+ return
210
+
211
+ @dielectric_fill.setter
212
+ def dielectric_fill(self, name):
213
+ if self.type == "signal":
214
+ self.set_fill_material(name)
215
+ else:
216
+ pass
217
+
218
+ @property
219
+ def thickness(self):
220
+ """Layer thickness.
221
+
222
+ Returns
223
+ -------
224
+ float
225
+ Layer thickness.
226
+ """
227
+ return round(super().thickness.value, 9)
228
+
229
+ @thickness.setter
230
+ def thickness(self, value):
231
+ super(StackupLayer, self.__class__).thickness.__set__(self, GrpcValue(value))
232
+
233
+ @property
234
+ def etch_factor(self):
235
+ """Layer etching factor.
236
+
237
+ Returns
238
+ -------
239
+ float
240
+ Etching factor value.
241
+ """
242
+ return super().etch_factor.value
243
+
244
+ @etch_factor.setter
245
+ def etch_factor(self, value):
246
+ if not value:
247
+ self.etch_factor_enabled = False
248
+ else:
249
+ self.etch_factor_enabled = True
250
+ super(StackupLayer, self.__class__).etch_factor.__set__(self, GrpcValue(value))
251
+
252
+ @property
253
+ def top_hallhuray_nodule_radius(self):
254
+ """Huray model nodule radius on layer top.
255
+
256
+ Returns
257
+ -------
258
+ float
259
+ Nodule radius value.
260
+ """
261
+ top_roughness_model = self.get_roughness_model(GrpcRoughnessRegion.TOP)
262
+ if top_roughness_model:
263
+ return top_roughness_model.nodule_radius.value
264
+ else:
265
+ return None
266
+
267
+ @top_hallhuray_nodule_radius.setter
268
+ def top_hallhuray_nodule_radius(self, value):
269
+ top_roughness_model = self.get_roughness_model(GrpcRoughnessRegion.TOP)
270
+ top_roughness_model.nodule_radius = GrpcValue(value)
271
+
272
+ @property
273
+ def top_hallhuray_surface_ratio(self):
274
+ """Huray model surface ratio on layer top.
275
+
276
+ Returns
277
+ -------
278
+ float
279
+ Surface ratio.
280
+ """
281
+ top_roughness_model = self.get_roughness_model(GrpcRoughnessRegion.TOP)
282
+ if top_roughness_model:
283
+ return top_roughness_model.surface_ratio.value
284
+ else:
285
+ return None
286
+
287
+ @top_hallhuray_surface_ratio.setter
288
+ def top_hallhuray_surface_ratio(self, value):
289
+ top_roughness_model = self.get_roughness_model(GrpcRoughnessRegion.TOP)
290
+ top_roughness_model.surface_roughness = GrpcValue(value)
291
+
292
+ @property
293
+ def bottom_hallhuray_nodule_radius(self):
294
+ """Huray model nodule radius on layer bottom.
295
+
296
+ Returns
297
+ -------
298
+ float
299
+ Nodule radius.
300
+ """
301
+ bottom_roughness_model = self.get_roughness_model(GrpcRoughnessRegion.BOTTOM)
302
+ if bottom_roughness_model:
303
+ return bottom_roughness_model.nodule_radius.value
304
+ return None
305
+
306
+ @bottom_hallhuray_nodule_radius.setter
307
+ def bottom_hallhuray_nodule_radius(self, value):
308
+ top_roughness_model = self.get_roughness_model(GrpcRoughnessRegion.BOTTOM)
309
+ top_roughness_model.nodule_radius = GrpcValue(value)
310
+
311
+ @property
312
+ def bottom_hallhuray_surface_ratio(self):
313
+ """Huray model surface ratio on layer bottom.
314
+
315
+ Returns
316
+ -------
317
+ float
318
+ Surface ratio value.
319
+ """
320
+ bottom_roughness_model = self.get_roughness_model(GrpcRoughnessRegion.BOTTOM)
321
+ if bottom_roughness_model:
322
+ return bottom_roughness_model.surface_ratio.value
323
+ return None
324
+
325
+ @bottom_hallhuray_surface_ratio.setter
326
+ def bottom_hallhuray_surface_ratio(self, value):
327
+ top_roughness_model = self.get_roughness_model(GrpcRoughnessRegion.BOTTOM)
328
+ top_roughness_model.surface_ratio = GrpcValue(value)
329
+
330
+ @property
331
+ def side_hallhuray_nodule_radius(self):
332
+ """Huray model nodule radius on layer sides.
333
+
334
+ Returns
335
+ -------
336
+ float
337
+ Nodule radius value.
338
+
339
+ """
340
+ side_roughness_model = self.get_roughness_model(GrpcRoughnessRegion.SIDE)
341
+ if side_roughness_model:
342
+ return side_roughness_model.nodule_radius.value
343
+ return None
344
+
345
+ @side_hallhuray_nodule_radius.setter
346
+ def side_hallhuray_nodule_radius(self, value):
347
+ top_roughness_model = self.get_roughness_model(GrpcRoughnessRegion.SIDE)
348
+ top_roughness_model.nodule_radius = GrpcValue(value)
349
+
350
+ @property
351
+ def side_hallhuray_surface_ratio(self):
352
+ """Huray model surface ratio on layer sides.
353
+
354
+ Returns
355
+ -------
356
+ float
357
+ surface ratio.
358
+ """
359
+ side_roughness_model = self.get_roughness_model(GrpcRoughnessRegion.SIDE)
360
+ if side_roughness_model:
361
+ return side_roughness_model.surface_ratio.value
362
+ else:
363
+ return None
364
+
365
+ @side_hallhuray_surface_ratio.setter
366
+ def side_hallhuray_surface_ratio(self, value):
367
+ top_roughness_model = self.get_roughness_model(GrpcRoughnessRegion.SIDE)
368
+ top_roughness_model.surface_ratio = GrpcValue(value)
369
+
370
+ def assign_roughness_model(
371
+ self,
372
+ model_type="huray",
373
+ huray_radius="0.5um",
374
+ huray_surface_ratio="2.9",
375
+ groisse_roughness="1um",
376
+ apply_on_surface="all",
377
+ ):
378
+ """Assign roughness model on this layer.
379
+
380
+ Parameters
381
+ ----------
382
+ model_type : str, optional
383
+ Type of roughness model. The default is ``"huray"``. Options are ``"huray"``, ``"groisse"``.
384
+ huray_radius : str, float, optional
385
+ Radius of huray model. The default is ``"0.5um"``.
386
+ huray_surface_ratio : str, float, optional.
387
+ Surface ratio of huray model. The default is ``"2.9"``.
388
+ groisse_roughness : str, float, optional
389
+ Roughness of groisse model. The default is ``"1um"``.
390
+ apply_on_surface : str, optional.
391
+ Where to assign roughness model. The default is ``"all"``. Options are ``"top"``, ``"bottom"``,
392
+ ``"side"``.
393
+
394
+ """
395
+ regions = []
396
+ if apply_on_surface == "all":
397
+ regions = [GrpcRoughnessRegion.TOP, GrpcRoughnessRegion.BOTTOM, GrpcRoughnessRegion.SIDE]
398
+ elif apply_on_surface == "top":
399
+ regions = [GrpcRoughnessRegion.TOP]
400
+ elif apply_on_surface == "bottom":
401
+ regions = [GrpcRoughnessRegion.BOTTOM]
402
+ elif apply_on_surface == "side":
403
+ regions = [GrpcRoughnessRegion.BOTTOM]
404
+ self.roughness_enabled = True
405
+ for r in regions:
406
+ if model_type == "huray":
407
+ model = (GrpcValue(huray_radius), GrpcValue(huray_surface_ratio))
408
+ else:
409
+ model = GrpcValue(groisse_roughness)
410
+ self.set_roughness_model(model, r)
File without changes
@@ -0,0 +1,30 @@
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.layout.cell import Cell as GrpcCell
24
+
25
+
26
+ class Cell(GrpcCell):
27
+ """Manage :class:`Cell <ansys.edb.core.layout.cell.Cell>`"""
28
+
29
+ def __init__(self, pedb, edb_object):
30
+ super().__init__(edb_object)
@@ -0,0 +1,196 @@
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
+ This module contains these classes: `EdbLayout` and `Shape`.
25
+ """
26
+ from typing import Union
27
+
28
+ from ansys.edb.core.layout.layout import Layout as GrpcLayout
29
+
30
+ from pyedb.grpc.database.hierarchy.component import Component
31
+ from pyedb.grpc.database.hierarchy.pingroup import PinGroup
32
+ from pyedb.grpc.database.layout.voltage_regulator import VoltageRegulator
33
+ from pyedb.grpc.database.net.differential_pair import DifferentialPair
34
+ from pyedb.grpc.database.net.extended_net import ExtendedNet
35
+ from pyedb.grpc.database.net.net import Net
36
+ from pyedb.grpc.database.net.net_class import NetClass
37
+ from pyedb.grpc.database.primitive.padstack_instance import PadstackInstance
38
+ from pyedb.grpc.database.terminal.bundle_terminal import BundleTerminal
39
+ from pyedb.grpc.database.terminal.edge_terminal import EdgeTerminal
40
+ from pyedb.grpc.database.terminal.padstack_instance_terminal import (
41
+ PadstackInstanceTerminal,
42
+ )
43
+ from pyedb.grpc.database.terminal.pingroup_terminal import PinGroupTerminal
44
+ from pyedb.grpc.database.terminal.point_terminal import PointTerminal
45
+
46
+
47
+ class Layout(GrpcLayout):
48
+ """Manage Layout class."""
49
+
50
+ def __init__(self, pedb):
51
+ super().__init__(pedb.active_cell._Cell__stub.GetLayout(pedb.active_cell.msg))
52
+ self._pedb = pedb
53
+
54
+ @property
55
+ def cell(self):
56
+ """:class:`Cell <ansys.edb.core.layout.cel.Cell>`: Owning cell for this layout.
57
+
58
+ Read-Only.
59
+ """
60
+ return self._pedb._active_cell
61
+
62
+ @property
63
+ def terminals(self):
64
+ """Get terminals belonging to active layout.
65
+
66
+ Returns
67
+ -------
68
+ Terminal dictionary : Dict[str, :class:`Terminal <pyedb.grpc.database.terminal.Terminal>`]
69
+ Dictionary of terminals.
70
+ """
71
+ temp = []
72
+ for i in self._pedb.active_cell.layout.terminals:
73
+ if i.type.name.lower() == "pin_group":
74
+ temp.append(PinGroupTerminal(self._pedb, i))
75
+ elif i.type.name.lower() == "padstack_inst":
76
+ temp.append(PadstackInstanceTerminal(self._pedb, i))
77
+ elif i.type.name.lower() == "edge":
78
+ temp.append(EdgeTerminal(self._pedb, i))
79
+ elif i.type.name.lower() == "bundle":
80
+ temp.append(BundleTerminal(self._pedb, i))
81
+ elif i.type.name.lower() == "point":
82
+ temp.append(PointTerminal(self._pedb, i))
83
+ return temp
84
+
85
+ @property
86
+ def nets(self):
87
+ """Nets.
88
+
89
+ Returns
90
+ -------
91
+ List[:class:`Net <pyedb.grpc.database.net.net.Net>`]
92
+ List of Net.
93
+ """
94
+ return [Net(self._pedb, net) for net in super().nets]
95
+
96
+ @property
97
+ def bondwires(self):
98
+ """Bondwires.
99
+
100
+ Returns
101
+ -------
102
+ list [:class:`pyedb.grpc.database.primitive.primitive.Primitive`]:
103
+ List of bondwires.
104
+ """
105
+ return [i for i in self.primitives if i.primitive_type == "bondwire"]
106
+
107
+ @property
108
+ def groups(self):
109
+ """Groups
110
+
111
+ Returns
112
+ -------
113
+ List[:class:`Group <pyedb.grpc.database.hierarch.component.Component>`].
114
+ List of Component.
115
+
116
+ """
117
+ return [Component(self._pedb, g) for g in self._pedb.active_cell.layout.groups]
118
+
119
+ @property
120
+ def pin_groups(self):
121
+ """Pin groups.
122
+
123
+ Returns
124
+ -------
125
+ List[:class:`PinGroup <pyedb.grpc.database.hierarchy.pingroup.PinGroup>`]
126
+ List of PinGroup.
127
+
128
+ """
129
+ return [PinGroup(self._pedb, i) for i in self._pedb.active_cell.layout.pin_groups]
130
+
131
+ @property
132
+ def net_classes(self):
133
+ """Net classes.
134
+
135
+ Returns
136
+ -------
137
+ List[:class:`NetClass <pyedb.grpc.database.net.net_class.NetClass>`]
138
+ List of NetClass.
139
+
140
+ """
141
+ return [NetClass(self._pedb, i) for i in self._pedb.active_cell.layout.net_classes]
142
+
143
+ @property
144
+ def extended_nets(self):
145
+ """Extended nets.
146
+
147
+ Returns
148
+ -------
149
+ List[:class:`ExtendedNet <pyedb.grpc.database.net.extended_net.ExtendedNet>`]
150
+ List of extended nets.
151
+ """
152
+
153
+ return [ExtendedNet(self._pedb, i) for i in self._pedb.active_cell.layout.extended_nets]
154
+
155
+ @property
156
+ def differential_pairs(self):
157
+ """Differential pairs.
158
+
159
+ Returns
160
+ -------
161
+ List[:class:`DifferentialPair <pyedb.grpc.database.net.differential_pair.DifferentialPair>`
162
+ List of DifferentialPair.
163
+
164
+ """
165
+ return [DifferentialPair(self._pedb, i) for i in self._pedb.active_cell.layout.differential_pairs]
166
+
167
+ @property
168
+ def padstack_instances(self):
169
+ """Get all padstack instances in a list."""
170
+ return [PadstackInstance(self._pedb, i) for i in self._pedb.active_cell.layout.padstack_instances]
171
+
172
+ #
173
+ @property
174
+ def voltage_regulators(self):
175
+ """Voltage regulators.
176
+
177
+ List[:class:`VoltageRegulator <pyedb.grpc.database.layout.voltage_regulator.VoltageRegulator>`.
178
+ List of VoltageRegulator.
179
+
180
+ """
181
+ return [VoltageRegulator(self._pedb, i) for i in self._pedb.active_cell.layout.voltage_regulators]
182
+
183
+ def find_primitive(self, layer_name: Union[str, list]) -> list:
184
+ """Find a primitive objects by layer name.
185
+
186
+ Parameters
187
+ ----------
188
+ layer_name : str, list
189
+ Name of the layer.
190
+ Returns
191
+ -------
192
+ List[:class:`Primitive <pyedb.grpc.database.primitive.primitive.Primitive`].
193
+ List of Primitive.
194
+ """
195
+ layer_name = layer_name if isinstance(layer_name, list) else [layer_name]
196
+ return [i for i in self.primitives if i.layer.name in layer_name]