pyedb 0.50.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 (62) hide show
  1. pyedb/__init__.py +1 -1
  2. pyedb/dotnet/database/cell/hierarchy/component.py +3 -3
  3. pyedb/dotnet/database/edb_data/padstacks_data.py +13 -0
  4. pyedb/grpc/database/components.py +494 -652
  5. pyedb/grpc/database/control_file.py +458 -149
  6. pyedb/grpc/database/definition/component_def.py +17 -14
  7. pyedb/grpc/database/definition/materials.py +27 -27
  8. pyedb/grpc/database/definition/package_def.py +8 -8
  9. pyedb/grpc/database/definition/padstack_def.py +31 -33
  10. pyedb/grpc/database/geometry/arc_data.py +5 -5
  11. pyedb/grpc/database/geometry/point_3d_data.py +3 -3
  12. pyedb/grpc/database/geometry/polygon_data.py +5 -5
  13. pyedb/grpc/database/hfss.py +397 -395
  14. pyedb/grpc/database/hierarchy/component.py +58 -57
  15. pyedb/grpc/database/hierarchy/pin_pair_model.py +6 -6
  16. pyedb/grpc/database/hierarchy/pingroup.py +13 -11
  17. pyedb/grpc/database/hierarchy/s_parameter_model.py +1 -1
  18. pyedb/grpc/database/hierarchy/spice_model.py +1 -1
  19. pyedb/grpc/database/layers/layer.py +2 -2
  20. pyedb/grpc/database/layers/stackup_layer.py +26 -23
  21. pyedb/grpc/database/layout/layout.py +12 -12
  22. pyedb/grpc/database/layout/voltage_regulator.py +8 -8
  23. pyedb/grpc/database/modeler.py +248 -245
  24. pyedb/grpc/database/net/differential_pair.py +4 -4
  25. pyedb/grpc/database/net/extended_net.py +7 -8
  26. pyedb/grpc/database/net/net.py +57 -46
  27. pyedb/grpc/database/nets.py +139 -122
  28. pyedb/grpc/database/padstacks.py +174 -190
  29. pyedb/grpc/database/ports/ports.py +23 -17
  30. pyedb/grpc/database/primitive/padstack_instance.py +45 -30
  31. pyedb/grpc/database/primitive/path.py +6 -6
  32. pyedb/grpc/database/primitive/polygon.py +9 -9
  33. pyedb/grpc/database/primitive/primitive.py +21 -21
  34. pyedb/grpc/database/primitive/rectangle.py +1 -1
  35. pyedb/grpc/database/simulation_setup/hfss_advanced_settings.py +1 -1
  36. pyedb/grpc/database/simulation_setup/hfss_general_settings.py +1 -1
  37. pyedb/grpc/database/simulation_setup/hfss_settings_options.py +1 -1
  38. pyedb/grpc/database/simulation_setup/hfss_simulation_settings.py +6 -6
  39. pyedb/grpc/database/simulation_setup/hfss_simulation_setup.py +2 -2
  40. pyedb/grpc/database/simulation_setup/raptor_x_simulation_settings.py +2 -2
  41. pyedb/grpc/database/simulation_setup/raptor_x_simulation_setup.py +1 -1
  42. pyedb/grpc/database/simulation_setup/siwave_simulation_setup.py +3 -3
  43. pyedb/grpc/database/siwave.py +166 -214
  44. pyedb/grpc/database/stackup.py +365 -292
  45. pyedb/grpc/database/terminal/bundle_terminal.py +12 -12
  46. pyedb/grpc/database/terminal/edge_terminal.py +6 -5
  47. pyedb/grpc/database/terminal/padstack_instance_terminal.py +13 -13
  48. pyedb/grpc/database/terminal/pingroup_terminal.py +12 -12
  49. pyedb/grpc/database/terminal/point_terminal.py +6 -6
  50. pyedb/grpc/database/terminal/terminal.py +26 -26
  51. pyedb/grpc/database/utility/heat_sink.py +5 -5
  52. pyedb/grpc/database/utility/hfss_extent_info.py +21 -21
  53. pyedb/grpc/database/utility/layout_statistics.py +13 -13
  54. pyedb/grpc/database/utility/rlc.py +3 -3
  55. pyedb/grpc/database/utility/sources.py +1 -1
  56. pyedb/grpc/database/utility/sweep_data_distribution.py +1 -1
  57. pyedb/grpc/edb.py +422 -672
  58. {pyedb-0.50.0.dist-info → pyedb-0.50.1.dist-info}/METADATA +1 -1
  59. {pyedb-0.50.0.dist-info → pyedb-0.50.1.dist-info}/RECORD +61 -62
  60. pyedb/grpc/database/utility/simulation_configuration.py +0 -3305
  61. {pyedb-0.50.0.dist-info → pyedb-0.50.1.dist-info}/LICENSE +0 -0
  62. {pyedb-0.50.0.dist-info → pyedb-0.50.1.dist-info}/WHEEL +0 -0
pyedb/grpc/edb.py CHANGED
@@ -20,10 +20,40 @@
20
20
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  # SOFTWARE.
22
22
 
23
- """This module contains the ``Edb`` class.
24
-
25
- This module is implicitly loaded in HFSS 3D Layout when launched.
26
-
23
+ """Provides the main interface for interacting with Ansys Electronics Desktop Database (EDB).
24
+
25
+ This module contains the ``Edb`` class which serves as the primary interface for:
26
+ - Creating and managing EDB projects
27
+ - Importing/exporting layout files
28
+ - Configuring stackups, materials, and components
29
+ - Setting up simulations (HFSS, SIwave, RaptorX)
30
+ - Performing cutout operations
31
+ - Generating ports and excitations
32
+ - Parametrizing designs
33
+ - Exporting to various formats (IPC2581, HFSS, Q3D)
34
+
35
+ Key Functionality:
36
+ - Database initialization and management
37
+ - Layout manipulation and cutout generation
38
+ - Material and stackup configuration
39
+ - Net and component management
40
+ - Simulation setup and execution
41
+ - Design parametrization and optimization
42
+
43
+ Examples
44
+ --------
45
+ Basic EDB initialization:
46
+ >>> from pyedb.grpc.edb import Edb
47
+ >>> edb = Edb(edbpath="myproject.aedb")
48
+
49
+ Importing a board file:
50
+ >>> edb.import_layout_file("my_board.brd")
51
+
52
+ Creating a cutout:
53
+ >>> edb.cutout(signal_list=["Net1", "Net2"], reference_list=["GND"])
54
+
55
+ Exporting to HFSS:
56
+ >>> edb.export_hfss(r"C:\output_folder")
27
57
  """
28
58
 
29
59
  from itertools import combinations
@@ -102,100 +132,60 @@ from pyedb.workflow import Workflow
102
132
 
103
133
 
104
134
  class Edb(EdbInit):
105
- """Provides the EDB application interface.
135
+ """Main class for interacting with Ansys Electronics Desktop Database (EDB).
106
136
 
107
- This module inherits all objects that belong to EDB.
137
+ Provides comprehensive control over EDB projects including:
138
+ - Project creation/management
139
+ - Layout import/export
140
+ - Material/stackup configuration
141
+ - Component/net management
142
+ - Simulation setup
143
+ - Cutout operations
144
+ - Parameterization
108
145
 
109
146
  Parameters
110
147
  ----------
111
- edbpath : str, optional
112
- Full path to the ``aedb`` folder. The variable can also contain
113
- the path to a layout to import. Allowed formats are BRD, MCM,
114
- XML (IPC2581), GDS, ODB++(TGZ and ZIP) and DXF. The default is ``None``.
115
- For GDS import, the Ansys control file (also XML) should have the same
116
- name as the GDS file. Only the file extension differs.
148
+ edbpath : str or Path, optional
149
+ Full path to AEDB folder or layout file to import. Supported formats:
150
+ BRD, MCM, XML (IPC2581), GDS, ODB++ (TGZ/ZIP), DXF.
151
+ Default creates new AEDB in documents folder.
117
152
  cellname : str, optional
118
- Name of the cell to select. The default is ``None``.
153
+ Specific cell to open. Default opens first cell.
119
154
  isreadonly : bool, optional
120
- Whether to open EBD in read-only mode when it is
121
- owned by HFSS 3D Layout. The default is ``False``.
155
+ Open in read-only mode. Default False.
122
156
  edbversion : str, int, float, optional
123
- Version of EDB to use. The default is ``None``.
124
- Examples of input values are ``232``, ``23.2``, ``2023.2``, ``"2023.2"``.
157
+ EDB version (e.g., "2023.2", 232, 23.2). Default uses latest.
125
158
  isaedtowned : bool, optional
126
- Whether to launch EDB from HFSS 3D Layout. The
127
- default is ``False``.
128
- oproject : optional
129
- Reference to the AEDT project object.
159
+ Launch from HFSS 3D Layout. Default False.
160
+ oproject : object, optional
161
+ Reference to AEDT project object.
130
162
  student_version : bool, optional
131
- Whether to open the AEDT student version. The default is ``False.``
163
+ Use student version. Default False.
164
+ use_ppe : bool, optional
165
+ Use PPE license. Default False.
132
166
  control_file : str, optional
133
- Path to the XML file. The default is ``None``, in which case an attempt is made to find
134
- the XML file in the same directory as the board file. To succeed, the XML file and board file
135
- must have the same name. Only the extension differs.
167
+ XML control file path for import.
136
168
  map_file : str, optional
137
- Layer map .map file.
169
+ Layer map file for import.
138
170
  technology_file : str, optional
139
- Full path to technology file to be converted to xml before importing or xml.
140
- Supported by GDS format only.
141
- layer_filter:str,optional
142
- Layer filter .txt file.
171
+ Technology file for import (GDS only).
172
+ layer_filter : str, optional
173
+ Layer filter file for import.
174
+ remove_existing_aedt : bool, optional
175
+ Remove existing AEDT project files. Default False.
143
176
  restart_rpc_server : bool, optional
144
- ``True`` RPC server is terminated and restarted. This will close all open EDB. RPC server is running on single
145
- instance loading all EDB, enabling this option should be used with caution but can be a solution to release
146
- memory in case the server is draining resources. Default value is ``False``.
177
+ Restart gRPC server. Use with caution. Default False.
147
178
 
148
179
  Examples
149
180
  --------
150
- Create :class:`Edb <pyedb.grpc.edb.Edb>` object.
151
-
152
- >>> from pyedb.grpc.edb import Edb as Edb
153
- >>> app = Edb()
154
-
155
- Add a new variable named "s1" to the ``Edb`` instance.
156
-
157
- >>> app['s1'] = "0.25 mm"
158
- >>> app['s1']
159
- >>> 0.00025
160
-
161
- Create an ``Edb`` object and open the specified project.
162
-
163
- >>> app = Edb(edbpath="myfile.aedb")
164
-
165
- Create an ``Edb`` object from GDS and control files.
166
- The XML control file resides in the same directory as the GDS file: (myfile.xml).
167
-
168
- >>> app = Edb("/path/to/file/myfile.gds")
169
-
170
- Loading Ansys layout
171
-
172
- >>> from ansys.aedt.core.generic.general_methods import generate_unique_folder_name
173
- >>> import pyedb.misc.downloads as downloads
174
- >>> temp_folder = generate_unique_folder_name()
175
- >>> targetfile = downloads.download_file("edb/ANSYS-HSD_V1.aedb", destination=temp_folder)
176
- >>> from pyedb.grpc.edb import Edb as Edb
177
- >>> edbapp = Edb(edbpath=targetfile)
178
-
179
- Retrieving signal nets dictionary
180
-
181
- >>> edbapp.nets.signal
182
-
183
- Retrieving layers
184
-
185
- >>> edbapp.stackup.layers
186
-
187
- Retrieving all component instances
188
-
189
- >>> edbapp.components.instances
181
+ Create new EDB:
182
+ >>> edb = Edb()
190
183
 
191
- Retrieving all padstacks definitions
192
-
193
- >>> edbapp.padstacks.definitions
194
-
195
- Retrieving component pins
196
-
197
- >>> edbapp.components["U1"].pins
184
+ Open existing AEDB:
185
+ >>> edb = Edb("myproject.aedb")
198
186
 
187
+ Import board file:
188
+ >>> edb = Edb("my_board.brd")
199
189
  """
