pyedb 0.56.0__py3-none-any.whl → 0.57.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 (99) hide show
  1. pyedb/__init__.py +1 -1
  2. pyedb/configuration/cfg_data.py +3 -0
  3. pyedb/configuration/cfg_terminals.py +232 -0
  4. pyedb/configuration/configuration.py +146 -3
  5. pyedb/dotnet/clr_module.py +1 -2
  6. pyedb/dotnet/database/Variables.py +30 -22
  7. pyedb/dotnet/database/cell/layout.py +5 -1
  8. pyedb/dotnet/database/cell/primitive/primitive.py +2 -2
  9. pyedb/dotnet/database/cell/terminal/bundle_terminal.py +12 -0
  10. pyedb/dotnet/database/cell/terminal/pingroup_terminal.py +1 -1
  11. pyedb/dotnet/database/cell/terminal/terminal.py +38 -0
  12. pyedb/dotnet/database/components.py +14 -16
  13. pyedb/dotnet/database/dotnet/database.py +1 -0
  14. pyedb/dotnet/database/edb_data/control_file.py +6 -3
  15. pyedb/dotnet/database/edb_data/nets_data.py +3 -3
  16. pyedb/dotnet/database/edb_data/padstacks_data.py +5 -2
  17. pyedb/dotnet/database/edb_data/ports.py +0 -25
  18. pyedb/dotnet/database/edb_data/primitives_data.py +3 -3
  19. pyedb/dotnet/database/edb_data/raptor_x_simulation_setup_data.py +18 -19
  20. pyedb/dotnet/database/edb_data/simulation_configuration.py +3 -3
  21. pyedb/dotnet/database/hfss.py +9 -8
  22. pyedb/dotnet/database/layout_validation.py +6 -3
  23. pyedb/dotnet/database/materials.py +1 -3
  24. pyedb/dotnet/database/modeler.py +7 -3
  25. pyedb/dotnet/database/nets.py +27 -19
  26. pyedb/dotnet/database/padstack.py +4 -2
  27. pyedb/dotnet/database/sim_setup_data/io/siwave.py +1 -1
  28. pyedb/dotnet/database/siwave.py +4 -3
  29. pyedb/dotnet/database/stackup.py +50 -26
  30. pyedb/dotnet/database/utilities/heatsink.py +0 -1
  31. pyedb/dotnet/database/utilities/simulation_setup.py +7 -5
  32. pyedb/dotnet/database/utilities/siwave_cpa_simulation_setup.py +1 -0
  33. pyedb/dotnet/database/utilities/siwave_simulation_setup.py +5 -2
  34. pyedb/dotnet/edb.py +39 -34
  35. pyedb/exceptions.py +1 -2
  36. pyedb/extensions/create_cell_array.py +19 -5
  37. pyedb/generic/data_handlers.py +13 -23
  38. pyedb/generic/design_types.py +9 -35
  39. pyedb/generic/filesystem.py +4 -2
  40. pyedb/generic/general_methods.py +4 -5
  41. pyedb/generic/plot.py +2 -2
  42. pyedb/grpc/database/_typing.py +0 -0
  43. pyedb/grpc/database/components.py +7 -8
  44. pyedb/grpc/database/control_file.py +14 -35
  45. pyedb/grpc/database/definition/materials.py +1 -1
  46. pyedb/grpc/database/definition/package_def.py +6 -3
  47. pyedb/grpc/database/definition/padstack_def.py +4 -7
  48. pyedb/grpc/database/hfss.py +1 -4
  49. pyedb/grpc/database/hierarchy/component.py +3 -4
  50. pyedb/grpc/database/hierarchy/pingroup.py +16 -3
  51. pyedb/grpc/database/layers/layer.py +1 -2
  52. pyedb/grpc/database/layers/stackup_layer.py +42 -19
  53. pyedb/grpc/database/layout/layout.py +43 -27
  54. pyedb/grpc/database/layout/voltage_regulator.py +6 -1
  55. pyedb/grpc/database/layout_validation.py +5 -2
  56. pyedb/grpc/database/modeler.py +226 -244
  57. pyedb/grpc/database/net/differential_pair.py +9 -2
  58. pyedb/grpc/database/net/extended_net.py +24 -9
  59. pyedb/grpc/database/net/net.py +14 -5
  60. pyedb/grpc/database/net/net_class.py +24 -7
  61. pyedb/grpc/database/nets.py +11 -43
  62. pyedb/grpc/database/padstacks.py +5 -16
  63. pyedb/grpc/database/primitive/bondwire.py +3 -67
  64. pyedb/grpc/database/primitive/circle.py +42 -3
  65. pyedb/grpc/database/primitive/padstack_instance.py +17 -19
  66. pyedb/grpc/database/primitive/path.py +154 -5
  67. pyedb/grpc/database/primitive/polygon.py +73 -7
  68. pyedb/grpc/database/primitive/primitive.py +2 -2
  69. pyedb/grpc/database/primitive/rectangle.py +105 -4
  70. pyedb/grpc/database/simulation_setup/hfss_general_settings.py +0 -2
  71. pyedb/grpc/database/simulation_setup/hfss_settings_options.py +0 -4
  72. pyedb/grpc/database/simulation_setup/siwave_cpa_simulation_setup.py +1 -0
  73. pyedb/grpc/database/simulation_setup/sweep_data.py +1 -3
  74. pyedb/grpc/database/siwave.py +6 -13
  75. pyedb/grpc/database/source_excitations.py +39 -56
  76. pyedb/grpc/database/stackup.py +50 -27
  77. pyedb/grpc/database/terminal/bundle_terminal.py +10 -3
  78. pyedb/grpc/database/terminal/pingroup_terminal.py +8 -1
  79. pyedb/grpc/database/terminal/terminal.py +19 -8
  80. pyedb/grpc/database/utility/heat_sink.py +0 -1
  81. pyedb/grpc/database/utility/hfss_extent_info.py +2 -2
  82. pyedb/grpc/database/utility/xml_control_file.py +6 -3
  83. pyedb/grpc/edb.py +24 -19
  84. pyedb/grpc/edb_init.py +1 -0
  85. pyedb/ipc2581/ecad/cad_data/layer_feature.py +6 -2
  86. pyedb/ipc2581/ecad/cad_data/step.py +1 -1
  87. pyedb/ipc2581/ipc2581.py +8 -7
  88. pyedb/libraries/common.py +3 -4
  89. pyedb/libraries/rf_libraries/base_functions.py +7 -16
  90. pyedb/libraries/rf_libraries/planar_antennas.py +3 -21
  91. pyedb/misc/downloads.py +1 -0
  92. pyedb/misc/misc.py +5 -2
  93. pyedb/misc/siw_feature_config/emc_rule_checker_settings.py +1 -1
  94. pyedb/misc/utilities.py +0 -1
  95. pyedb/modeler/geometry_operators.py +3 -2
  96. {pyedb-0.56.0.dist-info → pyedb-0.57.0.dist-info}/METADATA +3 -3
  97. {pyedb-0.56.0.dist-info → pyedb-0.57.0.dist-info}/RECORD +99 -97
  98. {pyedb-0.56.0.dist-info → pyedb-0.57.0.dist-info}/WHEEL +0 -0
  99. {pyedb-0.56.0.dist-info → pyedb-0.57.0.dist-info}/licenses/LICENSE +0 -0
