pyedb 0.49.0__py3-none-any.whl → 0.50.1__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 (79) hide show
  1. pyedb/__init__.py +1 -1
  2. pyedb/configuration/cfg_modeler.py +42 -11
  3. pyedb/configuration/cfg_ports_sources.py +9 -1
  4. pyedb/dotnet/database/cell/hierarchy/component.py +6 -6
  5. pyedb/dotnet/database/components.py +3 -3
  6. pyedb/dotnet/database/edb_data/padstacks_data.py +13 -0
  7. pyedb/dotnet/database/edb_data/primitives_data.py +3 -3
  8. pyedb/dotnet/database/edb_data/variables.py +3 -3
  9. pyedb/dotnet/database/materials.py +16 -16
  10. pyedb/dotnet/database/modeler.py +38 -4
  11. pyedb/dotnet/database/sim_setup_data/data/settings.py +28 -0
  12. pyedb/dotnet/database/stackup.py +1 -0
  13. pyedb/dotnet/database/utilities/hfss_simulation_setup.py +5 -6
  14. pyedb/dotnet/edb.py +22 -20
  15. pyedb/extensions/__init__.py +0 -0
  16. pyedb/extensions/via_design_backend.py +681 -0
  17. pyedb/grpc/database/components.py +537 -686
  18. pyedb/grpc/database/control_file.py +458 -149
  19. pyedb/grpc/database/definition/component_def.py +17 -14
  20. pyedb/grpc/database/definition/materials.py +60 -60
  21. pyedb/grpc/database/definition/package_def.py +8 -8
  22. pyedb/grpc/database/definition/padstack_def.py +31 -33
  23. pyedb/grpc/database/definitions.py +6 -4
  24. pyedb/grpc/database/geometry/arc_data.py +5 -5
  25. pyedb/grpc/database/geometry/point_3d_data.py +3 -3
  26. pyedb/grpc/database/geometry/polygon_data.py +5 -5
  27. pyedb/grpc/database/hfss.py +399 -397
  28. pyedb/grpc/database/hierarchy/component.py +60 -58
  29. pyedb/grpc/database/hierarchy/pin_pair_model.py +6 -6
  30. pyedb/grpc/database/hierarchy/pingroup.py +13 -11
  31. pyedb/grpc/database/hierarchy/s_parameter_model.py +1 -1
  32. pyedb/grpc/database/hierarchy/spice_model.py +1 -1
  33. pyedb/grpc/database/layers/layer.py +2 -2
  34. pyedb/grpc/database/layers/stackup_layer.py +144 -44
  35. pyedb/grpc/database/layout/layout.py +12 -12
  36. pyedb/grpc/database/layout/voltage_regulator.py +8 -8
  37. pyedb/grpc/database/layout_validation.py +5 -5
  38. pyedb/grpc/database/modeler.py +248 -245
  39. pyedb/grpc/database/net/differential_pair.py +4 -4
  40. pyedb/grpc/database/net/extended_net.py +7 -8
  41. pyedb/grpc/database/net/net.py +57 -46
  42. pyedb/grpc/database/nets.py +139 -122
  43. pyedb/grpc/database/padstacks.py +174 -190
  44. pyedb/grpc/database/ports/ports.py +23 -17
  45. pyedb/grpc/database/primitive/padstack_instance.py +45 -30
  46. pyedb/grpc/database/primitive/path.py +7 -7
  47. pyedb/grpc/database/primitive/polygon.py +9 -9
  48. pyedb/grpc/database/primitive/primitive.py +21 -21
  49. pyedb/grpc/database/primitive/rectangle.py +1 -1
  50. pyedb/grpc/database/simulation_setup/hfss_advanced_settings.py +1 -1
  51. pyedb/grpc/database/simulation_setup/hfss_general_settings.py +1 -1
  52. pyedb/grpc/database/simulation_setup/hfss_settings_options.py +1 -1
  53. pyedb/grpc/database/simulation_setup/hfss_simulation_settings.py +6 -6
  54. pyedb/grpc/database/simulation_setup/hfss_simulation_setup.py +2 -2
  55. pyedb/grpc/database/simulation_setup/raptor_x_simulation_settings.py +2 -2
  56. pyedb/grpc/database/simulation_setup/raptor_x_simulation_setup.py +1 -1
  57. pyedb/grpc/database/simulation_setup/siwave_simulation_setup.py +3 -3
  58. pyedb/grpc/database/siwave.py +166 -214
  59. pyedb/grpc/database/source_excitations.py +156 -0
  60. pyedb/grpc/database/stackup.py +415 -316
  61. pyedb/grpc/database/terminal/bundle_terminal.py +12 -12
  62. pyedb/grpc/database/terminal/edge_terminal.py +6 -5
  63. pyedb/grpc/database/terminal/padstack_instance_terminal.py +13 -13
  64. pyedb/grpc/database/terminal/pingroup_terminal.py +12 -12
  65. pyedb/grpc/database/terminal/point_terminal.py +6 -6
  66. pyedb/grpc/database/terminal/terminal.py +26 -26
  67. pyedb/grpc/database/utility/heat_sink.py +5 -5
  68. pyedb/grpc/database/utility/hfss_extent_info.py +21 -21
  69. pyedb/grpc/database/utility/layout_statistics.py +13 -13
  70. pyedb/grpc/database/utility/rlc.py +3 -3
  71. pyedb/grpc/database/utility/sources.py +1 -1
  72. pyedb/grpc/database/utility/sweep_data_distribution.py +1 -1
  73. pyedb/grpc/edb.py +524 -764
  74. {pyedb-0.49.0.dist-info → pyedb-0.50.1.dist-info}/METADATA +1 -1
  75. {pyedb-0.49.0.dist-info → pyedb-0.50.1.dist-info}/RECORD +77 -77
  76. pyedb/extensions/pre_layout_design_toolkit/via_design.py +0 -1151
  77. pyedb/grpc/database/utility/simulation_configuration.py +0 -3305
  78. {pyedb-0.49.0.dist-info → pyedb-0.50.1.dist-info}/LICENSE +0 -0
  79. {pyedb-0.49.0.dist-info → pyedb-0.50.1.dist-info}/WHEEL +0 -0