200
190
 
201
191
  def __init__(
@@ -309,38 +299,39 @@ class Edb(EdbInit):
309
299
  self._layout_instance = None
310
300
 
311
301
  def __enter__(self):
302
+ """Context manager entry."""
312
303
  return self
313
304
 
314
305
  def __exit__(self, ex_type, ex_value, ex_traceback):
306
+ """Context manager exit. Closes EDB and cleans up resources."""
315
307
  self._signal_handler(ex_type, ex_value)
316
308
 
317
309
  def __getitem__(self, variable_name):
318
- """Get a variable to the Edb project. The variable can be project using ``$`` prefix or
319
- it can be a design variable, in which case the ``$`` is omitted.
310
+ """Get project or design variable value.
320
311
 
321
312
  Parameters
322
313
  ----------
323
314
  variable_name : str
315
+ Variable name with '$' for project variables.
324
316
 
325
317
  Returns
326
318
  -------
327
- variable object.
328
-
319
+ float or None
320
+ Variable value if exists, else None.
329
321
  """
330
322
  if self.variable_exists(variable_name):
331
323
  return self.variables[variable_name]
332
324
  return
333
325
 
334
326
  def __setitem__(self, variable_name, variable_value):
335
- """Set a variable to the Edb project. The variable can be project using ``$`` prefix or
336
- it can be a design variable, in which case the ``$`` is omitted.
327
+ """Set project or design variable.
337
328
 
338
329
  Parameters
339
330
  ----------
340
331
  variable_name : str
341
- variable name.
342
- variable_value : str, float, int.
343
- variable value.
332
+ Variable name (with '$' prefix for project variables).
333
+ variable_value : str, float, int, list/tuple
334
+ Value with units. List/tuple format: [value, description]
344
335
  """
345
336
  type_error_message = "Allowed values are str, numeric or two-item list with variable description."
346
337
  if type(variable_value) in [
@@ -419,53 +410,56 @@ class Edb(EdbInit):
419
410
 
420
411
  @property
421
412
  def cell_names(self) -> [str]:
422
- """Cell name container.
413
+ """List of all cell names in the database.
423
414
 
424
415
  Returns
425
416
  -------
426
- list of cell names : List[str]
417
+ list[str]
418
+ Names of all circuit cells.
427
419
  """
428
420
  return [cell.name for cell in self.active_db.top_circuit_cells]
429
421
 
430
422
  @property
431
423
  def design_variables(self) -> dict[str, float]:
432
- """Get all edb design variables.
424
+ """All design variables in active cell.
433
425
 
434
426
  Returns
435
427
  -------
436
- variable dictionary : Dict[str, variable_name: float, variable_value]
428
+ dict[str, float]
429
+ Variable names and values.
437
430
  """
438
431
  return {i: self.active_cell.get_variable_value(i).value for i in self.active_cell.get_all_variable_names()}
439
432
 
440
433
  @property
441
434
  def project_variables(self) -> dict[str, float]:
442
- """Get all project variables.
435
+ """All project variables in database.
443
436
 
444
437
  Returns
445
438
  -------
446
- variables dictionary : dict[str, variable_name: float, variable_value]
447
-
439
+ dict[str, float]
440
+ Variable names and values.
448
441
  """
449
442
  return {i: self.active_db.get_variable_value(i).value for i in self.active_db.get_all_variable_names()}
450
443
 
451
444
  @property
452
445
  def layout_validation(self) -> LayoutValidation:
453
- """Return LayoutValidation object.
446
+ """Layout validation utilities.
454
447
 
455
448
  Returns
456
449
  -------
457
450
  :class:`LayoutValidation <pyedb.grpc.database.layout_validation.LayoutValidation>`
451
+ Tools for design rule checking and layout validation.
458
452
  """
459
453
  return LayoutValidation(self)
460
454
 
461
455
  @property
462
456
  def variables(self) -> dict[str, float]:
463
- """Get all Edb variables.
457
+ """All variables (project + design) in database.
464
458
 
465
459
  Returns
466
460
  -------
467
- variables dictionary : Dict[str: float]
468
-
461
+ dict[str, float]
462
+ Combined dictionary of all variables.
469
463
  """
470
464
  all_vars = dict()
471
465
  for i, j in self.project_variables.items():
@@ -476,23 +470,24 @@ class Edb(EdbInit):
476
470
 
477
471
  @property
478
472
  def terminals(self) -> dict[str, Terminal]:
479
- """Get terminals belonging to active layout.
473
+ """Terminals in active layout.
480
474
 
481
475
  Returns
482
476
  -------
483
- Dict : Dict[str: :class:`Terminal <pyedb.grpc.database.terminal.terminal.Terminal>`],
477
+ dict[str, :class:`Terminal <pyedb.grpc.database.terminal.terminal.Terminal>`]
478
+ Terminal names and objects.
484
479
  """
485
480
  return {i.name: i for i in self.layout.terminals}
486
481
 
487
482
  @property
488
483
  def excitations(self) -> dict[str, GapPort]:
489
- """Get all layout excitations.
484
+ """All layout excitations.
490
485
 
491
486
  Returns
492
487
  -------
493
- Dict: Dict[str: :class:`<pyedb.grpc.database.port.GapPort>`]
488
+ dict[str, :class:`GapPort <pyedb.grpc.database.ports.ports.GapPort>`]
489
+ Excitation names and objects.
494
490
  """
495
-
496
491
  terms = [term for term in self.layout.terminals if term.boundary_type == "port"]
497
492
  temp = {}
498
493
  for term in terms:
@@ -504,13 +499,12 @@ class Edb(EdbInit):
504
499
 
505
500
  @property
506
501
  def ports(self) -> dict[str, GapPort]:
507
- """Get all ports.
502
+ """All ports in design.
508
503
 
509
504
  Returns
510
505
  -------
511
- port dictionary : Dict[str: :class:`GapPort <pyedb.grpc.database.ports.GapPort>` or
512
- :class:`WavePort <pyedb.grpc.database.ports.WavePort>`]
513
-
506
+ dict[str, Union[:class:`GapPort`, :class:`WavePort`, :class:`CoaxPort`]]
507
+ Port names and objects.
514
508
  """
515
509
  terminals = [term for term in self.layout.terminals if not term.is_reference_terminal]
516
510
  ports = {}
@@ -538,34 +532,34 @@ class Edb(EdbInit):
538
532
 
539
533
  @property
540
534
  def excitations_nets(self) -> [str]:
541
- """Get all net names with excitation defined.
535
+ """Nets with excitations defined.
542
536
 
543
537
  Returns
544
538
  -------
545
- List[str]
546
- List of net name.
539
+ list[str]
540
+ Net names with excitations.
547
541
  """
548
542
  return list(set([i.net.name for i in self.layout.terminals if not i.is_reference_terminal]))
549
543
 
550
544
  @property
551
545
  def sources(self) -> dict[str, Terminal]:
552
- """Get all layout sources.
546
+ """All layout sources.
553
547
 
554
548
  Returns
555
549
  -------
556
- Dict: Dic[str, :class:`Terminal <pyedb.grpc.database.terminal.terminal.Terminal>`]
550
+ dict[str, :class:`Terminal <pyedb.grpc.database.terminal.terminal.Terminal>`]
551
+ Source names and objects.
557
552
  """
558
553
  return self.terminals
559
554
 
560
555
  @property
561
556
  def voltage_regulator_modules(self):
562
- """Get all voltage regulator modules
557
+ """Voltage regulator modules in design.
563
558
 
564
559
  Returns
565
560
  -------
566
- List of voltage regulator modules.
567
- List[:class:`VoltageRegulator <pyedb.grpc.database.layout.voltage_regulator.VoltageRegulator>`]
568
-
561
+ dict[str, :class:`VoltageRegulator <pyedb.grpc.database.layout.voltage_regulator.VoltageRegulator>`]
562
+ VRM names and objects.
569
563
  """
570
564
  vrms = self.layout.voltage_regulators
571
565
  _vrms = {}
@@ -575,22 +569,23 @@ class Edb(EdbInit):
575
569
 
576
570
  @property
577
571
  def probes(self) -> dict[str, Terminal]:
578
- """Get all layout probes.
572
+ """All layout probes.
579
573
 
580
574
  Returns
581
575
  -------
582
- Dictionary of probes.
583
- Dict[str, :class:`Terminal <pyedb.grpc.database.terminal.terminal.Terminal>`
576
+ dict[str, :class:`Terminal <pyedb.grpc.database.terminal.terminal.Terminal>`]
577
+ Probe names and objects.
584
578
  """
585
579
  terms = [term for term in self.layout.terminals if term.boundary_type.value == 8]
586
580
  return {ter.name: ter for ter in terms}
587
581
 
588
582
  def open_edb(self, restart_rpc_server=False) -> bool:
589
- """Open EDB.
583
+ """Open EDB database.
590
584
 
591
585
  Returns
592
586
  -------
593
- bool: `True` when succeed `False` if failed.
587
+ bool
588
+ True if successful, False otherwise.
594
589
  """
595
590
  self.standalone = self.standalone
596
591
  n_try = 10
@@ -627,11 +622,12 @@ class Edb(EdbInit):
627
622
  return True
628
623
 
629
624
  def create_edb(self, restart_rpc_server=False) -> bool:
630
- """Create EDB.
625
+ """Create new EDB database.
631
626
 
632
627
  Returns
633
628
  -------
634
- bool: `True` when succeed `False` if failed.
629
+ bool
630
+ True if successful, False otherwise.
635
631
  """
636
632
  from ansys.edb.core.layout.cell import Cell as GrpcCell
637
633
  from ansys.edb.core.layout.cell import CellType as GrpcCellType
@@ -669,38 +665,33 @@ class Edb(EdbInit):
669
665
  tech_file=None,
670
666
  layer_filter=None,
671
667
  ):
672
- """Import a board file and generate an ``edb.def`` file in the working directory.
673
-
674
- .. deprecated:: 0.42.0
675
- Use :func:`import_layout_file` method instead.
668
+ """Import layout file and generate AEDB.
676
669
 
677
- This function supports all AEDT formats, including DXF, GDS, SML (IPC2581), BRD, MCM, SIP, ZIP and TGZ.
670
+ Supported formats: BRD, MCM, XML (IPC2581), GDS, ODB++ (TGZ/ZIP), DXF
678
671
 
679
672
  Parameters
680
673
  ----------
681
674
  input_file : str
682
- Full path to the board file.
675
+ Full path to input file.
683
676
  working_dir : str, optional
684
- Directory in which to create the ``aedb`` folder. The name given to the AEDB file
685
- is the same as the name of the board file.
677
+ Output directory for AEDB.
686
678
  anstranslator_full_path : str, optional
687
- Full path to the Ansys translator. The default is ``""``.
688
- use_ppe : bool
689
- Whether to use the PPE License. The default is ``False``.
679
+ Path to Ansys translator executable.
680
+ use_ppe : bool, optional
681
+ Use PPE license. Default False.
690
682
  control_file : str, optional
691
- Path to the XML file. The default is ``None``, in which case an attempt is made to find
692
- the XML file in the same directory as the board file. To succeed, the XML file and board file
693
- must have the same name. Only the extension differs.
683
+ XML control file path.
694
684
  tech_file : str, optional
695
- Technology file. The file can be *.ircx, *.vlc.tech, or *.itf
685
+ Technology file path.
696
686
  map_file : str, optional
697
- Layer map .map file.
698
- layer_filter:str,optional
699
- Layer filter .txt file.
687
+ Layer map file path.
688
+ layer_filter : str, optional
689
+ Layer filter file path.
700
690
 
701
691
  Returns
702
692
  -------
703
- Full path to the AEDB file : str
693
+ str or bool
694
+ AEDB path if successful, False otherwise.
704
695
  """
705
696
  self.logger.warning("import_layout_pcb method is deprecated, use import_layout_file instead.")
706
697
  return self.import_layout_file(
@@ -802,29 +793,19 @@ class Edb(EdbInit):
802
793
  return self.open_edb()
803
794
 
804
795
  def export_to_ipc2581(self, ipc_path=None, units="MILLIMETER") -> str:
805
- """Create an XML IPC2581 file from the active EDB.
806
-
807
- .. note::
808
- The method works only in CPython because of some limitations on Ironpython in XML parsing and
809
- because it's time-consuming.
810
- This method is still being tested and may need further debugging.
811
- Any feedback is welcome. Back drills and custom pads are not supported yet.
796
+ """Export design to IPC2581 format.
812
797
 
813
798
  Parameters
814
799
  ----------
815
800
  ipc_path : str, optional
816
- Path to the XML IPC2581 file. The default is ``None``, in which case
817
- an attempt is made to find the XML IPC2581 file in the same directory
818
- as the active EDB. To succeed, the XML IPC2581 file and the active
819
- EDT must have the same name. Only the extension differs.
801
+ Output XML file path. Default: <edb_path>.xml.
820
802
  units : str, optional
821
- Units of the XML IPC2581 file. Options are ``"millimeter"``,
822
- ``"inch"``, and ``"micron"``. The default is ``"millimeter"``.
803
+ Output units ("millimeter", "inch", "micron"). Default millimeter.
823
804
 
824
805
  Returns
825
806
  -------
826
- bool: `True` if successful, `False` if failed.
827
-
807
+ str or bool
808
+ Output file path if successful, False otherwise.
828
809
  """
829
810
  if units.lower() not in ["millimeter", "inch", "micron"]: # pragma no cover
830
811
  self.logger.warning("The wrong unit is entered. Setting to the default, millimeter.")
@@ -848,30 +829,26 @@ class Edb(EdbInit):
848
829
 
849
830
  @property
850
831
  def configuration(self) -> Configuration:
851
- """Edb project configuration from a file.
832
+ """Project configuration manager.
852
833
 
853
834
  Returns
854
835
  -------
855
- :class:`Configuration <pyedb.configuration.configuration.Configuration>`.
836
+ :class:`Configuration <pyedb.configuration.configuration.Configuration>`
837
+ Configuration file interface.
856
838
  """
857
839
  if not self._configuration:
858
840
  self._configuration = Configuration(self)
859
841
  return self._configuration
860
842
 
861
843
  def edb_exception(self, ex_value, tb_data):
862
- """Write the trace stack to AEDT when a Python error occurs.
844
+ """Log Python exceptions to EDB logger.
863
845
 
864
846
  Parameters
865
847
  ----------
866
- ex_value :
867
-
868
- tb_data :
869
-
870
-
871
- Returns
872
- -------
873
- None
874
-
848
+ ex_value : Exception
849
+ Exception value.
850
+ tb_data : traceback
851
+ Traceback object.
875
852
  """
876
853
  tb_trace = traceback.format_tb(tb_data)
877
854
  tblist = tb_trace[0].split("\n")
@@ -881,26 +858,40 @@ class Edb(EdbInit):
881
858
 
882
859
  @property
883
860
  def active_db(self):
884
- """Database object.
861
+ """Active database object.
885
862
 
886
863
  Returns
887
864
  -------
888
- :class:`Database <ansys.edb.core.database.Database>`.
865
+ :class:`ansys.edb.core.database.Database`
866
+ Current database instance.
889
867
  """
890
868
  return self.db
891
869
 
892
870
  @property
893
871
  def active_cell(self):
894
- """Active cell.
872
+ """Active cell in the database.
895
873
 
896
874
  Returns
897
875
  -------
898
- :class:`Cell <ansys.edb.core.layout.cell.Cell>`.
876
+ :class:`ansys.edb.core.layout.cell.Cell`
877
+ Currently active cell.
899
878
  """
900
879
  return self._active_cell
901
880
 
902
881
  @active_cell.setter
903
882
  def active_cell(self, value):
883
+ """Set active cell by name or object.
884
+
885
+ Parameters
886
+ ----------
887
+ value : str or ansys.edb.core.layout.cell.Cell
888
+ Cell name or object to set as active.
889
+
890
+ Raises
891
+ ------
892
+ ValueError
893
+ If cell not found in database.
894
+ """
904
895
  if isinstance(value, str):
905
896
  _cell = [cell for cell in self.circuit_cells if cell.name == value]
906
897
  if _cell:
@@ -918,17 +909,12 @@ class Edb(EdbInit):
918
909
 
919
910
  @property
920
911
  def components(self) -> Components:
921
- """Edb Components methods and properties.
912
+ """Component management interface.
922
913
 
923
914
  Returns
924
915
  -------
925
- :class:`Components <pyedb.grpc.database.components.Components>`.
926
-
927
- Examples
928
- --------
929
- >>> from pyedb import Edb
930
- >>> edbapp = Edb("myproject.aedb")
931
- >>> comp = edbapp.components.get_component_by_name("J1")
916
+ :class:`Components <pyedb.grpc.database.components.Components>`
917
+ Component manipulation tools.
932
918
  """
933
919
  if not self._components and self.active_db:
934
920
  self._components = Components(self)
@@ -936,19 +922,12 @@ class Edb(EdbInit):
936
922
 
937
923
  @property
938
924
  def stackup(self) -> Stackup:
939
- """Stackup manager.
925
+ """Stackup management interface.
940
926
 
941
927
  Returns
942
928
  -------
943
929
  :class:`Stackup <pyedb.grpc.database.stackup.Stackup>`
944
-
945
- Examples
946
- --------
947
- >>> from pyedb.grpc.edb import Edb
948
- >>> edbapp = Edb("myproject.aedb")
949
- >>> edbapp.stackup.layers["TOP"].thickness = 4e-5
950
- >>> edbapp.stackup.layers["TOP"].thickness == 4e-05
951
- >>> edbapp.stackup.add_layer("Diel", "GND", layer_type="dielectric", thickness="0.1mm", material="FR4_epoxy")
930
+ Layer stack configuration tools.
952
931
  """
953
932
  if self.active_db:
954
933
  self._stackup = Stackup(self, self.active_cell.layout.layer_collection)
@@ -956,30 +935,24 @@ class Edb(EdbInit):
956
935
 
957
936
  @property
958
937
  def source_excitation(self) -> SourceExcitation:
959
- """Returns layout source excitations.
938
+ """Source excitation management.
960
939
 
961
940
  Returns
962
941
  -------
963
- :class:`SourceExcitation <pyedb.grpc.database.source_excitations.SourceExcitation>`.
942
+ :class:`SourceExcitation <pyedb.grpc.database.source_excitations.SourceExcitation>`
943
+ Source and port creation tools.
964
944
  """
965
945
  if self.active_db:
966
946
  return self._source_excitation
967
947
 
968
948
  @property
969
949
  def materials(self) -> Materials:
970
- """Material Database.
950
+ """Material database interface.
971
951
 
972
952
  Returns
973
953
  -------
974
- :class:`Materials <pyedb.grpc.database.definition.materials.Materials>`.
975
-
976
- Examples
977
- --------
978
- >>> from pyedb import Edb
979
- >>> edbapp = Edb()
980
- >>> edbapp.materials.add_material("air", permittivity=1.0)
981
- >>> edbapp.materials.add_debye_material("debye_mat", 5, 3, 0.02, 0.05, 1e5, 1e9)
982
- >>> edbapp.materials.add_djordjevicsarkar_material("djord_mat", 3.3, 0.02, 3.3)
954
+ :class:`Materials <pyedb.grpc.database.definition.materials.Materials>`
955
+ Material definition and management.
983
956
  """
984
957
  if self.active_db:
985
958
  self._materials = Materials(self)
@@ -987,40 +960,25 @@ class Edb(EdbInit):
987
960
 
988
961
  @property
989
962
  def padstacks(self) -> Padstacks:
990
- """Returns padstack object.
991
-
963
+ """Padstack management interface.
992
964
 
993
965
  Returns
994
966
  -------
995
- :class:`Padstacks <pyedb.grpc.database.padstack.Padstacks>`.
996
-
997
- Examples
998
- --------
999
- >>> from pyedb import Edb
1000
- >>> edbapp = Edb("myproject.aedb")
1001
- >>> p = edbapp.padstacks.create(padstackname="myVia_bullet", antipad_shape="Bullet")
1002
- >>> edbapp.padstacks.get_pad_parameters(
1003
- >>> ... p, "TOP", edbapp.padstacks.pad_type.RegularPad
1004
- >>> ... )
967
+ :class:`Padstacks <pyedb.grpc.database.padstack.Padstacks>`
968
+ Padstack definition and editing.
1005
969
  """
1006
-
1007
970
  if not self._padstack and self.active_db:
1008
971
  self._padstack = Padstacks(self)
1009
972
  return self._padstack
1010
973
 
1011
974
  @property
1012
975
  def siwave(self) -> Siwave:
1013
- """Returns SIWave object.
976
+ """SIwave simulation interface.
1014
977
 
1015
978
  Returns
1016
979
  -------
1017
- :class:`Siwave <pyedb.grpc.database.siwave.Siwave>`.
1018
-
1019
- Examples
1020
- --------
1021
- >>> from pyedb import Edb
1022
- >>> edbapp = Edb("myproject.aedb")
1023
- >>> p2 = edbapp.siwave.create_circuit_port_on_net("U2A5", "V3P3_S0", "U2A5", "GND", 50, "test")
980
+ :class:`Siwave <pyedb.grpc.database.siwave.Siwave>`
981
+ SIwave analysis setup tools.
1024
982
  """
1025
983
  if not self._siwave and self.active_db:
1026
984
  self._siwave = Siwave(self)
@@ -1028,19 +986,12 @@ class Edb(EdbInit):
1028
986
 
1029
987
  @property
1030
988
  def hfss(self) -> Hfss:
1031
- """Returns HFSS object.
989
+ """HFSS simulation interface.
1032
990
 
1033
991
  Returns
1034
992
  -------
1035
- :class:`Hfss <pyedb.grpc.database.hfss.Hfss>`.
1036
-
1037
- Examples
1038
- --------
1039
- >>> from pyedb import Edb
1040
- >>> edbapp = Edb("myproject.aedb")
1041
- >>> sim_config = edbapp.new_simulation_configuration()
1042
- >>> sim_config.mesh_freq = "10Ghz"
1043
- >>> edbapp.hfss.configure_hfss_analysis_setup(sim_config)
993
+ :class:`Hfss <pyedb.grpc.database.hfss.Hfss>`
994
+ HFSS analysis setup tools.
1044
995
  """
1045
996
  if not self._hfss and self.active_db:
1046
997
  self._hfss = Hfss(self)
@@ -1048,74 +999,50 @@ class Edb(EdbInit):
1048
999
 
1049
1000
  @property
1050
1001
  def nets(self) -> Nets:
1051
- """Returns nets object.
1002
+ """Net management interface.
1052
1003
 
1053
1004
  Returns
1054
1005
  -------
1055
- :class:`Nets <pyedb.grpc.database.nets.Nets>`.
1056
-
1057
- Examples
1058
- --------
1059
- >>> from pyedb import Edb
1060
- >>> edbapp = Edb"myproject.aedb")
1061
- >>> edbapp.nets.find_or_create_net("GND")
1062
- >>> edbapp.nets.find_and_fix_disjoint_nets("GND", keep_only_main_net=True)
1006
+ :class:`Nets <pyedb.grpc.database.nets.Nets>`
1007
+ Net manipulation tools.
1063
1008
  """
1064
-
1065
1009
  if not self._nets and self.active_db:
1066
1010
  self._nets = Nets(self)
1067
1011
  return self._nets
1068
1012
 
1069
1013
  @property
1070
1014
  def net_classes(self) -> NetClass:
1071
- """Returns net classes object.
1015
+ """Net class management.
1072
1016
 
1073
1017
  Returns
1074
1018
  -------
1075
- :class:`NetClass <pyedb.grpc.database.net.net_class.NetClass>`.
1076
-
1077
- Examples
1078
- --------
1079
- >>> from pyedb import Edb
1080
- >>> edbapp = Edb("myproject.aedb")
1081
- >>> edbapp.net_classes
1019
+ dict[str, :class:`NetClass <pyedb.grpc.database.net.net_class.NetClass>`]
1020
+ Net class names and objects.
1082
1021
  """
1083
-
1084
1022
  if self.active_db:
1085
1023
  return {net.name: NetClass(self, net) for net in self.active_layout.net_classes}
1086
1024
 
1087
1025
  @property
1088
1026
  def extended_nets(self) -> ExtendedNets:
1089
- """Returns extended nets.
1027
+ """Extended net management.
1090
1028
 
1091
1029
  Returns
1092
1030
  -------
1093
- :class:`ExtendedNets <pyedb.grpc.database.net.extended_net.ExtendedNets>`.
1094
-
1095
- Examples
1096
- --------
1097
- >>> from pyedb import Edb
1098
- >>> edbapp = Edb("myproject.aedb")
1099
- >>> edbapp.extended_nets
1031
+ :class:`ExtendedNets <pyedb.grpc.database.net.extended_net.ExtendedNets>`
1032
+ Extended net tools.
1100
1033
  """
1101
-
1102
1034
  if not self._extended_nets:
1103
1035
  self._extended_nets = ExtendedNets(self)
1104
1036
  return self._extended_nets
1105
1037
 
1106
1038
  @property
1107
1039
  def differential_pairs(self) -> DifferentialPairs:
1108
- """Returns differential pairs.
1040
+ """Differential pair management.
1109
1041
 
1110
1042
  Returns
1111
1043
  -------
1112
- :class:`DifferentialPairs <pyedb.grpc.database.net.differential_par.DifferentialPairs>`.
1113
-
1114
- Examples
1115
- --------
1116
- >>> from pyedb import Edb
1117
- >>> edbapp = Edb("myproject.aedb")
1118
- >>> edbapp.differential_pairs
1044
+ :class:`DifferentialPairs <pyedb.grpc.database.net.differential_par.DifferentialPairs>`
1045
+ Differential pair tools.
1119
1046
  """
1120
1047
  if not self._differential_pairs and self.active_db:
1121
1048
  self._differential_pairs = DifferentialPairs(self)
@@ -1123,17 +1050,12 @@ class Edb(EdbInit):
1123
1050
 
1124
1051
  @property
1125
1052
  def modeler(self) -> Modeler:
1126
- """Returns primitives modeler object.
1053
+ """Geometry modeling interface.
1127
1054
 
1128
1055
  Returns
1129
1056
  -------
1130
- :class:`Modeler <pyedb.grpc.database.modeler.Modeler>`.
1131
-
1132
- Examples
1133
- --------
1134
- >>> from pyedb import Edb
1135
- >>> edbapp = Edb("myproject.aedb")
1136
- >>> top_prims = edbapp.modeler.primitives_by_layer["TOP"]
1057
+ :class:`Modeler <pyedb.grpc.database.modeler.Modeler>`
1058
+ Geometry creation and editing.
1137
1059
  """
1138
1060
  if not self._modeler and self.active_db:
1139
1061
  self._modeler = Modeler(self)
@@ -1141,46 +1063,51 @@ class Edb(EdbInit):
1141
1063
 
1142
1064
  @property
1143
1065
  def layout(self) -> Layout:
1144
- """Returns Layout object.
1066
+ """Layout access interface.
1145
1067
 
1146
1068
  Returns
1147
1069
  -------
1148
- :class:`Layout <pyedb.grpc.database.layout.layout.Layout>`.
1070
+ :class:`Layout <pyedb.grpc.database.layout.layout.Layout>`
1071
+ Layout manipulation tools.
1149
1072
  """
1150
1073
  return Layout(self)
1151
1074
 
1152
1075
  @property
1153
1076
  def active_layout(self) -> Layout:
1154
- """Active layout.
1077
+ """Active layout access.
1155
1078
 
1156
1079
  Returns
1157
1080
  -------
1158
- :class:`Layout <pyedb.grpc.database.layout.layout.Layout>`.
1081
+ :class:`Layout <pyedb.grpc.database.layout.layout.Layout>`
1082
+ Current layout tools.
1159
1083
  """
1160
1084
  return self.layout
1161
1085
 
1162
1086
  @property
1163
1087
  def layout_instance(self):
1164
- """Returns Layout Instance object.
1088
+ """Layout instance object.
1165
1089
 
1166
1090
  Returns
1167
1091
  -------
1168
1092
  :class:`LayoutInstance <ansys.edb.core.layout_instance.layout_instance.LayoutInstance>`
1093
+ Current layout instance.
1169
1094
  """
1170
1095
  if not self._layout_instance:
1171
1096
  self._layout_instance = self.layout.layout_instance
1172
1097
  return self._layout_instance
1173
1098
 
1174
1099
  def get_connected_objects(self, layout_object_instance):
1175
- """Returns connected objects.
1100
+ """Get objects connected to a layout object.
1101
+
1102
+ Parameters
1103
+ ----------
1104
+ layout_object_instance :
1105
+ Target layout object.
1176
1106
 
1177
1107
  Returns
1178
1108
  -------
1179
- list[:class:`PadstackInstance <pyedb.grpc.database.primitive.padstack_instance.PadstackInstance>`,
1180
- :class:`Path <pyedb.grpc.database.primitive.path.Path>`,
1181
- :class:`Rectangle <pyedb.grpc.database.primitive.rectangle.Rectangle>`,
1182
- :class:`Circle <pyedb.grpc.database.primitive.circle.Circle>`,
1183
- :class:`Polygon <pyedb.grpc.database.primitive.polygon.Polygon>`]
1109
+ list
1110
+ Connected objects (padstacks, paths, polygons, etc.).
1184
1111
  """
1185
1112
  from ansys.edb.core.terminal.padstack_instance_terminal import (
1186
1113
  PadstackInstanceTerminal as GrpcPadstackInstanceTerminal,
@@ -1213,39 +1140,40 @@ class Edb(EdbInit):
1213
1140
  return temp
1214
1141
 
1215
1142
  def point_3d(self, x, y, z=0.0):
1216
- """Compute the Edb 3d Point Data.
1143
+ """Create 3D point.
1217
1144
 
1218
1145
  Parameters
1219
1146
  ----------
1220
- x : float, int or str
1221
- X value.
1222
- y : float, int or str
1223
- Y value.
1224
- z : float, int or str, optional
1225
- Z value.
1147
+ x : float, int, str
1148
+ X coordinate.
1149
+ y : float, int, str
1150
+ Y coordinate.
1151
+ z : float, int, str, optional
1152
+ Z coordinate.
1226
1153
 
1227
1154
  Returns
1228
1155
  -------
1229
1156
  :class:`Point3DData <pyedb.grpc.database.geometry.point_3d_data.Point3DData>`
1157
+ 3D point object.
1230
1158
  """
1231
1159
  from pyedb.grpc.database.geometry.point_3d_data import Point3DData
1232
1160
 
1233
1161
  return Point3DData(x, y, z)
1234
1162
 
1235
1163
  def point_data(self, x, y=None):
1236
- """Compute the Edb Point Data.
1164
+ """Create 2D point.
1237
1165
 
1238
1166
  Parameters
1239
1167
  ----------
1240
- x : float, int or str
1241
- X value.
1242
- y : float, int or str, optional
1243
- Y value.
1244
-
1168
+ x : float, int, str or PointData
1169
+ X coordinate or PointData object.
1170
+ y : float, int, str, optional
1171
+ Y coordinate.
1245
1172
 
1246
1173
  Returns
1247
1174
  -------
1248
1175
  :class:`PointData <pyedb.grpc.database.geometry.point_data.PointData>`
1176
+ 2D point object.
1249
1177
  """
1250
1178
  from pyedb.grpc.database.geometry.point_data import PointData
1251
1179
 
@@ -1304,11 +1232,12 @@ class Edb(EdbInit):
1304
1232
  time.sleep(0.250)
1305
1233
 
1306
1234
  def close_edb(self) -> bool:
1307
- """Close EDB and cleanup variables.
1235
+ """Close EDB and clean up resources.
1308
1236
 
1309
1237
  Returns
1310
1238
  -------
1311
- bool: `True` when successful, `False` when failed.
1239
+ bool
1240
+ True if successful, False otherwise.
1312
1241
  """
1313
1242
  self.close()
1314
1243
  start_time = time.time()
@@ -1319,11 +1248,12 @@ class Edb(EdbInit):
1319
1248
  return True
1320
1249
 
1321
1250
  def save_edb(self) -> bool:
1322
- """Save the EDB file.
1251
+ """Save current EDB database.
1323
1252
 
1324
1253
  Returns
1325
1254
  -------
1326
- bool: `True` when successful, `False` when failed.
1255
+ bool
1256
+ True if successful, False otherwise.
1327
1257
  """
1328
1258
  self.save()
1329
1259
  start_time = time.time()
@@ -1333,16 +1263,17 @@ class Edb(EdbInit):
1333
1263
  return True
1334
1264
 
1335
1265
  def save_edb_as(self, fname) -> bool:
1336
- """Save the EDB file as another file.
1266
+ """Save EDB database to new location.
1337
1267
 
1338
1268
  Parameters
1339
1269
  ----------
1340
1270
  fname : str
1341
- Name of the new file to save to.
1271
+ New AEDB path.
1342
1272
 
1343
1273
  Returns
1344
1274
  -------
1345
- bool: `True` when successful, `False` when failed.
1275
+ bool
1276
+ True if successful, False otherwise.
1346
1277
  """
1347
1278
  self.save_as(fname)
1348
1279
  start_time = time.time()
@@ -1356,41 +1287,18 @@ class Edb(EdbInit):
1356
1287
  return True
1357
1288
 
1358
1289
  def execute(self, func):
1359
- """Execute a function.
1290
+ """Execute EDB utility command (Not implemented in gRPC).
1360
1291
 
1361
1292
  Parameters
1362
1293
  ----------
1363
1294
  func : str
1364
- Function to execute.
1365
-
1366
-
1367
- Returns
1368
- -------
1369
- bool: `True` when successful, `False` when failed.
1295
+ Command to execute.
1370
1296
  """
1371
1297
  # return self.edb_api.utility.utility.Command.Execute(func)
1372
1298
  pass
1373
1299
 
1374
1300
  def import_cadence_file(self, inputBrd, WorkDir=None, anstranslator_full_path="", use_ppe=False):
1375
- """Import a board file and generate an ``edb.def`` file in the working directory.
1376
-
1377
- Parameters
1378
- ----------
1379
- inputBrd : str
1380
- Full path to the board file.
1381
- WorkDir : str, optional
1382
- Directory in which to create the ``aedb`` folder. The default value is ``None``,
1383
- in which case the AEDB file is given the same name as the board file. Only
1384
- the extension differs.
1385
- anstranslator_full_path : str, optional
1386
- Full path to the Ansys translator.
1387
- use_ppe : bool, optional
1388
- Whether to use the PPE License. The default is ``False``.
1389
-
1390
- Returns
1391
- -------
1392
- bool: `True` when successful, `False` when failed.
1393
- """
1301
+ """Import Cadence board file (Deprecated - use import_layout_file)."""
1394
1302
  if self.import_layout_pcb(
1395
1303
  inputBrd,
1396
1304
  working_dir=WorkDir,
@@ -1411,32 +1319,24 @@ class Edb(EdbInit):
1411
1319
  map_file=None,
1412
1320
  layer_filter=None,
1413
1321
  ):
1414
- """Import a GDS file and generate an ``edb.def`` file in the working directory.
1415
-
1416
- ..note::
1417
- ANSYS license is necessary to run the translator.
1322
+ """Import GDS file.
1418
1323
 
1419
1324
  Parameters
1420
1325
  ----------
1421
1326
  inputGDS : str
1422
- Full path to the GDS file.
1327
+ GDS file path.
1423
1328
  anstranslator_full_path : str, optional
1424
- Full path to the Ansys translator.
1329
+ Ansys translator path.
1425
1330
  use_ppe : bool, optional
1426
- Whether to use the PPE License. The default is ``False``.
1331
+ Use PPE license. Default False.
1427
1332
  control_file : str, optional
1428
- Path to the XML file. The default is ``None``, in which case an attempt is made to find
1429
- the XML file in the same directory as the GDS file. To succeed, the XML file and GDS file must
1430
- have the same name. Only the extension differs.
1333
+ XML control file.
1431
1334
  tech_file : str, optional
1432
- Technology file. For versions<2024.1 it uses Helic to convert tech file to xml and then imports
1433
- the gds. Works on Linux only.
1434
- For versions>=2024.1 it can directly parse through supported foundry tech files.
1335
+ Technology file.
1435
1336
  map_file : str, optional
1436
1337
  Layer map file.
1437
- layer_filter:str,optional
1338
+ layer_filter : str, optional
1438
1339
  Layer filter file.
1439
-
1440
1340
  """
1441
1341
  control_file_temp = os.path.join(tempfile.gettempdir(), os.path.split(inputGDS)[-1][:-3] + "xml")
1442
1342
  if float(self.edbversion) < 2024.1:
@@ -1737,114 +1637,63 @@ class Edb(EdbInit):
1737
1637
  keep_lines_as_path=False,
1738
1638
  include_voids_in_extents=False,
1739
1639
  ):
1740
- """Create a cutout using an approach entirely based on PyAEDT.
1741
- This method replaces all legacy cutout methods in PyAEDT.
1742
- It does in sequence:
1743
- - delete all nets not in list,
1744
- - create a extent of the nets,
1745
- - check and delete all vias not in the extent,
1746
- - check and delete all the primitives not in extent,
1747
- - check and intersect all the primitives that intersect the extent.
1640
+ """Create layout cutout with various options.
1748
1641
 
1749
1642
  Parameters
1750
1643
  ----------
1751
- signal_list : list
1752
- List of signal strings.
1644
+ signal_list : list, optional
1645
+ Signal nets to include.
1753
1646
  reference_list : list, optional
1754
- List of references to add. The default is ``["GND"]``.
1647
+ Reference nets to include.
1755
1648
  extent_type : str, optional
1756
- Type of the extension. Options are ``"Conforming"``, ``"ConvexHull"``, and
1757
- ``"Bounding"``. The default is ``"Conforming"``.
1758
- expansion_size : float, str, optional
1759
- Expansion size ratio in meters. The default is ``0.002``.
1649
+ Cutout type ("Conforming", "ConvexHull", "Bounding").
1650
+ expansion_size : float, optional
1651
+ Boundary expansion size (meters).
1760
1652
  use_round_corner : bool, optional
1761
- Whether to use round corners. The default is ``False``.
1653
+ Use rounded corners. Default False.
1762
1654
  output_aedb_path : str, optional
1763
- Full path and name for the new AEDB file. If None, then current aedb will be cutout.
1655
+ Output AEDB path.
1764
1656
  open_cutout_at_end : bool, optional
1765
- Whether to open the cutout at the end. The default is ``True``.
1657
+ Open cutout when finished. Default True.
1766
1658
  use_pyaedt_cutout : bool, optional
1767
- Whether to use new PyAEDT cutout method or EDB API method.
1768
- New method is faster than native API method since it benefits of multithread.
1659
+ Use PyAEDT cutout method. Default True.
1769
1660
  number_of_threads : int, optional
1770
- Number of thread to use. Default is 4. Valid only if ``use_pyaedt_cutout`` is set to ``True``.
1661
+ Thread count for PyAEDT cutout.
1771
1662
  use_pyaedt_extent_computing : bool, optional
1772
- Whether to use legacy extent computing (experimental) or EDB API.
1663
+ Use PyAEDT extent computation. Default True.
1773
1664
  extent_defeature : float, optional
1774
- Defeature the cutout before applying it to produce simpler geometry for mesh (Experimental).
1775
- It applies only to Conforming bounding box. Default value is ``0`` which disable it.
1665
+ Geometry simplification factor.
1776
1666
  remove_single_pin_components : bool, optional
1777
- Remove all Single Pin RLC after the cutout is completed. Default is `False`.
1778
- custom_extent : list
1779
- Points list defining the cutout shape. This setting will override `extent_type` field.
1780
- custom_extent_units : str
1781
- Units of the point list. The default is ``"mm"``. Valid only if `custom_extend` is provided.
1667
+ Remove single-pin components. Default False.
1668
+ custom_extent : list, optional
1669
+ Custom polygon points for cutout.
1670
+ custom_extent_units : str, optional
1671
+ Units for custom_extent points.
1782
1672
  include_partial_instances : bool, optional
1783
- Whether to include padstack instances that have bounding boxes intersecting with point list polygons.
1784
- This operation may slow down the cutout export.Valid only if `custom_extend` and
1785
- `use_pyaedt_cutout` is provided.
1786
- keep_voids : bool
1787
- Boolean used for keep or not the voids intersecting the polygon used for clipping the layout.
1788
- Default value is ``True``, ``False`` will remove the voids.Valid only if `custom_extend` is provided.
1673
+ Include partial padstack instances. Default False.
1674
+ keep_voids : bool, optional
1675
+ Preserve voids in cutout. Default True.
1789
1676
  check_terminals : bool, optional
1790
- Whether to check for all reference terminals and increase extent to include them into the cutout.
1791
- This applies to components which have a model (spice, touchstone or netlist) associated.
1677
+ Verify terminal references. Default False.
1792
1678
  include_pingroups : bool, optional
1793
- Whether to check for all pingroups terminals and increase extent to include them into the cutout.
1794
- It requires ``check_terminals``.
1679
+ Include pin groups. Default False.
1795
1680
  expansion_factor : int, optional
1796
- The method computes a float representing the largest number between
1797
- the dielectric thickness or trace width multiplied by the expansion_factor factor.
1798
- The trace width search is limited to nets with ports attached. Works only if `use_pyaedt_cutout`.
1799
- Default is `0` to disable the search.
1681
+ Auto-expansion factor. Default 0 (disabled).
1800
1682
  maximum_iterations : int, optional
1801
- Maximum number of iterations before stopping a search for a cutout with an error.
1802
- Default is `10`.
1683
+ Max auto-expansion iterations. Default 10.
1803
1684
  preserve_components_with_model : bool, optional
1804
- Whether to preserve all pins of components that have associated models (Spice or NPort).
1805
- This parameter is applicable only for a PyAEDT cutout (except point list).
1685
+ Keep components with models. Default False.
1806
1686
  simple_pad_check : bool, optional
1807
- Whether to use the center of the pad to find the intersection with extent or use the bounding box.
1808
- Second method is much slower and requires to disable multithread on padstack removal.
1809
- Default is `True`.
1687
+ Use simplified pad checking. Default True.
1810
1688
  keep_lines_as_path : bool, optional
1811
- Whether to keep the lines as Path after they are cutout or convert them to PolygonData.
1812
- This feature works only in Electronics Desktop (3D Layout).
1813
- If the flag is set to ``True`` it can cause issues in SiWave once the Edb is imported.
1814
- Default is ``False`` to generate PolygonData of cut lines.
1689
+ Preserve paths as lines. Default False.
1815
1690
  include_voids_in_extents : bool, optional
1816
- Whether to compute and include voids in pyaedt extent before the cutout. Cutout time can be affected.
1817
- It works only with Conforming cutout.
1818
- Default is ``False`` to generate extent without voids.
1819
-
1691
+ Include voids in extent calculation. Default False.
1820
1692
 
1821
1693
  Returns
1822
1694
  -------
1823
- List
1824
- List of coordinate points defining the extent used for clipping the design. If failed, return an empty
1825
- list.
1826
-
1827
- Examples
1828
- --------
1829
- >>> from pyedb import Edb
1830
- >>> edb = Edb(r'C:\\test.aedb', edbversion="2022.2")
1831
- >>> edb.logger.info_timer("Edb Opening")
1832
- >>> edb.logger.reset_timer()
1833
- >>> start = time.time()
1834
- >>> signal_list = []
1835
- >>> for net in edb.nets.netlist:
1836
- >>> if "3V3" in net:
1837
- >>> signal_list.append(net)
1838
- >>> power_list = ["PGND"]
1839
- >>> edb.cutout(signal_list=signal_list, reference_list=power_list, extent_type="Conforming")
1840
- >>> end_time = str((time.time() - start)/60)
1841
- >>> edb.logger.info("Total legacy cutout time in min %s", end_time)
1842
- >>> edb.nets.plot(signal_list, None, color_by_net=True)
1843
- >>> edb.nets.plot(power_list, None, color_by_net=True)
1844
- >>> edb.save_edb()
1845
- >>> edb.close_edb()
1846
-
1847
-
1695
+ list or bool
1696
+ Cutout boundary points if successful, False otherwise.
1848
1697
  """
1849
1698
  if expansion_factor > 0:
1850
1699
  expansion_size = self.calculate_initial_extent(expansion_factor)
@@ -2568,37 +2417,25 @@ class Edb(EdbInit):
2568
2417
  aedt_file_name=None,
2569
2418
  hidden=False,
2570
2419
  ):
2571
- """Export EDB to HFSS.
2420
+ """Export to HFSS project.
2572
2421
 
2573
2422
  Parameters
2574
2423
  ----------
2575
2424
  path_to_output : str
2576
- Full path and name for saving the AEDT file.
2425
+ Output directory.
2577
2426
  net_list : list, optional
2578
- List of nets to export if only certain ones are to be exported.
2579
- The default is ``None``, in which case all nets are eported.
2427
+ Nets to export.
2580
2428
  num_cores : int, optional
2581
- Number of cores to use for the export. The default is ``None``.
2429
+ Processing cores to use.
2582
2430
  aedt_file_name : str, optional
2583
- Name of the AEDT output file without the ``.aedt`` extension. The default is ``None``,
2584
- in which case the default name is used.
2431
+ Custom AEDT filename.
2585
2432
  hidden : bool, optional
2586
- Open Siwave in embedding mode. User will only see Siwave Icon but UI will be hidden.
2433
+ Run Siwave in background. Default False.
2587
2434
 
2588
2435
  Returns
2589
2436
  -------
2590
2437
  str
2591
- Full path to the AEDT file.
2592
-
2593
- Examples
2594
- --------
2595
-
2596
- >>> from pyedb import Edb
2597
- >>> edb = Edb(edbpath=r"C:\temp\myproject.aedb", edbversion="2023.2")
2598
-
2599
- >>> options_config = {'UNITE_NETS' : 1, 'LAUNCH_Q3D' : 0}
2600
- >>> edb.write_export3d_option_config_file(r"C:\temp", options_config)
2601
- >>> edb.export_hfss(r"C:\temp")
2438
+ Path to generated AEDT file.
2602
2439
  """
2603
2440
  siwave_s = SiwaveSolve(self.edbpath, aedt_installer_path=self.base_path)
2604
2441
  return siwave_s.export_3d_cad("HFSS", path_to_output, net_list, num_cores, aedt_file_name, hidden=hidden)
@@ -2611,38 +2448,26 @@ class Edb(EdbInit):
2611
2448
  aedt_file_name=None,
2612
2449
  hidden=False,
2613
2450
  ):
2614
- """Export EDB to Q3D.
2451
+ """Export to Q3D project.
2615
2452
 
2616
2453
  Parameters
2617
2454
  ----------
2618
2455
  path_to_output : str
2619
- Full path and name for saving the AEDT file.
2456
+ Output directory.
2620
2457
  net_list : list, optional
2621
- List of nets to export only if certain ones are to be exported.
2622
- The default is ``None``, in which case all nets are eported.
2458
+ Nets to export.
2623
2459
  num_cores : int, optional
2624
- Number of cores to use for the export. The default is ``None``.
2460
+ Processing cores to use.
2625
2461
  aedt_file_name : str, optional
2626
- Name of the AEDT output file without the ``.aedt`` extension. The default is ``None``,
2627
- in which case the default name is used.
2462
+ Custom AEDT filename.
2628
2463
  hidden : bool, optional
2629
- Open Siwave in embedding mode. User will only see Siwave Icon but UI will be hidden.
2464
+ Run Siwave in background. Default False.
2630
2465
 
2631
2466
  Returns
2632
2467
  -------
2633
2468
  str
2634
- Full path to the AEDT file.
2635
-
2636
- Examples
2637
- --------
2638
-
2639
- >>> from pyedb import Edb
2640
- >>> edb = Edb(edbpath=r"C:\temp\myproject.aedb", edbversion="2021.2")
2641
- >>> options_config = {'UNITE_NETS' : 1, 'LAUNCH_Q3D' : 0}
2642
- >>> edb.write_export3d_option_config_file(r"C:\temp", options_config)
2643
- >>> edb.export_q3d(r"C:\temp")
2469
+ Path to generated AEDT file.
2644
2470
  """
2645
-
2646
2471
  siwave_s = SiwaveSolve(self.edbpath, aedt_installer_path=self.base_path)
2647
2472
  return siwave_s.export_3d_cad(
2648
2473
  "Q3D",
@@ -2661,38 +2486,25 @@ class Edb(EdbInit):
2661
2486
  aedt_file_name=None,
2662
2487
  hidden=False,
2663
2488
  ):
2664
- """Export EDB to Maxwell 3D.
2489
+ """Export to Maxwell project.
2665
2490
 
2666
2491
  Parameters
2667
2492
  ----------
2668
2493
  path_to_output : str
2669
- Full path and name for saving the AEDT file.
2494
+ Output directory.
2670
2495
  net_list : list, optional
2671
- List of nets to export only if certain ones are to be
2672
- exported. The default is ``None``, in which case all nets are exported.
2496
+ Nets to export.
2673
2497
  num_cores : int, optional
2674
- Number of cores to use for the export. The default is ``None.``
2498
+ Processing cores to use.
2675
2499
  aedt_file_name : str, optional
2676
- Name of the AEDT output file without the ``.aedt`` extension. The default is ``None``,
2677
- in which case the default name is used.
2500
+ Custom AEDT filename.
2678
2501
  hidden : bool, optional
2679
- Open Siwave in embedding mode. User will only see Siwave Icon but UI will be hidden.
2502
+ Run Siwave in background. Default False.
2680
2503
 
2681
2504
  Returns
2682
2505
  -------
2683
2506
  str
2684
- Full path to the AEDT file.
2685
-
2686
- Examples
2687
- --------
2688
-
2689
- >>> from pyedb import Edb
2690
-
2691
- >>> edb = Edb(edbpath=r"C:\temp\myproject.aedb", edbversion="2021.2")
2692
-
2693
- >>> options_config = {'UNITE_NETS' : 1, 'LAUNCH_Q3D' : 0}
2694
- >>> edb.write_export3d_option_config_file(r"C:\temp", options_config)
2695
- >>> edb.export_maxwell(r"C:\temp")
2507
+ Path to generated AEDT file.
2696
2508
  """
2697
2509
  siwave_s = SiwaveSolve(self.edbpath, aedt_installer_path=self.base_path)
2698
2510
  return siwave_s.export_3d_cad(
@@ -2705,12 +2517,12 @@ class Edb(EdbInit):
2705
2517
  )
2706
2518
 
2707
2519
  def solve_siwave(self):
2708
- """Close EDB and solve it with Siwave.
2520
+ """Solve with SIwave.
2709
2521
 
2710
2522
  Returns
2711
2523
  -------
2712
2524
  str
2713
- Siwave project path.
2525
+ Path to SIwave project.
2714
2526
  """
2715
2527
  process = SiwaveSolve(self.edbpath, aedt_version=self.edbversion)
2716
2528
  try:
@@ -2733,35 +2545,35 @@ class Edb(EdbInit):
2733
2545
  power_tree=True,
2734
2546
  loop_res=True,
2735
2547
  ):