@@ -57,7 +57,7 @@ class PinGroupTerminal(Terminal):
57
57
  )
58
58
  term = PinGroupTerminal(self._pedb, term)
59
59
  if term.is_null:
60
- msg = f"Failed to create terminal. "
60
+ msg = f"Failed to create terminal {name}."
61
61
  if name in self._pedb.terminals:
62
62
  msg += f"Terminal {name} already exists."
63
63
  raise ValueError(msg)
@@ -56,6 +56,12 @@ class Terminal(Connectable):
56
56
  "PinGroupTerminal": self._pedb.core.Cell.Terminal.TerminalType.PinGroupTerminal,
57
57
  }
58
58
 
59
+ self._source_term_to_ground_mapping = {
60
+ "kNoGround": self._pedb.core.Cell.Terminal.SourceTermToGround.kNoGround,
61
+ "kNegative": self._pedb.core.Cell.Terminal.SourceTermToGround.kNegative,
62
+ "kPositive": self._pedb.core.Cell.Terminal.SourceTermToGround.kPositive,
63
+ }
64
+
59
65
  @property
60
66
  def _hfss_port_property(self):
61
67
  """HFSS port property."""
@@ -444,3 +450,35 @@ class Terminal(Connectable):
444
450
  @phase.setter
445
451
  def phase(self, value):
446
452
  self._edb_object.SetSourcePhase(self._edb.Utility.Value(value))
453
+
454
+ @property
455
+ def amplitude(self):
456
+ """Property added for grpc compatibility"""
457
+ return self.magnitude
458
+
459
+ @property
460
+ def source_amplitude(self):
461
+ """Property added for grpc compatibility"""
462
+ return self.magnitude
463
+
464
+ @source_amplitude.setter
465
+ def source_amplitude(self, value):
466
+ self.magnitude = value
467
+
468
+ @property
469
+ def source_phase(self):
470
+ """Property added for grpc compatibility"""
471
+ return self.phase
472
+
473
+ @source_phase.setter
474
+ def source_phase(self, value):
475
+ self.phase = value
476
+
477
+ @property
478
+ def terminal_to_ground(self):
479
+ return self._edb_object.GetTerminalToGround().ToString()
480
+
481
+ @terminal_to_ground.setter
482
+ def terminal_to_ground(self, value):
483
+ obj = self._source_term_to_ground_mapping[value]
484
+ self._edb_object.SetTerminalToGround(obj)
@@ -20,9 +20,8 @@
20
20
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  # SOFTWARE.
22
22
 