@@ -44,99 +44,101 @@ class Nets(CommonNets):
44
44
  """
45
45
 
46
46
  def __getitem__(self, name):
47
- """Get nets from the Edb project.
47
+ """Get a net by name.
48
48
 
49
49
  Parameters
50
50
  ----------
51
- name : str, int
51
+ name : str
52
+ Name of the net to retrieve.
52
53
 
53
54
  Returns
54
55
  -------
55
- :class:` .:class:`pyedb.grpc.database.nets_data.EDBNets`
56
-
56
+ pyedb.grpc.database.net.net.Net
57
+ Net object if found, otherwise None.
57
58
  """
58
59
  return Net(self._pedb, Net.find_by_name(self._active_layout, name))
59
60
 
60
61
  def __contains__(self, name):
61
- """Determine if a net is named ``name`` or not.
62
+ """Check if a net exists in the layout.
62
63
 
63
64
  Parameters
64
65
  ----------
65
66
  name : str
67
+ Name of the net to check.
66
68
 
67
69
  Returns
68
70
  -------
69
71
  bool
70
- ``True`` when one of the net is named ``name``, ``False`` otherwise.
71
-
72
+ True if the net exists, False otherwise.
72
73
  """
73
74
  return name in self.nets
74
75
 
75
76
  def __init__(self, p_edb):
77
+ """Initialize the Nets class."""
76
78
  CommonNets.__init__(self, p_edb)
77
79
  self._nets_by_comp_dict = {}
78
80
  self._comps_by_nets_dict = {}
79
81
 
80
82
  @property
81
83
  def _edb(self):
82
- """ """
84
+ """EDB object."""
83
85
  return self._pedb
84
86
 
85
87
  @property
86
88
  def _active_layout(self):
87
- """ """
89
+ """Active layout."""
88
90
  return self._pedb.active_layout
89
91
 
90
92
  @property
91
93
  def _layout(self):
92
- """ """
94
+ """Current layout."""
93
95
  return self._pedb.layout
94
96
 
95
97
  @property
96
98
  def _cell(self):
97
- """ """
99
+ """Current cell."""
98
100
  return self._pedb.cell
99
101
 
100
102
  @property
101
103
  def db(self):
102
- """Db object."""
104
+ """Database object."""
103
105
  return self._pedb.active_db
104
106
 
105
107
  @property
106
108
  def _logger(self):
107
- """Edb logger."""
109
+ """Logger instance."""
108
110
  return self._pedb.logger
109
111
 
110
112
  @property
111
113
  def nets(self):
112
- """Nets.
114
+ """All nets in the layout.
113
115
 
114
116
  Returns
115
117
  -------
116
- dict[str, :class:`pyedb.dotnet.database.edb_data.nets_data.EDBNetsData`]
117
- Dictionary of nets.
118
+ dict[str, pyedb.grpc.database.net.net.Net]
119
+ Dictionary of net names to Net objects.
118
120
  """
