pyedb 0.18.0__py3-none-any.whl → 0.19.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pyedb might be problematic. Click here for more details.
- pyedb/__init__.py +1 -1
- pyedb/configuration/cfg_data.py +8 -11
- pyedb/configuration/cfg_nets.py +14 -0
- pyedb/configuration/cfg_pin_groups.py +57 -20
- pyedb/configuration/cfg_ports_sources.py +248 -60
- pyedb/configuration/configuration.py +51 -17
- pyedb/dotnet/edb.py +2 -1
- pyedb/dotnet/edb_core/cell/layout.py +48 -1
- pyedb/dotnet/edb_core/cell/terminal/padstack_instance_terminal.py +10 -0
- pyedb/dotnet/edb_core/cell/terminal/pingroup_terminal.py +5 -0
- pyedb/dotnet/edb_core/cell/terminal/point_terminal.py +0 -11
- pyedb/dotnet/edb_core/cell/terminal/terminal.py +35 -1
- pyedb/dotnet/edb_core/components.py +74 -18
- pyedb/dotnet/edb_core/dotnet/primitive.py +9 -6
- pyedb/dotnet/edb_core/edb_data/padstacks_data.py +8 -4
- pyedb/dotnet/edb_core/edb_data/ports.py +0 -18
- pyedb/dotnet/edb_core/edb_data/primitives_data.py +1 -1
- pyedb/dotnet/edb_core/padstack.py +10 -1
- pyedb/dotnet/edb_core/sim_setup_data/data/sim_setup_info.py +42 -3
- pyedb/dotnet/edb_core/sim_setup_data/data/simulation_settings.py +92 -158
- pyedb/dotnet/edb_core/sim_setup_data/data/siw_dc_ir_settings.py +22 -22
- pyedb/dotnet/edb_core/sim_setup_data/io/siwave.py +76 -76
- pyedb/dotnet/edb_core/utilities/hfss_simulation_setup.py +23 -94
- pyedb/dotnet/edb_core/utilities/simulation_setup.py +40 -38
- pyedb/dotnet/edb_core/utilities/siwave_simulation_setup.py +26 -17
- {pyedb-0.18.0.dist-info → pyedb-0.19.0.dist-info}/METADATA +8 -8
- {pyedb-0.18.0.dist-info → pyedb-0.19.0.dist-info}/RECORD +29 -29
- {pyedb-0.18.0.dist-info → pyedb-0.19.0.dist-info}/LICENSE +0 -0
- {pyedb-0.18.0.dist-info → pyedb-0.19.0.dist-info}/WHEEL +0 -0
pyedb/__init__.py
CHANGED
pyedb/configuration/cfg_data.py
CHANGED
|
@@ -28,8 +28,8 @@ from pyedb.configuration.cfg_nets import CfgNets
|
|
|
28
28
|
from pyedb.configuration.cfg_operations import CfgOperations
|
|
29
29
|
from pyedb.configuration.cfg_package_definition import CfgPackageDefinitions
|
|
30
30
|
from pyedb.configuration.cfg_padstacks import CfgPadstacks
|
|
31
|
-
from pyedb.configuration.cfg_pin_groups import
|
|
32
|
-
from pyedb.configuration.cfg_ports_sources import
|
|
31
|
+
from pyedb.configuration.cfg_pin_groups import CfgPinGroups
|
|
32
|
+
from pyedb.configuration.cfg_ports_sources import CfgPorts, CfgSources
|
|
33
33
|
from pyedb.configuration.cfg_s_parameter_models import CfgSParameterModel
|
|
34
34
|
from pyedb.configuration.cfg_setup import CfgSetups
|
|
35
35
|
from pyedb.configuration.cfg_spice_models import CfgSpiceModel
|
|
@@ -41,28 +41,25 @@ class CfgData(object):
|
|
|
41
41
|
|
|
42
42
|
def __init__(self, pedb, **kwargs):
|
|
43
43
|
self._pedb = pedb
|
|
44
|
-
self.edb_comps = self._pedb.components.components
|
|
45
44
|
self.general = CfgGeneral(self, kwargs.get("general", None))
|
|
46
45
|
|
|
47
46
|
self.boundaries = {}
|
|
48
47
|
if kwargs.get("boundaries", None):
|
|
49
48
|
self.boundaries = CfgBoundaries(self, kwargs.get("boundaries", None))
|
|
50
49
|
|
|
51
|
-
self.nets =
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
self, kwargs.get("nets", {}).get("signal_nets", []), kwargs.get("nets", {}).get("power_ground_nets", [])
|
|
55
|
-
)
|
|
50
|
+
self.nets = CfgNets(
|
|
51
|
+
self, kwargs.get("nets", {}).get("signal_nets", []), kwargs.get("nets", {}).get("power_ground_nets", [])
|
|
52
|
+
)
|
|
56
53
|
|
|
57
54
|
self.components = CfgComponents(self._pedb, components_data=kwargs.get("components", []))
|
|
58
55
|
|
|
59
56
|
self.padstacks = CfgPadstacks(self, kwargs.get("padstacks", None))
|
|
60
57
|
|
|
61
|
-
self.pin_groups =
|
|
58
|
+
self.pin_groups = CfgPinGroups(self._pedb, pingroup_data=kwargs.get("pin_groups", []))
|
|
62
59
|
|
|
63
|
-
self.ports =
|
|
60
|
+
self.ports = CfgPorts(self._pedb, ports_data=kwargs.get("ports", []))
|
|
64
61
|
|
|
65
|
-
self.sources =
|
|
62
|
+
self.sources = CfgSources(self._pedb, sources_data=kwargs.get("sources", []))
|
|
66
63
|
|
|
67
64
|
self.setups = CfgSetups(self._pedb, setups_data=kwargs.get("setups", []))
|
|
68
65
|
|
pyedb/configuration/cfg_nets.py
CHANGED
|
@@ -41,3 +41,17 @@ class CfgNets:
|
|
|
41
41
|
for power_net in self.power_nets:
|
|
42
42
|
if power_net in self._pedb.nets:
|
|
43
43
|
self._pedb.nets.nets[power_net].is_power_ground = True
|
|
44
|
+
|
|
45
|
+
def _load_data_from_db(self):
|
|
46
|
+
self.signal_nets = []
|
|
47
|
+
self.power_nets = []
|
|
48
|
+
for net in self._pedb.nets.signal:
|
|
49
|
+
self.signal_nets.append(net)
|
|
50
|
+
for net in self._pedb.nets.power:
|
|
51
|
+
self.power_nets.append(net)
|
|
52
|
+
|
|
53
|
+
def get_data_from_db(self):
|
|
54
|
+
"""Get net information."""
|
|
55
|
+
self._load_data_from_db()
|
|
56
|
+
data = {"signal_nets": self.signal_nets, "power_ground_nets": self.power_nets}
|
|
57
|
+
return data
|
|
@@ -20,39 +20,76 @@
|
|
|
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 pyedb.configuration.cfg_common import CfgBase
|
|
23
24
|
|
|
24
|
-
|
|
25
|
+
|
|
26
|
+
class CfgPinGroups:
|
|
25
27
|
"""Manage configuration pin group class."""
|
|
26
28
|
|
|
27
|
-
def __init__(self,
|
|
28
|
-
self._pedb =
|
|
29
|
-
self.
|
|
30
|
-
self.name = self._pingroup_dict.get("name", "")
|
|
31
|
-
self.reference_designator = self._pingroup_dict.get("reference_designator", "")
|
|
32
|
-
self.pins = self._pingroup_dict.get("pins", [])
|
|
33
|
-
self.net = self._pingroup_dict.get("net", [])
|
|
29
|
+
def __init__(self, pedb, pingroup_data):
|
|
30
|
+
self._pedb = pedb
|
|
31
|
+
self.pin_groups = [CfgPinGroup(self._pedb, **pg) for pg in pingroup_data]
|
|
34
32
|
|
|
35
33
|
def apply(self):
|
|
34
|
+
for pg in self.pin_groups:
|
|
35
|
+
pg.create()
|
|
36
|
+
|
|
37
|
+
def get_data_from_db(self):
|
|
38
|
+
self.pin_groups = []
|
|
39
|
+
for name, pg in self._pedb.siwave.pin_groups.items():
|
|
40
|
+
pins = [p.aedt_name for p in pg.pins.values()]
|
|
41
|
+
cfg_pg = CfgPinGroup(
|
|
42
|
+
self._pedb,
|
|
43
|
+
name=name,
|
|
44
|
+
reference_designator=None,
|
|
45
|
+
pins=pins,
|
|
46
|
+
)
|
|
47
|
+
self.pin_groups.append(cfg_pg)
|
|
48
|
+
return self.export_properties()
|
|
49
|
+
|
|
50
|
+
def export_properties(self):
|
|
51
|
+
pin_groups = []
|
|
52
|
+
for pg in self.pin_groups:
|
|
53
|
+
pin_groups.append(pg.export_properties())
|
|
54
|
+
return pin_groups
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class CfgPinGroup(CfgBase):
|
|
58
|
+
def __init__(self, pedb, **kwargs):
|
|
59
|
+
self._pedb = pedb
|
|
60
|
+
self.name = kwargs["name"]
|
|
61
|
+
self.reference_designator = kwargs.get("reference_designator")
|
|
62
|
+
self.pins = kwargs.get("pins")
|
|
63
|
+
self.net = kwargs.get("net")
|
|
64
|
+
|
|
65
|
+
def create(self):
|
|
36
66
|
"""Apply pin group on layout."""
|
|
37
67
|
if self.pins:
|
|
38
|
-
if
|
|
39
|
-
self._pedb.
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
return True
|
|
68
|
+
if self.reference_designator is None:
|
|
69
|
+
self._pedb.modeler.create_pin_group(self.name, pins_by_aedt_name=self.pins)
|
|
70
|
+
else:
|
|
71
|
+
self._pedb.siwave.create_pin_group(self.reference_designator, list(self.pins), self.name)
|
|
43
72
|
elif self.net:
|
|
44
73
|
if self.reference_designator in self._pedb.components.instances:
|
|
45
74
|
comp = self._pedb.components.instances[self.reference_designator]
|
|
46
75
|
else:
|
|
47
|
-
|
|
48
|
-
return False
|
|
76
|
+
raise f"Component not found for creating pin group {self.name}."
|
|
49
77
|
pins = [p for p, obj in comp.pins.items() if obj.net_name in self.net]
|
|
50
78
|
if not self._pedb.siwave.create_pin_group(self.reference_designator, pins, self.name):
|
|
51
79
|
self._pedb.logger.error(f"Failed to create pin group {self.name}")
|
|
52
|
-
return False
|
|
53
|
-
else:
|
|
54
|
-
self._pedb.logger.info(f"Pin group {self.name} created.")
|
|
55
|
-
return True
|
|
56
80
|
else:
|
|
57
81
|
self._pedb.logger.error(f"No net and pins defined for defining pin group {self.name}")
|
|
58
|
-
|
|
82
|
+
|
|
83
|
+
def export_properties(self):
|
|
84
|
+
if self.pins:
|
|
85
|
+
return {
|
|
86
|
+
"name": self.name,
|
|
87
|
+
"reference_designator": self.reference_designator,
|
|
88
|
+
"pins": self.pins,
|
|
89
|
+
}
|
|
90
|
+
else:
|
|
91
|
+
return {
|
|
92
|
+
"name": self.name,
|
|
93
|
+
"reference_designator": self.reference_designator,
|
|
94
|
+
"net": self.net,
|
|
95
|
+
}
|
|
@@ -20,92 +20,261 @@
|
|
|
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 pyedb.configuration.cfg_common import CfgBase
|
|
23
24
|
|
|
24
|
-
class CfgCircuitElement:
|
|
25
|
-
@property
|
|
26
|
-
def pedb(self):
|
|
27
|
-
"""Edb."""
|
|
28
|
-
return self._pdata._pedb
|
|
29
25
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
26
|
+
class CfgTerminalInfo(CfgBase):
|
|
27
|
+
CFG_TERMINAL_TYPES = ["pin", "net", "pin_group", "nearest_pin", "coordinates"]
|
|
28
|
+
|
|
29
|
+
def __init__(self, pedb, **kwargs):
|
|
30
|
+
self._pedb = pedb
|
|
31
|
+
self.type = list(kwargs.keys())[0]
|
|
32
|
+
self.value = kwargs[self.type]
|
|
33
|
+
|
|
34
|
+
def export_properties(self):
|
|
35
|
+
return {self.type: self.value}
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class CfgCoordianteTerminalInfo(CfgTerminalInfo):
|
|
39
|
+
def __init__(self, pedb, **kwargs):
|
|
40
|
+
super().__init__(pedb, **kwargs)
|
|
41
|
+
|
|
42
|
+
self.layer = self.value["layer"]
|
|
43
|
+
self.point_x = self.value["point"][0]
|
|
44
|
+
self.point_y = self.value["point"][1]
|
|
45
|
+
self.net = self.value["net"]
|
|
46
|
+
|
|
47
|
+
def export_properties(self):
|
|
48
|
+
return {"layer": self.layer, "point_x": self.point_x, "point_y": self.point_y, "net": self.net}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class CfgNearestPinTerminalInfo(CfgTerminalInfo):
|
|
52
|
+
def __init__(self, pedb, **kwargs):
|
|
53
|
+
super().__init__(pedb, **kwargs)
|
|
54
|
+
self.reference_net = self.value["reference_net"]
|
|
55
|
+
self.search_radius = self.value["search_radius"]
|
|
56
|
+
|
|
57
|
+
def export_properties(self):
|
|
58
|
+
return {"reference_net": self.reference_net, "search_radius": self.search_radius}
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class CfgSources:
|
|
62
|
+
def __init__(self, pedb, sources_data):
|
|
63
|
+
self._pedb = pedb
|
|
64
|
+
self.sources = [CfgSource(self._pedb, **src) for src in sources_data]
|
|
65
|
+
|
|
66
|
+
def apply(self):
|
|
67
|
+
for src in self.sources:
|
|
68
|
+
src.create()
|
|
69
|
+
|
|
70
|
+
def get_data_from_db(self):
|
|
71
|
+
self.sources = []
|
|
72
|
+
sources = {name: t for name, t in self._pedb.terminals.items() if not t.is_reference_terminal}
|
|
73
|
+
sources = {name: t for name, t in sources.items() if t.is_current_source or t.is_voltage_source}
|
|
74
|
+
|
|
75
|
+
for _, src in sources.items():
|
|
76
|
+
src_type = "voltage" if "voltage" in src.boundary_type.lower() else "current"
|
|
77
|
+
name = src.name
|
|
78
|
+
magnitude = src.magnitude
|
|
79
|
+
|
|
80
|
+
if src.terminal_type == "PinGroupTerminal":
|
|
81
|
+
refdes = ""
|
|
82
|
+
pg = self._pedb.siwave.pin_groups[src._edb_object.GetPinGroup().GetName()]
|
|
83
|
+
pos_term_info = {"pin_group": pg.name}
|
|
84
|
+
elif src.terminal_type == "PadstackInstanceTerminal":
|
|
85
|
+
refdes = src.component.refdes if src.component else ""
|
|
86
|
+
pos_term_info = {"pin": src.padstack_instance.component_pin}
|
|
87
|
+
|
|
88
|
+
neg_term = self._pedb.terminals[src.ref_terminal.name]
|
|
89
|
+
if neg_term.terminal_type == "PinGroupTerminal":
|
|
90
|
+
pg = self._pedb.siwave.pin_groups[neg_term._edb_object.GetPinGroup().GetName()]
|
|
91
|
+
neg_term_info = {"pin_group": pg.name}
|
|
92
|
+
elif neg_term.terminal_type == "PadstackInstanceTerminal":
|
|
93
|
+
neg_term_info = {"pin": neg_term.padstack_instance.component_pin}
|
|
94
|
+
|
|
95
|
+
cfg_src = CfgSource(
|
|
96
|
+
self._pedb,
|
|
97
|
+
name=name,
|
|
98
|
+
type=src_type,
|
|
99
|
+
magnitude=magnitude,
|
|
100
|
+
reference_designator=refdes,
|
|
101
|
+
positive_terminal=pos_term_info,
|
|
102
|
+
negative_terminal=neg_term_info,
|
|
103
|
+
)
|
|
104
|
+
self.sources.append(cfg_src)
|
|
105
|
+
return self.export_properties()
|
|
106
|
+
|
|
107
|
+
def export_properties(self):
|
|
108
|
+
sources = []
|
|
109
|
+
for src in self.sources:
|
|
110
|
+
sources.append(src.export_properties())
|
|
111
|
+
return sources
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
class CfgPorts:
|
|
115
|
+
def __init__(self, pedb, ports_data):
|
|
116
|
+
self._pedb = pedb
|
|
117
|
+
self.ports = [CfgPort(self._pedb, **p) for p in ports_data]
|
|
118
|
+
|
|
119
|
+
def apply(self):
|
|
120
|
+
for p in self.ports:
|
|
121
|
+
p.create()
|
|
122
|
+
|
|
123
|
+
def get_data_from_db(self):
|
|
124
|
+
self.ports = []
|
|
125
|
+
ports = {name: t for name, t in self._pedb.terminals.items() if not t.is_reference_terminal}
|
|
126
|
+
ports = {name: t for name, t in ports.items() if t.is_port}
|
|
127
|
+
|
|
128
|
+
for _, p in ports.items():
|
|
129
|
+
port_type = "circuit" if p.is_circuit_port else "coax"
|
|
130
|
+
|
|
131
|
+
if p.terminal_type == "PinGroupTerminal":
|
|
132
|
+
refdes = ""
|
|
133
|
+
pg = self._pedb.siwave.pin_groups[p._edb_object.GetPinGroup().GetName()]
|
|
134
|
+
pos_term_info = {"pin_group": pg.name}
|
|
135
|
+
elif p.terminal_type == "PadstackInstanceTerminal":
|
|
136
|
+
refdes = p.component.refdes if p.component else ""
|
|
137
|
+
pos_term_info = {"pin": p.padstack_instance.component_pin}
|
|
138
|
+
|
|
139
|
+
if port_type == "circuit":
|
|
140
|
+
neg_term = self._pedb.terminals[p.ref_terminal.name]
|
|
141
|
+
if neg_term.terminal_type == "PinGroupTerminal":
|
|
142
|
+
pg = self._pedb.siwave.pin_groups[neg_term._edb_object.GetPinGroup().GetName()]
|
|
143
|
+
neg_term_info = {"pin_group": pg.name}
|
|
144
|
+
elif neg_term.terminal_type == "PadstackInstanceTerminal":
|
|
145
|
+
neg_term_info = {"pin": neg_term.padstack_instance.component_pin}
|
|
146
|
+
|
|
147
|
+
cfg_port = CfgPort(
|
|
148
|
+
self._pedb,
|
|
149
|
+
name=p.name,
|
|
150
|
+
type=port_type,
|
|
151
|
+
reference_designator=refdes,
|
|
152
|
+
positive_terminal=pos_term_info,
|
|
153
|
+
negative_terminal=neg_term_info,
|
|
154
|
+
)
|
|
155
|
+
else:
|
|
156
|
+
cfg_port = CfgPort(
|
|
157
|
+
self._pedb,
|
|
158
|
+
name=p.name,
|
|
159
|
+
type=port_type,
|
|
160
|
+
reference_designator=refdes,
|
|
161
|
+
positive_terminal=pos_term_info,
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
self.ports.append(cfg_port)
|
|
165
|
+
return self.export_properties()
|
|
166
|
+
|
|
167
|
+
def export_properties(self):
|
|
168
|
+
ports = []
|
|
169
|
+
for p in self.ports:
|
|
170
|
+
ports.append(p.export_properties())
|
|
171
|
+
return ports
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
class CfgCircuitElement(CfgBase):
|
|
175
|
+
def __init__(self, pedb, **kwargs):
|
|
176
|
+
self._pedb = pedb
|
|
33
177
|
self.name = kwargs.get("name", None)
|
|
34
178
|
self.type = kwargs.get("type", None)
|
|
35
179
|
self.reference_designator = kwargs.get("reference_designator", None)
|
|
36
180
|
self.distributed = kwargs.get("distributed", False)
|
|
37
|
-
|
|
38
|
-
|
|
181
|
+
|
|
182
|
+
pos = kwargs["positive_terminal"] # {"pin" : "A1"}
|
|
183
|
+
if list(pos.keys())[0] == "coordinates":
|
|
184
|
+
self.positive_terminal_info = CfgCoordianteTerminalInfo(self._pedb, **pos)
|
|
185
|
+
else:
|
|
186
|
+
self.positive_terminal_info = CfgTerminalInfo(self._pedb, **pos)
|
|
187
|
+
|
|
188
|
+
neg = kwargs.get("negative_terminal", {})
|
|
189
|
+
if len(neg) == 0:
|
|
190
|
+
self.negative_terminal_info = None
|
|
191
|
+
elif list(neg.keys())[0] == "coordinates":
|
|
192
|
+
self.negative_terminal_info = CfgCoordianteTerminalInfo(self._pedb, **neg)
|
|
193
|
+
elif list(neg.keys())[0] == "nearest_pin":
|
|
194
|
+
self.negative_terminal_info = CfgNearestPinTerminalInfo(self._pedb, **neg)
|
|
195
|
+
else:
|
|
196
|
+
self.negative_terminal_info = CfgTerminalInfo(self._pedb, **neg)
|
|
39
197
|
|
|
40
198
|
def _create_terminals(self):
|
|
41
199
|
"""Create step 1. Collect positive and negative terminals."""
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
200
|
+
|
|
201
|
+
pos_type, pos_value = self.positive_terminal_info.type, self.positive_terminal_info.value
|
|
202
|
+
pos_objs = dict()
|
|
203
|
+
pos_coor_terminal = dict()
|
|
204
|
+
if self.type == "coax":
|
|
205
|
+
pins = self._get_pins(pos_type, pos_value)
|
|
206
|
+
pins = {f"{self.name}_{self.reference_designator}": i for _, i in pins.items()}
|
|
207
|
+
pos_objs.update(pins)
|
|
208
|
+
elif pos_type == "coordinates":
|
|
209
|
+
layer = self.positive_terminal_info.layer
|
|
210
|
+
point = [self.positive_terminal_info.point_x, self.positive_terminal_info.point_y]
|
|
211
|
+
net_name = self.positive_terminal_info.net
|
|
212
|
+
pos_coor_terminal[self.name] = self._pedb.get_point_terminal(self.name, net_name, point, layer)
|
|
213
|
+
elif pos_type == "pin_group":
|
|
214
|
+
if self.distributed:
|
|
48
215
|
pins = self._get_pins(pos_type, pos_value)
|
|
49
|
-
pins = {f"{self.name}_{self.reference_designator}": i for _, i in pins.items()}
|
|
50
216
|
pos_objs.update(pins)
|
|
51
|
-
|
|
52
|
-
layer = pos_value["layer"]
|
|
53
|
-
point = pos_value["point"]
|
|
54
|
-
net_name = pos_value["net"]
|
|
55
|
-
pos_coor_terminal[self.name] = self.pedb.get_point_terminal(self.name, net_name, point, layer)
|
|
56
|
-
elif pos_type == "pin_group":
|
|
57
|
-
pos_objs[pos_value] = self.pedb.siwave.pin_groups[pos_value]
|
|
58
|
-
elif not self.distributed:
|
|
59
|
-
# get pins
|
|
60
|
-
pins = self._get_pins(pos_type, pos_value) # terminal type pin or net
|
|
61
|
-
# create pin group
|
|
62
|
-
pin_group = self._create_pin_group(pins)
|
|
63
|
-
pos_objs.update(pin_group)
|
|
217
|
+
self._elem_num = len(pos_objs)
|
|
64
218
|
else:
|
|
65
|
-
|
|
66
|
-
|
|
219
|
+
pos_objs[pos_value] = self._pedb.siwave.pin_groups[pos_value]
|
|
220
|
+
elif pos_type == "net":
|
|
221
|
+
if self.distributed:
|
|
222
|
+
pins = self._get_pins(pos_type, pos_value)
|
|
67
223
|
pos_objs.update(pins)
|
|
68
224
|
self._elem_num = len(pos_objs)
|
|
225
|
+
else:
|
|
226
|
+
pins = self._get_pins(pos_type, pos_value)
|
|
227
|
+
# create pin group
|
|
228
|
+
neg_obj = self._create_pin_group(pins)
|
|
229
|
+
pos_objs.update(neg_obj)
|
|
230
|
+
elif pos_type == "pin":
|
|
231
|
+
pins = {pos_value: self._pedb.components.components[self.reference_designator].pins[pos_value]}
|
|
232
|
+
pos_objs.update(pins)
|
|
233
|
+
else:
|
|
234
|
+
raise f"Wrong positive terminal type {pos_type}"
|
|
69
235
|
|
|
70
|
-
|
|
71
|
-
|
|
236
|
+
self.pos_terminals = {i: j.create_terminal(i) for i, j in pos_objs.items()}
|
|
237
|
+
self.pos_terminals.update(pos_coor_terminal)
|
|
72
238
|
|
|
73
|
-
neg_term_info = self.neg_term_info
|
|
74
239
|
self.neg_terminal = None
|
|
75
|
-
if
|
|
76
|
-
neg_type, neg_value =
|
|
240
|
+
if self.negative_terminal_info:
|
|
241
|
+
neg_type, neg_value = self.negative_terminal_info.type, self.negative_terminal_info.value
|
|
77
242
|
|
|
78
243
|
if neg_type == "coordinates":
|
|
79
|
-
layer =
|
|
80
|
-
point =
|
|
81
|
-
net_name =
|
|
82
|
-
self.neg_terminal = self.
|
|
244
|
+
layer = self.negative_terminal_info.layer
|
|
245
|
+
point = [self.negative_terminal_info.point_x, self.positive_terminal_info.point_y]
|
|
246
|
+
net_name = self.negative_terminal_info.net
|
|
247
|
+
self.neg_terminal = self._pedb.get_point_terminal(self.name + "_ref", net_name, point, layer)
|
|
83
248
|
elif neg_type == "nearest_pin":
|
|
84
249
|
ref_net = neg_value.get("reference_net", "GND")
|
|
85
250
|
search_radius = neg_value.get("search_radius", "5e-3")
|
|
86
251
|
temp = dict()
|
|
87
252
|
for i, j in pos_objs.items():
|
|
88
|
-
temp[i] = self.
|
|
253
|
+
temp[i] = self._pedb.padstacks.get_reference_pins(j, ref_net, search_radius, max_limit=1)[0]
|
|
89
254
|
self.neg_terminal = {
|
|
90
255
|
i: j.create_terminal(i + "_ref") if not j.terminal else j.terminal for i, j in temp.items()
|
|
91
256
|
}
|
|
92
257
|
else:
|
|
93
258
|
if neg_type == "pin_group":
|
|
94
|
-
|
|
95
|
-
|
|
259
|
+
neg_obj = {neg_value: self._pedb.siwave.pin_groups[neg_value]}
|
|
260
|
+
elif neg_type == "net":
|
|
96
261
|
# Get pins
|
|
97
262
|
pins = self._get_pins(neg_type, neg_value) # terminal type pin or net
|
|
98
263
|
# create pin group
|
|
99
|
-
|
|
264
|
+
neg_obj = self._create_pin_group(pins, True)
|
|
265
|
+
elif neg_type == "pin":
|
|
266
|
+
neg_obj = {neg_value: self._pedb.components.components[self.reference_designator].pins[neg_value]}
|
|
267
|
+
else:
|
|
268
|
+
raise f"Wrong negative terminal type {neg_type}"
|
|
100
269
|
self.neg_terminal = [
|
|
101
|
-
j.create_terminal(i) if not j.terminal else j.terminal for i, j in
|
|
270
|
+
j.create_terminal(i) if not j.terminal else j.terminal for i, j in neg_obj.items()
|
|
102
271
|
][0]
|
|
103
272
|
|
|
104
273
|
def _get_pins(self, terminal_type, terminal_value):
|
|
105
274
|
terminal_value = terminal_value if isinstance(terminal_value, list) else [terminal_value]
|
|
106
275
|
|
|
107
276
|
def get_pin_obj(pin_name):
|
|
108
|
-
return {pin_name: self.
|
|
277
|
+
return {pin_name: self._pedb.components.components[self.reference_designator].pins[pin_name]}
|
|
109
278
|
|
|
110
279
|
pins = dict()
|
|
111
280
|
if terminal_type == "pin":
|
|
@@ -113,9 +282,9 @@ class CfgCircuitElement:
|
|
|
113
282
|
pins.update(get_pin_obj(i))
|
|
114
283
|
else:
|
|
115
284
|
if terminal_type == "net":
|
|
116
|
-
temp = self.
|
|
285
|
+
temp = self._pedb.components.get_pins(self.reference_designator, terminal_value[0])
|
|
117
286
|
elif terminal_type == "pin_group":
|
|
118
|
-
pin_group = self.
|
|
287
|
+
pin_group = self._pedb.siwave.pin_groups[terminal_value[0]]
|
|
119
288
|
temp = pin_group.pins
|
|
120
289
|
pins.update({f"{self.reference_designator}_{terminal_value[0]}_{i}": j for i, j in temp.items()})
|
|
121
290
|
return pins
|
|
@@ -125,8 +294,8 @@ class CfgCircuitElement:
|
|
|
125
294
|
pg_name = f"pg_{self.name}_{self.reference_designator}_ref"
|
|
126
295
|
else:
|
|
127
296
|
pg_name = f"pg_{self.name}_{self.reference_designator}"
|
|
128
|
-
pin_names = [i.
|
|
129
|
-
name, temp = self.
|
|
297
|
+
pin_names = [i.component_pin for i in pins.values()]
|
|
298
|
+
name, temp = self._pedb.siwave.create_pin_group(self.reference_designator, pin_names, pg_name)
|
|
130
299
|
return {name: temp}
|
|
131
300
|
|
|
132
301
|
|
|
@@ -135,8 +304,8 @@ class CfgPort(CfgCircuitElement):
|
|
|
135
304
|
|
|
136
305
|
CFG_PORT_TYPE = {"circuit": [str], "coax": [str]}
|
|
137
306
|
|
|
138
|
-
def __init__(self,
|
|
139
|
-
super().__init__(
|
|
307
|
+
def __init__(self, pedb, **kwargs):
|
|
308
|
+
super().__init__(pedb, **kwargs)
|
|
140
309
|
|
|
141
310
|
def create(self):
|
|
142
311
|
"""Create port."""
|
|
@@ -145,29 +314,38 @@ class CfgPort(CfgCircuitElement):
|
|
|
145
314
|
circuit_elements = []
|
|
146
315
|
for name, j in self.pos_terminals.items():
|
|
147
316
|
if isinstance(self.neg_terminal, dict):
|
|
148
|
-
elem = self.
|
|
317
|
+
elem = self._pedb.create_port(j, self.neg_terminal[name], is_circuit_port)
|
|
149
318
|
else:
|
|
150
|
-
elem = self.
|
|
319
|
+
elem = self._pedb.create_port(j, self.neg_terminal, is_circuit_port)
|
|
151
320
|
if not self.distributed:
|
|
152
321
|
elem.name = self.name
|
|
153
322
|
circuit_elements.append(elem)
|
|
154
323
|
return circuit_elements
|
|
155
324
|
|
|
325
|
+
def export_properties(self):
|
|
326
|
+
return {
|
|
327
|
+
"name": self.name,
|
|
328
|
+
"type": self.type,
|
|
329
|
+
"reference_designator": self.reference_designator,
|
|
330
|
+
"positive_terminal": self.positive_terminal_info.export_properties(),
|
|
331
|
+
"negative_terminal": self.negative_terminal_info.export_properties(),
|
|
332
|
+
}
|
|
156
333
|
|
|
157
|
-
|
|
334
|
+
|
|
335
|
+
class CfgSource(CfgCircuitElement):
|
|
158
336
|
CFG_SOURCE_TYPE = {"current": [int, float], "voltage": [int, float]}
|
|
159
337
|
|
|
160
|
-
def __init__(self,
|
|
161
|
-
super().__init__(
|
|
338
|
+
def __init__(self, pedb, **kwargs):
|
|
339
|
+
super().__init__(pedb, **kwargs)
|
|
162
340
|
|
|
163
341
|
self.magnitude = kwargs.get("magnitude", 0.001)
|
|
164
342
|
|
|
165
343
|
def create(self):
|
|
166
344
|
"""Create sources."""
|
|
167
345
|
self._create_terminals()
|
|
168
|
-
is_circuit_port = True if self.type == "circuit" else False
|
|
346
|
+
# is_circuit_port = True if self.type == "circuit" else False
|
|
169
347
|
circuit_elements = []
|
|
170
|
-
method = self.
|
|
348
|
+
method = self._pedb.create_current_source if self.type == "current" else self._pedb.create_voltage_source
|
|
171
349
|
for name, j in self.pos_terminals.items():
|
|
172
350
|
if isinstance(self.neg_terminal, dict):
|
|
173
351
|
elem = method(j, self.neg_terminal[name])
|
|
@@ -181,3 +359,13 @@ class CfgSources(CfgCircuitElement):
|
|
|
181
359
|
elem.magnitude = self.magnitude / self._elem_num
|
|
182
360
|
circuit_elements.append(elem)
|
|
183
361
|
return circuit_elements
|
|
362
|
+
|
|
363
|
+
def export_properties(self):
|
|
364
|
+
return {
|
|
365
|
+
"name": self.name,
|
|
366
|
+
"reference_designator": self.reference_designator,
|
|
367
|
+
"type": self.type,
|
|
368
|
+
"magnitude": self.magnitude,
|
|
369
|
+
"positive_terminal": self.positive_terminal_info.export_properties(),
|
|
370
|
+
"negative_terminal": self.negative_terminal_info.export_properties(),
|
|
371
|
+
}
|