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.
- pyedb/__init__.py +1 -1
- pyedb/configuration/cfg_data.py +3 -0
- pyedb/configuration/cfg_terminals.py +232 -0
- pyedb/configuration/configuration.py +146 -3
- pyedb/dotnet/clr_module.py +1 -2
- pyedb/dotnet/database/Variables.py +30 -22
- pyedb/dotnet/database/cell/layout.py +5 -1
- pyedb/dotnet/database/cell/primitive/primitive.py +2 -2
- pyedb/dotnet/database/cell/terminal/bundle_terminal.py +12 -0
- pyedb/dotnet/database/cell/terminal/pingroup_terminal.py +1 -1
- pyedb/dotnet/database/cell/terminal/terminal.py +38 -0
- pyedb/dotnet/database/components.py +14 -16
- pyedb/dotnet/database/dotnet/database.py +1 -0
- pyedb/dotnet/database/edb_data/control_file.py +6 -3
- pyedb/dotnet/database/edb_data/nets_data.py +3 -3
- pyedb/dotnet/database/edb_data/padstacks_data.py +5 -2
- pyedb/dotnet/database/edb_data/ports.py +0 -25
- pyedb/dotnet/database/edb_data/primitives_data.py +3 -3
- pyedb/dotnet/database/edb_data/raptor_x_simulation_setup_data.py +18 -19
- pyedb/dotnet/database/edb_data/simulation_configuration.py +3 -3
- pyedb/dotnet/database/hfss.py +9 -8
- pyedb/dotnet/database/layout_validation.py +6 -3
- pyedb/dotnet/database/materials.py +1 -3
- pyedb/dotnet/database/modeler.py +7 -3
- pyedb/dotnet/database/nets.py +27 -19
- pyedb/dotnet/database/padstack.py +4 -2
- pyedb/dotnet/database/sim_setup_data/io/siwave.py +1 -1
- pyedb/dotnet/database/siwave.py +4 -3
- pyedb/dotnet/database/stackup.py +50 -26
- pyedb/dotnet/database/utilities/heatsink.py +0 -1
- pyedb/dotnet/database/utilities/simulation_setup.py +7 -5
- pyedb/dotnet/database/utilities/siwave_cpa_simulation_setup.py +1 -0
- pyedb/dotnet/database/utilities/siwave_simulation_setup.py +5 -2
- pyedb/dotnet/edb.py +39 -34
- pyedb/exceptions.py +1 -2
- pyedb/extensions/create_cell_array.py +19 -5
- pyedb/generic/data_handlers.py +13 -23
- pyedb/generic/design_types.py +9 -35
- pyedb/generic/filesystem.py +4 -2
- pyedb/generic/general_methods.py +4 -5
- pyedb/generic/plot.py +2 -2
- pyedb/grpc/database/_typing.py +0 -0
- pyedb/grpc/database/components.py +7 -8
- pyedb/grpc/database/control_file.py +14 -35
- pyedb/grpc/database/definition/materials.py +1 -1
- pyedb/grpc/database/definition/package_def.py +6 -3
- pyedb/grpc/database/definition/padstack_def.py +4 -7
- pyedb/grpc/database/hfss.py +1 -4
- pyedb/grpc/database/hierarchy/component.py +3 -4
- pyedb/grpc/database/hierarchy/pingroup.py +16 -3
- pyedb/grpc/database/layers/layer.py +1 -2
- pyedb/grpc/database/layers/stackup_layer.py +42 -19
- pyedb/grpc/database/layout/layout.py +43 -27
- pyedb/grpc/database/layout/voltage_regulator.py +6 -1
- pyedb/grpc/database/layout_validation.py +5 -2
- pyedb/grpc/database/modeler.py +226 -244
- pyedb/grpc/database/net/differential_pair.py +9 -2
- pyedb/grpc/database/net/extended_net.py +24 -9
- pyedb/grpc/database/net/net.py +14 -5
- pyedb/grpc/database/net/net_class.py +24 -7
- pyedb/grpc/database/nets.py +11 -43
- pyedb/grpc/database/padstacks.py +5 -16
- pyedb/grpc/database/primitive/bondwire.py +3 -67
- pyedb/grpc/database/primitive/circle.py +42 -3
- pyedb/grpc/database/primitive/padstack_instance.py +17 -19
- pyedb/grpc/database/primitive/path.py +154 -5
- pyedb/grpc/database/primitive/polygon.py +73 -7
- pyedb/grpc/database/primitive/primitive.py +2 -2
- pyedb/grpc/database/primitive/rectangle.py +105 -4
- pyedb/grpc/database/simulation_setup/hfss_general_settings.py +0 -2
- pyedb/grpc/database/simulation_setup/hfss_settings_options.py +0 -4
- pyedb/grpc/database/simulation_setup/siwave_cpa_simulation_setup.py +1 -0
- pyedb/grpc/database/simulation_setup/sweep_data.py +1 -3
- pyedb/grpc/database/siwave.py +6 -13
- pyedb/grpc/database/source_excitations.py +39 -56
- pyedb/grpc/database/stackup.py +50 -27
- pyedb/grpc/database/terminal/bundle_terminal.py +10 -3
- pyedb/grpc/database/terminal/pingroup_terminal.py +8 -1
- pyedb/grpc/database/terminal/terminal.py +19 -8
- pyedb/grpc/database/utility/heat_sink.py +0 -1
- pyedb/grpc/database/utility/hfss_extent_info.py +2 -2
- pyedb/grpc/database/utility/xml_control_file.py +6 -3
- pyedb/grpc/edb.py +24 -19
- pyedb/grpc/edb_init.py +1 -0
- pyedb/ipc2581/ecad/cad_data/layer_feature.py +6 -2
- pyedb/ipc2581/ecad/cad_data/step.py +1 -1
- pyedb/ipc2581/ipc2581.py +8 -7
- pyedb/libraries/common.py +3 -4
- pyedb/libraries/rf_libraries/base_functions.py +7 -16
- pyedb/libraries/rf_libraries/planar_antennas.py +3 -21
- pyedb/misc/downloads.py +1 -0
- pyedb/misc/misc.py +5 -2
- pyedb/misc/siw_feature_config/emc_rule_checker_settings.py +1 -1
- pyedb/misc/utilities.py +0 -1
- pyedb/modeler/geometry_operators.py +3 -2
- {pyedb-0.56.0.dist-info → pyedb-0.57.0.dist-info}/METADATA +3 -3
- {pyedb-0.56.0.dist-info → pyedb-0.57.0.dist-info}/RECORD +99 -97
- {pyedb-0.56.0.dist-info → pyedb-0.57.0.dist-info}/WHEEL +0 -0
- {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,
|
|
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
|
-
...
|
|
549
|
-
...
|
|
550
|
-
...
|
|
551
|
-
...
|
|
552
|
-
...
|
|
553
|
-
...
|
|
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
|
|
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(
|
|
1754
|
-
...
|
|
1755
|
-
...
|
|
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:
|
|
@@ -123,7 +123,7 @@ class ControlProperty:
|
|
|
123
123
|
float(value)
|
|
124
124
|
self.type = 0
|
|
125
125
|
except TypeError:
|
|
126
|
-
|
|
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
|
-
|
|
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
|
|
41
|
-
>>> edb_net.name
|
|
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
|
|
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
|
-
|
|
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
|
|
362
|
-
>>> prim_arcs.points
|
|
363
|
-
>>> prim_arcs.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(
|
|
89
|
-
...
|
|
90
|
-
...
|
|
91
|
-
...
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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 =
|
|
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 =
|
|
2232
|
+
>>> sim_setup.dc_via_report_path = "C:\\temp\\via_report_file"
|
|
2233
2233
|
|
|
2234
2234
|
Define the via report path file.
|
|
2235
2235
|
|
pyedb/dotnet/database/hfss.py
CHANGED
|
@@ -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
|
-
|
|
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):
|
pyedb/dotnet/database/modeler.py
CHANGED
|
@@ -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
|
-
|
|
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
|
|
390
|
+
>>> points = database.modeler.get_polygon_points(poly[0])
|
|
387
391
|
|
|
388
392
|
"""
|
|
389
393
|
points = []
|
pyedb/dotnet/database/nets.py
CHANGED
|
@@ -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
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
pyedb/dotnet/database/siwave.py
CHANGED
|
@@ -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
|