119
121
  return {i.name: i for i in self._pedb.layout.nets}
120
122
 
121
123
  @property
122
124
  def netlist(self):
123
- """Return the cell netlist.
125
+ """List of all net names.
124
126
 
125
127
  Returns
126
128
  -------
127
- list
128
- Net names.
129
+ list[str]
130
+ Names of all nets in the layout.
129
131
  """
130
132
  return list(self.nets.keys())
131
133
 
132
134
  @property
133
135
  def signal(self):
134
- """Signal nets.
136
+ """Signal nets in the layout.
135
137
 
136
138
  Returns
137
139
  -------
138
- dict[str, :class:`pyedb.dotnet.database.edb_data.EDBNetsData`]
139
- Dictionary of signal nets.
140
+ dict[str, pyedb.grpc.database.net.net.Net]
141
+ Dictionary of signal net names to Net objects.
140
142
  """
141
143
  nets = {}
142
144
  for net, value in self.nets.items():
@@ -146,12 +148,12 @@ class Nets(CommonNets):
146
148
 
147
149
  @property
148
150
  def power(self):
149
- """Power nets.
151
+ """Power and ground nets in the layout.
150
152
 
151
153
  Returns
152
154
  -------
153
- dict[str, :class:`pyedb.dotnet.database.edb_data.EDBNetsData`]
154
- Dictionary of power nets.
155
+ dict[str, pyedb.grpc.database.net.net.Net]
156
+ Dictionary of power/ground net names to Net objects.
155
157
  """
156
158
  nets = {}
157
159
  for net, value in self.nets.items():
@@ -160,17 +162,20 @@ class Nets(CommonNets):
160
162
  return nets
161
163
 
162
164
  def eligible_power_nets(self, threshold=0.3):
163
- """Return a list of nets calculated by area to be eligible for PWR/Ground net classification.
164
- It uses the same algorithm implemented in SIwave.
165
+ """Identify nets eligible for power/ground classification based on area ratio.
166
+
167
+ Uses the same algorithm implemented in SIwave.
165
168
 
166
169
  Parameters
167
170
  ----------
168
171
  threshold : float, optional
169
- Area ratio used by the ``get_power_ground_nets`` method.
172
+ Area ratio threshold. Nets with plane area ratio above this value are
173
+ considered power/ground nets.
170
174
 
171
175
  Returns
172
176
  -------
173
- list of :class:`pyedb.dotnet.database.edb_data.EDBNetsData`
177
+ list[pyedb.grpc.database.net.net.Net]
178
+ List of nets eligible as power/ground nets.
174
179
  """
175
180
  pwr_gnd_nets = []
176
181
  for net in self._layout.nets[:]:
@@ -194,16 +199,26 @@ class Nets(CommonNets):
194
199
 
195
200
  @property
196
201
  def nets_by_components(self):
197
- # type: () -> dict
198
- """Get all nets for each component instance."""
202
+ """Mapping of components to their associated nets.
203
+
204
+ Returns
205
+ -------
206
+ dict[str, list[str]]
207
+ Dictionary mapping component names to list of net names.
208
+ """
199
209
  for comp, i in self._pedb.components.instances.items():
200
210
  self._nets_by_comp_dict[comp] = i.nets
201
211
  return self._nets_by_comp_dict
202
212
 
203
213
  @property
204
214
  def components_by_nets(self):
205
- # type: () -> dict
206
- """Get all component instances grouped by nets."""
215
+ """Mapping of nets to their associated components.
216
+
217
+ Returns
218
+ -------
219
+ dict[str, list[str]]
220
+ Dictionary mapping net names to list of component names.
221
+ """
207
222
  for comp, i in self._pedb.components.instances.items():
