pyedb 0.16.0__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 (32) hide show
  1. pyedb/__init__.py +1 -1
  2. pyedb/configuration/cfg_components.py +47 -1
  3. pyedb/configuration/configuration.py +2 -0
  4. pyedb/dotnet/edb.py +43 -37
  5. pyedb/dotnet/edb_core/cell/hierarchy/component.py +12 -17
  6. pyedb/dotnet/edb_core/cell/hierarchy/hierarchy_obj.py +50 -0
  7. pyedb/dotnet/edb_core/cell/layout.py +0 -6
  8. pyedb/dotnet/edb_core/cell/voltage_regulator.py +0 -5
  9. pyedb/dotnet/edb_core/components.py +2 -2
  10. pyedb/dotnet/edb_core/dotnet/primitive.py +129 -3
  11. pyedb/dotnet/edb_core/edb_data/hfss_pi_simulation_setup_data.py +0 -460
  12. pyedb/dotnet/edb_core/edb_data/primitives_data.py +38 -38
  13. pyedb/dotnet/edb_core/edb_data/raptor_x_simulation_setup_data.py +1 -1
  14. pyedb/dotnet/edb_core/layout.py +21 -0
  15. pyedb/dotnet/edb_core/layout_validation.py +26 -0
  16. pyedb/dotnet/edb_core/nets.py +1 -1
  17. pyedb/dotnet/edb_core/sim_setup_data/data/sim_setup_info.py +1 -1
  18. pyedb/dotnet/edb_core/sim_setup_data/data/simulation_settings.py +357 -0
  19. pyedb/dotnet/edb_core/siwave.py +14 -0
  20. pyedb/dotnet/edb_core/utilities/hfss_simulation_setup.py +83 -0
  21. pyedb/dotnet/edb_core/utilities/simulation_setup.py +7 -4
  22. pyedb/misc/siw_feature_config/xtalk_scan/fd_xtalk_scan_config.py +91 -0
  23. pyedb/misc/siw_feature_config/xtalk_scan/impedance_scan_config.py +70 -0
  24. pyedb/misc/siw_feature_config/xtalk_scan/net.py +69 -0
  25. pyedb/misc/siw_feature_config/xtalk_scan/pins.py +60 -0
  26. pyedb/misc/siw_feature_config/xtalk_scan/scan_config.py +88 -0
  27. pyedb/misc/siw_feature_config/xtalk_scan/td_xtalk_config.py +104 -0
  28. pyedb/workflow.py +32 -0
  29. {pyedb-0.16.0.dist-info → pyedb-0.17.0.dist-info}/METADATA +1 -1
  30. {pyedb-0.16.0.dist-info → pyedb-0.17.0.dist-info}/RECORD +32 -24
  31. {pyedb-0.16.0.dist-info → pyedb-0.17.0.dist-info}/LICENSE +0 -0
  32. {pyedb-0.16.0.dist-info → pyedb-0.17.0.dist-info}/WHEEL +0 -0
@@ -72,10 +72,38 @@ class PrimitiveDotNet:
72
72
  self.edb_api = api._edb
73
73
  self.prim_obj = prim_object
74
74
 
75
+ @property
76
+ def id(self):
77
+ return self.prim_obj.GetId()
78
+
75
79
  @property
76
80
  def api_class(self):
77
81
  return self.api
78
82
 
83
+ @property
84
+ def aedt_name(self):
85
+ """Name to be visualized in AEDT.
86
+
87
+ Returns
88
+ -------
89
+ str
90
+ Name.
91
+ """
92
+ from System import String
93
+
94
+ val = String("")
95
+
96
+ _, name = self.prim_obj.GetProductProperty(self._app._edb.ProductId.Designer, 1, val)
97
+ name = str(name).strip("'")
98
+ if name == "":
99
+ name = "{}__{}".format(self.primitive_type, self.id)
100
+ self.prim_obj.SetProductProperty(self._app._edb.ProductId.Designer, 1, name)
101
+ return name
102
+
103
+ @aedt_name.setter
104
+ def aedt_name(self, value):
105
+ self.prim_obj.SetProductProperty(self._app._edb.ProductId.Designer, 1, value)
106
+
79
107
  @property
80
108
  def api_object(self):
81
109
  return self.prim_obj