23
- """This module contains the `Components` class.
23
+ """This module contains the `Components` class."""
24
24
 
25
- """
26
25
  import codecs
27
26
  import json
28
27
  import math
@@ -541,16 +540,17 @@ class Components(object):
541
540
 
542
541
  Examples
543
542
  --------
544
- >>> edb1 = Edb(edbpath=targetfile1, edbversion="2021.2")
543
+ >>> edb1 = Edb(edbpath=targetfile1, edbversion="2021.2")
545
544
  >>> hosting_cmp = edb1.components.get_component_by_name("U100")
546
545
  >>> mounted_cmp = edb2.components.get_component_by_name("BGA")
547
546
  >>> vector, rotation, solder_ball_height = edb1.components.get_component_placement_vector(
548
- ... mounted_component=mounted_cmp,
549
- ... hosting_component=hosting_cmp,
550
- ... mounted_component_pin1="A12",
551
- ... mounted_component_pin2="A14",
552
- ... hosting_component_pin1="A12",
553
- ... hosting_component_pin2="A14")
547
+ ... mounted_component=mounted_cmp,
548
+ ... hosting_component=hosting_cmp,
549
+ ... mounted_component_pin1="A12",
550
+ ... mounted_component_pin2="A14",
551
+ ... hosting_component_pin1="A12",
552
+ ... hosting_component_pin2="A14",
553
+ ... )
554
554
  """
555
555
  m_pin1_pos = [0.0, 0.0]
556
556
  m_pin2_pos = [0.0, 0.0]
@@ -1270,7 +1270,7 @@ class Components(object):
1270
1270
  Examples
1271
1271
  --------
1272
1272
  >>> from pyedb import Edb
1273
- >>> edb_file = r'C:\my_edb_file.aedb'
1273
+ >>> edb_file = r"C:\my_edb_file.aedb"
1274
1274
  >>> edb = Edb(edb_file)
1275
1275
  >>> for cmp in list(edb.components.instances.keys()):
1276
1276
  >>> edb.components.deactivate_rlc_component(component=cmp, create_circuit_port=False)
@@ -1750,9 +1750,9 @@ class Components(object):
1750
1750
 
1751
1751
  >>> from pyedb import Edb
1752
1752
  >>> edbapp = Edb("myaedbfolder")
1753
- >>> edbapp.components.set_component_model("A1", model_type="Spice",
1754
- ... modelpath="pathtospfile",
1755
- ... modelname="spicemodelname")
1753
+ >>> edbapp.components.set_component_model(
1754
+ ... "A1", model_type="Spice", modelpath="pathtospfile", modelname="spicemodelname"
1755
+ ... )
1756
1756
 
1757
1757
  """
1758
1758
  if not modelname:
@@ -2152,9 +2152,7 @@ class Components(object):
2152
2152
 
2153
2153
  >>> from pyedb import Edb
2154
2154
  >>> edbapp = Edb("myaedbfolder")
2155
- >>> edbapp.components.set_component_rlc(
2156
- ... "R1", res_value=50, ind_value=1e-9, cap_value=1e-12, isparallel=False
2157
- ... )
2155
+ >>> edbapp.components.set_component_rlc("R1", res_value=50, ind_value=1e-9, cap_value=1e-12, isparallel=False)
2158
2156
 
2159
2157
  """
2160
2158
  if res_value is None and ind_value is None and cap_value is None:
@@ -21,6 +21,7 @@
21
21
  # SOFTWARE.
22
22
 
23
23
  """Database."""
24
+
24
25
  import re
25
26
 
26
27
  from pyedb.dotnet.database.general import convert_py_list_to_net_list
@@ -123,7 +123,7 @@ class ControlProperty:
123
123
  float(value)
124
124
  self.type = 0
125
125
  except TypeError:
126
- pass
126
+ self.type = -1
127
127
 
128
128
  def _write_xml(self, root):
129
129
  try:
@@ -133,8 +133,11 @@ class ControlProperty:
133
133
  double.text = str(self.value)
134
134
  else:
135
135
  pass
136
- except:
137
- pass
136
+ except Exception as e:
137
+ settings.logger.error(
138
+ f"A(n) {type(e).__name__} error occurred while attempting to create a new sub-element {self.name} "
139
+ f"for element {root}: {str(e)}"
140
+ )
138
141
 
139
142
 
140
143
  class ControlFileMaterial:
@@ -37,8 +37,8 @@ class EDBNetsData(NetDotNet):
37
37
  >>> from pyedb import Edb
38
38
  >>> edb = Edb(myedb, edbversion="2021.2")
39
39
  >>> edb_net = edb.nets.nets["GND"]
40
- >>> edb_net.name # Class Property
41
- >>> edb_net.name # EDB Object Property
40
+ >>> edb_net.name # Class Property
41
+ >>> edb_net.name # EDB Object Property
42
42
  """