208
223
  for n in i.nets:
209
224
  if n in self._comps_by_nets_dict:
@@ -221,40 +236,30 @@ class Nets(CommonNets):
221
236
  include_signal=True,
222
237
  include_power=True,
223
238
  ):
224
- # type: (int | float, int | float, int |float, list, bool, bool) -> list
225
- """Get extended net and associated components.
239
+ """Generate extended nets based on component thresholds.
226
240
 
227
- . deprecated:: pyedb 0.30.0
228
- Use :func:`pyedb.grpc.extended_nets.generate_extended_nets` instead.
241
+ .. deprecated:: pyedb 0.30.0
242
+ Use :func:`pyedb.grpc.extended_nets.generate_extended_nets` instead.
229
243
 
230
244
  Parameters
231
245
  ----------
232
- resistor_below : int, float, optional
233
- Threshold of resistor value. Search extended net across resistors which has value lower than the threshold.
234
- inductor_below : int, float, optional
235
- Threshold of inductor value. Search extended net across inductances which has value lower than the
236
- threshold.
237
- capacitor_above : int, float, optional
238
- Threshold of capacitor value. Search extended net across capacitors which has value higher than the
239
- threshold.
246
+ resistor_below : int | float, optional
247
+ Resistor threshold value. Components below this value are considered.
248
+ inductor_below : int | float, optional
249
+ Inductor threshold value. Components below this value are considered.
250
+ capacitor_above : int | float, optional
251
+ Capacitor threshold value. Components above this value are considered.
240
252
  exception_list : list, optional
241
- List of components to bypass when performing threshold checks. Components
242
- in the list are considered as serial components. The default is ``None``.
243
- include_signal : str, optional
244
- Whether to generate extended signal nets. The default is ``True``.
245
- include_power : str, optional
246
- Whether to generate extended power nets. The default is ``True``.
253
+ List of components to bypass during threshold checks.
254
+ include_signal : bool, optional
255
+ Whether to include signal nets in extended net generation.
256
+ include_power : bool, optional
257
+ Whether to include power nets in extended net generation.
247
258
 
248
259
  Returns
249
260
  -------
250
261
  list
251
- List of all extended nets.
252
-
253
- Examples
254
- --------
255
- >>> from pyedb import Edb
256
- >>> app = Edb()
257
- >>> app.nets.get_extended_nets()
262
+ List of generated extended nets.
258
263
  """
259
264
  warnings.warn("Use new method :func:`edb.extended_nets.generate_extended_nets` instead.", DeprecationWarning)
260
265
  self._pedb.extended_nets.generate_extended_nets(
@@ -262,9 +267,18 @@ class Nets(CommonNets):
262
267
  )
263
268
 
264
269
  @staticmethod
265
- def _get_points_for_plot(self, my_net_points):
266
- """
267
- Get the points to be plotted.
270
+ def _get_points_for_plot(my_net_points):
271
+ """Get points for plotting.
272
+
273
+ Parameters
274
+ ----------
275
+ my_net_points : list
276
+ List of points defining the net.
277
+
278
+ Returns
279
+ -------
280
+ tuple
281
+ X and Y coordinates of the points.
268
282
  """
269
283
  # fmt: off
270
284
  x = []
@@ -288,19 +302,19 @@ class Nets(CommonNets):
288
302
  return x, y
289
303
 
290
304
  def classify_nets(self, power_nets=None, signal_nets=None):
291
- """Reassign power/ground or signal nets based on list of nets.
305
+ """Reassign net classifications as power/ground or signal.
292
306
 
293
307
  Parameters
294
308
  ----------
295
- power_nets : str, list, optional
296
- List of power nets to assign. Default is `None`.
297
- signal_nets : str, list, optional
298
- List of signal nets to assign. Default is `None`.
309
+ power_nets : str | list[str], optional
310
+ Nets to classify as power/ground.
311
+ signal_nets : str | list[str], optional
312
+ Nets to classify as signal.
299
313
 
300
314
  Returns
301
315
  -------
302
316
  bool