@@ -298,9 +326,9 @@ class PrimitiveDotNet:
298
326
  # i += 1
299
327
  else:
300
328
  arc_h = point.GetArcHeight().ToDouble()
301
- p1 = [my_net_points[i-1].X.ToDouble(), my_net_points[i-1].Y.ToDouble()]
302
- if i+1 < len(my_net_points):
303
- p2 = [my_net_points[i+1].X.ToDouble(), my_net_points[i+1].Y.ToDouble()]
329
+ p1 = [my_net_points[i - 1].X.ToDouble(), my_net_points[i - 1].Y.ToDouble()]
330
+ if i + 1 < len(my_net_points):
331
+ p2 = [my_net_points[i + 1].X.ToDouble(), my_net_points[i + 1].Y.ToDouble()]
304
332
  else:
305
333
  p2 = [my_net_points[0].X.ToDouble(), my_net_points[0].Y.ToDouble()]
306
334
  x_arc, y_arc = self._eval_arc_points(p1, p2, arc_h, num)
@@ -352,6 +380,61 @@ class PrimitiveDotNet:
352
380
  except:
353
381
  return points
354
382
 
383
+ def expand(self, offset=0.001, tolerance=1e-12, round_corners=True, maximum_corner_extension=0.001):
384
+ """Expand the polygon shape by an absolute value in all direction.
385
+ Offset can be negative for negative expansion.
386
+
387
+ Parameters
388
+ ----------
389
+ offset : float, optional
390
+ Offset value in meters.
391
+ tolerance : float, optional
392
+ Tolerance in meters.
393
+ round_corners : bool, optional
394
+ Whether to round corners or not.
395
+ If True, use rounded corners in the expansion otherwise use straight edges (can be degenerate).
396
+ maximum_corner_extension : float, optional
397
+ The maximum corner extension (when round corners are not used) at which point the corner is clipped.
398
+ """
399
+ new_poly = self.polygon_data.edb_api.Expand(offset, tolerance, round_corners, maximum_corner_extension)
400
+ self.polygon_data = new_poly[0]
401
+ return True
402
+
403
+ def scale(self, factor, center=None):
404
+ """Scales the polygon relative to a center point by a factor.
405
+
406
+ Parameters
407
+ ----------
408
+ factor : float
409
+ Scaling factor.
410
+ center : List of float or str [x,y], optional
411
+ If None scaling is done from polygon center.
412
+
413
+ Returns
414
+ -------
415
+ bool
416
+ ``True`` when successful, ``False`` when failed.
417
+ """
418
+ if not isinstance(factor, str):
419
+ factor = float(factor)
420
+ polygon_data = self.polygon_data.create_from_arcs(self.polygon_data.edb_api.GetArcData(), True)
421
+ if not center:
422
+ center = self.polygon_data.edb_api.GetBoundingCircleCenter()
423
+ if center:
424
+ polygon_data.Scale(factor, center)
425
+ self.polygon_data = polygon_data
426
+ return True
427
+ else:
428
+ self._pedb.logger.error(f"Failed to evaluate center on primitive {self.id}")
429
+ elif isinstance(center, list) and len(center) == 2:
430
+ center = self._edb.Geometry.PointData(
431
+ self._edb.Utility.Value(center[0]), self._edb.Utility.Value(center[1])
432
+ )
433
+ polygon_data.Scale(factor, center)
434
+ self.polygon_data = polygon_data
435
+ return True
436
+ return False
437
+
355
438
 
356
439
  class RectangleDotNet(PrimitiveDotNet):
357
440
  """Class representing a rectangle object."""
@@ -577,6 +660,28 @@ class CircleDotNet(PrimitiveDotNet):
577
660
  """:obj:`bool`: If a circle can be a zone."""
578
661
  return True
579
662
 
663
+ def expand(self, offset=0.001, tolerance=1e-12, round_corners=True, maximum_corner_extension=0.001):
664
+ """Expand the polygon shape by an absolute value in all direction.
665
+ Offset can be negative for negative expansion.
666
+
667
+ Parameters
668
+ ----------
669
+ offset : float, optional
670
+ Offset value in meters.
671
+ tolerance : float, optional
672
+ Tolerance in meters. Ignored for Circle and Path.
673
+ round_corners : bool, optional
674
+ Whether to round corners or not.
675
+ If True, use rounded corners in the expansion otherwise use straight edges (can be degenerate).
676
+ Ignored for Circle and Path.
677
+ maximum_corner_extension : float, optional
678
+ The maximum corner extension (when round corners are not used) at which point the corner is clipped.
679
+ Ignored for Circle and Path.
680
+ """
681
+ center_x, center_y, radius = self.get_parameters()
682
+ self.set_parameters(center_x, center_y, radius.ToFloat() + offset)
683
+ return True
684
+
580
685
 