43
43
 
44
44
  def __init__(self, raw_net, core_app):
@@ -220,7 +220,7 @@ class EDBExtendedNetData(ExtendedNetDotNet):
220
220
  >>> from pyedb import Edb
221
221
  >>> edb = Edb(myedb, edbversion="2021.2")
222
222
  >>> edb_extended_net = edb.nets.extended_nets["GND"]
223
- >>> edb_extended_net.name # Class Property
223
+ >>> edb_extended_net.name # Class Property
224
224
  """
225
225
 
226
226
  def __init__(self, core_app, raw_extended_net=None):
@@ -1740,8 +1740,11 @@ class EDBPadstackInstance(Connectable):
1740
1740
  hole_diam = 0
1741
1741
  try: # pragma no cover
1742
1742
  hole_diam = padstack_def.hole_properties[0]
1743
- except: # pragma no cover
1744
- pass
1743
+ except Exception as e: # pragma no cover
1744
+ self._pedb.logger.error(
1745
+ f"Failed to access first element of hole_properties attribute of object "
1746
+ f"{padstack_def} - Hole diameter is set to default value 0 - {type(e).__name__}: {str(e)}"
1747
+ )
1745
1748
  if hole_diam: # pragma no cover
1746
1749
  hole_finished_size = padstack_def.hole_finished_size
1747
1750
  via_length = (
@@ -49,36 +49,11 @@ class GapPort(EdgeTerminal):
49
49
  def __init__(self, pedb, edb_object):
50
50
  super().__init__(pedb, edb_object)
51
51
 
52
- @property
53
- def magnitude(self):
54
- """Magnitude."""
55
- return self._edb_object.GetSourceAmplitude().ToDouble()
56
-
57
- @property
58
- def source_amplitude(self):
59
- """Property added for grpc compatibility"""
60
- return self.magnitude
61
-
62
- @property
63
- def source_phase(self):
64
- """Property added for grpc compatibility"""
65
- return self.phase
66
-
67
- @property
68
- def phase(self):
69
- """Phase."""
70
- return self._edb_object.GetSourcePhase().ToDouble()
71
-
72
52
  @property
73
53
  def renormalize(self):
74
54
  """Whether renormalize is active."""
75
55
  return self._edb_object.GetPortPostProcessingProp().DoRenormalize
76
56
 
77
- @property
78
- def deembed(self):
79
- """Inductance value of the deembed gap port."""
80
- return self._edb_object.GetPortPostProcessingProp().DoDeembedGapL
81
-
82
57
  @property
83
58
  def renormalize_z0(self):
84
59
  """Renormalize Z0 value (real, imag)."""
@@ -358,9 +358,9 @@ class EDBArcs(object):
358
358
  >>> from pyedb import Edb
359
359
  >>> edb = Edb(myedb, edbversion="2021.2")
360
360
  >>> prim_arcs = edb.modeler.primitives[0].arcs
361
- >>> prim_arcs.center # arc center
362
- >>> prim_arcs.points # arc point list
363
- >>> prim_arcs.mid_point # arc mid point
361
+ >>> prim_arcs.center # arc center
362
+ >>> prim_arcs.points # arc point list
363
+ >>> prim_arcs.mid_point # arc mid point
364
364
  """
365
365
 
366
366
  def __init__(self, app, arc):
@@ -85,11 +85,13 @@ class RaptorXSimulationSetup(SimulationSetup):
85
85
  Examples
86
86
  --------
87
87
  >>> setup1 = edbapp.create_hfss_setup("setup1")