303
- ``True`` when successful, ``False`` when failed.
317
+ True if successful, False otherwise.
304
318
  """
305
319
  if isinstance(power_nets, str):
306
320
  power_nets = []
@@ -319,17 +333,17 @@ class Nets(CommonNets):
319
333
  return True
320
334
 
321
335
  def is_power_gound_net(self, netname_list):
322
- """Determine if one of the nets in a list is power or ground.
336
+ """Check if any net in a list is a power/ground net.
323
337
 
324
338
  Parameters
325
339
  ----------
326
- netname_list : list
327
- List of net names.
340
+ netname_list : str | list[str]
341
+ Net name or list of net names to check.
328
342
 
329
343
  Returns
330
344
  -------
331
345
  bool
332
- ``True`` when one of the net names is ``"power"`` or ``"ground"``, ``False`` otherwise.
346
+ True if any net is power/ground, False otherwise.
333
347
  """
334
348
  if isinstance(netname_list, str):
335
349
  netname_list = [netname_list]
@@ -340,20 +354,19 @@ class Nets(CommonNets):
340
354
  return False
341
355
 
342
356
  def get_dcconnected_net_list(self, ground_nets=["GND"], res_value=0.001):
343
- """Get the nets connected to the direct current through inductors.
344
-
345
- .. note::
346
- Only inductors are considered.
357
+ """Get nets connected to DC through inductors and low-value resistors.
347
358
 
348
359
  Parameters
349
360
  ----------
350
- ground_nets : list, optional
351
- List of ground nets. The default is ``["GND"]``.
361
+ ground_nets : tuple, optional
362
+ Ground net names. Default is ("GND",).
363
+ res_value : float, optional
364
+ Resistance threshold value. Default is 0.001 ohms.
352
365
 
353
366
  Returns
354
367
  -------
355
- list
356
- List of nets connected to DC through inductors.
368
+ list[set]
369
+ List of sets of connected nets.
357
370
  """
358
371
  temp_list = []
359
372
  for _, comp_obj in self._pedb.components.inductors.items():
@@ -390,18 +403,19 @@ class Nets(CommonNets):
390
403
  return dcconnected_net_list
391
404
 
392
405
  def get_powertree(self, power_net_name, ground_nets):
393
- """Retrieve the power tree.
406
+ """Retrieve power tree for a given power net.
394
407
 
395
408
  Parameters
396
409
  ----------
397
410
  power_net_name : str
398
411
  Name of the power net.
399
- ground_nets :
400
-
412
+ ground_nets : list
413
+ List of ground net names.
401
414
 
402
415
  Returns
403
416
  -------
404
-
417
+ tuple
418
+ (component_list, component_list_columns, net_group)
405
419
  """
406
420
  flag_in_ng = False
407
421
  net_group = []
@@ -449,27 +463,37 @@ class Nets(CommonNets):
449
463
  return component_list, component_list_columns, net_group
450
464
 
451
465
  def get_net_by_name(self, net_name):
452
- """Find a net by name."""
466
+ """Find a net by name.
467
+
468
+ Parameters
469
+ ----------
470
+ net_name : str
471
+ Name of the net to find.
472
+
473
+ Returns
474
+ -------
475
+ pyedb.grpc.database.net.net.Net
476
+ Net object if found, otherwise None.
477
+ """
453
478
  edb_net = Net.find_by_name(self._active_layout, net_name)
454
479
  if edb_net is not None:
455
480
  return edb_net
456
481
 
457
482
  def delete(self, netlist):
458
- """Delete one or more nets from EDB.
483
+ """Delete one or more nets from the layout.
459
484
 
460
485
  Parameters
461
486
  ----------
462
- netlist : str or list
463
- One or more nets to delete.
487
+ netlist : str | list[str]
488
+ Net name or list of net names to delete.
464
489
 
465
490
  Returns
466
491
  -------
467
- list
468
- List of nets that were deleted.
492
+ list[str]
493
+ Names of nets that were deleted.
469
494
 
470
495
  Examples
471
496
  --------
472
-
473
497
  >>> deleted_nets = database.nets.delete(["Net1","Net2"])
