pyedb 0.10.dev0__py3-none-any.whl → 0.11.2__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 (39) hide show
  1. pyedb/__init__.py +1 -1
  2. pyedb/configuration/cfg_boundaries.py +115 -0
  3. pyedb/configuration/cfg_components.py +205 -0
  4. pyedb/configuration/cfg_data.py +38 -15
  5. pyedb/configuration/cfg_general.py +34 -0
  6. pyedb/{dotnet/sim_setup_data/data/siw_dc_ir_settings.py → configuration/cfg_nets.py} +18 -21
  7. pyedb/configuration/cfg_padstacks.py +125 -0
  8. pyedb/configuration/cfg_pin_groups.py +58 -0
  9. pyedb/configuration/cfg_ports_sources.py +164 -0
  10. pyedb/configuration/cfg_s_parameter_models.py +60 -0
  11. pyedb/configuration/cfg_setup.py +201 -0
  12. pyedb/configuration/cfg_spice_models.py +49 -0
  13. pyedb/configuration/configuration.py +37 -532
  14. pyedb/dotnet/edb.py +37 -8
  15. pyedb/dotnet/edb_core/components.py +43 -0
  16. pyedb/dotnet/edb_core/edb_data/hfss_pi_simulation_setup_data.py +465 -0
  17. pyedb/dotnet/edb_core/edb_data/nets_data.py +6 -2
  18. pyedb/dotnet/edb_core/edb_data/padstacks_data.py +17 -1
  19. pyedb/dotnet/edb_core/edb_data/raptor_x_simulation_setup_data.py +0 -4
  20. pyedb/dotnet/edb_core/edb_data/siwave_simulation_setup_data.py +4 -2
  21. pyedb/dotnet/edb_core/edb_data/sources.py +21 -5
  22. pyedb/dotnet/edb_core/edb_data/terminals.py +2 -1
  23. pyedb/dotnet/edb_core/layout.py +13 -8
  24. pyedb/dotnet/edb_core/nets.py +7 -3
  25. pyedb/dotnet/edb_core/padstack.py +23 -3
  26. pyedb/dotnet/edb_core/sim_setup_data/__init__.py +3 -0
  27. pyedb/dotnet/edb_core/sim_setup_data/data/__init__.py +3 -0
  28. pyedb/dotnet/edb_core/sim_setup_data/data/siw_dc_ir_settings.py +235 -0
  29. pyedb/dotnet/edb_core/siwave.py +2 -1
  30. pyedb/dotnet/edb_core/stackup.py +45 -33
  31. pyedb/dotnet/edb_core/utilities/simulation_setup.py +21 -5
  32. pyedb/generic/plot.py +6 -5
  33. pyedb/siwave.py +32 -6
  34. pyedb/siwave_core/icepak.py +153 -0
  35. {pyedb-0.10.dev0.dist-info → pyedb-0.11.2.dist-info}/METADATA +6 -6
  36. {pyedb-0.10.dev0.dist-info → pyedb-0.11.2.dist-info}/RECORD +38 -25
  37. pyedb/configuration/cfg_ports.py +0 -149
  38. {pyedb-0.10.dev0.dist-info → pyedb-0.11.2.dist-info}/LICENSE +0 -0
  39. {pyedb-0.10.dev0.dist-info → pyedb-0.11.2.dist-info}/WHEEL +0 -0
@@ -60,11 +60,13 @@ class EDBPadProperties(object):
60
60
  """
61
61
 
62
62
  def __init__(self, edb_padstack, layer_name, pad_type, p_edb_padstack):
63
- self._edb_padstack = edb_padstack
63
+ self._edb_object = edb_padstack
64
64
  self._pedbpadstack = p_edb_padstack
65
65
  self.layer_name = layer_name
66
66
  self.pad_type = pad_type
67
67
 
68
+ self._edb_padstack = self._edb_object
69
+
68
70
  @property
69
71
  def _padstack_methods(self):
70
72
  return self._pedbpadstack._padstack_methods
@@ -1195,6 +1197,12 @@ class EDBPadstackInstance(EDBPrimitivesMain):
1195
1197
 
1196
1198
  @pyedb_function_handler()
1197
1199
  def _create_terminal(self, name=None):
1200
+ """Create a padstack instance terminal"""
1201
+ warnings.warn("`_create_terminal` is deprecated. Use `create_terminal` instead.", DeprecationWarning)
1202
+ return self.create_terminal(name)
1203
+
1204
+ @pyedb_function_handler
1205
+ def create_terminal(self, name=None):
1198
1206
  """Create a padstack instance terminal"""
1199
1207
  from pyedb.dotnet.edb_core.edb_data.terminals import PadstackInstanceTerminal
1200
1208
 
@@ -1618,6 +1626,14 @@ class EDBPadstackInstance(EDBPrimitivesMain):
1618
1626
  """
