pyedb 0.15.dev0__py3-none-any.whl → 0.16.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_common.py +1 -3
- pyedb/configuration/cfg_components.py +4 -6
- pyedb/configuration/cfg_data.py +3 -6
- pyedb/configuration/cfg_package_definition.py +3 -5
- pyedb/configuration/cfg_setup.py +214 -176
- pyedb/configuration/cfg_stackup.py +4 -4
- pyedb/configuration/configuration.py +7 -5
- pyedb/dotnet/edb.py +24 -10
- pyedb/dotnet/edb_core/cell/__init__.py +0 -0
- pyedb/dotnet/edb_core/cell/voltage_regulator.py +148 -0
- pyedb/dotnet/edb_core/layout.py +4 -1
- pyedb/dotnet/edb_core/sim_setup_data/data/mesh_operation.py +63 -49
- pyedb/dotnet/edb_core/sim_setup_data/data/settings.py +1 -1
- pyedb/dotnet/edb_core/sim_setup_data/data/sim_setup_info.py +81 -0
- pyedb/dotnet/edb_core/sim_setup_data/data/simulation_settings.py +67 -0
- pyedb/dotnet/edb_core/sim_setup_data/data/sweep_data.py +131 -96
- pyedb/dotnet/edb_core/siwave.py +49 -0
- pyedb/dotnet/edb_core/utilities/hfss_simulation_setup.py +386 -0
- pyedb/dotnet/edb_core/utilities/simulation_setup.py +106 -770
- pyedb/dotnet/edb_core/utilities/siwave_simulation_setup.py +369 -0
- {pyedb-0.15.dev0.dist-info → pyedb-0.16.0.dist-info}/METADATA +1 -1
- {pyedb-0.15.dev0.dist-info → pyedb-0.16.0.dist-info}/RECORD +25 -19
- {pyedb-0.15.dev0.dist-info → pyedb-0.16.0.dist-info}/LICENSE +0 -0
- {pyedb-0.15.dev0.dist-info → pyedb-0.16.0.dist-info}/WHEEL +0 -0
pyedb/dotnet/edb.py
CHANGED
|
@@ -48,6 +48,7 @@ from pyedb.dotnet.edb_core.cell.terminal.padstack_instance_terminal import (
|
|
|
48
48
|
from pyedb.dotnet.edb_core.cell.terminal.pingroup_terminal import PinGroupTerminal
|
|
49
49
|
from pyedb.dotnet.edb_core.cell.terminal.point_terminal import PointTerminal
|
|
50
50
|
from pyedb.dotnet.edb_core.cell.terminal.terminal import Terminal
|
|
51
|
+
from pyedb.dotnet.edb_core.cell.voltage_regulator import VoltageRegulator
|
|
51
52
|
from pyedb.dotnet.edb_core.components import Components
|
|
52
53
|
from pyedb.dotnet.edb_core.dotnet.database import Database
|
|
53
54
|
from pyedb.dotnet.edb_core.dotnet.layout import LayoutDotNet
|
|
@@ -93,10 +94,10 @@ from pyedb.dotnet.edb_core.nets import EdbNets
|
|
|
93
94
|
from pyedb.dotnet.edb_core.padstack import EdbPadstacks
|
|
94
95
|
from pyedb.dotnet.edb_core.siwave import EdbSiwave
|
|
95
96
|
from pyedb.dotnet.edb_core.stackup import Stackup
|
|
96
|
-
from pyedb.dotnet.edb_core.utilities.
|
|
97
|
-
|
|
97
|
+
from pyedb.dotnet.edb_core.utilities.hfss_simulation_setup import HfssSimulationSetup
|
|
98
|
+
from pyedb.dotnet.edb_core.utilities.siwave_simulation_setup import (
|
|
98
99
|
SiwaveDCSimulationSetup,
|
|
99
|
-
|
|
100
|
+
SiwaveSimulationSetup,
|
|
100
101
|
)
|
|
101
102
|
from pyedb.generic.constants import AEDT_UNITS, SolverType
|
|
102
103
|
from pyedb.generic.general_methods import (
|
|
@@ -510,6 +511,15 @@ class Edb(Database):
|
|
|
510
511
|
terms = [term for term in self.layout.terminals if int(term.GetBoundaryType()) in [3, 4, 7]]
|
|
511
512
|
return {ter.GetName(): ExcitationSources(self, ter) for ter in terms}
|
|
512
513
|
|
|
514
|
+
@property
|
|
515
|
+
def voltage_regulator_modules(self):
|
|
516
|
+
"""Get all voltage regulator modules"""
|
|
517
|
+
vrms = [VoltageRegulator(self, edb_object) for edb_object in list(self.active_layout.VoltageRegulators)]
|
|
518
|
+
_vrms = {}
|
|
519
|
+
for vrm in vrms:
|
|
520
|
+
_vrms[vrm.GetName()] = vrm
|
|
521
|
+
return _vrms
|
|
522
|
+
|
|
513
523
|
@property
|
|
514
524
|
def probes(self):
|
|
515
525
|
"""Get all layout probes."""
|
|
@@ -3556,7 +3566,7 @@ class Edb(Database):
|
|
|
3556
3566
|
if i.GetType() == self.edb_api.utility.utility.SimulationSetupType.kHFSS:
|
|
3557
3567
|
setups[i.GetName()] = HfssSimulationSetup(self, i)
|
|
3558
3568
|
elif i.GetType() == self.edb_api.utility.utility.SimulationSetupType.kSIWave:
|
|
3559
|
-
setups[i.GetName()] =
|
|
3569
|
+
setups[i.GetName()] = SiwaveSimulationSetup(self, i)
|
|
3560
3570
|
elif i.GetType() == self.edb_api.utility.utility.SimulationSetupType.kSIWaveDCIR:
|
|
3561
3571
|
setups[i.GetName()] = SiwaveDCSimulationSetup(self, i)
|
|
3562
3572
|
elif i.GetType() == self.edb_api.utility.utility.SimulationSetupType.kRaptorX:
|
|
@@ -3594,7 +3604,7 @@ class Edb(Database):
|
|
|
3594
3604
|
-------
|
|
3595
3605
|
Dict[str, :class:`legacy.edb_core.edb_data.siwave_simulation_setup_data.SiwaveSYZSimulationSetup`]
|
|
3596
3606
|
"""
|
|
3597
|
-
return {name: i for name, i in self.setups.items() if isinstance(i,
|
|
3607
|
+
return {name: i for name, i in self.setups.items() if isinstance(i, SiwaveSimulationSetup)}
|
|
3598
3608
|
|
|
3599
3609
|
def create_hfss_setup(self, name=None):
|
|
3600
3610
|
"""Create an HFSS simulation setup from a template.
|
|
@@ -3620,7 +3630,7 @@ class Edb(Database):
|
|
|
3620
3630
|
return False
|
|
3621
3631
|
elif not name:
|
|
3622
3632
|
name = generate_unique_name("setup")
|
|
3623
|
-
setup = HfssSimulationSetup(self
|
|
3633
|
+
setup = HfssSimulationSetup(self, name=name)
|
|
3624
3634
|
setup.set_solution_single_frequency("1GΗz")
|
|
3625
3635
|
return setup
|
|
3626
3636
|
|
|
@@ -3671,7 +3681,7 @@ class Edb(Database):
|
|
|
3671
3681
|
return False
|
|
3672
3682
|
return HFSSPISimulationSetup(self).create(name)
|
|
3673
3683
|
|
|
3674
|
-
def create_siwave_syz_setup(self, name=None):
|
|
3684
|
+
def create_siwave_syz_setup(self, name=None, **kwargs):
|
|
3675
3685
|
"""Create a setup from a template.
|
|
3676
3686
|
|
|
3677
3687
|
Parameters
|
|
@@ -3698,10 +3708,12 @@ class Edb(Database):
|
|
|
3698
3708
|
name = generate_unique_name("Siwave_SYZ")
|
|
3699
3709
|
if name in self.setups:
|
|
3700
3710
|
return False
|
|
3701
|
-
|
|
3711
|
+
setup = SiwaveSimulationSetup(self, name=name)
|
|
3712
|
+
for k, v in kwargs.items():
|
|
3713
|
+
setattr(setup, k, v)
|
|
3702
3714
|
return self.setups[name]
|
|
3703
3715
|
|
|
3704
|
-
def create_siwave_dc_setup(self, name=None):
|
|
3716
|
+
def create_siwave_dc_setup(self, name=None, **kwargs):
|
|
3705
3717
|
"""Create a setup from a template.
|
|
3706
3718
|
|
|
3707
3719
|
Parameters
|
|
@@ -3725,7 +3737,9 @@ class Edb(Database):
|
|
|
3725
3737
|
name = generate_unique_name("Siwave_DC")
|
|
3726
3738
|
if name in self.setups:
|
|
3727
3739
|
return False
|
|
3728
|
-
setup = SiwaveDCSimulationSetup(self
|
|
3740
|
+
setup = SiwaveDCSimulationSetup(self, name=name)
|
|
3741
|
+
for k, v in kwargs.items():
|
|
3742
|
+
setattr(setup, k, v)
|
|
3729
3743
|
return setup
|
|
3730
3744
|
|
|
3731
3745
|
def calculate_initial_extent(self, expansion_factor):
|
|
File without changes
|
|
@@ -0,0 +1,148 @@
|
|
|
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 pyedb.dotnet.edb_core.cell.layout_obj import Connectable
|
|
24
|
+
from pyedb.dotnet.edb_core.edb_data.padstacks_data import EDBPadstackInstance
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class VoltageRegulator(Connectable):
|
|
28
|
+
"""Class managing EDB voltage regulator."""
|
|
29
|
+
|
|
30
|
+
def __init__(self, pedb, edb_object=None):
|
|
31
|
+
super().__init__(pedb, edb_object)
|
|
32
|
+
|
|
33
|
+
@property
|
|
34
|
+
def component(self):
|
|
35
|
+
"""Retrieve voltage regulator component"""
|
|
36
|
+
if not self._edb_object.GetComponent().IsNull():
|
|
37
|
+
ref_des = self._edb_object.GetComponent().GetName()
|
|
38
|
+
if not ref_des:
|
|
39
|
+
return False
|
|
40
|
+
return self._pedb.components.instances[ref_des]
|
|
41
|
+
self._pedb.logger.warning("No voltage regulator component.")
|
|
42
|
+
return False
|
|
43
|
+
|
|
44
|
+
@component.setter
|
|
45
|
+
def component(self, value):
|
|
46
|
+
if not isinstance(value, str):
|
|
47
|
+
self._pedb.logger.error("refdes name must be provided to set vrm component")
|
|
48
|
+
return
|
|
49
|
+
if value not in self._pedb.components.instances:
|
|
50
|
+
self._pedb.logger.error(f"component {value} not found in layout")
|
|
51
|
+
return
|
|
52
|
+
self._edb_object.SetGroup(self._pedb.components.instances[value].edbcomponent)
|
|
53
|
+
|
|
54
|
+
@property
|
|
55
|
+
def id(self):
|
|
56
|
+
"""Retrieve voltage regulator ID."""
|
|
57
|
+
return self._edb_object.GetId()
|
|
58
|
+
|
|
59
|
+
@property
|
|
60
|
+
def load_regulator_current(self):
|
|
61
|
+
"""Retrieve load regulator current value"""
|
|
62
|
+
return self._edb_object.GetLoadRegulationCurrent().ToDouble()
|
|
63
|
+
|
|
64
|
+
@load_regulator_current.setter
|
|
65
|
+
def load_regulator_current(self, value):
|
|
66
|
+
_value = self._pedb.edb_value(value)
|
|
67
|
+
self._edb_object.SetLoadRegulationCurrent(_value)
|
|
68
|
+
|
|
69
|
+
@property
|
|
70
|
+
def load_regulation_percent(self):
|
|
71
|
+
"""Retrieve load regulation percent value."""
|
|
72
|
+
return self._edb_object.GetLoadRegulationPercent().ToDouble()
|
|
73
|
+
|
|
74
|
+
@load_regulation_percent.setter
|
|
75
|
+
def load_regulation_percent(self, value):
|
|
76
|
+
_value = self._edb_object.edb_value(value)
|
|
77
|
+
self._edb_object.SetLoadRegulationPercent(_value)
|
|
78
|
+
|
|
79
|
+
@property
|
|
80
|
+
def name(self):
|
|
81
|
+
"""Retrieve voltage regulator name."""
|
|
82
|
+
return self._edb_object.GetName()
|
|
83
|
+
|
|
84
|
+
@name.setter
|
|
85
|
+
def name(self, value):
|
|
86
|
+
if isinstance(value, str):
|
|
87
|
+
self._edb_object.SetName(value)
|
|
88
|
+
|
|
89
|
+
@property
|
|
90
|
+
def negative_remote_sense_pin(self):
|
|
91
|
+
"""Retrieve negative remote sense pin."""
|
|
92
|
+
edb_pin = self._edb_object.GetNegRemoteSensePin()
|
|
93
|
+
return self._pedb.padstacks.instances[edb_pin.GetId()]
|
|
94
|
+
|
|
95
|
+
@negative_remote_sense_pin.setter
|
|
96
|
+
def negative_remote_sense_pin(self, value):
|
|
97
|
+
if isinstance(value, int):
|
|
98
|
+
if value in self._pedb.padsatcks.instances:
|
|
99
|
+
_inst = self._pedb.padsatcks.instances[value]
|
|
100
|
+
if self._edb_object.SetNegRemoteSensePin(_inst._edb_object):
|
|
101
|
+
self._negative_remote_sense_pin = _inst
|
|
102
|
+
elif isinstance(value, EDBPadstackInstance):
|
|
103
|
+
if self._edb_object.SetNegRemoteSensePin(value._edb_object):
|
|
104
|
+
self._negative_remote_sense_pin = value
|
|
105
|
+
|
|
106
|
+
@property
|
|
107
|
+
def positive_remote_sense_pin(self):
|
|
108
|
+
"""Retrieve positive remote sense pin."""
|
|
109
|
+
edb_pin = self._edb_object.GetPosRemoteSensePin()
|
|
110
|
+
return self._pedb.padstacks.instances[edb_pin.GetId()]
|
|
111
|
+
|
|
112
|
+
@positive_remote_sense_pin.setter
|
|
113
|
+
def positive_remote_sense_pin(self, value):
|
|
114
|
+
if isinstance(value, int):
|
|
115
|
+
if value in self._pedb.padsatcks.instances:
|
|
116
|
+
_inst = self._pedb.padsatcks.instances[value]
|
|
117
|
+
if self._edb_object.SetPosRemoteSensePin(_inst._edb_object):
|
|
118
|
+
self._positive_remote_sense_pin = _inst
|
|
119
|
+
if not self.component:
|
|
120
|
+
self.component = _inst._edb_object.GetComponent().GetName()
|
|
121
|
+
elif isinstance(value, EDBPadstackInstance):
|
|
122
|
+
if self._edb_object.SetPosRemoteSensePin(value._edb_object):
|
|
123
|
+
self._positive_remote_sense_pin = value
|
|
124
|
+
if not self.component:
|
|
125
|
+
self.component = value._edb_object.GetComponent().GetName()
|
|
126
|
+
|
|
127
|
+
@property
|
|
128
|
+
def voltage(self):
|
|
129
|
+
"""Retrieve voltage value."""
|
|
130
|
+
return self._edb_object.GetVoltage().ToDouble()
|
|
131
|
+
|
|
132
|
+
@voltage.setter
|
|
133
|
+
def voltage(self, value):
|
|
134
|
+
self._edb_object.SetVoltage(self._pedb.edb_value(value))
|
|
135
|
+
|
|
136
|
+
@property
|
|
137
|
+
def is_active(self):
|
|
138
|
+
"""Check is voltage regulator is active."""
|
|
139
|
+
return self._edb_object.IsActive()
|
|
140
|
+
|
|
141
|
+
@is_active.setter
|
|
142
|
+
def is_active(self, value):
|
|
143
|
+
if isinstance(value, bool):
|
|
144
|
+
self._edb_object.SetIsActive(value)
|
|
145
|
+
|
|
146
|
+
@property
|
|
147
|
+
def is_null(self):
|
|
148
|
+
return self._edb_object.IsNull()
|
pyedb/dotnet/edb_core/layout.py
CHANGED
|
@@ -149,10 +149,13 @@ class EdbLayout(object):
|
|
|
149
149
|
_primitives_by_layer = {}
|
|
150
150
|
for lay in self.layers:
|
|
151
151
|
_primitives_by_layer[lay] = []
|
|
152
|
+
for lay in self._pedb.stackup.non_stackup_layers:
|
|
153
|
+
_primitives_by_layer[lay] = []
|
|
152
154
|
for i in self._layout.primitives:
|
|
153
155
|
try:
|
|
154
156
|
lay = i.GetLayer().GetName()
|
|
155
|
-
|
|
157
|
+
if lay in _primitives_by_layer:
|
|
158
|
+
_primitives_by_layer[lay].append(cast(i, self._pedb))
|
|
156
159
|
except:
|
|
157
160
|
self._logger.warning(f"Failed to get layer on primitive {i}, skipping.")
|
|
158
161
|
continue
|
|
@@ -20,22 +20,31 @@
|
|
|
20
20
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
21
|
# SOFTWARE.
|
|
22
22
|
|
|
23
|
+
from enum import Enum
|
|
24
|
+
|
|
23
25
|
from System import Tuple
|
|
24
26
|
|
|
25
27
|
from pyedb.dotnet.edb_core.general import convert_py_list_to_net_list
|
|
26
28
|
|
|
27
29
|
|
|
30
|
+
class MeshOpType(Enum):
|
|
31
|
+
kMeshSetupBase = "base"
|
|
32
|
+
kMeshSetupLength = "length"
|
|
33
|
+
kMeshSetupSkinDepth = "skin_depth"
|
|
34
|
+
kNumMeshOpTypes = "num_mesh_op_types"
|
|
35
|
+
|
|
36
|
+
|
|
28
37
|
class MeshOperation(object):
|
|
29
38
|
"""Mesh Operation Class."""
|
|
30
39
|
|
|
31
|
-
def __init__(self, parent,
|
|
40
|
+
def __init__(self, parent, edb_object):
|
|
32
41
|
self._parent = parent
|
|
33
|
-
self.
|
|
42
|
+
self._edb_object = edb_object
|
|
34
43
|
self._mesh_op_mapping = {
|
|
35
|
-
"kMeshSetupBase":
|
|
36
|
-
"kMeshSetupLength":
|
|
37
|
-
"kMeshSetupSkinDepth":
|
|
38
|
-
"kNumMeshOpTypes":
|
|
44
|
+
"kMeshSetupBase": self._edb_object.TMeshOpType.kMeshSetupBase,
|
|
45
|
+
"kMeshSetupLength": self._edb_object.TMeshOpType.kMeshSetupLength,
|
|
46
|
+
"kMeshSetupSkinDepth": self._edb_object.TMeshOpType.kMeshSetupSkinDepth,
|
|
47
|
+
"kNumMeshOpTypes": self._edb_object.TMeshOpType.kNumMeshOpTypes,
|
|
39
48
|
}
|
|
40
49
|
|
|
41
50
|
@property
|
|
@@ -47,7 +56,7 @@ class MeshOperation(object):
|
|
|
47
56
|
bool
|
|
48
57
|
``True`` if mesh operation is used, ``False`` otherwise.
|
|
49
58
|
"""
|
|
50
|
-
return self.
|
|
59
|
+
return self._edb_object.Enabled
|
|
51
60
|
|
|
52
61
|
@property
|
|
53
62
|
def mesh_operation_type(self):
|
|
@@ -60,9 +69,14 @@ class MeshOperation(object):
|
|
|
60
69
|
|
|
61
70
|
Returns
|
|
62
71
|
-------
|
|
63
|
-
|
|
72
|
+
str
|
|
64
73
|
"""
|
|
65
|
-
return self.
|
|
74
|
+
return self._edb_object.MeshOpType.ToString()
|
|
75
|
+
|
|
76
|
+
@property
|
|
77
|
+
def type(self):
|
|
78
|
+
mop_type = self.mesh_operation_type
|
|
79
|
+
return MeshOpType[mop_type].value
|
|
66
80
|
|
|
67
81
|
@property
|
|
68
82
|
def mesh_region(self):
|
|
@@ -73,7 +87,7 @@ class MeshOperation(object):
|
|
|
73
87
|
str
|
|
74
88
|
Name of the mesh region.
|
|
75
89
|
"""
|
|
76
|
-
return self.
|
|
90
|
+
return self._edb_object.MeshRegion
|
|
77
91
|
|
|
78
92
|
@property
|
|
79
93
|
def name(self):
|
|
@@ -83,7 +97,7 @@ class MeshOperation(object):
|
|
|
83
97
|
-------
|
|
84
98
|
str
|
|
85
99
|
"""
|
|
86
|
-
return self.
|
|
100
|
+
return self._edb_object.Name
|
|
87
101
|
|
|
88
102
|
@property
|
|
89
103
|
def nets_layers_list(self):
|
|
@@ -99,7 +113,18 @@ class MeshOperation(object):
|
|
|
99
113
|
Third element is represents whether if the mesh operation is enabled or disabled.
|
|
100
114
|
|
|
101
115
|
"""
|
|
102
|
-
|
|
116
|
+
nets_layers = {}
|
|
117
|
+
for i in list(self._edb_object.NetsLayersList):
|
|
118
|
+
net = i.Item1
|
|
119
|
+
layer = i.Item2
|
|
120
|
+
flag = i.Item3
|
|
121
|
+
if not flag:
|
|
122
|
+
continue
|
|
123
|
+
if net not in nets_layers:
|
|
124
|
+
nets_layers[net] = [layer]
|
|
125
|
+
else:
|
|
126
|
+
nets_layers[net].append(layer)
|
|
127
|
+
return nets_layers
|
|
103
128
|
|
|
104
129
|
@nets_layers_list.setter
|
|
105
130
|
def nets_layers_list(self, values):
|
|
@@ -107,7 +132,7 @@ class MeshOperation(object):
|
|
|
107
132
|
for net, layers in values.items():
|
|
108
133
|
for layer in layers:
|
|
109
134
|
temp.append(Tuple[str, str, bool](net, layer, True))
|
|
110
|
-
self.
|
|
135
|
+
self._edb_object.NetsLayersList = convert_py_list_to_net_list(temp)
|
|
111
136
|
|
|
112
137
|
@property
|
|
113
138
|
def refine_inside(self):
|
|
@@ -119,27 +144,23 @@ class MeshOperation(object):
|
|
|
119
144
|
``True`` if refine inside objects is used, ``False`` otherwise.
|
|
120
145
|
|
|
121
146
|
"""
|
|
122
|
-
return self.
|
|
147
|
+
return self._edb_object.RefineInside
|
|
123
148
|
|
|
124
149
|
@enabled.setter
|
|
125
150
|
def enabled(self, value):
|
|
126
|
-
self.
|
|
127
|
-
self._parent._update_setup()
|
|
151
|
+
self._edb_object.Enabled = value
|
|
128
152
|
|
|
129
153
|
@mesh_region.setter
|
|
130
154
|
def mesh_region(self, value):
|
|
131
|
-
self.
|
|
132
|
-
self._parent._update_setup()
|
|
155
|
+
self._edb_object.MeshRegion = value
|
|
133
156
|
|
|
134
157
|
@name.setter
|
|
135
158
|
def name(self, value):
|
|
136
|
-
self.
|
|
137
|
-
self._parent._update_setup()
|
|
159
|
+
self._edb_object.Name = value
|
|
138
160
|
|
|
139
161
|
@refine_inside.setter
|
|
140
162
|
def refine_inside(self, value):
|
|
141
|
-
self.
|
|
142
|
-
self._parent._update_setup()
|
|
163
|
+
self._edb_object.RefineInside = value
|
|
143
164
|
|
|
144
165
|
@property
|
|
145
166
|
def max_elements(self):
|
|
@@ -149,7 +170,7 @@ class MeshOperation(object):
|
|
|
149
170
|
-------
|
|
150
171
|
str
|
|
151
172
|
"""
|
|
152
|
-
return self.
|
|
173
|
+
return int(self._edb_object.MaxElems)
|
|
153
174
|
|
|
154
175
|
@property
|
|
155
176
|
def restrict_max_elements(self):
|
|
@@ -159,12 +180,11 @@ class MeshOperation(object):
|
|
|
159
180
|
-------
|
|
160
181
|
bool
|
|
161
182
|
"""
|
|
162
|
-
return self.
|
|
183
|
+
return self._edb_object.RestrictMaxElem
|
|
163
184
|
|
|
164
185
|
@max_elements.setter
|
|
165
186
|
def max_elements(self, value):
|
|
166
|
-
self.
|
|
167
|
-
self._parent._update_setup()
|
|
187
|
+
self._edb_object.MaxElems = str(value)
|
|
168
188
|
|
|
169
189
|
@restrict_max_elements.setter
|
|
170
190
|
def restrict_max_elements(self, value):
|
|
@@ -174,11 +194,10 @@ class MeshOperation(object):
|
|
|
174
194
|
-------
|
|
175
195
|
bool
|
|
176
196
|
"""
|
|
177
|
-
self.
|
|
178
|
-
self._parent._update_setup()
|
|
197
|
+
self._edb_object.RestrictMaxElem = value
|
|
179
198
|
|
|
180
199
|
|
|
181
|
-
class
|
|
200
|
+
class LengthMeshOperation(MeshOperation, object):
|
|
182
201
|
"""Mesh operation Length class.
|
|
183
202
|
This class is accessible from Hfss Setup in EDB and add_length_mesh_operation method.
|
|
184
203
|
|
|
@@ -188,8 +207,8 @@ class MeshOperationLength(MeshOperation, object):
|
|
|
188
207
|
>>> mop.max_elements = 3000
|
|
189
208
|
"""
|
|
190
209
|
|
|
191
|
-
def __init__(self, parent,
|
|
192
|
-
MeshOperation.__init__(self, parent,
|
|
210
|
+
def __init__(self, parent, edb_object):
|
|
211
|
+
MeshOperation.__init__(self, parent, edb_object)
|
|
193
212
|
|
|
194
213
|
@property
|
|
195
214
|
def max_length(self):
|
|
@@ -199,7 +218,7 @@ class MeshOperationLength(MeshOperation, object):
|
|
|
199
218
|
-------
|
|
200
219
|
str
|
|
201
220
|
"""
|
|
202
|
-
return self.
|
|
221
|
+
return self._edb_object.MaxLength
|
|
203
222
|
|
|
204
223
|
@property
|
|
205
224
|
def restrict_length(self):
|
|
@@ -209,12 +228,11 @@ class MeshOperationLength(MeshOperation, object):
|
|
|
209
228
|
-------
|
|
210
229
|
bool
|
|
211
230
|
"""
|
|
212
|
-
return self.
|
|
231
|
+
return self._edb_object.RestrictLength
|
|
213
232
|
|
|
214
233
|
@max_length.setter
|
|
215
234
|
def max_length(self, value):
|
|
216
|
-
self.
|
|
217
|
-
self._parent._update_setup()
|
|
235
|
+
self._edb_object.MaxLength = value
|
|
218
236
|
|
|
219
237
|
@restrict_length.setter
|
|
220
238
|
def restrict_length(self, value):
|
|
@@ -224,11 +242,10 @@ class MeshOperationLength(MeshOperation, object):
|
|
|
224
242
|
-------
|
|
225
243
|
bool
|
|
226
244
|
"""
|
|
227
|
-
self.
|
|
228
|
-
self._parent._update_setup()
|
|
245
|
+
self._edb_object.RestrictLength = value
|
|
229
246
|
|
|
230
247
|
|
|
231
|
-
class
|
|
248
|
+
class SkinDepthMeshOperation(MeshOperation, object):
|
|
232
249
|
"""Mesh operation Skin Depth class.
|
|
233
250
|
This class is accessible from Hfss Setup in EDB and assign_skin_depth_mesh_operation method.
|
|
234
251
|
|
|
@@ -238,8 +255,8 @@ class MeshOperationSkinDepth(MeshOperation, object):
|
|
|
238
255
|
>>> mop.max_elements = 3000
|
|
239
256
|
"""
|
|
240
257
|
|
|
241
|
-
def __init__(self, parent,
|
|
242
|
-
MeshOperation.__init__(self, parent,
|
|
258
|
+
def __init__(self, parent, edb_object):
|
|
259
|
+
MeshOperation.__init__(self, parent, edb_object)
|
|
243
260
|
|
|
244
261
|
@property
|
|
245
262
|
def skin_depth(self):
|
|
@@ -249,12 +266,11 @@ class MeshOperationSkinDepth(MeshOperation, object):
|
|
|
249
266
|
-------
|
|
250
267
|
str
|
|
251
268
|
"""
|
|
252
|
-
return self.
|
|
269
|
+
return self._edb_object.SkinDepth
|
|
253
270
|
|
|
254
271
|
@skin_depth.setter
|
|
255
272
|
def skin_depth(self, value):
|
|
256
|
-
self.
|
|
257
|
-
self._parent._update_setup()
|
|
273
|
+
self._edb_object.SkinDepth = value
|
|
258
274
|
|
|
259
275
|
@property
|
|
260
276
|
def surface_triangle_length(self):
|
|
@@ -264,12 +280,11 @@ class MeshOperationSkinDepth(MeshOperation, object):
|
|
|
264
280
|
-------
|
|
265
281
|
str
|
|
266
282
|
"""
|
|
267
|
-
return self.
|
|
283
|
+
return self._edb_object.SurfTriLength
|
|
268
284
|
|
|
269
285
|
@surface_triangle_length.setter
|
|
270
286
|
def surface_triangle_length(self, value):
|
|
271
|
-
self.
|
|
272
|
-
self._parent._update_setup()
|
|
287
|
+
self._edb_object.SurfTriLength = value
|
|
273
288
|
|
|
274
289
|
@property
|
|
275
290
|
def number_of_layer_elements(self):
|
|
@@ -279,9 +294,8 @@ class MeshOperationSkinDepth(MeshOperation, object):
|
|
|
279
294
|
-------
|
|
280
295
|
str
|
|
281
296
|
"""
|
|
282
|
-
return self.
|
|
297
|
+
return self._edb_object.NumLayers
|
|
283
298
|
|
|
284
299
|
@number_of_layer_elements.setter
|
|
285
300
|
def number_of_layer_elements(self, value):
|
|
286
|
-
self.
|
|
287
|
-
self._parent._update_setup()
|
|
301
|
+
self._edb_object.NumLayers = str(value)
|
|
@@ -45,7 +45,7 @@ class AdaptiveSettings(object):
|
|
|
45
45
|
-------
|
|
46
46
|
:class:`pyedb.dotnet.edb_core.edb_data.hfss_simulation_setup_data.AdaptiveSettings`
|
|
47
47
|
"""
|
|
48
|
-
return self._parent.
|
|
48
|
+
return self._parent.sim_setup_info.simulation_settings.AdaptiveSettings
|
|
49
49
|
|
|
50
50
|
@property
|
|
51
51
|
def adaptive_frequency_data_list(self):
|
|
@@ -0,0 +1,81 @@
|
|
|
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 pyedb.dotnet.edb_core.sim_setup_data.data.sweep_data import SweepData
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class SimSetupInfo:
|
|
27
|
+
def __init__(
|
|
28
|
+
self,
|
|
29
|
+
pedb,
|
|
30
|
+
sim_setup,
|
|
31
|
+
edb_object=None,
|
|
32
|
+
setup_type: str = None,
|
|
33
|
+
name: str = None,
|
|
34
|
+
):
|
|
35
|
+
self._pedb = pedb
|
|
36
|
+
self.sim_setup = sim_setup
|
|
37
|
+
simulation_setup_type = {
|
|
38
|
+
"kHFSS": self._pedb.simsetupdata.HFSSSimulationSettings,
|
|
39
|
+
"kPEM": None,
|
|
40
|
+
"kSIwave": self._pedb.simsetupdata.SIwave.SIWSimulationSettings,
|
|
41
|
+
"kLNA": None,
|
|
42
|
+
"kTransient": None,
|
|
43
|
+
"kQEye": None,
|
|
44
|
+
"kVEye": None,
|
|
45
|
+
"kAMI": None,
|
|
46
|
+
"kAnalysisOption": None,
|
|
47
|
+
"kSIwaveDCIR": self._pedb.simsetupdata.SIwave.SIWDCIRSimulationSettings,
|
|
48
|
+
"kSIwaveEMI": None,
|
|
49
|
+
"kHFSSPI": None,
|
|
50
|
+
"kDDRwizard": None,
|
|
51
|
+
"kQ3D": None,
|
|
52
|
+
"kNumSetupTypes": None,
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if edb_object is None:
|
|
56
|
+
self._edb_object = self._pedb.simsetupdata.SimSetupInfo[simulation_setup_type[setup_type]]()
|
|
57
|
+
self._edb_object.Name = name
|
|
58
|
+
else:
|
|
59
|
+
self._edb_object = edb_object
|
|
60
|
+
|
|
61
|
+
@property
|
|
62
|
+
def position(self):
|
|
63
|
+
return self._edb_object.Position
|
|
64
|
+
|
|
65
|
+
@property
|
|
66
|
+
def sim_setup_type(self):
|
|
67
|
+
return self._edb_object.SimSetupType
|
|
68
|
+
|
|
69
|
+
@property
|
|
70
|
+
def simulation_settings(self):
|
|
71
|
+
return self._edb_object.SimulationSettings
|
|
72
|
+
|
|
73
|
+
@property
|
|
74
|
+
def sweep_data_list(self):
|
|
75
|
+
return [
|
|
76
|
+
SweepData(self._pedb, edb_object=i, sim_setup=self.sim_setup) for i in list(self._edb_object.SweepDataList)
|
|
77
|
+
]
|
|
78
|
+
|
|
79
|
+
def add_sweep_data(self, sweep_data):
|
|
80
|
+
sweep_data.sim_setup = self.sim_setup
|
|
81
|
+
self._edb_object.SweepDataList.Add(sweep_data._edb_object)
|