88
- >>> setup1.add_frequency_sweep(frequency_sweep=[
89
- ... ["linear count", "0", "1kHz", 1],
90
- ... ["log scale", "1kHz", "0.1GHz", 10],
91
- ... ["linear scale", "0.1GHz", "10GHz", "0.1GHz"],
92
- ... ])
88
+ >>> setup1.add_frequency_sweep(
89
+ ... frequency_sweep=[
90
+ ... ["linear count", "0", "1kHz", 1],
91
+ ... ["log scale", "1kHz", "0.1GHz", 10],
92
+ ... ["linear scale", "0.1GHz", "10GHz", "0.1GHz"],
93
+ ... ]
94
+ ... )
93
95
  """
94
96
  if name in self.frequency_sweeps:
95
97
  return False
@@ -234,9 +236,7 @@ class RaptorXSimulationAdvancedSettings(object):
234
236
  if isinstance(value, list):
235
237
  self._advanced_settings.NetSettingsOptions = convert_py_list_to_net_list(value)
236
238
  else:
237
- self.logger.error(
238
- f"RaptorX setup net_settings_options input setter must be a list. " f"Provided value {value}"
239
- )
239
+ self.logger.error(f"RaptorX setup net_settings_options input setter must be a list. Provided value {value}")
240
240
 
241
241
  @property
242
242
  def override_shrink_fac(self):
@@ -276,7 +276,7 @@ class RaptorXSimulationAdvancedSettings(object):
276
276
  self._advanced_settings.UseAccelerateViaExtraction = value
277
277
  else:
278
278
  self.logger.error(
279
- "RaptorX setup use_accelerate_via_extraction setter input must be boolean." f"Provided value {value}"
279
+ f"RaptorX setup use_accelerate_via_extraction setter input must be boolean. Provided value {value}"
280
280
  )
281
281
 
282
282
  @property
@@ -290,7 +290,7 @@ class RaptorXSimulationAdvancedSettings(object):
290
290
  self._advanced_settings.UseAutoRemovalSliverPoly = value
291
291
  else:
292
292
  self.logger.error(
293
- f"RaptorX setup use_auto_removal_sliver_poly setter must be a boolean. " f"Provided value {value}"
293
+ f"RaptorX setup use_auto_removal_sliver_poly setter must be a boolean. Provided value {value}"
294
294
  )
295
295
 
296
296
  @property
@@ -334,7 +334,7 @@ class RaptorXSimulationAdvancedSettings(object):
334
334
  self._advanced_settings.UseEliminateSlitPerHoles = value
335
335
  else:
336
336
  self.logger.error(
337
- f"RaptorX setup use_eliminate_slit_per_holes setter must be a boolean. " f"Provided value {value}"
337
+ f"RaptorX setup use_eliminate_slit_per_holes setter must be a boolean. Provided value {value}"
338
338
  )
339
339
 
340
340
  @property
@@ -350,7 +350,7 @@ class RaptorXSimulationAdvancedSettings(object):
350
350
  self._advanced_settings.UseEnableAdvancedCapEffects = value
351
351
  else:
352
352
  self.logger.error(
353
- f"RaptorX setup use_enable_advanced_cap_effects setter must be a boolean. " f"Provided value {value}"
353
+ f"RaptorX setup use_enable_advanced_cap_effects setter must be a boolean. Provided value {value}"
354
354
  )
355
355
 
356
356
  @property
@@ -366,7 +366,7 @@ class RaptorXSimulationAdvancedSettings(object):
366
366
  self._advanced_settings.UseEnableEtchTransform = value
367
367
  else:
368
368
  self.logger.error(
369
- f"RaptorX setup use_enable_etch_transform setter must be a boolean. " f"Provided value {value}"
369
+ f"RaptorX setup use_enable_etch_transform setter must be a boolean. Provided value {value}"
370
370
  )
371
371
 
372
372
  @property
@@ -382,7 +382,7 @@ class RaptorXSimulationAdvancedSettings(object):
382
382
  self._advanced_settings.UseEnableHybridExtraction = value
383
383
  else:
384
384
  self.logger.error(
385
- f"RaptorX setup use_enable_hybrid_extraction setter must be a boolean. " f"Provided value {value}"
385
+ f"RaptorX setup use_enable_hybrid_extraction setter must be a boolean. Provided value {value}"
386
386
  )
387
387
 
388
388
  @property
@@ -414,7 +414,7 @@ class RaptorXSimulationAdvancedSettings(object):
414
414
  self._advanced_settings.UseExtractFloatingMetalsDummy = value
415
415
  else:
416
416
  self.logger.error(
417
- f"RaptorX setup use_extract_floating_metals_dummy setter must be a boolean. " f"Provided value {value}"
417
+ f"RaptorX setup use_extract_floating_metals_dummy setter must be a boolean. Provided value {value}"
418
418
  )
419
419
 
420
420
  @property
@@ -430,8 +430,7 @@ class RaptorXSimulationAdvancedSettings(object):
430
430
  self._advanced_settings.UseExtractFloatingMetalsFloating = value
431
431
  else:
432
432
  self.logger.error(
433
- f"RaptorX setup use_extract_floating_metals_floating setter must be a boolean. "
434
- f"Provided value {value}"
433
+ f"RaptorX setup use_extract_floating_metals_floating setter must be a boolean. Provided value {value}"
435
434
  )
436
435
 
437
436
  @property
@@ -493,7 +492,7 @@ class RaptorXSimulationAdvancedSettings(object):
493
492
  self._advanced_settings.UsePlaneProjectionFactor = value
494
493
  else:
495
494
  self.logger.error(
496
- f"RaptorX setup use_plane_projection_factor setter must be a boolean. " f"Provided value {value}"
495
+ f"RaptorX setup use_plane_projection_factor setter must be a boolean. Provided value {value}"
497
496
  )
498
497
 
499
498
  @property
@@ -506,4 +505,4 @@ class RaptorXSimulationAdvancedSettings(object):
506
505
  if isinstance(value, bool):
507
506
  self._advanced_settings.UseRelaxedZAxis = value
508
507
  else:
509
- self.logger.error(f"RaptorX setup use_relaxed_z_axis setter must be a boolean. " f"Provided value {value}")
508
+ self.logger.error(f"RaptorX setup use_relaxed_z_axis setter must be a boolean. Provided value {value}")
@@ -2132,7 +2132,7 @@ class SimulationConfiguration(object):
2132
2132
 
2133
2133
  Defined the radiation box type, Conformal, Bounding box and ConvexHull are supported (HFSS only).
2134
2134
 
2135
- >>> sim_setup.max_num_passes= 30
2135
+ >>> sim_setup.max_num_passes = 30
2136
2136
 
2137
2137
  Default value is 30, specify the maximum number of adaptive passes (only HFSS). Reasonable high value is recommended
2138
2138
  to force the solver reaching the convergence criteria.
@@ -2147,7 +2147,7 @@ class SimulationConfiguration(object):
2147
2147
  local minima.
2148
2148
 
2149
2149
  >>> from dotnet.generic.constants import BasisOrder
2150
- >>> sim_setup.basis_order = BasisOrder.Single
2150
+ >>> sim_setup.basis_order = BasisOrder.Single
2151
2151
 
2152
2152
  Select the order basis (HFSS only), Zero, Single, Double and Mixed are supported. For Signal integrity Single or
2153
2153
  Mixed should be used.
@@ -2229,7 +2229,7 @@ class SimulationConfiguration(object):
2229
2229
 
2230
2230
  Activate the loop resistance usage per pin when ``True``
2231
2231
 
2232
- >>> sim_setup.dc_via_report_path = 'C:\\temp\\via_report_file'
2232
+ >>> sim_setup.dc_via_report_path = "C:\\temp\\via_report_file"
2233
2233
 
2234
2234
  Define the via report path file.
2235
2235
 
@@ -23,6 +23,7 @@
23
23
  """