1619
1627
  self._edb_padstackinstance.SetIsLayoutPin(pin)
1620
1628
 
1629
+ @property
1630
+ def component(self):
1631
+ """Component."""
1632
+ from pyedb.dotnet.edb_core.edb_data.components_data import EDBComponent
1633
+
1634
+ comp = EDBComponent(self._pedb, self._edb_object.GetComponent())
1635
+ return comp if not comp.is_null else False
1636
+
1621
1637
  @property
1622
1638
  def position(self):
1623
1639
  """Padstack instance position.
@@ -74,10 +74,6 @@ class RaptorXSimulationSetup(BaseSimulationSetup):
74
74
  else:
75
75
  self.logger.error(f"RaptorX setup position input setter must be an integer. Provided value {value}")
76
76
 
77
- @property
78
- def frequency_sweeps(self):
79
- return list(self._edb_setup_info.SweepDataList)
80
-
81
77
  @pyedb_function_handler()
82
78
  def add_frequency_sweep(self, name=None, frequency_sweep=None):
83
79
  """Add frequency sweep.
@@ -26,8 +26,10 @@ from pyedb.dotnet.edb_core.general import (
26
26
  convert_netdict_to_pydict,
27
27
  convert_pydict_to_netdict,
28
28
  )
29
+ from pyedb.dotnet.edb_core.sim_setup_data.data.siw_dc_ir_settings import (
30
+ SiwaveDCIRSettings,
31
+ )
29
32
  from pyedb.dotnet.edb_core.utilities.simulation_setup import BaseSimulationSetup
30
- from pyedb.dotnet.sim_setup_data.data.siw_dc_ir_settings import SiwaveDCIRSettings
31
33
  from pyedb.generic.general_methods import is_linux, pyedb_function_handler
32
34
 
33
35
 
@@ -986,7 +988,7 @@ class SiwaveSYZSimulationSetup(BaseSimulationSetup):
986
988
  val = val.replace("SourceTermsToGround(", "").replace(")", "").split(",")
987
989
  for v in val:
988
990
  source = v.split("=")
989
- sources[source[0]] = source[1]
991
+ sources[source[0]] = int(source[1].replace("'", ""))
990
992
  edb_sim_setup_info.SimulationSettings.DCIRSettings.SourceTermsToGround = convert_pydict_to_netdict(
991
993
  sources
992
994
  )
@@ -309,13 +309,18 @@ class PinGroup(object):
309
309
  @pyedb_function_handler
310
310
  def get_terminal(self, name=None, create_new_terminal=False):
311
311
  """Terminal."""
312
-
312
+ warnings.warn("Use new property :func:`terminal` instead.", DeprecationWarning)
313
313
  if create_new_terminal:
314
314
  term = self._create_terminal(name)
315
315
  else:
316
- from pyedb.dotnet.edb_core.edb_data.terminals import PinGroupTerminal
316
+ return self.terminal
317
+
318
+ @property
319
+ def terminal(self):
320
+ """Terminal."""
321
+ from pyedb.dotnet.edb_core.edb_data.terminals import PinGroupTerminal
317
322
 
318
- term = PinGroupTerminal(self._pedb, self._edb_pin_group.GetPinGroupTerminal())
323
+ term = PinGroupTerminal(self._pedb, self._edb_pin_group.GetPinGroupTerminal())
319
324
  return term if not term.is_null else None
320
325
 
321
326
  @pyedb_function_handler()
@@ -332,17 +337,28 @@ class PinGroup(object):
332
337
  -------
333
338
  :class:`pyedb.dotnet.edb_core.edb_data.terminals.PinGroupTerminal`