581
686
  class TextDotNet(PrimitiveDotNet):
582
687
  """Class representing a text object."""
@@ -851,6 +956,27 @@ class PathDotNet(PrimitiveDotNet):
851
956
  """
852
957
  return True
853
958
 
959
+ def expand(self, offset=0.001, tolerance=1e-12, round_corners=True, maximum_corner_extension=0.001):
960
+ """Expand the polygon shape by an absolute value in all direction.
961
+ Offset can be negative for negative expansion.
962
+
963
+ Parameters
964
+ ----------
965
+ offset : float, optional
966
+ Offset value in meters.
967
+ tolerance : float, optional
968
+ Tolerance in meters. Ignored for Circle and Path.
969
+ round_corners : bool, optional
970
+ Whether to round corners or not.
971
+ If True, use rounded corners in the expansion otherwise use straight edges (can be degenerate).
972
+ Ignored for Circle and Path.
973
+ maximum_corner_extension : float, optional
974
+ The maximum corner extension (when round corners are not used) at which point the corner is clipped.
975
+ Ignored for Circle and Path.
976
+ """
977
+ self.width = self.width + offset
978
+ return True
979
+
854
980
 
855
981
  class BondwireDotNet(PrimitiveDotNet):
856
982
  """Class representing a bondwire object."""
@@ -1,460 +0,0 @@
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
- # FITNE SS 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 pyedb.dotnet.edb_core.general import convert_py_list_to_net_list
24
- from pyedb.dotnet.edb_core.sim_setup_data.data.sweep_data import SweepData
25
- from pyedb.dotnet.edb_core.utilities.simulation_setup import SimulationSetup
26
- from pyedb.generic.general_methods import generate_unique_name
27
-
28
-
29
- class HFSSPISimulationSetup(SimulationSetup):
30
- """Manages EDB methods for HFSSPI simulation setup."""
31
-
32
- def __init__(self, pedb, edb_object=None):
33
- super().__init__(pedb, edb_object)
34
- self._pedb = pedb
35
- self._setup_type = "kHFSSPI"
36
- self._edb_setup_info = None
37
- self.logger = self._pedb.logger
38
-
39
- def create(self, name=None):
40
- """Create an HFSS setup."""
41
- self._name = name
42
- self._create(name)
43
- return self
44
-
45
- @property
46
- def setup_type(self):
47
- return self._setup_type
48
-
49
- @property
50
- def settings(self):
51
- return HFSSPISimulationSettings(self._edb_setup_info, self._pedb)
52
-
53
- @property
54
- def enabled(self):
55
- return self.settings.enabled
56
-
57
- @enabled.setter
58
- def enabled(self, value):
59
- if isinstance(value, bool):
60
- self.settings.enabled = value
61
- else:
62
- self.logger.error(f"Property enabled expects a boolean value while the provided value is {value}.")
63
-
64
- @property
65
- def position(self):
66
- return self._edb_setup_info.Position
67
-
68
- @position.setter
69
- def position(self, value):
70
- if isinstance(value, int):
71
- self._edb_setup_info.Position = value
72
- else:
73
- self.logger.error(f"Property position expects an integer value while the provided value is {value}.")
74
-
75
- def add_frequency_sweep(self, name=None, frequency_sweep=None):
76
- """Add frequency sweep.
77
-
78
- Parameters
79
- ----------
80
- name : str, optional
81
- Name of the frequency sweep.
82
- frequency_sweep : list, optional
83
- List of frequency points.
84
-
85
- Returns
86
- -------
87
- :class:`pyedb.dotnet.edb_core.edb_data.hfss_simulation_setup_data.EdbFrequencySweep`wheen succeeded, ``False``
88
- when failed.
89
-
90
- Examples
91
- --------
92
- >>> setup1 = edbapp.create_hfss_setup("setup1")
93
- >>> setup1.add_frequency_sweep(frequency_sweep=[
94
- ... ["linear count", "0", "1kHz", 1],
95
- ... ["log scale", "1kHz", "0.1GHz", 10],
96
- ... ["linear scale", "0.1GHz", "10GHz", "0.1GHz"],
97
- ... ])
98
- """
99
- if name in self.frequency_sweeps:
100
- self.logger.error("Frequency sweep with same name already defined.")
101
- return False
102
- if not name:
103
- name = generate_unique_name("sweep")
104
- return SweepData(self, frequency_sweep, name)
105
-
106
-
107
- class HFSSPISimulationSettings(object):
108
- def __init__(self, edb_setup_info, pedb):
109
- self._pedb = pedb
110
- self.logger = self._pedb.logger
111
- self._edb_setup_info = edb_setup_info
112
- self._simulation_settings = edb_setup_info.SimulationSettings
113
-
114
- @property
115
- def auto_select_nets_for_simulation(self):
116
- """Auto select nets for simulation.
117
-
118
- Returns
119
- -------
120
- bool
121
- """
122
- return self._simulation_settings.AutoSelectNetsForSimulation
123
-
124
- @auto_select_nets_for_simulation.setter
125
- def auto_select_nets_for_simulation(self, value):
126
- if isinstance(value, bool):
127
- self._simulation_settings.AutoSelectNetsForSimulation = value
128
- else:
129
- self.logger.error(
130
- "Property auto_select_nets_for_simulation expects a boolean "
131
- f"value while the provided value is {value}."
132
- )
133
-
134
- @property
135
- def enabled(self):
136
- return self._simulation_settings.Enabled
137
-
138
- @enabled.setter
139
- def enabled(self, value):
140
- if isinstance(value, bool):
141
- self._simulation_settings.Enabled = value
142
- else:
143
- self.logger.error(f"Property enabled expects a boolean value while the provided value is {value}.")
144
-
145
- @property
146
- def ignore_dummy_nets_for_selected_nets(self):
147
- """Auto select Nets for simulation
148
-
149
- Returns
150
- -------
151
- bool
152
- """
153
- return self._simulation_settings.IgnoreDummyNetsForSelectedNets
154
-
155
- @ignore_dummy_nets_for_selected_nets.setter
156
- def ignore_dummy_nets_for_selected_nets(self, value):
157
- if isinstance(value, bool):
158
- self._simulation_settings.IgnoreDummyNetsForSelectedNets = value
159
- else:
160
- self.logger.error(
161
- "Property ignore_dummy_nets_for_selected_nets expects a boolean "
162
- f"value while the provided value is {value}."
163
- )
164
-
165
- @property
166
- def ignore_small_holes(self):
167
- """Ignore small holes choice.
168
-
169
- Returns
170
- -------
171
- bool
172
- """
173
- return self._simulation_settings.IgnoreSmallHoles
174
-
175
- @ignore_small_holes.setter
176
- def ignore_small_holes(self, value):
177
- if isinstance(value, bool):
178
- self._simulation_settings.IgnoreSmallHoles = value
179
- else:
180
- self.logger.error(
181
- f"Property ignore_small_holes expects a boolean value while the provided value is {value}."
182
- )
183
-
184
- @property
185
- def ignore_small_holes_min_diameter(self):
186
- """Min diameter to ignore small holes.
187
-
188
- Returns
189
- -------
190
- str
191
- """
192
- return self._simulation_settings.IgnoreSmallHolesMinDiameter
193
-
194
- @ignore_small_holes_min_diameter.setter
195
- def ignore_small_holes_min_diameter(self, value):
196
- self._simulation_settings.IgnoreSmallHolesMinDiameter = self._pedb.edb_value(value).ToString()
197
-
198
- @property
199
- def improved_loss_model(self):
200
- """Improved Loss Model on power ground nets option.
201
-
202
- Returns
203
- -------
204
- str
205
- ``Level1``, ``Level2``, ``Level3``
206
- """
207
- return self._simulation_settings.ImprovedLossModel
208
-
209
- @improved_loss_model.setter
210
- def improved_loss_model(self, value):
211
- expected_values = ["Level1", "Level2", "Level3"]
212
- if isinstance(value, str) and value in expected_values:
213
- self._simulation_settings.ImprovedLossModel = value
214
- else:
215
- self.logger.error(
216
- "Property improved_loss_model expects a string value among "
217
- f"'Level1', 'Level2' or 'Level3' while the provided value is {value}."
218
- )
219
-
220
- @property
221
- def include_enhanced_bond_wire_modeling(self):
222
- """Enhance Bond wire modeling.
223
-
224
- Returns
225
- -------
226
- bool
227
- """
228
- return self._simulation_settings.IncludeEnhancedBondWireModeling
229
-
230
- @include_enhanced_bond_wire_modeling.setter
231
- def include_enhanced_bond_wire_modeling(self, value):
232
- if isinstance(value, bool):
233
- self._simulation_settings.IncludeEnhancedBondWireModeling = value
234
- else:
235
- self.logger.error(
236
- "Property include_enhanced_bond_wire_modeling expects a "
237
- f"boolean value while the provided value is {value}."
238
- )
239
-
240
- @property
241
- def include_nets(self):
242
- """Add Additional Nets for simulation.
243
-
244
- Returns
245
- -------
246
- [str]
247
- List of net name.
248
- """
249
- return list(self._simulation_settings.IncludeNets)
250
-
251
- @include_nets.setter
252
- def include_nets(self, value):
253
- if isinstance(value, str):
254
- value = [value]
255
- if isinstance(value, list):
256
- self._simulation_settings.IncludeNets = convert_py_list_to_net_list(value)
257
- else:
258
- self.logger.error(
259
- f"Property include_nets expects a string or list of string while the provided value is {value}."
260
- )
261
-
262
- @property
263
- def min_plane_area_to_mesh(self):
264
- """The minimum area below which geometry is ignored.
265
-
266
- Returns
267
- -------
268
- str
269
- """
270
- return self._simulation_settings.MinPlaneAreaToMesh
271
-
272
- @min_plane_area_to_mesh.setter
273
- def min_plane_area_to_mesh(self, value):
274
- self._simulation_settings.MinPlaneAreaToMesh = self._pedb.edb_value(value).ToString()
275
-
276
- @property
277
- def min_void_area_to_mesh(self):
278
- """The minimum area below which voids are ignored.
279
-
280
- Returns
281
- -------
282
- str
283
- """
284
- return self._simulation_settings.MinVoidAreaToMesh
285
-
286
- @min_void_area_to_mesh.setter
287
- def min_void_area_to_mesh(self, value):
288
- self._simulation_settings.MinVoidAreaToMesh = self._pedb.edb_value(value).ToString()
289
-
290
- @property
291
- def model_type(self):
292
- """Model Type setting.
293
-
294
- Returns
295
- -------
296
- int
297
- Model type: ``0``=RDL, ``1``=Package, ``2``=PCB
298
- """
299
- return self._simulation_settings.ModelType
300
-
301
- @model_type.setter
302
- def model_type(self, value):
303
- if isinstance(value, int) and value in range(3):
304
- self._simulation_settings.ModelType = value
305
- else:
306
- self.logger.error(
307
- f"Property model_type expects an integer value among 0, 1 or 2 while the provided value is {value}."
308
- )
309
-
310
- @property
311
- def perform_erc(self):
312
- """Perform ERC
313
-
314
- Returns
315
- -------
316
- bool
317
- """
318
- return self._simulation_settings.PerformERC
319
-
320
- @perform_erc.setter
321
- def perform_erc(self, value):
322
- if isinstance(value, bool):
323
- self._simulation_settings.PerformERC = value
324
- else:
325
- self.logger.error(f"Property perform_erc expects a boolean value while the provided value is {value}.")
326
-
327
- @property
328
- def pi_slider_pos(self):
329
- """The Simulation Preference Slider setting
330
-
331
- Returns
332
- -------
333
- int
334
- Model type: ``0``= balanced, ``1``=Accuracy.
335
- """
336
- return self._simulation_settings.PISliderPos
337
-
338
- @pi_slider_pos.setter
339
- def pi_slider_pos(self, value):
340
- if isinstance(value, int) and value in range(2):
341
- self._simulation_settings.PISliderPos = value
342
- else:
343
- self.logger.error(
344
- f"Property pi_slider_pos expects an integer value among 0 or 1 while the provided value is {value}."
345
- )
346
-
347
- @property
348
- def rms_surface_roughness(self):
349
- """RMS Surface Roughness setting
350
-
351
- Returns
352
- -------
353
- str
354
- """
355
- return self._simulation_settings.RMSSurfaceRoughness
356
-
357
- @rms_surface_roughness.setter
358
- def rms_surface_roughness(self, value):
359
- self._simulation_settings.RMSSurfaceRoughness = self._pedb.edb_value(value).ToString()
360
-
361
- @property
362
- def signal_nets_conductor_modeling(self):
363
- """Conductor Modeling
364
-
365
- Returns
366
- -------
367
- str
368
- Value: ``"MeshInside"`` or ``"ImpedanceBoundary"``.
369
- """
370
- return self._simulation_settings.SignalNetsConductorModeling
371
-
372
- @signal_nets_conductor_modeling.setter
373
- def signal_nets_conductor_modeling(self, value):
374
- expected_values = ["MeshInside", "ImpedanceBoundary"]
375
- if isinstance(value, str) and value in expected_values:
376
- self._simulation_settings.SignalNetsConductorModeling = value
377
- else:
378
- self.logger.error(
379
- "Property signal_nets_conductor_modeling expects a string value among "
380
- f"'MeshInside' or 'ImpedanceBoundary' while the provided value is {value}."
381
- )
382
-
383
- @property
384
- def signal_nets_error_tolerance(self):
385
- """Error Tolerance
386
-
387
- Returns
388
- -------
389
- str
390
- Value between 0.02 and 1.
391
- """
392
- return self._simulation_settings.SignalNetsErrorTolerance
393
-
394
- @signal_nets_error_tolerance.setter
395
- def signal_nets_error_tolerance(self, value):
396
- self._simulation_settings.SignalNetsErrorTolerance = self._pedb.edb_value(value).ToString()
397
-
398
- @property
399
- def signal_nets_include_improved_dielectric_fill_refinement(self):
400
- return self._simulation_settings.SignalNetsIncludeImprovedDielectricFillRefinement
401
-
402
- @signal_nets_include_improved_dielectric_fill_refinement.setter
403
- def signal_nets_include_improved_dielectric_fill_refinement(self, value):
404
- if isinstance(value, bool):
405
- self._simulation_settings.SignalNetsIncludeImprovedDielectricFillRefinement = value
406
- else:
407
- self.logger.error(
408
- "Property signal_nets_include_improved_dielectric_fill_refinement "
409
- f"expects a boolean value while the provided value is {value}."
410
- )
411
-
412
- @property
413
- def signal_nets_include_improved_loss_handling(self):
414
- """Improved Dielectric Fill Refinement choice.
415
-
416
- Returns
417
- -------
418
- bool
419
- """
420
- return self._simulation_settings.SignalNetsIncludeImprovedLossHandling
421
-
422
- @signal_nets_include_improved_loss_handling.setter
423
- def signal_nets_include_improved_loss_handling(self, value):
424
- if isinstance(value, bool):
425
- self._simulation_settings.SignalNetsIncludeImprovedLossHandling = value
426
- else:
427
- self.logger.error(
428
- "Property signal_nets_include_improved_loss_handling "
429
- f"expects a boolean value while the provided value is {value}."
430
- )
431
-
432
- @property
433
- def snap_length_threshold(self):
434
- return self._simulation_settings.SnapLengthThreshold
435
-
436
- @snap_length_threshold.setter
437
- def snap_length_threshold(self, value):
438
- self._simulation_settings.SnapLengthThreshold = self._pedb.edb_value(value).ToString()
439
-
440
- @property
441
- def surface_roughness_model(self):
442
- """Chosen Model setting
443
-
444
- Returns
445
- -------
446
- str
447
- Model allowed, ``"None"``, ``"Exponential"`` or ``"Hammerstad"``.
448
- """
449
- return self._simulation_settings.SurfaceRoughnessModel
450
-
451
- @surface_roughness_model.setter
452
- def surface_roughness_model(self, value):
453
- expected_values = ["None", "Exponential", "Hammerstad"]
454
- if isinstance(value, str) and value in expected_values:
455
- self._simulation_settings.SurfaceRoughnessModel = value
456
- else:
457
- self.logger.error(
458
- "Property surface_roughness_model expects a string value among "
459
- f"'None', 'Exponential' or 'Hammerstad' while the provided value is {value}."
460
- )