24
24
  This module contains the ``EdbHfss`` class.
25
25
  """
26
+
26
27
  import math
27
28
 
28
29
  from pyedb.dotnet.database.edb_data.hfss_extent_info import HfssExtentInfo
@@ -174,8 +175,8 @@ class EdbHfss(object):
174
175
 
175
176
  >>> from pyedb import Edb
176
177
  >>> edbapp = Edb("myaedbfolder", "project name", "release version")
177
- >>> pins =edbapp.components.get_pin_from_component("U2A5")
178
- >>> edbapp.hfss.create_circuit_port_on_pin(pins[0], pins[1],50,"port_name")
178
+ >>> pins = edbapp.components.get_pin_from_component("U2A5")
179
+ >>> edbapp.hfss.create_circuit_port_on_pin(pins[0], pins[1], 50, "port_name")
179
180
 
180
181
  Returns
181
182
  -------
@@ -211,8 +212,8 @@ class EdbHfss(object):
211
212
 
212
213
  >>> from pyedb import Edb
213
214
  >>> edbapp = Edb("myaedbfolder", "project name", "release version")
214
- >>> pins =edbapp.components.get_pin_from_component("U2A5")
215
- >>> edbapp.hfss.create_voltage_source_on_pin(pins[0], pins[1],50,"source_name")
215
+ >>> pins = edbapp.components.get_pin_from_component("U2A5")
216
+ >>> edbapp.hfss.create_voltage_source_on_pin(pins[0], pins[1], 50, "source_name")
216
217
  """
217
218
  return self._pedb.siwave.create_voltage_source_on_pin(pos_pin, neg_pin, voltage_value, phase_value, source_name)
218
219
 
@@ -242,8 +243,8 @@ class EdbHfss(object):
242
243
 
243
244
  >>> from pyedb import Edb
244
245
  >>> edbapp = Edb("myaedbfolder", "project name", "release version")
245
- >>> pins =edbapp.components.get_pin_from_component("U2A5")
246
- >>> edbapp.hfss.create_current_source_on_pin(pins[0], pins[1],50,"source_name")
246
+ >>> pins = edbapp.components.get_pin_from_component("U2A5")
247
+ >>> edbapp.hfss.create_current_source_on_pin(pins[0], pins[1], 50, "source_name")
247
248
  """
248
249
 
249
250
  return self._pedb.siwave.create_current_source_on_pin(pos_pin, neg_pin, current_value, phase_value, source_name)
@@ -272,8 +273,8 @@ class EdbHfss(object):
272
273
 
273
274
  >>> from pyedb import Edb
274
275
  >>> edbapp = Edb("myaedbfolder", "project name", "release version")
275
- >>> pins =edbapp.components.get_pin_from_component("U2A5")
276
- >>> edbapp.hfss.create_resistor_on_pin(pins[0], pins[1],50,"res_name")
276
+ >>> pins = edbapp.components.get_pin_from_component("U2A5")
277
+ >>> edbapp.hfss.create_resistor_on_pin(pins[0], pins[1], 50, "res_name")
277
278
  """