2736
- """Close EDB and solve it with Siwave.
2548
+ """Export SIwave DC results.
2737
2549
 
2738
2550
  Parameters
2739
2551
  ----------
2740
2552
  siwave_project : str
2741
- Siwave full project name.
2553
+ SIwave project path.
2742
2554
  solution_name : str
2743
- Siwave DC Analysis name.
2555
+ DC analysis name.
2744
2556
  output_folder : str, optional
2745
- Ouptu folder where files will be downloaded.
2557
+ Custom output folder.
2746
2558
  html_report : bool, optional
2747
- Either if generate or not html report. Default is `True`.
2559
+ Generate HTML report. Default True.
2748
2560
  vias : bool, optional
2749
- Either if generate or not vias report. Default is `True`.
2561
+ Export vias report. Default True.
2750
2562
  voltage_probes : bool, optional
2751
- Either if generate or not voltage probe report. Default is `True`.
2563
+ Export voltage probes. Default True.
2752
2564
  current_sources : bool, optional
2753
- Either if generate or not current source report. Default is `True`.
2565
+ Export current sources. Default True.
2754
2566
  voltage_sources : bool, optional
2755
- Either if generate or not voltage source report. Default is `True`.
2567
+ Export voltage sources. Default True.
2756
2568
  power_tree : bool, optional
