pyedb 0.17.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.

Files changed (29) hide show
  1. pyedb/__init__.py +1 -1
  2. pyedb/configuration/cfg_data.py +8 -11
  3. pyedb/configuration/cfg_nets.py +14 -0
  4. pyedb/configuration/cfg_pin_groups.py +57 -20
  5. pyedb/configuration/cfg_ports_sources.py +248 -60
  6. pyedb/configuration/configuration.py +51 -17
  7. pyedb/dotnet/edb.py +92 -28
  8. pyedb/dotnet/edb_core/cell/layout.py +48 -1
  9. pyedb/dotnet/edb_core/cell/terminal/padstack_instance_terminal.py +10 -0
  10. pyedb/dotnet/edb_core/cell/terminal/pingroup_terminal.py +5 -0
  11. pyedb/dotnet/edb_core/cell/terminal/point_terminal.py +0 -11
  12. pyedb/dotnet/edb_core/cell/terminal/terminal.py +35 -1
  13. pyedb/dotnet/edb_core/components.py +74 -18
  14. pyedb/dotnet/edb_core/dotnet/primitive.py +9 -6
  15. pyedb/dotnet/edb_core/edb_data/padstacks_data.py +8 -4
  16. pyedb/dotnet/edb_core/edb_data/ports.py +0 -18
  17. pyedb/dotnet/edb_core/edb_data/primitives_data.py +1 -1
  18. pyedb/dotnet/edb_core/padstack.py +10 -1
  19. pyedb/dotnet/edb_core/sim_setup_data/data/sim_setup_info.py +42 -3
  20. pyedb/dotnet/edb_core/sim_setup_data/data/simulation_settings.py +92 -158
  21. pyedb/dotnet/edb_core/sim_setup_data/data/siw_dc_ir_settings.py +22 -22
  22. pyedb/dotnet/edb_core/sim_setup_data/io/siwave.py +76 -76
  23. pyedb/dotnet/edb_core/utilities/hfss_simulation_setup.py +23 -94
  24. pyedb/dotnet/edb_core/utilities/simulation_setup.py +40 -38
  25. pyedb/dotnet/edb_core/utilities/siwave_simulation_setup.py +26 -17
  26. {pyedb-0.17.0.dist-info → pyedb-0.19.0.dist-info}/METADATA +8 -8
  27. {pyedb-0.17.0.dist-info → pyedb-0.19.0.dist-info}/RECORD +29 -29
  28. {pyedb-0.17.0.dist-info → pyedb-0.19.0.dist-info}/LICENSE +0 -0
  29. {pyedb-0.17.0.dist-info → pyedb-0.19.0.dist-info}/WHEEL +0 -0
pyedb/__init__.py CHANGED
@@ -44,7 +44,7 @@ deprecation_warning()
44
44
  #
45
45
 
46
46
  pyedb_path = os.path.dirname(__file__)
47
- __version__ = "0.17.0"
47
+ __version__ = "0.19.0"
48
48
  version = __version__
49
49
 
50
50
  #
@@ -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 CfgPinGroup
32
- from pyedb.configuration.cfg_ports_sources import CfgPort, CfgSources
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 = None
52
- if kwargs.get("nets"):
53
- self.nets = CfgNets(
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 = [CfgPinGroup(self, pin_group) for pin_group in kwargs.get("pin_groups", [])]
58
+ self.pin_groups = CfgPinGroups(self._pedb, pingroup_data=kwargs.get("pin_groups", []))
62
59
 
63
- self.ports = [CfgPort(self, **port) for port in kwargs.get("ports", [])]
60
+ self.ports = CfgPorts(self._pedb, ports_data=kwargs.get("ports", []))
64
61
 
65
- self.sources = [CfgSources(self, **source) for source in kwargs.get("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
 
@@ -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
- class CfgPinGroup:
25
+
26
+ class CfgPinGroups:
25
27
  """Manage configuration pin group class."""
26
28
 
27
- def __init__(self, pdata, pingroup_dict):
28
- self._pedb = pdata._pedb
29
- self._pingroup_dict = pingroup_dict
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 not self._pedb.siwave.create_pin_group(self.reference_designator, list(self.pins), self.name):
39
- self._pedb.logger.error(f"Failed to create pin group on pins {self.pins}")
40
- return False
41
- self._pedb.logger.info(f"Pin group {self.name} created.")
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
- self._pedb.logger.error("Component not found for creating pin group.")
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
- return False
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
- def __init__(self, pdata, **kwargs):
31
- self._pdata = pdata
32
- self._data = kwargs
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
- self.pos_term_info = kwargs.get("positive_terminal", None) # {"pin" : "A1"}
38
- self.neg_term_info = kwargs.get("negative_terminal", None)
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
- pos_term_info = self.pos_term_info
43
- if pos_term_info:
44
- pos_type, pos_value = [[i, j] for i, j in pos_term_info.items()][0]
45
- pos_objs = dict()
46
- pos_coor_terminal = dict()
47
- if self.type == "coax":
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
- elif pos_type == "coordinates":
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
- # get pins
66
- pins = self._get_pins(pos_type, pos_value) # terminal type pin or net or pin group
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
- self.pos_terminals = {i: j.create_terminal(i) for i, j in pos_objs.items()}
71
- self.pos_terminals.update(pos_coor_terminal)
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 neg_term_info:
76
- neg_type, neg_value = [[i, j] for i, j in neg_term_info.items()][0]
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 = neg_value["layer"]
80
- point = neg_value["point"]
81
- net_name = neg_value["net"]
82
- self.neg_terminal = self.pedb.get_point_terminal(self.name + "_ref", net_name, point, layer)
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._pdata._pedb.padstacks.get_reference_pins(j, ref_net, search_radius, max_limit=1)[0]
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
- pin_group = {neg_value: self.pedb.siwave.pin_groups[neg_value]}
95
- else:
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
- pin_group = self._create_pin_group(pins, True)
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 pin_group.items()
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._pdata.edb_comps[self.reference_designator].pins[pin_name]}
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._pdata._pedb.components.get_pins(self.reference_designator, terminal_value[0])
285
+ temp = self._pedb.components.get_pins(self.reference_designator, terminal_value[0])
117
286
  elif terminal_type == "pin_group":
118
- pin_group = self.pedb.siwave.pin_groups[terminal_value[0]]
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.pin_number for i in pins.values()]
129
- name, temp = self._pdata._pedb.siwave.create_pin_group(self.reference_designator, pin_names, pg_name)
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, pdata, **kwargs):
139
- super().__init__(pdata, **kwargs)
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.pedb.create_port(j, self.neg_terminal[name], is_circuit_port)
317
+ elem = self._pedb.create_port(j, self.neg_terminal[name], is_circuit_port)
149
318
  else:
150
- elem = self.pedb.create_port(j, self.neg_terminal, is_circuit_port)
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
- class CfgSources(CfgCircuitElement):
334
+
335
+ class CfgSource(CfgCircuitElement):
158
336
  CFG_SOURCE_TYPE = {"current": [int, float], "voltage": [int, float]}
159
337
 
160
- def __init__(self, pdata, **kwargs):
161
- super().__init__(pdata, **kwargs)
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.pedb.create_current_source if self.type == "current" else self.pedb.create_voltage_source
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
+ }