474
498
  """
475
499
  if isinstance(netlist, str):
@@ -487,26 +511,23 @@ class Nets(CommonNets):
487
511
  return nets_deleted
488
512
 
489
513
  def find_or_create_net(self, net_name="", start_with="", contain="", end_with=""):
490
- """Find or create the net with the given name in the layout.
514
+ """Find or create a net based on given criteria.
491
515
 
492
516
  Parameters
493
517
  ----------
494
518
  net_name : str, optional
495
- Name of the net to find or create. The default is ``""``.
496
-
519
+ Exact name of the net to find or create.
497
520
  start_with : str, optional
498
- All net name starting with the string. Not case-sensitive.
499
-
521
+ Find nets starting with this string.
500
522
  contain : str, optional
501
- All net name containing the string. Not case-sensitive.
502
-
523
+ Find nets containing this string.
503
524
  end_with : str, optional
504
- All net name ending with the string. Not case-sensitive.
525
+ Find nets ending with this string.
505
526
 
506
527
  Returns
507
528
  -------
508
- object
509
- Net Object.
529
+ pyedb.grpc.database.net.net.Net | list[pyedb.grpc.database.net.net.Net]
530
+ Net object or list of matching net objects.
510
531
  """
511
532
  if not net_name and not start_with and not contain and not end_with:
512
533
  net_name = generate_unique_name("NET_")
@@ -569,8 +590,7 @@ class Nets(CommonNets):
569
590
  Returns
570
591
  -------
571
592
  bool
572
- ``True`` if the net is found in component pins.
573
-
593
+ True if the net is found in the component, False otherwise.
574
594
  """
575
595
  if component_name not in self._pedb.components.instances:
576
596
  return False
@@ -582,51 +602,48 @@ class Nets(CommonNets):
582
602
  def find_and_fix_disjoint_nets(
583
603
  self, net_list=None, keep_only_main_net=False, clean_disjoints_less_than=0.0, order_by_area=False
584
604
  ):
585
- """Find and fix disjoint nets from a given netlist.
605
+ """Find and fix disjoint nets.
586
606
 
587
- .. deprecated::
588
- Use new property :func:`edb.layout_validation.disjoint_nets` instead.
607
+ .. deprecated:: pyedb 0.30.0
608
+ Use :func:`edb.layout_validation.disjoint_nets` instead.
589
609
 
590
610
  Parameters
591
611
  ----------
592
- net_list : str, list, optional
593
- List of nets on which check disjoints. If `None` is provided then the algorithm will loop on all nets.
612
+ net_list : list[str], optional
613
+ List of nets to check. Checks all nets if None.
594
614
  keep_only_main_net : bool, optional
595
- Remove all secondary nets other than principal one (the one with more objects in it). Default is `False`.
596
- clean_disjoints_less_than : bool, optional
597
- Clean all disjoint nets with area less than specified area in square meters. Default is `0.0` to disable it.
615
+ Keep only the main net segment if True.
616
+ clean_disjoints_less_than : float, optional
617
+ Clean disjoint nets smaller than this area (in m²).
598
618
  order_by_area : bool, optional
599
- Whether if the naming order has to be by number of objects (fastest) or area (slowest but more accurate).
600
- Default is ``False``.
619
+ Order naming by area instead of object count.
601
620
 
602
621
  Returns
603
622
  -------
604
- List
605
- New nets created.
623
+ list
624
+ New ne
606
625
 
607
- Examples
608
- --------
626
+ New nets created.
609
627
 
610
- >>> renamed_nets = database.nets.find_and_fix_disjoint_nets(["GND","Net2"])
611
628
  """
629
+
612
630
  warnings.warn("Use new function :func:`edb.layout_validation.disjoint_nets` instead.", DeprecationWarning)
613
631
  return self._pedb.layout_validation.disjoint_nets(
614
632
  net_list, keep_only_main_net, clean_disjoints_less_than, order_by_area
615
633
  )
616
634
 
617
635
  def merge_nets_polygons(self, net_names_list):
618
- """Convert paths from net into polygons, evaluate all connected polygons and perform the merge.
636
+ """Merge polygons for specified nets on each layer.
619
637
 
620
638
  Parameters
621
639
  ----------
622
- net_names_list : str or list[str]
623
- Net name of list of net name.
640
+ net_names_list : str | list[str]
641
+ Net name or list of net names.
624
642
 
625
643
  Returns
626
644
  -------
627
645
  bool
628
- ``True`` when successful, ``False`` when failed.
629
-
646
+ True if successful, False otherwise.
630
647
  """
631
648
  if isinstance(net_names_list, str):
632
649
  net_names_list = [net_names_list]