2757
- Either if generate or not power tree image. Default is `True`.
2569
+ Export power tree. Default True.
2758
2570
  loop_res : bool, optional
2759
- Either if generate or not loop resistance report. Default is `True`.
2571
+ Export loop resistance. Default True.
2760
2572
 
2761
2573
  Returns
2762
2574
  -------
2763
2575
  list[str]
2764
- List of files generated.
2576
+ Generated report files.
2765
2577
  """
2766
2578
  process = SiwaveSolve(self.edbpath, aedt_version=self.edbversion)
2767
2579
  try:
@@ -2783,11 +2595,17 @@ class Edb(EdbInit):
2783
2595
  )
2784
2596
 
2785
2597
  def variable_exists(self, variable_name):
2786
- """Check if a variable exists or not.
2598
+ """Check if variable exists.
2599
+
2600
+ Parameters
2601
+ ----------
2602
+ variable_name : str
2603
+ Variable name.
2787
2604
 
2788
2605
  Returns
2789
2606
  -------
2790
2607
  bool
2608
+ True if variable exists.
2791
2609
  """
2792
2610
  if "$" in variable_name:
2793
2611
  if variable_name.index("$") == 0:
@@ -2801,15 +2619,17 @@ class Edb(EdbInit):
2801
2619
  return False
