From 00250e4cc788908811b910458f9ed28f1e914ecb Mon Sep 17 00:00:00 2001 From: svandenb-dev Date: Tue, 25 Mar 2025 20:54:21 +0100 Subject: [PATCH 01/29] grpc transition PR#1005 tracker --- src/pyedb/grpc/database/layout/layout.py | 49 +++++++++++++++++-- .../database/primitive/padstack_instance.py | 2 +- tests/grpc/system/test_edb_layout.py | 9 +++- 3 files changed, 53 insertions(+), 7 deletions(-) diff --git a/src/pyedb/grpc/database/layout/layout.py b/src/pyedb/grpc/database/layout/layout.py index 4effe3e979..c223b36b23 100644 --- a/src/pyedb/grpc/database/layout/layout.py +++ b/src/pyedb/grpc/database/layout/layout.py @@ -26,6 +26,7 @@ from typing import Union from ansys.edb.core.layout.layout import Layout as GrpcLayout +import ansys.edb.core.primitive.primitive from pyedb.grpc.database.hierarchy.component import Component from pyedb.grpc.database.hierarchy.pingroup import PinGroup @@ -34,7 +35,12 @@ from pyedb.grpc.database.net.extended_net import ExtendedNet from pyedb.grpc.database.net.net import Net from pyedb.grpc.database.net.net_class import NetClass +from pyedb.grpc.database.primitive.bondwire import Bondwire +from pyedb.grpc.database.primitive.circle import Circle from pyedb.grpc.database.primitive.padstack_instance import PadstackInstance +from pyedb.grpc.database.primitive.path import Path +from pyedb.grpc.database.primitive.polygon import Polygon +from pyedb.grpc.database.primitive.rectangle import Rectangle from pyedb.grpc.database.terminal.bundle_terminal import BundleTerminal from pyedb.grpc.database.terminal.edge_terminal import EdgeTerminal from pyedb.grpc.database.terminal.padstack_instance_terminal import ( @@ -59,6 +65,26 @@ def cell(self): """ return self._pedb._active_cell + @property + def primitives(self): + prims = [] + for prim in super().primitives: + if isinstance(prim, ansys.edb.core.primitive.primitive.Path): + prims.append(Path(self._pedb, prim)) + elif isinstance(prim, ansys.edb.core.primitive.primitive.Polygon): + prims.append(Polygon(self._pedb, prim)) + elif isinstance(prim, ansys.edb.core.primitive.primitive.PadstackInstance): + prims.append(PadstackInstance(self._pedb, prim)) + elif isinstance(prim, ansys.edb.core.primitive.primitive.Rectangle): + prims.append(Rectangle(self._pedb, prim)) + elif isinstance(prim, ansys.edb.core.primitive.primitive.Circle): + prims.append(Circle(self._pedb, prim)) + elif isinstance(prim, ansys.edb.core.primitive.primitive.Bondwire): + prims.append(Bondwire(self._pedb, prim)) + else: + raise "Not valid primitive." + return prims + @property def terminals(self): """Get terminals belonging to active layout. @@ -180,17 +206,32 @@ def voltage_regulators(self): """ return [VoltageRegulator(self._pedb, i) for i in self._pedb.active_cell.layout.voltage_regulators] - def find_primitive(self, layer_name: Union[str, list]) -> list: + def find_primitive( + self, layer_name: Union[str, list] = None, name: Union[str, list] = None, net_name: Union[str, list] = None + ) -> list: """Find a primitive objects by layer name. - Parameters ---------- layer_name : str, list + layer_name : str, list, optional Name of the layer. + name : str, list, optional + Name of the primitive + net_name : str, list, optional + Name of the primitive Returns ------- List[:class:`Primitive Date: Fri, 11 Apr 2025 14:45:50 +0200 Subject: [PATCH 02/29] grpc test_01a_setups_frequency_sweeps --- src/pyedb/configuration/cfg_setup.py | 5 ++++- tests/grpc/system/test_edb_configuration_2p0.py | 8 +++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/pyedb/configuration/cfg_setup.py b/src/pyedb/configuration/cfg_setup.py index 5a5e6955ce..1f9ab46c26 100644 --- a/src/pyedb/configuration/cfg_setup.py +++ b/src/pyedb/configuration/cfg_setup.py @@ -60,7 +60,10 @@ def _apply_freq_sweep(self, edb_setup): f_set.append([f.distribution, f.start, f.stop, f.increment]) else: kw[attr] = getattr(i, attr) - edb_setup.add_sweep(i.name, frequency_set=f_set, **kw) + if self._pedb.grpc: + edb_setup.add_sweep(name=i.name) + else: + edb_setup.add_sweep(i.name, frequency_set=f_set, **kw) class CfgSIwaveACSetup(CfgSetup): diff --git a/tests/grpc/system/test_edb_configuration_2p0.py b/tests/grpc/system/test_edb_configuration_2p0.py index 468cb575d7..b148d058a3 100644 --- a/tests/grpc/system/test_edb_configuration_2p0.py +++ b/tests/grpc/system/test_edb_configuration_2p0.py @@ -179,7 +179,13 @@ def test_01a_setups_frequency_sweeps(self, edb_examples): if sw_p_name == "frequencies": pass else: - assert sw_value == target_sw[sw_p_name] + if edbapp.grpc: + if sw_value == "interpolation": + assert target_sw[sw_p_name].name == "INTERPOLATING_SWEEP" + else: + assert sw_value == target_sw[sw_p_name] + else: + assert sw_value == target_sw[sw_p_name] else: assert value == target[p] edbapp.close() From 28d668090fa2f7dbeb0f2aef32ead10cdf94a21a Mon Sep 17 00:00:00 2001 From: svandenb-dev Date: Mon, 5 May 2025 15:26:43 +0200 Subject: [PATCH 03/29] grpc test fix --- src/pyedb/configuration/cfg_boundaries.py | 2 +- .../configuration/cfg_s_parameter_models.py | 52 ++++++++++++++++++- src/pyedb/grpc/database/components.py | 3 +- .../grpc/database/definition/component_def.py | 2 +- src/pyedb/grpc/edb.py | 1 - tests/grpc/system/conftest.py | 8 +-- .../grpc/system/test_edb_configuration_2p0.py | 1 + 7 files changed, 59 insertions(+), 10 deletions(-) diff --git a/src/pyedb/configuration/cfg_boundaries.py b/src/pyedb/configuration/cfg_boundaries.py index a5c1696f14..4f773c2426 100644 --- a/src/pyedb/configuration/cfg_boundaries.py +++ b/src/pyedb/configuration/cfg_boundaries.py @@ -79,7 +79,7 @@ def set_parameters_to_edb(self): if self.air_box_horizontal_padding: self._pedb.hfss.hfss_extent_info.air_box_horizontal_extent = float(self.air_box_horizontal_padding) if self.air_box_positive_vertical_padding: - self._pedb.hfss.hfss_extent_info.parentair_box_positive_vertical_extent = float( + self._pedb.hfss.hfss_extent_info.air_box_positive_vertical_extent = float( self.air_box_positive_vertical_padding ) if self.air_box_negative_vertical_padding: diff --git a/src/pyedb/configuration/cfg_s_parameter_models.py b/src/pyedb/configuration/cfg_s_parameter_models.py index 10cf562cab..89f6968f05 100644 --- a/src/pyedb/configuration/cfg_s_parameter_models.py +++ b/src/pyedb/configuration/cfg_s_parameter_models.py @@ -80,7 +80,7 @@ def get_data_from_db(self, cfg_components): else: pin_order = compdef_obj.get_properties()["pin_order"] temp_comps = [i for i in cfg_components if i["definition"] == name] - for model_name, model_obj in nport_models.items(): + for model_obj in nport_models: temp_comp_list = [] reference_net_per_component = {} for i in temp_comps: @@ -155,6 +155,56 @@ def apply(self): ref_net = s_param.reference_net comp.use_s_parameter_model(s_param.name, reference_net=ref_net) + def get_data_from_db(self, cfg_components): + db_comp_def = self._pedb.definitions.component + for name, compdef_obj in db_comp_def.items(): + nport_models = compdef_obj.component_models + if not nport_models: + continue + else: + pin_order = compdef_obj.get_properties()["pin_order"] + temp_comps = [i for i in cfg_components if i["definition"] == name] + for model_name, model_obj in nport_models.items(): + temp_comp_list = [] + reference_net_per_component = {} + for i in temp_comps: + s_param_model = i.get("s_parameter_model") + if s_param_model: + if s_param_model["model_name"] == model_name: + temp_comp_list.append(i["reference_designator"]) + reference_net_per_component[i["reference_designator"]] = s_param_model[ + "reference_net" + ] + else: + continue + + self.parent.s_parameters_models.append( + CfgSParameterModel( + name=model_name, + component_definition=name, + file_path=model_obj.reference_file, + apply_to_all=False, + components=temp_comp_list, + reference_net_per_component=reference_net_per_component, + pin_order=pin_order, + ) + ) + + data = [] + for i in self.parent.s_parameters_models: + data.append( + { + "name": i.name, + "component_definition": i.component_definition, + "file_path": i.file_path, + "apply_to_all": i.apply_to_all, + "components": i.components, + "reference_net_per_component": i.reference_net_per_component, + "pin_order": i.pin_order, + } + ) + return data + def __init__(self, pedb, data, path_lib=None): self._pedb = pedb if self._pedb.grpc: diff --git a/src/pyedb/grpc/database/components.py b/src/pyedb/grpc/database/components.py index f6fae7298e..ccb547c920 100644 --- a/src/pyedb/grpc/database/components.py +++ b/src/pyedb/grpc/database/components.py @@ -178,8 +178,7 @@ def definitions(self): @property def nport_comp_definition(self): """Retrieve Nport component definition list.""" - m = "Ansys.Ansoft.Edb.Definition.NPortComponentModel" - return {name: l for name, l in self.definitions.items() if m in [i for i in l.model]} + return {name: l for name, l in self.definitions.items() if l.reference_file} def import_definition(self, file_path): """Import component definition from json file. diff --git a/src/pyedb/grpc/database/definition/component_def.py b/src/pyedb/grpc/database/definition/component_def.py index 1746304886..b24d79d4b3 100644 --- a/src/pyedb/grpc/database/definition/component_def.py +++ b/src/pyedb/grpc/database/definition/component_def.py @@ -230,4 +230,4 @@ def set_properties(self, **kwargs): if pin_order: old = {i.name: i for i in self.component_pins} temp = [old[str(i)] for i in pin_order] - self.component_pins = temp + self.reorder_pins(temp) diff --git a/src/pyedb/grpc/edb.py b/src/pyedb/grpc/edb.py index afb4a2dbb7..1df972de28 100644 --- a/src/pyedb/grpc/edb.py +++ b/src/pyedb/grpc/edb.py @@ -570,7 +570,6 @@ def open_edb(self, restart_rpc_server=False, kill_all_instances=False): self.edbpath, self.isreadonly, restart_rpc_server=restart_rpc_server, - kill_all_instances=kill_all_instances, ) n_try -= 1 except Exception as e: diff --git a/tests/grpc/system/conftest.py b/tests/grpc/system/conftest.py index 33df5e88f6..fa75443c90 100644 --- a/tests/grpc/system/conftest.py +++ b/tests/grpc/system/conftest.py @@ -84,22 +84,22 @@ def get_si_verse(self, edbapp=True, additional_files_folders="", version=None): self.local_scratch.copyfolder(src, file_folder_name) if edbapp: version = desktop_version if version is None else version - return Edb(aedb, edbversion=version, restart_rpc_server=True, kill_all_instances=True) + return Edb(aedb, edbversion=version, restart_rpc_server=True) else: return aedb def create_empty_edb(self): local_folder = self._create_test_folder() aedb = os.path.join(local_folder, "new_layout.aedb") - return Edb(aedb, edbversion=desktop_version, restart_rpc_server=True, kill_all_instances=True) + return Edb(aedb, edbversion=desktop_version, restart_rpc_server=True) def get_multizone_pcb(self): aedb = self._copy_file_folder_into_local_folder("multi_zone_project.aedb") - return Edb(aedb, edbversion=desktop_version, restart_rpc_server=True, kill_all_instances=True) + return Edb(aedb, edbversion=desktop_version, restart_rpc_server=True) def get_no_ref_pins_component(self): aedb = self._copy_file_folder_into_local_folder("TEDB/component_no_ref_pins.aedb") - return Edb(aedb, edbversion=desktop_version, restart_rpc_server=True, kill_all_instances=True) + return Edb(aedb, edbversion=desktop_version, restart_rpc_server=True) @pytest.fixture(scope="class") diff --git a/tests/grpc/system/test_edb_configuration_2p0.py b/tests/grpc/system/test_edb_configuration_2p0.py index a10e57a1d5..697fd6f9e1 100644 --- a/tests/grpc/system/test_edb_configuration_2p0.py +++ b/tests/grpc/system/test_edb_configuration_2p0.py @@ -494,6 +494,7 @@ def test_05h_diff_wave_port(self, edb_examples): edbapp.close() def test_06_s_parameters(self, edb_examples): + # TODO check bug #542 status. Seems some API's are missing. data = { "general": {"s_parameter_library": self.local_input_folder}, "s_parameters": [ From d137f06590241de1d8f697f383b3ae04c07bd30d Mon Sep 17 00:00:00 2001 From: svandenb-dev Date: Tue, 27 May 2025 17:43:56 +0200 Subject: [PATCH 04/29] some deprecation --- src/pyedb/grpc/database/source_excitations.py | 156 +++++++++++++++ src/pyedb/grpc/edb.py | 177 +++++++++--------- 2 files changed, 245 insertions(+), 88 deletions(-) diff --git a/src/pyedb/grpc/database/source_excitations.py b/src/pyedb/grpc/database/source_excitations.py index dc8c4271d4..ea4ba49ba1 100644 --- a/src/pyedb/grpc/database/source_excitations.py +++ b/src/pyedb/grpc/database/source_excitations.py @@ -154,6 +154,45 @@ def create_source_on_component(self, sources=None): ) return True + def create_port(self, terminal, ref_terminal=None, is_circuit_port=False, name=None): + """Create a port. + + Parameters + ---------- + terminal : class:`pyedb.dotnet.database.edb_data.terminals.EdgeTerminal`, + class:`pyedb.grpc.database.terminals.PadstackInstanceTerminal`, + class:`pyedb.grpc.database.terminals.PointTerminal`, + class:`pyedb.grpc.database.terminals.PinGroupTerminal`, + Positive terminal of the port. + ref_terminal : class:`pyedb.grpc.database.terminals.EdgeTerminal`, + class:`pyedb.grpc.database.terminals.PadstackInstanceTerminal`, + class:`pyedb.grpc.database.terminals.PointTerminal`, + class:`pyedb.grpc.database.terminals.PinGroupTerminal`, + optional + Negative terminal of the port. + is_circuit_port : bool, optional + Whether it is a circuit port. The default is ``False``. + name: str, optional + Name of the created port. The default is None, a random name is generated. + Returns + ------- + list: [:class:`GapPort , + :class:`WavePort `]. + """ + + from ansys.edb.core.terminal.terminal import BoundaryType as GrpcBoundaryType + + if terminal.boundary_type == "port": + terminal.boundary_type = GrpcBoundaryType.PORT + terminal.is_circuit_port = is_circuit_port + if ref_terminal: + if ref_terminal.boundary_type == "port": + ref_terminal.boundary_type = GrpcBoundaryType.PORT + terminal.reference_terminal = ref_terminal + if name: + terminal.name = name + return self._pedb.ports[terminal.name] + def create_port_on_pins( self, refdes, @@ -2098,6 +2137,30 @@ def get_ports_number(self): terms = [term for term in self._pedb.layout.terminals] return len([i for i in terms if not i.is_reference_terminal]) + def get_point_terminal(self, name, net_name, location, layer) -> PointTerminal: + """Place terminal between two points. + + Parameters + ---------- + name : str, + Name of the terminal. + net_name : str + Name of the net. + location : list + Location of the terminal. + layer : str, + Layer of the terminal. + + Returns + ------- + :class:`PointTerminal ` + """ + from pyedb.grpc.database.terminal.point_terminal import PointTerminal + + return PointTerminal.create( + layout=self._pedb.active_layout, name=name, net=net_name, layer=layer, point=location + ) + def create_rlc_boundary_on_pins(self, positive_pin=None, negative_pin=None, rvalue=0.0, lvalue=0.0, cvalue=0.0): """Create hfss rlc boundary on pins. @@ -2328,6 +2391,37 @@ def create_port_between_pin_and_layer( return terms return False + def create_current_source(self, terminal, ref_terminal): + """Create a current source. + + Parameters + ---------- + terminal : :class:`EdgeTerminal `, + :class:`PadstackInstanceTerminal `, + :class:`PointTerminal `, + :class:`PinGroupTerminal `, + Positive terminal of the source. + ref_terminal : :class:`EdgeTerminal `, + :class:`pyedb.grpc.database.terminals.PadstackInstanceTerminal`, + :class:`PadstackInstanceTerminal `, + :class:`PinGroupTerminal `, + Negative terminal of the source. + + Returns + ------- + :class:`ExcitationSources ` + """ + from pyedb.grpc.database.terminal.terminal import Terminal + + term = Terminal(self._pedb, terminal) + term.boundary_type = "current_source" + + ref_term = Terminal(self._pedb, ref_terminal) + ref_term.boundary_type = "current_source" + + term.ref_terminal = ref_terminal + return term + def create_current_source_on_pin_group( self, pos_pin_group_name, neg_pin_group_name, magnitude=1, phase=0, name=None ): @@ -2368,6 +2462,37 @@ def create_current_source_on_pin_group( pos_terminal.reference_terminal = neg_terminal return True + def create_voltage_source(self, terminal, ref_terminal): + """Create a voltage source. + + Parameters + ---------- + terminal : :class:`EdgeTerminal `, + :class:`PadstackInstanceTerminal `, + :class:`PointTerminal `, + :class:`PinGroupTerminal `, + Positive terminal of the source. + ref_terminal : :class:`EdgeTerminal `, + :class:`pyedb.grpc.database.terminals.PadstackInstanceTerminal`, + :class:`PadstackInstanceTerminal `, + :class:`PinGroupTerminal `, + Negative terminal of the source. + + Returns + ------- + class:`ExcitationSources ` + """ + from pyedb.grpc.database.terminal.terminal import Terminal + + term = Terminal(self._pedb, terminal) + term.boundary_type = "voltage_source" + + ref_term = Terminal(self._pedb, ref_terminal) + ref_term.boundary_type = "voltage_source" + + term.ref_terminal = ref_terminal + return term + def create_voltage_source_on_pin_group( self, pos_pin_group_name, neg_pin_group_name, magnitude=1, phase=0, name=None, impedance=0.001 ): @@ -2408,6 +2533,37 @@ def create_voltage_source_on_pin_group( pos_terminal.reference_terminal = neg_terminal return True + def create_voltage_probe(self, terminal, ref_terminal): + """Create a voltage probe. + + Parameters + ---------- + terminal : :class:`EdgeTerminal `, + :class:`PadstackInstanceTerminal `, + :class:`PointTerminal `, + :class:`PinGroupTerminal `, + Positive terminal of the port. + ref_terminal : :class:`EdgeTerminal `, + :class:`pyedb.grpc.database.terminals.PadstackInstanceTerminal`, + :class:`PadstackInstanceTerminal `, + :class:`PinGroupTerminal `, + Negative terminal of the probe. + + Returns + ------- + :class:`Terminal ` + """ + from pyedb.grpc.database.terminal.terminal import Terminal + + term = Terminal(self._pedb, terminal) + term.boundary_type = "voltage_probe" + + ref_term = Terminal(self._pedb, ref_terminal) + ref_term.boundary_type = "voltage_probe" + + term.ref_terminal = ref_terminal + return term + def create_voltage_probe_on_pin_group(self, probe_name, pos_pin_group_name, neg_pin_group_name, impedance=1000000): """Create voltage probe between two pin groups. diff --git a/src/pyedb/grpc/edb.py b/src/pyedb/grpc/edb.py index 061f2ff8ca..428a8a9657 100644 --- a/src/pyedb/grpc/edb.py +++ b/src/pyedb/grpc/edb.py @@ -418,7 +418,7 @@ def _init_objects(self): self._extended_nets = ExtendedNets(self) @property - def cell_names(self): + def cell_names(self) -> [str]: """Cell name container. Returns @@ -428,7 +428,7 @@ def cell_names(self): return [cell.name for cell in self.active_db.top_circuit_cells] @property - def design_variables(self): + def design_variables(self) -> dict[str, float]: """Get all edb design variables. Returns @@ -438,18 +438,18 @@ def design_variables(self): return {i: self.active_cell.get_variable_value(i).value for i in self.active_cell.get_all_variable_names()} @property - def project_variables(self): + def project_variables(self) -> dict[str, float]: """Get all project variables. Returns ------- - variables dictionary : Dict[str, variable_name: float, variable_value] + variables dictionary : dict[str, variable_name: float, variable_value] """ return {i: self.active_db.get_variable_value(i).value for i in self.active_db.get_all_variable_names()} @property - def layout_validation(self): + def layout_validation(self) -> LayoutValidation: """Return LayoutValidation object. Returns @@ -459,7 +459,7 @@ def layout_validation(self): return LayoutValidation(self) @property - def variables(self): + def variables(self) -> dict[str, float]: """Get all Edb variables. Returns @@ -475,7 +475,7 @@ def variables(self): return all_vars @property - def terminals(self): + def terminals(self) -> dict[str, Terminal]: """Get terminals belonging to active layout. Returns @@ -485,7 +485,7 @@ def terminals(self): return {i.name: i for i in self.layout.terminals} @property - def excitations(self): + def excitations(self) -> dict[str, GapPort]: """Get all layout excitations. Returns @@ -503,7 +503,7 @@ def excitations(self): return temp @property - def ports(self): + def ports(self) -> dict[str, GapPort]: """Get all ports. Returns @@ -537,7 +537,7 @@ def ports(self): return ports @property - def excitations_nets(self): + def excitations_nets(self) -> [str]: """Get all net names with excitation defined. Returns @@ -548,7 +548,7 @@ def excitations_nets(self): return list(set([i.net.name for i in self.layout.terminals if not i.is_reference_terminal])) @property - def sources(self): + def sources(self) -> dict[str, Terminal]: """Get all layout sources. Returns @@ -574,7 +574,7 @@ def voltage_regulator_modules(self): return _vrms @property - def probes(self): + def probes(self) -> dict[str, Terminal]: """Get all layout probes. Returns @@ -585,7 +585,7 @@ def probes(self): terms = [term for term in self.layout.terminals if term.boundary_type.value == 8] return {ter.name: ter for ter in terms} - def open_edb(self, restart_rpc_server=False, kill_all_instances=False): + def open_edb(self, restart_rpc_server=False) -> bool: """Open EDB. Returns @@ -626,7 +626,7 @@ def open_edb(self, restart_rpc_server=False, kill_all_instances=False): self.logger.error("Builder was not initialized.") return True - def create_edb(self, restart_rpc_server=False, kill_all_instances=False): + def create_edb(self, restart_rpc_server=False) -> bool: """Create EDB. Returns @@ -801,7 +801,7 @@ def import_layout_file( self.edbpath = os.path.join(working_dir, aedb_name) return self.open_edb() - def export_to_ipc2581(self, ipc_path=None, units="MILLIMETER"): + def export_to_ipc2581(self, ipc_path=None, units="MILLIMETER") -> str: """Create an XML IPC2581 file from the active EDB. .. note:: @@ -847,7 +847,7 @@ def export_to_ipc2581(self, ipc_path=None, units="MILLIMETER"): return False @property - def configuration(self): + def configuration(self) -> Configuration: """Edb project configuration from a file. Returns @@ -917,7 +917,7 @@ def active_cell(self, value): raise "No valid design." @property - def components(self): + def components(self) -> Components: """Edb Components methods and properties. Returns @@ -935,7 +935,7 @@ def components(self): return self._components @property - def stackup(self): + def stackup(self) -> Stackup: """Stackup manager. Returns @@ -955,7 +955,7 @@ def stackup(self): return self._stackup @property - def source_excitation(self): + def source_excitation(self) -> SourceExcitation: """Returns layout source excitations. Returns @@ -966,7 +966,7 @@ def source_excitation(self): return self._source_excitation @property - def materials(self): + def materials(self) -> Materials: """Material Database. Returns @@ -986,7 +986,7 @@ def materials(self): return self._materials @property - def padstacks(self): + def padstacks(self) -> Padstacks: """Returns padstack object. @@ -1009,7 +1009,7 @@ def padstacks(self): return self._padstack @property - def siwave(self): + def siwave(self) -> Siwave: """Returns SIWave object. Returns @@ -1027,7 +1027,7 @@ def siwave(self): return self._siwave @property - def hfss(self): + def hfss(self) -> Hfss: """Returns HFSS object. Returns @@ -1047,7 +1047,7 @@ def hfss(self): return self._hfss @property - def nets(self): + def nets(self) -> Nets: """Returns nets object. Returns @@ -1067,7 +1067,7 @@ def nets(self): return self._nets @property - def net_classes(self): + def net_classes(self) -> NetClass: """Returns net classes object. Returns @@ -1085,7 +1085,7 @@ def net_classes(self): return {net.name: NetClass(self, net) for net in self.active_layout.net_classes} @property - def extended_nets(self): + def extended_nets(self) -> ExtendedNets: """Returns extended nets. Returns @@ -1104,7 +1104,7 @@ def extended_nets(self): return self._extended_nets @property - def differential_pairs(self): + def differential_pairs(self) -> DifferentialPairs: """Returns differential pairs. Returns @@ -1122,7 +1122,7 @@ def differential_pairs(self): return self._differential_pairs @property - def modeler(self): + def modeler(self) -> Modeler: """Returns primitives modeler object. Returns @@ -1140,7 +1140,7 @@ def modeler(self): return self._modeler @property - def layout(self): + def layout(self) -> Layout: """Returns Layout object. Returns @@ -1150,7 +1150,7 @@ def layout(self): return Layout(self) @property - def active_layout(self): + def active_layout(self) -> Layout: """Active layout. Returns @@ -1255,7 +1255,7 @@ def point_data(self, x, y=None): return PointData(x, y) @staticmethod - def _is_file_existing_and_released(filename): + def _is_file_existing_and_released(filename) -> bool: if os.path.exists(filename): try: os.rename(filename, filename + "_") @@ -1267,13 +1267,13 @@ def _is_file_existing_and_released(filename): return False @staticmethod - def _is_file_existing(filename): + def _is_file_existing(filename) -> bool: if os.path.exists(filename): return True else: return False - def _wait_for_file_release(self, timeout=30, file_to_release=None): + def _wait_for_file_release(self, timeout=30, file_to_release=None) -> bool: if not file_to_release: file_to_release = os.path.join(self.edbpath) tstart = time.time() @@ -1303,7 +1303,7 @@ def _wait_for_file_exists(self, timeout=30, file_to_release=None, wait_count=4): times = 0 time.sleep(0.250) - def close_edb(self): + def close_edb(self) -> bool: """Close EDB and cleanup variables. Returns @@ -1318,7 +1318,7 @@ def close_edb(self): self._clean_variables() return True - def save_edb(self): + def save_edb(self) -> bool: """Save the EDB file. Returns @@ -1332,7 +1332,7 @@ def save_edb(self): self.logger.info("EDB file save time: {0:.2f}ms".format(elapsed_time * 1000.0)) return True - def save_edb_as(self, fname): + def save_edb_as(self, fname) -> bool: """Save the EDB file as another file. Parameters @@ -2306,7 +2306,7 @@ def pins_clean(pinst): self.logger.reset_timer() return [[pt.x.value, pt.y.value] for pt in _poly.without_arcs().points] - def get_conformal_polygon_from_netlist(self, netlist=None): + def get_conformal_polygon_from_netlist(self, netlist=None) -> Union[bool, Polygon]: """Returns conformal polygon data based on a netlist. Parameters @@ -2337,7 +2337,7 @@ def get_conformal_polygon_from_netlist(self, netlist=None): else: return False - def number_with_units(self, value, units=None): + def number_with_units(self, value, units=None) -> str: """Convert a number to a string with units. If value is a string, it's returned as is. Parameters @@ -2821,7 +2821,7 @@ def get_variable(self, variable_name): self.logger.info(f"Variable {variable_name} doesn't exists.") return False - def add_project_variable(self, variable_name, variable_value, description=None): + def add_project_variable(self, variable_name, variable_value, description=None) -> bool: """Add a variable to database. The variable will have the prefix `$`. Parameters @@ -2853,11 +2853,12 @@ def add_project_variable(self, variable_name, variable_value, description=None): var = self.active_db.add_variable(variable_name, variable_value) if description: self.active_db.set_variable_desc(name=variable_name, desc=description) + return var else: self.logger.error(f"Variable {variable_name} already exists.") return False - def add_design_variable(self, variable_name, variable_value, is_parameter=False, description=None): + def add_design_variable(self, variable_name, variable_value, is_parameter=False, description=None) -> bool: """Add a variable to edb. The variable can be a design one or a project variable (using ``$`` prefix). Parameters @@ -2930,7 +2931,7 @@ def change_design_variable_value(self, variable_name, variable_value): elif variable_name in self.active_cell.get_all_variable_names(): self.active_cell.set_variable_value(variable_name, GrpcValue(variable_value)) - def get_bounding_box(self): + def get_bounding_box(self) -> list[list[float, float], list[float, float]]: """Get the layout bounding box. Returns @@ -3039,7 +3040,9 @@ def are_port_reference_terminals_connected(self, common_reference=None): return True if len(iDintersection) > 0 else False @property - def setups(self): + def setups( + self, + ) -> Union[HfssSimulationSetup, SiwaveSimulationSetup, SIWaveDCIRSimulationSetup, RaptorXSimulationSetup]: """Get the dictionary of all EDB HFSS and SIwave setups. Returns @@ -3065,7 +3068,7 @@ def setups(self): return self._setups @property - def hfss_setups(self): + def hfss_setups(self) -> dict[str, HfssSimulationSetup]: """Active HFSS setup in EDB. Returns @@ -3081,7 +3084,7 @@ def hfss_setups(self): return setups @property - def siwave_dc_setups(self): + def siwave_dc_setups(self) -> dict[str, SIWaveDCIRSimulationSetup]: """Active Siwave DC IR Setups. Returns @@ -3093,7 +3096,7 @@ def siwave_dc_setups(self): return {name: i for name, i in self.setups.items() if isinstance(i, SIWaveDCIRSimulationSetup)} @property - def siwave_ac_setups(self): + def siwave_ac_setups(self) -> dict[str, SiwaveSimulationSetup]: """Active Siwave SYZ setups. Returns @@ -3103,7 +3106,9 @@ def siwave_ac_setups(self): """ return {name: i for name, i in self.setups.items() if isinstance(i, SiwaveSimulationSetup)} - def create_hfss_setup(self, name=None, start_frequency="0GHz", stop_frequency="20GHz", step_frequency="10MHz"): + def create_hfss_setup( + self, name=None, start_frequency="0GHz", stop_frequency="20GHz", step_frequency="10MHz" + ) -> HfssSimulationSetup: """Create an HFSS simulation setup from a template. . deprecated:: pyedb 0.30.0 @@ -3131,7 +3136,7 @@ def create_hfss_setup(self, name=None, start_frequency="0GHz", stop_frequency="2 step_freq=step_frequency, ) - def create_raptorx_setup(self, name=None): + def create_raptorx_setup(self, name=None) -> RaptorXSimulationSetup: """Create an RaptorX simulation setup from a template. Parameters @@ -3185,7 +3190,7 @@ def create_hfsspi_setup(self, name=None): # TODO check HFSS-PI with Grpc. seems to defined at terminal level not setup. pass - def create_siwave_syz_setup(self, name=None, **kwargs): + def create_siwave_syz_setup(self, name=None, **kwargs) -> SiwaveSimulationSetup: """Create a setup from a template. Parameters @@ -3222,7 +3227,7 @@ def create_siwave_syz_setup(self, name=None, **kwargs): setattr(setup, k, v) return self.setups[name] - def create_siwave_dc_setup(self, name=None, **kwargs): + def create_siwave_dc_setup(self, name=None, **kwargs) -> GrpcSIWaveDCIRSimulationSetup: """Create a setup from a template. Parameters @@ -3468,6 +3473,9 @@ def _get_connected_ports_from_multizone_cutout(terminal_info_dict): def create_port(self, terminal, ref_terminal=None, is_circuit_port=False, name=None): """Create a port. + ..deprecated:: 0.51.0 + Use: func:`create_port` has been move to source_excitation.create_port. + Parameters ---------- terminal : class:`pyedb.dotnet.database.edb_data.terminals.EdgeTerminal`, @@ -3490,22 +3498,16 @@ def create_port(self, terminal, ref_terminal=None, is_circuit_port=False, name=N list: [:class:`GapPort , :class:`WavePort `]. """ - from ansys.edb.core.terminal.terminal import BoundaryType as GrpcBoundaryType - - if terminal.boundary_type == "port": - terminal.boundary_type = GrpcBoundaryType.PORT - terminal.is_circuit_port = is_circuit_port - if ref_terminal: - if ref_terminal.boundary_type == "port": - ref_terminal.boundary_type = GrpcBoundaryType.PORT - terminal.reference_terminal = ref_terminal - if name: - terminal.name = name - return self.ports[terminal.name] + + warnings.warn("Use create_port from edb.source_excitation.create_port", DeprecationWarning) + return self.source_excitation.create_port(terminal, ref_terminal, is_circuit_port, name) def create_voltage_probe(self, terminal, ref_terminal): """Create a voltage probe. + ..deprecated:: 0.50.0 + Use: func:`create_voltage_probe` located in edb.source_excitation.create_voltage_probe instead. + Parameters ---------- terminal : :class:`EdgeTerminal `, @@ -3523,18 +3525,15 @@ def create_voltage_probe(self, terminal, ref_terminal): ------- :class:`Terminal ` """ - term = Terminal(self, terminal) - term.boundary_type = "voltage_probe" - - ref_term = Terminal(self, ref_terminal) - ref_term.boundary_type = "voltage_probe" - - term.ref_terminal = ref_terminal - return term + warnings.warn("Use create_voltage_probe located in edb.source_excitation instead", DeprecationWarning) + return self.source_excitation.create_voltage_probe(terminal, ref_terminal) def create_voltage_source(self, terminal, ref_terminal): """Create a voltage source. + ..deprecated:: 0.50.0 + Use: func:`create_voltage_source` located in edb.source_excitation.create_voltage_source instead. + Parameters ---------- terminal : :class:`EdgeTerminal `, @@ -3552,18 +3551,18 @@ def create_voltage_source(self, terminal, ref_terminal): ------- class:`ExcitationSources ` """ - term = Terminal(self, terminal) - term.boundary_type = "voltage_source" - - ref_term = Terminal(self, ref_terminal) - ref_term.boundary_type = "voltage_source" - - term.ref_terminal = ref_terminal - return term + warnings.warn( + "use create_voltage_source located in edb.source_excitation.create_voltage_source instead", + DeprecationWarning, + ) + return self.source_excitation.create_voltage_source(terminal, ref_terminal) def create_current_source(self, terminal, ref_terminal): """Create a current source. + ..deprecated:: 0.50.0 + Use: func:`create_current_source` located in edb.source_excitation.create_current_source instead. + Parameters ---------- terminal : :class:`EdgeTerminal `, @@ -3581,17 +3580,17 @@ def create_current_source(self, terminal, ref_terminal): ------- :class:`ExcitationSources ` """ - term = Terminal(self, terminal) - term.boundary_type = "current_source" - - ref_term = Terminal(self, ref_terminal) - ref_term.boundary_type = "current_source" - - term.ref_terminal = ref_terminal - return term + warnings.warn( + "use create_current_source located in edb.source_excitation.create_current_source instead", + DeprecationWarning, + ) + return self.source_excitation.create_current_source(terminal, ref_terminal) def get_point_terminal(self, name, net_name, location, layer): - """Place a voltage probe between two points. + """Place terminal between two points. + + ..deprecated:: 0.50.0 + Use: func:`get_point_terminal` located in edb.source_excitation.get_point_terminal instead. Parameters ---------- @@ -3608,9 +3607,11 @@ def get_point_terminal(self, name, net_name, location, layer): ------- :class:`PointTerminal ` """ - from pyedb.grpc.database.terminal.point_terminal import PointTerminal - return PointTerminal.create(layout=self.active_layout, name=name, net=net_name, layer=layer, point=location) + warnings.warn( + "use get_point_terminal located in edb.source_excitation.get_point_terminal instead", DeprecationWarning + ) + return self.source_excitation.get_point_terminal(name, net_name, location, layer) def auto_parametrize_design( self, From 487c749e361473abca83cb1a6620a93a652e9994 Mon Sep 17 00:00:00 2001 From: svandenb-dev Date: Tue, 27 May 2025 18:04:33 +0200 Subject: [PATCH 05/29] components --- src/pyedb/grpc/database/components.py | 105 ++++++++++++++------------ 1 file changed, 57 insertions(+), 48 deletions(-) diff --git a/src/pyedb/grpc/database/components.py b/src/pyedb/grpc/database/components.py index 0156a5fde7..a920b24097 100644 --- a/src/pyedb/grpc/database/components.py +++ b/src/pyedb/grpc/database/components.py @@ -28,6 +28,7 @@ import math import os import re +from typing import Union import warnings from ansys.edb.core.definition.die_property import DieOrientation as GrpDieOrientation @@ -59,7 +60,7 @@ from pyedb.modeler.geometry_operators import GeometryOperators -def resistor_value_parser(r_value): +def resistor_value_parser(r_value) -> float: """Convert a resistor value. Parameters @@ -148,7 +149,7 @@ def _db(self): return self._pedb.active_db @property - def instances(self): + def instances(self) -> dict[str, Component]: """All Cell components objects. Returns @@ -167,7 +168,7 @@ def instances(self): return self._cmp @property - def definitions(self): + def definitions(self) -> dict[str, ComponentDef]: """Retrieve component definition list. Returns @@ -176,11 +177,11 @@ def definitions(self): return {l.name: ComponentDef(self._pedb, l) for l in self._pedb.component_defs} @property - def nport_comp_definition(self): + def nport_comp_definition(self) -> dict[str, Component]: """Retrieve Nport component definition list.""" return {name: l for name, l in self.definitions.items() if l.reference_file} - def import_definition(self, file_path): + def import_definition(self, file_path) -> bool: """Import component definition from json file. Parameters @@ -214,7 +215,7 @@ def import_definition(self, file_path): pass return True - def export_definition(self, file_path): + def export_definition(self, file_path) -> bool: """Export component definitions to json file. Parameters @@ -224,6 +225,7 @@ def export_definition(self, file_path): Returns ------- + bool """ data = { @@ -262,9 +264,9 @@ def export_definition(self, file_path): with codecs.open(file_path, "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False, indent=4) - return file_path + return True - def refresh_components(self): + def refresh_components(self) -> bool: """Refresh the component dictionary.""" self._logger.info("Refreshing the Components dictionary.") self._cmp = {} @@ -299,7 +301,7 @@ def refresh_components(self): return True @property - def resistors(self): + def resistors(self) -> dict[str, Component]: """Resistors. Returns @@ -317,7 +319,7 @@ def resistors(self): return self._res @property - def capacitors(self): + def capacitors(self) -> dict[str, Component]: """Capacitors. Returns @@ -335,7 +337,7 @@ def capacitors(self): return self._cap @property - def inductors(self): + def inductors(self) -> dict[str, Component]: """Inductors. Returns @@ -354,7 +356,7 @@ def inductors(self): return self._ind @property - def ICs(self): + def ICs(self) -> dict[str, Component]: """Integrated circuits. Returns @@ -373,7 +375,7 @@ def ICs(self): return self._ics @property - def IOs(self): + def IOs(self) -> dict[str, Component]: """Circuit inupts and outputs. Returns @@ -392,7 +394,7 @@ def IOs(self): return self._ios @property - def Others(self): + def Others(self) -> dict[str, Component]: """Other core components. Returns @@ -411,7 +413,7 @@ def Others(self): return self._others @property - def components_by_partname(self): + def components_by_partname(self) -> dict[str, Component]: """Components by part name. Returns @@ -435,7 +437,7 @@ def components_by_partname(self): self._comps_by_part[val.partname] = [val] return self._comps_by_part - def get_component_by_name(self, name): + def get_component_by_name(self, name) -> Component: """Retrieve a component by name. Parameters @@ -451,7 +453,7 @@ def get_component_by_name(self, name): """ return self.instances[name] - def get_pin_from_component(self, component, net_name=None, pin_name=None): + def get_pin_from_component(self, component, net_name=None, pin_name=None) -> list: """Return component pins. Parameters ---------- @@ -479,7 +481,7 @@ def get_pin_from_component(self, component, net_name=None, pin_name=None): pins = [pin for pin in pins if pin.name == pin_name] return pins - def get_components_from_nets(self, netlist=None): + def get_components_from_nets(self, netlist=None) -> list[Component]: """Retrieve components from a net list. Parameters @@ -609,7 +611,7 @@ def get_component_placement_vector( self._logger.warning("Failed to compute vector.") return False, [0, 0], 0, 0 - def get_solder_ball_height(self, cmp): + def get_solder_ball_height(self, cmp) -> float: """Get component solder ball height. Parameters @@ -627,7 +629,7 @@ def get_solder_ball_height(self, cmp): cmp = self.get_component_by_name(cmp) return cmp.solder_ball_height - def get_vendor_libraries(self): + def get_vendor_libraries(self) -> ComponentLib: """Retrieve all capacitors and inductors libraries from ANSYS installation (used by Siwave). Returns @@ -915,7 +917,7 @@ def replace_rlc_by_gap_boundaries(self, component=None): component.enabled = False return self._pedb.source_excitation.add_rlc_boundary(component.refdes, False) - def deactivate_rlc_component(self, component=None, create_circuit_port=False, pec_boundary=False): + def deactivate_rlc_component(self, component=None, create_circuit_port=False, pec_boundary=False) -> bool: """Deactivate RLC component with a possibility to convert it to a circuit port. Parameters @@ -1056,7 +1058,7 @@ def _create_pin_group_terminal(self, pingroup, isref=False, term_name=None, term pingroup=pingroup, term_name=term_name, term_type=term_type, isref=isref ) - def _is_top_component(self, cmp): + def _is_top_component(self, cmp) -> bool: """Test the component placement layer. Parameters @@ -1112,7 +1114,7 @@ def create( c_value=None, l_value=None, is_parallel=False, - ): + ) -> bool: """Create a component from pins. Parameters @@ -1221,7 +1223,7 @@ def create( def create_component_from_pins( self, pins, component_name, placement_layer=None, component_part_name=None - ): # pragma: no cover + ) -> bool: # pragma: no cover """Create a component from pins. .. deprecated:: 0.6.62 @@ -1261,7 +1263,7 @@ def create_component_from_pins( is_rlc=False, ) - def set_component_model(self, componentname, model_type="Spice", modelpath=None, modelname=None): + def set_component_model(self, componentname, model_type="Spice", modelpath=None, modelname=None) -> bool: """Assign a Spice or Touchstone model to a component. Parameters @@ -1340,7 +1342,7 @@ def set_component_model(self, componentname, model_type="Spice", modelpath=None, component.component_property.model = s_parameter_mod return True - def create_pingroup_from_pins(self, pins, group_name=None): + def create_pingroup_from_pins(self, pins, group_name=None) -> Union[PinGroup, bool]: """Create a pin group on a component. Parameters @@ -1353,8 +1355,7 @@ def create_pingroup_from_pins(self, pins, group_name=None): Returns ------- - tuple - The tuple is structured as: (bool, pingroup). + pingroup object. Examples -------- @@ -1395,7 +1396,7 @@ def create_pingroup_from_pins(self, pins, group_name=None): pin_group.net = pins[0].net return pin_group - def delete_single_pin_rlc(self, deactivate_only=False): + def delete_single_pin_rlc(self, deactivate_only=False) -> list[Component]: # type: (bool) -> list """Delete all RLC components with a single pin. Single pin component model type will be reverted to ``"RLC"``. @@ -1435,7 +1436,7 @@ def delete_single_pin_rlc(self, deactivate_only=False): self._pedb.logger.info("Deleted {} components".format(len(deleted_comps))) return deleted_comps - def delete(self, component_name): + def delete(self, component_name) -> bool: """Delete a component. Parameters @@ -1464,7 +1465,7 @@ def delete(self, component_name): return True return False - def disable_rlc_component(self, component_name): + def disable_rlc_component(self, component_name) -> bool: """Disable a RLC component. Parameters @@ -1512,7 +1513,7 @@ def set_solder_ball( reference_size_x=0, reference_size_y=0, reference_height=0, - ): + ) -> bool: """Set cylindrical solder balls on a given component. Parameters @@ -1610,7 +1611,7 @@ def set_component_rlc( ind_value=None, cap_value=None, isparallel=False, - ): + ) -> bool: """Update values for an RLC component. Parameters @@ -1689,7 +1690,7 @@ def update_rlc_from_bom( valuefield="Func des", comptype="Prod name", refdes="Pos / Place", - ): + ) -> bool: """Update the EDC core component values (RLCs) with values coming from a BOM file. Parameters @@ -1759,7 +1760,7 @@ def import_bom( part_name_col=1, comp_type_col=2, value_col=3, - ): + ) -> bool: """Load external BOM file. Parameters @@ -1839,7 +1840,7 @@ def import_bom( self.instances[comp].enabled = False return True - def export_bom(self, bom_file, delimiter=","): + def export_bom(self, bom_file, delimiter=",") -> bool: """Export Bom file from layout. Parameters @@ -1848,6 +1849,10 @@ def export_bom(self, bom_file, delimiter=","): Full path to the BOM file, which is a delimited text file. delimiter : str, optional Value to use for the delimiter. The default is ``","``. + + Returns + ------- + bool """ with open(bom_file, "w") as f: f.writelines([delimiter.join(["RefDes", "Part name", "Type", "Value\n"])]) @@ -1869,17 +1874,21 @@ def export_bom(self, bom_file, delimiter=","): f.writelines([delimiter.join([refdes, part_name, comp_type, value + "\n"])]) return True - def find_by_reference_designator(self, reference_designator): + def find_by_reference_designator(self, reference_designator) -> Component: """Find a component. Parameters ---------- reference_designator : str Reference designator of the component. + + Returns + ------- + Component object. """ return self.instances[reference_designator] - def get_aedt_pin_name(self, pin): + def get_aedt_pin_name(self, pin) -> str: """Retrieve the pin name that is shown in AEDT. .. note:: @@ -1919,7 +1928,7 @@ def get_pins(self, reference_designator, net_name=None, pin_name=None): Returns ------- - + list of PadstackInstance object. """ comp = self.find_by_reference_designator(reference_designator) @@ -1932,7 +1941,7 @@ def get_pins(self, reference_designator, net_name=None, pin_name=None): return pins - def get_pin_position(self, pin): + def get_pin_position(self, pin) -> list[float, float]: """Retrieve the pin position in meters. Parameters @@ -1961,7 +1970,7 @@ def get_pin_position(self, pin): transformed_pt_pos = pin.component.transform.transform_point(pt_pos) return [transformed_pt_pos[0].value, transformed_pt_pos[1].value] - def get_pins_name_from_net(self, net_name, pin_list=None): + def get_pins_name_from_net(self, net_name, pin_list=None) -> list[str]: """Retrieve pins belonging to a net. Parameters @@ -1996,7 +2005,7 @@ def get_pins_name_from_net(self, net_name, pin_list=None): pin_names.append(self.get_aedt_pin_name(pin)) return pin_names - def get_nets_from_pin_list(self, pins): + def get_nets_from_pin_list(self, pins) -> list[str]: """Retrieve nets with one or more pins. Parameters @@ -2019,7 +2028,7 @@ def get_nets_from_pin_list(self, pins): """ return list(set([pin.net.name for pin in pins])) - def get_component_net_connection_info(self, refdes): + def get_component_net_connection_info(self, refdes) -> Component: """Retrieve net connection information. Parameters @@ -2051,7 +2060,7 @@ def get_component_net_connection_info(self, refdes): data["net_name"].append(net_name) return data - def get_rats(self): + def get_rats(self) -> list[dict[str, str]]: """Retrieve a list of dictionaries of the reference designator, pin names, and net names. Returns @@ -2074,7 +2083,7 @@ def get_rats(self): df_list.append(df) return df_list - def get_through_resistor_list(self, threshold=1): + def get_through_resistor_list(self, threshold=1) -> list[Component]: """Retrieve through resistors. Parameters @@ -2108,7 +2117,7 @@ def get_through_resistor_list(self, threshold=1): return through_comp_list - def short_component_pins(self, component_name, pins_to_short=None, width=1e-3): + def short_component_pins(self, component_name, pins_to_short=None, width=1e-3) -> bool: """Short pins of component with a trace. Parameters @@ -2248,7 +2257,7 @@ def short_component_pins(self, component_name, pins_to_short=None, width=1e-3): i += 1 return True - def create_pin_group(self, reference_designator, pin_numbers, group_name=None): + def create_pin_group(self, reference_designator, pin_numbers, group_name=None) -> Union[tuple[str, PinGroup], bool]: """Create pin group on the component. Parameters @@ -2288,7 +2297,7 @@ def create_pin_group(self, reference_designator, pin_numbers, group_name=None): return group_name, PinGroup(self._pedb, pingroup) return False - def create_pin_group_on_net(self, reference_designator, net_name, group_name=None): + def create_pin_group_on_net(self, reference_designator, net_name, group_name=None) -> PinGroup: """Create pin group on component by net name. Parameters From fa081d3fd05799c1bf7129292dff035db45c7d99 Mon Sep 17 00:00:00 2001 From: svandenb-dev Date: Tue, 27 May 2025 18:06:28 +0200 Subject: [PATCH 06/29] definitions --- src/pyedb/grpc/database/definitions.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/pyedb/grpc/database/definitions.py b/src/pyedb/grpc/database/definitions.py index 536313cb22..d3a815889f 100644 --- a/src/pyedb/grpc/database/definitions.py +++ b/src/pyedb/grpc/database/definitions.py @@ -20,6 +20,8 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +from typing import Union + from ansys.edb.core.geometry.polygon_data import PolygonData as GrpcPolygonData from pyedb.grpc.database.definition.component_def import ComponentDef @@ -31,16 +33,16 @@ def __init__(self, pedb): self._pedb = pedb @property - def component(self): + def component(self) -> dict[str, ComponentDef]: """Component definitions""" return {l.name: ComponentDef(self._pedb, l) for l in self._pedb.active_db.component_defs} @property - def package(self): + def package(self) -> dict[str, PackageDef]: """Package definitions.""" return {l.name: PackageDef(self._pedb, l) for l in self._pedb.active_db.package_defs} - def add_package_def(self, name, component_part_name=None, boundary_points=None): + def add_package_def(self, name, component_part_name=None, boundary_points=None) -> Union[PackageDef, bool]: """Add a package definition. Parameters @@ -54,7 +56,7 @@ def add_package_def(self, name, component_part_name=None, boundary_points=None): Returns ------- - + PackageDef object. """ if not name in self.package: package_def = PackageDef.create(self._pedb.active_db, name=name) From cc14ca5b1b7e2141fde7f42b40d62355576302de Mon Sep 17 00:00:00 2001 From: svandenb-dev Date: Tue, 27 May 2025 18:09:19 +0200 Subject: [PATCH 07/29] hfss --- src/pyedb/grpc/database/hfss.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pyedb/grpc/database/hfss.py b/src/pyedb/grpc/database/hfss.py index dc0e5d6395..3b48924e69 100644 --- a/src/pyedb/grpc/database/hfss.py +++ b/src/pyedb/grpc/database/hfss.py @@ -43,7 +43,7 @@ def __init__(self, p_edb): self._pedb = p_edb @property - def hfss_extent_info(self): + def hfss_extent_info(self) -> HfssExtentInfo: """HFSS extent information.""" return HfssExtentInfo(self._pedb) @@ -1207,7 +1207,7 @@ def add_setup( stop_freq=20e9, step_freq=1e6, discrete_sweep=False, - ): + ) -> HfssSimulationSetup: """Add a HFSS analysis to EDB. Parameters From 0ba9d009a3953e78e493394aa3254474567a7926 Mon Sep 17 00:00:00 2001 From: svandenb-dev Date: Tue, 27 May 2025 18:11:50 +0200 Subject: [PATCH 08/29] layout validation --- src/pyedb/grpc/database/layout_validation.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/pyedb/grpc/database/layout_validation.py b/src/pyedb/grpc/database/layout_validation.py index e1a11c1793..c9cf9dfe4c 100644 --- a/src/pyedb/grpc/database/layout_validation.py +++ b/src/pyedb/grpc/database/layout_validation.py @@ -37,7 +37,7 @@ def __init__(self, pedb): self._pedb = pedb self._layout_instance = self._pedb.layout_instance - def dc_shorts(self, net_list=None, fix=False): + def dc_shorts(self, net_list=None, fix=False) -> list[list[str, str]]: """Find DC shorts on layout. Parameters @@ -130,7 +130,7 @@ def disjoint_nets( clean_disjoints_less_than=0.0, order_by_area=False, keep_disjoint_pins=False, - ): + ) -> list[str]: """Find and fix disjoint nets from a given netlist. Parameters @@ -263,7 +263,7 @@ def area_calc(elem): return new_nets - def fix_self_intersections(self, net_list=None): + def fix_self_intersections(self, net_list=None) -> bool: """Find and fix self intersections from a given netlist. Parameters @@ -306,7 +306,7 @@ def illegal_net_names(self, fix=False): self._pedb._logger.info("Found {} illegal net names.".format(len(renamed_nets))) return - def illegal_rlc_values(self, fix=False): + def illegal_rlc_values(self, fix=False) -> list[str]: """Find and fix RLC illegal values.""" inductors = self._pedb.components.inductors @@ -318,7 +318,7 @@ def illegal_rlc_values(self, fix=False): if fix: v.rlc_values = [0, 1, 0] self._pedb._logger.info(f"Found {len(temp)} inductors have no value.") - return + return temp def padstacks_no_name(self, fix=False): pds = self._pedb.layout.padstack_instances From 9d0859f8bdf5134a8f7dbc5a3ac36eba8de43fa7 Mon Sep 17 00:00:00 2001 From: svandenb-dev Date: Wed, 4 Jun 2025 17:01:10 +0200 Subject: [PATCH 09/29] components returned typing --- .../database/edb_data/padstacks_data.py | 13 +++++++++ .../grpc/database/definition/component_def.py | 27 ++++++++++--------- .../database/primitive/padstack_instance.py | 13 +++++++++ tests/grpc/system/test_edb_padstacks.py | 10 +++++++ tests/legacy/system/test_edb_padstacks.py | 10 +++++++ 5 files changed, 61 insertions(+), 12 deletions(-) diff --git a/src/pyedb/dotnet/database/edb_data/padstacks_data.py b/src/pyedb/dotnet/database/edb_data/padstacks_data.py index 57e5273a2b..4404b3b4ea 100644 --- a/src/pyedb/dotnet/database/edb_data/padstacks_data.py +++ b/src/pyedb/dotnet/database/edb_data/padstacks_data.py @@ -1185,6 +1185,7 @@ def __init__(self, edb_padstackinstance, _pedb): super().__init__(_pedb, edb_padstackinstance) self._edb_padstackinstance = self._edb_object self._bounding_box = [] + self._side_number = None self._object_instance = None self._position = [] self._pdef = None @@ -1929,6 +1930,18 @@ def top_bottom_association(self): """ return int(self._edb_padstackinstance.GetGroup().GetPlacementLayer().GetTopBottomAssociation()) + @property + def side_number(self) -> float: + if not self._side_number: + prop_string = "$begin ''\n\tsid=3\n\tmat='copper'\n\tvs='Wirebond'\n$end ''\n" + self._edb_padstackinstance.SetProductProperty(self._pedb._edb.ProductId.Designer, 21, prop_string) + self._side_number = self._edb_padstackinstance.GetProductProperty(self._pedb._edb.ProductId.Designer, 21) + return self._side_number + + @side_number.setter + def side_number(self, value): + self._side_number = self._edb_padstackinstance.GetProductProperty(self._pedb._edb.ProductId.Designer, 21, value) + def create_rectangle_in_pad(self, layer_name, return_points=False, partition_max_order=16): """Create a rectangle inscribed inside a padstack instance pad. diff --git a/src/pyedb/grpc/database/definition/component_def.py b/src/pyedb/grpc/database/definition/component_def.py index b24d79d4b3..cd2cd571d5 100644 --- a/src/pyedb/grpc/database/definition/component_def.py +++ b/src/pyedb/grpc/database/definition/component_def.py @@ -44,7 +44,7 @@ def __init__(self, pedb, edb_object): self._pedb = pedb @property - def part_name(self): + def part_name(self) -> str: """Component definition name. Returns @@ -60,7 +60,7 @@ def part_name(self, name): self.name = name @property - def type(self): + def type(self) -> str: """Component definition type. Returns @@ -97,28 +97,28 @@ def type(self, value): return @property - def components(self): + def components(self) -> dict[str, Component]: """Component instances belonging to the definition. Returns ------- - Dict : [str, :class:`Component `] + dict[str, :class:`Component `] """ comp_list = [Component(self._pedb, l) for l in Component.find_by_def(self._pedb.active_layout, self.part_name)] return {comp.refdes: comp for comp in comp_list} @property - def component_pins(self): + def component_pins(self) -> list[ComponentPin]: """Component pins. Returns ------- - List[:class:`ComponentPin `] + list[:class:`ComponentPin `] """ return [ComponentPin(self._pedb, pin) for pin in super().component_pins] - def assign_rlc_model(self, res=None, ind=None, cap=None, is_parallel=False): + def assign_rlc_model(self, res=None, ind=None, cap=None, is_parallel=False) -> bool: """Assign RLC to all components under this part name. Parameters @@ -142,16 +142,19 @@ def assign_rlc_model(self, res=None, ind=None, cap=None, is_parallel=False): comp.assign_rlc_model(res, ind, cap, is_parallel) return True - def assign_s_param_model(self, file_path, model_name=None, reference_net=None): + def assign_s_param_model(self, file_path, model_name=None, reference_net=None) -> bool: """Assign S-parameter to all components under this part name. Parameters ---------- file_path : str File path of the S-parameter model. - name : str, optional + model_name : str, optional Name of the S-parameter model. + reference_net : str, optional + Name of the reference net. + Returns ------- bool @@ -161,19 +164,19 @@ def assign_s_param_model(self, file_path, model_name=None, reference_net=None): comp.assign_s_param_model(file_path, model_name, reference_net) return True - def assign_spice_model(self, file_path, model_name=None): + def assign_spice_model(self, file_path, model_name=None) -> bool: """Assign Spice model to all components under this part name. Parameters ---------- file_path : str File path of the Spice model. - name : str, optional + model_name : str, optional Name of the Spice model. Returns ------- - + bool """ for comp in list(self.components.values()): comp.assign_spice_model(file_path, model_name) diff --git a/src/pyedb/grpc/database/primitive/padstack_instance.py b/src/pyedb/grpc/database/primitive/padstack_instance.py index 1215ceb1ed..7ad9c3b9c3 100644 --- a/src/pyedb/grpc/database/primitive/padstack_instance.py +++ b/src/pyedb/grpc/database/primitive/padstack_instance.py @@ -62,6 +62,7 @@ def __init__(self, pedb, edb_instance): self._edb_object = edb_instance self._bounding_box = [] self._position = [] + self._side_number = None self._pdef = None self._pedb = pedb self._object_instance = None @@ -671,6 +672,18 @@ def aedt_name(self): def aedt_name(self, value): self.set_product_property(GrpcProductIdType.DESIGNER, 11, value) + @property + def side_number(self) -> float: + if not self._side_number: + prop_string = "$begin ''\n\tsid=3\n\tmat='copper'\n\tvs='Wirebond'\n$end ''\n" + self.set_product_property(GrpcProductIdType.HFSS_3D_LAYOUT, 21, prop_string) + self._side_number = self.get_product_property(GrpcProductIdType.HFSS_3D_LAYOUT, 21) + return self._side_number + + @side_number.setter + def side_number(self, value): + self._side_number = self.set_product_property(GrpcProductIdType.HFSS_3D_LAYOUT, 21, value) + def get_backdrill_type(self, from_bottom=True): """Return backdrill type Parameters diff --git a/tests/grpc/system/test_edb_padstacks.py b/tests/grpc/system/test_edb_padstacks.py index 18c83a9ef9..61437cf3c5 100644 --- a/tests/grpc/system/test_edb_padstacks.py +++ b/tests/grpc/system/test_edb_padstacks.py @@ -538,3 +538,13 @@ def test_via_merge3(self): assert edbapp.padstacks.instances[merged_via[0]].start_layer == "layer1" assert edbapp.padstacks.instances[merged_via[0]].stop_layer == "layer2" edbapp.close() + + def test_padstack_instance_side_number(self, edb_examples): + edb = edb_examples.get_si_verse() + inst = list(edb.padstacks.instances.values())[0] + for _, inst in edb.padstacks.instances.items(): + inst.side_number + inst.side_number = 12 + assert inst.side_number == 3 + inst.side_number = 10 + assert inst.side_number == 10 diff --git a/tests/legacy/system/test_edb_padstacks.py b/tests/legacy/system/test_edb_padstacks.py index a09d002922..37e8a7563a 100644 --- a/tests/legacy/system/test_edb_padstacks.py +++ b/tests/legacy/system/test_edb_padstacks.py @@ -549,3 +549,13 @@ def _assert_inside(rect, pad): assert math.isclose( round(result[0].Area(), 4), round(rect.Area(), 4) ), f"{BASE_MESSAGE} area of intersection is not equal to rectangle area" + + +def test_padstack_instance_side_number(edb_examples): + edb = edb_examples.get_si_verse() + for _, inst in edb.padstacks.instances.items(): + inst.side_number = 12 + inst = list(edb.padstacks.instances.values())[0] + assert inst.side_number == 3 + inst.side_number = 10 + assert inst.side_number == 10 From e31dff32cf259c9cd850353621b18e638cb85a81 Mon Sep 17 00:00:00 2001 From: svandenb-dev Date: Mon, 23 Jun 2025 17:07:52 +0200 Subject: [PATCH 10/29] temp --- doc/source/api/SimulationConfigurationV2.rst | 155 ------------------ doc/source/api/database/components.rst | 12 ++ doc/source/api/database/control_file.rst | 31 ++++ doc/source/api/database/definitions.rst | 12 ++ doc/source/api/database/hfss.rst | 15 ++ doc/source/api/database/index.rst | 23 +++ doc/source/api/database/layout_validation.rst | 14 ++ .../modeler.rst} | 9 +- doc/source/api/database/net/index.rst | 14 ++ .../SourceData.rst => database/nets.rst} | 8 +- doc/source/api/database/padstacks.rst | 12 ++ .../pyedb_lib/definition/component_def.rst | 12 ++ .../database/pyedb_lib/definition/index.rst | 15 ++ .../pyedb_lib/definition/materials.rst | 14 ++ .../pyedb_lib/definition/package_def.rst | 12 ++ .../pyedb_lib/definition/padstack_def.rst | 13 ++ .../database/pyedb_lib/geometry/arc_data.rst | 12 ++ .../api/database/pyedb_lib/geometry/index.rst | 15 ++ .../pyedb_lib/geometry/point_3d_data.rst | 12 ++ .../pyedb_lib/geometry/point_data.rst | 12 ++ .../pyedb_lib/geometry/polygon_data.rst | 12 ++ .../pyedb_lib/hierarchy/component.rst | 13 ++ .../database/pyedb_lib/hierarchy/index.rst | 18 ++ .../database/pyedb_lib/hierarchy/model.rst | 12 ++ .../pyedb_lib/hierarchy/netlist_model.rst | 12 ++ .../pyedb_lib/hierarchy/pin_pair_model.rst | 12 ++ .../database/pyedb_lib/hierarchy/pingroup.rst | 12 ++ .../pyedb_lib/hierarchy/s_parameter_model.rst | 12 ++ .../pyedb_lib/hierarchy/spice_model.rst | 12 ++ doc/source/api/database/pyedb_lib/index.rst | 23 +++ .../api/database/pyedb_lib/layers/index.rst | 12 ++ .../api/database/pyedb_lib/layers/layer.rst | 12 ++ .../pyedb_lib/layers/stackup_layer.rst | 12 ++ .../api/database/pyedb_lib/layout/cell.rst | 12 ++ .../api/database/pyedb_lib/layout/index.rst | 13 ++ .../api/database/pyedb_lib/layout/layout.rst | 12 ++ .../pyedb_lib/layout/voltage_regulator.rst | 13 ++ .../pyedb_lib/net/differential_pair.rst | 13 ++ .../database/pyedb_lib/net/extended_net.rst | 13 ++ .../api/database/pyedb_lib/net/index.rst | 14 ++ doc/source/api/database/pyedb_lib/net/net.rst | 12 ++ .../api/database/pyedb_lib/net/net_class.rst | 12 ++ .../api/database/pyedb_lib/ports/index.rst | 11 ++ .../api/database/pyedb_lib/ports/ports.rst | 17 ++ .../database/pyedb_lib/primitive/bondwire.rst | 13 ++ .../database/pyedb_lib/primitive/circle.rst | 13 ++ .../database/pyedb_lib/primitive/index.rst | 17 ++ .../pyedb_lib/primitive/padstack_instance.rst | 13 ++ .../api/database/pyedb_lib/primitive/path.rst | 13 ++ .../database/pyedb_lib/primitive/polygon.rst | 13 ++ .../pyedb_lib/primitive/primitive.rst | 13 ++ .../pyedb_lib/primitive/rectangle.rst | 13 ++ .../simulation_setup/adaptive_frequency.rst | 13 ++ .../hfss_advanced_meshing_settings.rst | 13 ++ .../hfss_advanced_settings.rst | 13 ++ .../simulation_setup/hfss_dcr_settings.rst | 13 ++ .../hfss_general_settings.rst | 13 ++ .../hfss_settings_options.rst | 13 ++ .../hfss_simulation_settings.rst | 13 ++ .../hfss_simulation_setup.rst | 13 ++ .../simulation_setup/hfss_solver_settings.rst | 13 ++ .../pyedb_lib/simulation_setup/index.rst | 26 +++ .../simulation_setup/mesh_operation.rst | 13 ++ .../raptor_x_advanced_settings.rst | 12 ++ .../raptor_x_general_settings.rst | 12 ++ .../raptor_x_simulation_settings.rst | 12 ++ .../raptor_x_simulation_setup.rst | 12 ++ .../siwave_dcir_simulation_setup.rst | 12 ++ .../siwave_simulation_setup.rst | 12 ++ .../pyedb_lib/simulation_setup/sweep_data.rst | 12 ++ .../pyedb_lib/terminal/bundle_terminal.rst | 13 ++ .../pyedb_lib/terminal/edge_terminal.rst | 13 ++ .../api/database/pyedb_lib/terminal/index.rst | 16 ++ .../terminal/padstack_instance_terminal.rst | 13 ++ .../pyedb_lib/terminal/pingroup_terminal.rst | 13 ++ .../pyedb_lib/terminal/point_terminal.rst | 13 ++ .../database/pyedb_lib/terminal/terminal.rst | 13 ++ .../database/pyedb_lib/utility/heat_sink.rst | 13 ++ .../pyedb_lib/utility/hfss_extent_info.rst} | 5 +- .../api/database/pyedb_lib/utility/index.rst | 17 ++ .../pyedb_lib/utility/layout_statistics.rst | 13 ++ .../api/database/pyedb_lib/utility/rlc.rst | 13 ++ .../database/pyedb_lib/utility/sources.rst | 18 ++ .../pyedb_lib/utility/xml_control_file.rst} | 12 +- doc/source/api/database/siwave.rst | 12 ++ .../api/database/source_excitations.rst | 12 ++ doc/source/api/database/stackup.rst | 13 ++ doc/source/api/dotnet/SiWave.rst | 35 ---- doc/source/api/dotnet/edb_data/EdbValue.rst | 12 -- doc/source/api/dotnet/edb_data/LayerData.rst | 29 ---- doc/source/api/dotnet/edb_data/NetData.rst | 32 ---- .../api/dotnet/edb_data/PadstackData.rst | 17 -- doc/source/api/dotnet/edb_data/PortsData.rst | 26 --- .../edb_data/RaptorXSimulationSetup.rst | 15 -- doc/source/api/dotnet/edb_data/Utilities.rst | 12 -- doc/source/api/dotnet/edb_data/Variables.rst | 12 -- doc/source/api/dotnet/edb_data/index.rst | 22 --- .../data/adaptive_frequency_data.rst | 15 -- .../api/dotnet/sim_setup_data/data/index.rst | 17 -- .../sim_setup_data/data/mesh_operation.rst | 18 -- .../dotnet/sim_setup_data/data/settings.rst | 22 --- .../sim_setup_data/data/sim_setup_info.rst | 15 -- .../data/simulation_settings.rst | 18 -- .../data/siw_dc_ir_settings.rst | 15 -- .../dotnet/sim_setup_data/data/sweep_data.rst | 15 -- .../api/dotnet/sim_setup_data/io/index.rst | 10 -- .../api/dotnet/sim_setup_data/io/siwave.rst | 18 -- doc/source/api/dotnet/utilities/heatsink.rst | 15 -- .../utilities/hfss_simulation_setup.rst | 16 -- doc/source/api/dotnet/utilities/index.rst | 14 -- .../api/dotnet/utilities/simulation_setup.rst | 17 -- .../utilities/siwave_simulation_setup.rst | 16 -- .../api/{dotnet/CoreEdb.rst => edb.rst} | 28 +--- doc/source/api/index.rst | 13 +- 114 files changed, 1148 insertions(+), 654 deletions(-) delete mode 100644 doc/source/api/SimulationConfigurationV2.rst create mode 100644 doc/source/api/database/components.rst create mode 100644 doc/source/api/database/control_file.rst create mode 100644 doc/source/api/database/definitions.rst create mode 100644 doc/source/api/database/hfss.rst create mode 100644 doc/source/api/database/index.rst create mode 100644 doc/source/api/database/layout_validation.rst rename doc/source/api/{dotnet/edb_data/PrimitivesData.rst => database/modeler.rst} (75%) create mode 100644 doc/source/api/database/net/index.rst rename doc/source/api/{dotnet/edb_data/SourceData.rst => database/nets.rst} (70%) create mode 100644 doc/source/api/database/padstacks.rst create mode 100644 doc/source/api/database/pyedb_lib/definition/component_def.rst create mode 100644 doc/source/api/database/pyedb_lib/definition/index.rst create mode 100644 doc/source/api/database/pyedb_lib/definition/materials.rst create mode 100644 doc/source/api/database/pyedb_lib/definition/package_def.rst create mode 100644 doc/source/api/database/pyedb_lib/definition/padstack_def.rst create mode 100644 doc/source/api/database/pyedb_lib/geometry/arc_data.rst create mode 100644 doc/source/api/database/pyedb_lib/geometry/index.rst create mode 100644 doc/source/api/database/pyedb_lib/geometry/point_3d_data.rst create mode 100644 doc/source/api/database/pyedb_lib/geometry/point_data.rst create mode 100644 doc/source/api/database/pyedb_lib/geometry/polygon_data.rst create mode 100644 doc/source/api/database/pyedb_lib/hierarchy/component.rst create mode 100644 doc/source/api/database/pyedb_lib/hierarchy/index.rst create mode 100644 doc/source/api/database/pyedb_lib/hierarchy/model.rst create mode 100644 doc/source/api/database/pyedb_lib/hierarchy/netlist_model.rst create mode 100644 doc/source/api/database/pyedb_lib/hierarchy/pin_pair_model.rst create mode 100644 doc/source/api/database/pyedb_lib/hierarchy/pingroup.rst create mode 100644 doc/source/api/database/pyedb_lib/hierarchy/s_parameter_model.rst create mode 100644 doc/source/api/database/pyedb_lib/hierarchy/spice_model.rst create mode 100644 doc/source/api/database/pyedb_lib/index.rst create mode 100644 doc/source/api/database/pyedb_lib/layers/index.rst create mode 100644 doc/source/api/database/pyedb_lib/layers/layer.rst create mode 100644 doc/source/api/database/pyedb_lib/layers/stackup_layer.rst create mode 100644 doc/source/api/database/pyedb_lib/layout/cell.rst create mode 100644 doc/source/api/database/pyedb_lib/layout/index.rst create mode 100644 doc/source/api/database/pyedb_lib/layout/layout.rst create mode 100644 doc/source/api/database/pyedb_lib/layout/voltage_regulator.rst create mode 100644 doc/source/api/database/pyedb_lib/net/differential_pair.rst create mode 100644 doc/source/api/database/pyedb_lib/net/extended_net.rst create mode 100644 doc/source/api/database/pyedb_lib/net/index.rst create mode 100644 doc/source/api/database/pyedb_lib/net/net.rst create mode 100644 doc/source/api/database/pyedb_lib/net/net_class.rst create mode 100644 doc/source/api/database/pyedb_lib/ports/index.rst create mode 100644 doc/source/api/database/pyedb_lib/ports/ports.rst create mode 100644 doc/source/api/database/pyedb_lib/primitive/bondwire.rst create mode 100644 doc/source/api/database/pyedb_lib/primitive/circle.rst create mode 100644 doc/source/api/database/pyedb_lib/primitive/index.rst create mode 100644 doc/source/api/database/pyedb_lib/primitive/padstack_instance.rst create mode 100644 doc/source/api/database/pyedb_lib/primitive/path.rst create mode 100644 doc/source/api/database/pyedb_lib/primitive/polygon.rst create mode 100644 doc/source/api/database/pyedb_lib/primitive/primitive.rst create mode 100644 doc/source/api/database/pyedb_lib/primitive/rectangle.rst create mode 100644 doc/source/api/database/pyedb_lib/simulation_setup/adaptive_frequency.rst create mode 100644 doc/source/api/database/pyedb_lib/simulation_setup/hfss_advanced_meshing_settings.rst create mode 100644 doc/source/api/database/pyedb_lib/simulation_setup/hfss_advanced_settings.rst create mode 100644 doc/source/api/database/pyedb_lib/simulation_setup/hfss_dcr_settings.rst create mode 100644 doc/source/api/database/pyedb_lib/simulation_setup/hfss_general_settings.rst create mode 100644 doc/source/api/database/pyedb_lib/simulation_setup/hfss_settings_options.rst create mode 100644 doc/source/api/database/pyedb_lib/simulation_setup/hfss_simulation_settings.rst create mode 100644 doc/source/api/database/pyedb_lib/simulation_setup/hfss_simulation_setup.rst create mode 100644 doc/source/api/database/pyedb_lib/simulation_setup/hfss_solver_settings.rst create mode 100644 doc/source/api/database/pyedb_lib/simulation_setup/index.rst create mode 100644 doc/source/api/database/pyedb_lib/simulation_setup/mesh_operation.rst create mode 100644 doc/source/api/database/pyedb_lib/simulation_setup/raptor_x_advanced_settings.rst create mode 100644 doc/source/api/database/pyedb_lib/simulation_setup/raptor_x_general_settings.rst create mode 100644 doc/source/api/database/pyedb_lib/simulation_setup/raptor_x_simulation_settings.rst create mode 100644 doc/source/api/database/pyedb_lib/simulation_setup/raptor_x_simulation_setup.rst create mode 100644 doc/source/api/database/pyedb_lib/simulation_setup/siwave_dcir_simulation_setup.rst create mode 100644 doc/source/api/database/pyedb_lib/simulation_setup/siwave_simulation_setup.rst create mode 100644 doc/source/api/database/pyedb_lib/simulation_setup/sweep_data.rst create mode 100644 doc/source/api/database/pyedb_lib/terminal/bundle_terminal.rst create mode 100644 doc/source/api/database/pyedb_lib/terminal/edge_terminal.rst create mode 100644 doc/source/api/database/pyedb_lib/terminal/index.rst create mode 100644 doc/source/api/database/pyedb_lib/terminal/padstack_instance_terminal.rst create mode 100644 doc/source/api/database/pyedb_lib/terminal/pingroup_terminal.rst create mode 100644 doc/source/api/database/pyedb_lib/terminal/point_terminal.rst create mode 100644 doc/source/api/database/pyedb_lib/terminal/terminal.rst create mode 100644 doc/source/api/database/pyedb_lib/utility/heat_sink.rst rename doc/source/api/{dotnet/edb_data/HfssExtentInfo.rst => database/pyedb_lib/utility/hfss_extent_info.rst} (50%) create mode 100644 doc/source/api/database/pyedb_lib/utility/index.rst create mode 100644 doc/source/api/database/pyedb_lib/utility/layout_statistics.rst create mode 100644 doc/source/api/database/pyedb_lib/utility/rlc.rst create mode 100644 doc/source/api/database/pyedb_lib/utility/sources.rst rename doc/source/api/{dotnet/XmlControlFile.rst => database/pyedb_lib/utility/xml_control_file.rst} (59%) create mode 100644 doc/source/api/database/siwave.rst create mode 100644 doc/source/api/database/source_excitations.rst create mode 100644 doc/source/api/database/stackup.rst delete mode 100644 doc/source/api/dotnet/SiWave.rst delete mode 100644 doc/source/api/dotnet/edb_data/EdbValue.rst delete mode 100644 doc/source/api/dotnet/edb_data/LayerData.rst delete mode 100644 doc/source/api/dotnet/edb_data/NetData.rst delete mode 100644 doc/source/api/dotnet/edb_data/PadstackData.rst delete mode 100644 doc/source/api/dotnet/edb_data/PortsData.rst delete mode 100644 doc/source/api/dotnet/edb_data/RaptorXSimulationSetup.rst delete mode 100644 doc/source/api/dotnet/edb_data/Utilities.rst delete mode 100644 doc/source/api/dotnet/edb_data/Variables.rst delete mode 100644 doc/source/api/dotnet/edb_data/index.rst delete mode 100644 doc/source/api/dotnet/sim_setup_data/data/adaptive_frequency_data.rst delete mode 100644 doc/source/api/dotnet/sim_setup_data/data/index.rst delete mode 100644 doc/source/api/dotnet/sim_setup_data/data/mesh_operation.rst delete mode 100644 doc/source/api/dotnet/sim_setup_data/data/settings.rst delete mode 100644 doc/source/api/dotnet/sim_setup_data/data/sim_setup_info.rst delete mode 100644 doc/source/api/dotnet/sim_setup_data/data/simulation_settings.rst delete mode 100644 doc/source/api/dotnet/sim_setup_data/data/siw_dc_ir_settings.rst delete mode 100644 doc/source/api/dotnet/sim_setup_data/data/sweep_data.rst delete mode 100644 doc/source/api/dotnet/sim_setup_data/io/index.rst delete mode 100644 doc/source/api/dotnet/sim_setup_data/io/siwave.rst delete mode 100644 doc/source/api/dotnet/utilities/heatsink.rst delete mode 100644 doc/source/api/dotnet/utilities/hfss_simulation_setup.rst delete mode 100644 doc/source/api/dotnet/utilities/index.rst delete mode 100644 doc/source/api/dotnet/utilities/simulation_setup.rst delete mode 100644 doc/source/api/dotnet/utilities/siwave_simulation_setup.rst rename doc/source/api/{dotnet/CoreEdb.rst => edb.rst} (68%) diff --git a/doc/source/api/SimulationConfigurationV2.rst b/doc/source/api/SimulationConfigurationV2.rst deleted file mode 100644 index 6ce83c60de..0000000000 --- a/doc/source/api/SimulationConfigurationV2.rst +++ /dev/null @@ -1,155 +0,0 @@ -Simulation configuration v2.0 -============================= -These classes are the containers of simulation configuration constructors V2.0 for the EDB. - - -.. currentmodule:: pyedb.configuration.cfg_boundaries - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgBoundaries - -.. currentmodule:: pyedb.configuration.cfg_common - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgBase - -.. currentmodule:: pyedb.configuration.cfg_components - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgComponent - CfgComponents - -.. currentmodule:: pyedb.configuration.cfg_data - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgData - -.. currentmodule:: pyedb.configuration.cfg_general - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgGeneral - -.. currentmodule:: pyedb.configuration.cfg_nets - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgNets - -.. currentmodule:: pyedb.configuration.cfg_operations - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgCutout - CfgOperations - -.. currentmodule:: pyedb.configuration.cfg_package_definition - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgPackage - CfgHeatSink - CfgPackageDefinitions - -.. currentmodule:: pyedb.configuration.cfg_padstacks - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgPadstacks - -.. currentmodule:: pyedb.configuration.cfg_pin_groups - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgPinGroups - CfgPinGroup - -.. currentmodule:: pyedb.configuration.cfg_ports_sources - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgTerminalInfo - CfgCoordianteTerminalInfo - CfgNearestPinTerminalInfo - CfgSources - CfgPorts - CfgCircuitElement - CfgPort - CfgSource - -.. currentmodule:: pyedb.configuration.cfg_s_parameter_models - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgSParameterModel - -.. currentmodule:: pyedb.configuration.cfg_setup - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgSetup - CfgSIwaveACSetup - CfgSIwaveDCSetup - CfgHFSSSetup - CfgSetups - -.. currentmodule:: pyedb.configuration.cfg_spice_models - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgSpiceModel - -.. currentmodule:: pyedb.configuration.cfg_stackup - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgMaterial - CfgLayer - CfgStackup - -.. currentmodule:: pyedb.configuration.configuration - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - Configuration - - - - - diff --git a/doc/source/api/database/components.rst b/doc/source/api/database/components.rst new file mode 100644 index 0000000000..c7e1800233 --- /dev/null +++ b/doc/source/api/database/components.rst @@ -0,0 +1,12 @@ +Components +========== +These class is the containers of Components. + + +.. currentmodule:: pyedb.grpc.database + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + components.Components diff --git a/doc/source/api/database/control_file.rst b/doc/source/api/database/control_file.rst new file mode 100644 index 0000000000..4cb36639e5 --- /dev/null +++ b/doc/source/api/database/control_file.rst @@ -0,0 +1,31 @@ +Control file +============ +These classes are the containers of the GDS control file. + + +.. currentmodule:: pyedb.grpc.database + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + + control_file.ControlFile + control_file.ControlProperty + control_file.ControlFileMaterial + control_file.ControlFileDielectric + control_file.ControlFileLayer + control_file.ControlFileVia + control_file.ControlFileStackup + control_file.ControlFileImportOptions + control_file.ControlExtent + control_file.ControlCircuitPt + control_file.ControlFileComponent + control_file.ControlFileComponents + control_file.ControlFileBoundaries + control_file.ControlFileSweep + control_file.ControlFileMeshOp + control_file.ControlFileSetup + control_file.ControlFileSetups + + diff --git a/doc/source/api/database/definitions.rst b/doc/source/api/database/definitions.rst new file mode 100644 index 0000000000..a19aaf89c5 --- /dev/null +++ b/doc/source/api/database/definitions.rst @@ -0,0 +1,12 @@ +Definitions +=========== +This class is the container for definitions. + + +.. currentmodule:: pyedb.grpc.database + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + definitions.Definitions \ No newline at end of file diff --git a/doc/source/api/database/hfss.rst b/doc/source/api/database/hfss.rst new file mode 100644 index 0000000000..3d62f817bd --- /dev/null +++ b/doc/source/api/database/hfss.rst @@ -0,0 +1,15 @@ +HFSS +==== + +Class managing HFSS container +---------------------------- +These classes are the containers of HFSS class. + + +.. currentmodule:: pyedb.grpc.database + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + hfss.Hfss diff --git a/doc/source/api/database/index.rst b/doc/source/api/database/index.rst new file mode 100644 index 0000000000..fcbff3d0a6 --- /dev/null +++ b/doc/source/api/database/index.rst @@ -0,0 +1,23 @@ +======== +Database +======== + +This section describes EDB database classes. + + +.. toctree:: + :maxdepth: 3 + + components + control_file + definitions + hfss + layout_validation + modeler + nets + padstacks + siwave + source_excitations + stackup + pyedb_lib/index + diff --git a/doc/source/api/database/layout_validation.rst b/doc/source/api/database/layout_validation.rst new file mode 100644 index 0000000000..fc29a7dd54 --- /dev/null +++ b/doc/source/api/database/layout_validation.rst @@ -0,0 +1,14 @@ +Layout validation +================= +These classes are the containers of Layout Validation. + +.. autosummary:: + :toctree: _autosummary + +.. currentmodule:: pyedb.grpc.database + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + layout_validation.LayoutValidation diff --git a/doc/source/api/dotnet/edb_data/PrimitivesData.rst b/doc/source/api/database/modeler.rst similarity index 75% rename from doc/source/api/dotnet/edb_data/PrimitivesData.rst rename to doc/source/api/database/modeler.rst index 86e1561986..1f16d684a3 100644 --- a/doc/source/api/dotnet/edb_data/PrimitivesData.rst +++ b/doc/source/api/database/modeler.rst @@ -8,22 +8,21 @@ Primitives properties --------------------- These classes are the containers of data management for primitives and arcs. -.. currentmodule:: pyedb.dotnet.database.edb_data.primitives_data +.. currentmodule:: pyedb.grpc.database .. autosummary:: :toctree: _autosummary :nosignatures: - EDBArcs - EdbPolygon + modeler.Modeler .. code:: python - from pyedb import Edb + from pyedb.grpc.edb import Edb - edb = Edb(myedb, edbversion="2023.1") + edb = Edb(myedb, edbversion="2025.2") polygon = edbapp.modeler.polygons[0] polygon.is_void diff --git a/doc/source/api/database/net/index.rst b/doc/source/api/database/net/index.rst new file mode 100644 index 0000000000..a5ba7be403 --- /dev/null +++ b/doc/source/api/database/net/index.rst @@ -0,0 +1,14 @@ +================ +EDB nets classes +================ + +This section describes EDB nets classes. + + +.. toctree:: + :maxdepth: 3 + + differential_pair + extended_net + net + net_class \ No newline at end of file diff --git a/doc/source/api/dotnet/edb_data/SourceData.rst b/doc/source/api/database/nets.rst similarity index 70% rename from doc/source/api/dotnet/edb_data/SourceData.rst rename to doc/source/api/database/nets.rst index cf4e02f9d3..5e9efe4c62 100644 --- a/doc/source/api/dotnet/edb_data/SourceData.rst +++ b/doc/source/api/database/nets.rst @@ -5,17 +5,19 @@ These classes are the containers of sources methods of the EDB for both HFSS and .. code:: python - from pyedb import Edb + from pyedb.grpc.edb import Edb - edb = Edb(myedb, edbversion="2024.2") + edb = Edb(myedb, edbversion="2025.2") # this call returns the EDB excitations dictionary edb.excitations ... -.. currentmodule:: pyedb.dotnet.database.edb_data.sources +.. currentmodule:: pyedb.grpc.database .. autosummary:: :toctree: _autosummary :nosignatures: + + nets.Nets diff --git a/doc/source/api/database/padstacks.rst b/doc/source/api/database/padstacks.rst new file mode 100644 index 0000000000..9aca5c0824 --- /dev/null +++ b/doc/source/api/database/padstacks.rst @@ -0,0 +1,12 @@ +Padstacks +========= +Class managing Padstacks. + + +.. currentmodule:: pyedb.grpc.database + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + padstacks.Padstacks diff --git a/doc/source/api/database/pyedb_lib/definition/component_def.rst b/doc/source/api/database/pyedb_lib/definition/component_def.rst new file mode 100644 index 0000000000..b708aa0851 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/definition/component_def.rst @@ -0,0 +1,12 @@ +Component Definition +==================== +These class is the containers of Component definition. + + +.. currentmodule:: pyedb.grpc.database.definition.component_def + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + ComponentDef diff --git a/doc/source/api/database/pyedb_lib/definition/index.rst b/doc/source/api/database/pyedb_lib/definition/index.rst new file mode 100644 index 0000000000..2f8a227f89 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/definition/index.rst @@ -0,0 +1,15 @@ +================== +Definition classes +================== + +This section describes Definition classes. + + +.. toctree:: + :maxdepth: 2 + + component_def + materials + package_def + padstack_def + diff --git a/doc/source/api/database/pyedb_lib/definition/materials.rst b/doc/source/api/database/pyedb_lib/definition/materials.rst new file mode 100644 index 0000000000..348711171e --- /dev/null +++ b/doc/source/api/database/pyedb_lib/definition/materials.rst @@ -0,0 +1,14 @@ +Component Definition +==================== +These class is the containers of Component definition. + + +.. currentmodule:: pyedb.grpc.database.definition.materials + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + MaterialProperties + Material + Materials diff --git a/doc/source/api/database/pyedb_lib/definition/package_def.rst b/doc/source/api/database/pyedb_lib/definition/package_def.rst new file mode 100644 index 0000000000..43ea733ecf --- /dev/null +++ b/doc/source/api/database/pyedb_lib/definition/package_def.rst @@ -0,0 +1,12 @@ +Package Definition +================== +These class is the containers of package definition. + + +.. currentmodule:: pyedb.grpc.database.definition.package_def + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + PackageDef diff --git a/doc/source/api/database/pyedb_lib/definition/padstack_def.rst b/doc/source/api/database/pyedb_lib/definition/padstack_def.rst new file mode 100644 index 0000000000..5efdb8dc96 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/definition/padstack_def.rst @@ -0,0 +1,13 @@ +Padstack Definition +=================== +These class is the containers of padstack definition. + + +.. currentmodule:: pyedb.grpc.database.definition.padstack_def + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + PadProperties + PadstackDef diff --git a/doc/source/api/database/pyedb_lib/geometry/arc_data.rst b/doc/source/api/database/pyedb_lib/geometry/arc_data.rst new file mode 100644 index 0000000000..3d6f14d2dc --- /dev/null +++ b/doc/source/api/database/pyedb_lib/geometry/arc_data.rst @@ -0,0 +1,12 @@ +Arc Data +======== +This class manages arc data. + + +.. currentmodule:: pyedb.grpc.database.geometry.arc_data + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + ArcData diff --git a/doc/source/api/database/pyedb_lib/geometry/index.rst b/doc/source/api/database/pyedb_lib/geometry/index.rst new file mode 100644 index 0000000000..78ce9471e3 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/geometry/index.rst @@ -0,0 +1,15 @@ +================ +Geometry classes +================ + +This section describes EDB geometry classes. + + +.. toctree:: + :maxdepth: 2 + + arc_data + point_3d_data + point_data + polygon_data + diff --git a/doc/source/api/database/pyedb_lib/geometry/point_3d_data.rst b/doc/source/api/database/pyedb_lib/geometry/point_3d_data.rst new file mode 100644 index 0000000000..5def9d115d --- /dev/null +++ b/doc/source/api/database/pyedb_lib/geometry/point_3d_data.rst @@ -0,0 +1,12 @@ +Point 3D data +============= +These class manages point 3D data. + + +.. currentmodule:: pyedb.grpc.database.geometry.point_3d_data + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + Point3DData diff --git a/doc/source/api/database/pyedb_lib/geometry/point_data.rst b/doc/source/api/database/pyedb_lib/geometry/point_data.rst new file mode 100644 index 0000000000..d09627986c --- /dev/null +++ b/doc/source/api/database/pyedb_lib/geometry/point_data.rst @@ -0,0 +1,12 @@ +Point Data +========== +These class manages geometry point data. + + +.. currentmodule:: pyedb.grpc.database.geometry.point_data + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + PointData diff --git a/doc/source/api/database/pyedb_lib/geometry/polygon_data.rst b/doc/source/api/database/pyedb_lib/geometry/polygon_data.rst new file mode 100644 index 0000000000..c033478da5 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/geometry/polygon_data.rst @@ -0,0 +1,12 @@ +Polygon Data +============ +This class manages polygon data. + + +.. currentmodule:: pyedb.grpc.database.geometry.polygon_data + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + PolygonData diff --git a/doc/source/api/database/pyedb_lib/hierarchy/component.rst b/doc/source/api/database/pyedb_lib/hierarchy/component.rst new file mode 100644 index 0000000000..5d8672cd49 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/hierarchy/component.rst @@ -0,0 +1,13 @@ +Component +========= +This class is managing EDB component. + + +.. currentmodule:: pyedb.grpc.database.hierarchy.component + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + Component + ICDieProperty diff --git a/doc/source/api/database/pyedb_lib/hierarchy/index.rst b/doc/source/api/database/pyedb_lib/hierarchy/index.rst new file mode 100644 index 0000000000..e6e9454bae --- /dev/null +++ b/doc/source/api/database/pyedb_lib/hierarchy/index.rst @@ -0,0 +1,18 @@ +================= +Hierarchy classes +================= + +This section describes EDB hierarchy classes. + + +.. toctree:: + :maxdepth: 2 + + component + model + netlist_model + pin_pair_model + pingroup + s_parameter_model + spice_model + diff --git a/doc/source/api/database/pyedb_lib/hierarchy/model.rst b/doc/source/api/database/pyedb_lib/hierarchy/model.rst new file mode 100644 index 0000000000..f2b1b69ca7 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/hierarchy/model.rst @@ -0,0 +1,12 @@ +Model +===== +This class is managing EDB model. + + +.. currentmodule:: pyedb.grpc.database.hierarchy.model + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + Model diff --git a/doc/source/api/database/pyedb_lib/hierarchy/netlist_model.rst b/doc/source/api/database/pyedb_lib/hierarchy/netlist_model.rst new file mode 100644 index 0000000000..ae771f9576 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/hierarchy/netlist_model.rst @@ -0,0 +1,12 @@ +Netlist Model +============= +This class is managing EDB netlist model. + + +.. currentmodule:: pyedb.grpc.database.hierarchy.netlist_model + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + NetlistModel diff --git a/doc/source/api/database/pyedb_lib/hierarchy/pin_pair_model.rst b/doc/source/api/database/pyedb_lib/hierarchy/pin_pair_model.rst new file mode 100644 index 0000000000..e16abbb05a --- /dev/null +++ b/doc/source/api/database/pyedb_lib/hierarchy/pin_pair_model.rst @@ -0,0 +1,12 @@ +Pin Pair Model +============== +This class is managing EDB pin pair model. + + +.. currentmodule:: pyedb.grpc.database.hierarchy.pin_pair_model + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + PinPairModel diff --git a/doc/source/api/database/pyedb_lib/hierarchy/pingroup.rst b/doc/source/api/database/pyedb_lib/hierarchy/pingroup.rst new file mode 100644 index 0000000000..e984a5ca0e --- /dev/null +++ b/doc/source/api/database/pyedb_lib/hierarchy/pingroup.rst @@ -0,0 +1,12 @@ +Pingroup +======== +This class is managing EDB pingroup. + + +.. currentmodule:: pyedb.grpc.database.hierarchy.pingroup + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + PinGroup diff --git a/doc/source/api/database/pyedb_lib/hierarchy/s_parameter_model.rst b/doc/source/api/database/pyedb_lib/hierarchy/s_parameter_model.rst new file mode 100644 index 0000000000..e4433c33f2 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/hierarchy/s_parameter_model.rst @@ -0,0 +1,12 @@ +S-Parameter model +================= +This class is managing EDB s-parameter model. + + +.. currentmodule:: pyedb.grpc.database.hierarchy.s_parameter_model + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + SparamModel diff --git a/doc/source/api/database/pyedb_lib/hierarchy/spice_model.rst b/doc/source/api/database/pyedb_lib/hierarchy/spice_model.rst new file mode 100644 index 0000000000..24a56ce4cf --- /dev/null +++ b/doc/source/api/database/pyedb_lib/hierarchy/spice_model.rst @@ -0,0 +1,12 @@ +Spice Model +=========== +This class is managing EDB spice model. + + +.. currentmodule:: pyedb.grpc.database.hierarchy.spice_model + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + SpiceModel diff --git a/doc/source/api/database/pyedb_lib/index.rst b/doc/source/api/database/pyedb_lib/index.rst new file mode 100644 index 0000000000..ca5ed9b02e --- /dev/null +++ b/doc/source/api/database/pyedb_lib/index.rst @@ -0,0 +1,23 @@ +======= +EDB lib +======= + +This section describes PyEDB libraries. + + +.. toctree:: + :maxdepth: 2 + + definition/index + geometry/index + hierarchy/index + layers/index + layout/index + net/index + ports/index + primitive/index + simulation_setup/index + utility/index + terminal/index + utility/index + diff --git a/doc/source/api/database/pyedb_lib/layers/index.rst b/doc/source/api/database/pyedb_lib/layers/index.rst new file mode 100644 index 0000000000..d4d1d048a7 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/layers/index.rst @@ -0,0 +1,12 @@ +============== +Layers classes +============== + +This section describes EDB layers classes. + + +.. toctree:: + :maxdepth: 3 + + layer + stackup_layer \ No newline at end of file diff --git a/doc/source/api/database/pyedb_lib/layers/layer.rst b/doc/source/api/database/pyedb_lib/layers/layer.rst new file mode 100644 index 0000000000..cbefa79244 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/layers/layer.rst @@ -0,0 +1,12 @@ +Layer +===== +This class is managing EDB layer. + + +.. currentmodule:: pyedb.grpc.database.layers.layer + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + Layer diff --git a/doc/source/api/database/pyedb_lib/layers/stackup_layer.rst b/doc/source/api/database/pyedb_lib/layers/stackup_layer.rst new file mode 100644 index 0000000000..5e2c2c789d --- /dev/null +++ b/doc/source/api/database/pyedb_lib/layers/stackup_layer.rst @@ -0,0 +1,12 @@ +Stackup Layer +============= +This class is managing EDB stackup layer. + + +.. currentmodule:: pyedb.grpc.database.layers.stackup_layer + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + StackupLayer diff --git a/doc/source/api/database/pyedb_lib/layout/cell.rst b/doc/source/api/database/pyedb_lib/layout/cell.rst new file mode 100644 index 0000000000..433945ad2f --- /dev/null +++ b/doc/source/api/database/pyedb_lib/layout/cell.rst @@ -0,0 +1,12 @@ +Cell +==== +This class is managing EDB cell. + + +.. currentmodule:: pyedb.grpc.database.layout.cell + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + Cell diff --git a/doc/source/api/database/pyedb_lib/layout/index.rst b/doc/source/api/database/pyedb_lib/layout/index.rst new file mode 100644 index 0000000000..bf290ec25a --- /dev/null +++ b/doc/source/api/database/pyedb_lib/layout/index.rst @@ -0,0 +1,13 @@ +============== +Layout classes +============== + +This section describes EDB layout classes. + + +.. toctree:: + :maxdepth: 3 + + cell + layout + voltage_regulator \ No newline at end of file diff --git a/doc/source/api/database/pyedb_lib/layout/layout.rst b/doc/source/api/database/pyedb_lib/layout/layout.rst new file mode 100644 index 0000000000..5063e66527 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/layout/layout.rst @@ -0,0 +1,12 @@ +Layout +====== +This class is managing EDB layout. + + +.. currentmodule:: pyedb.grpc.database.layout.layout + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + Layout diff --git a/doc/source/api/database/pyedb_lib/layout/voltage_regulator.rst b/doc/source/api/database/pyedb_lib/layout/voltage_regulator.rst new file mode 100644 index 0000000000..2470c05f53 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/layout/voltage_regulator.rst @@ -0,0 +1,13 @@ +Voltage Regulator +================= +This class is managing EDB voltage regulator. + + +.. currentmodule:: pyedb.grpc.database.layout.voltage_regulator + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + VoltageRegulator + diff --git a/doc/source/api/database/pyedb_lib/net/differential_pair.rst b/doc/source/api/database/pyedb_lib/net/differential_pair.rst new file mode 100644 index 0000000000..8bd6e368c0 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/net/differential_pair.rst @@ -0,0 +1,13 @@ +Differential Pair +================= +This class is managing EDB differential pair. + + +.. currentmodule:: pyedb.grpc.database.net.differential_pair + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + DifferentialPair + DifferentialPairs diff --git a/doc/source/api/database/pyedb_lib/net/extended_net.rst b/doc/source/api/database/pyedb_lib/net/extended_net.rst new file mode 100644 index 0000000000..26f7dfa73f --- /dev/null +++ b/doc/source/api/database/pyedb_lib/net/extended_net.rst @@ -0,0 +1,13 @@ +Extended net +============ +This class is managing EDB extended net. + + +.. currentmodule:: pyedb.grpc.database.net.extended_net + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + ExtendedNet + ExtendedNets diff --git a/doc/source/api/database/pyedb_lib/net/index.rst b/doc/source/api/database/pyedb_lib/net/index.rst new file mode 100644 index 0000000000..6fac7e9571 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/net/index.rst @@ -0,0 +1,14 @@ +=========== +Net classes +=========== + +This section describes EDB net classes. + + +.. toctree:: + :maxdepth: 3 + + differential_pair + extended_net + net + net_class \ No newline at end of file diff --git a/doc/source/api/database/pyedb_lib/net/net.rst b/doc/source/api/database/pyedb_lib/net/net.rst new file mode 100644 index 0000000000..682f6e9858 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/net/net.rst @@ -0,0 +1,12 @@ +Net +=== +This class is managing EDB net. + + +.. currentmodule:: pyedb.grpc.database.net.net + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + Net diff --git a/doc/source/api/database/pyedb_lib/net/net_class.rst b/doc/source/api/database/pyedb_lib/net/net_class.rst new file mode 100644 index 0000000000..2cfaa7d055 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/net/net_class.rst @@ -0,0 +1,12 @@ +Net Class +========= +This class is managing EDB net class. + + +.. currentmodule:: pyedb.grpc.database.net.net_class + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + NetClass \ No newline at end of file diff --git a/doc/source/api/database/pyedb_lib/ports/index.rst b/doc/source/api/database/pyedb_lib/ports/index.rst new file mode 100644 index 0000000000..f06ffdc98c --- /dev/null +++ b/doc/source/api/database/pyedb_lib/ports/index.rst @@ -0,0 +1,11 @@ +============ +Port classes +============ + +This section describes EDB port classes. + + +.. toctree:: + :maxdepth: 3 + + ports \ No newline at end of file diff --git a/doc/source/api/database/pyedb_lib/ports/ports.rst b/doc/source/api/database/pyedb_lib/ports/ports.rst new file mode 100644 index 0000000000..ad78c0be8a --- /dev/null +++ b/doc/source/api/database/pyedb_lib/ports/ports.rst @@ -0,0 +1,17 @@ +Ports +===== +This class is managing EDB ports. + + +.. currentmodule:: pyedb.grpc.database.ports.ports + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + GapPort + CircuitPort + WavePort + ExcitationSources + BundleWavePort + CoaxPort diff --git a/doc/source/api/database/pyedb_lib/primitive/bondwire.rst b/doc/source/api/database/pyedb_lib/primitive/bondwire.rst new file mode 100644 index 0000000000..ec16d5f5a4 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/primitive/bondwire.rst @@ -0,0 +1,13 @@ +Bondwire +======== +This class is managing EDB bondwire. + + +.. currentmodule:: pyedb.grpc.database.primitive.bondwire + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + Bondwire + diff --git a/doc/source/api/database/pyedb_lib/primitive/circle.rst b/doc/source/api/database/pyedb_lib/primitive/circle.rst new file mode 100644 index 0000000000..8f5f27ecd9 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/primitive/circle.rst @@ -0,0 +1,13 @@ +Circle +====== +This class is managing EDB circle. + + +.. currentmodule:: pyedb.grpc.database.primitive.circle + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + Circle + diff --git a/doc/source/api/database/pyedb_lib/primitive/index.rst b/doc/source/api/database/pyedb_lib/primitive/index.rst new file mode 100644 index 0000000000..83ee7a711b --- /dev/null +++ b/doc/source/api/database/pyedb_lib/primitive/index.rst @@ -0,0 +1,17 @@ +================= +Primitive classes +================= + +This section describes EDB primitive classes. + + +.. toctree:: + :maxdepth: 2 + + bondwire + circle + padstack_instance + path + polygon + primitive + rectangle \ No newline at end of file diff --git a/doc/source/api/database/pyedb_lib/primitive/padstack_instance.rst b/doc/source/api/database/pyedb_lib/primitive/padstack_instance.rst new file mode 100644 index 0000000000..6a6ed40346 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/primitive/padstack_instance.rst @@ -0,0 +1,13 @@ +Pad-stack Instance +================= +This class is managing EDB padstack instance. + + +.. currentmodule:: pyedb.grpc.database.primitive.padstack_instance + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + PadstackInstance + diff --git a/doc/source/api/database/pyedb_lib/primitive/path.rst b/doc/source/api/database/pyedb_lib/primitive/path.rst new file mode 100644 index 0000000000..f2355305c2 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/primitive/path.rst @@ -0,0 +1,13 @@ +Path +==== +This class is managing EDB path. + + +.. currentmodule:: pyedb.grpc.database.primitive.path + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + Path + diff --git a/doc/source/api/database/pyedb_lib/primitive/polygon.rst b/doc/source/api/database/pyedb_lib/primitive/polygon.rst new file mode 100644 index 0000000000..041672dfb2 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/primitive/polygon.rst @@ -0,0 +1,13 @@ +Polygon +======= +This class is managing EDB polygon. + + +.. currentmodule:: pyedb.grpc.database.primitive.polygon + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + Polygon + diff --git a/doc/source/api/database/pyedb_lib/primitive/primitive.rst b/doc/source/api/database/pyedb_lib/primitive/primitive.rst new file mode 100644 index 0000000000..864c763352 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/primitive/primitive.rst @@ -0,0 +1,13 @@ +Primitive +========= +This class is managing EDB primitive. + + +.. currentmodule:: pyedb.grpc.database.primitive.primitive + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + Primitive + diff --git a/doc/source/api/database/pyedb_lib/primitive/rectangle.rst b/doc/source/api/database/pyedb_lib/primitive/rectangle.rst new file mode 100644 index 0000000000..b76927da7a --- /dev/null +++ b/doc/source/api/database/pyedb_lib/primitive/rectangle.rst @@ -0,0 +1,13 @@ +Rectangle +========= +This class is managing EDB rectangle. + + +.. currentmodule:: pyedb.grpc.database.primitive.rectangle + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + Rectangle + diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/adaptive_frequency.rst b/doc/source/api/database/pyedb_lib/simulation_setup/adaptive_frequency.rst new file mode 100644 index 0000000000..da3ef9ac52 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/simulation_setup/adaptive_frequency.rst @@ -0,0 +1,13 @@ +Adaptive frequency +================== +This class is managing EDB adaptive frequency. + + +.. currentmodule:: pyedb.grpc.database.simulation_setup.adaptive_frequency + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + AdaptiveFrequency + diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/hfss_advanced_meshing_settings.rst b/doc/source/api/database/pyedb_lib/simulation_setup/hfss_advanced_meshing_settings.rst new file mode 100644 index 0000000000..b7fd09dc95 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/simulation_setup/hfss_advanced_meshing_settings.rst @@ -0,0 +1,13 @@ +HFSS advanced meshing settings +============================== +This class is managing EDB HFSS advanced meshing settings. + + +.. currentmodule:: pyedb.grpc.database.simulation_setup.hfss_advanced_meshing_settings + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + HFSSAdvancedMeshingSettings + diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/hfss_advanced_settings.rst b/doc/source/api/database/pyedb_lib/simulation_setup/hfss_advanced_settings.rst new file mode 100644 index 0000000000..79950fd671 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/simulation_setup/hfss_advanced_settings.rst @@ -0,0 +1,13 @@ +HFSS advanced settings +============================== +This class is managing EDB HFSS advanced settings. + + +.. currentmodule:: pyedb.grpc.database.simulation_setup.hfss_advanced_settings + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + HFSSAdvancedSettings + diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/hfss_dcr_settings.rst b/doc/source/api/database/pyedb_lib/simulation_setup/hfss_dcr_settings.rst new file mode 100644 index 0000000000..55f52b99c1 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/simulation_setup/hfss_dcr_settings.rst @@ -0,0 +1,13 @@ +HFSS dcr settings +================= +This class is managing EDB HFSS dcr settings. + + +.. currentmodule:: pyedb.grpc.database.simulation_setup.hfss_dcr_settings + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + HFSSDCRSettings + diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/hfss_general_settings.rst b/doc/source/api/database/pyedb_lib/simulation_setup/hfss_general_settings.rst new file mode 100644 index 0000000000..cdc7fca2ff --- /dev/null +++ b/doc/source/api/database/pyedb_lib/simulation_setup/hfss_general_settings.rst @@ -0,0 +1,13 @@ +HFSS general settings +===================== +This class is managing EDB HFSS general settings. + + +.. currentmodule:: pyedb.grpc.database.simulation_setup.hfss_general_settings + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + HFSSGeneralSettings + diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/hfss_settings_options.rst b/doc/source/api/database/pyedb_lib/simulation_setup/hfss_settings_options.rst new file mode 100644 index 0000000000..6a03501426 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/simulation_setup/hfss_settings_options.rst @@ -0,0 +1,13 @@ +HFSS settings options +===================== +This class is managing EDB HFSS settings options. + + +.. currentmodule:: pyedb.grpc.database.simulation_setup.hfss_settings_options + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + HFSSSettingsOptions + diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/hfss_simulation_settings.rst b/doc/source/api/database/pyedb_lib/simulation_setup/hfss_simulation_settings.rst new file mode 100644 index 0000000000..a310cd075d --- /dev/null +++ b/doc/source/api/database/pyedb_lib/simulation_setup/hfss_simulation_settings.rst @@ -0,0 +1,13 @@ +HFSS simulation settings +======================== +This class is managing EDB HFSS simulation settings. + + +.. currentmodule:: pyedb.grpc.database.simulation_setup.hfss_simulation_settings + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + HFSSSimulationSettings + diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/hfss_simulation_setup.rst b/doc/source/api/database/pyedb_lib/simulation_setup/hfss_simulation_setup.rst new file mode 100644 index 0000000000..9e66b5cee8 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/simulation_setup/hfss_simulation_setup.rst @@ -0,0 +1,13 @@ +HFSS simulation setup +===================== +This class is managing EDB HFSS simulation setup. + + +.. currentmodule:: pyedb.grpc.database.simulation_setup.hfss_simulation_setup + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + HfssSimulationSetup + diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/hfss_solver_settings.rst b/doc/source/api/database/pyedb_lib/simulation_setup/hfss_solver_settings.rst new file mode 100644 index 0000000000..b41b6528cb --- /dev/null +++ b/doc/source/api/database/pyedb_lib/simulation_setup/hfss_solver_settings.rst @@ -0,0 +1,13 @@ +HFSS solver settings +==================== +This class is managing EDB HFSS solver settings. + + +.. currentmodule:: pyedb.grpc.database.simulation_setup.hfss_solver_settings + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + HFSSSolverSettings + diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/index.rst b/doc/source/api/database/pyedb_lib/simulation_setup/index.rst new file mode 100644 index 0000000000..c7c6a6de59 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/simulation_setup/index.rst @@ -0,0 +1,26 @@ +======================== +Simulation setup classes +======================== + +This section describes EDB simulation setup classes. + + +.. toctree:: + :maxdepth: 2 + + adaptive_frequency + hfss_advanced_meshing_settings + hfss_advanced_settings + hfss_dcr_settings + hfss_general_settings + hfss_settings_options + hfss_simulation_settings + hfss_simulation_setup + hfss_solver_settings + raptor_x_advanced_settings + raptor_x_general_settings + raptor_x_simulation_settings + raptor_x_simulation_setup + siwave_dcir_simulation_setup + siwave_simulation_setup + sweep_data \ No newline at end of file diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/mesh_operation.rst b/doc/source/api/database/pyedb_lib/simulation_setup/mesh_operation.rst new file mode 100644 index 0000000000..0449c16ea1 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/simulation_setup/mesh_operation.rst @@ -0,0 +1,13 @@ +Mesh operation +============== +This class is managing EDB mesh operation. + + +.. currentmodule:: pyedb.grpc.database.simulation_setup.mesh_operation + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + MeshOperation + diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/raptor_x_advanced_settings.rst b/doc/source/api/database/pyedb_lib/simulation_setup/raptor_x_advanced_settings.rst new file mode 100644 index 0000000000..c9d5fd4ebc --- /dev/null +++ b/doc/source/api/database/pyedb_lib/simulation_setup/raptor_x_advanced_settings.rst @@ -0,0 +1,12 @@ +Raptor X advanced settings +========================== +This class is managing EDB raptor x advanced settings. + + +.. currentmodule:: pyedb.grpc.database.simulation_setup.raptor_x_advanced_settings + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + RaptorXAdvancedSettings \ No newline at end of file diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/raptor_x_general_settings.rst b/doc/source/api/database/pyedb_lib/simulation_setup/raptor_x_general_settings.rst new file mode 100644 index 0000000000..ce18dbc536 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/simulation_setup/raptor_x_general_settings.rst @@ -0,0 +1,12 @@ +Raptor X general settings +========================= +This class is managing EDB raptor x general settings. + + +.. currentmodule:: pyedb.grpc.database.simulation_setup.raptor_x_general_settings + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + RaptorXGeneralSettings \ No newline at end of file diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/raptor_x_simulation_settings.rst b/doc/source/api/database/pyedb_lib/simulation_setup/raptor_x_simulation_settings.rst new file mode 100644 index 0000000000..180e113fbf --- /dev/null +++ b/doc/source/api/database/pyedb_lib/simulation_setup/raptor_x_simulation_settings.rst @@ -0,0 +1,12 @@ +Raptor X simulation settings +============================ +This class is managing EDB raptor x simulation settings. + + +.. currentmodule:: pyedb.grpc.database.simulation_setup.raptor_x_simulation_settings + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + RaptorXSimulationSettings \ No newline at end of file diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/raptor_x_simulation_setup.rst b/doc/source/api/database/pyedb_lib/simulation_setup/raptor_x_simulation_setup.rst new file mode 100644 index 0000000000..7087d8d68b --- /dev/null +++ b/doc/source/api/database/pyedb_lib/simulation_setup/raptor_x_simulation_setup.rst @@ -0,0 +1,12 @@ +Raptor X simulation setup +========================= +This class is managing EDB raptor X simulation setup. + + +.. currentmodule:: pyedb.grpc.database.simulation_setup.raptor_x_simulation_setup + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + RaptorXSimulationSetup \ No newline at end of file diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/siwave_dcir_simulation_setup.rst b/doc/source/api/database/pyedb_lib/simulation_setup/siwave_dcir_simulation_setup.rst new file mode 100644 index 0000000000..0894f5360f --- /dev/null +++ b/doc/source/api/database/pyedb_lib/simulation_setup/siwave_dcir_simulation_setup.rst @@ -0,0 +1,12 @@ +Siwave dcir simulation setup +============================ +This class is managing EDB siwave dcir simulation setup. + + +.. currentmodule:: pyedb.grpc.database.simulation_setup.siwave_dcir_simulation_setup + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + SIWaveDCIRSimulationSetup \ No newline at end of file diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/siwave_simulation_setup.rst b/doc/source/api/database/pyedb_lib/simulation_setup/siwave_simulation_setup.rst new file mode 100644 index 0000000000..1fc790d1d7 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/simulation_setup/siwave_simulation_setup.rst @@ -0,0 +1,12 @@ +Siwave simulation setup +======================= +This class is managing EDB siwave simulation setup. + + +.. currentmodule:: pyedb.grpc.database.simulation_setup.siwave_simulation_setup + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + SiwaveSimulationSetup \ No newline at end of file diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/sweep_data.rst b/doc/source/api/database/pyedb_lib/simulation_setup/sweep_data.rst new file mode 100644 index 0000000000..62a54da3c3 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/simulation_setup/sweep_data.rst @@ -0,0 +1,12 @@ +Sweep data +========== +This class is managing EDB sweep data for frequency sweep. + + +.. currentmodule:: pyedb.grpc.database.simulation_setup.sweep_data + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + SweepData \ No newline at end of file diff --git a/doc/source/api/database/pyedb_lib/terminal/bundle_terminal.rst b/doc/source/api/database/pyedb_lib/terminal/bundle_terminal.rst new file mode 100644 index 0000000000..322f096ca8 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/terminal/bundle_terminal.rst @@ -0,0 +1,13 @@ +Bundle terminal +=============== +This class is managing EDB bundle terminal. + + +.. currentmodule:: pyedb.grpc.database.terminal.bundle_terminal + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + BundleTerminal + diff --git a/doc/source/api/database/pyedb_lib/terminal/edge_terminal.rst b/doc/source/api/database/pyedb_lib/terminal/edge_terminal.rst new file mode 100644 index 0000000000..52f23a86dd --- /dev/null +++ b/doc/source/api/database/pyedb_lib/terminal/edge_terminal.rst @@ -0,0 +1,13 @@ +Edge terminal +============= +This class is managing EDB edge terminal. + + +.. currentmodule:: pyedb.grpc.database.terminal.edge_terminal + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + EdgeTerminal + diff --git a/doc/source/api/database/pyedb_lib/terminal/index.rst b/doc/source/api/database/pyedb_lib/terminal/index.rst new file mode 100644 index 0000000000..7efe1fd0fc --- /dev/null +++ b/doc/source/api/database/pyedb_lib/terminal/index.rst @@ -0,0 +1,16 @@ +================ +Terminal classes +================ + +This section describes EDB terminal classes. + + +.. toctree:: + :maxdepth: 2 + + bundle_terminal + edge_terminal + padstack_instance_terminal + pingroup_terminal + point_terminal + terminal \ No newline at end of file diff --git a/doc/source/api/database/pyedb_lib/terminal/padstack_instance_terminal.rst b/doc/source/api/database/pyedb_lib/terminal/padstack_instance_terminal.rst new file mode 100644 index 0000000000..dfb34e7479 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/terminal/padstack_instance_terminal.rst @@ -0,0 +1,13 @@ +Padstack instance terminal +========================== +This class is managing EDB padstack instance terminal. + + +.. currentmodule:: pyedb.grpc.database.terminal.padstack_instance_terminal + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + PadstackInstanceTerminal + diff --git a/doc/source/api/database/pyedb_lib/terminal/pingroup_terminal.rst b/doc/source/api/database/pyedb_lib/terminal/pingroup_terminal.rst new file mode 100644 index 0000000000..9580d98f4e --- /dev/null +++ b/doc/source/api/database/pyedb_lib/terminal/pingroup_terminal.rst @@ -0,0 +1,13 @@ +Pingroup terminal +================= +This class is managing EDB pingroup terminal. + + +.. currentmodule:: pyedb.grpc.database.terminal.pingroup_terminal + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + PinGroupTerminal + diff --git a/doc/source/api/database/pyedb_lib/terminal/point_terminal.rst b/doc/source/api/database/pyedb_lib/terminal/point_terminal.rst new file mode 100644 index 0000000000..4f962d92e2 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/terminal/point_terminal.rst @@ -0,0 +1,13 @@ +Point terminal +============== +This class is managing EDB point terminal. + + +.. currentmodule:: pyedb.grpc.database.terminal.point_terminal + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + PointTerminal + diff --git a/doc/source/api/database/pyedb_lib/terminal/terminal.rst b/doc/source/api/database/pyedb_lib/terminal/terminal.rst new file mode 100644 index 0000000000..d22e9db310 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/terminal/terminal.rst @@ -0,0 +1,13 @@ +Terminal +======== +This class is managing EDB terminal. + + +.. currentmodule:: pyedb.grpc.database.terminal.terminal + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + Terminal + diff --git a/doc/source/api/database/pyedb_lib/utility/heat_sink.rst b/doc/source/api/database/pyedb_lib/utility/heat_sink.rst new file mode 100644 index 0000000000..07831674fb --- /dev/null +++ b/doc/source/api/database/pyedb_lib/utility/heat_sink.rst @@ -0,0 +1,13 @@ +Heat sink +========= +This class is managing EDB heat sink. + + +.. currentmodule:: pyedb.grpc.database.utility.heat_sink + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + HeatSink + diff --git a/doc/source/api/dotnet/edb_data/HfssExtentInfo.rst b/doc/source/api/database/pyedb_lib/utility/hfss_extent_info.rst similarity index 50% rename from doc/source/api/dotnet/edb_data/HfssExtentInfo.rst rename to doc/source/api/database/pyedb_lib/utility/hfss_extent_info.rst index e7d5a4b35e..d21b088f22 100644 --- a/doc/source/api/dotnet/edb_data/HfssExtentInfo.rst +++ b/doc/source/api/database/pyedb_lib/utility/hfss_extent_info.rst @@ -1,12 +1,13 @@ HFSS extent info ================ -These class is the containers of HFSS Extent. +This class is managing EDB HFSS extend info. -.. currentmodule:: pyedb.dotnet.database.edb_data.hfss_extent_info +.. currentmodule:: pyedb.grpc.database.utility.hfss_extent_info .. autosummary:: :toctree: _autosummary :nosignatures: HfssExtentInfo + diff --git a/doc/source/api/database/pyedb_lib/utility/index.rst b/doc/source/api/database/pyedb_lib/utility/index.rst new file mode 100644 index 0000000000..0de13e51e4 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/utility/index.rst @@ -0,0 +1,17 @@ +=============== +Utility classes +=============== + +This section describes EDB utility classes. + + +.. toctree:: + :maxdepth: 2 + + heat_sink + hfss_extent_info + layout_statistics + rlc + simulation_configuration + sources + xml_control_file \ No newline at end of file diff --git a/doc/source/api/database/pyedb_lib/utility/layout_statistics.rst b/doc/source/api/database/pyedb_lib/utility/layout_statistics.rst new file mode 100644 index 0000000000..35e88358b1 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/utility/layout_statistics.rst @@ -0,0 +1,13 @@ +Layout statistics +================= +This class is managing EDB layout statistics. + + +.. currentmodule:: pyedb.grpc.database.utility.layout_statistics + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + LayoutStatistics + diff --git a/doc/source/api/database/pyedb_lib/utility/rlc.rst b/doc/source/api/database/pyedb_lib/utility/rlc.rst new file mode 100644 index 0000000000..9de564fa3d --- /dev/null +++ b/doc/source/api/database/pyedb_lib/utility/rlc.rst @@ -0,0 +1,13 @@ +Rlc +=== +This class is managing EDB rlck. + + +.. currentmodule:: pyedb.grpc.database.utility.rlc + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + Rlc + diff --git a/doc/source/api/database/pyedb_lib/utility/sources.rst b/doc/source/api/database/pyedb_lib/utility/sources.rst new file mode 100644 index 0000000000..f4545bb357 --- /dev/null +++ b/doc/source/api/database/pyedb_lib/utility/sources.rst @@ -0,0 +1,18 @@ +Source +====== +This class is managing EDB sources. + + +.. currentmodule:: pyedb.grpc.database.utility.sources + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + Node + Source + CircuitPort + VoltageSource + CurrentSource + DCTerminal + ResistorSource \ No newline at end of file diff --git a/doc/source/api/dotnet/XmlControlFile.rst b/doc/source/api/database/pyedb_lib/utility/xml_control_file.rst similarity index 59% rename from doc/source/api/dotnet/XmlControlFile.rst rename to doc/source/api/database/pyedb_lib/utility/xml_control_file.rst index 17a40e6c8b..62a8893f46 100644 --- a/doc/source/api/dotnet/XmlControlFile.rst +++ b/doc/source/api/database/pyedb_lib/utility/xml_control_file.rst @@ -1,9 +1,9 @@ XML control file ================ -Convert a technology file to EDB control file. +This class is managing EDB xml control file. -.. currentmodule:: pyedb.dotnet.database.edb_data.control_file +.. currentmodule:: pyedb.grpc.database.utility.xml_control_file .. autosummary:: :toctree: _autosummary @@ -20,5 +20,9 @@ Convert a technology file to EDB control file. ControlCircuitPt ControlFileComponent ControlFileComponents - - + ControlFileBoundaries + ControlFileSweep + ControlFileMeshOp + ControlFileSetup + ControlFileSetups + ControlFile \ No newline at end of file diff --git a/doc/source/api/database/siwave.rst b/doc/source/api/database/siwave.rst new file mode 100644 index 0000000000..48ecde0c0c --- /dev/null +++ b/doc/source/api/database/siwave.rst @@ -0,0 +1,12 @@ +Siwave +====== +Class managing Siwave. + + +.. currentmodule:: pyedb.grpc.database + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + siwave.Siwave diff --git a/doc/source/api/database/source_excitations.rst b/doc/source/api/database/source_excitations.rst new file mode 100644 index 0000000000..b659b991ad --- /dev/null +++ b/doc/source/api/database/source_excitations.rst @@ -0,0 +1,12 @@ +Sources excitations +=================== +Class managing source excitations. + + +.. currentmodule:: pyedb.grpc.database + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + source_excitations.SourceExcitation diff --git a/doc/source/api/database/stackup.rst b/doc/source/api/database/stackup.rst new file mode 100644 index 0000000000..20eea8eeb1 --- /dev/null +++ b/doc/source/api/database/stackup.rst @@ -0,0 +1,13 @@ +Stackup +======= +Class managing Stackup and layers. + + +.. currentmodule:: pyedb.grpc.database + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + stackup.LayerCollection + stackup.Stackup diff --git a/doc/source/api/dotnet/SiWave.rst b/doc/source/api/dotnet/SiWave.rst deleted file mode 100644 index d02d5e59ed..0000000000 --- a/doc/source/api/dotnet/SiWave.rst +++ /dev/null @@ -1,35 +0,0 @@ -SIwave manager -============== -`SIwave `_ is a specialized tool -for power integrity, signal integrity, and EMI analysis of IC packages and PCB. This tool -solves power delivery systems and high-speed channels in electronic devices. It can be -accessed from PyEDB in Windows only. All setups can be implemented through EDB API. - -.. image:: ../resources/siwave.png - :width: 800 - :alt: EdbSiwave - :target: https://www.ansys.com/products/electronics/ansys-siwave - - -.. currentmodule:: pyedb.siwave - -.. autosummary:: - :toctree: _autosummary - - Siwave - - -.. code:: python - - from pyedb.siwave import Siwave - - # this call returns the Edb class initialized on 2024 R2 - siwave = Siwave("2024.2") - siwave.open_project("pyproject.siw") - siwave.export_element_data("mydata.txt") - siwave.close_project() - ... - -.. currentmodule:: pyedb.siwave_core.icepak - Icepak - diff --git a/doc/source/api/dotnet/edb_data/EdbValue.rst b/doc/source/api/dotnet/edb_data/EdbValue.rst deleted file mode 100644 index cfe3e4b539..0000000000 --- a/doc/source/api/dotnet/edb_data/EdbValue.rst +++ /dev/null @@ -1,12 +0,0 @@ -EDB value -========= -Class managing EDB Value. - - -.. currentmodule:: pyedb.dotnet.database.edb_data.edbvalue - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - EdbValue diff --git a/doc/source/api/dotnet/edb_data/LayerData.rst b/doc/source/api/dotnet/edb_data/LayerData.rst deleted file mode 100644 index a38fa090f2..0000000000 --- a/doc/source/api/dotnet/edb_data/LayerData.rst +++ /dev/null @@ -1,29 +0,0 @@ -Stackup & layers -================ -These classes are the containers of the layer and stackup manager of the EDB API. - - -.. code:: python - - from pyedb import Edb - - edb = Edb(myedb, edbversion="2023.1") - - # this call returns the EDBLayers class - layer = edb.stackup.stackup_layers - - # this call returns the EDBLayer class - layer = edb.stackup["TOP"] - ... - - -.. currentmodule:: pyedb.dotnet.database.edb_data.layer_data - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - - LayerEdbClass - - diff --git a/doc/source/api/dotnet/edb_data/NetData.rst b/doc/source/api/dotnet/edb_data/NetData.rst deleted file mode 100644 index ee2648e90a..0000000000 --- a/doc/source/api/dotnet/edb_data/NetData.rst +++ /dev/null @@ -1,32 +0,0 @@ -Nets -==== - -Net properties --------------- -The following class is the container of data management for nets, extended nets and differential pairs. - - -.. currentmodule:: pyedb.dotnet.database.edb_data.nets_data - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - EDBNetsData - EDBNetClassData - EDBExtendedNetData - EDBDifferentialPairData - -.. code:: python - - from pyedb import Edb - - edb = Edb(myedb, edbversion="2024.2") - - edb.nets["M_MA<6>"].delete() - edb.net_classes - edb.differential_pairs - edb.extended_nets - - - ... \ No newline at end of file diff --git a/doc/source/api/dotnet/edb_data/PadstackData.rst b/doc/source/api/dotnet/edb_data/PadstackData.rst deleted file mode 100644 index 1f3e28fd1b..0000000000 --- a/doc/source/api/dotnet/edb_data/PadstackData.rst +++ /dev/null @@ -1,17 +0,0 @@ -vias and padstacks -================== - -Instances and definitions -------------------------- -These classes are the containers of data management for padstacks instances and padstack definitions. - - -.. currentmodule:: pyedb.dotnet.database.edb_data.padstacks_data - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - EDBPadProperties - EDBPadstack - EDBPadstackInstance diff --git a/doc/source/api/dotnet/edb_data/PortsData.rst b/doc/source/api/dotnet/edb_data/PortsData.rst deleted file mode 100644 index 7b9099a26c..0000000000 --- a/doc/source/api/dotnet/edb_data/PortsData.rst +++ /dev/null @@ -1,26 +0,0 @@ -Ports -===== -These classes are the containers of ports methods of the EDB for both HFSS and SIwave. - -.. autosummary:: - :toctree: _autosummary - -.. code:: python - - from pyedb import Edb - - edb = Edb(myedb, edbversion="2023.1") - - # this call returns the EDB excitations dictionary - edb.ports - ... - - -.. currentmodule:: pyedb.dotnet.database.edb_data.ports - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - GapPort - WavePort diff --git a/doc/source/api/dotnet/edb_data/RaptorXSimulationSetup.rst b/doc/source/api/dotnet/edb_data/RaptorXSimulationSetup.rst deleted file mode 100644 index efca87b771..0000000000 --- a/doc/source/api/dotnet/edb_data/RaptorXSimulationSetup.rst +++ /dev/null @@ -1,15 +0,0 @@ -RaptorX simulation setup -======================== -These classes are the containers of RaptorX simulation setup. - - -.. currentmodule:: pyedb.dotnet.database.edb_data.raptor_x_simulation_setup_data - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - RaptorXSimulationSetup - RaptorXSimulationSettings - RaptorXGeneralSettings - RaptorXSimulationAdvancedSettings \ No newline at end of file diff --git a/doc/source/api/dotnet/edb_data/Utilities.rst b/doc/source/api/dotnet/edb_data/Utilities.rst deleted file mode 100644 index e500cc63ac..0000000000 --- a/doc/source/api/dotnet/edb_data/Utilities.rst +++ /dev/null @@ -1,12 +0,0 @@ -EDB utilities -============= -Class managing EDB utilities. - - -.. currentmodule:: pyedb.dotnet.database.edb_data.utilities - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - EDBStatistics diff --git a/doc/source/api/dotnet/edb_data/Variables.rst b/doc/source/api/dotnet/edb_data/Variables.rst deleted file mode 100644 index ceee4b498e..0000000000 --- a/doc/source/api/dotnet/edb_data/Variables.rst +++ /dev/null @@ -1,12 +0,0 @@ -Variables -========= -Class managing EDB Variables. - - -.. currentmodule:: pyedb.dotnet.database.edb_data.variables - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - Variable diff --git a/doc/source/api/dotnet/edb_data/index.rst b/doc/source/api/dotnet/edb_data/index.rst deleted file mode 100644 index dac2f349bf..0000000000 --- a/doc/source/api/dotnet/edb_data/index.rst +++ /dev/null @@ -1,22 +0,0 @@ -================ -EDB data classes -================ - -This section describes EDB data classes. - - -.. toctree:: - :maxdepth: 2 - - EdbValue - HfssExtentInfo - LayerData - NetData - PadstackData - PortsData - PrimitivesData - RaptorXSimulationSetup - SourceData - Utilities - Variables - diff --git a/doc/source/api/dotnet/sim_setup_data/data/adaptive_frequency_data.rst b/doc/source/api/dotnet/sim_setup_data/data/adaptive_frequency_data.rst deleted file mode 100644 index 27087a65f7..0000000000 --- a/doc/source/api/dotnet/sim_setup_data/data/adaptive_frequency_data.rst +++ /dev/null @@ -1,15 +0,0 @@ -Adaptive frequency data -======================= -This class is the container of HFSS adaptive frequency data. - - -.. currentmodule:: pyedb.dotnet.database.sim_setup_data.data.adaptive_frequency_data - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - - AdaptiveFrequencyData - - diff --git a/doc/source/api/dotnet/sim_setup_data/data/index.rst b/doc/source/api/dotnet/sim_setup_data/data/index.rst deleted file mode 100644 index 56337d89cf..0000000000 --- a/doc/source/api/dotnet/sim_setup_data/data/index.rst +++ /dev/null @@ -1,17 +0,0 @@ -===================== -Simulation setup data -===================== - -This section describes Simulation setup data. - - -.. toctree:: - :maxdepth: 2 - - adaptive_frequency_data - mesh_operation - settings - sim_setup_info - simulation_settings - siw_dc_ir_settings - sweep_data \ No newline at end of file diff --git a/doc/source/api/dotnet/sim_setup_data/data/mesh_operation.rst b/doc/source/api/dotnet/sim_setup_data/data/mesh_operation.rst deleted file mode 100644 index a190561bfd..0000000000 --- a/doc/source/api/dotnet/sim_setup_data/data/mesh_operation.rst +++ /dev/null @@ -1,18 +0,0 @@ -Mesh operation -============== -This class is the container of HFSS mesh operation. - - -.. currentmodule:: pyedb.dotnet.database.sim_setup_data.data.mesh_operation - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - - MeshOpType - MeshOperation - LengthMeshOperation - SkinDepthMeshOperation - - diff --git a/doc/source/api/dotnet/sim_setup_data/data/settings.rst b/doc/source/api/dotnet/sim_setup_data/data/settings.rst deleted file mode 100644 index c79bb25648..0000000000 --- a/doc/source/api/dotnet/sim_setup_data/data/settings.rst +++ /dev/null @@ -1,22 +0,0 @@ -HFSS simulation setup settings -============================== -These classes are the containers of HFSS simulation setup settings. - - -.. currentmodule:: pyedb.dotnet.database.sim_setup_data.data.settings - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - - AdaptiveSettings - DefeatureSettings - AdvancedMeshSettings - ViaSettings - CurveApproxSettings - DcrSettings - HfssPortSettings - HfssSolverSettings - - diff --git a/doc/source/api/dotnet/sim_setup_data/data/sim_setup_info.rst b/doc/source/api/dotnet/sim_setup_data/data/sim_setup_info.rst deleted file mode 100644 index a5e564c668..0000000000 --- a/doc/source/api/dotnet/sim_setup_data/data/sim_setup_info.rst +++ /dev/null @@ -1,15 +0,0 @@ -Simulation setup info -====================== -This class is the container of simulation setup info. - - -.. currentmodule:: pyedb.dotnet.database.sim_setup_data.data.sim_setup_info - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - - SimSetupInfo - - diff --git a/doc/source/api/dotnet/sim_setup_data/data/simulation_settings.rst b/doc/source/api/dotnet/sim_setup_data/data/simulation_settings.rst deleted file mode 100644 index ed0f5c9499..0000000000 --- a/doc/source/api/dotnet/sim_setup_data/data/simulation_settings.rst +++ /dev/null @@ -1,18 +0,0 @@ -Simulation settings -=================== -These classes are the containers of simulation settings. - - -.. currentmodule:: pyedb.dotnet.database.sim_setup_data.data.simulation_settings - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - - BaseSimulationSettings - SimulationSettings - HFSSSimulationSettings - HFSSPISimulationSettings - - diff --git a/doc/source/api/dotnet/sim_setup_data/data/siw_dc_ir_settings.rst b/doc/source/api/dotnet/sim_setup_data/data/siw_dc_ir_settings.rst deleted file mode 100644 index cedfeef7e4..0000000000 --- a/doc/source/api/dotnet/sim_setup_data/data/siw_dc_ir_settings.rst +++ /dev/null @@ -1,15 +0,0 @@ -SIwave DC-IR settings -===================== -This class is the container of SIwave DC-IR settings. - - -.. currentmodule:: pyedb.dotnet.database.sim_setup_data.data.siw_dc_ir_settings - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - - SiwaveDCIRSettings - - diff --git a/doc/source/api/dotnet/sim_setup_data/data/sweep_data.rst b/doc/source/api/dotnet/sim_setup_data/data/sweep_data.rst deleted file mode 100644 index e60380f10a..0000000000 --- a/doc/source/api/dotnet/sim_setup_data/data/sweep_data.rst +++ /dev/null @@ -1,15 +0,0 @@ -Sweep data -========== -This class is the container of sweep data. - - -.. currentmodule:: pyedb.dotnet.database.sim_setup_data.data.sweep_data - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - - SweepData - - diff --git a/doc/source/api/dotnet/sim_setup_data/io/index.rst b/doc/source/api/dotnet/sim_setup_data/io/index.rst deleted file mode 100644 index 39de17f627..0000000000 --- a/doc/source/api/dotnet/sim_setup_data/io/index.rst +++ /dev/null @@ -1,10 +0,0 @@ -=================== -Simulation setup IO -=================== - -This section describes Simulation setup IO. - - -.. toctree:: - :maxdepth: 2 - diff --git a/doc/source/api/dotnet/sim_setup_data/io/siwave.rst b/doc/source/api/dotnet/sim_setup_data/io/siwave.rst deleted file mode 100644 index c6e238d397..0000000000 --- a/doc/source/api/dotnet/sim_setup_data/io/siwave.rst +++ /dev/null @@ -1,18 +0,0 @@ -SIwave IO -========= -This class is the container of SIwave IO. - - -.. currentmodule:: pyedb.dotnet.database.sim_setup_data.io.siwave - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - - SettingsBase - AdvancedSettings - DCSettings - DCAdvancedSettings - - diff --git a/doc/source/api/dotnet/utilities/heatsink.rst b/doc/source/api/dotnet/utilities/heatsink.rst deleted file mode 100644 index 8aec753574..0000000000 --- a/doc/source/api/dotnet/utilities/heatsink.rst +++ /dev/null @@ -1,15 +0,0 @@ -Icepak heat sink -================ -This class is the container of Icepak heat sink. - - -.. currentmodule:: pyedb.dotnet.database.utilities.heatsink - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - - HeatSink - - diff --git a/doc/source/api/dotnet/utilities/hfss_simulation_setup.rst b/doc/source/api/dotnet/utilities/hfss_simulation_setup.rst deleted file mode 100644 index 124c778074..0000000000 --- a/doc/source/api/dotnet/utilities/hfss_simulation_setup.rst +++ /dev/null @@ -1,16 +0,0 @@ -HFSS simulation setup -===================== -These classes are the containers of HFSS simulation setup. - - -.. currentmodule:: pyedb.dotnet.database.utilities.hfss_simulation_setup - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - - HfssSimulationSetup - HFSSPISimulationSetup - - diff --git a/doc/source/api/dotnet/utilities/index.rst b/doc/source/api/dotnet/utilities/index.rst deleted file mode 100644 index 84049581ae..0000000000 --- a/doc/source/api/dotnet/utilities/index.rst +++ /dev/null @@ -1,14 +0,0 @@ -========= -Utilities -========= - -This section describes utilities. - - -.. toctree:: - :maxdepth: 2 - - heatsink - hfss_simulation_setup - simulation_setup - siwave_simulation_setup \ No newline at end of file diff --git a/doc/source/api/dotnet/utilities/simulation_setup.rst b/doc/source/api/dotnet/utilities/simulation_setup.rst deleted file mode 100644 index 1b4e1cfdbd..0000000000 --- a/doc/source/api/dotnet/utilities/simulation_setup.rst +++ /dev/null @@ -1,17 +0,0 @@ -Simulation setup -================ -This class is the container of simulation setup. - - -.. currentmodule:: pyedb.dotnet.database.utilities.simulation_setup - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - - SimulationSetupType - AdaptiveType - SimulationSetup - - diff --git a/doc/source/api/dotnet/utilities/siwave_simulation_setup.rst b/doc/source/api/dotnet/utilities/siwave_simulation_setup.rst deleted file mode 100644 index bb68102e2c..0000000000 --- a/doc/source/api/dotnet/utilities/siwave_simulation_setup.rst +++ /dev/null @@ -1,16 +0,0 @@ -SIwave simulation setup -======================= -These classes are the containers of siwave simulation setup. - - -.. currentmodule:: pyedb.dotnet.database.utilities.siwave_simulation_setup - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - - SiwaveSimulationSetup - SiwaveDCSimulationSetup - - diff --git a/doc/source/api/dotnet/CoreEdb.rst b/doc/source/api/edb.rst similarity index 68% rename from doc/source/api/dotnet/CoreEdb.rst rename to doc/source/api/edb.rst index 42bbf3609e..d04fee0bec 100644 --- a/doc/source/api/dotnet/CoreEdb.rst +++ b/doc/source/api/edb.rst @@ -8,7 +8,7 @@ It can be opened and edited using the ``Edb`` class. :alt: HFSS 3D Layout is the tool used to visualize EDB content. -.. currentmodule:: pyedb.dotnet +.. currentmodule:: pyedb.grpc .. autosummary:: :toctree: _autosummary @@ -17,10 +17,10 @@ It can be opened and edited using the ``Edb`` class. .. code:: python - from pyedb import Edb + from pyedb.grpc.edb import Edb # this call returns the Edb class initialized on 2024R2 - edb = Edb(myedb, edbversion="2024.2") + edb = Edb(myedb, edbversion="2025.2") ... @@ -31,29 +31,11 @@ This section lists the core EDB modules for reading and writing information to AEDB files. -.. currentmodule:: pyedb.dotnet.database - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - components.Components - hfss.EdbHfss - layout_validation.LayoutValidation - materials.Materials - modeler.Modeler - nets.EdbNets - edb_data.padstacks_data.EDBPadstack - siwave.EdbSiwave - stackup.Stackup - - - .. code:: python - from pyedb import Edb + from pyedb.grpc.edb import Edb - edb = Edb(myedb, edbversion="2023.1") + edb = Edb(myedb, edbversion="2025.2") # this call returns the EdbHfss Class comp = edb.hfss diff --git a/doc/source/api/index.rst b/doc/source/api/index.rst index 4c9923058b..7fd74a15af 100644 --- a/doc/source/api/index.rst +++ b/doc/source/api/index.rst @@ -23,9 +23,9 @@ If EDB is launched within the ``HfssdLayout`` class, EDB is accessible in read-o .. code:: python - from pyedb import Edb + from pyedb.grpc.edb import Edb - edb = Edb("my_project.aedb", edbversion="2023.1") + edb = Edb("my_project.aedb", edbversion="2025.2") edb.core_components.components["R1"].r_value = 40 edb.close_edb() @@ -33,12 +33,7 @@ If EDB is launched within the ``HfssdLayout`` class, EDB is accessible in read-o .. toctree:: :maxdepth: 2 - dotnet/CoreEdb - dotnet/edb_data/index - dotnet/sim_setup_data/data/index - dotnet/sim_setup_data/io/index - dotnet/utilities/index - dotnet/SiWave - SimulationConfigurationv2 + edb + database/index From d817bf3a4f8d7d7a184b565a2b09290b1acf9ef5 Mon Sep 17 00:00:00 2001 From: svandenb-dev Date: Mon, 23 Jun 2025 17:41:57 +0200 Subject: [PATCH 11/29] fixes --- doc/source/api/edb.rst | 2 +- src/pyedb/grpc/database/net/differential_pair.py | 3 ++- src/pyedb/grpc/edb.py | 6 +++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/doc/source/api/edb.rst b/doc/source/api/edb.rst index d04fee0bec..3b83062f4b 100644 --- a/doc/source/api/edb.rst +++ b/doc/source/api/edb.rst @@ -19,7 +19,7 @@ It can be opened and edited using the ``Edb`` class. from pyedb.grpc.edb import Edb - # this call returns the Edb class initialized on 2024R2 + # this call returns the Edb class initialized on 2025R2 edb = Edb(myedb, edbversion="2025.2") ... diff --git a/src/pyedb/grpc/database/net/differential_pair.py b/src/pyedb/grpc/database/net/differential_pair.py index 343469458c..2c47e7e5ae 100644 --- a/src/pyedb/grpc/database/net/differential_pair.py +++ b/src/pyedb/grpc/database/net/differential_pair.py @@ -85,10 +85,11 @@ def auto_identify(self, positive_differentiator="_P", negative_differentiator="_ ------- list A list containing identified differential pair names. + Examples -------- >>> from pyedb import Edb - >>> edbapp = Edb("myaedbfolder", edbversion="2023.1") + >>> edbapp = Edb("myaedbfolder", edbversion="2025.2") >>> edb_nets = edbapp.differential_pairs.auto_identify() """ nets = self._pedb.nets.nets diff --git a/src/pyedb/grpc/edb.py b/src/pyedb/grpc/edb.py index 093170364b..187cf17b66 100644 --- a/src/pyedb/grpc/edb.py +++ b/src/pyedb/grpc/edb.py @@ -178,13 +178,13 @@ class Edb(EdbInit): Examples -------- - Create new EDB: + >>> # Create new EDB: >>> edb = Edb() - Open existing AEDB: + >>> # Open existing AEDB: >>> edb = Edb("myproject.aedb") - Import board file: + >>> # Import board file: >>> edb = Edb("my_board.brd") """ From bb25bb3be7f170a1a722c63d3bd08d4dd9fdf535 Mon Sep 17 00:00:00 2001 From: svandenb-dev Date: Mon, 23 Jun 2025 20:24:57 +0200 Subject: [PATCH 12/29] fixes --- doc/source/api/index.rst | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/doc/source/api/index.rst b/doc/source/api/index.rst index 7fd74a15af..7886230d97 100644 --- a/doc/source/api/index.rst +++ b/doc/source/api/index.rst @@ -18,22 +18,36 @@ If EDB is launched within the ``HfssdLayout`` class, EDB is accessible in read-o :alt: EDB apps :target: https://www.ansys.com/applications/pcbs-ics-ic-packages +.. tab-set:: -**Example** + .. tab-item:: gRPC -.. code:: python + .. code-block:: python - from pyedb.grpc.edb import Edb + from pyedb.grpc.edb import Edb + + edb = Edb("my_project.aedb", edbversion="2025.2") + edb.core_components.components["R1"].r_value = 40 + edb.close_edb() + + .. toctree:: + :maxdepth: 2 + + edb + database/index + + .. tab-item:: DotNet + + .. code-block:: python + + from pyedb.grpc.edb import Edb + + edb = Edb("my_project.aedb", edbversion="2025.2") + edb.core_components.components["R1"].r_value = 40 + edb.close_edb() - edb = Edb("my_project.aedb", edbversion="2025.2") - edb.core_components.components["R1"].r_value = 40 - edb.close_edb() -.. toctree:: - :maxdepth: 2 - edb - database/index From 1643dae2714f8c30ed4b533c930ca56337c0e7d4 Mon Sep 17 00:00:00 2001 From: svandenb-dev Date: Wed, 25 Jun 2025 14:06:33 +0200 Subject: [PATCH 13/29] grpc doc fix --- doc/source/_static/custom.css | 16 +++++ doc/source/api/database/net/index.rst | 14 ----- doc/source/api/edb.rst | 61 ------------------- .../api/{ => grpc}/database/components.rst | 0 .../api/{ => grpc}/database/control_file.rst | 0 .../api/{ => grpc}/database/definitions.rst | 0 doc/source/api/{ => grpc}/database/hfss.rst | 0 doc/source/api/{ => grpc}/database/index.rst | 0 .../{ => grpc}/database/layout_validation.rst | 0 .../api/{ => grpc}/database/modeler.rst | 0 doc/source/api/{ => grpc}/database/nets.rst | 0 .../api/{ => grpc}/database/padstacks.rst | 0 .../pyedb_lib/definition/component_def.rst | 0 .../database/pyedb_lib/definition/index.rst | 0 .../pyedb_lib/definition/materials.rst | 0 .../pyedb_lib/definition/package_def.rst | 0 .../pyedb_lib/definition/padstack_def.rst | 0 .../database/pyedb_lib/geometry/arc_data.rst | 0 .../database/pyedb_lib/geometry/index.rst | 0 .../pyedb_lib/geometry/point_3d_data.rst | 0 .../pyedb_lib/geometry/point_data.rst | 0 .../pyedb_lib/geometry/polygon_data.rst | 0 .../pyedb_lib/hierarchy/component.rst | 0 .../database/pyedb_lib/hierarchy/index.rst | 0 .../database/pyedb_lib/hierarchy/model.rst | 0 .../pyedb_lib/hierarchy/netlist_model.rst | 0 .../pyedb_lib/hierarchy/pin_pair_model.rst | 0 .../database/pyedb_lib/hierarchy/pingroup.rst | 0 .../pyedb_lib/hierarchy/s_parameter_model.rst | 0 .../pyedb_lib/hierarchy/spice_model.rst | 0 .../{ => grpc}/database/pyedb_lib/index.rst | 0 .../database/pyedb_lib/layers/index.rst | 0 .../database/pyedb_lib/layers/layer.rst | 0 .../pyedb_lib/layers/stackup_layer.rst | 0 .../database/pyedb_lib/layout/cell.rst | 0 .../database/pyedb_lib/layout/index.rst | 0 .../database/pyedb_lib/layout/layout.rst | 0 .../pyedb_lib/layout/voltage_regulator.rst | 0 .../pyedb_lib/net/differential_pair.rst | 0 .../database/pyedb_lib/net/extended_net.rst | 0 .../database/pyedb_lib/net/index.rst | 0 .../{ => grpc}/database/pyedb_lib/net/net.rst | 0 .../database/pyedb_lib/net/net_class.rst | 0 .../database/pyedb_lib/ports/index.rst | 0 .../database/pyedb_lib/ports/ports.rst | 0 .../database/pyedb_lib/primitive/bondwire.rst | 0 .../database/pyedb_lib/primitive/circle.rst | 0 .../database/pyedb_lib/primitive/index.rst | 0 .../pyedb_lib/primitive/padstack_instance.rst | 0 .../database/pyedb_lib/primitive/path.rst | 0 .../database/pyedb_lib/primitive/polygon.rst | 0 .../pyedb_lib/primitive/primitive.rst | 0 .../pyedb_lib/primitive/rectangle.rst | 0 .../simulation_setup/adaptive_frequency.rst | 0 .../hfss_advanced_meshing_settings.rst | 0 .../hfss_advanced_settings.rst | 0 .../simulation_setup/hfss_dcr_settings.rst | 0 .../hfss_general_settings.rst | 0 .../hfss_settings_options.rst | 0 .../hfss_simulation_settings.rst | 0 .../hfss_simulation_setup.rst | 0 .../simulation_setup/hfss_solver_settings.rst | 0 .../pyedb_lib/simulation_setup/index.rst | 0 .../simulation_setup/mesh_operation.rst | 0 .../raptor_x_advanced_settings.rst | 0 .../raptor_x_general_settings.rst | 0 .../raptor_x_simulation_settings.rst | 0 .../raptor_x_simulation_setup.rst | 0 .../siwave_dcir_simulation_setup.rst | 0 .../siwave_simulation_setup.rst | 0 .../pyedb_lib/simulation_setup/sweep_data.rst | 0 .../pyedb_lib/terminal/bundle_terminal.rst | 0 .../pyedb_lib/terminal/edge_terminal.rst | 0 .../database/pyedb_lib/terminal/index.rst | 0 .../terminal/padstack_instance_terminal.rst | 0 .../pyedb_lib/terminal/pingroup_terminal.rst | 0 .../pyedb_lib/terminal/point_terminal.rst | 0 .../database/pyedb_lib/terminal/terminal.rst | 0 .../database/pyedb_lib/utility/heat_sink.rst | 0 .../pyedb_lib/utility/hfss_extent_info.rst | 0 .../database/pyedb_lib/utility/index.rst | 0 .../pyedb_lib/utility/layout_statistics.rst | 0 .../database/pyedb_lib/utility/rlc.rst | 0 .../database/pyedb_lib/utility/sources.rst | 0 .../pyedb_lib/utility/xml_control_file.rst | 0 doc/source/api/{ => grpc}/database/siwave.rst | 0 .../database/source_excitations.rst | 0 .../api/{ => grpc}/database/stackup.rst | 0 doc/source/api/grpc/edb.rst | 15 +++++ doc/source/api/grpc/index.rst | 12 ++++ doc/source/api/index.rst | 24 +------- 91 files changed, 45 insertions(+), 97 deletions(-) delete mode 100644 doc/source/api/database/net/index.rst delete mode 100644 doc/source/api/edb.rst rename doc/source/api/{ => grpc}/database/components.rst (100%) rename doc/source/api/{ => grpc}/database/control_file.rst (100%) rename doc/source/api/{ => grpc}/database/definitions.rst (100%) rename doc/source/api/{ => grpc}/database/hfss.rst (100%) rename doc/source/api/{ => grpc}/database/index.rst (100%) rename doc/source/api/{ => grpc}/database/layout_validation.rst (100%) rename doc/source/api/{ => grpc}/database/modeler.rst (100%) rename doc/source/api/{ => grpc}/database/nets.rst (100%) rename doc/source/api/{ => grpc}/database/padstacks.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/definition/component_def.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/definition/index.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/definition/materials.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/definition/package_def.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/definition/padstack_def.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/geometry/arc_data.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/geometry/index.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/geometry/point_3d_data.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/geometry/point_data.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/geometry/polygon_data.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/hierarchy/component.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/hierarchy/index.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/hierarchy/model.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/hierarchy/netlist_model.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/hierarchy/pin_pair_model.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/hierarchy/pingroup.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/hierarchy/s_parameter_model.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/hierarchy/spice_model.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/index.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/layers/index.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/layers/layer.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/layers/stackup_layer.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/layout/cell.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/layout/index.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/layout/layout.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/layout/voltage_regulator.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/net/differential_pair.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/net/extended_net.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/net/index.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/net/net.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/net/net_class.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/ports/index.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/ports/ports.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/primitive/bondwire.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/primitive/circle.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/primitive/index.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/primitive/padstack_instance.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/primitive/path.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/primitive/polygon.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/primitive/primitive.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/primitive/rectangle.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/simulation_setup/adaptive_frequency.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/simulation_setup/hfss_advanced_meshing_settings.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/simulation_setup/hfss_advanced_settings.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/simulation_setup/hfss_dcr_settings.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/simulation_setup/hfss_general_settings.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/simulation_setup/hfss_settings_options.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/simulation_setup/hfss_simulation_settings.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/simulation_setup/hfss_simulation_setup.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/simulation_setup/hfss_solver_settings.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/simulation_setup/index.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/simulation_setup/mesh_operation.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/simulation_setup/raptor_x_advanced_settings.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/simulation_setup/raptor_x_general_settings.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/simulation_setup/raptor_x_simulation_settings.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/simulation_setup/raptor_x_simulation_setup.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/simulation_setup/siwave_dcir_simulation_setup.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/simulation_setup/siwave_simulation_setup.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/simulation_setup/sweep_data.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/terminal/bundle_terminal.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/terminal/edge_terminal.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/terminal/index.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/terminal/padstack_instance_terminal.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/terminal/pingroup_terminal.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/terminal/point_terminal.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/terminal/terminal.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/utility/heat_sink.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/utility/hfss_extent_info.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/utility/index.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/utility/layout_statistics.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/utility/rlc.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/utility/sources.rst (100%) rename doc/source/api/{ => grpc}/database/pyedb_lib/utility/xml_control_file.rst (100%) rename doc/source/api/{ => grpc}/database/siwave.rst (100%) rename doc/source/api/{ => grpc}/database/source_excitations.rst (100%) rename doc/source/api/{ => grpc}/database/stackup.rst (100%) create mode 100644 doc/source/api/grpc/edb.rst create mode 100644 doc/source/api/grpc/index.rst diff --git a/doc/source/_static/custom.css b/doc/source/_static/custom.css index 5c9ebf2a51..4a591be968 100644 --- a/doc/source/_static/custom.css +++ b/doc/source/_static/custom.css @@ -54,3 +54,19 @@ nav.bd-links ul li.toctree-l4 > a { font-size: .8rem; text-indent: 3px; } +/* Two-column layout */ +.multi-column { + display: flex; + gap: 20px; +} + +.column { + flex:1; /* Distribute width equally */ +} + +/* Optional: Responsive behavior */ +@media (max-width: 768px) { + .multi-column { + flex-direction: column; + } +} \ No newline at end of file diff --git a/doc/source/api/database/net/index.rst b/doc/source/api/database/net/index.rst deleted file mode 100644 index a5ba7be403..0000000000 --- a/doc/source/api/database/net/index.rst +++ /dev/null @@ -1,14 +0,0 @@ -================ -EDB nets classes -================ - -This section describes EDB nets classes. - - -.. toctree:: - :maxdepth: 3 - - differential_pair - extended_net - net - net_class \ No newline at end of file diff --git a/doc/source/api/edb.rst b/doc/source/api/edb.rst deleted file mode 100644 index 3b83062f4b..0000000000 --- a/doc/source/api/edb.rst +++ /dev/null @@ -1,61 +0,0 @@ -EDB manager -=========== -An AEDB database is a folder that contains the database representing any part of a PCB. -It can be opened and edited using the ``Edb`` class. - -.. image:: ../resources/3dlayout_1.png - :width: 800 - :alt: HFSS 3D Layout is the tool used to visualize EDB content. - - -.. currentmodule:: pyedb.grpc -.. autosummary:: - :toctree: _autosummary - - edb.Edb - - -.. code:: python - - from pyedb.grpc.edb import Edb - - # this call returns the Edb class initialized on 2025R2 - edb = Edb(myedb, edbversion="2025.2") - - ... - - -EDB modules -~~~~~~~~~~~ -This section lists the core EDB modules for reading and writing information -to AEDB files. - - -.. code:: python - - from pyedb.grpc.edb import Edb - - edb = Edb(myedb, edbversion="2025.2") - - # this call returns the EdbHfss Class - comp = edb.hfss - - # this call returns the Components Class - comp = edb.components - - # this call returns the EdbSiwave Class - comp = edb.siwave - - # this call returns the EdbPadstacks Class - comp = edb.padstacks - - # this call returns the Stackup Class - comp = edb.stackup - - # this call returns the Materials Class - comp = edb.materials - - # this call returns the EdbNets Class - comp = edb.nets - - ... diff --git a/doc/source/api/database/components.rst b/doc/source/api/grpc/database/components.rst similarity index 100% rename from doc/source/api/database/components.rst rename to doc/source/api/grpc/database/components.rst diff --git a/doc/source/api/database/control_file.rst b/doc/source/api/grpc/database/control_file.rst similarity index 100% rename from doc/source/api/database/control_file.rst rename to doc/source/api/grpc/database/control_file.rst diff --git a/doc/source/api/database/definitions.rst b/doc/source/api/grpc/database/definitions.rst similarity index 100% rename from doc/source/api/database/definitions.rst rename to doc/source/api/grpc/database/definitions.rst diff --git a/doc/source/api/database/hfss.rst b/doc/source/api/grpc/database/hfss.rst similarity index 100% rename from doc/source/api/database/hfss.rst rename to doc/source/api/grpc/database/hfss.rst diff --git a/doc/source/api/database/index.rst b/doc/source/api/grpc/database/index.rst similarity index 100% rename from doc/source/api/database/index.rst rename to doc/source/api/grpc/database/index.rst diff --git a/doc/source/api/database/layout_validation.rst b/doc/source/api/grpc/database/layout_validation.rst similarity index 100% rename from doc/source/api/database/layout_validation.rst rename to doc/source/api/grpc/database/layout_validation.rst diff --git a/doc/source/api/database/modeler.rst b/doc/source/api/grpc/database/modeler.rst similarity index 100% rename from doc/source/api/database/modeler.rst rename to doc/source/api/grpc/database/modeler.rst diff --git a/doc/source/api/database/nets.rst b/doc/source/api/grpc/database/nets.rst similarity index 100% rename from doc/source/api/database/nets.rst rename to doc/source/api/grpc/database/nets.rst diff --git a/doc/source/api/database/padstacks.rst b/doc/source/api/grpc/database/padstacks.rst similarity index 100% rename from doc/source/api/database/padstacks.rst rename to doc/source/api/grpc/database/padstacks.rst diff --git a/doc/source/api/database/pyedb_lib/definition/component_def.rst b/doc/source/api/grpc/database/pyedb_lib/definition/component_def.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/definition/component_def.rst rename to doc/source/api/grpc/database/pyedb_lib/definition/component_def.rst diff --git a/doc/source/api/database/pyedb_lib/definition/index.rst b/doc/source/api/grpc/database/pyedb_lib/definition/index.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/definition/index.rst rename to doc/source/api/grpc/database/pyedb_lib/definition/index.rst diff --git a/doc/source/api/database/pyedb_lib/definition/materials.rst b/doc/source/api/grpc/database/pyedb_lib/definition/materials.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/definition/materials.rst rename to doc/source/api/grpc/database/pyedb_lib/definition/materials.rst diff --git a/doc/source/api/database/pyedb_lib/definition/package_def.rst b/doc/source/api/grpc/database/pyedb_lib/definition/package_def.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/definition/package_def.rst rename to doc/source/api/grpc/database/pyedb_lib/definition/package_def.rst diff --git a/doc/source/api/database/pyedb_lib/definition/padstack_def.rst b/doc/source/api/grpc/database/pyedb_lib/definition/padstack_def.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/definition/padstack_def.rst rename to doc/source/api/grpc/database/pyedb_lib/definition/padstack_def.rst diff --git a/doc/source/api/database/pyedb_lib/geometry/arc_data.rst b/doc/source/api/grpc/database/pyedb_lib/geometry/arc_data.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/geometry/arc_data.rst rename to doc/source/api/grpc/database/pyedb_lib/geometry/arc_data.rst diff --git a/doc/source/api/database/pyedb_lib/geometry/index.rst b/doc/source/api/grpc/database/pyedb_lib/geometry/index.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/geometry/index.rst rename to doc/source/api/grpc/database/pyedb_lib/geometry/index.rst diff --git a/doc/source/api/database/pyedb_lib/geometry/point_3d_data.rst b/doc/source/api/grpc/database/pyedb_lib/geometry/point_3d_data.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/geometry/point_3d_data.rst rename to doc/source/api/grpc/database/pyedb_lib/geometry/point_3d_data.rst diff --git a/doc/source/api/database/pyedb_lib/geometry/point_data.rst b/doc/source/api/grpc/database/pyedb_lib/geometry/point_data.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/geometry/point_data.rst rename to doc/source/api/grpc/database/pyedb_lib/geometry/point_data.rst diff --git a/doc/source/api/database/pyedb_lib/geometry/polygon_data.rst b/doc/source/api/grpc/database/pyedb_lib/geometry/polygon_data.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/geometry/polygon_data.rst rename to doc/source/api/grpc/database/pyedb_lib/geometry/polygon_data.rst diff --git a/doc/source/api/database/pyedb_lib/hierarchy/component.rst b/doc/source/api/grpc/database/pyedb_lib/hierarchy/component.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/hierarchy/component.rst rename to doc/source/api/grpc/database/pyedb_lib/hierarchy/component.rst diff --git a/doc/source/api/database/pyedb_lib/hierarchy/index.rst b/doc/source/api/grpc/database/pyedb_lib/hierarchy/index.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/hierarchy/index.rst rename to doc/source/api/grpc/database/pyedb_lib/hierarchy/index.rst diff --git a/doc/source/api/database/pyedb_lib/hierarchy/model.rst b/doc/source/api/grpc/database/pyedb_lib/hierarchy/model.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/hierarchy/model.rst rename to doc/source/api/grpc/database/pyedb_lib/hierarchy/model.rst diff --git a/doc/source/api/database/pyedb_lib/hierarchy/netlist_model.rst b/doc/source/api/grpc/database/pyedb_lib/hierarchy/netlist_model.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/hierarchy/netlist_model.rst rename to doc/source/api/grpc/database/pyedb_lib/hierarchy/netlist_model.rst diff --git a/doc/source/api/database/pyedb_lib/hierarchy/pin_pair_model.rst b/doc/source/api/grpc/database/pyedb_lib/hierarchy/pin_pair_model.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/hierarchy/pin_pair_model.rst rename to doc/source/api/grpc/database/pyedb_lib/hierarchy/pin_pair_model.rst diff --git a/doc/source/api/database/pyedb_lib/hierarchy/pingroup.rst b/doc/source/api/grpc/database/pyedb_lib/hierarchy/pingroup.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/hierarchy/pingroup.rst rename to doc/source/api/grpc/database/pyedb_lib/hierarchy/pingroup.rst diff --git a/doc/source/api/database/pyedb_lib/hierarchy/s_parameter_model.rst b/doc/source/api/grpc/database/pyedb_lib/hierarchy/s_parameter_model.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/hierarchy/s_parameter_model.rst rename to doc/source/api/grpc/database/pyedb_lib/hierarchy/s_parameter_model.rst diff --git a/doc/source/api/database/pyedb_lib/hierarchy/spice_model.rst b/doc/source/api/grpc/database/pyedb_lib/hierarchy/spice_model.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/hierarchy/spice_model.rst rename to doc/source/api/grpc/database/pyedb_lib/hierarchy/spice_model.rst diff --git a/doc/source/api/database/pyedb_lib/index.rst b/doc/source/api/grpc/database/pyedb_lib/index.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/index.rst rename to doc/source/api/grpc/database/pyedb_lib/index.rst diff --git a/doc/source/api/database/pyedb_lib/layers/index.rst b/doc/source/api/grpc/database/pyedb_lib/layers/index.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/layers/index.rst rename to doc/source/api/grpc/database/pyedb_lib/layers/index.rst diff --git a/doc/source/api/database/pyedb_lib/layers/layer.rst b/doc/source/api/grpc/database/pyedb_lib/layers/layer.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/layers/layer.rst rename to doc/source/api/grpc/database/pyedb_lib/layers/layer.rst diff --git a/doc/source/api/database/pyedb_lib/layers/stackup_layer.rst b/doc/source/api/grpc/database/pyedb_lib/layers/stackup_layer.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/layers/stackup_layer.rst rename to doc/source/api/grpc/database/pyedb_lib/layers/stackup_layer.rst diff --git a/doc/source/api/database/pyedb_lib/layout/cell.rst b/doc/source/api/grpc/database/pyedb_lib/layout/cell.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/layout/cell.rst rename to doc/source/api/grpc/database/pyedb_lib/layout/cell.rst diff --git a/doc/source/api/database/pyedb_lib/layout/index.rst b/doc/source/api/grpc/database/pyedb_lib/layout/index.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/layout/index.rst rename to doc/source/api/grpc/database/pyedb_lib/layout/index.rst diff --git a/doc/source/api/database/pyedb_lib/layout/layout.rst b/doc/source/api/grpc/database/pyedb_lib/layout/layout.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/layout/layout.rst rename to doc/source/api/grpc/database/pyedb_lib/layout/layout.rst diff --git a/doc/source/api/database/pyedb_lib/layout/voltage_regulator.rst b/doc/source/api/grpc/database/pyedb_lib/layout/voltage_regulator.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/layout/voltage_regulator.rst rename to doc/source/api/grpc/database/pyedb_lib/layout/voltage_regulator.rst diff --git a/doc/source/api/database/pyedb_lib/net/differential_pair.rst b/doc/source/api/grpc/database/pyedb_lib/net/differential_pair.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/net/differential_pair.rst rename to doc/source/api/grpc/database/pyedb_lib/net/differential_pair.rst diff --git a/doc/source/api/database/pyedb_lib/net/extended_net.rst b/doc/source/api/grpc/database/pyedb_lib/net/extended_net.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/net/extended_net.rst rename to doc/source/api/grpc/database/pyedb_lib/net/extended_net.rst diff --git a/doc/source/api/database/pyedb_lib/net/index.rst b/doc/source/api/grpc/database/pyedb_lib/net/index.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/net/index.rst rename to doc/source/api/grpc/database/pyedb_lib/net/index.rst diff --git a/doc/source/api/database/pyedb_lib/net/net.rst b/doc/source/api/grpc/database/pyedb_lib/net/net.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/net/net.rst rename to doc/source/api/grpc/database/pyedb_lib/net/net.rst diff --git a/doc/source/api/database/pyedb_lib/net/net_class.rst b/doc/source/api/grpc/database/pyedb_lib/net/net_class.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/net/net_class.rst rename to doc/source/api/grpc/database/pyedb_lib/net/net_class.rst diff --git a/doc/source/api/database/pyedb_lib/ports/index.rst b/doc/source/api/grpc/database/pyedb_lib/ports/index.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/ports/index.rst rename to doc/source/api/grpc/database/pyedb_lib/ports/index.rst diff --git a/doc/source/api/database/pyedb_lib/ports/ports.rst b/doc/source/api/grpc/database/pyedb_lib/ports/ports.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/ports/ports.rst rename to doc/source/api/grpc/database/pyedb_lib/ports/ports.rst diff --git a/doc/source/api/database/pyedb_lib/primitive/bondwire.rst b/doc/source/api/grpc/database/pyedb_lib/primitive/bondwire.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/primitive/bondwire.rst rename to doc/source/api/grpc/database/pyedb_lib/primitive/bondwire.rst diff --git a/doc/source/api/database/pyedb_lib/primitive/circle.rst b/doc/source/api/grpc/database/pyedb_lib/primitive/circle.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/primitive/circle.rst rename to doc/source/api/grpc/database/pyedb_lib/primitive/circle.rst diff --git a/doc/source/api/database/pyedb_lib/primitive/index.rst b/doc/source/api/grpc/database/pyedb_lib/primitive/index.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/primitive/index.rst rename to doc/source/api/grpc/database/pyedb_lib/primitive/index.rst diff --git a/doc/source/api/database/pyedb_lib/primitive/padstack_instance.rst b/doc/source/api/grpc/database/pyedb_lib/primitive/padstack_instance.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/primitive/padstack_instance.rst rename to doc/source/api/grpc/database/pyedb_lib/primitive/padstack_instance.rst diff --git a/doc/source/api/database/pyedb_lib/primitive/path.rst b/doc/source/api/grpc/database/pyedb_lib/primitive/path.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/primitive/path.rst rename to doc/source/api/grpc/database/pyedb_lib/primitive/path.rst diff --git a/doc/source/api/database/pyedb_lib/primitive/polygon.rst b/doc/source/api/grpc/database/pyedb_lib/primitive/polygon.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/primitive/polygon.rst rename to doc/source/api/grpc/database/pyedb_lib/primitive/polygon.rst diff --git a/doc/source/api/database/pyedb_lib/primitive/primitive.rst b/doc/source/api/grpc/database/pyedb_lib/primitive/primitive.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/primitive/primitive.rst rename to doc/source/api/grpc/database/pyedb_lib/primitive/primitive.rst diff --git a/doc/source/api/database/pyedb_lib/primitive/rectangle.rst b/doc/source/api/grpc/database/pyedb_lib/primitive/rectangle.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/primitive/rectangle.rst rename to doc/source/api/grpc/database/pyedb_lib/primitive/rectangle.rst diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/adaptive_frequency.rst b/doc/source/api/grpc/database/pyedb_lib/simulation_setup/adaptive_frequency.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/simulation_setup/adaptive_frequency.rst rename to doc/source/api/grpc/database/pyedb_lib/simulation_setup/adaptive_frequency.rst diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/hfss_advanced_meshing_settings.rst b/doc/source/api/grpc/database/pyedb_lib/simulation_setup/hfss_advanced_meshing_settings.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/simulation_setup/hfss_advanced_meshing_settings.rst rename to doc/source/api/grpc/database/pyedb_lib/simulation_setup/hfss_advanced_meshing_settings.rst diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/hfss_advanced_settings.rst b/doc/source/api/grpc/database/pyedb_lib/simulation_setup/hfss_advanced_settings.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/simulation_setup/hfss_advanced_settings.rst rename to doc/source/api/grpc/database/pyedb_lib/simulation_setup/hfss_advanced_settings.rst diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/hfss_dcr_settings.rst b/doc/source/api/grpc/database/pyedb_lib/simulation_setup/hfss_dcr_settings.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/simulation_setup/hfss_dcr_settings.rst rename to doc/source/api/grpc/database/pyedb_lib/simulation_setup/hfss_dcr_settings.rst diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/hfss_general_settings.rst b/doc/source/api/grpc/database/pyedb_lib/simulation_setup/hfss_general_settings.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/simulation_setup/hfss_general_settings.rst rename to doc/source/api/grpc/database/pyedb_lib/simulation_setup/hfss_general_settings.rst diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/hfss_settings_options.rst b/doc/source/api/grpc/database/pyedb_lib/simulation_setup/hfss_settings_options.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/simulation_setup/hfss_settings_options.rst rename to doc/source/api/grpc/database/pyedb_lib/simulation_setup/hfss_settings_options.rst diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/hfss_simulation_settings.rst b/doc/source/api/grpc/database/pyedb_lib/simulation_setup/hfss_simulation_settings.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/simulation_setup/hfss_simulation_settings.rst rename to doc/source/api/grpc/database/pyedb_lib/simulation_setup/hfss_simulation_settings.rst diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/hfss_simulation_setup.rst b/doc/source/api/grpc/database/pyedb_lib/simulation_setup/hfss_simulation_setup.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/simulation_setup/hfss_simulation_setup.rst rename to doc/source/api/grpc/database/pyedb_lib/simulation_setup/hfss_simulation_setup.rst diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/hfss_solver_settings.rst b/doc/source/api/grpc/database/pyedb_lib/simulation_setup/hfss_solver_settings.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/simulation_setup/hfss_solver_settings.rst rename to doc/source/api/grpc/database/pyedb_lib/simulation_setup/hfss_solver_settings.rst diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/index.rst b/doc/source/api/grpc/database/pyedb_lib/simulation_setup/index.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/simulation_setup/index.rst rename to doc/source/api/grpc/database/pyedb_lib/simulation_setup/index.rst diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/mesh_operation.rst b/doc/source/api/grpc/database/pyedb_lib/simulation_setup/mesh_operation.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/simulation_setup/mesh_operation.rst rename to doc/source/api/grpc/database/pyedb_lib/simulation_setup/mesh_operation.rst diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/raptor_x_advanced_settings.rst b/doc/source/api/grpc/database/pyedb_lib/simulation_setup/raptor_x_advanced_settings.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/simulation_setup/raptor_x_advanced_settings.rst rename to doc/source/api/grpc/database/pyedb_lib/simulation_setup/raptor_x_advanced_settings.rst diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/raptor_x_general_settings.rst b/doc/source/api/grpc/database/pyedb_lib/simulation_setup/raptor_x_general_settings.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/simulation_setup/raptor_x_general_settings.rst rename to doc/source/api/grpc/database/pyedb_lib/simulation_setup/raptor_x_general_settings.rst diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/raptor_x_simulation_settings.rst b/doc/source/api/grpc/database/pyedb_lib/simulation_setup/raptor_x_simulation_settings.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/simulation_setup/raptor_x_simulation_settings.rst rename to doc/source/api/grpc/database/pyedb_lib/simulation_setup/raptor_x_simulation_settings.rst diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/raptor_x_simulation_setup.rst b/doc/source/api/grpc/database/pyedb_lib/simulation_setup/raptor_x_simulation_setup.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/simulation_setup/raptor_x_simulation_setup.rst rename to doc/source/api/grpc/database/pyedb_lib/simulation_setup/raptor_x_simulation_setup.rst diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/siwave_dcir_simulation_setup.rst b/doc/source/api/grpc/database/pyedb_lib/simulation_setup/siwave_dcir_simulation_setup.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/simulation_setup/siwave_dcir_simulation_setup.rst rename to doc/source/api/grpc/database/pyedb_lib/simulation_setup/siwave_dcir_simulation_setup.rst diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/siwave_simulation_setup.rst b/doc/source/api/grpc/database/pyedb_lib/simulation_setup/siwave_simulation_setup.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/simulation_setup/siwave_simulation_setup.rst rename to doc/source/api/grpc/database/pyedb_lib/simulation_setup/siwave_simulation_setup.rst diff --git a/doc/source/api/database/pyedb_lib/simulation_setup/sweep_data.rst b/doc/source/api/grpc/database/pyedb_lib/simulation_setup/sweep_data.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/simulation_setup/sweep_data.rst rename to doc/source/api/grpc/database/pyedb_lib/simulation_setup/sweep_data.rst diff --git a/doc/source/api/database/pyedb_lib/terminal/bundle_terminal.rst b/doc/source/api/grpc/database/pyedb_lib/terminal/bundle_terminal.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/terminal/bundle_terminal.rst rename to doc/source/api/grpc/database/pyedb_lib/terminal/bundle_terminal.rst diff --git a/doc/source/api/database/pyedb_lib/terminal/edge_terminal.rst b/doc/source/api/grpc/database/pyedb_lib/terminal/edge_terminal.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/terminal/edge_terminal.rst rename to doc/source/api/grpc/database/pyedb_lib/terminal/edge_terminal.rst diff --git a/doc/source/api/database/pyedb_lib/terminal/index.rst b/doc/source/api/grpc/database/pyedb_lib/terminal/index.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/terminal/index.rst rename to doc/source/api/grpc/database/pyedb_lib/terminal/index.rst diff --git a/doc/source/api/database/pyedb_lib/terminal/padstack_instance_terminal.rst b/doc/source/api/grpc/database/pyedb_lib/terminal/padstack_instance_terminal.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/terminal/padstack_instance_terminal.rst rename to doc/source/api/grpc/database/pyedb_lib/terminal/padstack_instance_terminal.rst diff --git a/doc/source/api/database/pyedb_lib/terminal/pingroup_terminal.rst b/doc/source/api/grpc/database/pyedb_lib/terminal/pingroup_terminal.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/terminal/pingroup_terminal.rst rename to doc/source/api/grpc/database/pyedb_lib/terminal/pingroup_terminal.rst diff --git a/doc/source/api/database/pyedb_lib/terminal/point_terminal.rst b/doc/source/api/grpc/database/pyedb_lib/terminal/point_terminal.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/terminal/point_terminal.rst rename to doc/source/api/grpc/database/pyedb_lib/terminal/point_terminal.rst diff --git a/doc/source/api/database/pyedb_lib/terminal/terminal.rst b/doc/source/api/grpc/database/pyedb_lib/terminal/terminal.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/terminal/terminal.rst rename to doc/source/api/grpc/database/pyedb_lib/terminal/terminal.rst diff --git a/doc/source/api/database/pyedb_lib/utility/heat_sink.rst b/doc/source/api/grpc/database/pyedb_lib/utility/heat_sink.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/utility/heat_sink.rst rename to doc/source/api/grpc/database/pyedb_lib/utility/heat_sink.rst diff --git a/doc/source/api/database/pyedb_lib/utility/hfss_extent_info.rst b/doc/source/api/grpc/database/pyedb_lib/utility/hfss_extent_info.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/utility/hfss_extent_info.rst rename to doc/source/api/grpc/database/pyedb_lib/utility/hfss_extent_info.rst diff --git a/doc/source/api/database/pyedb_lib/utility/index.rst b/doc/source/api/grpc/database/pyedb_lib/utility/index.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/utility/index.rst rename to doc/source/api/grpc/database/pyedb_lib/utility/index.rst diff --git a/doc/source/api/database/pyedb_lib/utility/layout_statistics.rst b/doc/source/api/grpc/database/pyedb_lib/utility/layout_statistics.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/utility/layout_statistics.rst rename to doc/source/api/grpc/database/pyedb_lib/utility/layout_statistics.rst diff --git a/doc/source/api/database/pyedb_lib/utility/rlc.rst b/doc/source/api/grpc/database/pyedb_lib/utility/rlc.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/utility/rlc.rst rename to doc/source/api/grpc/database/pyedb_lib/utility/rlc.rst diff --git a/doc/source/api/database/pyedb_lib/utility/sources.rst b/doc/source/api/grpc/database/pyedb_lib/utility/sources.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/utility/sources.rst rename to doc/source/api/grpc/database/pyedb_lib/utility/sources.rst diff --git a/doc/source/api/database/pyedb_lib/utility/xml_control_file.rst b/doc/source/api/grpc/database/pyedb_lib/utility/xml_control_file.rst similarity index 100% rename from doc/source/api/database/pyedb_lib/utility/xml_control_file.rst rename to doc/source/api/grpc/database/pyedb_lib/utility/xml_control_file.rst diff --git a/doc/source/api/database/siwave.rst b/doc/source/api/grpc/database/siwave.rst similarity index 100% rename from doc/source/api/database/siwave.rst rename to doc/source/api/grpc/database/siwave.rst diff --git a/doc/source/api/database/source_excitations.rst b/doc/source/api/grpc/database/source_excitations.rst similarity index 100% rename from doc/source/api/database/source_excitations.rst rename to doc/source/api/grpc/database/source_excitations.rst diff --git a/doc/source/api/database/stackup.rst b/doc/source/api/grpc/database/stackup.rst similarity index 100% rename from doc/source/api/database/stackup.rst rename to doc/source/api/grpc/database/stackup.rst diff --git a/doc/source/api/grpc/edb.rst b/doc/source/api/grpc/edb.rst new file mode 100644 index 0000000000..235f83a88b --- /dev/null +++ b/doc/source/api/grpc/edb.rst @@ -0,0 +1,15 @@ +.. _edb_main_class: + +Edb main class +============== + +An AEDB database is a folder that contains the database representing any part of a PCB. +It can be opened and edited using the ``Edb`` class. + +.. currentmodule:: pyedb.grpc + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + edb.Edb \ No newline at end of file diff --git a/doc/source/api/grpc/index.rst b/doc/source/api/grpc/index.rst new file mode 100644 index 0000000000..4c626e5364 --- /dev/null +++ b/doc/source/api/grpc/index.rst @@ -0,0 +1,12 @@ + +PyEDB +===== + +This section describes EDB main class. + + +.. toctree:: + :maxdepth: 2 + + edb + database/index diff --git a/doc/source/api/index.rst b/doc/source/api/index.rst index 7886230d97..081f75f0a1 100644 --- a/doc/source/api/index.rst +++ b/doc/source/api/index.rst @@ -13,38 +13,18 @@ methods are inherited into the ``Edb`` class. If EDB is launched within the ``HfssdLayout`` class, EDB is accessible in read-only mode. -.. image:: ../resources/edb_intro.png - :width: 800 - :alt: EDB apps - :target: https://www.ansys.com/applications/pcbs-ics-ic-packages - .. tab-set:: .. tab-item:: gRPC - .. code-block:: python - - from pyedb.grpc.edb import Edb - - edb = Edb("my_project.aedb", edbversion="2025.2") - edb.core_components.components["R1"].r_value = 40 - edb.close_edb() - .. toctree:: - :maxdepth: 2 + :maxdepth: 3 - edb - database/index + grpc/index .. tab-item:: DotNet - .. code-block:: python - - from pyedb.grpc.edb import Edb - edb = Edb("my_project.aedb", edbversion="2025.2") - edb.core_components.components["R1"].r_value = 40 - edb.close_edb() From e15abe94d79c3e9b832c82ed57de1c0d15aa5227 Mon Sep 17 00:00:00 2001 From: svandenb-dev Date: Wed, 25 Jun 2025 14:09:10 +0200 Subject: [PATCH 14/29] dotnet doc fix --- doc/source/api/dotnet/CoreEdb.rst | 79 +++++++++++++++++++ doc/source/api/dotnet/SiWave.rst | 35 ++++++++ doc/source/api/dotnet/XmlControlFile.rst | 24 ++++++ doc/source/api/dotnet/edb_data/EdbValue.rst | 12 +++ .../api/dotnet/edb_data/HfssExtentInfo.rst | 12 +++ doc/source/api/dotnet/edb_data/LayerData.rst | 29 +++++++ doc/source/api/dotnet/edb_data/NetData.rst | 32 ++++++++ .../api/dotnet/edb_data/PadstackData.rst | 17 ++++ doc/source/api/dotnet/edb_data/PortsData.rst | 26 ++++++ .../api/dotnet/edb_data/PrimitivesData.rst | 32 ++++++++ .../edb_data/RaptorXSimulationSetup.rst | 15 ++++ doc/source/api/dotnet/edb_data/SourceData.rst | 21 +++++ doc/source/api/dotnet/edb_data/Utilities.rst | 12 +++ doc/source/api/dotnet/edb_data/Variables.rst | 12 +++ doc/source/api/dotnet/edb_data/index.rst | 22 ++++++ .../data/adaptive_frequency_data.rst | 15 ++++ .../api/dotnet/sim_setup_data/data/index.rst | 17 ++++ .../sim_setup_data/data/mesh_operation.rst | 18 +++++ .../dotnet/sim_setup_data/data/settings.rst | 22 ++++++ .../sim_setup_data/data/sim_setup_info.rst | 15 ++++ .../data/simulation_settings.rst | 18 +++++ .../data/siw_dc_ir_settings.rst | 15 ++++ .../dotnet/sim_setup_data/data/sweep_data.rst | 15 ++++ .../api/dotnet/sim_setup_data/io/index.rst | 10 +++ .../api/dotnet/sim_setup_data/io/siwave.rst | 18 +++++ doc/source/api/dotnet/utilities/heatsink.rst | 15 ++++ .../utilities/hfss_simulation_setup.rst | 16 ++++ doc/source/api/dotnet/utilities/index.rst | 14 ++++ .../api/dotnet/utilities/simulation_setup.rst | 17 ++++ .../utilities/siwave_simulation_setup.rst | 16 ++++ 30 files changed, 621 insertions(+) create mode 100644 doc/source/api/dotnet/CoreEdb.rst create mode 100644 doc/source/api/dotnet/SiWave.rst create mode 100644 doc/source/api/dotnet/XmlControlFile.rst create mode 100644 doc/source/api/dotnet/edb_data/EdbValue.rst create mode 100644 doc/source/api/dotnet/edb_data/HfssExtentInfo.rst create mode 100644 doc/source/api/dotnet/edb_data/LayerData.rst create mode 100644 doc/source/api/dotnet/edb_data/NetData.rst create mode 100644 doc/source/api/dotnet/edb_data/PadstackData.rst create mode 100644 doc/source/api/dotnet/edb_data/PortsData.rst create mode 100644 doc/source/api/dotnet/edb_data/PrimitivesData.rst create mode 100644 doc/source/api/dotnet/edb_data/RaptorXSimulationSetup.rst create mode 100644 doc/source/api/dotnet/edb_data/SourceData.rst create mode 100644 doc/source/api/dotnet/edb_data/Utilities.rst create mode 100644 doc/source/api/dotnet/edb_data/Variables.rst create mode 100644 doc/source/api/dotnet/edb_data/index.rst create mode 100644 doc/source/api/dotnet/sim_setup_data/data/adaptive_frequency_data.rst create mode 100644 doc/source/api/dotnet/sim_setup_data/data/index.rst create mode 100644 doc/source/api/dotnet/sim_setup_data/data/mesh_operation.rst create mode 100644 doc/source/api/dotnet/sim_setup_data/data/settings.rst create mode 100644 doc/source/api/dotnet/sim_setup_data/data/sim_setup_info.rst create mode 100644 doc/source/api/dotnet/sim_setup_data/data/simulation_settings.rst create mode 100644 doc/source/api/dotnet/sim_setup_data/data/siw_dc_ir_settings.rst create mode 100644 doc/source/api/dotnet/sim_setup_data/data/sweep_data.rst create mode 100644 doc/source/api/dotnet/sim_setup_data/io/index.rst create mode 100644 doc/source/api/dotnet/sim_setup_data/io/siwave.rst create mode 100644 doc/source/api/dotnet/utilities/heatsink.rst create mode 100644 doc/source/api/dotnet/utilities/hfss_simulation_setup.rst create mode 100644 doc/source/api/dotnet/utilities/index.rst create mode 100644 doc/source/api/dotnet/utilities/simulation_setup.rst create mode 100644 doc/source/api/dotnet/utilities/siwave_simulation_setup.rst diff --git a/doc/source/api/dotnet/CoreEdb.rst b/doc/source/api/dotnet/CoreEdb.rst new file mode 100644 index 0000000000..42bbf3609e --- /dev/null +++ b/doc/source/api/dotnet/CoreEdb.rst @@ -0,0 +1,79 @@ +EDB manager +=========== +An AEDB database is a folder that contains the database representing any part of a PCB. +It can be opened and edited using the ``Edb`` class. + +.. image:: ../resources/3dlayout_1.png + :width: 800 + :alt: HFSS 3D Layout is the tool used to visualize EDB content. + + +.. currentmodule:: pyedb.dotnet +.. autosummary:: + :toctree: _autosummary + + edb.Edb + + +.. code:: python + + from pyedb import Edb + + # this call returns the Edb class initialized on 2024R2 + edb = Edb(myedb, edbversion="2024.2") + + ... + + +EDB modules +~~~~~~~~~~~ +This section lists the core EDB modules for reading and writing information +to AEDB files. + + +.. currentmodule:: pyedb.dotnet.database + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + components.Components + hfss.EdbHfss + layout_validation.LayoutValidation + materials.Materials + modeler.Modeler + nets.EdbNets + edb_data.padstacks_data.EDBPadstack + siwave.EdbSiwave + stackup.Stackup + + + +.. code:: python + + from pyedb import Edb + + edb = Edb(myedb, edbversion="2023.1") + + # this call returns the EdbHfss Class + comp = edb.hfss + + # this call returns the Components Class + comp = edb.components + + # this call returns the EdbSiwave Class + comp = edb.siwave + + # this call returns the EdbPadstacks Class + comp = edb.padstacks + + # this call returns the Stackup Class + comp = edb.stackup + + # this call returns the Materials Class + comp = edb.materials + + # this call returns the EdbNets Class + comp = edb.nets + + ... diff --git a/doc/source/api/dotnet/SiWave.rst b/doc/source/api/dotnet/SiWave.rst new file mode 100644 index 0000000000..d02d5e59ed --- /dev/null +++ b/doc/source/api/dotnet/SiWave.rst @@ -0,0 +1,35 @@ +SIwave manager +============== +`SIwave `_ is a specialized tool +for power integrity, signal integrity, and EMI analysis of IC packages and PCB. This tool +solves power delivery systems and high-speed channels in electronic devices. It can be +accessed from PyEDB in Windows only. All setups can be implemented through EDB API. + +.. image:: ../resources/siwave.png + :width: 800 + :alt: EdbSiwave + :target: https://www.ansys.com/products/electronics/ansys-siwave + + +.. currentmodule:: pyedb.siwave + +.. autosummary:: + :toctree: _autosummary + + Siwave + + +.. code:: python + + from pyedb.siwave import Siwave + + # this call returns the Edb class initialized on 2024 R2 + siwave = Siwave("2024.2") + siwave.open_project("pyproject.siw") + siwave.export_element_data("mydata.txt") + siwave.close_project() + ... + +.. currentmodule:: pyedb.siwave_core.icepak + Icepak + diff --git a/doc/source/api/dotnet/XmlControlFile.rst b/doc/source/api/dotnet/XmlControlFile.rst new file mode 100644 index 0000000000..17a40e6c8b --- /dev/null +++ b/doc/source/api/dotnet/XmlControlFile.rst @@ -0,0 +1,24 @@ +XML control file +================ +Convert a technology file to EDB control file. + + +.. currentmodule:: pyedb.dotnet.database.edb_data.control_file + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + ControlProperty + ControlFileMaterial + ControlFileDielectric + ControlFileLayer + ControlFileVia + ControlFileStackup + ControlFileImportOptions + ControlExtent + ControlCircuitPt + ControlFileComponent + ControlFileComponents + + diff --git a/doc/source/api/dotnet/edb_data/EdbValue.rst b/doc/source/api/dotnet/edb_data/EdbValue.rst new file mode 100644 index 0000000000..cfe3e4b539 --- /dev/null +++ b/doc/source/api/dotnet/edb_data/EdbValue.rst @@ -0,0 +1,12 @@ +EDB value +========= +Class managing EDB Value. + + +.. currentmodule:: pyedb.dotnet.database.edb_data.edbvalue + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + EdbValue diff --git a/doc/source/api/dotnet/edb_data/HfssExtentInfo.rst b/doc/source/api/dotnet/edb_data/HfssExtentInfo.rst new file mode 100644 index 0000000000..e7d5a4b35e --- /dev/null +++ b/doc/source/api/dotnet/edb_data/HfssExtentInfo.rst @@ -0,0 +1,12 @@ +HFSS extent info +================ +These class is the containers of HFSS Extent. + + +.. currentmodule:: pyedb.dotnet.database.edb_data.hfss_extent_info + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + HfssExtentInfo diff --git a/doc/source/api/dotnet/edb_data/LayerData.rst b/doc/source/api/dotnet/edb_data/LayerData.rst new file mode 100644 index 0000000000..a38fa090f2 --- /dev/null +++ b/doc/source/api/dotnet/edb_data/LayerData.rst @@ -0,0 +1,29 @@ +Stackup & layers +================ +These classes are the containers of the layer and stackup manager of the EDB API. + + +.. code:: python + + from pyedb import Edb + + edb = Edb(myedb, edbversion="2023.1") + + # this call returns the EDBLayers class + layer = edb.stackup.stackup_layers + + # this call returns the EDBLayer class + layer = edb.stackup["TOP"] + ... + + +.. currentmodule:: pyedb.dotnet.database.edb_data.layer_data + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + + LayerEdbClass + + diff --git a/doc/source/api/dotnet/edb_data/NetData.rst b/doc/source/api/dotnet/edb_data/NetData.rst new file mode 100644 index 0000000000..ee2648e90a --- /dev/null +++ b/doc/source/api/dotnet/edb_data/NetData.rst @@ -0,0 +1,32 @@ +Nets +==== + +Net properties +-------------- +The following class is the container of data management for nets, extended nets and differential pairs. + + +.. currentmodule:: pyedb.dotnet.database.edb_data.nets_data + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + EDBNetsData + EDBNetClassData + EDBExtendedNetData + EDBDifferentialPairData + +.. code:: python + + from pyedb import Edb + + edb = Edb(myedb, edbversion="2024.2") + + edb.nets["M_MA<6>"].delete() + edb.net_classes + edb.differential_pairs + edb.extended_nets + + + ... \ No newline at end of file diff --git a/doc/source/api/dotnet/edb_data/PadstackData.rst b/doc/source/api/dotnet/edb_data/PadstackData.rst new file mode 100644 index 0000000000..1f3e28fd1b --- /dev/null +++ b/doc/source/api/dotnet/edb_data/PadstackData.rst @@ -0,0 +1,17 @@ +vias and padstacks +================== + +Instances and definitions +------------------------- +These classes are the containers of data management for padstacks instances and padstack definitions. + + +.. currentmodule:: pyedb.dotnet.database.edb_data.padstacks_data + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + EDBPadProperties + EDBPadstack + EDBPadstackInstance diff --git a/doc/source/api/dotnet/edb_data/PortsData.rst b/doc/source/api/dotnet/edb_data/PortsData.rst new file mode 100644 index 0000000000..7b9099a26c --- /dev/null +++ b/doc/source/api/dotnet/edb_data/PortsData.rst @@ -0,0 +1,26 @@ +Ports +===== +These classes are the containers of ports methods of the EDB for both HFSS and SIwave. + +.. autosummary:: + :toctree: _autosummary + +.. code:: python + + from pyedb import Edb + + edb = Edb(myedb, edbversion="2023.1") + + # this call returns the EDB excitations dictionary + edb.ports + ... + + +.. currentmodule:: pyedb.dotnet.database.edb_data.ports + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + GapPort + WavePort diff --git a/doc/source/api/dotnet/edb_data/PrimitivesData.rst b/doc/source/api/dotnet/edb_data/PrimitivesData.rst new file mode 100644 index 0000000000..86e1561986 --- /dev/null +++ b/doc/source/api/dotnet/edb_data/PrimitivesData.rst @@ -0,0 +1,32 @@ +Modeler & primitives +==================== +These classes are the containers of primitives and all relative methods. +Primitives are planes, lines, rectangles, and circles. + + +Primitives properties +--------------------- +These classes are the containers of data management for primitives and arcs. + +.. currentmodule:: pyedb.dotnet.database.edb_data.primitives_data + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + + EDBArcs + EdbPolygon + + +.. code:: python + + from pyedb import Edb + + edb = Edb(myedb, edbversion="2023.1") + + polygon = edbapp.modeler.polygons[0] + polygon.is_void + poly2 = polygon.clone() + + ... diff --git a/doc/source/api/dotnet/edb_data/RaptorXSimulationSetup.rst b/doc/source/api/dotnet/edb_data/RaptorXSimulationSetup.rst new file mode 100644 index 0000000000..efca87b771 --- /dev/null +++ b/doc/source/api/dotnet/edb_data/RaptorXSimulationSetup.rst @@ -0,0 +1,15 @@ +RaptorX simulation setup +======================== +These classes are the containers of RaptorX simulation setup. + + +.. currentmodule:: pyedb.dotnet.database.edb_data.raptor_x_simulation_setup_data + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + RaptorXSimulationSetup + RaptorXSimulationSettings + RaptorXGeneralSettings + RaptorXSimulationAdvancedSettings \ No newline at end of file diff --git a/doc/source/api/dotnet/edb_data/SourceData.rst b/doc/source/api/dotnet/edb_data/SourceData.rst new file mode 100644 index 0000000000..cf4e02f9d3 --- /dev/null +++ b/doc/source/api/dotnet/edb_data/SourceData.rst @@ -0,0 +1,21 @@ +Sources and excitations +======================= +These classes are the containers of sources methods of the EDB for both HFSS and SIwave. + + +.. code:: python + + from pyedb import Edb + + edb = Edb(myedb, edbversion="2024.2") + + # this call returns the EDB excitations dictionary + edb.excitations + ... + + +.. currentmodule:: pyedb.dotnet.database.edb_data.sources + +.. autosummary:: + :toctree: _autosummary + :nosignatures: diff --git a/doc/source/api/dotnet/edb_data/Utilities.rst b/doc/source/api/dotnet/edb_data/Utilities.rst new file mode 100644 index 0000000000..e500cc63ac --- /dev/null +++ b/doc/source/api/dotnet/edb_data/Utilities.rst @@ -0,0 +1,12 @@ +EDB utilities +============= +Class managing EDB utilities. + + +.. currentmodule:: pyedb.dotnet.database.edb_data.utilities + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + EDBStatistics diff --git a/doc/source/api/dotnet/edb_data/Variables.rst b/doc/source/api/dotnet/edb_data/Variables.rst new file mode 100644 index 0000000000..ceee4b498e --- /dev/null +++ b/doc/source/api/dotnet/edb_data/Variables.rst @@ -0,0 +1,12 @@ +Variables +========= +Class managing EDB Variables. + + +.. currentmodule:: pyedb.dotnet.database.edb_data.variables + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + Variable diff --git a/doc/source/api/dotnet/edb_data/index.rst b/doc/source/api/dotnet/edb_data/index.rst new file mode 100644 index 0000000000..dac2f349bf --- /dev/null +++ b/doc/source/api/dotnet/edb_data/index.rst @@ -0,0 +1,22 @@ +================ +EDB data classes +================ + +This section describes EDB data classes. + + +.. toctree:: + :maxdepth: 2 + + EdbValue + HfssExtentInfo + LayerData + NetData + PadstackData + PortsData + PrimitivesData + RaptorXSimulationSetup + SourceData + Utilities + Variables + diff --git a/doc/source/api/dotnet/sim_setup_data/data/adaptive_frequency_data.rst b/doc/source/api/dotnet/sim_setup_data/data/adaptive_frequency_data.rst new file mode 100644 index 0000000000..27087a65f7 --- /dev/null +++ b/doc/source/api/dotnet/sim_setup_data/data/adaptive_frequency_data.rst @@ -0,0 +1,15 @@ +Adaptive frequency data +======================= +This class is the container of HFSS adaptive frequency data. + + +.. currentmodule:: pyedb.dotnet.database.sim_setup_data.data.adaptive_frequency_data + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + + AdaptiveFrequencyData + + diff --git a/doc/source/api/dotnet/sim_setup_data/data/index.rst b/doc/source/api/dotnet/sim_setup_data/data/index.rst new file mode 100644 index 0000000000..56337d89cf --- /dev/null +++ b/doc/source/api/dotnet/sim_setup_data/data/index.rst @@ -0,0 +1,17 @@ +===================== +Simulation setup data +===================== + +This section describes Simulation setup data. + + +.. toctree:: + :maxdepth: 2 + + adaptive_frequency_data + mesh_operation + settings + sim_setup_info + simulation_settings + siw_dc_ir_settings + sweep_data \ No newline at end of file diff --git a/doc/source/api/dotnet/sim_setup_data/data/mesh_operation.rst b/doc/source/api/dotnet/sim_setup_data/data/mesh_operation.rst new file mode 100644 index 0000000000..a190561bfd --- /dev/null +++ b/doc/source/api/dotnet/sim_setup_data/data/mesh_operation.rst @@ -0,0 +1,18 @@ +Mesh operation +============== +This class is the container of HFSS mesh operation. + + +.. currentmodule:: pyedb.dotnet.database.sim_setup_data.data.mesh_operation + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + + MeshOpType + MeshOperation + LengthMeshOperation + SkinDepthMeshOperation + + diff --git a/doc/source/api/dotnet/sim_setup_data/data/settings.rst b/doc/source/api/dotnet/sim_setup_data/data/settings.rst new file mode 100644 index 0000000000..c79bb25648 --- /dev/null +++ b/doc/source/api/dotnet/sim_setup_data/data/settings.rst @@ -0,0 +1,22 @@ +HFSS simulation setup settings +============================== +These classes are the containers of HFSS simulation setup settings. + + +.. currentmodule:: pyedb.dotnet.database.sim_setup_data.data.settings + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + + AdaptiveSettings + DefeatureSettings + AdvancedMeshSettings + ViaSettings + CurveApproxSettings + DcrSettings + HfssPortSettings + HfssSolverSettings + + diff --git a/doc/source/api/dotnet/sim_setup_data/data/sim_setup_info.rst b/doc/source/api/dotnet/sim_setup_data/data/sim_setup_info.rst new file mode 100644 index 0000000000..a5e564c668 --- /dev/null +++ b/doc/source/api/dotnet/sim_setup_data/data/sim_setup_info.rst @@ -0,0 +1,15 @@ +Simulation setup info +====================== +This class is the container of simulation setup info. + + +.. currentmodule:: pyedb.dotnet.database.sim_setup_data.data.sim_setup_info + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + + SimSetupInfo + + diff --git a/doc/source/api/dotnet/sim_setup_data/data/simulation_settings.rst b/doc/source/api/dotnet/sim_setup_data/data/simulation_settings.rst new file mode 100644 index 0000000000..ed0f5c9499 --- /dev/null +++ b/doc/source/api/dotnet/sim_setup_data/data/simulation_settings.rst @@ -0,0 +1,18 @@ +Simulation settings +=================== +These classes are the containers of simulation settings. + + +.. currentmodule:: pyedb.dotnet.database.sim_setup_data.data.simulation_settings + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + + BaseSimulationSettings + SimulationSettings + HFSSSimulationSettings + HFSSPISimulationSettings + + diff --git a/doc/source/api/dotnet/sim_setup_data/data/siw_dc_ir_settings.rst b/doc/source/api/dotnet/sim_setup_data/data/siw_dc_ir_settings.rst new file mode 100644 index 0000000000..cedfeef7e4 --- /dev/null +++ b/doc/source/api/dotnet/sim_setup_data/data/siw_dc_ir_settings.rst @@ -0,0 +1,15 @@ +SIwave DC-IR settings +===================== +This class is the container of SIwave DC-IR settings. + + +.. currentmodule:: pyedb.dotnet.database.sim_setup_data.data.siw_dc_ir_settings + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + + SiwaveDCIRSettings + + diff --git a/doc/source/api/dotnet/sim_setup_data/data/sweep_data.rst b/doc/source/api/dotnet/sim_setup_data/data/sweep_data.rst new file mode 100644 index 0000000000..e60380f10a --- /dev/null +++ b/doc/source/api/dotnet/sim_setup_data/data/sweep_data.rst @@ -0,0 +1,15 @@ +Sweep data +========== +This class is the container of sweep data. + + +.. currentmodule:: pyedb.dotnet.database.sim_setup_data.data.sweep_data + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + + SweepData + + diff --git a/doc/source/api/dotnet/sim_setup_data/io/index.rst b/doc/source/api/dotnet/sim_setup_data/io/index.rst new file mode 100644 index 0000000000..39de17f627 --- /dev/null +++ b/doc/source/api/dotnet/sim_setup_data/io/index.rst @@ -0,0 +1,10 @@ +=================== +Simulation setup IO +=================== + +This section describes Simulation setup IO. + + +.. toctree:: + :maxdepth: 2 + diff --git a/doc/source/api/dotnet/sim_setup_data/io/siwave.rst b/doc/source/api/dotnet/sim_setup_data/io/siwave.rst new file mode 100644 index 0000000000..c6e238d397 --- /dev/null +++ b/doc/source/api/dotnet/sim_setup_data/io/siwave.rst @@ -0,0 +1,18 @@ +SIwave IO +========= +This class is the container of SIwave IO. + + +.. currentmodule:: pyedb.dotnet.database.sim_setup_data.io.siwave + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + + SettingsBase + AdvancedSettings + DCSettings + DCAdvancedSettings + + diff --git a/doc/source/api/dotnet/utilities/heatsink.rst b/doc/source/api/dotnet/utilities/heatsink.rst new file mode 100644 index 0000000000..8aec753574 --- /dev/null +++ b/doc/source/api/dotnet/utilities/heatsink.rst @@ -0,0 +1,15 @@ +Icepak heat sink +================ +This class is the container of Icepak heat sink. + + +.. currentmodule:: pyedb.dotnet.database.utilities.heatsink + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + + HeatSink + + diff --git a/doc/source/api/dotnet/utilities/hfss_simulation_setup.rst b/doc/source/api/dotnet/utilities/hfss_simulation_setup.rst new file mode 100644 index 0000000000..124c778074 --- /dev/null +++ b/doc/source/api/dotnet/utilities/hfss_simulation_setup.rst @@ -0,0 +1,16 @@ +HFSS simulation setup +===================== +These classes are the containers of HFSS simulation setup. + + +.. currentmodule:: pyedb.dotnet.database.utilities.hfss_simulation_setup + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + + HfssSimulationSetup + HFSSPISimulationSetup + + diff --git a/doc/source/api/dotnet/utilities/index.rst b/doc/source/api/dotnet/utilities/index.rst new file mode 100644 index 0000000000..84049581ae --- /dev/null +++ b/doc/source/api/dotnet/utilities/index.rst @@ -0,0 +1,14 @@ +========= +Utilities +========= + +This section describes utilities. + + +.. toctree:: + :maxdepth: 2 + + heatsink + hfss_simulation_setup + simulation_setup + siwave_simulation_setup \ No newline at end of file diff --git a/doc/source/api/dotnet/utilities/simulation_setup.rst b/doc/source/api/dotnet/utilities/simulation_setup.rst new file mode 100644 index 0000000000..1b4e1cfdbd --- /dev/null +++ b/doc/source/api/dotnet/utilities/simulation_setup.rst @@ -0,0 +1,17 @@ +Simulation setup +================ +This class is the container of simulation setup. + + +.. currentmodule:: pyedb.dotnet.database.utilities.simulation_setup + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + + SimulationSetupType + AdaptiveType + SimulationSetup + + diff --git a/doc/source/api/dotnet/utilities/siwave_simulation_setup.rst b/doc/source/api/dotnet/utilities/siwave_simulation_setup.rst new file mode 100644 index 0000000000..bb68102e2c --- /dev/null +++ b/doc/source/api/dotnet/utilities/siwave_simulation_setup.rst @@ -0,0 +1,16 @@ +SIwave simulation setup +======================= +These classes are the containers of siwave simulation setup. + + +.. currentmodule:: pyedb.dotnet.database.utilities.siwave_simulation_setup + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + + SiwaveSimulationSetup + SiwaveDCSimulationSetup + + From 5cc2a6f5d13e1987e581cf6ce3d8afe72dbbb6c0 Mon Sep 17 00:00:00 2001 From: svandenb-dev Date: Wed, 25 Jun 2025 15:16:30 +0200 Subject: [PATCH 15/29] dotnet removed --- doc/source/api/dotnet/CoreEdb.rst | 79 --------- doc/source/api/dotnet/SiWave.rst | 35 ---- doc/source/api/dotnet/XmlControlFile.rst | 24 --- doc/source/api/dotnet/edb_data/EdbValue.rst | 12 -- .../api/dotnet/edb_data/HfssExtentInfo.rst | 12 -- doc/source/api/dotnet/edb_data/LayerData.rst | 29 ---- doc/source/api/dotnet/edb_data/NetData.rst | 32 ---- .../api/dotnet/edb_data/PadstackData.rst | 17 -- doc/source/api/dotnet/edb_data/PortsData.rst | 26 --- .../api/dotnet/edb_data/PrimitivesData.rst | 32 ---- .../edb_data/RaptorXSimulationSetup.rst | 15 -- doc/source/api/dotnet/edb_data/SourceData.rst | 21 --- doc/source/api/dotnet/edb_data/Utilities.rst | 12 -- doc/source/api/dotnet/edb_data/Variables.rst | 12 -- doc/source/api/dotnet/edb_data/index.rst | 22 --- .../data/adaptive_frequency_data.rst | 15 -- .../api/dotnet/sim_setup_data/data/index.rst | 17 -- .../sim_setup_data/data/mesh_operation.rst | 18 -- .../dotnet/sim_setup_data/data/settings.rst | 22 --- .../sim_setup_data/data/sim_setup_info.rst | 15 -- .../data/simulation_settings.rst | 18 -- .../data/siw_dc_ir_settings.rst | 15 -- .../dotnet/sim_setup_data/data/sweep_data.rst | 15 -- .../api/dotnet/sim_setup_data/io/index.rst | 10 -- .../api/dotnet/sim_setup_data/io/siwave.rst | 18 -- doc/source/api/dotnet/utilities/heatsink.rst | 15 -- .../utilities/hfss_simulation_setup.rst | 16 -- doc/source/api/dotnet/utilities/index.rst | 14 -- .../api/dotnet/utilities/simulation_setup.rst | 17 -- .../utilities/siwave_simulation_setup.rst | 16 -- .../grpc_api/SimulationConfigurationV2.rst | 155 ++++++++++++++++++ .../grpc/database/components.rst | 0 .../grpc/database/control_file.rst | 0 .../grpc/database/definitions.rst | 0 .../{api => grpc_api}/grpc/database/hfss.rst | 0 .../{api => grpc_api}/grpc/database/index.rst | 0 .../grpc/database/layout_validation.rst | 0 .../grpc/database/modeler.rst | 0 .../{api => grpc_api}/grpc/database/nets.rst | 0 .../grpc/database/padstacks.rst | 0 .../pyedb_lib/definition/component_def.rst | 0 .../database/pyedb_lib/definition/index.rst | 0 .../pyedb_lib/definition/materials.rst | 0 .../pyedb_lib/definition/package_def.rst | 0 .../pyedb_lib/definition/padstack_def.rst | 0 .../database/pyedb_lib/geometry/arc_data.rst | 0 .../database/pyedb_lib/geometry/index.rst | 0 .../pyedb_lib/geometry/point_3d_data.rst | 0 .../pyedb_lib/geometry/point_data.rst | 0 .../pyedb_lib/geometry/polygon_data.rst | 0 .../pyedb_lib/hierarchy/component.rst | 0 .../database/pyedb_lib/hierarchy/index.rst | 0 .../database/pyedb_lib/hierarchy/model.rst | 0 .../pyedb_lib/hierarchy/netlist_model.rst | 0 .../pyedb_lib/hierarchy/pin_pair_model.rst | 0 .../database/pyedb_lib/hierarchy/pingroup.rst | 0 .../pyedb_lib/hierarchy/s_parameter_model.rst | 0 .../pyedb_lib/hierarchy/spice_model.rst | 0 .../grpc/database/pyedb_lib/index.rst | 0 .../grpc/database/pyedb_lib/layers/index.rst | 0 .../grpc/database/pyedb_lib/layers/layer.rst | 0 .../pyedb_lib/layers/stackup_layer.rst | 0 .../grpc/database/pyedb_lib/layout/cell.rst | 0 .../grpc/database/pyedb_lib/layout/index.rst | 0 .../grpc/database/pyedb_lib/layout/layout.rst | 0 .../pyedb_lib/layout/voltage_regulator.rst | 0 .../pyedb_lib/net/differential_pair.rst | 0 .../database/pyedb_lib/net/extended_net.rst | 0 .../grpc/database/pyedb_lib/net/index.rst | 0 .../grpc/database/pyedb_lib/net/net.rst | 0 .../grpc/database/pyedb_lib/net/net_class.rst | 0 .../grpc/database/pyedb_lib/ports/index.rst | 0 .../grpc/database/pyedb_lib/ports/ports.rst | 0 .../database/pyedb_lib/primitive/bondwire.rst | 0 .../database/pyedb_lib/primitive/circle.rst | 0 .../database/pyedb_lib/primitive/index.rst | 0 .../pyedb_lib/primitive/padstack_instance.rst | 0 .../database/pyedb_lib/primitive/path.rst | 0 .../database/pyedb_lib/primitive/polygon.rst | 0 .../pyedb_lib/primitive/primitive.rst | 0 .../pyedb_lib/primitive/rectangle.rst | 0 .../simulation_setup/adaptive_frequency.rst | 0 .../hfss_advanced_meshing_settings.rst | 0 .../hfss_advanced_settings.rst | 0 .../simulation_setup/hfss_dcr_settings.rst | 0 .../hfss_general_settings.rst | 0 .../hfss_settings_options.rst | 0 .../hfss_simulation_settings.rst | 0 .../hfss_simulation_setup.rst | 0 .../simulation_setup/hfss_solver_settings.rst | 0 .../pyedb_lib/simulation_setup/index.rst | 0 .../simulation_setup/mesh_operation.rst | 0 .../raptor_x_advanced_settings.rst | 0 .../raptor_x_general_settings.rst | 0 .../raptor_x_simulation_settings.rst | 0 .../raptor_x_simulation_setup.rst | 0 .../siwave_dcir_simulation_setup.rst | 0 .../siwave_simulation_setup.rst | 0 .../pyedb_lib/simulation_setup/sweep_data.rst | 0 .../pyedb_lib/terminal/bundle_terminal.rst | 0 .../pyedb_lib/terminal/edge_terminal.rst | 0 .../database/pyedb_lib/terminal/index.rst | 0 .../terminal/padstack_instance_terminal.rst | 0 .../pyedb_lib/terminal/pingroup_terminal.rst | 0 .../pyedb_lib/terminal/point_terminal.rst | 0 .../database/pyedb_lib/terminal/terminal.rst | 0 .../database/pyedb_lib/utility/heat_sink.rst | 0 .../pyedb_lib/utility/hfss_extent_info.rst | 0 .../grpc/database/pyedb_lib/utility/index.rst | 0 .../pyedb_lib/utility/layout_statistics.rst | 0 .../grpc/database/pyedb_lib/utility/rlc.rst | 0 .../database/pyedb_lib/utility/sources.rst | 0 .../pyedb_lib/utility/xml_control_file.rst | 0 .../grpc/database/siwave.rst | 0 .../grpc/database/source_excitations.rst | 0 .../grpc/database/stackup.rst | 0 doc/source/{api => grpc_api}/grpc/edb.rst | 0 doc/source/{api => grpc_api}/grpc/index.rst | 0 doc/source/{api => grpc_api}/index.rst | 16 +- doc/source/index.rst | 4 +- 120 files changed, 163 insertions(+), 633 deletions(-) delete mode 100644 doc/source/api/dotnet/CoreEdb.rst delete mode 100644 doc/source/api/dotnet/SiWave.rst delete mode 100644 doc/source/api/dotnet/XmlControlFile.rst delete mode 100644 doc/source/api/dotnet/edb_data/EdbValue.rst delete mode 100644 doc/source/api/dotnet/edb_data/HfssExtentInfo.rst delete mode 100644 doc/source/api/dotnet/edb_data/LayerData.rst delete mode 100644 doc/source/api/dotnet/edb_data/NetData.rst delete mode 100644 doc/source/api/dotnet/edb_data/PadstackData.rst delete mode 100644 doc/source/api/dotnet/edb_data/PortsData.rst delete mode 100644 doc/source/api/dotnet/edb_data/PrimitivesData.rst delete mode 100644 doc/source/api/dotnet/edb_data/RaptorXSimulationSetup.rst delete mode 100644 doc/source/api/dotnet/edb_data/SourceData.rst delete mode 100644 doc/source/api/dotnet/edb_data/Utilities.rst delete mode 100644 doc/source/api/dotnet/edb_data/Variables.rst delete mode 100644 doc/source/api/dotnet/edb_data/index.rst delete mode 100644 doc/source/api/dotnet/sim_setup_data/data/adaptive_frequency_data.rst delete mode 100644 doc/source/api/dotnet/sim_setup_data/data/index.rst delete mode 100644 doc/source/api/dotnet/sim_setup_data/data/mesh_operation.rst delete mode 100644 doc/source/api/dotnet/sim_setup_data/data/settings.rst delete mode 100644 doc/source/api/dotnet/sim_setup_data/data/sim_setup_info.rst delete mode 100644 doc/source/api/dotnet/sim_setup_data/data/simulation_settings.rst delete mode 100644 doc/source/api/dotnet/sim_setup_data/data/siw_dc_ir_settings.rst delete mode 100644 doc/source/api/dotnet/sim_setup_data/data/sweep_data.rst delete mode 100644 doc/source/api/dotnet/sim_setup_data/io/index.rst delete mode 100644 doc/source/api/dotnet/sim_setup_data/io/siwave.rst delete mode 100644 doc/source/api/dotnet/utilities/heatsink.rst delete mode 100644 doc/source/api/dotnet/utilities/hfss_simulation_setup.rst delete mode 100644 doc/source/api/dotnet/utilities/index.rst delete mode 100644 doc/source/api/dotnet/utilities/simulation_setup.rst delete mode 100644 doc/source/api/dotnet/utilities/siwave_simulation_setup.rst create mode 100644 doc/source/grpc_api/SimulationConfigurationV2.rst rename doc/source/{api => grpc_api}/grpc/database/components.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/control_file.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/definitions.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/hfss.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/index.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/layout_validation.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/modeler.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/nets.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/padstacks.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/definition/component_def.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/definition/index.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/definition/materials.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/definition/package_def.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/definition/padstack_def.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/geometry/arc_data.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/geometry/index.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/geometry/point_3d_data.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/geometry/point_data.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/geometry/polygon_data.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/hierarchy/component.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/hierarchy/index.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/hierarchy/model.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/hierarchy/netlist_model.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/hierarchy/pin_pair_model.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/hierarchy/pingroup.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/hierarchy/s_parameter_model.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/hierarchy/spice_model.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/index.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/layers/index.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/layers/layer.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/layers/stackup_layer.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/layout/cell.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/layout/index.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/layout/layout.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/layout/voltage_regulator.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/net/differential_pair.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/net/extended_net.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/net/index.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/net/net.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/net/net_class.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/ports/index.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/ports/ports.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/primitive/bondwire.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/primitive/circle.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/primitive/index.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/primitive/padstack_instance.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/primitive/path.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/primitive/polygon.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/primitive/primitive.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/primitive/rectangle.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/simulation_setup/adaptive_frequency.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/simulation_setup/hfss_advanced_meshing_settings.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/simulation_setup/hfss_advanced_settings.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/simulation_setup/hfss_dcr_settings.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/simulation_setup/hfss_general_settings.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/simulation_setup/hfss_settings_options.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/simulation_setup/hfss_simulation_settings.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/simulation_setup/hfss_simulation_setup.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/simulation_setup/hfss_solver_settings.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/simulation_setup/index.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/simulation_setup/mesh_operation.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/simulation_setup/raptor_x_advanced_settings.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/simulation_setup/raptor_x_general_settings.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/simulation_setup/raptor_x_simulation_settings.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/simulation_setup/raptor_x_simulation_setup.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/simulation_setup/siwave_dcir_simulation_setup.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/simulation_setup/siwave_simulation_setup.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/simulation_setup/sweep_data.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/terminal/bundle_terminal.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/terminal/edge_terminal.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/terminal/index.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/terminal/padstack_instance_terminal.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/terminal/pingroup_terminal.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/terminal/point_terminal.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/terminal/terminal.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/utility/heat_sink.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/utility/hfss_extent_info.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/utility/index.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/utility/layout_statistics.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/utility/rlc.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/utility/sources.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/pyedb_lib/utility/xml_control_file.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/siwave.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/source_excitations.rst (100%) rename doc/source/{api => grpc_api}/grpc/database/stackup.rst (100%) rename doc/source/{api => grpc_api}/grpc/edb.rst (100%) rename doc/source/{api => grpc_api}/grpc/index.rst (100%) rename doc/source/{api => grpc_api}/index.rst (70%) diff --git a/doc/source/api/dotnet/CoreEdb.rst b/doc/source/api/dotnet/CoreEdb.rst deleted file mode 100644 index 42bbf3609e..0000000000 --- a/doc/source/api/dotnet/CoreEdb.rst +++ /dev/null @@ -1,79 +0,0 @@ -EDB manager -=========== -An AEDB database is a folder that contains the database representing any part of a PCB. -It can be opened and edited using the ``Edb`` class. - -.. image:: ../resources/3dlayout_1.png - :width: 800 - :alt: HFSS 3D Layout is the tool used to visualize EDB content. - - -.. currentmodule:: pyedb.dotnet -.. autosummary:: - :toctree: _autosummary - - edb.Edb - - -.. code:: python - - from pyedb import Edb - - # this call returns the Edb class initialized on 2024R2 - edb = Edb(myedb, edbversion="2024.2") - - ... - - -EDB modules -~~~~~~~~~~~ -This section lists the core EDB modules for reading and writing information -to AEDB files. - - -.. currentmodule:: pyedb.dotnet.database - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - components.Components - hfss.EdbHfss - layout_validation.LayoutValidation - materials.Materials - modeler.Modeler - nets.EdbNets - edb_data.padstacks_data.EDBPadstack - siwave.EdbSiwave - stackup.Stackup - - - -.. code:: python - - from pyedb import Edb - - edb = Edb(myedb, edbversion="2023.1") - - # this call returns the EdbHfss Class - comp = edb.hfss - - # this call returns the Components Class - comp = edb.components - - # this call returns the EdbSiwave Class - comp = edb.siwave - - # this call returns the EdbPadstacks Class - comp = edb.padstacks - - # this call returns the Stackup Class - comp = edb.stackup - - # this call returns the Materials Class - comp = edb.materials - - # this call returns the EdbNets Class - comp = edb.nets - - ... diff --git a/doc/source/api/dotnet/SiWave.rst b/doc/source/api/dotnet/SiWave.rst deleted file mode 100644 index d02d5e59ed..0000000000 --- a/doc/source/api/dotnet/SiWave.rst +++ /dev/null @@ -1,35 +0,0 @@ -SIwave manager -============== -`SIwave `_ is a specialized tool -for power integrity, signal integrity, and EMI analysis of IC packages and PCB. This tool -solves power delivery systems and high-speed channels in electronic devices. It can be -accessed from PyEDB in Windows only. All setups can be implemented through EDB API. - -.. image:: ../resources/siwave.png - :width: 800 - :alt: EdbSiwave - :target: https://www.ansys.com/products/electronics/ansys-siwave - - -.. currentmodule:: pyedb.siwave - -.. autosummary:: - :toctree: _autosummary - - Siwave - - -.. code:: python - - from pyedb.siwave import Siwave - - # this call returns the Edb class initialized on 2024 R2 - siwave = Siwave("2024.2") - siwave.open_project("pyproject.siw") - siwave.export_element_data("mydata.txt") - siwave.close_project() - ... - -.. currentmodule:: pyedb.siwave_core.icepak - Icepak - diff --git a/doc/source/api/dotnet/XmlControlFile.rst b/doc/source/api/dotnet/XmlControlFile.rst deleted file mode 100644 index 17a40e6c8b..0000000000 --- a/doc/source/api/dotnet/XmlControlFile.rst +++ /dev/null @@ -1,24 +0,0 @@ -XML control file -================ -Convert a technology file to EDB control file. - - -.. currentmodule:: pyedb.dotnet.database.edb_data.control_file - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - ControlProperty - ControlFileMaterial - ControlFileDielectric - ControlFileLayer - ControlFileVia - ControlFileStackup - ControlFileImportOptions - ControlExtent - ControlCircuitPt - ControlFileComponent - ControlFileComponents - - diff --git a/doc/source/api/dotnet/edb_data/EdbValue.rst b/doc/source/api/dotnet/edb_data/EdbValue.rst deleted file mode 100644 index cfe3e4b539..0000000000 --- a/doc/source/api/dotnet/edb_data/EdbValue.rst +++ /dev/null @@ -1,12 +0,0 @@ -EDB value -========= -Class managing EDB Value. - - -.. currentmodule:: pyedb.dotnet.database.edb_data.edbvalue - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - EdbValue diff --git a/doc/source/api/dotnet/edb_data/HfssExtentInfo.rst b/doc/source/api/dotnet/edb_data/HfssExtentInfo.rst deleted file mode 100644 index e7d5a4b35e..0000000000 --- a/doc/source/api/dotnet/edb_data/HfssExtentInfo.rst +++ /dev/null @@ -1,12 +0,0 @@ -HFSS extent info -================ -These class is the containers of HFSS Extent. - - -.. currentmodule:: pyedb.dotnet.database.edb_data.hfss_extent_info - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - HfssExtentInfo diff --git a/doc/source/api/dotnet/edb_data/LayerData.rst b/doc/source/api/dotnet/edb_data/LayerData.rst deleted file mode 100644 index a38fa090f2..0000000000 --- a/doc/source/api/dotnet/edb_data/LayerData.rst +++ /dev/null @@ -1,29 +0,0 @@ -Stackup & layers -================ -These classes are the containers of the layer and stackup manager of the EDB API. - - -.. code:: python - - from pyedb import Edb - - edb = Edb(myedb, edbversion="2023.1") - - # this call returns the EDBLayers class - layer = edb.stackup.stackup_layers - - # this call returns the EDBLayer class - layer = edb.stackup["TOP"] - ... - - -.. currentmodule:: pyedb.dotnet.database.edb_data.layer_data - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - - LayerEdbClass - - diff --git a/doc/source/api/dotnet/edb_data/NetData.rst b/doc/source/api/dotnet/edb_data/NetData.rst deleted file mode 100644 index ee2648e90a..0000000000 --- a/doc/source/api/dotnet/edb_data/NetData.rst +++ /dev/null @@ -1,32 +0,0 @@ -Nets -==== - -Net properties --------------- -The following class is the container of data management for nets, extended nets and differential pairs. - - -.. currentmodule:: pyedb.dotnet.database.edb_data.nets_data - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - EDBNetsData - EDBNetClassData - EDBExtendedNetData - EDBDifferentialPairData - -.. code:: python - - from pyedb import Edb - - edb = Edb(myedb, edbversion="2024.2") - - edb.nets["M_MA<6>"].delete() - edb.net_classes - edb.differential_pairs - edb.extended_nets - - - ... \ No newline at end of file diff --git a/doc/source/api/dotnet/edb_data/PadstackData.rst b/doc/source/api/dotnet/edb_data/PadstackData.rst deleted file mode 100644 index 1f3e28fd1b..0000000000 --- a/doc/source/api/dotnet/edb_data/PadstackData.rst +++ /dev/null @@ -1,17 +0,0 @@ -vias and padstacks -================== - -Instances and definitions -------------------------- -These classes are the containers of data management for padstacks instances and padstack definitions. - - -.. currentmodule:: pyedb.dotnet.database.edb_data.padstacks_data - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - EDBPadProperties - EDBPadstack - EDBPadstackInstance diff --git a/doc/source/api/dotnet/edb_data/PortsData.rst b/doc/source/api/dotnet/edb_data/PortsData.rst deleted file mode 100644 index 7b9099a26c..0000000000 --- a/doc/source/api/dotnet/edb_data/PortsData.rst +++ /dev/null @@ -1,26 +0,0 @@ -Ports -===== -These classes are the containers of ports methods of the EDB for both HFSS and SIwave. - -.. autosummary:: - :toctree: _autosummary - -.. code:: python - - from pyedb import Edb - - edb = Edb(myedb, edbversion="2023.1") - - # this call returns the EDB excitations dictionary - edb.ports - ... - - -.. currentmodule:: pyedb.dotnet.database.edb_data.ports - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - GapPort - WavePort diff --git a/doc/source/api/dotnet/edb_data/PrimitivesData.rst b/doc/source/api/dotnet/edb_data/PrimitivesData.rst deleted file mode 100644 index 86e1561986..0000000000 --- a/doc/source/api/dotnet/edb_data/PrimitivesData.rst +++ /dev/null @@ -1,32 +0,0 @@ -Modeler & primitives -==================== -These classes are the containers of primitives and all relative methods. -Primitives are planes, lines, rectangles, and circles. - - -Primitives properties ---------------------- -These classes are the containers of data management for primitives and arcs. - -.. currentmodule:: pyedb.dotnet.database.edb_data.primitives_data - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - - EDBArcs - EdbPolygon - - -.. code:: python - - from pyedb import Edb - - edb = Edb(myedb, edbversion="2023.1") - - polygon = edbapp.modeler.polygons[0] - polygon.is_void - poly2 = polygon.clone() - - ... diff --git a/doc/source/api/dotnet/edb_data/RaptorXSimulationSetup.rst b/doc/source/api/dotnet/edb_data/RaptorXSimulationSetup.rst deleted file mode 100644 index efca87b771..0000000000 --- a/doc/source/api/dotnet/edb_data/RaptorXSimulationSetup.rst +++ /dev/null @@ -1,15 +0,0 @@ -RaptorX simulation setup -======================== -These classes are the containers of RaptorX simulation setup. - - -.. currentmodule:: pyedb.dotnet.database.edb_data.raptor_x_simulation_setup_data - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - RaptorXSimulationSetup - RaptorXSimulationSettings - RaptorXGeneralSettings - RaptorXSimulationAdvancedSettings \ No newline at end of file diff --git a/doc/source/api/dotnet/edb_data/SourceData.rst b/doc/source/api/dotnet/edb_data/SourceData.rst deleted file mode 100644 index cf4e02f9d3..0000000000 --- a/doc/source/api/dotnet/edb_data/SourceData.rst +++ /dev/null @@ -1,21 +0,0 @@ -Sources and excitations -======================= -These classes are the containers of sources methods of the EDB for both HFSS and SIwave. - - -.. code:: python - - from pyedb import Edb - - edb = Edb(myedb, edbversion="2024.2") - - # this call returns the EDB excitations dictionary - edb.excitations - ... - - -.. currentmodule:: pyedb.dotnet.database.edb_data.sources - -.. autosummary:: - :toctree: _autosummary - :nosignatures: diff --git a/doc/source/api/dotnet/edb_data/Utilities.rst b/doc/source/api/dotnet/edb_data/Utilities.rst deleted file mode 100644 index e500cc63ac..0000000000 --- a/doc/source/api/dotnet/edb_data/Utilities.rst +++ /dev/null @@ -1,12 +0,0 @@ -EDB utilities -============= -Class managing EDB utilities. - - -.. currentmodule:: pyedb.dotnet.database.edb_data.utilities - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - EDBStatistics diff --git a/doc/source/api/dotnet/edb_data/Variables.rst b/doc/source/api/dotnet/edb_data/Variables.rst deleted file mode 100644 index ceee4b498e..0000000000 --- a/doc/source/api/dotnet/edb_data/Variables.rst +++ /dev/null @@ -1,12 +0,0 @@ -Variables -========= -Class managing EDB Variables. - - -.. currentmodule:: pyedb.dotnet.database.edb_data.variables - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - Variable diff --git a/doc/source/api/dotnet/edb_data/index.rst b/doc/source/api/dotnet/edb_data/index.rst deleted file mode 100644 index dac2f349bf..0000000000 --- a/doc/source/api/dotnet/edb_data/index.rst +++ /dev/null @@ -1,22 +0,0 @@ -================ -EDB data classes -================ - -This section describes EDB data classes. - - -.. toctree:: - :maxdepth: 2 - - EdbValue - HfssExtentInfo - LayerData - NetData - PadstackData - PortsData - PrimitivesData - RaptorXSimulationSetup - SourceData - Utilities - Variables - diff --git a/doc/source/api/dotnet/sim_setup_data/data/adaptive_frequency_data.rst b/doc/source/api/dotnet/sim_setup_data/data/adaptive_frequency_data.rst deleted file mode 100644 index 27087a65f7..0000000000 --- a/doc/source/api/dotnet/sim_setup_data/data/adaptive_frequency_data.rst +++ /dev/null @@ -1,15 +0,0 @@ -Adaptive frequency data -======================= -This class is the container of HFSS adaptive frequency data. - - -.. currentmodule:: pyedb.dotnet.database.sim_setup_data.data.adaptive_frequency_data - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - - AdaptiveFrequencyData - - diff --git a/doc/source/api/dotnet/sim_setup_data/data/index.rst b/doc/source/api/dotnet/sim_setup_data/data/index.rst deleted file mode 100644 index 56337d89cf..0000000000 --- a/doc/source/api/dotnet/sim_setup_data/data/index.rst +++ /dev/null @@ -1,17 +0,0 @@ -===================== -Simulation setup data -===================== - -This section describes Simulation setup data. - - -.. toctree:: - :maxdepth: 2 - - adaptive_frequency_data - mesh_operation - settings - sim_setup_info - simulation_settings - siw_dc_ir_settings - sweep_data \ No newline at end of file diff --git a/doc/source/api/dotnet/sim_setup_data/data/mesh_operation.rst b/doc/source/api/dotnet/sim_setup_data/data/mesh_operation.rst deleted file mode 100644 index a190561bfd..0000000000 --- a/doc/source/api/dotnet/sim_setup_data/data/mesh_operation.rst +++ /dev/null @@ -1,18 +0,0 @@ -Mesh operation -============== -This class is the container of HFSS mesh operation. - - -.. currentmodule:: pyedb.dotnet.database.sim_setup_data.data.mesh_operation - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - - MeshOpType - MeshOperation - LengthMeshOperation - SkinDepthMeshOperation - - diff --git a/doc/source/api/dotnet/sim_setup_data/data/settings.rst b/doc/source/api/dotnet/sim_setup_data/data/settings.rst deleted file mode 100644 index c79bb25648..0000000000 --- a/doc/source/api/dotnet/sim_setup_data/data/settings.rst +++ /dev/null @@ -1,22 +0,0 @@ -HFSS simulation setup settings -============================== -These classes are the containers of HFSS simulation setup settings. - - -.. currentmodule:: pyedb.dotnet.database.sim_setup_data.data.settings - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - - AdaptiveSettings - DefeatureSettings - AdvancedMeshSettings - ViaSettings - CurveApproxSettings - DcrSettings - HfssPortSettings - HfssSolverSettings - - diff --git a/doc/source/api/dotnet/sim_setup_data/data/sim_setup_info.rst b/doc/source/api/dotnet/sim_setup_data/data/sim_setup_info.rst deleted file mode 100644 index a5e564c668..0000000000 --- a/doc/source/api/dotnet/sim_setup_data/data/sim_setup_info.rst +++ /dev/null @@ -1,15 +0,0 @@ -Simulation setup info -====================== -This class is the container of simulation setup info. - - -.. currentmodule:: pyedb.dotnet.database.sim_setup_data.data.sim_setup_info - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - - SimSetupInfo - - diff --git a/doc/source/api/dotnet/sim_setup_data/data/simulation_settings.rst b/doc/source/api/dotnet/sim_setup_data/data/simulation_settings.rst deleted file mode 100644 index ed0f5c9499..0000000000 --- a/doc/source/api/dotnet/sim_setup_data/data/simulation_settings.rst +++ /dev/null @@ -1,18 +0,0 @@ -Simulation settings -=================== -These classes are the containers of simulation settings. - - -.. currentmodule:: pyedb.dotnet.database.sim_setup_data.data.simulation_settings - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - - BaseSimulationSettings - SimulationSettings - HFSSSimulationSettings - HFSSPISimulationSettings - - diff --git a/doc/source/api/dotnet/sim_setup_data/data/siw_dc_ir_settings.rst b/doc/source/api/dotnet/sim_setup_data/data/siw_dc_ir_settings.rst deleted file mode 100644 index cedfeef7e4..0000000000 --- a/doc/source/api/dotnet/sim_setup_data/data/siw_dc_ir_settings.rst +++ /dev/null @@ -1,15 +0,0 @@ -SIwave DC-IR settings -===================== -This class is the container of SIwave DC-IR settings. - - -.. currentmodule:: pyedb.dotnet.database.sim_setup_data.data.siw_dc_ir_settings - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - - SiwaveDCIRSettings - - diff --git a/doc/source/api/dotnet/sim_setup_data/data/sweep_data.rst b/doc/source/api/dotnet/sim_setup_data/data/sweep_data.rst deleted file mode 100644 index e60380f10a..0000000000 --- a/doc/source/api/dotnet/sim_setup_data/data/sweep_data.rst +++ /dev/null @@ -1,15 +0,0 @@ -Sweep data -========== -This class is the container of sweep data. - - -.. currentmodule:: pyedb.dotnet.database.sim_setup_data.data.sweep_data - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - - SweepData - - diff --git a/doc/source/api/dotnet/sim_setup_data/io/index.rst b/doc/source/api/dotnet/sim_setup_data/io/index.rst deleted file mode 100644 index 39de17f627..0000000000 --- a/doc/source/api/dotnet/sim_setup_data/io/index.rst +++ /dev/null @@ -1,10 +0,0 @@ -=================== -Simulation setup IO -=================== - -This section describes Simulation setup IO. - - -.. toctree:: - :maxdepth: 2 - diff --git a/doc/source/api/dotnet/sim_setup_data/io/siwave.rst b/doc/source/api/dotnet/sim_setup_data/io/siwave.rst deleted file mode 100644 index c6e238d397..0000000000 --- a/doc/source/api/dotnet/sim_setup_data/io/siwave.rst +++ /dev/null @@ -1,18 +0,0 @@ -SIwave IO -========= -This class is the container of SIwave IO. - - -.. currentmodule:: pyedb.dotnet.database.sim_setup_data.io.siwave - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - - SettingsBase - AdvancedSettings - DCSettings - DCAdvancedSettings - - diff --git a/doc/source/api/dotnet/utilities/heatsink.rst b/doc/source/api/dotnet/utilities/heatsink.rst deleted file mode 100644 index 8aec753574..0000000000 --- a/doc/source/api/dotnet/utilities/heatsink.rst +++ /dev/null @@ -1,15 +0,0 @@ -Icepak heat sink -================ -This class is the container of Icepak heat sink. - - -.. currentmodule:: pyedb.dotnet.database.utilities.heatsink - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - - HeatSink - - diff --git a/doc/source/api/dotnet/utilities/hfss_simulation_setup.rst b/doc/source/api/dotnet/utilities/hfss_simulation_setup.rst deleted file mode 100644 index 124c778074..0000000000 --- a/doc/source/api/dotnet/utilities/hfss_simulation_setup.rst +++ /dev/null @@ -1,16 +0,0 @@ -HFSS simulation setup -===================== -These classes are the containers of HFSS simulation setup. - - -.. currentmodule:: pyedb.dotnet.database.utilities.hfss_simulation_setup - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - - HfssSimulationSetup - HFSSPISimulationSetup - - diff --git a/doc/source/api/dotnet/utilities/index.rst b/doc/source/api/dotnet/utilities/index.rst deleted file mode 100644 index 84049581ae..0000000000 --- a/doc/source/api/dotnet/utilities/index.rst +++ /dev/null @@ -1,14 +0,0 @@ -========= -Utilities -========= - -This section describes utilities. - - -.. toctree:: - :maxdepth: 2 - - heatsink - hfss_simulation_setup - simulation_setup - siwave_simulation_setup \ No newline at end of file diff --git a/doc/source/api/dotnet/utilities/simulation_setup.rst b/doc/source/api/dotnet/utilities/simulation_setup.rst deleted file mode 100644 index 1b4e1cfdbd..0000000000 --- a/doc/source/api/dotnet/utilities/simulation_setup.rst +++ /dev/null @@ -1,17 +0,0 @@ -Simulation setup -================ -This class is the container of simulation setup. - - -.. currentmodule:: pyedb.dotnet.database.utilities.simulation_setup - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - - SimulationSetupType - AdaptiveType - SimulationSetup - - diff --git a/doc/source/api/dotnet/utilities/siwave_simulation_setup.rst b/doc/source/api/dotnet/utilities/siwave_simulation_setup.rst deleted file mode 100644 index bb68102e2c..0000000000 --- a/doc/source/api/dotnet/utilities/siwave_simulation_setup.rst +++ /dev/null @@ -1,16 +0,0 @@ -SIwave simulation setup -======================= -These classes are the containers of siwave simulation setup. - - -.. currentmodule:: pyedb.dotnet.database.utilities.siwave_simulation_setup - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - - SiwaveSimulationSetup - SiwaveDCSimulationSetup - - diff --git a/doc/source/grpc_api/SimulationConfigurationV2.rst b/doc/source/grpc_api/SimulationConfigurationV2.rst new file mode 100644 index 0000000000..6ce83c60de --- /dev/null +++ b/doc/source/grpc_api/SimulationConfigurationV2.rst @@ -0,0 +1,155 @@ +Simulation configuration v2.0 +============================= +These classes are the containers of simulation configuration constructors V2.0 for the EDB. + + +.. currentmodule:: pyedb.configuration.cfg_boundaries + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + CfgBoundaries + +.. currentmodule:: pyedb.configuration.cfg_common + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + CfgBase + +.. currentmodule:: pyedb.configuration.cfg_components + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + CfgComponent + CfgComponents + +.. currentmodule:: pyedb.configuration.cfg_data + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + CfgData + +.. currentmodule:: pyedb.configuration.cfg_general + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + CfgGeneral + +.. currentmodule:: pyedb.configuration.cfg_nets + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + CfgNets + +.. currentmodule:: pyedb.configuration.cfg_operations + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + CfgCutout + CfgOperations + +.. currentmodule:: pyedb.configuration.cfg_package_definition + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + CfgPackage + CfgHeatSink + CfgPackageDefinitions + +.. currentmodule:: pyedb.configuration.cfg_padstacks + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + CfgPadstacks + +.. currentmodule:: pyedb.configuration.cfg_pin_groups + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + CfgPinGroups + CfgPinGroup + +.. currentmodule:: pyedb.configuration.cfg_ports_sources + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + CfgTerminalInfo + CfgCoordianteTerminalInfo + CfgNearestPinTerminalInfo + CfgSources + CfgPorts + CfgCircuitElement + CfgPort + CfgSource + +.. currentmodule:: pyedb.configuration.cfg_s_parameter_models + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + CfgSParameterModel + +.. currentmodule:: pyedb.configuration.cfg_setup + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + CfgSetup + CfgSIwaveACSetup + CfgSIwaveDCSetup + CfgHFSSSetup + CfgSetups + +.. currentmodule:: pyedb.configuration.cfg_spice_models + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + CfgSpiceModel + +.. currentmodule:: pyedb.configuration.cfg_stackup + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + CfgMaterial + CfgLayer + CfgStackup + +.. currentmodule:: pyedb.configuration.configuration + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + Configuration + + + + + diff --git a/doc/source/api/grpc/database/components.rst b/doc/source/grpc_api/grpc/database/components.rst similarity index 100% rename from doc/source/api/grpc/database/components.rst rename to doc/source/grpc_api/grpc/database/components.rst diff --git a/doc/source/api/grpc/database/control_file.rst b/doc/source/grpc_api/grpc/database/control_file.rst similarity index 100% rename from doc/source/api/grpc/database/control_file.rst rename to doc/source/grpc_api/grpc/database/control_file.rst diff --git a/doc/source/api/grpc/database/definitions.rst b/doc/source/grpc_api/grpc/database/definitions.rst similarity index 100% rename from doc/source/api/grpc/database/definitions.rst rename to doc/source/grpc_api/grpc/database/definitions.rst diff --git a/doc/source/api/grpc/database/hfss.rst b/doc/source/grpc_api/grpc/database/hfss.rst similarity index 100% rename from doc/source/api/grpc/database/hfss.rst rename to doc/source/grpc_api/grpc/database/hfss.rst diff --git a/doc/source/api/grpc/database/index.rst b/doc/source/grpc_api/grpc/database/index.rst similarity index 100% rename from doc/source/api/grpc/database/index.rst rename to doc/source/grpc_api/grpc/database/index.rst diff --git a/doc/source/api/grpc/database/layout_validation.rst b/doc/source/grpc_api/grpc/database/layout_validation.rst similarity index 100% rename from doc/source/api/grpc/database/layout_validation.rst rename to doc/source/grpc_api/grpc/database/layout_validation.rst diff --git a/doc/source/api/grpc/database/modeler.rst b/doc/source/grpc_api/grpc/database/modeler.rst similarity index 100% rename from doc/source/api/grpc/database/modeler.rst rename to doc/source/grpc_api/grpc/database/modeler.rst diff --git a/doc/source/api/grpc/database/nets.rst b/doc/source/grpc_api/grpc/database/nets.rst similarity index 100% rename from doc/source/api/grpc/database/nets.rst rename to doc/source/grpc_api/grpc/database/nets.rst diff --git a/doc/source/api/grpc/database/padstacks.rst b/doc/source/grpc_api/grpc/database/padstacks.rst similarity index 100% rename from doc/source/api/grpc/database/padstacks.rst rename to doc/source/grpc_api/grpc/database/padstacks.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/definition/component_def.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/definition/component_def.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/definition/component_def.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/definition/component_def.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/definition/index.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/definition/index.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/definition/index.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/definition/index.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/definition/materials.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/definition/materials.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/definition/materials.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/definition/materials.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/definition/package_def.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/definition/package_def.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/definition/package_def.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/definition/package_def.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/definition/padstack_def.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/definition/padstack_def.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/definition/padstack_def.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/definition/padstack_def.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/geometry/arc_data.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/geometry/arc_data.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/geometry/arc_data.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/geometry/arc_data.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/geometry/index.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/geometry/index.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/geometry/index.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/geometry/index.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/geometry/point_3d_data.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/geometry/point_3d_data.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/geometry/point_3d_data.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/geometry/point_3d_data.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/geometry/point_data.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/geometry/point_data.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/geometry/point_data.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/geometry/point_data.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/geometry/polygon_data.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/geometry/polygon_data.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/geometry/polygon_data.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/geometry/polygon_data.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/hierarchy/component.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/hierarchy/component.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/hierarchy/component.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/hierarchy/component.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/hierarchy/index.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/hierarchy/index.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/hierarchy/index.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/hierarchy/index.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/hierarchy/model.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/hierarchy/model.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/hierarchy/model.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/hierarchy/model.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/hierarchy/netlist_model.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/hierarchy/netlist_model.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/hierarchy/netlist_model.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/hierarchy/netlist_model.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/hierarchy/pin_pair_model.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/hierarchy/pin_pair_model.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/hierarchy/pin_pair_model.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/hierarchy/pin_pair_model.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/hierarchy/pingroup.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/hierarchy/pingroup.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/hierarchy/pingroup.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/hierarchy/pingroup.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/hierarchy/s_parameter_model.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/hierarchy/s_parameter_model.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/hierarchy/s_parameter_model.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/hierarchy/s_parameter_model.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/hierarchy/spice_model.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/hierarchy/spice_model.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/hierarchy/spice_model.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/hierarchy/spice_model.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/index.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/index.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/index.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/index.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/layers/index.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/layers/index.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/layers/index.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/layers/index.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/layers/layer.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/layers/layer.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/layers/layer.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/layers/layer.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/layers/stackup_layer.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/layers/stackup_layer.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/layers/stackup_layer.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/layers/stackup_layer.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/layout/cell.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/layout/cell.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/layout/cell.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/layout/cell.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/layout/index.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/layout/index.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/layout/index.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/layout/index.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/layout/layout.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/layout/layout.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/layout/layout.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/layout/layout.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/layout/voltage_regulator.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/layout/voltage_regulator.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/layout/voltage_regulator.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/layout/voltage_regulator.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/net/differential_pair.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/net/differential_pair.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/net/differential_pair.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/net/differential_pair.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/net/extended_net.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/net/extended_net.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/net/extended_net.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/net/extended_net.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/net/index.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/net/index.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/net/index.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/net/index.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/net/net.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/net/net.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/net/net.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/net/net.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/net/net_class.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/net/net_class.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/net/net_class.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/net/net_class.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/ports/index.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/ports/index.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/ports/index.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/ports/index.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/ports/ports.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/ports/ports.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/ports/ports.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/ports/ports.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/primitive/bondwire.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/primitive/bondwire.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/primitive/bondwire.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/primitive/bondwire.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/primitive/circle.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/primitive/circle.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/primitive/circle.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/primitive/circle.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/primitive/index.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/primitive/index.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/primitive/index.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/primitive/index.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/primitive/padstack_instance.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/primitive/padstack_instance.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/primitive/padstack_instance.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/primitive/padstack_instance.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/primitive/path.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/primitive/path.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/primitive/path.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/primitive/path.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/primitive/polygon.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/primitive/polygon.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/primitive/polygon.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/primitive/polygon.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/primitive/primitive.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/primitive/primitive.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/primitive/primitive.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/primitive/primitive.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/primitive/rectangle.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/primitive/rectangle.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/primitive/rectangle.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/primitive/rectangle.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/simulation_setup/adaptive_frequency.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/adaptive_frequency.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/simulation_setup/adaptive_frequency.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/adaptive_frequency.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/simulation_setup/hfss_advanced_meshing_settings.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/hfss_advanced_meshing_settings.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/simulation_setup/hfss_advanced_meshing_settings.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/hfss_advanced_meshing_settings.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/simulation_setup/hfss_advanced_settings.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/hfss_advanced_settings.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/simulation_setup/hfss_advanced_settings.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/hfss_advanced_settings.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/simulation_setup/hfss_dcr_settings.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/hfss_dcr_settings.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/simulation_setup/hfss_dcr_settings.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/hfss_dcr_settings.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/simulation_setup/hfss_general_settings.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/hfss_general_settings.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/simulation_setup/hfss_general_settings.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/hfss_general_settings.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/simulation_setup/hfss_settings_options.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/hfss_settings_options.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/simulation_setup/hfss_settings_options.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/hfss_settings_options.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/simulation_setup/hfss_simulation_settings.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/hfss_simulation_settings.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/simulation_setup/hfss_simulation_settings.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/hfss_simulation_settings.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/simulation_setup/hfss_simulation_setup.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/hfss_simulation_setup.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/simulation_setup/hfss_simulation_setup.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/hfss_simulation_setup.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/simulation_setup/hfss_solver_settings.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/hfss_solver_settings.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/simulation_setup/hfss_solver_settings.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/hfss_solver_settings.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/simulation_setup/index.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/index.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/simulation_setup/index.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/index.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/simulation_setup/mesh_operation.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/mesh_operation.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/simulation_setup/mesh_operation.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/mesh_operation.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/simulation_setup/raptor_x_advanced_settings.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/raptor_x_advanced_settings.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/simulation_setup/raptor_x_advanced_settings.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/raptor_x_advanced_settings.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/simulation_setup/raptor_x_general_settings.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/raptor_x_general_settings.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/simulation_setup/raptor_x_general_settings.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/raptor_x_general_settings.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/simulation_setup/raptor_x_simulation_settings.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/raptor_x_simulation_settings.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/simulation_setup/raptor_x_simulation_settings.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/raptor_x_simulation_settings.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/simulation_setup/raptor_x_simulation_setup.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/raptor_x_simulation_setup.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/simulation_setup/raptor_x_simulation_setup.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/raptor_x_simulation_setup.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/simulation_setup/siwave_dcir_simulation_setup.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/siwave_dcir_simulation_setup.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/simulation_setup/siwave_dcir_simulation_setup.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/siwave_dcir_simulation_setup.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/simulation_setup/siwave_simulation_setup.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/siwave_simulation_setup.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/simulation_setup/siwave_simulation_setup.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/siwave_simulation_setup.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/simulation_setup/sweep_data.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/sweep_data.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/simulation_setup/sweep_data.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/simulation_setup/sweep_data.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/terminal/bundle_terminal.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/terminal/bundle_terminal.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/terminal/bundle_terminal.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/terminal/bundle_terminal.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/terminal/edge_terminal.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/terminal/edge_terminal.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/terminal/edge_terminal.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/terminal/edge_terminal.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/terminal/index.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/terminal/index.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/terminal/index.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/terminal/index.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/terminal/padstack_instance_terminal.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/terminal/padstack_instance_terminal.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/terminal/padstack_instance_terminal.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/terminal/padstack_instance_terminal.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/terminal/pingroup_terminal.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/terminal/pingroup_terminal.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/terminal/pingroup_terminal.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/terminal/pingroup_terminal.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/terminal/point_terminal.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/terminal/point_terminal.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/terminal/point_terminal.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/terminal/point_terminal.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/terminal/terminal.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/terminal/terminal.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/terminal/terminal.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/terminal/terminal.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/utility/heat_sink.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/utility/heat_sink.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/utility/heat_sink.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/utility/heat_sink.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/utility/hfss_extent_info.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/utility/hfss_extent_info.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/utility/hfss_extent_info.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/utility/hfss_extent_info.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/utility/index.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/utility/index.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/utility/index.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/utility/index.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/utility/layout_statistics.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/utility/layout_statistics.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/utility/layout_statistics.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/utility/layout_statistics.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/utility/rlc.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/utility/rlc.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/utility/rlc.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/utility/rlc.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/utility/sources.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/utility/sources.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/utility/sources.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/utility/sources.rst diff --git a/doc/source/api/grpc/database/pyedb_lib/utility/xml_control_file.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/utility/xml_control_file.rst similarity index 100% rename from doc/source/api/grpc/database/pyedb_lib/utility/xml_control_file.rst rename to doc/source/grpc_api/grpc/database/pyedb_lib/utility/xml_control_file.rst diff --git a/doc/source/api/grpc/database/siwave.rst b/doc/source/grpc_api/grpc/database/siwave.rst similarity index 100% rename from doc/source/api/grpc/database/siwave.rst rename to doc/source/grpc_api/grpc/database/siwave.rst diff --git a/doc/source/api/grpc/database/source_excitations.rst b/doc/source/grpc_api/grpc/database/source_excitations.rst similarity index 100% rename from doc/source/api/grpc/database/source_excitations.rst rename to doc/source/grpc_api/grpc/database/source_excitations.rst diff --git a/doc/source/api/grpc/database/stackup.rst b/doc/source/grpc_api/grpc/database/stackup.rst similarity index 100% rename from doc/source/api/grpc/database/stackup.rst rename to doc/source/grpc_api/grpc/database/stackup.rst diff --git a/doc/source/api/grpc/edb.rst b/doc/source/grpc_api/grpc/edb.rst similarity index 100% rename from doc/source/api/grpc/edb.rst rename to doc/source/grpc_api/grpc/edb.rst diff --git a/doc/source/api/grpc/index.rst b/doc/source/grpc_api/grpc/index.rst similarity index 100% rename from doc/source/api/grpc/index.rst rename to doc/source/grpc_api/grpc/index.rst diff --git a/doc/source/api/index.rst b/doc/source/grpc_api/index.rst similarity index 70% rename from doc/source/api/index.rst rename to doc/source/grpc_api/index.rst index 081f75f0a1..87e1947540 100644 --- a/doc/source/api/index.rst +++ b/doc/source/grpc_api/index.rst @@ -1,6 +1,6 @@ -============= -API reference -============= +================== +gRPC API reference +================== This section describes EDB functions, classes, and methods for EDB apps and modules. Use the search feature or click links @@ -13,16 +13,12 @@ methods are inherited into the ``Edb`` class. If EDB is launched within the ``HfssdLayout`` class, EDB is accessible in read-only mode. -.. tab-set:: - .. tab-item:: gRPC - .. toctree:: - :maxdepth: 3 +.. toctree:: + :maxdepth: 3 - grpc/index - - .. tab-item:: DotNet + grpc/index diff --git a/doc/source/index.rst b/doc/source/index.rst index 05099b8a28..f9c56c527b 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -26,7 +26,7 @@ API to make scripting simpler. .. grid-item-card:: API reference :fa:`book-bookmark` :padding: 2 2 2 2 - :link: api/index + :link: grpc_api/index :link-type: doc Understand PyEDB API endpoints, their capabilities, @@ -53,7 +53,7 @@ API to make scripting simpler. getting_started/index user_guide/index - api/index + grpc_api/index contributing Indices and tables From 478d7dd79ea411782f92c05e69b3849c23ed1ec7 Mon Sep 17 00:00:00 2001 From: svandenb-dev Date: Wed, 25 Jun 2025 17:29:50 +0200 Subject: [PATCH 16/29] doc multi tab --- .../dotnet_api/SimulationConfigurationV2.rst | 155 ++++++++++++++++++ doc/source/dotnet_api/dotnet/CoreEdb.rst | 79 +++++++++ doc/source/dotnet_api/dotnet/SiWave.rst | 35 ++++ .../dotnet_api/dotnet/XmlControlFile.rst | 24 +++ .../dotnet_api/dotnet/edb_data/EdbValue.rst | 12 ++ .../dotnet/edb_data/HfssExtentInfo.rst | 12 ++ .../dotnet_api/dotnet/edb_data/LayerData.rst | 29 ++++ .../dotnet_api/dotnet/edb_data/NetData.rst | 32 ++++ .../dotnet/edb_data/PadstackData.rst | 17 ++ .../dotnet_api/dotnet/edb_data/PortsData.rst | 26 +++ .../dotnet/edb_data/PrimitivesData.rst | 32 ++++ .../edb_data/RaptorXSimulationSetup.rst | 15 ++ .../dotnet_api/dotnet/edb_data/SourceData.rst | 21 +++ .../dotnet_api/dotnet/edb_data/Utilities.rst | 12 ++ .../dotnet_api/dotnet/edb_data/Variables.rst | 12 ++ .../dotnet_api/dotnet/edb_data/index.rst | 22 +++ .../data/adaptive_frequency_data.rst | 15 ++ .../dotnet/sim_setup_data/data/index.rst | 17 ++ .../sim_setup_data/data/mesh_operation.rst | 18 ++ .../dotnet/sim_setup_data/data/settings.rst | 22 +++ .../sim_setup_data/data/sim_setup_info.rst | 15 ++ .../data/simulation_settings.rst | 18 ++ .../data/siw_dc_ir_settings.rst | 15 ++ .../dotnet/sim_setup_data/data/sweep_data.rst | 15 ++ .../dotnet/sim_setup_data/io/index.rst | 10 ++ .../dotnet/sim_setup_data/io/siwave.rst | 18 ++ .../dotnet_api/dotnet/utilities/heatsink.rst | 15 ++ .../utilities/hfss_simulation_setup.rst | 16 ++ .../dotnet_api/dotnet/utilities/index.rst | 14 ++ .../dotnet/utilities/simulation_setup.rst | 17 ++ .../utilities/siwave_simulation_setup.rst | 16 ++ doc/source/dotnet_api/index.rst | 44 +++++ doc/source/grpc_api/grpc/edb.rst | 4 +- doc/source/grpc_api/grpc/index.rst | 2 +- doc/source/grpc_api/index.rst | 33 +++- doc/source/index.rst | 13 +- .../from-chips-to-ships-hfss-flex-pcb.png | Bin 0 -> 139624 bytes 37 files changed, 866 insertions(+), 6 deletions(-) create mode 100644 doc/source/dotnet_api/SimulationConfigurationV2.rst create mode 100644 doc/source/dotnet_api/dotnet/CoreEdb.rst create mode 100644 doc/source/dotnet_api/dotnet/SiWave.rst create mode 100644 doc/source/dotnet_api/dotnet/XmlControlFile.rst create mode 100644 doc/source/dotnet_api/dotnet/edb_data/EdbValue.rst create mode 100644 doc/source/dotnet_api/dotnet/edb_data/HfssExtentInfo.rst create mode 100644 doc/source/dotnet_api/dotnet/edb_data/LayerData.rst create mode 100644 doc/source/dotnet_api/dotnet/edb_data/NetData.rst create mode 100644 doc/source/dotnet_api/dotnet/edb_data/PadstackData.rst create mode 100644 doc/source/dotnet_api/dotnet/edb_data/PortsData.rst create mode 100644 doc/source/dotnet_api/dotnet/edb_data/PrimitivesData.rst create mode 100644 doc/source/dotnet_api/dotnet/edb_data/RaptorXSimulationSetup.rst create mode 100644 doc/source/dotnet_api/dotnet/edb_data/SourceData.rst create mode 100644 doc/source/dotnet_api/dotnet/edb_data/Utilities.rst create mode 100644 doc/source/dotnet_api/dotnet/edb_data/Variables.rst create mode 100644 doc/source/dotnet_api/dotnet/edb_data/index.rst create mode 100644 doc/source/dotnet_api/dotnet/sim_setup_data/data/adaptive_frequency_data.rst create mode 100644 doc/source/dotnet_api/dotnet/sim_setup_data/data/index.rst create mode 100644 doc/source/dotnet_api/dotnet/sim_setup_data/data/mesh_operation.rst create mode 100644 doc/source/dotnet_api/dotnet/sim_setup_data/data/settings.rst create mode 100644 doc/source/dotnet_api/dotnet/sim_setup_data/data/sim_setup_info.rst create mode 100644 doc/source/dotnet_api/dotnet/sim_setup_data/data/simulation_settings.rst create mode 100644 doc/source/dotnet_api/dotnet/sim_setup_data/data/siw_dc_ir_settings.rst create mode 100644 doc/source/dotnet_api/dotnet/sim_setup_data/data/sweep_data.rst create mode 100644 doc/source/dotnet_api/dotnet/sim_setup_data/io/index.rst create mode 100644 doc/source/dotnet_api/dotnet/sim_setup_data/io/siwave.rst create mode 100644 doc/source/dotnet_api/dotnet/utilities/heatsink.rst create mode 100644 doc/source/dotnet_api/dotnet/utilities/hfss_simulation_setup.rst create mode 100644 doc/source/dotnet_api/dotnet/utilities/index.rst create mode 100644 doc/source/dotnet_api/dotnet/utilities/simulation_setup.rst create mode 100644 doc/source/dotnet_api/dotnet/utilities/siwave_simulation_setup.rst create mode 100644 doc/source/dotnet_api/index.rst create mode 100644 doc/source/resources/from-chips-to-ships-hfss-flex-pcb.png diff --git a/doc/source/dotnet_api/SimulationConfigurationV2.rst b/doc/source/dotnet_api/SimulationConfigurationV2.rst new file mode 100644 index 0000000000..6ce83c60de --- /dev/null +++ b/doc/source/dotnet_api/SimulationConfigurationV2.rst @@ -0,0 +1,155 @@ +Simulation configuration v2.0 +============================= +These classes are the containers of simulation configuration constructors V2.0 for the EDB. + + +.. currentmodule:: pyedb.configuration.cfg_boundaries + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + CfgBoundaries + +.. currentmodule:: pyedb.configuration.cfg_common + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + CfgBase + +.. currentmodule:: pyedb.configuration.cfg_components + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + CfgComponent + CfgComponents + +.. currentmodule:: pyedb.configuration.cfg_data + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + CfgData + +.. currentmodule:: pyedb.configuration.cfg_general + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + CfgGeneral + +.. currentmodule:: pyedb.configuration.cfg_nets + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + CfgNets + +.. currentmodule:: pyedb.configuration.cfg_operations + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + CfgCutout + CfgOperations + +.. currentmodule:: pyedb.configuration.cfg_package_definition + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + CfgPackage + CfgHeatSink + CfgPackageDefinitions + +.. currentmodule:: pyedb.configuration.cfg_padstacks + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + CfgPadstacks + +.. currentmodule:: pyedb.configuration.cfg_pin_groups + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + CfgPinGroups + CfgPinGroup + +.. currentmodule:: pyedb.configuration.cfg_ports_sources + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + CfgTerminalInfo + CfgCoordianteTerminalInfo + CfgNearestPinTerminalInfo + CfgSources + CfgPorts + CfgCircuitElement + CfgPort + CfgSource + +.. currentmodule:: pyedb.configuration.cfg_s_parameter_models + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + CfgSParameterModel + +.. currentmodule:: pyedb.configuration.cfg_setup + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + CfgSetup + CfgSIwaveACSetup + CfgSIwaveDCSetup + CfgHFSSSetup + CfgSetups + +.. currentmodule:: pyedb.configuration.cfg_spice_models + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + CfgSpiceModel + +.. currentmodule:: pyedb.configuration.cfg_stackup + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + CfgMaterial + CfgLayer + CfgStackup + +.. currentmodule:: pyedb.configuration.configuration + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + Configuration + + + + + diff --git a/doc/source/dotnet_api/dotnet/CoreEdb.rst b/doc/source/dotnet_api/dotnet/CoreEdb.rst new file mode 100644 index 0000000000..42bbf3609e --- /dev/null +++ b/doc/source/dotnet_api/dotnet/CoreEdb.rst @@ -0,0 +1,79 @@ +EDB manager +=========== +An AEDB database is a folder that contains the database representing any part of a PCB. +It can be opened and edited using the ``Edb`` class. + +.. image:: ../resources/3dlayout_1.png + :width: 800 + :alt: HFSS 3D Layout is the tool used to visualize EDB content. + + +.. currentmodule:: pyedb.dotnet +.. autosummary:: + :toctree: _autosummary + + edb.Edb + + +.. code:: python + + from pyedb import Edb + + # this call returns the Edb class initialized on 2024R2 + edb = Edb(myedb, edbversion="2024.2") + + ... + + +EDB modules +~~~~~~~~~~~ +This section lists the core EDB modules for reading and writing information +to AEDB files. + + +.. currentmodule:: pyedb.dotnet.database + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + components.Components + hfss.EdbHfss + layout_validation.LayoutValidation + materials.Materials + modeler.Modeler + nets.EdbNets + edb_data.padstacks_data.EDBPadstack + siwave.EdbSiwave + stackup.Stackup + + + +.. code:: python + + from pyedb import Edb + + edb = Edb(myedb, edbversion="2023.1") + + # this call returns the EdbHfss Class + comp = edb.hfss + + # this call returns the Components Class + comp = edb.components + + # this call returns the EdbSiwave Class + comp = edb.siwave + + # this call returns the EdbPadstacks Class + comp = edb.padstacks + + # this call returns the Stackup Class + comp = edb.stackup + + # this call returns the Materials Class + comp = edb.materials + + # this call returns the EdbNets Class + comp = edb.nets + + ... diff --git a/doc/source/dotnet_api/dotnet/SiWave.rst b/doc/source/dotnet_api/dotnet/SiWave.rst new file mode 100644 index 0000000000..d02d5e59ed --- /dev/null +++ b/doc/source/dotnet_api/dotnet/SiWave.rst @@ -0,0 +1,35 @@ +SIwave manager +============== +`SIwave `_ is a specialized tool +for power integrity, signal integrity, and EMI analysis of IC packages and PCB. This tool +solves power delivery systems and high-speed channels in electronic devices. It can be +accessed from PyEDB in Windows only. All setups can be implemented through EDB API. + +.. image:: ../resources/siwave.png + :width: 800 + :alt: EdbSiwave + :target: https://www.ansys.com/products/electronics/ansys-siwave + + +.. currentmodule:: pyedb.siwave + +.. autosummary:: + :toctree: _autosummary + + Siwave + + +.. code:: python + + from pyedb.siwave import Siwave + + # this call returns the Edb class initialized on 2024 R2 + siwave = Siwave("2024.2") + siwave.open_project("pyproject.siw") + siwave.export_element_data("mydata.txt") + siwave.close_project() + ... + +.. currentmodule:: pyedb.siwave_core.icepak + Icepak + diff --git a/doc/source/dotnet_api/dotnet/XmlControlFile.rst b/doc/source/dotnet_api/dotnet/XmlControlFile.rst new file mode 100644 index 0000000000..17a40e6c8b --- /dev/null +++ b/doc/source/dotnet_api/dotnet/XmlControlFile.rst @@ -0,0 +1,24 @@ +XML control file +================ +Convert a technology file to EDB control file. + + +.. currentmodule:: pyedb.dotnet.database.edb_data.control_file + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + ControlProperty + ControlFileMaterial + ControlFileDielectric + ControlFileLayer + ControlFileVia + ControlFileStackup + ControlFileImportOptions + ControlExtent + ControlCircuitPt + ControlFileComponent + ControlFileComponents + + diff --git a/doc/source/dotnet_api/dotnet/edb_data/EdbValue.rst b/doc/source/dotnet_api/dotnet/edb_data/EdbValue.rst new file mode 100644 index 0000000000..cfe3e4b539 --- /dev/null +++ b/doc/source/dotnet_api/dotnet/edb_data/EdbValue.rst @@ -0,0 +1,12 @@ +EDB value +========= +Class managing EDB Value. + + +.. currentmodule:: pyedb.dotnet.database.edb_data.edbvalue + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + EdbValue diff --git a/doc/source/dotnet_api/dotnet/edb_data/HfssExtentInfo.rst b/doc/source/dotnet_api/dotnet/edb_data/HfssExtentInfo.rst new file mode 100644 index 0000000000..e7d5a4b35e --- /dev/null +++ b/doc/source/dotnet_api/dotnet/edb_data/HfssExtentInfo.rst @@ -0,0 +1,12 @@ +HFSS extent info +================ +These class is the containers of HFSS Extent. + + +.. currentmodule:: pyedb.dotnet.database.edb_data.hfss_extent_info + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + HfssExtentInfo diff --git a/doc/source/dotnet_api/dotnet/edb_data/LayerData.rst b/doc/source/dotnet_api/dotnet/edb_data/LayerData.rst new file mode 100644 index 0000000000..a38fa090f2 --- /dev/null +++ b/doc/source/dotnet_api/dotnet/edb_data/LayerData.rst @@ -0,0 +1,29 @@ +Stackup & layers +================ +These classes are the containers of the layer and stackup manager of the EDB API. + + +.. code:: python + + from pyedb import Edb + + edb = Edb(myedb, edbversion="2023.1") + + # this call returns the EDBLayers class + layer = edb.stackup.stackup_layers + + # this call returns the EDBLayer class + layer = edb.stackup["TOP"] + ... + + +.. currentmodule:: pyedb.dotnet.database.edb_data.layer_data + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + + LayerEdbClass + + diff --git a/doc/source/dotnet_api/dotnet/edb_data/NetData.rst b/doc/source/dotnet_api/dotnet/edb_data/NetData.rst new file mode 100644 index 0000000000..ee2648e90a --- /dev/null +++ b/doc/source/dotnet_api/dotnet/edb_data/NetData.rst @@ -0,0 +1,32 @@ +Nets +==== + +Net properties +-------------- +The following class is the container of data management for nets, extended nets and differential pairs. + + +.. currentmodule:: pyedb.dotnet.database.edb_data.nets_data + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + EDBNetsData + EDBNetClassData + EDBExtendedNetData + EDBDifferentialPairData + +.. code:: python + + from pyedb import Edb + + edb = Edb(myedb, edbversion="2024.2") + + edb.nets["M_MA<6>"].delete() + edb.net_classes + edb.differential_pairs + edb.extended_nets + + + ... \ No newline at end of file diff --git a/doc/source/dotnet_api/dotnet/edb_data/PadstackData.rst b/doc/source/dotnet_api/dotnet/edb_data/PadstackData.rst new file mode 100644 index 0000000000..1f3e28fd1b --- /dev/null +++ b/doc/source/dotnet_api/dotnet/edb_data/PadstackData.rst @@ -0,0 +1,17 @@ +vias and padstacks +================== + +Instances and definitions +------------------------- +These classes are the containers of data management for padstacks instances and padstack definitions. + + +.. currentmodule:: pyedb.dotnet.database.edb_data.padstacks_data + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + EDBPadProperties + EDBPadstack + EDBPadstackInstance diff --git a/doc/source/dotnet_api/dotnet/edb_data/PortsData.rst b/doc/source/dotnet_api/dotnet/edb_data/PortsData.rst new file mode 100644 index 0000000000..7b9099a26c --- /dev/null +++ b/doc/source/dotnet_api/dotnet/edb_data/PortsData.rst @@ -0,0 +1,26 @@ +Ports +===== +These classes are the containers of ports methods of the EDB for both HFSS and SIwave. + +.. autosummary:: + :toctree: _autosummary + +.. code:: python + + from pyedb import Edb + + edb = Edb(myedb, edbversion="2023.1") + + # this call returns the EDB excitations dictionary + edb.ports + ... + + +.. currentmodule:: pyedb.dotnet.database.edb_data.ports + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + GapPort + WavePort diff --git a/doc/source/dotnet_api/dotnet/edb_data/PrimitivesData.rst b/doc/source/dotnet_api/dotnet/edb_data/PrimitivesData.rst new file mode 100644 index 0000000000..86e1561986 --- /dev/null +++ b/doc/source/dotnet_api/dotnet/edb_data/PrimitivesData.rst @@ -0,0 +1,32 @@ +Modeler & primitives +==================== +These classes are the containers of primitives and all relative methods. +Primitives are planes, lines, rectangles, and circles. + + +Primitives properties +--------------------- +These classes are the containers of data management for primitives and arcs. + +.. currentmodule:: pyedb.dotnet.database.edb_data.primitives_data + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + + EDBArcs + EdbPolygon + + +.. code:: python + + from pyedb import Edb + + edb = Edb(myedb, edbversion="2023.1") + + polygon = edbapp.modeler.polygons[0] + polygon.is_void + poly2 = polygon.clone() + + ... diff --git a/doc/source/dotnet_api/dotnet/edb_data/RaptorXSimulationSetup.rst b/doc/source/dotnet_api/dotnet/edb_data/RaptorXSimulationSetup.rst new file mode 100644 index 0000000000..efca87b771 --- /dev/null +++ b/doc/source/dotnet_api/dotnet/edb_data/RaptorXSimulationSetup.rst @@ -0,0 +1,15 @@ +RaptorX simulation setup +======================== +These classes are the containers of RaptorX simulation setup. + + +.. currentmodule:: pyedb.dotnet.database.edb_data.raptor_x_simulation_setup_data + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + RaptorXSimulationSetup + RaptorXSimulationSettings + RaptorXGeneralSettings + RaptorXSimulationAdvancedSettings \ No newline at end of file diff --git a/doc/source/dotnet_api/dotnet/edb_data/SourceData.rst b/doc/source/dotnet_api/dotnet/edb_data/SourceData.rst new file mode 100644 index 0000000000..cf4e02f9d3 --- /dev/null +++ b/doc/source/dotnet_api/dotnet/edb_data/SourceData.rst @@ -0,0 +1,21 @@ +Sources and excitations +======================= +These classes are the containers of sources methods of the EDB for both HFSS and SIwave. + + +.. code:: python + + from pyedb import Edb + + edb = Edb(myedb, edbversion="2024.2") + + # this call returns the EDB excitations dictionary + edb.excitations + ... + + +.. currentmodule:: pyedb.dotnet.database.edb_data.sources + +.. autosummary:: + :toctree: _autosummary + :nosignatures: diff --git a/doc/source/dotnet_api/dotnet/edb_data/Utilities.rst b/doc/source/dotnet_api/dotnet/edb_data/Utilities.rst new file mode 100644 index 0000000000..e500cc63ac --- /dev/null +++ b/doc/source/dotnet_api/dotnet/edb_data/Utilities.rst @@ -0,0 +1,12 @@ +EDB utilities +============= +Class managing EDB utilities. + + +.. currentmodule:: pyedb.dotnet.database.edb_data.utilities + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + EDBStatistics diff --git a/doc/source/dotnet_api/dotnet/edb_data/Variables.rst b/doc/source/dotnet_api/dotnet/edb_data/Variables.rst new file mode 100644 index 0000000000..ceee4b498e --- /dev/null +++ b/doc/source/dotnet_api/dotnet/edb_data/Variables.rst @@ -0,0 +1,12 @@ +Variables +========= +Class managing EDB Variables. + + +.. currentmodule:: pyedb.dotnet.database.edb_data.variables + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + Variable diff --git a/doc/source/dotnet_api/dotnet/edb_data/index.rst b/doc/source/dotnet_api/dotnet/edb_data/index.rst new file mode 100644 index 0000000000..dac2f349bf --- /dev/null +++ b/doc/source/dotnet_api/dotnet/edb_data/index.rst @@ -0,0 +1,22 @@ +================ +EDB data classes +================ + +This section describes EDB data classes. + + +.. toctree:: + :maxdepth: 2 + + EdbValue + HfssExtentInfo + LayerData + NetData + PadstackData + PortsData + PrimitivesData + RaptorXSimulationSetup + SourceData + Utilities + Variables + diff --git a/doc/source/dotnet_api/dotnet/sim_setup_data/data/adaptive_frequency_data.rst b/doc/source/dotnet_api/dotnet/sim_setup_data/data/adaptive_frequency_data.rst new file mode 100644 index 0000000000..27087a65f7 --- /dev/null +++ b/doc/source/dotnet_api/dotnet/sim_setup_data/data/adaptive_frequency_data.rst @@ -0,0 +1,15 @@ +Adaptive frequency data +======================= +This class is the container of HFSS adaptive frequency data. + + +.. currentmodule:: pyedb.dotnet.database.sim_setup_data.data.adaptive_frequency_data + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + + AdaptiveFrequencyData + + diff --git a/doc/source/dotnet_api/dotnet/sim_setup_data/data/index.rst b/doc/source/dotnet_api/dotnet/sim_setup_data/data/index.rst new file mode 100644 index 0000000000..56337d89cf --- /dev/null +++ b/doc/source/dotnet_api/dotnet/sim_setup_data/data/index.rst @@ -0,0 +1,17 @@ +===================== +Simulation setup data +===================== + +This section describes Simulation setup data. + + +.. toctree:: + :maxdepth: 2 + + adaptive_frequency_data + mesh_operation + settings + sim_setup_info + simulation_settings + siw_dc_ir_settings + sweep_data \ No newline at end of file diff --git a/doc/source/dotnet_api/dotnet/sim_setup_data/data/mesh_operation.rst b/doc/source/dotnet_api/dotnet/sim_setup_data/data/mesh_operation.rst new file mode 100644 index 0000000000..a190561bfd --- /dev/null +++ b/doc/source/dotnet_api/dotnet/sim_setup_data/data/mesh_operation.rst @@ -0,0 +1,18 @@ +Mesh operation +============== +This class is the container of HFSS mesh operation. + + +.. currentmodule:: pyedb.dotnet.database.sim_setup_data.data.mesh_operation + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + + MeshOpType + MeshOperation + LengthMeshOperation + SkinDepthMeshOperation + + diff --git a/doc/source/dotnet_api/dotnet/sim_setup_data/data/settings.rst b/doc/source/dotnet_api/dotnet/sim_setup_data/data/settings.rst new file mode 100644 index 0000000000..c79bb25648 --- /dev/null +++ b/doc/source/dotnet_api/dotnet/sim_setup_data/data/settings.rst @@ -0,0 +1,22 @@ +HFSS simulation setup settings +============================== +These classes are the containers of HFSS simulation setup settings. + + +.. currentmodule:: pyedb.dotnet.database.sim_setup_data.data.settings + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + + AdaptiveSettings + DefeatureSettings + AdvancedMeshSettings + ViaSettings + CurveApproxSettings + DcrSettings + HfssPortSettings + HfssSolverSettings + + diff --git a/doc/source/dotnet_api/dotnet/sim_setup_data/data/sim_setup_info.rst b/doc/source/dotnet_api/dotnet/sim_setup_data/data/sim_setup_info.rst new file mode 100644 index 0000000000..a5e564c668 --- /dev/null +++ b/doc/source/dotnet_api/dotnet/sim_setup_data/data/sim_setup_info.rst @@ -0,0 +1,15 @@ +Simulation setup info +====================== +This class is the container of simulation setup info. + + +.. currentmodule:: pyedb.dotnet.database.sim_setup_data.data.sim_setup_info + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + + SimSetupInfo + + diff --git a/doc/source/dotnet_api/dotnet/sim_setup_data/data/simulation_settings.rst b/doc/source/dotnet_api/dotnet/sim_setup_data/data/simulation_settings.rst new file mode 100644 index 0000000000..ed0f5c9499 --- /dev/null +++ b/doc/source/dotnet_api/dotnet/sim_setup_data/data/simulation_settings.rst @@ -0,0 +1,18 @@ +Simulation settings +=================== +These classes are the containers of simulation settings. + + +.. currentmodule:: pyedb.dotnet.database.sim_setup_data.data.simulation_settings + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + + BaseSimulationSettings + SimulationSettings + HFSSSimulationSettings + HFSSPISimulationSettings + + diff --git a/doc/source/dotnet_api/dotnet/sim_setup_data/data/siw_dc_ir_settings.rst b/doc/source/dotnet_api/dotnet/sim_setup_data/data/siw_dc_ir_settings.rst new file mode 100644 index 0000000000..cedfeef7e4 --- /dev/null +++ b/doc/source/dotnet_api/dotnet/sim_setup_data/data/siw_dc_ir_settings.rst @@ -0,0 +1,15 @@ +SIwave DC-IR settings +===================== +This class is the container of SIwave DC-IR settings. + + +.. currentmodule:: pyedb.dotnet.database.sim_setup_data.data.siw_dc_ir_settings + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + + SiwaveDCIRSettings + + diff --git a/doc/source/dotnet_api/dotnet/sim_setup_data/data/sweep_data.rst b/doc/source/dotnet_api/dotnet/sim_setup_data/data/sweep_data.rst new file mode 100644 index 0000000000..e60380f10a --- /dev/null +++ b/doc/source/dotnet_api/dotnet/sim_setup_data/data/sweep_data.rst @@ -0,0 +1,15 @@ +Sweep data +========== +This class is the container of sweep data. + + +.. currentmodule:: pyedb.dotnet.database.sim_setup_data.data.sweep_data + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + + SweepData + + diff --git a/doc/source/dotnet_api/dotnet/sim_setup_data/io/index.rst b/doc/source/dotnet_api/dotnet/sim_setup_data/io/index.rst new file mode 100644 index 0000000000..39de17f627 --- /dev/null +++ b/doc/source/dotnet_api/dotnet/sim_setup_data/io/index.rst @@ -0,0 +1,10 @@ +=================== +Simulation setup IO +=================== + +This section describes Simulation setup IO. + + +.. toctree:: + :maxdepth: 2 + diff --git a/doc/source/dotnet_api/dotnet/sim_setup_data/io/siwave.rst b/doc/source/dotnet_api/dotnet/sim_setup_data/io/siwave.rst new file mode 100644 index 0000000000..c6e238d397 --- /dev/null +++ b/doc/source/dotnet_api/dotnet/sim_setup_data/io/siwave.rst @@ -0,0 +1,18 @@ +SIwave IO +========= +This class is the container of SIwave IO. + + +.. currentmodule:: pyedb.dotnet.database.sim_setup_data.io.siwave + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + + SettingsBase + AdvancedSettings + DCSettings + DCAdvancedSettings + + diff --git a/doc/source/dotnet_api/dotnet/utilities/heatsink.rst b/doc/source/dotnet_api/dotnet/utilities/heatsink.rst new file mode 100644 index 0000000000..8aec753574 --- /dev/null +++ b/doc/source/dotnet_api/dotnet/utilities/heatsink.rst @@ -0,0 +1,15 @@ +Icepak heat sink +================ +This class is the container of Icepak heat sink. + + +.. currentmodule:: pyedb.dotnet.database.utilities.heatsink + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + + HeatSink + + diff --git a/doc/source/dotnet_api/dotnet/utilities/hfss_simulation_setup.rst b/doc/source/dotnet_api/dotnet/utilities/hfss_simulation_setup.rst new file mode 100644 index 0000000000..124c778074 --- /dev/null +++ b/doc/source/dotnet_api/dotnet/utilities/hfss_simulation_setup.rst @@ -0,0 +1,16 @@ +HFSS simulation setup +===================== +These classes are the containers of HFSS simulation setup. + + +.. currentmodule:: pyedb.dotnet.database.utilities.hfss_simulation_setup + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + + HfssSimulationSetup + HFSSPISimulationSetup + + diff --git a/doc/source/dotnet_api/dotnet/utilities/index.rst b/doc/source/dotnet_api/dotnet/utilities/index.rst new file mode 100644 index 0000000000..84049581ae --- /dev/null +++ b/doc/source/dotnet_api/dotnet/utilities/index.rst @@ -0,0 +1,14 @@ +========= +Utilities +========= + +This section describes utilities. + + +.. toctree:: + :maxdepth: 2 + + heatsink + hfss_simulation_setup + simulation_setup + siwave_simulation_setup \ No newline at end of file diff --git a/doc/source/dotnet_api/dotnet/utilities/simulation_setup.rst b/doc/source/dotnet_api/dotnet/utilities/simulation_setup.rst new file mode 100644 index 0000000000..1b4e1cfdbd --- /dev/null +++ b/doc/source/dotnet_api/dotnet/utilities/simulation_setup.rst @@ -0,0 +1,17 @@ +Simulation setup +================ +This class is the container of simulation setup. + + +.. currentmodule:: pyedb.dotnet.database.utilities.simulation_setup + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + + SimulationSetupType + AdaptiveType + SimulationSetup + + diff --git a/doc/source/dotnet_api/dotnet/utilities/siwave_simulation_setup.rst b/doc/source/dotnet_api/dotnet/utilities/siwave_simulation_setup.rst new file mode 100644 index 0000000000..bb68102e2c --- /dev/null +++ b/doc/source/dotnet_api/dotnet/utilities/siwave_simulation_setup.rst @@ -0,0 +1,16 @@ +SIwave simulation setup +======================= +These classes are the containers of siwave simulation setup. + + +.. currentmodule:: pyedb.dotnet.database.utilities.siwave_simulation_setup + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + + + SiwaveSimulationSetup + SiwaveDCSimulationSetup + + diff --git a/doc/source/dotnet_api/index.rst b/doc/source/dotnet_api/index.rst new file mode 100644 index 0000000000..25d222e6ec --- /dev/null +++ b/doc/source/dotnet_api/index.rst @@ -0,0 +1,44 @@ +==================== +DotNet API reference +==================== + +This section describes EDB functions, classes, and methods +for EDB apps and modules. Use the search feature or click links +to view API documentation. + +The PyEDB API includes classes for apps and modules. You must initialize the +``Edb`` class to get access to all modules and methods. All other classes and +methods are inherited into the ``Edb`` class. + +If EDB is launched within the ``HfssdLayout`` class, EDB is accessible in read-only mode. + + +.. image:: ../resources/edb_intro.png + :width: 800 + :alt: EDB apps + :target: https://www.ansys.com/applications/pcbs-ics-ic-packages + + +**Example** + +.. code:: python + + from pyedb import Edb + + edb = Edb("my_project.aedb", edbversion="2023.1") + edb.core_components.components["R1"].r_value = 40 + edb.close_edb() + + +.. toctree:: + :maxdepth: 2 + + dotnet/CoreEdb + dotnet/edb_data/index + dotnet/sim_setup_data/data/index + dotnet/sim_setup_data/io/index + dotnet/utilities/index + dotnet/SiWave + SimulationConfigurationv2 + + diff --git a/doc/source/grpc_api/grpc/edb.rst b/doc/source/grpc_api/grpc/edb.rst index 235f83a88b..3b3e6ae03c 100644 --- a/doc/source/grpc_api/grpc/edb.rst +++ b/doc/source/grpc_api/grpc/edb.rst @@ -1,7 +1,7 @@ .. _edb_main_class: -Edb main class -============== +Edb gRPC main class +=================== An AEDB database is a folder that contains the database representing any part of a PCB. It can be opened and edited using the ``Edb`` class. diff --git a/doc/source/grpc_api/grpc/index.rst b/doc/source/grpc_api/grpc/index.rst index 4c626e5364..d64288a56e 100644 --- a/doc/source/grpc_api/grpc/index.rst +++ b/doc/source/grpc_api/grpc/index.rst @@ -2,7 +2,7 @@ PyEDB ===== -This section describes EDB main class. +This section describes EDB gRPC main class. .. toctree:: diff --git a/doc/source/grpc_api/index.rst b/doc/source/grpc_api/index.rst index 87e1947540..14b6f19805 100644 --- a/doc/source/grpc_api/index.rst +++ b/doc/source/grpc_api/index.rst @@ -2,8 +2,13 @@ gRPC API reference ================== +.. image:: ../resources/from-chips-to-ships-hfss-flex-pcb.png + :width: 500 + :alt: EDB apps + :target: https://www.ansys.com/applications/pcbs-ics-ic-packages + This section describes EDB functions, classes, and methods -for EDB apps and modules. Use the search feature or click links +for EDB gRPC applications and modules. Use the search feature or click links to view API documentation. The PyEDB API includes classes for apps and modules. You must initialize the @@ -12,8 +17,34 @@ methods are inherited into the ``Edb`` class. If EDB is launched within the ``HfssdLayout`` class, EDB is accessible in read-only mode. +.. note:: PyEDB is now supporting gRPC + **Starting ANSYS release 2025.2 PyEDB is compatible with gRPC.** + The two main advantages are: + - Better compatibility with Linux + - PyEDB becomes ready to remote - client services + + If you want to know more about `gRPC `_. + + PyEDB gRPC is providing backward compatibility with previous versions. + to enable PyEDB gRPC you have two options. + + - Explicit import: + - Using grpc flag: + + .. code:: python + # Explicit import + from pyedb.grpc.edb import Edb + + # Using grpc flag + from pyedb import Edb + edb = Edb(edbpath=r"my_edb_path", edbversion="2025.2", grpc=True) + The default grpc flag value is `False` so by default you will still be using PyEDB DotNet. + However, starting ** ANSYS release 2026.1, we will start deprecating PyEDB DotNet version **. + PyEDB gRPC will become the long term supported version and new features will only be implemented + into this one. Therefore we highly encourage our users migrating to gRPC when possible to get the + best user experience. .. toctree:: :maxdepth: 3 diff --git a/doc/source/index.rst b/doc/source/index.rst index f9c56c527b..457436c8a5 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -24,12 +24,20 @@ API to make scripting simpler. Understand how to use PyEDB by looking at some simple tutorials. - .. grid-item-card:: API reference :fa:`book-bookmark` + .. grid-item-card:: gRPC API reference :fa:`book-bookmark` :padding: 2 2 2 2 :link: grpc_api/index :link-type: doc - Understand PyEDB API endpoints, their capabilities, + Understand PyEDB gRPC API endpoints, their capabilities, + and how to interact with them programmatically. + + .. grid-item-card:: DotNet API reference :fa:`book-bookmark` + :padding: 2 2 2 2 + :link: dotnet_api/index + :link-type: doc + + Understand PyEDB DotNet API endpoints, their capabilities, and how to interact with them programmatically. .. grid-item-card:: Examples :fa:`scroll` @@ -54,6 +62,7 @@ API to make scripting simpler. getting_started/index user_guide/index grpc_api/index + dotnet_api/index contributing Indices and tables diff --git a/doc/source/resources/from-chips-to-ships-hfss-flex-pcb.png b/doc/source/resources/from-chips-to-ships-hfss-flex-pcb.png new file mode 100644 index 0000000000000000000000000000000000000000..1f123cab54ea3dc05e8e5da324665a555d7bb168 GIT binary patch literal 139624 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 z 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 literal 0 HcmV?d00001 From 6da463c24f3cc0e7ffe83c8a00b68daf51780f34 Mon Sep 17 00:00:00 2001 From: svandenb-dev Date: Wed, 25 Jun 2025 17:33:22 +0200 Subject: [PATCH 17/29] doc multi tab --- doc/source/grpc_api/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/grpc_api/index.rst b/doc/source/grpc_api/index.rst index 14b6f19805..343a29c740 100644 --- a/doc/source/grpc_api/index.rst +++ b/doc/source/grpc_api/index.rst @@ -3,7 +3,7 @@ gRPC API reference ================== .. image:: ../resources/from-chips-to-ships-hfss-flex-pcb.png - :width: 500 + :width: 400 :alt: EDB apps :target: https://www.ansys.com/applications/pcbs-ics-ic-packages From 64d59de86c6750f21a97651e893c7f3a6165bae2 Mon Sep 17 00:00:00 2001 From: svandenb-dev Date: Wed, 25 Jun 2025 17:39:17 +0200 Subject: [PATCH 18/29] doc multi tab --- doc/source/dotnet_api/index.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/source/dotnet_api/index.rst b/doc/source/dotnet_api/index.rst index 25d222e6ec..4c9923058b 100644 --- a/doc/source/dotnet_api/index.rst +++ b/doc/source/dotnet_api/index.rst @@ -1,6 +1,6 @@ -==================== -DotNet API reference -==================== +============= +API reference +============= This section describes EDB functions, classes, and methods for EDB apps and modules. Use the search feature or click links From 82248653312cde90b6b11e8545e9f4759cbc19b7 Mon Sep 17 00:00:00 2001 From: svandenb-dev Date: Wed, 25 Jun 2025 17:55:24 +0200 Subject: [PATCH 19/29] doc multi tab --- doc/source/grpc_api/index.rst | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/doc/source/grpc_api/index.rst b/doc/source/grpc_api/index.rst index 343a29c740..7b3a9a37c9 100644 --- a/doc/source/grpc_api/index.rst +++ b/doc/source/grpc_api/index.rst @@ -26,19 +26,6 @@ If EDB is launched within the ``HfssdLayout`` class, EDB is accessible in read-o If you want to know more about `gRPC `_. PyEDB gRPC is providing backward compatibility with previous versions. - to enable PyEDB gRPC you have two options. - - - Explicit import: - - Using grpc flag: - - .. code:: python - # Explicit import - from pyedb.grpc.edb import Edb - - # Using grpc flag - from pyedb import Edb - - edb = Edb(edbpath=r"my_edb_path", edbversion="2025.2", grpc=True) The default grpc flag value is `False` so by default you will still be using PyEDB DotNet. However, starting ** ANSYS release 2026.1, we will start deprecating PyEDB DotNet version **. @@ -46,6 +33,19 @@ If EDB is launched within the ``HfssdLayout`` class, EDB is accessible in read-o into this one. Therefore we highly encourage our users migrating to gRPC when possible to get the best user experience. +to enable PyEDB gRPC you have two options. + - Explicit import: + - Using grpc flag: + +.. code:: python + # Explicit import + from pyedb.grpc.edb import Edb + + # Using grpc flag + from pyedb import Edb + + edb = Edb(edbpath=r"my_edb_path", edbversion="2025.2", grpc=True) + .. toctree:: :maxdepth: 3 From c6087de112cc11de3ee565c970fba5957456c1ef Mon Sep 17 00:00:00 2001 From: svandenb-dev Date: Thu, 26 Jun 2025 10:35:16 +0200 Subject: [PATCH 20/29] doc fix --- doc/source/grpc_api/index.rst | 6 +- src/pyedb/grpc/database/source_excitations.py | 20 +- src/pyedb/grpc/edb.py | 219 ++++-------------- src/pyedb/grpc/edb_init.py | 6 +- 4 files changed, 64 insertions(+), 187 deletions(-) diff --git a/doc/source/grpc_api/index.rst b/doc/source/grpc_api/index.rst index 7b3a9a37c9..14179d1627 100644 --- a/doc/source/grpc_api/index.rst +++ b/doc/source/grpc_api/index.rst @@ -2,11 +2,6 @@ gRPC API reference ================== -.. image:: ../resources/from-chips-to-ships-hfss-flex-pcb.png - :width: 400 - :alt: EDB apps - :target: https://www.ansys.com/applications/pcbs-ics-ic-packages - This section describes EDB functions, classes, and methods for EDB gRPC applications and modules. Use the search feature or click links to view API documentation. @@ -38,6 +33,7 @@ to enable PyEDB gRPC you have two options. - Using grpc flag: .. code:: python + # Explicit import from pyedb.grpc.edb import Edb diff --git a/src/pyedb/grpc/database/source_excitations.py b/src/pyedb/grpc/database/source_excitations.py index c12515f403..301cba3b94 100644 --- a/src/pyedb/grpc/database/source_excitations.py +++ b/src/pyedb/grpc/database/source_excitations.py @@ -2635,16 +2635,16 @@ def create_current_source(self, terminal, ref_terminal): Parameters ---------- - terminal : :class:`EdgeTerminal `, - :class:`PadstackInstanceTerminal `, - :class:`PointTerminal `, - :class:`PinGroupTerminal `, - Positive terminal of the source. - ref_terminal : :class:`EdgeTerminal `, - :class:`pyedb.grpc.database.terminals.PadstackInstanceTerminal`, - :class:`PadstackInstanceTerminal `, - :class:`PinGroupTerminal `, - Negative terminal of the source. + terminal : :class:`EdgeTerminal `or + :class:`PadstackInstanceTerminal ` or + :class:`PointTerminal ` or + :class:`PinGroupTerminal `. + Positive terminal of the source. + ref_terminal : :class:`EdgeTerminal ` or + :class:`pyedb.grpc.database.terminals.PadstackInstanceTerminal` or + :class:`PadstackInstanceTerminal ` or + :class:`PinGroupTerminal `. + Negative terminal of the source. Returns ------- diff --git a/src/pyedb/grpc/edb.py b/src/pyedb/grpc/edb.py index 187cf17b66..4ca5c18d56 100644 --- a/src/pyedb/grpc/edb.py +++ b/src/pyedb/grpc/edb.py @@ -486,7 +486,7 @@ def ports(self) -> dict[str, GapPort]: Returns ------- - dict[str, Union[:class:`GapPort`, :class:`WavePort`, :class:`CoaxPort`]] + dict[str, list[:class:`GapPort` or :class:`WavePort` or :class:`CoaxPort`]] Port names and objects. """ terminals = [term for term in self.layout.terminals if not term.is_reference_terminal] @@ -572,7 +572,7 @@ def open(self, restart_rpc_server=False) -> bool: Examples -------- - Open an existing EDB database: + >>> # Open an existing EDB database: >>> edb = Edb("myproject.aedb") """ self.standalone = self.standalone @@ -763,10 +763,9 @@ def import_layout_file( Examples -------- - Import a BRD file: + >>> # Import a BRD file: >>> edb.import_layout_file("my_board.brd", r"C:/project") - - Import a GDS file with control file: + >>> # Import a GDS file with control file: >>> edb.import_layout_file("layout.gds", control_file="control.xml") """ self._components = None @@ -831,7 +830,7 @@ def export_to_ipc2581(self, ipc_path=None, units="MILLIMETER") -> str: Examples -------- - Export to IPC2581 format: + >>> # Export to IPC2581 format: >>> edb.export_to_ipc2581("output.xml") """ if units.lower() not in ["millimeter", "inch", "micron"]: # pragma no cover @@ -1238,7 +1237,7 @@ def close_edb(self) -> bool: """Close EDB and clean up resources. ..deprecated:: 0.51.0 - Use: func:`close` instead. + Use :func:`close` instead. Returns ------- @@ -1257,17 +1256,8 @@ def save_edb(self) -> bool: """Save current EDB database. ..deprecated:: 0.51.0 - Use: func:`save` instead. - - Returns - ------- - bool - True if successful, False otherwise. + Use :func:`save` instead. - Examples - -------- - Save the current EDB: - >>> edb.save_edb() """ warnings.warn("Use method save instead.", DeprecationWarning) return self.save() @@ -1276,22 +1266,7 @@ def save_edb_as(self, fname) -> bool: """Save EDB database to new location. ..deprecated:: 0.51.0 - Use: func:`save_as` instead. - - Parameters - ---------- - fname : str - New AEDB path. - - Returns - ------- - bool - True if successful, False otherwise. - - Examples - -------- - Save EDB to new location: - >>> edb.save_edb_as("new_location.aedb") + Use :func:`save_as` instead. """ warnings.warn("Use method save_as instead.", DeprecationWarning) return self.save_as(fname) @@ -1307,8 +1282,12 @@ def execute(self, func): # return self.edb_api.utility.utility.Command.Execute(func) pass - def import_cadence_file(self, inputBrd, WorkDir=None, anstranslator_full_path="", use_ppe=False): - """Import Cadence board file (Deprecated - use import_layout_file).""" + def import_cadence_file(self, inputBrd, WorkDir=None, anstranslator_full_path="", use_ppe=False) -> bool: + """Import Cadence board file. + + .. deprecated:: 0.50 + Use :func:`import_layout_file` instead. + """ if self.import_layout_pcb( inputBrd, working_dir=WorkDir, @@ -1707,10 +1686,9 @@ def cutout( Examples -------- - Create a basic cutout: + >>> # Create a basic cutout: >>> edb.cutout(signal_list=["Net1"], reference_list=["GND"]) - - Create cutout with custom polygon: + >>> # Create cutout with custom polygon: >>> custom_poly = [[0,0], [10e-3,0], [10e-3,10e-3], [0,10e-3]] >>> edb.cutout(custom_extent=custom_poly) """ @@ -2460,7 +2438,7 @@ def export_hfss( Examples -------- - Export to HFSS project: + >>> # Export to HFSS project: >>> edb.export_hfss(r"C:/output", net_list=["SignalNet"]) """ siwave_s = SiwaveSolve(self.edbpath, aedt_installer_path=self.base_path) @@ -2496,7 +2474,7 @@ def export_q3d( Examples -------- - Export to Q3D project: + >>> # Export to Q3D project: >>> edb.export_q3d(r"C:/output") """ siwave_s = SiwaveSolve(self.edbpath, aedt_installer_path=self.base_path) @@ -2539,7 +2517,7 @@ def export_maxwell( Examples -------- - Export to Maxwell project: + >>> # Export to Maxwell project: >>> edb.export_maxwell(r"C:/output") """ siwave_s = SiwaveSolve(self.edbpath, aedt_installer_path=self.base_path) @@ -2562,7 +2540,7 @@ def solve_siwave(self): Examples -------- - Solve with SIwave: + >>> # Solve with SIwave: >>> edb.solve_siwave() """ process = SiwaveSolve(self.edbpath, aedt_version=self.edbversion) @@ -2762,7 +2740,7 @@ def get_bounding_box(self) -> list[list[float, float], list[float, float]]: Returns ------- list - [[min_x, min_y], [max_x, max_y]] in meters. + list[list[min_x, min_y], list[max_x, max_y]] in meters. """ lay_inst_polygon_data = [obj_inst.get_bbox() for obj_inst in self.layout_instance.query_layout_obj_instances()] layout_bbox = GrpcPolygonData.bbox_of_polygons(lay_inst_polygon_data) @@ -2865,10 +2843,10 @@ def setups( Returns ------- - Dict[str,: class:`pyedb.grpc.database.simulation_setup.hfss_simulation_setup.HfssSimulationSetup`] or - Dict[str,: class:`pyedb.grpc.database.simulation_setup.siwave_simulation_setup.SiwaveSimulationSetup`] or - Dict[str,: class:`SIWaveDCIRSimulationSetup`] or - Dict[str,: class:`pyedb.grpc.database.simulation_setup.raptor_x_simulation_setup.RaptorXSimulationSetup`] + Dict[str,:class:`HfssSimulationSetup`] or + Dict[str,:class:`SiwaveSimulationSetup`] or + Dict[str,:class:`SIWaveDCIRSimulationSetup`] or + Dict[str,:class:`RaptorXSimulationSetup`] """ self._setups = {} @@ -2919,8 +2897,7 @@ def siwave_ac_setups(self) -> dict[str, SiwaveSimulationSetup]: Returns ------- - Dict[str,:class:`SiwaveSimulationSetup - `] + Dict[str,:class:`SiwaveSimulationSetup`] """ return {name: i for name, i in self.setups.items() if isinstance(i, SiwaveSimulationSetup)} @@ -2931,16 +2908,6 @@ def create_hfss_setup( . deprecated:: pyedb 0.30.0 Use :func:`pyedb.grpc.core.hfss.add_setup` instead. - - Parameters - ---------- - name : str, optional - Setup name. - - Returns - ------- - :class:`HfssSimulationSetup ` - """ warnings.warn( "`create_hfss_setup` is deprecated and is now located here " "`pyedb.grpc.core.hfss.add_setup` instead.", @@ -2964,8 +2931,7 @@ def create_raptorx_setup(self, name=None) -> RaptorXSimulationSetup: Returns ------- - :class:`RaptorXSimulationSetup - ` + :class:`RaptorXSimulationSetup` RaptorX setup or False if unsupported. """ from ansys.edb.core.simulation_setup.raptor_x_simulation_setup import ( @@ -3021,8 +2987,7 @@ def create_siwave_syz_setup(self, name=None, **kwargs) -> SiwaveSimulationSetup: Returns ------- - :class:`SiwaveSimulationSetup - ` + :class:`SiwaveSimulationSetup` SYZ analysis setup. """ if not name: @@ -3050,8 +3015,7 @@ def create_siwave_dc_setup(self, name=None, **kwargs) -> GrpcSIWaveDCIRSimulatio Returns ------- - :class:`SIWaveDCIRSimulationSetup - ` + :class:`SIWaveDCIRSimulationSetup` DC analysis setup. """ if not name: @@ -3095,8 +3059,8 @@ def calculate_initial_extent(self, expansion_factor): self.logger.info(f"The W factor is {expansion_factor}, The initial extent = {max_width}") return max_width - def copy_zones(self, working_directory=None): - """Copy multizone EDB project to one new edb per zone. + def copy_zones(self, working_directory=None) -> dict[str, tuple[int, GrpcPolygonData]]: + """Copy multi-zone EDB project to one new edb per zone. Parameters ---------- @@ -3105,7 +3069,8 @@ def copy_zones(self, working_directory=None): Returns ------- - dict[str, [int,: class:`PolygonData `]] + dict[str, tuple[int,:class:`PolygonData `]] + Return a dictionary with edb path as key and tuple Zone Id as first item and EDB polygon Data defining the region as second item. @@ -3124,7 +3089,7 @@ def copy_zones(self, working_directory=None): edb_zones = {} if not self.setups: self.siwave.add_siwave_syz_analysis() - self.save_edb() + self.save() for zone_primitive in zone_primitives: if zone_primitive: edb_zone_path = os.path.join(working_directory, f"{zone_primitive.id}_{os.path.basename(self.edbpath)}") @@ -3158,10 +3123,9 @@ def cutout_multizone_layout(self, zone_dict, common_reference_net=None): Returns ------- - Dict[str: str] or List[str] - first dictionary defined_ports with edb name as key and existing port name list as value. Those ports are the - ones defined before processing the multizone clipping. - second is the list of connected port. + dict[str: str] or list[str] + first dictionary defined_ports with edb name as key and existing port name list as value. Those ports are + the ones defined before processing the multizone clipping. the second is the list of connected port. """ terminals = {} @@ -3280,29 +3244,8 @@ def create_port(self, terminal, ref_terminal=None, is_circuit_port=False, name=N """Create a port. ..deprecated:: 0.51.0 - Use: func:`create_port` has been move to source_excitation.create_port. + Use :func:`create_port` has been moved to source_excitation.create_port. - Parameters - ---------- - terminal : class:`pyedb.dotnet.database.edb_data.terminals.EdgeTerminal`, - class:`pyedb.grpc.database.terminals.PadstackInstanceTerminal`, - class:`pyedb.grpc.database.terminals.PointTerminal`, - class:`pyedb.grpc.database.terminals.PinGroupTerminal`, - Positive terminal of the port. - ref_terminal : class:`pyedb.grpc.database.terminals.EdgeTerminal`, - class:`pyedb.grpc.database.terminals.PadstackInstanceTerminal`, - class:`pyedb.grpc.database.terminals.PointTerminal`, - class:`pyedb.grpc.database.terminals.PinGroupTerminal`, - optional - Negative terminal of the port. - is_circuit_port : bool, optional - Whether it is a circuit port. The default is ``False``. - name: str, optional - Name of the created port. The default is None, a random name is generated. - Returns - ------- - list: [:class:`GapPort , - :class:`WavePort `]. """ warnings.warn("Use create_port from edb.source_excitation.create_port", DeprecationWarning) @@ -3312,24 +3255,8 @@ def create_voltage_probe(self, terminal, ref_terminal): """Create a voltage probe. ..deprecated:: 0.50.0 - Use: func:`create_voltage_probe` located in edb.source_excitation.create_voltage_probe instead. - - Parameters - ---------- - terminal : :class:`EdgeTerminal `, - :class:`PadstackInstanceTerminal `, - :class:`PointTerminal `, - :class:`PinGroupTerminal `, - Positive terminal of the port. - ref_terminal : :class:`EdgeTerminal `, - :class:`pyedb.grpc.database.terminals.PadstackInstanceTerminal`, - :class:`PadstackInstanceTerminal `, - :class:`PinGroupTerminal `, - Negative terminal of the probe. + Use :func:`create_voltage_probe` has been moved to edb.source_excitation.create_voltage_probe. - Returns - ------- - :class:`Terminal ` """ warnings.warn("Use create_voltage_probe located in edb.source_excitation instead", DeprecationWarning) return self.source_excitation.create_voltage_probe(terminal, ref_terminal) @@ -3338,24 +3265,8 @@ def create_voltage_source(self, terminal, ref_terminal): """Create a voltage source. ..deprecated:: 0.50.0 - Use: func:`create_voltage_source` located in edb.source_excitation.create_voltage_source instead. + Use: func:`create_voltage_source` has been moved to edb.source_excitation.create_voltage_source. - Parameters - ---------- - terminal : :class:`EdgeTerminal `, - :class:`PadstackInstanceTerminal `, - :class:`PointTerminal `, - :class:`PinGroupTerminal `, - Positive terminal of the source. - ref_terminal : :class:`EdgeTerminal `, - :class:`pyedb.grpc.database.terminals.PadstackInstanceTerminal`, - :class:`PadstackInstanceTerminal `, - :class:`PinGroupTerminal `, - Negative terminal of the source. - - Returns - ------- - class:`ExcitationSources ` """ warnings.warn( "use create_voltage_source located in edb.source_excitation.create_voltage_source instead", @@ -3367,24 +3278,8 @@ def create_current_source(self, terminal, ref_terminal): """Create a current source. ..deprecated:: 0.50.0 - Use: func:`create_current_source` located in edb.source_excitation.create_current_source instead. + Use :func:`create_current_source` has been moved to edb.source_excitation.create_current_source. - Parameters - ---------- - terminal : :class:`EdgeTerminal `, - :class:`PadstackInstanceTerminal `, - :class:`PointTerminal `, - :class:`PinGroupTerminal `, - Positive terminal of the source. - ref_terminal : :class:`EdgeTerminal `, - :class:`pyedb.grpc.database.terminals.PadstackInstanceTerminal`, - :class:`PadstackInstanceTerminal `, - :class:`PinGroupTerminal `, - Negative terminal of the source. - - Returns - ------- - :class:`ExcitationSources ` """ warnings.warn( "use create_current_source located in edb.source_excitation.create_current_source instead", @@ -3396,22 +3291,7 @@ def get_point_terminal(self, name, net_name, location, layer): """Place terminal between two points. ..deprecated:: 0.50.0 - Use: func:`get_point_terminal` located in edb.source_excitation.get_point_terminal instead. - - Parameters - ---------- - name : str, - Name of the terminal. - net_name : str - Name of the net. - location : list - Location of the terminal. - layer : str, - Layer of the terminal. - - Returns - ------- - :class:`PointTerminal ` + Use: func:`get_point_terminal` has been moved to edb.source_excitation.get_point_terminal. """ warnings.warn( @@ -3487,14 +3367,13 @@ def auto_parametrize_design( -------- Parametrize design elements: >>> params = edb.auto_parametrize_design( - ... layers=True, - ... materials=True, - ... trace_net_filter=["Clock"] - ... ) + >>> layers=True, + >>> materials=True, + >>> trace_net_filter=["Clock"]) """ edb_original_path = self.edbpath if output_aedb_path: - self.save_edb_as(output_aedb_path) + self.save_as(output_aedb_path) if isinstance(trace_net_filter, str): trace_net_filter = [trace_net_filter] parameters = [] @@ -3682,10 +3561,10 @@ def _apply_variable(orig_name, orig_value): void.expand(expand_voids_size, round_corners=False) if not open_aedb_at_end and self.edbpath != edb_original_path: - self.save_edb() - self.close_edb() + self.save() + self.close() self.edbpath = edb_original_path - self.open_edb() + self.open() return parameters @staticmethod diff --git a/src/pyedb/grpc/edb_init.py b/src/pyedb/grpc/edb_init.py index ed249528f4..17e5c0c2ca 100644 --- a/src/pyedb/grpc/edb_init.py +++ b/src/pyedb/grpc/edb_init.py @@ -193,10 +193,12 @@ def close(self, terminate_rpc_session=True): Parameters ---------- terminate_rpc_session : bool, optional - + Terminate RPC session when closing the database. The default value is `True`. . note:: - Unsaved changes will be lost. + Unsaved changes will be lost. If multiple databases are open and RPC session is terminated, the connection + with all databases will be lost. You might be careful and set to `False` until the last open database + remains. """ self._db.close() self._db = None From 6a1cc12ad8e57b5fa9b2b6505f0dbeef52f7b26a Mon Sep 17 00:00:00 2001 From: svandenb-dev Date: Thu, 26 Jun 2025 11:37:54 +0200 Subject: [PATCH 21/29] doc fix --- doc/source/grpc_api/index.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/source/grpc_api/index.rst b/doc/source/grpc_api/index.rst index 14179d1627..ecbd35ee24 100644 --- a/doc/source/grpc_api/index.rst +++ b/doc/source/grpc_api/index.rst @@ -15,22 +15,22 @@ If EDB is launched within the ``HfssdLayout`` class, EDB is accessible in read-o .. note:: PyEDB is now supporting gRPC **Starting ANSYS release 2025.2 PyEDB is compatible with gRPC.** The two main advantages are: - - Better compatibility with Linux - - PyEDB becomes ready to remote - client services + - Better compatibility with Linux + - PyEDB becomes ready to remote - client services If you want to know more about `gRPC `_. PyEDB gRPC is providing backward compatibility with previous versions. The default grpc flag value is `False` so by default you will still be using PyEDB DotNet. - However, starting ** ANSYS release 2026.1, we will start deprecating PyEDB DotNet version **. + However, starting **ANSYS release 2026.1, we will start deprecating PyEDB DotNet version**. PyEDB gRPC will become the long term supported version and new features will only be implemented into this one. Therefore we highly encourage our users migrating to gRPC when possible to get the best user experience. to enable PyEDB gRPC you have two options. - - Explicit import: - - Using grpc flag: + - Explicit import + - Using grpc flag .. code:: python From d421040f97d347a472bd8c0d97a9ce55d9ca6081 Mon Sep 17 00:00:00 2001 From: svandenb-dev Date: Thu, 26 Jun 2025 12:55:49 +0200 Subject: [PATCH 22/29] cfg fix --- doc/source/dotnet_api/SimulationConfigurationV2.rst | 2 +- doc/source/grpc_api/SimulationConfigurationV2.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/source/dotnet_api/SimulationConfigurationV2.rst b/doc/source/dotnet_api/SimulationConfigurationV2.rst index 6ce83c60de..8267b11bdf 100644 --- a/doc/source/dotnet_api/SimulationConfigurationV2.rst +++ b/doc/source/dotnet_api/SimulationConfigurationV2.rst @@ -95,7 +95,7 @@ These classes are the containers of simulation configuration constructors V2.0 f :nosignatures: CfgTerminalInfo - CfgCoordianteTerminalInfo + CfgCoordinateTerminalInfo CfgNearestPinTerminalInfo CfgSources CfgPorts diff --git a/doc/source/grpc_api/SimulationConfigurationV2.rst b/doc/source/grpc_api/SimulationConfigurationV2.rst index 6ce83c60de..8267b11bdf 100644 --- a/doc/source/grpc_api/SimulationConfigurationV2.rst +++ b/doc/source/grpc_api/SimulationConfigurationV2.rst @@ -95,7 +95,7 @@ These classes are the containers of simulation configuration constructors V2.0 f :nosignatures: CfgTerminalInfo - CfgCoordianteTerminalInfo + CfgCoordinateTerminalInfo CfgNearestPinTerminalInfo CfgSources CfgPorts From d33f33bc72bf00ac4a5707a78830997b33aa1415 Mon Sep 17 00:00:00 2001 From: svandenb-dev Date: Thu, 26 Jun 2025 16:23:49 +0200 Subject: [PATCH 23/29] cfg fix --- tests/grpc/system/test_edb_padstacks.py | 10 ---------- tests/legacy/system/test_edb_padstacks.py | 10 ---------- 2 files changed, 20 deletions(-) diff --git a/tests/grpc/system/test_edb_padstacks.py b/tests/grpc/system/test_edb_padstacks.py index 61437cf3c5..18c83a9ef9 100644 --- a/tests/grpc/system/test_edb_padstacks.py +++ b/tests/grpc/system/test_edb_padstacks.py @@ -538,13 +538,3 @@ def test_via_merge3(self): assert edbapp.padstacks.instances[merged_via[0]].start_layer == "layer1" assert edbapp.padstacks.instances[merged_via[0]].stop_layer == "layer2" edbapp.close() - - def test_padstack_instance_side_number(self, edb_examples): - edb = edb_examples.get_si_verse() - inst = list(edb.padstacks.instances.values())[0] - for _, inst in edb.padstacks.instances.items(): - inst.side_number - inst.side_number = 12 - assert inst.side_number == 3 - inst.side_number = 10 - assert inst.side_number == 10 diff --git a/tests/legacy/system/test_edb_padstacks.py b/tests/legacy/system/test_edb_padstacks.py index 37e8a7563a..a09d002922 100644 --- a/tests/legacy/system/test_edb_padstacks.py +++ b/tests/legacy/system/test_edb_padstacks.py @@ -549,13 +549,3 @@ def _assert_inside(rect, pad): assert math.isclose( round(result[0].Area(), 4), round(rect.Area(), 4) ), f"{BASE_MESSAGE} area of intersection is not equal to rectangle area" - - -def test_padstack_instance_side_number(edb_examples): - edb = edb_examples.get_si_verse() - for _, inst in edb.padstacks.instances.items(): - inst.side_number = 12 - inst = list(edb.padstacks.instances.values())[0] - assert inst.side_number == 3 - inst.side_number = 10 - assert inst.side_number == 10 From d79d43dc31e325c5dbe7ff8b2aa0b4ce79225eca Mon Sep 17 00:00:00 2001 From: svandenb-dev Date: Thu, 26 Jun 2025 17:07:30 +0200 Subject: [PATCH 24/29] val fix --- doc/.vale.ini | 3 ++- doc/source/grpc_api/index.rst | 6 +++--- src/pyedb/grpc/database/hierarchy/pin_pair_model.py | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/doc/.vale.ini b/doc/.vale.ini index 18f7f569d8..b5c8f87760 100644 --- a/doc/.vale.ini +++ b/doc/.vale.ini @@ -11,7 +11,8 @@ MinAlertLevel = warning IgnoredScopes = code, tt # By default, `script`, `style`, `pre`, and `figure` are ignored. -SkippedScopes = script, style, pre, figure +SkippedScopes = script, style, pre, figure, grpc, gRPC, Edb, xml, Rlc, S-Parameter, netlist, Pingroup, pingroup, +Padstack, Spice, # WordTemplate specifies what Vale will consider to be an individual word. WordTemplate = \b(?:%s)\b diff --git a/doc/source/grpc_api/index.rst b/doc/source/grpc_api/index.rst index ecbd35ee24..e9dbd61b67 100644 --- a/doc/source/grpc_api/index.rst +++ b/doc/source/grpc_api/index.rst @@ -22,10 +22,10 @@ If EDB is launched within the ``HfssdLayout`` class, EDB is accessible in read-o PyEDB gRPC is providing backward compatibility with previous versions. - The default grpc flag value is `False` so by default you will still be using PyEDB DotNet. + The default grpc flag value is `False` so by default uses PyEDB DotNet. However, starting **ANSYS release 2026.1, we will start deprecating PyEDB DotNet version**. - PyEDB gRPC will become the long term supported version and new features will only be implemented - into this one. Therefore we highly encourage our users migrating to gRPC when possible to get the + PyEDB gRPC becomes the long term supported version and new features are only implemented + into this one. Therefore we highly encourage users migrating to gRPC when possible to get the best user experience. to enable PyEDB gRPC you have two options. diff --git a/src/pyedb/grpc/database/hierarchy/pin_pair_model.py b/src/pyedb/grpc/database/hierarchy/pin_pair_model.py index 0905ad5344..d0dbd29e76 100644 --- a/src/pyedb/grpc/database/hierarchy/pin_pair_model.py +++ b/src/pyedb/grpc/database/hierarchy/pin_pair_model.py @@ -27,7 +27,7 @@ class PinPairModel(GrpcPinPairModel): - """Manage pin pair model.""" + """Manage pin-pair model.""" def __init__(self, pedb, edb_object): self._pedb_comp = pedb From 3ffa5c069c1f0a8c2d5e34fe9d8c5f88c2547568 Mon Sep 17 00:00:00 2001 From: svandenb-dev Date: Fri, 27 Jun 2025 11:39:18 +0200 Subject: [PATCH 25/29] val fix 2 --- .../dotnet_api/SimulationConfigurationV2.rst | 155 ------------------ doc/source/dotnet_api/index.rst | 1 - .../grpc_api/SimulationConfigurationV2.rst | 155 ------------------ 3 files changed, 311 deletions(-) delete mode 100644 doc/source/dotnet_api/SimulationConfigurationV2.rst delete mode 100644 doc/source/grpc_api/SimulationConfigurationV2.rst diff --git a/doc/source/dotnet_api/SimulationConfigurationV2.rst b/doc/source/dotnet_api/SimulationConfigurationV2.rst deleted file mode 100644 index 8267b11bdf..0000000000 --- a/doc/source/dotnet_api/SimulationConfigurationV2.rst +++ /dev/null @@ -1,155 +0,0 @@ -Simulation configuration v2.0 -============================= -These classes are the containers of simulation configuration constructors V2.0 for the EDB. - - -.. currentmodule:: pyedb.configuration.cfg_boundaries - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgBoundaries - -.. currentmodule:: pyedb.configuration.cfg_common - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgBase - -.. currentmodule:: pyedb.configuration.cfg_components - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgComponent - CfgComponents - -.. currentmodule:: pyedb.configuration.cfg_data - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgData - -.. currentmodule:: pyedb.configuration.cfg_general - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgGeneral - -.. currentmodule:: pyedb.configuration.cfg_nets - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgNets - -.. currentmodule:: pyedb.configuration.cfg_operations - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgCutout - CfgOperations - -.. currentmodule:: pyedb.configuration.cfg_package_definition - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgPackage - CfgHeatSink - CfgPackageDefinitions - -.. currentmodule:: pyedb.configuration.cfg_padstacks - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgPadstacks - -.. currentmodule:: pyedb.configuration.cfg_pin_groups - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgPinGroups - CfgPinGroup - -.. currentmodule:: pyedb.configuration.cfg_ports_sources - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgTerminalInfo - CfgCoordinateTerminalInfo - CfgNearestPinTerminalInfo - CfgSources - CfgPorts - CfgCircuitElement - CfgPort - CfgSource - -.. currentmodule:: pyedb.configuration.cfg_s_parameter_models - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgSParameterModel - -.. currentmodule:: pyedb.configuration.cfg_setup - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgSetup - CfgSIwaveACSetup - CfgSIwaveDCSetup - CfgHFSSSetup - CfgSetups - -.. currentmodule:: pyedb.configuration.cfg_spice_models - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgSpiceModel - -.. currentmodule:: pyedb.configuration.cfg_stackup - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgMaterial - CfgLayer - CfgStackup - -.. currentmodule:: pyedb.configuration.configuration - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - Configuration - - - - - diff --git a/doc/source/dotnet_api/index.rst b/doc/source/dotnet_api/index.rst index 4c9923058b..3c693cf0cb 100644 --- a/doc/source/dotnet_api/index.rst +++ b/doc/source/dotnet_api/index.rst @@ -39,6 +39,5 @@ If EDB is launched within the ``HfssdLayout`` class, EDB is accessible in read-o dotnet/sim_setup_data/io/index dotnet/utilities/index dotnet/SiWave - SimulationConfigurationv2 diff --git a/doc/source/grpc_api/SimulationConfigurationV2.rst b/doc/source/grpc_api/SimulationConfigurationV2.rst deleted file mode 100644 index 8267b11bdf..0000000000 --- a/doc/source/grpc_api/SimulationConfigurationV2.rst +++ /dev/null @@ -1,155 +0,0 @@ -Simulation configuration v2.0 -============================= -These classes are the containers of simulation configuration constructors V2.0 for the EDB. - - -.. currentmodule:: pyedb.configuration.cfg_boundaries - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgBoundaries - -.. currentmodule:: pyedb.configuration.cfg_common - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgBase - -.. currentmodule:: pyedb.configuration.cfg_components - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgComponent - CfgComponents - -.. currentmodule:: pyedb.configuration.cfg_data - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgData - -.. currentmodule:: pyedb.configuration.cfg_general - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgGeneral - -.. currentmodule:: pyedb.configuration.cfg_nets - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgNets - -.. currentmodule:: pyedb.configuration.cfg_operations - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgCutout - CfgOperations - -.. currentmodule:: pyedb.configuration.cfg_package_definition - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgPackage - CfgHeatSink - CfgPackageDefinitions - -.. currentmodule:: pyedb.configuration.cfg_padstacks - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgPadstacks - -.. currentmodule:: pyedb.configuration.cfg_pin_groups - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgPinGroups - CfgPinGroup - -.. currentmodule:: pyedb.configuration.cfg_ports_sources - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgTerminalInfo - CfgCoordinateTerminalInfo - CfgNearestPinTerminalInfo - CfgSources - CfgPorts - CfgCircuitElement - CfgPort - CfgSource - -.. currentmodule:: pyedb.configuration.cfg_s_parameter_models - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgSParameterModel - -.. currentmodule:: pyedb.configuration.cfg_setup - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgSetup - CfgSIwaveACSetup - CfgSIwaveDCSetup - CfgHFSSSetup - CfgSetups - -.. currentmodule:: pyedb.configuration.cfg_spice_models - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgSpiceModel - -.. currentmodule:: pyedb.configuration.cfg_stackup - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - CfgMaterial - CfgLayer - CfgStackup - -.. currentmodule:: pyedb.configuration.configuration - -.. autosummary:: - :toctree: _autosummary - :nosignatures: - - Configuration - - - - - From 3971cffddd6fd72f918f1072ff58b44a20c1fc09 Mon Sep 17 00:00:00 2001 From: svandenb-dev Date: Fri, 27 Jun 2025 14:22:48 +0200 Subject: [PATCH 26/29] val fix 2 --- doc/.vale.ini | 3 +-- doc/source/grpc_api/grpc/database/pyedb_lib/utility/index.rst | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/doc/.vale.ini b/doc/.vale.ini index b5c8f87760..18f7f569d8 100644 --- a/doc/.vale.ini +++ b/doc/.vale.ini @@ -11,8 +11,7 @@ MinAlertLevel = warning IgnoredScopes = code, tt # By default, `script`, `style`, `pre`, and `figure` are ignored. -SkippedScopes = script, style, pre, figure, grpc, gRPC, Edb, xml, Rlc, S-Parameter, netlist, Pingroup, pingroup, -Padstack, Spice, +SkippedScopes = script, style, pre, figure # WordTemplate specifies what Vale will consider to be an individual word. WordTemplate = \b(?:%s)\b diff --git a/doc/source/grpc_api/grpc/database/pyedb_lib/utility/index.rst b/doc/source/grpc_api/grpc/database/pyedb_lib/utility/index.rst index 0de13e51e4..4431ce06c8 100644 --- a/doc/source/grpc_api/grpc/database/pyedb_lib/utility/index.rst +++ b/doc/source/grpc_api/grpc/database/pyedb_lib/utility/index.rst @@ -12,6 +12,5 @@ This section describes EDB utility classes. hfss_extent_info layout_statistics rlc - simulation_configuration sources xml_control_file \ No newline at end of file From b42a970005efe0970fbb6901f719b546f27e56e8 Mon Sep 17 00:00:00 2001 From: svandenb-dev Date: Fri, 27 Jun 2025 15:17:16 +0200 Subject: [PATCH 27/29] val fix 2 --- doc/.vale.ini | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/.vale.ini b/doc/.vale.ini index 18f7f569d8..b5c8f87760 100644 --- a/doc/.vale.ini +++ b/doc/.vale.ini @@ -11,7 +11,8 @@ MinAlertLevel = warning IgnoredScopes = code, tt # By default, `script`, `style`, `pre`, and `figure` are ignored. -SkippedScopes = script, style, pre, figure +SkippedScopes = script, style, pre, figure, grpc, gRPC, Edb, xml, Rlc, S-Parameter, netlist, Pingroup, pingroup, +Padstack, Spice, # WordTemplate specifies what Vale will consider to be an individual word. WordTemplate = \b(?:%s)\b From dab94e0c8e5ed5c1d8f196154f481836d91bde4b Mon Sep 17 00:00:00 2001 From: svandenb-dev Date: Fri, 27 Jun 2025 15:42:25 +0200 Subject: [PATCH 28/29] val fix 2 --- doc/.vale.ini | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/doc/.vale.ini b/doc/.vale.ini index b5c8f87760..e75f474b97 100644 --- a/doc/.vale.ini +++ b/doc/.vale.ini @@ -11,8 +11,7 @@ MinAlertLevel = warning IgnoredScopes = code, tt # By default, `script`, `style`, `pre`, and `figure` are ignored. -SkippedScopes = script, style, pre, figure, grpc, gRPC, Edb, xml, Rlc, S-Parameter, netlist, Pingroup, pingroup, -Padstack, Spice, +SkippedScopes = script, style, pre, figure, grpc, gRPC, Edb, xml, Rlc, S-Parameter, netlist, Pingroup, pingroup, Padstack, Spice, # WordTemplate specifies what Vale will consider to be an individual word. WordTemplate = \b(?:%s)\b From 5a631f49a8b623b1ef24c4ace91a7e3bf33ca9eb Mon Sep 17 00:00:00 2001 From: svandenb-dev Date: Fri, 27 Jun 2025 17:21:31 +0200 Subject: [PATCH 29/29] val fix 3 --- doc/.vale.ini | 2 +- doc/styles/config/vocabularies/ANSYS/accept.txt | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/doc/.vale.ini b/doc/.vale.ini index e75f474b97..18f7f569d8 100644 --- a/doc/.vale.ini +++ b/doc/.vale.ini @@ -11,7 +11,7 @@ MinAlertLevel = warning IgnoredScopes = code, tt # By default, `script`, `style`, `pre`, and `figure` are ignored. -SkippedScopes = script, style, pre, figure, grpc, gRPC, Edb, xml, Rlc, S-Parameter, netlist, Pingroup, pingroup, Padstack, Spice, +SkippedScopes = script, style, pre, figure # WordTemplate specifies what Vale will consider to be an individual word. WordTemplate = \b(?:%s)\b diff --git a/doc/styles/config/vocabularies/ANSYS/accept.txt b/doc/styles/config/vocabularies/ANSYS/accept.txt index 13d7785f2b..2777f734e0 100644 --- a/doc/styles/config/vocabularies/ANSYS/accept.txt +++ b/doc/styles/config/vocabularies/ANSYS/accept.txt @@ -46,4 +46,15 @@ S[Ii]wave SYZ (?i)stackup(?:\s3D|s)? vias -XML \ No newline at end of file +XML +grpc +gRPC +Edb +xml +Rlc +S-Parameter +netlist +Pingroup +pingroup +Padstack +Spice \ No newline at end of file