pyedb 0.15.dev0__py3-none-any.whl → 0.17.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 (42) hide show
  1. pyedb/__init__.py +1 -1
  2. pyedb/configuration/cfg_common.py +1 -3
  3. pyedb/configuration/cfg_components.py +49 -5
  4. pyedb/configuration/cfg_data.py +3 -6
  5. pyedb/configuration/cfg_package_definition.py +3 -5
  6. pyedb/configuration/cfg_setup.py +214 -176
  7. pyedb/configuration/cfg_stackup.py +4 -4
  8. pyedb/configuration/configuration.py +9 -5
  9. pyedb/dotnet/edb.py +64 -44
  10. pyedb/dotnet/edb_core/cell/__init__.py +0 -0
  11. pyedb/dotnet/edb_core/cell/hierarchy/component.py +12 -17
  12. pyedb/dotnet/edb_core/cell/hierarchy/hierarchy_obj.py +50 -0
  13. pyedb/dotnet/edb_core/cell/layout.py +0 -6
  14. pyedb/dotnet/edb_core/cell/voltage_regulator.py +143 -0
  15. pyedb/dotnet/edb_core/components.py +2 -2
  16. pyedb/dotnet/edb_core/dotnet/primitive.py +129 -3
  17. pyedb/dotnet/edb_core/edb_data/hfss_pi_simulation_setup_data.py +0 -460
  18. pyedb/dotnet/edb_core/edb_data/primitives_data.py +38 -38
  19. pyedb/dotnet/edb_core/edb_data/raptor_x_simulation_setup_data.py +1 -1
  20. pyedb/dotnet/edb_core/layout.py +25 -1
  21. pyedb/dotnet/edb_core/layout_validation.py +26 -0
  22. pyedb/dotnet/edb_core/nets.py +1 -1
  23. pyedb/dotnet/edb_core/sim_setup_data/data/mesh_operation.py +63 -49
  24. pyedb/dotnet/edb_core/sim_setup_data/data/settings.py +1 -1
  25. pyedb/dotnet/edb_core/sim_setup_data/data/sim_setup_info.py +81 -0
  26. pyedb/dotnet/edb_core/sim_setup_data/data/simulation_settings.py +424 -0
  27. pyedb/dotnet/edb_core/sim_setup_data/data/sweep_data.py +131 -96
  28. pyedb/dotnet/edb_core/siwave.py +63 -0
  29. pyedb/dotnet/edb_core/utilities/hfss_simulation_setup.py +469 -0
  30. pyedb/dotnet/edb_core/utilities/simulation_setup.py +112 -773
  31. pyedb/dotnet/edb_core/utilities/siwave_simulation_setup.py +369 -0
  32. pyedb/misc/siw_feature_config/xtalk_scan/fd_xtalk_scan_config.py +91 -0
  33. pyedb/misc/siw_feature_config/xtalk_scan/impedance_scan_config.py +70 -0
  34. pyedb/misc/siw_feature_config/xtalk_scan/net.py +69 -0
  35. pyedb/misc/siw_feature_config/xtalk_scan/pins.py +60 -0
  36. pyedb/misc/siw_feature_config/xtalk_scan/scan_config.py +88 -0
  37. pyedb/misc/siw_feature_config/xtalk_scan/td_xtalk_config.py +104 -0
  38. pyedb/workflow.py +32 -0
  39. {pyedb-0.15.dev0.dist-info → pyedb-0.17.0.dist-info}/METADATA +1 -1
  40. {pyedb-0.15.dev0.dist-info → pyedb-0.17.0.dist-info}/RECORD +42 -28
  41. {pyedb-0.15.dev0.dist-info → pyedb-0.17.0.dist-info}/LICENSE +0 -0
  42. {pyedb-0.15.dev0.dist-info → pyedb-0.17.0.dist-info}/WHEEL +0 -0