2802
2620
 
2803
2621
  def get_variable(self, variable_name):
2804
- """Return Variable Value if variable exists.
2622
+ """Get variable value.
2805
2623
 
2806
2624
  Parameters
2807
2625
  ----------
2808
- variable_name
2626
+ variable_name : str
2627
+ Variable name.
2809
2628
 
2810
2629
  Returns
2811
2630
  -------
2812
- float
2631
+ float or bool
2632
+ Variable value if exists, else False.
2813
2633
  """
2814
2634
  if self.variable_exists(variable_name):
2815
2635
  if "$" in variable_name:
@@ -2822,30 +2642,21 @@ class Edb(EdbInit):
2822
2642
  return False
2823
2643
 
2824
2644
  def add_project_variable(self, variable_name, variable_value, description=None) -> bool:
2825
- """Add a variable to database. The variable will have the prefix `$`.
2645
+ """Add project variable.
2826
2646
 
2827
2647
  Parameters
2828
2648
  ----------
2829
2649
  variable_name : str
2830
- Name of the variable. Name can be provided without ``$`` prefix.
2650
+ Variable name (auto-prefixed with '$').
2831
2651
  variable_value : str, float
2832
- Value of the variable with units.
2833
- description : str, optional.
2834
- Add variable description.
2652
+ Variable value with units.
2653
+ description : str, optional
2654
+ Variable description.
2835
2655
 
2836
2656
  Returns
2837
2657
  -------
2838
2658
  bool
2839
-
2840
- Examples
2841
- --------
2842
-
2843
- >>> from pyedb import Edb
2844
- >>> edb_app = Edb()
2845
- >>> boolean_1, ant_length = edb_app.add_project_variable("my_local_variable", "1cm")
2846
- >>> print(edb_app["$my_local_variable"]) #using getitem
2847
- >>> edb_app["$my_local_variable"] = "1cm" #using setitem
2848
-
2659
+ True if successful, False if variable exists.
2849
2660
  """
