pyedb 0.37.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_common.py +1 -1
- pyedb/configuration/cfg_components.py +229 -201
- pyedb/configuration/cfg_data.py +3 -1
- pyedb/configuration/cfg_general.py +4 -2
- pyedb/configuration/cfg_modeler.py +7 -7
- pyedb/configuration/cfg_package_definition.py +1 -1
- pyedb/configuration/cfg_padstacks.py +346 -290
- pyedb/configuration/cfg_ports_sources.py +243 -65
- pyedb/configuration/configuration.py +23 -3
- 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 +19 -19
- 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 +60 -73
- 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 +17 -16
- 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 +18 -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 +4 -4
- 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 +4 -3
- pyedb/dotnet/{edb_core → database}/utilities/siwave_simulation_setup.py +6 -6
- pyedb/dotnet/edb.py +118 -113
- pyedb/extensions/pre_layout_design_toolkit/via_design.py +1151 -0
- 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 +52 -20
- pyedb/ipc2581/ipc2581.py +47 -49
- pyedb/modeler/geometry_operators.py +1 -1
- {pyedb-0.37.0.dist-info → pyedb-0.39.0.dist-info}/METADATA +9 -6
- pyedb-0.39.0.dist-info/RECORD +288 -0
- pyedb-0.37.0.dist-info/RECORD +0 -194
- /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.37.0.dist-info → pyedb-0.39.0.dist-info}/LICENSE +0 -0
- {pyedb-0.37.0.dist-info → pyedb-0.39.0.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,410 @@
|
|
|
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 __future__ import absolute_import
|
|
24
|
+
|
|
25
|
+
from ansys.edb.core.layer.layer import LayerType as GrpcLayerType
|
|
26
|
+
from ansys.edb.core.layer.stackup_layer import RoughnessRegion as GrpcRoughnessRegion
|
|
27
|
+
from ansys.edb.core.layer.stackup_layer import StackupLayer as GrpcStackupLayer
|
|
28
|
+
from ansys.edb.core.utility.value import Value as GrpcValue
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class StackupLayer(GrpcStackupLayer):
|
|
32
|
+
def __init__(self, pedb, edb_object=None):
|
|
33
|
+
super().__init__(edb_object.msg)
|
|
34
|
+
self._pedb = pedb
|
|
35
|
+
self._edb_object = edb_object
|
|
36
|
+
|
|
37
|
+
@property
|
|
38
|
+
def _stackup_layer_mapping(self):
|
|
39
|
+
return {
|
|
40
|
+
"conducting_layer": GrpcLayerType.CONDUCTING_LAYER,
|
|
41
|
+
"silkscreen_layer": GrpcLayerType.SILKSCREEN_LAYER,
|
|
42
|
+
"solder_mask_layer": GrpcLayerType.SOLDER_MASK_LAYER,
|
|
43
|
+
"solder_paste_layer": GrpcLayerType.SOLDER_PASTE_LAYER,
|
|
44
|
+
"glue_layer": GrpcLayerType.GLUE_LAYER,
|
|
45
|
+
"wirebond_layer": GrpcLayerType.WIREBOND_LAYER,
|
|
46
|
+
"user_layer": GrpcLayerType.USER_LAYER,
|
|
47
|
+
"siwave_hfss_solver_regions": GrpcLayerType.SIWAVE_HFSS_SOLVER_REGIONS,
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
@property
|
|
51
|
+
def type(self):
|
|
52
|
+
"""Layer type.
|
|
53
|
+
|
|
54
|
+
Returns
|
|
55
|
+
-------
|
|
56
|
+
str
|
|
57
|
+
Layer name.
|
|
58
|
+
"""
|
|
59
|
+
return super().type.name.lower()
|
|
60
|
+
|
|
61
|
+
@type.setter
|
|
62
|
+
def type(self, value):
|
|
63
|
+
if value in self._stackup_layer_mapping:
|
|
64
|
+
super(StackupLayer, self.__class__).type.__set__(self, self._stackup_layer_mapping[value])
|
|
65
|
+
|
|
66
|
+
def _create(self, layer_type):
|
|
67
|
+
if layer_type in self._stackup_layer_mapping:
|
|
68
|
+
layer_type = self._stackup_layer_mapping[layer_type]
|
|
69
|
+
self._edb_object = GrpcStackupLayer.create(
|
|
70
|
+
self._name,
|
|
71
|
+
layer_type,
|
|
72
|
+
GrpcValue(0),
|
|
73
|
+
GrpcValue(0),
|
|
74
|
+
"copper",
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
@property
|
|
78
|
+
def lower_elevation(self):
|
|
79
|
+
"""Lower elevation.
|
|
80
|
+
|
|
81
|
+
Returns
|
|
82
|
+
-------
|
|
83
|
+
float
|
|
84
|
+
Lower elevation.
|
|
85
|
+
"""
|
|
86
|
+
return round(super().lower_elevation.value, 9)
|
|
87
|
+
|
|
88
|
+
@lower_elevation.setter
|
|
89
|
+
def lower_elevation(self, value):
|
|
90
|
+
if self._pedb.stackup.mode == "overlapping":
|
|
91
|
+
super(StackupLayer, self.__class__).lower_elevation.__set__(self, GrpcValue(value))
|
|
92
|
+
|
|
93
|
+
@property
|
|
94
|
+
def fill_material(self):
|
|
95
|
+
"""The layer's fill material.
|
|
96
|
+
|
|
97
|
+
Returns
|
|
98
|
+
-------
|
|
99
|
+
str
|
|
100
|
+
Material name.
|
|
101
|
+
"""
|
|
102
|
+
if self.is_stackup_layer:
|
|
103
|
+
return self.get_fill_material()
|
|
104
|
+
|
|
105
|
+
@fill_material.setter
|
|
106
|
+
def fill_material(self, value):
|
|
107
|
+
if self.is_stackup_layer:
|
|
108
|
+
self.set_fill_material(value)
|
|
109
|
+
|
|
110
|
+
@property
|
|
111
|
+
def upper_elevation(self):
|
|
112
|
+
"""Upper elevation.
|
|
113
|
+
|
|
114
|
+
Returns
|
|
115
|
+
-------
|
|
116
|
+
float
|
|
117
|
+
Upper elevation.
|
|
118
|
+
"""
|
|
119
|
+
return round(super().upper_elevation.value, 9)
|
|
120
|
+
|
|
121
|
+
@property
|
|
122
|
+
def is_negative(self):
|
|
123
|
+
"""Determine whether this layer is a negative layer.
|
|
124
|
+
|
|
125
|
+
Returns
|
|
126
|
+
-------
|
|
127
|
+
bool
|
|
128
|
+
True if this layer is a negative layer, False otherwise.
|
|
129
|
+
"""
|
|
130
|
+
return self.negative
|
|
131
|
+
|
|
132
|
+
@is_negative.setter
|
|
133
|
+
def is_negative(self, value):
|
|
134
|
+
"""Layer negative.
|
|
135
|
+
|
|
136
|
+
Returns
|
|
137
|
+
-------
|
|
138
|
+
bool
|
|
139
|
+
|
|
140
|
+
"""
|
|
141
|
+
self.negative = value
|
|
142
|
+
|
|
143
|
+
@property
|
|
144
|
+
def material(self):
|
|
145
|
+
"""Material.
|
|
146
|
+
|
|
147
|
+
Returns
|
|
148
|
+
-------
|
|
149
|
+
str
|
|
150
|
+
Material name.
|
|
151
|
+
"""
|
|
152
|
+
return self.get_material()
|
|
153
|
+
|
|
154
|
+
@material.setter
|
|
155
|
+
def material(self, name):
|
|
156
|
+
self.set_material(name)
|
|
157
|
+
|
|
158
|
+
@property
|
|
159
|
+
def conductivity(self):
|
|
160
|
+
"""Material conductivity.
|
|
161
|
+
|
|
162
|
+
Returns
|
|
163
|
+
-------
|
|
164
|
+
float
|
|
165
|
+
Material conductivity value.
|
|
166
|
+
"""
|
|
167
|
+
if self.material in self._pedb.materials.materials:
|
|
168
|
+
return self._pedb.materials[self.material].conductivity
|
|
169
|
+
return None
|
|
170
|
+
|
|
171
|
+
@property
|
|
172
|
+
def permittivity(self):
|
|
173
|
+
"""Material permittivity.
|
|
174
|
+
|
|
175
|
+
Returns
|
|
176
|
+
-------
|
|
177
|
+
float
|
|
178
|
+
Material permittivity value.
|
|
179
|
+
"""
|
|
180
|
+
if self.material in self._pedb.materials.materials:
|
|
181
|
+
return self._pedb.materials[self.material].permittivity
|
|
182
|
+
return None
|
|
183
|
+
|
|
184
|
+
@property
|
|
185
|
+
def loss_tangent(self):
|
|
186
|
+
"""Material loss_tangent.
|
|
187
|
+
|
|
188
|
+
Returns
|
|
189
|
+
-------
|
|
190
|
+
float
|
|
191
|
+
Material loss tangent value.
|
|
192
|
+
"""
|
|
193
|
+
if self.material in self._pedb.materials.materials:
|
|
194
|
+
return self._pedb.materials[self.material].loss_tangent
|
|
195
|
+
return None
|
|
196
|
+
|
|
197
|
+
@property
|
|
198
|
+
def dielectric_fill(self):
|
|
199
|
+
"""Material name of the layer dielectric fill.
|
|
200
|
+
|
|
201
|
+
Returns
|
|
202
|
+
-------
|
|
203
|
+
str
|
|
204
|
+
Material name.
|
|
205
|
+
"""
|
|
206
|
+
if self.type == "signal":
|
|
207
|
+
return self.get_fill_material()
|
|
208
|
+
else:
|
|
209
|
+
return
|
|
210
|
+
|
|
211
|
+
@dielectric_fill.setter
|
|
212
|
+
def dielectric_fill(self, name):
|
|
213
|
+
if self.type == "signal":
|
|
214
|
+
self.set_fill_material(name)
|
|
215
|
+
else:
|
|
216
|
+
pass
|
|
217
|
+
|
|
218
|
+
@property
|
|
219
|
+
def thickness(self):
|
|
220
|
+
"""Layer thickness.
|
|
221
|
+
|
|
222
|
+
Returns
|
|
223
|
+
-------
|
|
224
|
+
float
|
|
225
|
+
Layer thickness.
|
|
226
|
+
"""
|
|
227
|
+
return round(super().thickness.value, 9)
|
|
228
|
+
|
|
229
|
+
@thickness.setter
|
|
230
|
+
def thickness(self, value):
|
|
231
|
+
super(StackupLayer, self.__class__).thickness.__set__(self, GrpcValue(value))
|
|
232
|
+
|
|
233
|
+
@property
|
|
234
|
+
def etch_factor(self):
|
|
235
|
+
"""Layer etching factor.
|
|
236
|
+
|
|
237
|
+
Returns
|
|
238
|
+
-------
|
|
239
|
+
float
|
|
240
|
+
Etching factor value.
|
|
241
|
+
"""
|
|
242
|
+
return super().etch_factor.value
|
|
243
|
+
|
|
244
|
+
@etch_factor.setter
|
|
245
|
+
def etch_factor(self, value):
|
|
246
|
+
if not value:
|
|
247
|
+
self.etch_factor_enabled = False
|
|
248
|
+
else:
|
|
249
|
+
self.etch_factor_enabled = True
|
|
250
|
+
super(StackupLayer, self.__class__).etch_factor.__set__(self, GrpcValue(value))
|
|
251
|
+
|
|
252
|
+
@property
|
|
253
|
+
def top_hallhuray_nodule_radius(self):
|
|
254
|
+
"""Huray model nodule radius on layer top.
|
|
255
|
+
|
|
256
|
+
Returns
|
|
257
|
+
-------
|
|
258
|
+
float
|
|
259
|
+
Nodule radius value.
|
|
260
|
+
"""
|
|
261
|
+
top_roughness_model = self.get_roughness_model(GrpcRoughnessRegion.TOP)
|
|
262
|
+
if top_roughness_model:
|
|
263
|
+
return top_roughness_model.nodule_radius.value
|
|
264
|
+
else:
|
|
265
|
+
return None
|
|
266
|
+
|
|
267
|
+
@top_hallhuray_nodule_radius.setter
|
|
268
|
+
def top_hallhuray_nodule_radius(self, value):
|
|
269
|
+
top_roughness_model = self.get_roughness_model(GrpcRoughnessRegion.TOP)
|
|
270
|
+
top_roughness_model.nodule_radius = GrpcValue(value)
|
|
271
|
+
|
|
272
|
+
@property
|
|
273
|
+
def top_hallhuray_surface_ratio(self):
|
|
274
|
+
"""Huray model surface ratio on layer top.
|
|
275
|
+
|
|
276
|
+
Returns
|
|
277
|
+
-------
|
|
278
|
+
float
|
|
279
|
+
Surface ratio.
|
|
280
|
+
"""
|
|
281
|
+
top_roughness_model = self.get_roughness_model(GrpcRoughnessRegion.TOP)
|
|
282
|
+
if top_roughness_model:
|
|
283
|
+
return top_roughness_model.surface_ratio.value
|
|
284
|
+
else:
|
|
285
|
+
return None
|
|
286
|
+
|
|
287
|
+
@top_hallhuray_surface_ratio.setter
|
|
288
|
+
def top_hallhuray_surface_ratio(self, value):
|
|
289
|
+
top_roughness_model = self.get_roughness_model(GrpcRoughnessRegion.TOP)
|
|
290
|
+
top_roughness_model.surface_roughness = GrpcValue(value)
|
|
291
|
+
|
|
292
|
+
@property
|
|
293
|
+
def bottom_hallhuray_nodule_radius(self):
|
|
294
|
+
"""Huray model nodule radius on layer bottom.
|
|
295
|
+
|
|
296
|
+
Returns
|
|
297
|
+
-------
|
|
298
|
+
float
|
|
299
|
+
Nodule radius.
|
|
300
|
+
"""
|
|
301
|
+
bottom_roughness_model = self.get_roughness_model(GrpcRoughnessRegion.BOTTOM)
|
|
302
|
+
if bottom_roughness_model:
|
|
303
|
+
return bottom_roughness_model.nodule_radius.value
|
|
304
|
+
return None
|
|
305
|
+
|
|
306
|
+
@bottom_hallhuray_nodule_radius.setter
|
|
307
|
+
def bottom_hallhuray_nodule_radius(self, value):
|
|
308
|
+
top_roughness_model = self.get_roughness_model(GrpcRoughnessRegion.BOTTOM)
|
|
309
|
+
top_roughness_model.nodule_radius = GrpcValue(value)
|
|
310
|
+
|
|
311
|
+
@property
|
|
312
|
+
def bottom_hallhuray_surface_ratio(self):
|
|
313
|
+
"""Huray model surface ratio on layer bottom.
|
|
314
|
+
|
|
315
|
+
Returns
|
|
316
|
+
-------
|
|
317
|
+
float
|
|
318
|
+
Surface ratio value.
|
|
319
|
+
"""
|
|
320
|
+
bottom_roughness_model = self.get_roughness_model(GrpcRoughnessRegion.BOTTOM)
|
|
321
|
+
if bottom_roughness_model:
|
|
322
|
+
return bottom_roughness_model.surface_ratio.value
|
|
323
|
+
return None
|
|
324
|
+
|
|
325
|
+
@bottom_hallhuray_surface_ratio.setter
|
|
326
|
+
def bottom_hallhuray_surface_ratio(self, value):
|
|
327
|
+
top_roughness_model = self.get_roughness_model(GrpcRoughnessRegion.BOTTOM)
|
|
328
|
+
top_roughness_model.surface_ratio = GrpcValue(value)
|
|
329
|
+
|
|
330
|
+
@property
|
|
331
|
+
def side_hallhuray_nodule_radius(self):
|
|
332
|
+
"""Huray model nodule radius on layer sides.
|
|
333
|
+
|
|
334
|
+
Returns
|
|
335
|
+
-------
|
|
336
|
+
float
|
|
337
|
+
Nodule radius value.
|
|
338
|
+
|
|
339
|
+
"""
|
|
340
|
+
side_roughness_model = self.get_roughness_model(GrpcRoughnessRegion.SIDE)
|
|
341
|
+
if side_roughness_model:
|
|
342
|
+
return side_roughness_model.nodule_radius.value
|
|
343
|
+
return None
|
|
344
|
+
|
|
345
|
+
@side_hallhuray_nodule_radius.setter
|
|
346
|
+
def side_hallhuray_nodule_radius(self, value):
|
|
347
|
+
top_roughness_model = self.get_roughness_model(GrpcRoughnessRegion.SIDE)
|
|
348
|
+
top_roughness_model.nodule_radius = GrpcValue(value)
|
|
349
|
+
|
|
350
|
+
@property
|
|
351
|
+
def side_hallhuray_surface_ratio(self):
|
|
352
|
+
"""Huray model surface ratio on layer sides.
|
|
353
|
+
|
|
354
|
+
Returns
|
|
355
|
+
-------
|
|
356
|
+
float
|
|
357
|
+
surface ratio.
|
|
358
|
+
"""
|
|
359
|
+
side_roughness_model = self.get_roughness_model(GrpcRoughnessRegion.SIDE)
|
|
360
|
+
if side_roughness_model:
|
|
361
|
+
return side_roughness_model.surface_ratio.value
|
|
362
|
+
else:
|
|
363
|
+
return None
|
|
364
|
+
|
|
365
|
+
@side_hallhuray_surface_ratio.setter
|
|
366
|
+
def side_hallhuray_surface_ratio(self, value):
|
|
367
|
+
top_roughness_model = self.get_roughness_model(GrpcRoughnessRegion.SIDE)
|
|
368
|
+
top_roughness_model.surface_ratio = GrpcValue(value)
|
|
369
|
+
|
|
370
|
+
def assign_roughness_model(
|
|
371
|
+
self,
|
|
372
|
+
model_type="huray",
|
|
373
|
+
huray_radius="0.5um",
|
|
374
|
+
huray_surface_ratio="2.9",
|
|
375
|
+
groisse_roughness="1um",
|
|
376
|
+
apply_on_surface="all",
|
|
377
|
+
):
|
|
378
|
+
"""Assign roughness model on this layer.
|
|
379
|
+
|
|
380
|
+
Parameters
|
|
381
|
+
----------
|
|
382
|
+
model_type : str, optional
|
|
383
|
+
Type of roughness model. The default is ``"huray"``. Options are ``"huray"``, ``"groisse"``.
|
|
384
|
+
huray_radius : str, float, optional
|
|
385
|
+
Radius of huray model. The default is ``"0.5um"``.
|
|
386
|
+
huray_surface_ratio : str, float, optional.
|
|
387
|
+
Surface ratio of huray model. The default is ``"2.9"``.
|
|
388
|
+
groisse_roughness : str, float, optional
|
|
389
|
+
Roughness of groisse model. The default is ``"1um"``.
|
|
390
|
+
apply_on_surface : str, optional.
|
|
391
|
+
Where to assign roughness model. The default is ``"all"``. Options are ``"top"``, ``"bottom"``,
|
|
392
|
+
``"side"``.
|
|
393
|
+
|
|
394
|
+
"""
|
|
395
|
+
regions = []
|
|
396
|
+
if apply_on_surface == "all":
|
|
397
|
+
regions = [GrpcRoughnessRegion.TOP, GrpcRoughnessRegion.BOTTOM, GrpcRoughnessRegion.SIDE]
|
|
398
|
+
elif apply_on_surface == "top":
|
|
399
|
+
regions = [GrpcRoughnessRegion.TOP]
|
|
400
|
+
elif apply_on_surface == "bottom":
|
|
401
|
+
regions = [GrpcRoughnessRegion.BOTTOM]
|
|
402
|
+
elif apply_on_surface == "side":
|
|
403
|
+
regions = [GrpcRoughnessRegion.BOTTOM]
|
|
404
|
+
self.roughness_enabled = True
|
|
405
|
+
for r in regions:
|
|
406
|
+
if model_type == "huray":
|
|
407
|
+
model = (GrpcValue(huray_radius), GrpcValue(huray_surface_ratio))
|
|
408
|
+
else:
|
|
409
|
+
model = GrpcValue(groisse_roughness)
|
|
410
|
+
self.set_roughness_model(model, r)
|
|
File without changes
|
|
@@ -0,0 +1,30 @@
|
|
|
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.layout.cell import Cell as GrpcCell
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class Cell(GrpcCell):
|
|
27
|
+
"""Manage :class:`Cell <ansys.edb.core.layout.cell.Cell>`"""
|
|
28
|
+
|
|
29
|
+
def __init__(self, pedb, edb_object):
|
|
30
|
+
super().__init__(edb_object)
|
|
@@ -0,0 +1,196 @@
|
|
|
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
|
+
This module contains these classes: `EdbLayout` and `Shape`.
|
|
25
|
+
"""
|
|
26
|
+
from typing import Union
|
|
27
|
+
|
|
28
|
+
from ansys.edb.core.layout.layout import Layout as GrpcLayout
|
|
29
|
+
|
|
30
|
+
from pyedb.grpc.database.hierarchy.component import Component
|
|
31
|
+
from pyedb.grpc.database.hierarchy.pingroup import PinGroup
|
|
32
|
+
from pyedb.grpc.database.layout.voltage_regulator import VoltageRegulator
|
|
33
|
+
from pyedb.grpc.database.net.differential_pair import DifferentialPair
|
|
34
|
+
from pyedb.grpc.database.net.extended_net import ExtendedNet
|
|
35
|
+
from pyedb.grpc.database.net.net import Net
|
|
36
|
+
from pyedb.grpc.database.net.net_class import NetClass
|
|
37
|
+
from pyedb.grpc.database.primitive.padstack_instance import PadstackInstance
|
|
38
|
+
from pyedb.grpc.database.terminal.bundle_terminal import BundleTerminal
|
|
39
|
+
from pyedb.grpc.database.terminal.edge_terminal import EdgeTerminal
|
|
40
|
+
from pyedb.grpc.database.terminal.padstack_instance_terminal import (
|
|
41
|
+
PadstackInstanceTerminal,
|
|
42
|
+
)
|
|
43
|
+
from pyedb.grpc.database.terminal.pingroup_terminal import PinGroupTerminal
|
|
44
|
+
from pyedb.grpc.database.terminal.point_terminal import PointTerminal
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class Layout(GrpcLayout):
|
|
48
|
+
"""Manage Layout class."""
|
|
49
|
+
|
|
50
|
+
def __init__(self, pedb):
|
|
51
|
+
super().__init__(pedb.active_cell._Cell__stub.GetLayout(pedb.active_cell.msg))
|
|
52
|
+
self._pedb = pedb
|
|
53
|
+
|
|
54
|
+
@property
|
|
55
|
+
def cell(self):
|
|
56
|
+
""":class:`Cell <ansys.edb.core.layout.cel.Cell>`: Owning cell for this layout.
|
|
57
|
+
|
|
58
|
+
Read-Only.
|
|
59
|
+
"""
|
|
60
|
+
return self._pedb._active_cell
|
|
61
|
+
|
|
62
|
+
@property
|
|
63
|
+
def terminals(self):
|
|
64
|
+
"""Get terminals belonging to active layout.
|
|
65
|
+
|
|
66
|
+
Returns
|
|
67
|
+
-------
|
|
68
|
+
Terminal dictionary : Dict[str, :class:`Terminal <pyedb.grpc.database.terminal.Terminal>`]
|
|
69
|
+
Dictionary of terminals.
|
|
70
|
+
"""
|
|
71
|
+
temp = []
|
|
72
|
+
for i in self._pedb.active_cell.layout.terminals:
|
|
73
|
+
if i.type.name.lower() == "pin_group":
|
|
74
|
+
temp.append(PinGroupTerminal(self._pedb, i))
|
|
75
|
+
elif i.type.name.lower() == "padstack_inst":
|
|
76
|
+
temp.append(PadstackInstanceTerminal(self._pedb, i))
|
|
77
|
+
elif i.type.name.lower() == "edge":
|
|
78
|
+
temp.append(EdgeTerminal(self._pedb, i))
|
|
79
|
+
elif i.type.name.lower() == "bundle":
|
|
80
|
+
temp.append(BundleTerminal(self._pedb, i))
|
|
81
|
+
elif i.type.name.lower() == "point":
|
|
82
|
+
temp.append(PointTerminal(self._pedb, i))
|
|
83
|
+
return temp
|
|
84
|
+
|
|
85
|
+
@property
|
|
86
|
+
def nets(self):
|
|
87
|
+
"""Nets.
|
|
88
|
+
|
|
89
|
+
Returns
|
|
90
|
+
-------
|
|
91
|
+
List[:class:`Net <pyedb.grpc.database.net.net.Net>`]
|
|
92
|
+
List of Net.
|
|
93
|
+
"""
|
|
94
|
+
return [Net(self._pedb, net) for net in super().nets]
|
|
95
|
+
|
|
96
|
+
@property
|
|
97
|
+
def bondwires(self):
|
|
98
|
+
"""Bondwires.
|
|
99
|
+
|
|
100
|
+
Returns
|
|
101
|
+
-------
|
|
102
|
+
list [:class:`pyedb.grpc.database.primitive.primitive.Primitive`]:
|
|
103
|
+
List of bondwires.
|
|
104
|
+
"""
|
|
105
|
+
return [i for i in self.primitives if i.primitive_type == "bondwire"]
|
|
106
|
+
|
|
107
|
+
@property
|
|
108
|
+
def groups(self):
|
|
109
|
+
"""Groups
|
|
110
|
+
|
|
111
|
+
Returns
|
|
112
|
+
-------
|
|
113
|
+
List[:class:`Group <pyedb.grpc.database.hierarch.component.Component>`].
|
|
114
|
+
List of Component.
|
|
115
|
+
|
|
116
|
+
"""
|
|
117
|
+
return [Component(self._pedb, g) for g in self._pedb.active_cell.layout.groups]
|
|
118
|
+
|
|
119
|
+
@property
|
|
120
|
+
def pin_groups(self):
|
|
121
|
+
"""Pin groups.
|
|
122
|
+
|
|
123
|
+
Returns
|
|
124
|
+
-------
|
|
125
|
+
List[:class:`PinGroup <pyedb.grpc.database.hierarchy.pingroup.PinGroup>`]
|
|
126
|
+
List of PinGroup.
|
|
127
|
+
|
|
128
|
+
"""
|
|
129
|
+
return [PinGroup(self._pedb, i) for i in self._pedb.active_cell.layout.pin_groups]
|
|
130
|
+
|
|
131
|
+
@property
|
|
132
|
+
def net_classes(self):
|
|
133
|
+
"""Net classes.
|
|
134
|
+
|
|
135
|
+
Returns
|
|
136
|
+
-------
|
|
137
|
+
List[:class:`NetClass <pyedb.grpc.database.net.net_class.NetClass>`]
|
|
138
|
+
List of NetClass.
|
|
139
|
+
|
|
140
|
+
"""
|
|
141
|
+
return [NetClass(self._pedb, i) for i in self._pedb.active_cell.layout.net_classes]
|
|
142
|
+
|
|
143
|
+
@property
|
|
144
|
+
def extended_nets(self):
|
|
145
|
+
"""Extended nets.
|
|
146
|
+
|
|
147
|
+
Returns
|
|
148
|
+
-------
|
|
149
|
+
List[:class:`ExtendedNet <pyedb.grpc.database.net.extended_net.ExtendedNet>`]
|
|
150
|
+
List of extended nets.
|
|
151
|
+
"""
|
|
152
|
+
|
|
153
|
+
return [ExtendedNet(self._pedb, i) for i in self._pedb.active_cell.layout.extended_nets]
|
|
154
|
+
|
|
155
|
+
@property
|
|
156
|
+
def differential_pairs(self):
|
|
157
|
+
"""Differential pairs.
|
|
158
|
+
|
|
159
|
+
Returns
|
|
160
|
+
-------
|
|
161
|
+
List[:class:`DifferentialPair <pyedb.grpc.database.net.differential_pair.DifferentialPair>`
|
|
162
|
+
List of DifferentialPair.
|
|
163
|
+
|
|
164
|
+
"""
|
|
165
|
+
return [DifferentialPair(self._pedb, i) for i in self._pedb.active_cell.layout.differential_pairs]
|
|
166
|
+
|
|
167
|
+
@property
|
|
168
|
+
def padstack_instances(self):
|
|
169
|
+
"""Get all padstack instances in a list."""
|
|
170
|
+
return [PadstackInstance(self._pedb, i) for i in self._pedb.active_cell.layout.padstack_instances]
|
|
171
|
+
|
|
172
|
+
#
|
|
173
|
+
@property
|
|
174
|
+
def voltage_regulators(self):
|
|
175
|
+
"""Voltage regulators.
|
|
176
|
+
|
|
177
|
+
List[:class:`VoltageRegulator <pyedb.grpc.database.layout.voltage_regulator.VoltageRegulator>`.
|
|
178
|
+
List of VoltageRegulator.
|
|
179
|
+
|
|
180
|
+
"""
|
|
181
|
+
return [VoltageRegulator(self._pedb, i) for i in self._pedb.active_cell.layout.voltage_regulators]
|
|
182
|
+
|
|
183
|
+
def find_primitive(self, layer_name: Union[str, list]) -> list:
|
|
184
|
+
"""Find a primitive objects by layer name.
|
|
185
|
+
|
|
186
|
+
Parameters
|
|
187
|
+
----------
|
|
188
|
+
layer_name : str, list
|
|
189
|
+
Name of the layer.
|
|
190
|
+
Returns
|
|
191
|
+
-------
|
|
192
|
+
List[:class:`Primitive <pyedb.grpc.database.primitive.primitive.Primitive`].
|
|
193
|
+
List of Primitive.
|
|
194
|
+
"""
|
|
195
|
+
layer_name = layer_name if isinstance(layer_name, list) else [layer_name]
|
|
196
|
+
return [i for i in self.primitives if i.layer.name in layer_name]
|