@@ -0,0 +1,424 @@
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 BaseSimulationSettings:
25
+ def __init__(self, pedb, sim_setup, edb_object):
26
+ self._pedb = pedb
27
+ self.sim_setup = sim_setup
28
+ self._edb_object = edb_object
29
+ self.t_sim_setup_type = {
30
+ "kHFSS": self._pedb.simsetupdata.HFSSSimulationSettings,
31
+ "kPEM": None,
32
+ "kSIwave": self._pedb.simsetupdata.SIwave.SIWSimulationSettings,
33
+ "kLNA": None,
34
+ "kTransient": None,
35
+ "kQEye": None,
36
+ "kVEye": None,
37
+ "kAMI": None,
38
+ "kAnalysisOption": None,
39
+ "kSIwaveDCIR": self._pedb.simsetupdata.SIwave.SIWDCIRSimulationSettings,
40
+ "kSIwaveEMI": None,
41
+ "kHFSSPI": None,
42
+ "kDDRwizard": None,
43
+ "kQ3D": None,
44
+ "kNumSetupTypes": None,
45
+ }
46
+
47
+ @property
48
+ def enabled(self):
49
+ return self._edb_object.Enabled
50
+
51
+ @enabled.setter
52
+ def enabled(self, value):
53
+ self._edb_object.Enabled = value
54
+
55
+
56
+ class SimulationSettings(BaseSimulationSettings):
57
+ def __init__(self, pedb, sim_setup, edb_object):
58
+ super().__init__(pedb, sim_setup, edb_object)
59
+
60
+
61
+ class HFSSSimulationSettings(SimulationSettings):
62
+ def __init__(self, pedb, sim_setup, edb_object):
63
+ super().__init__(pedb, sim_setup, edb_object)
64
+
65
+ @property
66
+ def mesh_operations(self):
67
+ return self._edb_object.MeshOperations
68
+
69
+
70
+ class HFSSPISimulationSettings(SimulationSettings):
71
+ def __init__(self, edb_setup_info, pedb, edb_object):
72
+ super().__init__(pedb, edb_setup_info, edb_object)
73
+ self._pedb = pedb
74
+ self.logger = self._pedb.logger
75
+ self._edb_setup_info = edb_setup_info
76
+ self._simulation_settings = edb_setup_info.SimulationSettings
77
+
78
+ @property
79
+ def auto_select_nets_for_simulation(self):
80
+ """Auto select nets for simulation.
81
+
82
+ Returns
83
+ -------
84
+ bool
85
+ """
86
+ return self._simulation_settings.AutoSelectNetsForSimulation
87
+
88
+ @auto_select_nets_for_simulation.setter
89
+ def auto_select_nets_for_simulation(self, value):
90
+ if isinstance(value, bool):
91
+ self._simulation_settings.AutoSelectNetsForSimulation = value
92
+ else:
93
+ self.logger.error(
94
+ "Property auto_select_nets_for_simulation expects a boolean "
95
+ f"value while the provided value is {value}."
96
+ )
97
+
98
+ @property
99
+ def enabled(self):
100
+ return self._simulation_settings.Enabled
101
+
102
+ @enabled.setter
103
+ def enabled(self, value):
104
+ if isinstance(value, bool):
105
+ self._simulation_settings.Enabled = value
106
+ else:
107
+ self.logger.error(f"Property enabled expects a boolean value while the provided value is {value}.")
108
+
109
+ @property
110
+ def ignore_dummy_nets_for_selected_nets(self):
111
+ """Auto select Nets for simulation
112
+
113
+ Returns
114
+ -------
115
+ bool
116
+ """
117
+ return self._simulation_settings.IgnoreDummyNetsForSelectedNets
118
+
119
+ @ignore_dummy_nets_for_selected_nets.setter
120
+ def ignore_dummy_nets_for_selected_nets(self, value):
121
+ if isinstance(value, bool):
122
+ self._simulation_settings.IgnoreDummyNetsForSelectedNets = value
123
+ else:
124
+ self.logger.error(
125
+ "Property ignore_dummy_nets_for_selected_nets expects a boolean "
126
+ f"value while the provided value is {value}."
127
+ )
128
+
129
+ @property
130
+ def ignore_small_holes(self):
131
+ """Ignore small holes choice.
132
+
133
+ Returns
134
+ -------
135
+ bool
136
+ """
137
+ return self._simulation_settings.IgnoreSmallHoles
138
+
139
+ @ignore_small_holes.setter
140
+ def ignore_small_holes(self, value):
141
+ if isinstance(value, bool):
142
+ self._simulation_settings.IgnoreSmallHoles = value
143
+ else:
144
+ self.logger.error(
145
+ f"Property ignore_small_holes expects a boolean value while the provided value is {value}."
146
+ )
147
+
148
+ @property
149
+ def ignore_small_holes_min_diameter(self):
150
+ """Min diameter to ignore small holes.
151
+
152
+ Returns
153
+ -------
154
+ str
155
+ """
156
+ return self._simulation_settings.IgnoreSmallHolesMinDiameter
157
+
158
+ @ignore_small_holes_min_diameter.setter
159
+ def ignore_small_holes_min_diameter(self, value):
160
+ self._simulation_settings.IgnoreSmallHolesMinDiameter = self._pedb.edb_value(value).ToString()
161
+
162
+ @property
163
+ def improved_loss_model(self):
164
+ """Improved Loss Model on power ground nets option.
165
+
166
+ Returns
167
+ -------
168
+ str
169
+ ``Level1``, ``Level2``, ``Level3``
170
+ """
171
+ return self._simulation_settings.ImprovedLossModel
172
+
173
+ @improved_loss_model.setter
174
+ def improved_loss_model(self, value):
175
+ expected_values = ["Level1", "Level2", "Level3"]
176
+ if isinstance(value, str) and value in expected_values:
177
+ self._simulation_settings.ImprovedLossModel = value
178
+ else:
179
+ self.logger.error(
180
+ "Property improved_loss_model expects a string value among "
181
+ f"'Level1', 'Level2' or 'Level3' while the provided value is {value}."
182
+ )
183
+
184
+ @property
185
+ def include_enhanced_bond_wire_modeling(self):
186
+ """Enhance Bond wire modeling.
187
+
188
+ Returns
189
+ -------
190
+ bool
191
+ """
192
+ return self._simulation_settings.IncludeEnhancedBondWireModeling
193
+
194
+ @include_enhanced_bond_wire_modeling.setter
195
+ def include_enhanced_bond_wire_modeling(self, value):
196
+ if isinstance(value, bool):
197
+ self._simulation_settings.IncludeEnhancedBondWireModeling = value
198
+ else:
199
+ self.logger.error(
200
+ "Property include_enhanced_bond_wire_modeling expects a "
201
+ f"boolean value while the provided value is {value}."
202
+ )
203
+
204
+ @property
205
+ def include_nets(self):
206
+ """Add Additional Nets for simulation.
207
+
208
+ Returns
209
+ -------
210
+ [str]
211
+ List of net name.
212
+ """
213
+ return list(self._simulation_settings.IncludeNets)
214
+
215
+ @include_nets.setter
216
+ def include_nets(self, value):
217
+ if isinstance(value, str):
218
+ value = [value]
219
+ if isinstance(value, list):
220
+ self._simulation_settings.IncludeNets = convert_py_list_to_net_list(value)
221
+ else:
222
+ self.logger.error(
223
+ f"Property include_nets expects a string or list of string while the provided value is {value}."
224
+ )
225
+
226
+ @property
227
+ def min_plane_area_to_mesh(self):
228
+ """The minimum area below which geometry is ignored.
229
+
230
+ Returns
231
+ -------
232
+ str
233
+ """
234
+ return self._simulation_settings.MinPlaneAreaToMesh
235
+
236
+ @min_plane_area_to_mesh.setter
237
+ def min_plane_area_to_mesh(self, value):
238
+ self._simulation_settings.MinPlaneAreaToMesh = self._pedb.edb_value(value).ToString()
239
+
240
+ @property
241
+ def min_void_area_to_mesh(self):
242
+ """The minimum area below which voids are ignored.
243
+
244
+ Returns
245
+ -------
246
+ str
247
+ """
248
+ return self._simulation_settings.MinVoidAreaToMesh
249
+
250
+ @min_void_area_to_mesh.setter
251
+ def min_void_area_to_mesh(self, value):
252
+ self._simulation_settings.MinVoidAreaToMesh = self._pedb.edb_value(value).ToString()
253
+
254
+ @property
255
+ def model_type(self):
256
+ """Model Type setting.
257
+
258
+ Returns
259
+ -------
260
+ int
261
+ Model type: ``0``=RDL, ``1``=Package, ``2``=PCB
262
+ """
263
+ return self._simulation_settings.ModelType
264
+
265
+ @model_type.setter
266
+ def model_type(self, value):
267
+ if isinstance(value, int) and value in range(3):
268
+ self._simulation_settings.ModelType = value
269
+ else:
270
+ self.logger.error(
271
+ f"Property model_type expects an integer value among 0, 1 or 2 while the provided value is {value}."
272
+ )
273
+
274
+ @property
275
+ def perform_erc(self):
276
+ """Perform ERC
277
+
278
+ Returns
279
+ -------
280
+ bool
281
+ """
282
+ return self._simulation_settings.PerformERC
283
+
284
+ @perform_erc.setter
285
+ def perform_erc(self, value):
286
+ if isinstance(value, bool):
287
+ self._simulation_settings.PerformERC = value
288
+ else:
289
+ self.logger.error(f"Property perform_erc expects a boolean value while the provided value is {value}.")
290
+
291
+ @property
292
+ def pi_slider_pos(self):
293
+ """The Simulation Preference Slider setting
294
+
295
+ Returns
296
+ -------
297
+ int
298
+ Model type: ``0``= balanced, ``1``=Accuracy.
299
+ """
300
+ return self._simulation_settings.PISliderPos
301
+
302
+ @pi_slider_pos.setter
303
+ def pi_slider_pos(self, value):
304
+ if isinstance(value, int) and value in range(2):
305
+ self._simulation_settings.PISliderPos = value
306
+ else:
307
+ self.logger.error(
308
+ f"Property pi_slider_pos expects an integer value among 0 or 1 while the provided value is {value}."
309
+ )
310
+
311
+ @property
312
+ def rms_surface_roughness(self):
313
+ """RMS Surface Roughness setting
314
+
315
+ Returns
316
+ -------
317
+ str
318
+ """
319
+ return self._simulation_settings.RMSSurfaceRoughness
320
+
321
+ @rms_surface_roughness.setter
322
+ def rms_surface_roughness(self, value):
323
+ self._simulation_settings.RMSSurfaceRoughness = self._pedb.edb_value(value).ToString()
324
+
325
+ @property
326
+ def signal_nets_conductor_modeling(self):
327
+ """Conductor Modeling
328
+
329
+ Returns
330
+ -------
331
+ str
332
+ Value: ``"MeshInside"`` or ``"ImpedanceBoundary"``.
333
+ """
334
+ return self._simulation_settings.SignalNetsConductorModeling
335
+
336
+ @signal_nets_conductor_modeling.setter
337
+ def signal_nets_conductor_modeling(self, value):
338
+ expected_values = ["MeshInside", "ImpedanceBoundary"]
339
+ if isinstance(value, str) and value in expected_values:
340
+ self._simulation_settings.SignalNetsConductorModeling = value
341
+ else:
342
+ self.logger.error(
343
+ "Property signal_nets_conductor_modeling expects a string value among "
344
+ f"'MeshInside' or 'ImpedanceBoundary' while the provided value is {value}."
345
+ )
346
+
347
+ @property
348
+ def signal_nets_error_tolerance(self):
349
+ """Error Tolerance
350
+
351
+ Returns
352
+ -------
353
+ str
354
+ Value between 0.02 and 1.
355
+ """
356
+ return self._simulation_settings.SignalNetsErrorTolerance
357
+
358
+ @signal_nets_error_tolerance.setter
359
+ def signal_nets_error_tolerance(self, value):
360
+ self._simulation_settings.SignalNetsErrorTolerance = self._pedb.edb_value(value).ToString()
361
+
362
+ @property
363
+ def signal_nets_include_improved_dielectric_fill_refinement(self):
364
+ return self._simulation_settings.SignalNetsIncludeImprovedDielectricFillRefinement
365
+
366
+ @signal_nets_include_improved_dielectric_fill_refinement.setter
367
+ def signal_nets_include_improved_dielectric_fill_refinement(self, value):
368
+ if isinstance(value, bool):
369
+ self._simulation_settings.SignalNetsIncludeImprovedDielectricFillRefinement = value
370
+ else:
371
+ self.logger.error(
372
+ "Property signal_nets_include_improved_dielectric_fill_refinement "
373
+ f"expects a boolean value while the provided value is {value}."
374
+ )
375
+
376
+ @property
377
+ def signal_nets_include_improved_loss_handling(self):
378
+ """Improved Dielectric Fill Refinement choice.
379
+
380
+ Returns
381
+ -------
382
+ bool
383
+ """
384
+ return self._simulation_settings.SignalNetsIncludeImprovedLossHandling
385
+
386
+ @signal_nets_include_improved_loss_handling.setter
387
+ def signal_nets_include_improved_loss_handling(self, value):
388
+ if isinstance(value, bool):
389
+ self._simulation_settings.SignalNetsIncludeImprovedLossHandling = value
390
+ else:
391
+ self.logger.error(
392
+ "Property signal_nets_include_improved_loss_handling "
393
+ f"expects a boolean value while the provided value is {value}."
394
+ )
395
+
396
+ @property
397
+ def snap_length_threshold(self):
398
+ return self._simulation_settings.SnapLengthThreshold
399
+
400
+ @snap_length_threshold.setter
401
+ def snap_length_threshold(self, value):
402
+ self._simulation_settings.SnapLengthThreshold = self._pedb.edb_value(value).ToString()
403
+
404
+ @property
405
+ def surface_roughness_model(self):
406
+ """Chosen Model setting
407
+
408
+ Returns
409
+ -------
410
+ str
411
+ Model allowed, ``"None"``, ``"Exponential"`` or ``"Hammerstad"``.
412
+ """
413
+ return self._simulation_settings.SurfaceRoughnessModel
414
+
415
+ @surface_roughness_model.setter
416
+ def surface_roughness_model(self, value):
417
+ expected_values = ["None", "Exponential", "Hammerstad"]
418
+ if isinstance(value, str) and value in expected_values:
419
+ self._simulation_settings.SurfaceRoughnessModel = value
420
+ else:
421
+ self.logger.error(
422
+ "Property surface_roughness_model expects a string value among "
423
+ f"'None', 'Exponential' or 'Hammerstad' while the provided value is {value}."
424
+ )