2850
2661
  if not variable_name.startswith("$"):
2851
2662
  variable_name = f"${variable_name}"
@@ -2859,37 +2670,23 @@ class Edb(EdbInit):
2859
2670
  return False
2860
2671
 
2861
2672
  def add_design_variable(self, variable_name, variable_value, is_parameter=False, description=None) -> bool:
2862
- """Add a variable to edb. The variable can be a design one or a project variable (using ``$`` prefix).
2673
+ """Add design variable.
2863
2674
 
2864
2675
  Parameters
2865
2676
  ----------
2866
2677
  variable_name : str
2867
- Name of the variable. To added the variable as a project variable, the name
2868
- must begin with ``$``.
2678
+ Variable name.
2869
2679
  variable_value : str, float
2870
- Value of the variable with units.
2680
+ Variable value with units.
2871
2681
  is_parameter : bool, optional
2872
- Whether to add the variable as a local variable. The default is ``False``.
2873
- When ``True``, the variable is added as a parameter default.
2682
+ Add as local variable. Default False.
2874
2683
  description : str, optional
2875
- Add variable description.
2684
+ Variable description.
2876
2685
 
2877
2686
  Returns
2878
2687
  -------
2879
- bool.
2880
-
2881
- Examples
2882
- --------
2883
-
2884
- >>> from pyedb import Edb
2885
- >>> edb_app = Edb()
2886
- >>> boolean_1, ant_length = edb_app.add_design_variable("my_local_variable", "1cm")
2887
- >>> print(edb_app["my_local_variable"]) #using getitem
2888
- >>> edb_app["my_local_variable"] = "1cm" #using setitem
2889
- >>> boolean_2, para_length = edb_app.change_design_variable_value("my_parameter", "1m", is_parameter=True
2890
- >>> boolean_3, project_length = edb_app.change_design_variable_value("$my_project_variable", "1m")
2891
-
2892
-
2688
+ bool
2689
+ True if successful, False if variable exists.
2893
2690
  """
2894
2691
  if variable_name.startswith("$"):
2895
2692
  variable_name = variable_name[1:]
@@ -2903,27 +2700,14 @@ class Edb(EdbInit):
2903
2700
  return False
2904
2701
 
2905
2702
  def change_design_variable_value(self, variable_name, variable_value):
2906
- """Change a variable value.
2703
+ """Update variable value.
2907
2704
 
2908
2705
  Parameters
2909
2706
  ----------
2910
2707
  variable_name : str
2911
- Name of the variable.
2708
+ Variable name.
2912
2709
  variable_value : str, float
2913
- Value of the variable with units.
2914
-
2915
- Returns
2916
- -------
2917
- bool.
2918
-
2919
- Examples
2920
- --------
2921
-
2922
- >>> from pyedb import Edb
2923
- >>> edb_app = Edb()
2924
- >>> boolean, ant_length = edb_app.add_design_variable("ant_length", "1cm")
2925
- >>> boolean, ant_length = edb_app.change_design_variable_value("ant_length", "1m")
2926
- >>> print(edb_app["ant_length"]) #using getitem
2710
+ New value with units.
2927
2711
  """
2928
2712
  if self.variable_exists(variable_name):
2929
2713
  if variable_name in self.db.get_all_variable_names():
@@ -2932,54 +2716,44 @@ class Edb(EdbInit):
2932
2716
  self.active_cell.set_variable_value(variable_name, GrpcValue(variable_value))
2933
2717
 
2934
2718
  def get_bounding_box(self) -> list[list[float, float], list[float, float]]:
2935
- """Get the layout bounding box.
2719
+ """Get layout bounding box.
2936
2720
 
2937
2721
  Returns
2938
2722
  -------
2939
- list[float]
2940
- Bounding box as a [lower-left X, lower-left Y, upper-right X, upper-right Y] in meters.
2723
+ list
2724
+ [[min_x, min_y], [max_x, max_y]] in meters.
2941
2725
  """
2942
2726
  lay_inst_polygon_data = [obj_inst.get_bbox() for obj_inst in self.layout_instance.query_layout_obj_instances()]
2943
2727
  layout_bbox = GrpcPolygonData.bbox_of_polygons(lay_inst_polygon_data)
2944
2728
  return [[layout_bbox[0].x.value, layout_bbox[0].y.value], [layout_bbox[1].x.value, layout_bbox[1].y.value]]
2945
2729
 
2946
2730
  def get_statistics(self, compute_area=False):
2947
- """Get the EDBStatistics object.
2731
+ """Get layout statistics.
2732
+
2733
+ Parameters
2734
+ ----------
2735
+ compute_area : bool, optional
2736
+ Calculate net areas. Default False.
2948
2737
 
2949
2738
  Returns
2950
2739
  -------
2951
2740
  :class:`LayoutStatistics <pyedb.grpc.database.utility.layout_statistics.LayoutStatistics>`
2741
+ Layout statistics report.
2952
2742
  """
2953
2743
  return self.modeler.get_layout_statistics(evaluate_area=compute_area, net_list=None)
2954
2744
 
2955
2745
  def are_port_reference_terminals_connected(self, common_reference=None):
2956
- """Check if all terminal references in design are connected.
2957
- If the reference nets are different, there is no hope for the terminal references to be connected.
2958
- After we have identified a common reference net we need to loop the terminals again to get
2959
- the correct reference terminals that uses that net.
2746
+ """Check if port reference terminals are connected.
2960
2747
 
2961
2748
  Parameters
2962
2749
  ----------
2963
2750
  common_reference : str, optional
2964
- Common Reference name. If ``None`` it will be searched in ports terminal.
2965
- If a string is passed then all excitations must have such reference assigned.
2751
+ Reference net name to check.
2966
2752
 
2967
2753
  Returns
2968
2754
  -------
2969
2755
  bool
2970
- Either if the ports are connected to reference_name or not.
2971
-
2972
- Examples
2973
- --------
2974
- >>> from pyedb import Edb
2975
- >>>edb = Edb()
2976
- >>> edb.hfss.create_edge_port_vertical(prim_1_id, ["-66mm", "-4mm"], "port_ver")
2977
- >>> edb.hfss.create_edge_port_horizontal(
2978
- >>> ... prim_1_id, ["-60mm", "-4mm"], prim_2_id, ["-59mm", "-4mm"], "port_hori", 30, "Lower"
2979
- >>> ... )
2980
- >>> edb.hfss.create_wave_port(traces[0].id, trace_paths[0][0], "wave_port")
2981
- >>> edb.cutout(["Net1"])
2982
- >>> assert edb.are_port_reference_terminals_connected()
2756
+ True if all port references are connected.
2983
2757
  """
2984
2758
  all_sources = [i for i in self.excitations.values() if not isinstance(i, (WavePort, GapPort, BundleWavePort))]
2985
2759
  all_sources.extend([i for i in self.sources.values()])
@@ -3137,17 +2911,18 @@ class Edb(EdbInit):
3137
2911
  )
3138
2912
 
3139
2913
  def create_raptorx_setup(self, name=None) -> RaptorXSimulationSetup:
3140
- """Create an RaptorX simulation setup from a template.
2914
+ """Create RaptorX analysis setup (2024R2+ only).
3141
2915
 
3142
2916
  Parameters
3143
2917
  ----------
3144
2918
  name : str, optional
3145
- Setup name.
2919
+ Setup name. Auto-generated if None.
3146
2920
 
3147
2921
  Returns
3148
2922
  -------
3149
- :class:`RaptorXSimulationSetup <legacy.database.edb_data.raptor_x_simulation_setup_data.RaptorXSimulationSetup>`
3150
-
2923
+ :class:`RaptorXSimulationSetup
2924
+ <pyedb.grpc.database.simulation_setup.raptor_x_simulation_setup.RaptorXSimulationSetup>`
2925
+ RaptorX setup or False if unsupported.
3151
2926
  """
3152
2927
  from ansys.edb.core.simulation_setup.raptor_x_simulation_setup import (
3153
2928
  RaptorXSimulationSetup as GrpcRaptorXSimulationSetup,
@@ -3191,28 +2966,20 @@ class Edb(EdbInit):
3191
2966
  pass
3192
2967
 
3193
2968
  def create_siwave_syz_setup(self, name=None, **kwargs) -> SiwaveSimulationSetup:
3194
- """Create a setup from a template.
2969
+ """Create SIwave SYZ analysis setup.
3195
2970
 
3196
2971
  Parameters
3197
2972
  ----------
3198
2973
  name : str, optional
3199
- Setup name.
2974
+ Setup name. Auto-generated if None.
2975
+ **kwargs
2976
+ Setup properties to modify.
3200
2977
 
3201
2978
  Returns
3202
2979
  -------
3203
2980
  :class:`SiwaveSimulationSetup
3204
2981
  <pyedb.grpc.database.simulation_setup.siwave_simulation_setup.SiwaveSimulationSetup>`
3205
-
3206
- Examples
3207
- --------
3208
- >>> from pyedb import Edb
3209
- >>> edbapp = Edb()
3210
- >>> setup1 = edbapp.create_siwave_syz_setup("setup1")
3211
- >>> setup1.add_frequency_sweep(frequency_sweep=[
3212
- ... ["linear count", "0", "1kHz", 1],
3213
- ... ["log scale", "1kHz", "0.1GHz", 10],
3214
- ... ["linear scale", "0.1GHz", "10GHz", "0.1GHz"],
3215
- ... ])
2982
+ SYZ analysis setup.
3216
2983
  """
3217
2984
  if not name:
3218
2985
  name = generate_unique_name("Siwave_SYZ")
@@ -3228,25 +2995,20 @@ class Edb(EdbInit):
3228
2995
  return self.setups[name]
3229
2996
 
3230
2997
  def create_siwave_dc_setup(self, name=None, **kwargs) -> GrpcSIWaveDCIRSimulationSetup:
3231
- """Create a setup from a template.
2998
+ """Create SIwave DC analysis setup.
3232
2999
 
3233
3000
  Parameters
3234
3001
  ----------
3235
3002
  name : str, optional
3236
- Setup name.
3003
+ Setup name. Auto-generated if None.
3004
+ **kwargs
3005
+ Setup properties to modify.
3237
3006
 
3238
3007
  Returns
3239
3008
  -------
3240
3009
  :class:`SIWaveDCIRSimulationSetup
3241
3010
  <pyedb.grpc.database.simulation_setup.siwave_dcir_simulation_setup.SIWaveDCIRSimulationSetup>`
3242
-
3243
- Examples
3244
- --------
3245
- >>> from pyedb import Edb
3246
- >>> edbapp = Edb()
3247
- >>> setup1 = edbapp.create_siwave_dc_setup("setup1")
3248
- >>> setup1.mesh_bondwires = True
3249
-
3011
+ DC analysis setup.
3250
3012
  """
3251
3013
  if not name:
3252
3014
  name = generate_unique_name("Siwave_DC")
@@ -3633,51 +3395,49 @@ class Edb(EdbInit):
3633
3395
  expand_voids_size=0,
3634
3396
  via_offset=True,
3635
3397
  ):
3636
- """Assign automatically design and project variables with current values.
3398
+ """Automatically parametrize design elements.
3637
3399
 
3638
3400
  Parameters
3639
3401
  ----------
3640
3402
  layers : bool, optional
3641
- Enable layer thickness parametrization. Default value is ``True``.
3403
+ Parametrize layer thicknesses. Default True.
3642
3404
  materials : bool, optional
3643
- Enable material parametrization. Default value is ``True``.
3405
+ Parametrize material properties. Default True.
3644
3406
  via_holes : bool, optional
3645
- Enable via diameter parametrization. Default value is ``True``.
3407
+ Parametrize via holes. Default True.
3646
3408
  pads : bool, optional
3647
- Enable pads size parametrization. Default value is ``True``.
3409
+ Parametrize pads. Default True.
3648
3410
  antipads : bool, optional
3649
- Enable anti pads size parametrization. Default value is ``True``.
3411
+ Parametrize antipads. Default True.
3650
3412
  traces : bool, optional
3651
- Enable trace width parametrization. Default value is ``True``.
3652
- layer_filter : str, List(str), optional
3653
- Enable layer filter. Default value is ``None``, all layers are parametrized.
3654
- material_filter : str, List(str), optional
3655
- Enable material filter. Default value is ``None``, all material are parametrized.
3656
- padstack_definition_filter : str, List(str), optional
3657
- Enable padstack definition filter. Default value is ``None``, all padsatcks are parametrized.
3658
- trace_net_filter : str, List(str), optional
3659
- Enable nets filter for trace width parametrization. Default value is ``None``, all layers are parametrized.
3413
+ Parametrize trace widths. Default True.
3414
+ layer_filter : list, optional
3415
+ Layers to include. All if None.
3416
+ material_filter : list, optional
3417
+ Materials to include. All if None.
3418
+ padstack_definition_filter : list, optional
3419
+ Padstacks to include. All if None.
3420
+ trace_net_filter : list, optional
3421
+ Nets to parametrize. All if None.
3660
3422
  use_single_variable_for_padstack_definitions : bool, optional
3661
- Whether to use a single design variable for each padstack definition or a variable per pad layer.
3662
- Default value is ``True``.
3423
+ Single variable per padstack. Default True.
3663
3424
  use_relative_variables : bool, optional
3664
- Whether if use an absolute variable for each trace, padstacks and layers or a delta variable instead.
3665
- Default value is ``True``.
3425
+ Use delta variables. Default True.
3666
3426
  output_aedb_path : str, optional
3667
- Full path and name for the new AEDB file. If None, then current aedb will be cutout.
3427
+ Output AEDB path.
3668
3428
  open_aedb_at_end : bool, optional
3669
- Whether to open the cutout at the end. The default is ``True``.
3429
+ Open AEDB when finished. Default True.
3670
3430
  expand_polygons_size : float, optional
3671
- Expansion size on polygons. Polygons will be expanded in all directions. The default is ``0``.
3431
+ Polygon expansion size. Default 0.
3672
3432
  expand_voids_size : float, optional
3673
- Expansion size on polygon voids. Polygons voids will be expanded in all directions. The default is ``0``.
3433
+ Void expansion size. Default 0.
3674
3434
  via_offset : bool, optional
3675
- Whether if offset the via position or not. The default is ``True``.
3435
+ Parametrize via positions. Default True.
3676
3436
 
3677
3437
  Returns
3678
3438
  -------
3679
- List(str)
3680
- List of all parameter name created.
3439
+ list[str]
3440
+ Created parameter names.
3681
3441
  """
3682
3442
  edb_original_path = self.edbpath
3683
3443
  if output_aedb_path:
@@ -3904,41 +3664,27 @@ class Edb(EdbInit):
3904
3664
  output_edb=None,
3905
3665
  launching_box_thickness="100um",
3906
3666
  ):
3907
- """Generate EDB design to be consumed by PyAEDT to generate arbitrary wave ports shapes.
3908
- This model has to be considered as merged onto another one. The current opened design must have voids
3909
- surrounding the pad-stacks where wave ports terminal will be created. THe open design won't be edited, only
3910
- primitives like voids and pads-stack definition included in the voids are collected to generate a new design.
3667
+ """Create simplified model for arbitrary wave port generation.
3911
3668
 
3912
3669
  Parameters
3913
3670
  ----------
3914
3671
  temp_directory : str
3915
- Temporary directory used during the method execution.
3916
-
3917
- mounting_side : str
3918
- Gives the orientation to be considered for the current design. 2 options are available ``"top"`` and
3919
- ``"bottom". Default value is ``"top"``. If ``"top"`` is selected the method will voids at the top signal
3920
- layer, and the bottom layer if ``"bottom"`` is used.
3921
-
3922
- signal_nets : List[str], optional
3923
- Provides the nets to be included for the model creation. Default value is ``None``. If None is provided,
3924
- all nets will be included.
3925
-
3926
- terminal_diameter : float, str, optional
3927
- When ``None``, the terminal diameter is evaluated at each pads-tack instance found inside the voids. The top
3928
- or bottom layer pad diameter will be taken, depending on ``mounting_side`` selected. If value is provided,
3929
- it will overwrite the evaluated diameter.
3930
-
3672
+ Working directory.
3673
+ mounting_side : str, optional
3674
+ Board orientation ("top" or "bottom").
3675
+ signal_nets : list, optional
3676
+ Nets to include. All if None.
3677
+ terminal_diameter : float, optional
3678
+ Custom terminal diameter. Auto-calculated if None.
3931
3679
  output_edb : str, optional
3932
- The output EDB absolute. If ``None`` the edb is created in the ``temp_directory`` as default name
3933
- `"waveport_model.aedb"``
3934
-
3935
- launching_box_thickness : float, str, optional
3936
- Launching box thickness used for wave ports. Default value is ``"100um"``.
3680
+ Output AEDB path.
3681
+ launching_box_thickness : str, optional
3682
+ Wave port box thickness.
3937
3683
 
3938
3684
  Returns
3939
3685
  -------
3940
3686
  bool
3941
- ``True`` when succeeded, ``False`` if failed.
3687
+ True if successful, False otherwise.
3942
3688
  """
3943
3689
  if not temp_directory:
3944
3690
  self.logger.error("Temp directory must be provided when creating model foe arbitrary wave port")
@@ -4059,11 +3805,12 @@ class Edb(EdbInit):
4059
3805
 
4060
3806
  @property
4061
3807
  def definitions(self):
4062
- """Returns Definitions class.
3808
+ """EDB definitions access.
4063
3809
 
4064
3810
  Returns
4065
3811
  -------
4066
3812
  :class:`Definitions <pyedb.grpc.database.definitions.Definitions>`
3813
+ Definitions interface.
4067
3814
  """
4068
3815
  from pyedb.grpc.database.definitions import Definitions
4069
3816
 
@@ -4071,28 +3818,31 @@ class Edb(EdbInit):
4071
3818
 
4072
3819
  @property
4073
3820
  def workflow(self):
4074
- """Returns workflow class.
3821
+ """Workflow automation interface.
4075
3822
 
4076
3823
  Returns
4077
- ------
3824
+ -------
4078
3825
  :class:`Workflow <pyedb.workflow.Workflow>`
3826
+ Workflow automation tools.
4079
3827
  """
4080
3828
  return Workflow(self)
4081
3829
 
4082
3830
  def export_gds_comp_xml(self, comps_to_export, gds_comps_unit="mm", control_path=None):
4083
- """Exports an XML file with selected components information for use in a GDS import.
3831
+ """Export component data to GDS XML control file.
3832
+
4084
3833
  Parameters
4085
3834
  ----------
4086
3835
  comps_to_export : list
4087
- List of components whose information will be exported to xml file.
3836
+ Components to export.
4088
3837
  gds_comps_unit : str, optional
4089
- GDS_COMPONENTS section units. Default is ``"mm"``.
3838
+ Output units. Default "mm".
4090
3839
  control_path : str, optional
4091
- Path for outputting the XML file.
3840
+ Output XML path.
3841
+
4092
3842
  Returns
4093
3843
  -------
4094
3844
  bool
4095
- ``True`` when successful, ``False`` when failed.
3845
+ True if successful, False otherwise.
4096
3846
  """
4097
3847
  from pyedb.generic.general_methods import ET
4098
3848