pyedb 0.38.0__py3-none-any.whl → 0.39.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pyedb might be problematic. Click here for more details.
- pyedb/__init__.py +1 -1
- pyedb/common/nets.py +53 -139
- pyedb/configuration/cfg_components.py +1 -1
- pyedb/configuration/cfg_general.py +4 -2
- pyedb/configuration/cfg_modeler.py +1 -1
- pyedb/configuration/cfg_package_definition.py +1 -1
- pyedb/configuration/cfg_padstacks.py +1 -1
- pyedb/configuration/cfg_ports_sources.py +56 -23
- pyedb/configuration/configuration.py +18 -1
- pyedb/dotnet/{application → database}/Variables.py +21 -21
- pyedb/dotnet/{edb_core → database}/cell/connectable.py +5 -5
- pyedb/dotnet/{edb_core → database}/cell/hierarchy/component.py +11 -11
- pyedb/dotnet/{edb_core → database}/cell/hierarchy/hierarchy_obj.py +1 -1
- pyedb/dotnet/{edb_core → database}/cell/hierarchy/model.py +1 -1
- pyedb/dotnet/{edb_core → database}/cell/layout.py +17 -17
- pyedb/dotnet/{edb_core → database}/cell/layout_obj.py +3 -3
- pyedb/dotnet/{edb_core → database}/cell/primitive/bondwire.py +1 -1
- pyedb/dotnet/{edb_core → database}/cell/primitive/path.py +4 -4
- pyedb/dotnet/{edb_core → database}/cell/primitive/primitive.py +14 -14
- pyedb/dotnet/{edb_core → database}/cell/terminal/bundle_terminal.py +2 -2
- pyedb/dotnet/{edb_core → database}/cell/terminal/edge_terminal.py +4 -4
- pyedb/dotnet/{edb_core → database}/cell/terminal/padstack_instance_terminal.py +2 -2
- pyedb/dotnet/{edb_core → database}/cell/terminal/pingroup_terminal.py +2 -2
- pyedb/dotnet/{edb_core → database}/cell/terminal/point_terminal.py +2 -2
- pyedb/dotnet/{edb_core → database}/cell/terminal/terminal.py +11 -11
- pyedb/dotnet/{edb_core → database}/cell/voltage_regulator.py +2 -2
- pyedb/dotnet/{edb_core → database}/components.py +101 -124
- pyedb/dotnet/{edb_core → database}/definition/component_def.py +5 -5
- pyedb/dotnet/{edb_core → database}/definition/component_model.py +1 -1
- pyedb/dotnet/{edb_core → database}/definition/definition_obj.py +1 -1
- pyedb/dotnet/{edb_core → database}/definition/definitions.py +2 -2
- pyedb/dotnet/{edb_core → database}/definition/package_def.py +4 -4
- pyedb/dotnet/{edb_core → database}/dotnet/database.py +8 -8
- pyedb/dotnet/{edb_core → database}/dotnet/primitive.py +9 -9
- pyedb/dotnet/{edb_core → database}/edb_data/control_file.py +12 -12
- pyedb/dotnet/{edb_core → database}/edb_data/hfss_extent_info.py +7 -7
- pyedb/dotnet/{edb_core → database}/edb_data/nets_data.py +10 -13
- pyedb/dotnet/{edb_core → database}/edb_data/padstacks_data.py +16 -16
- pyedb/dotnet/{edb_core → database}/edb_data/ports.py +4 -4
- pyedb/dotnet/{edb_core → database}/edb_data/primitives_data.py +5 -5
- pyedb/dotnet/{edb_core → database}/edb_data/raptor_x_simulation_setup_data.py +4 -4
- pyedb/dotnet/{edb_core → database}/edb_data/simulation_configuration.py +10 -10
- pyedb/dotnet/{edb_core → database}/edb_data/sources.py +4 -4
- pyedb/dotnet/{edb_core → database}/edb_data/variables.py +1 -1
- pyedb/dotnet/{edb_core → database}/geometry/polygon_data.py +4 -4
- pyedb/dotnet/{edb_core → database}/hfss.py +8 -8
- pyedb/dotnet/{edb_core → database}/layout_obj_instance.py +1 -1
- pyedb/dotnet/{edb_core → database}/layout_validation.py +2 -2
- pyedb/dotnet/{edb_core → database}/materials.py +23 -8
- pyedb/dotnet/{edb_core → database}/modeler.py +27 -27
- pyedb/dotnet/{edb_core → database}/net_class.py +8 -8
- pyedb/dotnet/{edb_core → database}/nets.py +12 -12
- pyedb/dotnet/{edb_core → database}/padstack.py +15 -15
- pyedb/dotnet/{edb_core → database}/sim_setup_data/data/mesh_operation.py +1 -1
- pyedb/dotnet/{edb_core → database}/sim_setup_data/data/settings.py +3 -3
- pyedb/dotnet/{edb_core → database}/sim_setup_data/data/sim_setup_info.py +2 -2
- pyedb/dotnet/{edb_core → database}/sim_setup_data/data/simulation_settings.py +1 -1
- pyedb/dotnet/{edb_core → database}/sim_setup_data/data/siw_dc_ir_settings.py +1 -1
- pyedb/dotnet/{edb_core → database}/sim_setup_data/data/sweep_data.py +1 -1
- pyedb/dotnet/{edb_core → database}/siwave.py +10 -10
- pyedb/dotnet/{edb_core → database}/stackup.py +12 -12
- pyedb/dotnet/{edb_core → database}/utilities/hfss_simulation_setup.py +15 -15
- pyedb/dotnet/{edb_core → database}/utilities/obj_base.py +1 -1
- pyedb/dotnet/{edb_core → database}/utilities/simulation_setup.py +3 -3
- pyedb/dotnet/{edb_core → database}/utilities/siwave_simulation_setup.py +6 -6
- pyedb/dotnet/edb.py +117 -112
- pyedb/generic/design_types.py +26 -19
- pyedb/generic/general_methods.py +1 -1
- pyedb/generic/plot.py +0 -2
- pyedb/grpc/database/__init__.py +1 -0
- pyedb/grpc/database/components.py +2354 -0
- pyedb/grpc/database/control_file.py +1277 -0
- pyedb/grpc/database/definition/component_def.py +218 -0
- pyedb/grpc/database/definition/component_model.py +39 -0
- pyedb/grpc/database/definition/component_pin.py +32 -0
- pyedb/grpc/database/definition/materials.py +1207 -0
- pyedb/grpc/database/definition/n_port_component_model.py +34 -0
- pyedb/grpc/database/definition/package_def.py +227 -0
- pyedb/grpc/database/definition/padstack_def.py +842 -0
- pyedb/grpc/database/definitions.py +70 -0
- pyedb/grpc/database/general.py +43 -0
- pyedb/grpc/database/geometry/__init__.py +0 -0
- pyedb/grpc/database/geometry/arc_data.py +93 -0
- pyedb/grpc/database/geometry/point_3d_data.py +79 -0
- pyedb/grpc/database/geometry/point_data.py +30 -0
- pyedb/grpc/database/geometry/polygon_data.py +133 -0
- pyedb/grpc/database/hfss.py +1279 -0
- pyedb/grpc/database/hierarchy/__init__.py +0 -0
- pyedb/grpc/database/hierarchy/component.py +1301 -0
- pyedb/grpc/database/hierarchy/model.py +31 -0
- pyedb/grpc/database/hierarchy/netlist_model.py +30 -0
- pyedb/grpc/database/hierarchy/pin_pair_model.py +128 -0
- pyedb/grpc/database/hierarchy/pingroup.py +245 -0
- pyedb/grpc/database/hierarchy/s_parameter_model.py +33 -0
- pyedb/grpc/database/hierarchy/spice_model.py +48 -0
- pyedb/grpc/database/layers/__init__.py +0 -0
- pyedb/grpc/database/layers/layer.py +57 -0
- pyedb/grpc/database/layers/stackup_layer.py +410 -0
- pyedb/grpc/database/layout/__init__.py +0 -0
- pyedb/grpc/database/layout/cell.py +30 -0
- pyedb/grpc/database/layout/layout.py +196 -0
- pyedb/grpc/database/layout/voltage_regulator.py +149 -0
- pyedb/grpc/database/layout_validation.py +319 -0
- pyedb/grpc/database/modeler.py +1468 -0
- pyedb/grpc/database/net/__init__.py +0 -0
- pyedb/grpc/database/net/differential_pair.py +138 -0
- pyedb/grpc/database/net/extended_net.py +340 -0
- pyedb/grpc/database/net/net.py +198 -0
- pyedb/grpc/database/net/net_class.py +93 -0
- pyedb/grpc/database/nets.py +633 -0
- pyedb/grpc/database/padstacks.py +1500 -0
- pyedb/grpc/database/ports/__init__.py +0 -0
- pyedb/grpc/database/ports/ports.py +396 -0
- pyedb/grpc/database/primitive/__init__.py +3 -0
- pyedb/grpc/database/primitive/bondwire.py +181 -0
- pyedb/grpc/database/primitive/circle.py +75 -0
- pyedb/grpc/database/primitive/padstack_instance.py +1116 -0
- pyedb/grpc/database/primitive/path.py +346 -0
- pyedb/grpc/database/primitive/polygon.py +276 -0
- pyedb/grpc/database/primitive/primitive.py +739 -0
- pyedb/grpc/database/primitive/rectangle.py +146 -0
- pyedb/grpc/database/simulation_setup/__init__.py +0 -0
- pyedb/grpc/database/simulation_setup/adaptive_frequency.py +33 -0
- pyedb/grpc/database/simulation_setup/hfss_advanced_meshing_settings.py +32 -0
- pyedb/grpc/database/simulation_setup/hfss_advanced_settings.py +59 -0
- pyedb/grpc/database/simulation_setup/hfss_dcr_settings.py +35 -0
- pyedb/grpc/database/simulation_setup/hfss_general_settings.py +61 -0
- pyedb/grpc/database/simulation_setup/hfss_settings_options.py +78 -0
- pyedb/grpc/database/simulation_setup/hfss_simulation_settings.py +118 -0
- pyedb/grpc/database/simulation_setup/hfss_simulation_setup.py +355 -0
- pyedb/grpc/database/simulation_setup/hfss_solver_settings.py +34 -0
- pyedb/grpc/database/simulation_setup/mesh_operation.py +34 -0
- pyedb/grpc/database/simulation_setup/raptor_x_advanced_settings.py +34 -0
- pyedb/grpc/database/simulation_setup/raptor_x_general_settings.py +33 -0
- pyedb/grpc/database/simulation_setup/raptor_x_simulation_settings.py +64 -0
- pyedb/grpc/database/simulation_setup/raptor_x_simulation_setup.py +125 -0
- pyedb/grpc/database/simulation_setup/siwave_dcir_simulation_setup.py +34 -0
- pyedb/grpc/database/simulation_setup/siwave_simulation_setup.py +119 -0
- pyedb/grpc/database/simulation_setup/sweep_data.py +32 -0
- pyedb/grpc/database/siwave.py +1023 -0
- pyedb/grpc/database/source_excitations.py +2572 -0
- pyedb/grpc/database/stackup.py +2574 -0
- pyedb/grpc/database/terminal/__init__.py +0 -0
- pyedb/grpc/database/terminal/bundle_terminal.py +218 -0
- pyedb/grpc/database/terminal/edge_terminal.py +51 -0
- pyedb/grpc/database/terminal/padstack_instance_terminal.py +171 -0
- pyedb/grpc/database/terminal/pingroup_terminal.py +162 -0
- pyedb/grpc/database/terminal/point_terminal.py +99 -0
- pyedb/grpc/database/terminal/terminal.py +470 -0
- pyedb/grpc/database/utility/__init__.py +3 -0
- pyedb/grpc/database/utility/constants.py +25 -0
- pyedb/grpc/database/utility/heat_sink.py +124 -0
- pyedb/grpc/database/utility/hfss_extent_info.py +448 -0
- pyedb/grpc/database/utility/layout_statistics.py +277 -0
- pyedb/grpc/database/utility/rlc.py +80 -0
- pyedb/grpc/database/utility/simulation_configuration.py +3305 -0
- pyedb/grpc/database/utility/sources.py +388 -0
- pyedb/grpc/database/utility/sweep_data_distribution.py +83 -0
- pyedb/grpc/database/utility/xml_control_file.py +1277 -0
- pyedb/grpc/edb.py +4151 -0
- pyedb/grpc/edb_init.py +481 -0
- pyedb/grpc/rpc_session.py +177 -0
- pyedb/ipc2581/ecad/cad_data/assembly_drawing.py +3 -2
- pyedb/ipc2581/ecad/cad_data/feature.py +4 -3
- pyedb/ipc2581/ecad/cad_data/layer_feature.py +32 -20
- pyedb/ipc2581/ecad/cad_data/outline.py +3 -2
- pyedb/ipc2581/ecad/cad_data/package.py +4 -3
- pyedb/ipc2581/ecad/cad_data/path.py +82 -31
- pyedb/ipc2581/ecad/cad_data/polygon.py +122 -60
- pyedb/ipc2581/ecad/cad_data/profile.py +13 -12
- pyedb/ipc2581/ecad/cad_data/step.py +53 -21
- pyedb/ipc2581/ipc2581.py +47 -49
- pyedb/modeler/geometry_operators.py +1 -1
- {pyedb-0.38.0.dist-info → pyedb-0.39.0.dist-info}/METADATA +5 -2
- pyedb-0.39.0.dist-info/RECORD +288 -0
- pyedb-0.38.0.dist-info/RECORD +0 -195
- /pyedb/dotnet/{edb_core → database}/__init__.py +0 -0
- /pyedb/dotnet/{application → database/cell}/__init__.py +0 -0
- /pyedb/dotnet/{edb_core/cell → database/cell/hierarchy}/__init__.py +0 -0
- /pyedb/dotnet/{edb_core → database}/cell/hierarchy/netlist_model.py +0 -0
- /pyedb/dotnet/{edb_core → database}/cell/hierarchy/pin_pair_model.py +0 -0
- /pyedb/dotnet/{edb_core → database}/cell/hierarchy/s_parameter_model.py +0 -0
- /pyedb/dotnet/{edb_core → database}/cell/hierarchy/spice_model.py +0 -0
- /pyedb/dotnet/{edb_core → database}/cell/primitive/__init__.py +0 -0
- /pyedb/dotnet/{edb_core/cell/hierarchy → database/cell/terminal}/__init__.py +0 -0
- /pyedb/dotnet/{edb_core/cell/terminal → database/definition}/__init__.py +0 -0
- /pyedb/dotnet/{edb_core/definition → database/dotnet}/__init__.py +0 -0
- /pyedb/dotnet/{edb_core/dotnet → database/edb_data}/__init__.py +0 -0
- /pyedb/dotnet/{edb_core → database}/edb_data/design_options.py +0 -0
- /pyedb/dotnet/{edb_core → database}/edb_data/edbvalue.py +0 -0
- /pyedb/dotnet/{edb_core → database}/edb_data/layer_data.py +0 -0
- /pyedb/dotnet/{edb_core → database}/edb_data/utilities.py +0 -0
- /pyedb/dotnet/{edb_core → database}/general.py +0 -0
- /pyedb/dotnet/{edb_core/edb_data → database/geometry}/__init__.py +0 -0
- /pyedb/dotnet/{edb_core → database}/geometry/point_data.py +0 -0
- /pyedb/dotnet/{edb_core → database}/sim_setup_data/__init__.py +0 -0
- /pyedb/dotnet/{edb_core → database}/sim_setup_data/data/__init__.py +0 -0
- /pyedb/dotnet/{edb_core → database}/sim_setup_data/data/adaptive_frequency_data.py +0 -0
- /pyedb/dotnet/{edb_core/geometry → database/sim_setup_data/io}/__init__.py +0 -0
- /pyedb/dotnet/{edb_core → database}/sim_setup_data/io/siwave.py +0 -0
- /pyedb/dotnet/{edb_core → database}/utilities/__init__.py +0 -0
- /pyedb/dotnet/{edb_core → database}/utilities/heatsink.py +0 -0
- /pyedb/{dotnet/edb_core/sim_setup_data/io → grpc/database/definition}/__init__.py +0 -0
- {pyedb-0.38.0.dist-info → pyedb-0.39.0.dist-info}/LICENSE +0 -0
- {pyedb-0.38.0.dist-info → pyedb-0.39.0.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates.
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
#
|
|
4
|
+
#
|
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
# of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
# in the Software without restriction, including without limitation the rights
|
|
8
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
# copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
# furnished to do so, subject to the following conditions:
|
|
11
|
+
#
|
|
12
|
+
# The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
# copies or substantial portions of the Software.
|
|
14
|
+
#
|
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
# SOFTWARE.
|
|
22
|
+
|
|
23
|
+
from ansys.edb.core.utility.hfss_extent_info import HfssExtentInfo as GrpcHfssExtentInfo
|
|
24
|
+
from ansys.edb.core.utility.value import Value as GrpcValue
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class HfssExtentInfo(GrpcHfssExtentInfo):
|
|
28
|
+
"""Manages EDB functionalities for HFSS extent information.
|
|
29
|
+
|
|
30
|
+
Parameters
|
|
31
|
+
----------
|
|
32
|
+
pedb : :class:`pyedb.grpc.edb.Edb`
|
|
33
|
+
Inherited EDB object.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
def __init__(self, pedb):
|
|
37
|
+
self._pedb = pedb
|
|
38
|
+
super().__init__()
|
|
39
|
+
self.extent_type_mapping = {
|
|
40
|
+
"bounding_box": GrpcHfssExtentInfo.HFSSExtentInfoType.BOUNDING_BOX,
|
|
41
|
+
"conforming": GrpcHfssExtentInfo.HFSSExtentInfoType.CONFORMING,
|
|
42
|
+
"convex_hull": GrpcHfssExtentInfo.HFSSExtentInfoType.CONVEX_HUL,
|
|
43
|
+
"polygon": GrpcHfssExtentInfo.HFSSExtentInfoType.POLYGON,
|
|
44
|
+
}
|
|
45
|
+
self._open_region_type = {
|
|
46
|
+
"radiation": GrpcHfssExtentInfo.OpenRegionType.RADIATION,
|
|
47
|
+
"pml": GrpcHfssExtentInfo.OpenRegionType.PML,
|
|
48
|
+
}
|
|
49
|
+
self.hfss_extent_type = self._hfss_extent_info.extent_type
|
|
50
|
+
|
|
51
|
+
def _update_hfss_extent_info(self, hfss_extent):
|
|
52
|
+
return self._pedb.active_cell.set_hfss_extent_info(hfss_extent)
|
|
53
|
+
|
|
54
|
+
@property
|
|
55
|
+
def _hfss_extent_info(self):
|
|
56
|
+
return self._pedb.active_cell.hfss_extent_info
|
|
57
|
+
|
|
58
|
+
@property
|
|
59
|
+
def air_box_horizontal_extent_enabled(self):
|
|
60
|
+
"""Whether horizontal extent is enabled for the airbox.
|
|
61
|
+
|
|
62
|
+
Returns
|
|
63
|
+
-------
|
|
64
|
+
bool.
|
|
65
|
+
|
|
66
|
+
"""
|
|
67
|
+
return self._hfss_extent_info.air_box_horizontal_extent[1]
|
|
68
|
+
|
|
69
|
+
@air_box_horizontal_extent_enabled.setter
|
|
70
|
+
def air_box_horizontal_extent_enabled(self, value):
|
|
71
|
+
hfss_extent = self._hfss_extent_info
|
|
72
|
+
hfss_extent.air_box_horizontal_extent = value
|
|
73
|
+
self._update_hfss_extent_info(hfss_extent)
|
|
74
|
+
|
|
75
|
+
@property
|
|
76
|
+
def air_box_horizontal_extent(self):
|
|
77
|
+
"""Size of horizontal extent for the air box.
|
|
78
|
+
|
|
79
|
+
Returns
|
|
80
|
+
-------
|
|
81
|
+
float
|
|
82
|
+
Air box horizontal extent value.
|
|
83
|
+
"""
|
|
84
|
+
return self._hfss_extent_info.air_box_horizontal_extent[0]
|
|
85
|
+
|
|
86
|
+
@air_box_horizontal_extent.setter
|
|
87
|
+
def air_box_horizontal_extent(self, value):
|
|
88
|
+
hfss_extent = self._hfss_extent_info
|
|
89
|
+
hfss_extent.air_box_horizontal_extent = float(value)
|
|
90
|
+
self._update_hfss_extent_info(hfss_extent)
|
|
91
|
+
|
|
92
|
+
@property
|
|
93
|
+
def air_box_positive_vertical_extent_enabled(self):
|
|
94
|
+
"""Whether positive vertical extent is enabled for the air box.
|
|
95
|
+
|
|
96
|
+
Returns
|
|
97
|
+
-------
|
|
98
|
+
bool.
|
|
99
|
+
|
|
100
|
+
"""
|
|
101
|
+
return self._hfss_extent_info.air_box_positive_vertical_extent[1]
|
|
102
|
+
|
|
103
|
+
@air_box_positive_vertical_extent_enabled.setter
|
|
104
|
+
def air_box_positive_vertical_extent_enabled(self, value):
|
|
105
|
+
hfss_exent = self._hfss_extent_info
|
|
106
|
+
hfss_exent.air_box_positive_vertical_extent = value
|
|
107
|
+
self._update_hfss_extent_info(hfss_exent)
|
|
108
|
+
|
|
109
|
+
@property
|
|
110
|
+
def air_box_positive_vertical_extent(self):
|
|
111
|
+
"""Negative vertical extent for the air box.
|
|
112
|
+
|
|
113
|
+
Returns
|
|
114
|
+
-------
|
|
115
|
+
float
|
|
116
|
+
Air box positive vertical extent value.
|
|
117
|
+
|
|
118
|
+
"""
|
|
119
|
+
return self._hfss_extent_info.air_box_positive_vertical_extent[0]
|
|
120
|
+
|
|
121
|
+
@air_box_positive_vertical_extent.setter
|
|
122
|
+
def air_box_positive_vertical_extent(self, value):
|
|
123
|
+
hfss_extent = self._hfss_extent_info
|
|
124
|
+
hfss_extent.air_box_positive_vertical_extent = float(value)
|
|
125
|
+
self._update_hfss_extent_info(hfss_extent)
|
|
126
|
+
|
|
127
|
+
@property
|
|
128
|
+
def air_box_negative_vertical_extent_enabled(self):
|
|
129
|
+
"""Whether negative vertical extent is enabled for the air box.
|
|
130
|
+
|
|
131
|
+
Returns
|
|
132
|
+
-------
|
|
133
|
+
bool.
|
|
134
|
+
|
|
135
|
+
"""
|
|
136
|
+
return self._hfss_extent_info.air_box_negative_vertical_extent[1]
|
|
137
|
+
|
|
138
|
+
@air_box_negative_vertical_extent_enabled.setter
|
|
139
|
+
def air_box_negative_vertical_extent_enabled(self, value):
|
|
140
|
+
hfss_extent = self._hfss_extent_info
|
|
141
|
+
hfss_extent.air_box_negative_vertical_extent = value
|
|
142
|
+
self._update_hfss_extent_info(hfss_extent)
|
|
143
|
+
|
|
144
|
+
@property
|
|
145
|
+
def air_box_negative_vertical_extent(self):
|
|
146
|
+
"""Negative vertical extent for the airbox.
|
|
147
|
+
|
|
148
|
+
Returns
|
|
149
|
+
-------
|
|
150
|
+
float
|
|
151
|
+
Air box negative vertical extent value.
|
|
152
|
+
|
|
153
|
+
"""
|
|
154
|
+
return self._hfss_extent_info.air_box_negative_vertical_extent[0]
|
|
155
|
+
|
|
156
|
+
@air_box_negative_vertical_extent.setter
|
|
157
|
+
def air_box_negative_vertical_extent(self, value):
|
|
158
|
+
hfss_extent = self._hfss_extent_info
|
|
159
|
+
hfss_extent.air_box_negative_vertical_extent = float(value)
|
|
160
|
+
self._update_hfss_extent_info(hfss_extent)
|
|
161
|
+
|
|
162
|
+
@property
|
|
163
|
+
def base_polygon(self):
|
|
164
|
+
"""Base polygon.
|
|
165
|
+
|
|
166
|
+
Returns
|
|
167
|
+
-------
|
|
168
|
+
:class:`Polygon <pyedb.grpc.database.primitive.polygon.Polygon>`
|
|
169
|
+
"""
|
|
170
|
+
return self._hfss_extent_info.base_polygon
|
|
171
|
+
|
|
172
|
+
@base_polygon.setter
|
|
173
|
+
def base_polygon(self, value):
|
|
174
|
+
hfss_extent = self._hfss_extent_info
|
|
175
|
+
hfss_extent.base_polygon = value
|
|
176
|
+
self._update_hfss_extent_info(hfss_extent)
|
|
177
|
+
|
|
178
|
+
@property
|
|
179
|
+
def dielectric_base_polygon(self):
|
|
180
|
+
"""Dielectric base polygon.
|
|
181
|
+
|
|
182
|
+
Returns
|
|
183
|
+
-------
|
|
184
|
+
:class:`Polygon <pyedb.grpc.database.primitive.polygon.Polygon>`
|
|
185
|
+
"""
|
|
186
|
+
return self._hfss_extent_info.dielectric_base_polygon
|
|
187
|
+
|
|
188
|
+
@dielectric_base_polygon.setter
|
|
189
|
+
def dielectric_base_polygon(self, value):
|
|
190
|
+
hfss_extent = self._hfss_extent_info
|
|
191
|
+
hfss_extent.dielectric_base_polygon = value
|
|
192
|
+
self._update_hfss_extent_info(hfss_extent)
|
|
193
|
+
|
|
194
|
+
@property
|
|
195
|
+
def dielectric_extent_size_enabled(self):
|
|
196
|
+
"""Whether dielectric extent size is enabled.
|
|
197
|
+
|
|
198
|
+
Returns
|
|
199
|
+
-------
|
|
200
|
+
bool.
|
|
201
|
+
"""
|
|
202
|
+
return self._hfss_extent_info.dielectric_extent_size[1]
|
|
203
|
+
|
|
204
|
+
@dielectric_extent_size_enabled.setter
|
|
205
|
+
def dielectric_extent_size_enabled(self, value):
|
|
206
|
+
hfss_extent = self._hfss_extent_info
|
|
207
|
+
hfss_extent.dielectric_extent_size = value
|
|
208
|
+
self._update_hfss_extent_info(hfss_extent)
|
|
209
|
+
|
|
210
|
+
@property
|
|
211
|
+
def dielectric_extent_size(self):
|
|
212
|
+
"""Dielectric extent size.
|
|
213
|
+
|
|
214
|
+
Returns
|
|
215
|
+
-------
|
|
216
|
+
float
|
|
217
|
+
Dielectric extent size value.
|
|
218
|
+
"""
|
|
219
|
+
return self._hfss_extent_info.dielectric_extent_size[0]
|
|
220
|
+
|
|
221
|
+
@dielectric_extent_size.setter
|
|
222
|
+
def dielectric_extent_size(self, value):
|
|
223
|
+
hfss_extent = self._hfss_extent_info
|
|
224
|
+
hfss_extent.dielectric_extent_size = value
|
|
225
|
+
self._update_hfss_extent_info(hfss_extent)
|
|
226
|
+
|
|
227
|
+
@property
|
|
228
|
+
def dielectric_extent_type(self):
|
|
229
|
+
"""Dielectric extent type.
|
|
230
|
+
|
|
231
|
+
Returns
|
|
232
|
+
-------
|
|
233
|
+
str
|
|
234
|
+
Dielectric extent type.
|
|
235
|
+
|
|
236
|
+
"""
|
|
237
|
+
return self._hfss_extent_info.dielectric_extent_type.name.lower()
|
|
238
|
+
|
|
239
|
+
@dielectric_extent_type.setter
|
|
240
|
+
def dielectric_extent_type(self, value):
|
|
241
|
+
hfss_extent = self._hfss_extent_info
|
|
242
|
+
hfss_extent.dielectric_extent_type = value
|
|
243
|
+
self._update_hfss_extent_info(hfss_extent)
|
|
244
|
+
|
|
245
|
+
@property
|
|
246
|
+
def extent_type(self):
|
|
247
|
+
"""Extent type.
|
|
248
|
+
|
|
249
|
+
Returns
|
|
250
|
+
-------
|
|
251
|
+
str
|
|
252
|
+
Extent type.
|
|
253
|
+
"""
|
|
254
|
+
return self._hfss_extent_info.extent_type.name.lower()
|
|
255
|
+
|
|
256
|
+
@extent_type.setter
|
|
257
|
+
def extent_type(self, value):
|
|
258
|
+
hfss_extent = self._hfss_extent_info
|
|
259
|
+
hfss_extent.extent_type = value
|
|
260
|
+
self._update_hfss_extent_info(hfss_extent)
|
|
261
|
+
|
|
262
|
+
@property
|
|
263
|
+
def honor_user_dielectric(self):
|
|
264
|
+
"""Honor user dielectric.
|
|
265
|
+
|
|
266
|
+
Returns
|
|
267
|
+
-------
|
|
268
|
+
bool
|
|
269
|
+
"""
|
|
270
|
+
return self._hfss_extent_info.honor_user_dielectric
|
|
271
|
+
|
|
272
|
+
@honor_user_dielectric.setter
|
|
273
|
+
def honor_user_dielectric(self, value):
|
|
274
|
+
hfss_extent = self._hfss_extent_info
|
|
275
|
+
hfss_extent.honor_user_dielectric = value
|
|
276
|
+
self._update_hfss_extent_info(hfss_extent)
|
|
277
|
+
|
|
278
|
+
@property
|
|
279
|
+
def is_pml_visible(self):
|
|
280
|
+
"""Whether visibility of the PML is enabled.
|
|
281
|
+
|
|
282
|
+
Returns
|
|
283
|
+
-------
|
|
284
|
+
bool
|
|
285
|
+
|
|
286
|
+
"""
|
|
287
|
+
return self._hfss_extent_info.is_pml_visible
|
|
288
|
+
|
|
289
|
+
@is_pml_visible.setter
|
|
290
|
+
def is_pml_visible(self, value):
|
|
291
|
+
hfss_extent = self._hfss_extent_info
|
|
292
|
+
hfss_extent.is_pml_visible = value
|
|
293
|
+
self._update_hfss_extent_info(hfss_extent)
|
|
294
|
+
|
|
295
|
+
@property
|
|
296
|
+
def open_region_type(self):
|
|
297
|
+
"""Open region type.
|
|
298
|
+
|
|
299
|
+
Returns
|
|
300
|
+
-------
|
|
301
|
+
str
|
|
302
|
+
Open region type.
|
|
303
|
+
"""
|
|
304
|
+
return self._hfss_extent_info.open_region_type.name.lower()
|
|
305
|
+
|
|
306
|
+
@open_region_type.setter
|
|
307
|
+
def open_region_type(self, value):
|
|
308
|
+
hfss_extent = self._hfss_extent_info
|
|
309
|
+
hfss_extent.open_region_type = value
|
|
310
|
+
self._update_hfss_extent_info(hfss_extent)
|
|
311
|
+
|
|
312
|
+
@property
|
|
313
|
+
def operating_freq(self):
|
|
314
|
+
"""PML Operating frequency.
|
|
315
|
+
|
|
316
|
+
Returns
|
|
317
|
+
-------
|
|
318
|
+
float
|
|
319
|
+
Operating frequency value.
|
|
320
|
+
|
|
321
|
+
"""
|
|
322
|
+
return GrpcValue(self._hfss_extent_info.operating_frequency).value
|
|
323
|
+
|
|
324
|
+
@operating_freq.setter
|
|
325
|
+
def operating_freq(self, value):
|
|
326
|
+
hfss_extent = self._hfss_extent_info
|
|
327
|
+
hfss_extent.operating_frequency = GrpcValue(value)
|
|
328
|
+
self._update_hfss_extent_info(hfss_extent)
|
|
329
|
+
|
|
330
|
+
@property
|
|
331
|
+
def radiation_level(self):
|
|
332
|
+
"""PML Radiation level to calculate the thickness of boundary.
|
|
333
|
+
|
|
334
|
+
Returns
|
|
335
|
+
-------
|
|
336
|
+
float
|
|
337
|
+
Boundary thickness value.
|
|
338
|
+
|
|
339
|
+
"""
|
|
340
|
+
return GrpcValue(self._hfss_extent_info.radiation_level).value
|
|
341
|
+
|
|
342
|
+
@radiation_level.setter
|
|
343
|
+
def radiation_level(self, value):
|
|
344
|
+
hfss_extent = self._hfss_extent_info
|
|
345
|
+
hfss_extent.RadiationLevel = GrpcValue(value)
|
|
346
|
+
self._update_hfss_extent_info(hfss_extent)
|
|
347
|
+
|
|
348
|
+
@property
|
|
349
|
+
def sync_air_box_vertical_extent(self):
|
|
350
|
+
"""Vertical extent of the sync air box.
|
|
351
|
+
|
|
352
|
+
Returns
|
|
353
|
+
-------
|
|
354
|
+
bool
|
|
355
|
+
Synchronise vertical extent.
|
|
356
|
+
|
|
357
|
+
"""
|
|
358
|
+
return self._hfss_extent_info.sync_air_box_vertical_extent
|
|
359
|
+
|
|
360
|
+
@sync_air_box_vertical_extent.setter
|
|
361
|
+
def sync_air_box_vertical_extent(self, value):
|
|
362
|
+
hfss_extent = self._hfss_extent_info
|
|
363
|
+
hfss_extent.sync_air_box_vertical_extent = value
|
|
364
|
+
self._update_hfss_extent_info(hfss_extent)
|
|
365
|
+
|
|
366
|
+
@property
|
|
367
|
+
def truncate_air_box_at_ground(self):
|
|
368
|
+
"""Truncate air box at ground.
|
|
369
|
+
|
|
370
|
+
Returns
|
|
371
|
+
-------
|
|
372
|
+
bool
|
|
373
|
+
Truncate air box at ground.
|
|
374
|
+
|
|
375
|
+
"""
|
|
376
|
+
return self._hfss_extent_info.truncate_air_box_at_ground
|
|
377
|
+
|
|
378
|
+
@truncate_air_box_at_ground.setter
|
|
379
|
+
def truncate_air_box_at_ground(self, value):
|
|
380
|
+
hfss_extent = self._hfss_extent_info
|
|
381
|
+
hfss_extent.truncate_air_box_at_ground = value
|
|
382
|
+
self._update_hfss_extent_info(hfss_extent)
|
|
383
|
+
|
|
384
|
+
@property
|
|
385
|
+
def use_open_region(self):
|
|
386
|
+
"""Whether using an open region is enabled.
|
|
387
|
+
|
|
388
|
+
Returns
|
|
389
|
+
-------
|
|
390
|
+
bool
|
|
391
|
+
Use open region.
|
|
392
|
+
|
|
393
|
+
"""
|
|
394
|
+
return self._hfss_extent_info.use_open_region
|
|
395
|
+
|
|
396
|
+
@use_open_region.setter
|
|
397
|
+
def use_open_region(self, value):
|
|
398
|
+
hfss_extent = self._hfss_extent_info
|
|
399
|
+
hfss_extent.use_open_region = value
|
|
400
|
+
self._update_hfss_extent_info(hfss_extent)
|
|
401
|
+
|
|
402
|
+
@property
|
|
403
|
+
def use_xy_data_extent_for_vertical_expansion(self):
|
|
404
|
+
"""Whether using the xy data extent for vertical expansion is enabled.
|
|
405
|
+
|
|
406
|
+
Returns
|
|
407
|
+
-------
|
|
408
|
+
bool
|
|
409
|
+
USe x y data extent for vertical expansion.
|
|
410
|
+
|
|
411
|
+
"""
|
|
412
|
+
return self._hfss_extent_info.use_xy_data_extent_for_vertical_expansion
|
|
413
|
+
|
|
414
|
+
@use_xy_data_extent_for_vertical_expansion.setter
|
|
415
|
+
def use_xy_data_extent_for_vertical_expansion(self, value):
|
|
416
|
+
hfss_extent = self._hfss_extent_info
|
|
417
|
+
hfss_extent.use_xy_data_extent_for_vertical_expansion = value
|
|
418
|
+
self._update_hfss_extent_info(hfss_extent)
|
|
419
|
+
|
|
420
|
+
def load_config(self, config):
|
|
421
|
+
"""Load HFSS extent configuration.
|
|
422
|
+
|
|
423
|
+
Parameters
|
|
424
|
+
----------
|
|
425
|
+
config: dict
|
|
426
|
+
Parameters of the HFSS extent information.
|
|
427
|
+
"""
|
|
428
|
+
for i, j in config.items():
|
|
429
|
+
if hasattr(self, i):
|
|
430
|
+
setattr(self, i, j)
|
|
431
|
+
|
|
432
|
+
def export_config(self):
|
|
433
|
+
"""Export HFSS extent information.
|
|
434
|
+
|
|
435
|
+
Returns
|
|
436
|
+
-------
|
|
437
|
+
dict
|
|
438
|
+
Parameters of the HFSS extent information.
|
|
439
|
+
"""
|
|
440
|
+
config = dict()
|
|
441
|
+
for i in dir(self):
|
|
442
|
+
if i.startswith("_"):
|
|
443
|
+
continue
|
|
444
|
+
elif i in ["load_config", "export_config"]:
|
|
445
|
+
continue
|
|
446
|
+
else:
|
|
447
|
+
config[i] = getattr(self, i)
|
|
448
|
+
return config
|
|
@@ -0,0 +1,277 @@
|
|
|
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 LayoutStatistics(object):
|
|
25
|
+
"""Statistics object
|
|
26
|
+
|
|
27
|
+
Object properties example.
|
|
28
|
+
>>> stat_model = EDBStatistics()
|
|
29
|
+
>>> stat_model.num_capacitors
|
|
30
|
+
>>> stat_model.num_resistors
|
|
31
|
+
>>> stat_model.num_inductors
|
|
32
|
+
>>> stat_model.layout_size
|
|
33
|
+
>>> stat_model.num_discrete_components
|
|
34
|
+
>>> stat_model.num_inductors
|
|
35
|
+
>>> stat_model.num_resistors
|
|
36
|
+
>>> stat_model.num_capacitors
|
|
37
|
+
>>> stat_model.num_nets
|
|
38
|
+
>>> stat_model.num_traces
|
|
39
|
+
>>> stat_model.num_polygons
|
|
40
|
+
>>> stat_model.num_vias
|
|
41
|
+
>>> stat_model.stackup_thickness
|
|
42
|
+
>>> stat_model.occupying_surface
|
|
43
|
+
>>> stat_model.occupying_ratio
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
def __init__(self):
|
|
47
|
+
self._nb_layer = 0
|
|
48
|
+
self._stackup_thickness = 0.0
|
|
49
|
+
self._nb_vias = 0
|
|
50
|
+
self._occupying_ratio = {}
|
|
51
|
+
self._occupying_surface = {}
|
|
52
|
+
self._layout_size = [0.0, 0.0, 0.0, 0.0]
|
|
53
|
+
self._nb_polygons = 0
|
|
54
|
+
self._nb_traces = 0
|
|
55
|
+
self._nb_nets = 0
|
|
56
|
+
self._nb_discrete_components = 0
|
|
57
|
+
self._nb_inductors = 0
|
|
58
|
+
self._nb_capacitors = 0
|
|
59
|
+
self._nb_resistors = 0
|
|
60
|
+
|
|
61
|
+
@property
|
|
62
|
+
def num_layers(self):
|
|
63
|
+
"""Layer number.
|
|
64
|
+
|
|
65
|
+
Returns
|
|
66
|
+
-------
|
|
67
|
+
int
|
|
68
|
+
Number of layers.
|
|
69
|
+
|
|
70
|
+
"""
|
|
71
|
+
return self._nb_layer
|
|
72
|
+
|
|
73
|
+
@num_layers.setter
|
|
74
|
+
def num_layers(self, value):
|
|
75
|
+
if isinstance(value, int):
|
|
76
|
+
self._nb_layer = value
|
|
77
|
+
|
|
78
|
+
@property
|
|
79
|
+
def stackup_thickness(self):
|
|
80
|
+
"""Stackup total thickness.
|
|
81
|
+
|
|
82
|
+
Returns
|
|
83
|
+
-------
|
|
84
|
+
float
|
|
85
|
+
Stack up total thickness value.
|
|
86
|
+
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
return self._stackup_thickness
|
|
90
|
+
|
|
91
|
+
@stackup_thickness.setter
|
|
92
|
+
def stackup_thickness(self, value):
|
|
93
|
+
if isinstance(value, float):
|
|
94
|
+
self._stackup_thickness = value
|
|
95
|
+
|
|
96
|
+
@property
|
|
97
|
+
def num_vias(self):
|
|
98
|
+
"""Via number.
|
|
99
|
+
|
|
100
|
+
Returns
|
|
101
|
+
-------
|
|
102
|
+
int
|
|
103
|
+
Total number of vias.
|
|
104
|
+
|
|
105
|
+
"""
|
|
106
|
+
return self._nb_vias
|
|
107
|
+
|
|
108
|
+
@num_vias.setter
|
|
109
|
+
def num_vias(self, value):
|
|
110
|
+
if isinstance(value, int):
|
|
111
|
+
self._nb_vias = value
|
|
112
|
+
|
|
113
|
+
@property
|
|
114
|
+
def occupying_ratio(self):
|
|
115
|
+
"""Occupying ratio.
|
|
116
|
+
|
|
117
|
+
Returns
|
|
118
|
+
-------
|
|
119
|
+
float
|
|
120
|
+
Occupying ration value.
|
|
121
|
+
Value representing metal coverage versus total layout surface.
|
|
122
|
+
|
|
123
|
+
"""
|
|
124
|
+
return self._occupying_ratio
|
|
125
|
+
|
|
126
|
+
@occupying_ratio.setter
|
|
127
|
+
def occupying_ratio(self, value):
|
|
128
|
+
if isinstance(value, float):
|
|
129
|
+
self._occupying_ratio = value
|
|
130
|
+
|
|
131
|
+
@property
|
|
132
|
+
def occupying_surface(self):
|
|
133
|
+
"""Occupying surface.
|
|
134
|
+
|
|
135
|
+
Returns
|
|
136
|
+
-------
|
|
137
|
+
float
|
|
138
|
+
Occupying surface value.
|
|
139
|
+
|
|
140
|
+
"""
|
|
141
|
+
return self._occupying_surface
|
|
142
|
+
|
|
143
|
+
@occupying_surface.setter
|
|
144
|
+
def occupying_surface(self, value):
|
|
145
|
+
if isinstance(value, float):
|
|
146
|
+
self._occupying_surface = value
|
|
147
|
+
|
|
148
|
+
@property
|
|
149
|
+
def layout_size(self):
|
|
150
|
+
"""Layout size.
|
|
151
|
+
|
|
152
|
+
Returns
|
|
153
|
+
-------
|
|
154
|
+
List[(float, float), (float, float)]
|
|
155
|
+
Layout bounding box, lower left corner (x, y) upper right corner (x, y).
|
|
156
|
+
|
|
157
|
+
"""
|
|
158
|
+
return self._layout_size
|
|
159
|
+
|
|
160
|
+
@property
|
|
161
|
+
def num_polygons(self):
|
|
162
|
+
"""Polygon number.
|
|
163
|
+
|
|
164
|
+
Returns
|
|
165
|
+
-------
|
|
166
|
+
int
|
|
167
|
+
Total number of polygons.
|
|
168
|
+
|
|
169
|
+
"""
|
|
170
|
+
return self._nb_polygons
|
|
171
|
+
|
|
172
|
+
@num_polygons.setter
|
|
173
|
+
def num_polygons(self, value):
|
|
174
|
+
if isinstance(value, int):
|
|
175
|
+
self._nb_polygons = value
|
|
176
|
+
|
|
177
|
+
@property
|
|
178
|
+
def num_traces(self):
|
|
179
|
+
"""Trace number.
|
|
180
|
+
|
|
181
|
+
Returns
|
|
182
|
+
-------
|
|
183
|
+
int
|
|
184
|
+
Total number of traces.
|
|
185
|
+
|
|
186
|
+
"""
|
|
187
|
+
return self._nb_traces
|
|
188
|
+
|
|
189
|
+
@num_traces.setter
|
|
190
|
+
def num_traces(self, value):
|
|
191
|
+
if isinstance(value, int):
|
|
192
|
+
self._nb_traces = value
|
|
193
|
+
|
|
194
|
+
@property
|
|
195
|
+
def num_nets(self):
|
|
196
|
+
"""Net number.
|
|
197
|
+
|
|
198
|
+
Returns
|
|
199
|
+
-------
|
|
200
|
+
int
|
|
201
|
+
Total number og nets.
|
|
202
|
+
|
|
203
|
+
"""
|
|
204
|
+
return self._nb_nets
|
|
205
|
+
|
|
206
|
+
@num_nets.setter
|
|
207
|
+
def num_nets(self, value):
|
|
208
|
+
if isinstance(value, int):
|
|
209
|
+
self._nb_nets = value
|
|
210
|
+
|
|
211
|
+
@property
|
|
212
|
+
def num_discrete_components(self):
|
|
213
|
+
"""Discrete component number.
|
|
214
|
+
|
|
215
|
+
Returns
|
|
216
|
+
-------
|
|
217
|
+
int
|
|
218
|
+
Total number of discrete components.
|
|
219
|
+
|
|
220
|
+
"""
|
|
221
|
+
return self._nb_discrete_components
|
|
222
|
+
|
|
223
|
+
@num_discrete_components.setter
|
|
224
|
+
def num_discrete_components(self, value):
|
|
225
|
+
if isinstance(value, int):
|
|
226
|
+
self._nb_discrete_components = value
|
|
227
|
+
|
|
228
|
+
@property
|
|
229
|
+
def num_inductors(self):
|
|
230
|
+
"""Inductor number.
|
|
231
|
+
|
|
232
|
+
Returns
|
|
233
|
+
-------
|
|
234
|
+
int
|
|
235
|
+
Total number of inductors.
|
|
236
|
+
|
|
237
|
+
"""
|
|
238
|
+
return self._nb_inductors
|
|
239
|
+
|
|
240
|
+
@num_inductors.setter
|
|
241
|
+
def num_inductors(self, value):
|
|
242
|
+
if isinstance(value, int):
|
|
243
|
+
self._nb_inductors = value
|
|
244
|
+
|
|
245
|
+
@property
|
|
246
|
+
def num_capacitors(self):
|
|
247
|
+
"""Capacitor number.
|
|
248
|
+
|
|
249
|
+
Returns
|
|
250
|
+
-------
|
|
251
|
+
int
|
|
252
|
+
Total number of capacitors.
|
|
253
|
+
|
|
254
|
+
"""
|
|
255
|
+
return self._nb_capacitors
|
|
256
|
+
|
|
257
|
+
@num_capacitors.setter
|
|
258
|
+
def num_capacitors(self, value):
|
|
259
|
+
if isinstance(value, int):
|
|
260
|
+
self._nb_capacitors = value
|
|
261
|
+
|
|
262
|
+
@property
|
|
263
|
+
def num_resistors(self):
|
|
264
|
+
"""Resistor number.
|
|
265
|
+
|
|
266
|
+
Returns
|
|
267
|
+
-------
|
|
268
|
+
int
|
|
269
|
+
Total number of resistors.
|
|
270
|
+
|
|
271
|
+
"""
|
|
272
|
+
return self._nb_resistors
|
|
273
|
+
|
|
274
|
+
@num_resistors.setter
|
|
275
|
+
def num_resistors(self, value):
|
|
276
|
+
if isinstance(value, int):
|
|
277
|
+
self._nb_resistors = value
|