334
339
  """
340
+ warnings.warn("`_create_terminal` is deprecated. Use `create_terminal` instead.", DeprecationWarning)
341
+
335
342
  terminal = self.get_terminal()
336
343
  if terminal:
337
344
  return terminal
345
+ else:
346
+ return self.create_terminal(name)
338
347
 
348
+ @pyedb_function_handler()
349
+ def create_terminal(self, name=None):
350
+ """Create a terminal.
351
+
352
+ Parameters
353
+ ----------
354
+ name : str, optional
355
+ Name of the terminal.
356
+ """
339
357
  if not name:
340
358
  name = generate_unique_name(self.name)
341
-
342
359
  from pyedb.dotnet.edb_core.edb_data.terminals import PinGroupTerminal
343
360
 
344
361
  term = PinGroupTerminal(self._pedb)
345
-
346
362
  term = term.create(name, self.net_name, self.name)
347
363
  return term
348
364
 
@@ -643,9 +643,10 @@ class PinGroupTerminal(Terminal):
643
643
  -------
644
644
  :class:`pyedb.dotnet.edb_core.edb_data.terminals.PinGroupTerminal`
645
645
  """
646
+ net_obj = self._pedb.edb_api.cell.net.find_by_name(self._pedb.active_layout, net_name)
646
647
  term = self._pedb.edb_api.cell.terminal.PinGroupTerminal.Create(
647
648
  self._pedb.active_layout,
648
- self._pedb.nets[net_name].net_object,
649
+ net_obj.api_object,
649
650
  name,
650
651
  self._pedb.siwave.pin_groups[pin_group_name]._edb_object,
651
652
  is_ref,
@@ -152,10 +152,12 @@ class EdbLayout(object):
152
152
  for lay in self.layers:
153
153
  _primitives_by_layer[lay] = []
154
154
  for i in self._layout.primitives:
155
- lay = i.GetLayer().GetName()
156
- if not lay:
155
+ try:
156
+ lay = i.GetLayer().GetName()
157
+ _primitives_by_layer[lay].append(cast(i, self._pedb))
158
+ except:
159
+ self._logger.warning(f"Failed to get layer on primitive {i}, skipping.")
157
160
  continue
158
- _primitives_by_layer[lay].append(cast(i, self._pedb))
159
161
  return _primitives_by_layer
160
162
 
161
163
  @property
@@ -233,11 +235,14 @@ class EdbLayout(object):
233
235
  """
234
236
  objinst = []
235
237
  for el in self.polygons:
236
- if el.GetLayer().GetName() == layer_name:
237
- if net_list and el.GetNet().GetName() in net_list:
238
- objinst.append(el)
239
- else:
240
- objinst.append(el)
238
+ try:
239
+ if el.GetLayer().GetName() == layer_name:
240
+ if net_list and el.GetNet().GetName() in net_list:
241
+ objinst.append(el)
242
+ else:
243
+ objinst.append(el)
244
+ except:
245
+ self._logger.warning(f"Failed to retrieve layer on polygon {el}")
241
246
  return objinst
242
247
 
243
248
  @pyedb_function_handler()
@@ -822,6 +822,7 @@ class EdbNets(object):
822
822
  size=(2000, 1000),
823
823
  plot_components_on_top=False,
824
824
  plot_components_on_bottom=False,
825
+ show=True,
825
826
  ):
826
827
  """Plot a Net to Matplotlib 2D Chart.
827
828
 
@@ -838,8 +839,8 @@ class EdbNets(object):
838
839
  If ``True`` the legend is shown in the plot. (default)
839
840
  If ``False`` the legend is not shown.
840
841
  save_plot : str, optional
841
- If ``None`` the plot will be shown.
842
- If a file path is specified the plot will be saved to such file.
842
+ If a path is specified the plot will be saved in this location.
843
+ If ``save_plot`` is provided, the ``show`` parameter is ignored.
843
844
  outline : list, optional
844
845
  List of points of the outline to plot.
845
846
  size : tuple, int, optional
@@ -852,6 +853,8 @@ class EdbNets(object):
852
853
  If ``True`` the components placed on bottom layer are plotted.
853
854
  If ``False`` the components are not plotted. (default)
854
855
  If nets and/or layers is specified, only the components belonging to the specified nets/layers are plotted.
856
+ show : bool, optional
857
+ Whether to show the plot or not. Default is `True`.
855
858
  """
856
859
  if is_ironpython:
857
860
  self._logger.warning("Plot functionalities are enabled only in CPython.")
@@ -880,8 +883,9 @@ class EdbNets(object):
880
883
  xlabel="X (m)",
881
884
  ylabel="Y (m)",
882
885
  title=self._pedb.active_cell.GetName(),
883
- snapshot_path=save_plot,
886
+ save_plot=save_plot,
884
887
  axis_equal=True,
888
+ show=show,
885
889
  )
886
890
 
887
891
  @pyedb_function_handler()
@@ -236,7 +236,7 @@ class EdbPadstacks(object):
236
236
 
237
237
  """
238
238
  padstack_instances = {}
239
- for _, edb_padstack_instance in self._pedb.padstacks.instances.items():
239
+ for _, edb_padstack_instance in self.instances.items():
240
240
  if edb_padstack_instance.aedt_name:
241
241
  padstack_instances[edb_padstack_instance.aedt_name] = EDBPadstackInstance(
242
242
  edb_padstack_instance, self._pedb
@@ -1353,7 +1353,15 @@ class EdbPadstacks(object):
1353
1353
  return True
1354
1354
 
1355
1355
  @pyedb_function_handler()
1356
- def get_instances(self, name=None, pid=None, definition_name=None, net_name=None):
1356
+ def get_instances(
1357
+ self,
1358
+ name=None,
1359
+ pid=None,
1360
+ definition_name=None,
1361
+ net_name=None,
1362
+ component_reference_designator=None,
1363
+ component_pin=None,
1364
+ ):
1357
1365
  """Get padstack instances by conditions.
1358
1366
 
1359
1367
  Parameters
@@ -1366,7 +1374,8 @@ class EdbPadstacks(object):
1366
1374
  Name of the padstack definition.
1367
1375
  net_name : str, optional
1368
1376
  The net name to be used for filtering padstack instances.
1369
-
1377
+ component_pin: str, optional
1378
+ Pin Number of the component.
1370
1379
  Returns
1371
1380
  -------
1372
1381
  list
@@ -1386,6 +1395,17 @@ class EdbPadstacks(object):
1386
1395
  if net_name:
1387
1396
  net_name = net_name if isinstance(net_name, list) else [net_name]
1388
1397
  instances = [inst for inst in instances if inst.net_name in net_name]
1398
+ if component_reference_designator:
1399
+ refdes = (
1400
+ component_reference_designator
1401
+ if isinstance(component_reference_designator, list)
1402
+ else [component_reference_designator]
1403
+ )
1404
+ instances = [inst for inst in instances if inst.component]
1405
+ instances = [inst for inst in instances if inst.component.refdes in refdes]
1406
+ if component_pin:
1407
+ component_pin = component_pin if isinstance(component_pin, list) else [component_pin]
1408
+ instances = [inst for inst in instances if inst.pin_number in component_pin]
1389
1409
  return instances
1390
1410
 
1391
1411
  @pyedb_function_handler()
@@ -0,0 +1,3 @@
1
+ from pathlib import Path
2
+
3
+ workdir = Path(__file__).parent
@@ -0,0 +1,3 @@
1
+ from pathlib import Path
2
+
3
+ workdir = Path(__file__).parent
@@ -0,0 +1,235 @@
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.general import (
24
+ convert_netdict_to_pydict,
25
+ convert_pydict_to_netdict,
26
+ )
27
+
28
+
29
+ class SiwaveDCIRSettings:
30
+ """Class for DC IR settings."""
31
+
32
+ def __init__(self, parent):
33
+ self._parent = parent
34
+
35
+ @property
36
+ def export_dc_thermal_data(self):
37
+ """Export DC Thermal Data.
38
+
39
+ Returns
40
+ -------
41
+ bool
42
+ ``True`` when activated, ``False`` deactivated.
43
+ """
44
+ return self._parent.get_sim_setup_info.SimulationSettings.DCIRSettings.ExportDCThermalData
45
+
46
+ @export_dc_thermal_data.setter
47
+ def export_dc_thermal_data(self, value):
48
+ edb_setup_info = self._parent.get_sim_setup_info
49
+ edb_setup_info.SimulationSettings.DCIRSettings.ExportDCThermalData = value
50
+ self._parent._edb_object = self._parent._set_edb_setup_info(edb_setup_info)
51
+ self._parent._update_setup()
52
+
53
+ @property
54
+ def import_thermal_data(self):
55
+ """Import Thermal Data.
56
+
57
+ Returns
58
+ -------
59
+ bool
60
+ ``True`` when activated, ``False`` deactivated.
61
+ """
62
+ return self._parent.get_sim_setup_info.SimulationSettings.DCIRSettings.ImportThermalData
63
+
64
+ @import_thermal_data.setter
65
+ def import_thermal_data(self, value):
66
+ edb_setup_info = self._parent.get_sim_setup_info
67
+ edb_setup_info.SimulationSettings.DCIRSettings.ImportThermalData = value
68
+ self._parent._edb_object = self._parent._set_edb_setup_info(edb_setup_info)
69
+ self._parent._update_setup()
70
+
71
+ @property
72
+ def dc_report_show_active_devices(self):
73
+ """DC Report Show Active Devices.
74
+
75
+ Returns
76
+ -------
77
+ bool
78
+ ``True`` when activated, ``False`` deactivated.
79
+ """
80
+ return self._parent.get_sim_setup_info.SimulationSettings.DCIRSettings.DCReportShowActiveDevices
81
+
82
+ @dc_report_show_active_devices.setter
83
+ def dc_report_show_active_devices(self, value):
84
+ edb_setup_info = self._parent.get_sim_setup_info
85
+ edb_setup_info.SimulationSettings.DCIRSettings.DCReportShowActiveDevices = value
86
+ self._parent._edb_object = self._parent._set_edb_setup_info(edb_setup_info)
87
+ self._parent._update_setup()
88
+
89
+ @property
90
+ def per_pin_use_pin_format(self):
91
+ """Per Pin Use Pin Format.
92
+
93
+ Returns
94
+ -------
95
+ bool
96
+ ``True`` when activated, ``False`` deactivated.
97
+ """
98
+ return self._parent.get_sim_setup_info.SimulationSettings.DCIRSettings.PerPinUsePinFormat
99
+
100
+ @per_pin_use_pin_format.setter
101
+ def per_pin_use_pin_format(self, value):
102
+ edb_setup_info = self._parent.get_sim_setup_info
103
+ edb_setup_info.SimulationSettings.DCIRSettings.PerPinUsePinFormat = value
104
+ self._parent._edb_object = self._parent._set_edb_setup_info(edb_setup_info)
105
+ self._parent._update_setup()
106
+
107
+ @property
108
+ def use_loop_res_for_per_pin(self):
109
+ """Use loop Res Per Pin.
110
+
111
+ Returns
112
+ -------
113
+ bool
114
+ ``True`` when activated, ``False`` deactivated.
115
+ """
116
+ return self._parent.get_sim_setup_info.SimulationSettings.DCIRSettings.UseLoopResForPerPin
117
+
118
+ @use_loop_res_for_per_pin.setter
119
+ def use_loop_res_for_per_pin(self, value):
120
+ edb_setup_info = self._parent.get_sim_setup_info
121
+ edb_setup_info.SimulationSettings.DCIRSettings.UseLoopResForPerPin = value
122
+ self._parent._edb_object = self._parent._set_edb_setup_info(edb_setup_info)
123
+ self._parent._update_setup()
124
+
125
+ @property
126
+ def dc_report_config_file(self):
127
+ """DC Report Config File.
128
+
129
+ Returns
130
+ -------
131
+ str
132
+ path to the DC report configuration file.
133
+ """
134
+ return self._parent.get_sim_setup_info.SimulationSettings.DCIRSettings.DCReportConfigFile
135
+
136
+ @dc_report_config_file.setter
137
+ def dc_report_config_file(self, value):
138
+ edb_setup_info = self._parent.get_sim_setup_info
139
+ edb_setup_info.SimulationSettings.DCIRSettings.DCReportConfigFile = value
140
+ self._parent._edb_object = self._parent._set_edb_setup_info(edb_setup_info)
141
+ self._parent._update_setup()
142
+
143
+ @property
144
+ def full_dc_report_path(self):
145
+ """Full DC Report Path.
146
+
147
+ Returns
148
+ -------
149
+ str
150
+ full path to the DC report file.
151
+ """
152
+ return self._parent.get_sim_setup_info.SimulationSettings.DCIRSettings.FullDCReportPath
153
+
154
+ @full_dc_report_path.setter
155
+ def full_dc_report_path(self, value):
156
+ edb_setup_info = self._parent.get_sim_setup_info
157
+ edb_setup_info.SimulationSettings.DCIRSettings.FullDCReportPath = value
158
+ self._parent._edb_object = self._parent._set_edb_setup_info(edb_setup_info)
159
+ self._parent._update_setup()
160
+
161
+ @property
162
+ def icepak_temp_file(self):
163
+ """Icepack Temp File.
164
+
165
+ Returns
166
+ -------
167
+ str
168
+ path to the temp Icepak file.
169
+ """
170
+ return self._parent.get_sim_setup_info.SimulationSettings.DCIRSettings.IcepakTempFile
171
+
172
+ @icepak_temp_file.setter
173
+ def icepak_temp_file(self, value):
174
+ edb_setup_info = self._parent.get_sim_setup_info
175
+ edb_setup_info.SimulationSettings.DCIRSettings.IcepakTempFile = value
176
+ self._parent._edb_object = self._parent._set_edb_setup_info(edb_setup_info)
177
+ self._parent._update_setup()
178
+
179
+ @property
180
+ def per_pin_res_path(self):
181
+ """Per Pin Res Path.
182
+
183
+ Returns
184
+ -------
185
+ str
186
+ path for per pin res.
187
+ """
188
+ return self._parent.get_sim_setup_info.SimulationSettings.DCIRSettings.PerPinResPath
189
+
190
+ @per_pin_res_path.setter
191
+ def per_pin_res_path(self, value):
192
+ edb_setup_info = self._parent.get_sim_setup_info
193
+ edb_setup_info.SimulationSettings.DCIRSettings.PerPinResPath = value
194
+ self._parent._edb_object = self._parent._set_edb_setup_info(edb_setup_info)
195
+ self._parent._update_setup()
196
+
197
+ @property
198
+ def via_report_path(self):
199
+ """Via Report Path.
200
+
201
+ Returns
202
+ -------
203
+ str
204
+ path for the Via Report.
205
+ """
206
+ return self._parent.get_sim_setup_info.SimulationSettings.DCIRSettings.ViaReportPath
207
+
208
+ @via_report_path.setter
209
+ def via_report_path(self, value):
210
+ edb_setup_info = self._parent.get_sim_setup_info
211
+ edb_setup_info.SimulationSettings.DCIRSettings.ViaReportPath = value
212
+ self._parent._edb_object = self._parent._set_edb_setup_info(edb_setup_info)
213
+ self._parent._update_setup()
214
+
215
+ @property
216
+ def source_terms_to_ground(self):
217
+ """A dictionary of SourceName, NodeToGround pairs,
218
+ where NodeToGround is one of 0 (unspecified), 1 (negative), 2 (positive).
219
+
220
+
221
+ Returns
222
+ -------
223
+ dict <str, int>
224
+ str: source name,
225
+ int: node to ground pairs, 0 (unspecified), 1 (negative), 2 (positive) .
226
+ """
227
+ temp = self._parent.get_sim_setup_info.SimulationSettings.DCIRSettings.SourceTermsToGround
228
+ return convert_netdict_to_pydict(temp)
229
+
230
+ @source_terms_to_ground.setter
231
+ def source_terms_to_ground(self, value):
232
+ edb_setup_info = self._parent.get_sim_setup_info
233
+ edb_setup_info.SimulationSettings.DCIRSettings.SourceTermsToGround = convert_pydict_to_netdict(value)
234
+ self._parent._edb_object = self._parent._set_edb_setup_info(edb_setup_info)
235
+ self._parent._update_setup()
@@ -1261,7 +1261,8 @@ class EdbSiwave(object):
1261
1261
  if edb_pingroup.IsNull(): # pragma: no cover
1262
1262
  return False
1263
1263
  else:
1264
- edb_pingroup.SetNet(pins[0].GetNet())
1264
+ names = [i for i in pins if i.GetNet().GetName()]
1265
+ edb_pingroup.SetNet(names[0].GetNet())
1265
1266
  return group_name, self.pin_groups[group_name]
1266
1267
 
1267
1268
  @pyedb_function_handler()