278
279
  return self._pedb.siwave.create_resistor_on_pin(pos_pin, neg_pin, rvalue, resistor_name)
279
280
 
@@ -155,7 +155,7 @@ class LayoutValidation:
155
155
  Examples
156
156
  --------
157
157
 
158
- >>> renamed_nets = edb.layout_validation.disjoint_nets(["GND","Net2"])
158
+ >>> renamed_nets = edb.layout_validation.disjoint_nets(["GND", "Net2"])
159
159
  """
160
160
 
161
161
  if not net_list:
@@ -208,8 +208,11 @@ class LayoutValidation:
208
208
  if isinstance(obj_dict[el], Primitive):
209
209
  if not obj_dict[el].is_void:
210
210
  sum += obj_dict[el].area()
211
- except:
212
- pass
211
+ except Exception as e:
212
+ self._pedb.logger.warning(
213
+ f"A(n) {type(e).__name__} error occurred while calculating area "
214
+ f"for element {elem} - Default value of 0 is used: {str(e)}"
215
+ )
213
216
  return sum
214
217
 
215
218
  if order_by_area:
@@ -243,9 +243,7 @@ class Material(object):
243
243
  if self.__dc_model and value:
244
244
  self.__dc_model.SetDCRelativePermitivity(value)
245
245
  else:
246
- self.__edb.logger.error(
247
- f"DC permittivity cannot be updated in material without DC model or value {value}." f""
248
- )
246
+ self.__edb.logger.error(f"DC permittivity cannot be updated in material without DC model or value {value}.")
249
247
 
250
248
  @property
251
249
  def dielectric_model_frequency(self):
@@ -23,6 +23,7 @@
23
23
  """
24
24
  This module contains these classes: `EdbLayout` and `Shape`.
25
25
  """
26
+
26
27
  import math
27
28
  import warnings
28
29
 
@@ -355,8 +356,11 @@ class Modeler(object):
355
356
  bounding_box.Item2.X.ToDouble(),
356
357
  bounding_box.Item2.Y.ToDouble(),
357
358
  ]
358
- except:
359
- pass
359
+ except Exception as e:
360
+ self._logger.warning(
361
+ f"A(n) {type(e).__name__} error occurred while retrieving bounding box for polygon {polygon} - "
362
+ f"Empty list is returned: {str(e)}"
363
+ )
360
364
  return bounding
361
365
 
362
366
  def get_polygon_points(self, polygon):
@@ -383,7 +387,7 @@ class Modeler(object):
383
387
  --------
384
388
 
385
389
  >>> poly = database.modeler.get_polygons_by_layer("GND")
386
- >>> points = database.modeler.get_polygon_points(poly[0])
390
+ >>> points = database.modeler.get_polygon_points(poly[0])
387
391
 
388
392
  """
389
393
  points = []
@@ -308,22 +308,30 @@ class EdbNets(CommonNets):
308
308
  val_value = cmp.rlc_values
309
309
  if refdes in exception_list:
310
310
  pass
311
- elif (
312
- val_type == "Inductor"
313
- and self._pedb.edb_value(val_value[1]).ToDouble() <= self._pedb.edb_value(inductor_below).ToDouble()
314
- ):
315
- pass
316
- elif (
317
- val_type == "Resistor"
318
- and self._pedb.edb_value(val_value[0]).ToDouble() <= self._pedb.edb_value(resistor_below).ToDouble()
319
- ):
320
- pass
321
- elif (
322
- val_type == "Capacitor"
323
- and self._pedb.edb_value(val_value[2]).ToDouble()
324
- >= self._pedb.edb_value(capacitor_above).ToDouble()
325
- ):
326
- pass
311
+ elif val_type == "Inductor":
312
+ if val_value[1] is None:
313
+ continue
314
+ elif (
315
+ not self._pedb.edb_value(val_value[1]).ToDouble()
316
+ <= self._pedb.edb_value(inductor_below).ToDouble()
317
+ ):
318
+ continue
319
+ elif val_type == "Resistor":
320
+ if val_value[0] is None:
321
+ continue
322
+ elif (
323
+ not self._pedb.edb_value(val_value[0]).ToDouble()
324
+ <= self._pedb.edb_value(resistor_below).ToDouble()
325
+ ):
326
+ continue
327
+ elif val_type == "Capacitor":
328
+ if val_value[2] is None:
329
+ continue
330
+ elif (
331
+ not self._pedb.edb_value(val_value[2]).ToDouble()
332
+ >= self._pedb.edb_value(capacitor_above).ToDouble()
333
+ ):
334
+ continue
327
335
  else:
328
336
  continue
329
337
 
@@ -575,7 +583,7 @@ class EdbNets(CommonNets):
575
583
  Examples
576
584
  --------
577
585
 
578
- >>> deleted_nets = database.nets.delete(["Net1","Net2"])
586
+ >>> deleted_nets = database.nets.delete(["Net1", "Net2"])
579
587
  """
580
588
  warnings.warn("Use :func:`delete` method instead.", DeprecationWarning)
581
589
  return self.delete(netlist=netlist)
@@ -596,7 +604,7 @@ class EdbNets(CommonNets):
596
604
  Examples
597
605
  --------
598
606
 
599
- >>> deleted_nets = database.nets.delete(["Net1","Net2"])
607
+ >>> deleted_nets = database.nets.delete(["Net1", "Net2"])
600
608
  """
601
609
  if isinstance(netlist, str):
602
610
  netlist = [netlist]
@@ -733,7 +741,7 @@ class EdbNets(CommonNets):
733
741
  Examples
734
742
  --------
735
743
 
736
- >>> renamed_nets = database.nets.find_and_fix_disjoint_nets(["GND","Net2"])
744
+ >>> renamed_nets = database.nets.find_and_fix_disjoint_nets(["GND", "Net2"])
737
745
  """
738
746
  warnings.warn("Use new function :func:`edb.layout_validation.disjoint_nets` instead.", DeprecationWarning)
739
747
  return self._pedb.layout_validation.disjoint_nets(
@@ -23,6 +23,7 @@
23
23
  """
24
24
  This module contains the `EdbPadstacks` class.
25
25
  """
26
+
26
27
  from collections import defaultdict
27
28
  import math
28
29
  from typing import Dict, List
@@ -708,8 +709,9 @@ class EdbPadstacks(object):
708
709
  )
709
710
  else: # pragma no cover
710
711
  self._logger.error(
711
- "Failed to reassign anti-pad value {} on Pads-stack definition {},"
712
- " layer{}".format(str(value), padstack.edb_padstack.GetName(), layer)
712
+ "Failed to reassign anti-pad value {} on Pads-stack definition {}, layer{}".format(
713
+ str(value), padstack.edb_padstack.GetName(), layer
714
+ )
713
715
  )
714
716
  all_succeed = False
715
717
  padstack.edb_padstack.SetData(cloned_padstack_data)
@@ -349,7 +349,7 @@ class AdvancedSettings(SettingsBase):
349
349
  ``True`` if automatic mesh is used, ``False`` otherwise.
350
350
  """
351
351
  warnings.warn(
352
- "`automatic_mesh` is deprecated." "Use `mesh_automatic` instead.",
352
+ "`automatic_mesh` is deprecated. Use `mesh_automatic` instead.",
353
353
  DeprecationWarning,
354
354
  )
355
355
  return self.sim_setup_info.simulation_settings.AdvancedSettings.MeshAutoMatic
@@ -24,6 +24,7 @@
24
24
  This module contains these classes: ``CircuitPort``, ``CurrentSource``, ``EdbSiwave``,
25
25
  ``PinGroup``, ``ResistorSource``, ``Source``, ``SourceType``, and ``VoltageSource``.
26
26
  """
27
+
27
28
  import os
28
29
  import time
29
30
 
@@ -483,8 +484,8 @@ class EdbSiwave(object):
483
484
 
484
485
  >>> from pyedb import Edb
485
486
  >>> edbapp = Edb("myaedbfolder", "project name", "release version")
486
- >>> pins =edbapp.components.get_pin_from_component("U2A5")
487
- >>> edbapp.siwave.create_resistor_on_pin(pins[0], pins[1],50,"res_name")
487
+ >>> pins = edbapp.components.get_pin_from_component("U2A5")
488
+ >>> edbapp.siwave.create_resistor_on_pin(pins[0], pins[1], 50, "res_name")
488
489
  """
489
490
  resistor = ResistorSource()
490
491
  resistor.positive_node.net = pos_pin.net_name
@@ -625,7 +626,7 @@ class EdbSiwave(object):
625
626
 
626
627
  >>> from pyedb import Edb
627
628
  >>> edbapp = Edb("myaedbfolder", "project name", "release version")
628
- >>> edb.siwave.create_voltage_source_on_net("U2A5","V1P5_S3","U2A5","GND",3.3,0,"source_name")
629
+ >>> edb.siwave.create_voltage_source_on_net("U2A5", "V1P5_S3", "U2A5", "GND", 3.3, 0, "source_name")
629
630
  """
630
631
  if not negative_component_name:
631
632
  negative_component_name = positive_component_name