pyedb 0.34.3__tar.gz → 0.36.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pyedb might be problematic. Click here for more details.
- {pyedb-0.34.3 → pyedb-0.36.0}/PKG-INFO +6 -6
- {pyedb-0.34.3 → pyedb-0.36.0}/README.md +3 -3
- {pyedb-0.34.3 → pyedb-0.36.0}/pyproject.toml +2 -2
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/__init__.py +1 -1
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/configuration/cfg_modeler.py +1 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/configuration/cfg_pin_groups.py +7 -8
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/configuration/cfg_ports_sources.py +39 -4
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/configuration/cfg_stackup.py +1 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/configuration/configuration.py +9 -5
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb.py +12 -4
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/pin_pair_model.py +3 -3
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/primitive/primitive.py +64 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/terminal/padstack_instance_terminal.py +12 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/terminal/point_terminal.py +12 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/terminal/terminal.py +6 -15
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/components.py +21 -45
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/control_file.py +60 -13
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/layer_data.py +22 -2
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/padstacks_data.py +22 -64
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/padstack.py +217 -10
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/siwave.py +1 -2
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/generic/process.py +10 -10
- {pyedb-0.34.3 → pyedb-0.36.0}/LICENSE +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/common/__init__.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/common/nets.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/component_libraries/ansys_components.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/configuration/__init__.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/configuration/cfg_boundaries.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/configuration/cfg_common.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/configuration/cfg_components.py +2 -2
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/configuration/cfg_data.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/configuration/cfg_general.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/configuration/cfg_nets.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/configuration/cfg_operations.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/configuration/cfg_package_definition.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/configuration/cfg_padstacks.py +9 -9
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/configuration/cfg_s_parameter_models.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/configuration/cfg_setup.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/configuration/cfg_spice_models.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/__init__.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/application/Variables.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/application/__init__.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/clr_module.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/__init__.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/__init__.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/connectable.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/__init__.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/component.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/hierarchy_obj.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/model.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/netlist_model.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/s_parameter_model.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/spice_model.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/layout.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/layout_obj.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/primitive/__init__.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/primitive/bondwire.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/primitive/path.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/terminal/__init__.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/terminal/bundle_terminal.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/terminal/edge_terminal.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/terminal/pingroup_terminal.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/voltage_regulator.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/definition/__init__.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/definition/component_def.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/definition/component_model.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/definition/definition_obj.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/definition/definitions.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/definition/package_def.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/dotnet/__init__.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/dotnet/database.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/dotnet/primitive.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/__init__.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/design_options.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/edbvalue.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/hfss_extent_info.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/nets_data.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/ports.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/primitives_data.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/raptor_x_simulation_setup_data.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/simulation_configuration.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/sources.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/utilities.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/variables.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/general.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/geometry/__init__.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/geometry/point_data.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/geometry/polygon_data.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/hfss.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/layout_obj_instance.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/layout_validation.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/materials.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/modeler.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/net_class.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/nets.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/sim_setup_data/__init__.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/__init__.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/adaptive_frequency_data.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/mesh_operation.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/settings.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/sim_setup_info.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/simulation_settings.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/siw_dc_ir_settings.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/sweep_data.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/sim_setup_data/io/__init__.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/sim_setup_data/io/siwave.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/stackup.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/utilities/__init__.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/utilities/heatsink.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/utilities/hfss_simulation_setup.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/utilities/obj_base.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/utilities/simulation_setup.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/utilities/siwave_simulation_setup.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/edb_logger.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/exceptions.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/generic/__init__.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/generic/constants.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/generic/data_handlers.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/generic/design_types.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/generic/filesystem.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/generic/general_methods.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/generic/plot.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/generic/settings.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/__init__.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/bom/__init__.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/bom/bom.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/bom/bom_item.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/bom/characteristics.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/bom/refdes.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/content/__init__.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/content/color.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/content/content.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/content/dictionary_color.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/content/dictionary_fill.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/content/dictionary_line.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/content/entry_color.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/content/entry_line.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/content/fill.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/content/layer_ref.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/content/standard_geometries_dictionary.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/__init__.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/__init__.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/assembly_drawing.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/cad_data.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/component.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/drill.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/feature.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/layer.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/layer_feature.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/logical_net.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/outline.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/package.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/padstack_def.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/padstack_hole_def.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/padstack_instance.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/padstack_pad_def.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/path.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/phy_net.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/pin.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/polygon.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/profile.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/stackup.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/stackup_group.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/stackup_layer.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/step.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_header.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/ecad.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/spec.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/history_record.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/ipc2581.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/ipc2581/logistic_header.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/misc/__init__.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/misc/aedtlib_personalib_install.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/misc/downloads.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/misc/misc.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/misc/pyedb.runtimeconfig.json +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/__init__.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/emc/__init__.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/emc/component_tags.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/emc/net_tags.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/emc/tag_library.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/emc/xml_generic.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/emc_rule_checker_settings.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/xtalk_scan/fd_xtalk_scan_config.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/xtalk_scan/impedance_scan_config.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/xtalk_scan/net.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/xtalk_scan/pins.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/xtalk_scan/scan_config.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/xtalk_scan/td_xtalk_config.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/misc/utilities.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/modeler/geometry_operators.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/siwave.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/siwave_core/icepak.py +0 -0
- {pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/workflow.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: pyedb
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.36.0
|
|
4
4
|
Summary: Higher-Level Pythonic Ansys Electronics Data Base
|
|
5
5
|
Author-email: "ANSYS, Inc." <pyansys.core@ansys.com>
|
|
6
6
|
Maintainer-email: PyEDB developers <simon.vandenbrouck@ansys.com>
|
|
@@ -21,13 +21,13 @@ Requires-Dist: ansys-pythonnet >= 3.1.0rc4
|
|
|
21
21
|
Requires-Dist: dotnetcore2 ==3.1.23;platform_system=='Linux'
|
|
22
22
|
Requires-Dist: numpy>=1.20.0,<3
|
|
23
23
|
Requires-Dist: pandas>=1.1.0,<2.3
|
|
24
|
-
Requires-Dist: pydantic>=2.6.4,<2.
|
|
24
|
+
Requires-Dist: pydantic>=2.6.4,<2.11
|
|
25
25
|
Requires-Dist: Rtree >= 1.2.0
|
|
26
26
|
Requires-Dist: toml == 0.10.2
|
|
27
27
|
Requires-Dist: scikit-rf
|
|
28
28
|
Requires-Dist: ansys-sphinx-theme>=0.10.0,<1.1 ; extra == "doc"
|
|
29
29
|
Requires-Dist: imageio>=2.30.0,<2.37 ; extra == "doc"
|
|
30
|
-
Requires-Dist: ipython>=8.13.0,<8.
|
|
30
|
+
Requires-Dist: ipython>=8.13.0,<8.32 ; extra == "doc"
|
|
31
31
|
Requires-Dist: jupyterlab>=4.0.0,<4.4 ; extra == "doc"
|
|
32
32
|
Requires-Dist: jupytext>=1.16.0,<1.17 ; extra == "doc"
|
|
33
33
|
Requires-Dist: matplotlib>=3.5.0,<3.10 ; extra == "doc"
|
|
@@ -76,7 +76,7 @@ Provides-Extra: tests
|
|
|
76
76
|
|
|
77
77
|
## What is PyEDB?
|
|
78
78
|
|
|
79
|
-
PyEDB is Python client library for processing complex and large layout designs in the
|
|
79
|
+
PyEDB is a Python client library for processing complex and large layout designs in the
|
|
80
80
|
Ansys Electronics Database (EDB) format, which stores information describing designs for
|
|
81
81
|
[Ansys Electronics Desktop](https://www.ansys.com/products/electronics) (AEDT).
|
|
82
82
|
|
|
@@ -102,7 +102,7 @@ HFSS 3D Layout, Icepak, Maxwell, Q3D, and SIwave.
|
|
|
102
102
|
|
|
103
103
|
EDB provides a proprietary database file format (AEDB) for efficient and fast layout design
|
|
104
104
|
handling and processing for building ready-to-solve projects. EDB addresses signal integrity
|
|
105
|
-
(SI), power integrity (PI-DC), and electro-thermal
|
|
105
|
+
(SI), power integrity (PI-DC), and electro-thermal workflows. You can import an AEDB file
|
|
106
106
|
into AEDT to modify the layout, assign materials, and define ports, simulations, and constraints.
|
|
107
107
|
You can then launch any of the Ansys electromagnetic simulators.
|
|
108
108
|
|
|
@@ -112,7 +112,7 @@ memory, it provides the fastest and most efficient way to handle a large and com
|
|
|
112
112
|
|
|
113
113
|
You can also parse an AEDB file from a command line in batch in an Ansys electromagnetic simulator
|
|
114
114
|
like HFSS or SIwave. Thus, you can deploy completely non-graphical flows, from layout
|
|
115
|
-
translation through
|
|
115
|
+
translation through simulation results.
|
|
116
116
|
|
|
117
117
|
Additionally, you can use PyAEDT to import an AEDB file into AEDT to view a project,
|
|
118
118
|
combine 3D designs, or perform simulation postprocessing. EDB also supports 3D component models.
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
|
|
14
14
|
## What is PyEDB?
|
|
15
15
|
|
|
16
|
-
PyEDB is Python client library for processing complex and large layout designs in the
|
|
16
|
+
PyEDB is a Python client library for processing complex and large layout designs in the
|
|
17
17
|
Ansys Electronics Database (EDB) format, which stores information describing designs for
|
|
18
18
|
[Ansys Electronics Desktop](https://www.ansys.com/products/electronics) (AEDT).
|
|
19
19
|
|
|
@@ -39,7 +39,7 @@ HFSS 3D Layout, Icepak, Maxwell, Q3D, and SIwave.
|
|
|
39
39
|
|
|
40
40
|
EDB provides a proprietary database file format (AEDB) for efficient and fast layout design
|
|
41
41
|
handling and processing for building ready-to-solve projects. EDB addresses signal integrity
|
|
42
|
-
(SI), power integrity (PI-DC), and electro-thermal
|
|
42
|
+
(SI), power integrity (PI-DC), and electro-thermal workflows. You can import an AEDB file
|
|
43
43
|
into AEDT to modify the layout, assign materials, and define ports, simulations, and constraints.
|
|
44
44
|
You can then launch any of the Ansys electromagnetic simulators.
|
|
45
45
|
|
|
@@ -49,7 +49,7 @@ memory, it provides the fastest and most efficient way to handle a large and com
|
|
|
49
49
|
|
|
50
50
|
You can also parse an AEDB file from a command line in batch in an Ansys electromagnetic simulator
|
|
51
51
|
like HFSS or SIwave. Thus, you can deploy completely non-graphical flows, from layout
|
|
52
|
-
translation through
|
|
52
|
+
translation through simulation results.
|
|
53
53
|
|
|
54
54
|
Additionally, you can use PyAEDT to import an AEDB file into AEDT to view a project,
|
|
55
55
|
combine 3D designs, or perform simulation postprocessing. EDB also supports 3D component models.
|
|
@@ -31,7 +31,7 @@ dependencies = [
|
|
|
31
31
|
"dotnetcore2 ==3.1.23;platform_system=='Linux'",
|
|
32
32
|
"numpy>=1.20.0,<3",
|
|
33
33
|
"pandas>=1.1.0,<2.3",
|
|
34
|
-
"pydantic>=2.6.4,<2.
|
|
34
|
+
"pydantic>=2.6.4,<2.11",
|
|
35
35
|
"Rtree >= 1.2.0",
|
|
36
36
|
"toml == 0.10.2",
|
|
37
37
|
"scikit-rf"
|
|
@@ -50,7 +50,7 @@ tests = [
|
|
|
50
50
|
doc = [
|
|
51
51
|
"ansys-sphinx-theme>=0.10.0,<1.1",
|
|
52
52
|
"imageio>=2.30.0,<2.37",
|
|
53
|
-
"ipython>=8.13.0,<8.
|
|
53
|
+
"ipython>=8.13.0,<8.32",
|
|
54
54
|
"jupyterlab>=4.0.0,<4.4",
|
|
55
55
|
"jupytext>=1.16.0,<1.17",
|
|
56
56
|
"matplotlib>=3.5.0,<3.10",
|
|
@@ -67,17 +67,16 @@ class CfgPinGroup(CfgBase):
|
|
|
67
67
|
def create(self):
|
|
68
68
|
"""Apply pin group on layout."""
|
|
69
69
|
if self.pins:
|
|
70
|
-
self.
|
|
70
|
+
pins = self.pins if isinstance(self.pins, list) else [self.pins]
|
|
71
|
+
self._pedb.siwave.create_pin_group(self.reference_designator, pins, self.name)
|
|
71
72
|
elif self.net:
|
|
72
|
-
if self.
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
raise f"Component not found for creating pin group {self.name}."
|
|
76
|
-
pins = [p for p, obj in comp.pins.items() if obj.net_name in self.net]
|
|
73
|
+
nets = self.net if isinstance(self.net, list) else [self.net]
|
|
74
|
+
comp = self._pedb.components.instances[self.reference_designator]
|
|
75
|
+
pins = [p for p, obj in comp.pins.items() if obj.net_name in nets]
|
|
77
76
|
if not self._pedb.siwave.create_pin_group(self.reference_designator, pins, self.name):
|
|
78
|
-
|
|
77
|
+
raise RuntimeError(f"Failed to create pin group {self.name}")
|
|
79
78
|
else:
|
|
80
|
-
|
|
79
|
+
raise RuntimeError(f"No net and pins defined for defining pin group {self.name}")
|
|
81
80
|
|
|
82
81
|
def export_properties(self):
|
|
83
82
|
if self.pins:
|
|
@@ -46,6 +46,7 @@ class CfgCoordianteTerminalInfo(CfgTerminalInfo):
|
|
|
46
46
|
self.point_x = self.value["point"][0]
|
|
47
47
|
self.point_y = self.value["point"][1]
|
|
48
48
|
self.net = self.value["net"]
|
|
49
|
+
self.contact_radius = self.value.get("contact_radius", None)
|
|
49
50
|
|
|
50
51
|
def export_properties(self):
|
|
51
52
|
return {"coordinates": {"layer": self.layer, "point": [self.point_x, self.point_y], "net": self.net}}
|
|
@@ -244,6 +245,9 @@ class CfgCircuitElement(CfgBase):
|
|
|
244
245
|
point = [self.positive_terminal_info.point_x, self.positive_terminal_info.point_y]
|
|
245
246
|
net_name = self.positive_terminal_info.net
|
|
246
247
|
pos_coor_terminal[self.name] = self._pedb.get_point_terminal(self.name, net_name, point, layer)
|
|
248
|
+
if self.positive_terminal_info.contact_radius:
|
|
249
|
+
pos_coor_terminal[self.name].contact_radius = self.positive_terminal_info.contact_radius
|
|
250
|
+
|
|
247
251
|
elif pos_type == "pin_group":
|
|
248
252
|
if self.distributed:
|
|
249
253
|
pins = self._get_pins(pos_type, pos_value)
|
|
@@ -265,7 +269,7 @@ class CfgCircuitElement(CfgBase):
|
|
|
265
269
|
pins = {pos_value: self._pedb.components.instances[self.reference_designator].pins[pos_value]}
|
|
266
270
|
pos_objs.update(pins)
|
|
267
271
|
else:
|
|
268
|
-
raise f"Wrong positive terminal type {pos_type}"
|
|
272
|
+
raise Exception(f"Wrong positive terminal type {pos_type}.")
|
|
269
273
|
|
|
270
274
|
self.pos_terminals = {i: j.create_terminal(i) for i, j in pos_objs.items()}
|
|
271
275
|
self.pos_terminals.update(pos_coor_terminal)
|
|
@@ -276,7 +280,7 @@ class CfgCircuitElement(CfgBase):
|
|
|
276
280
|
|
|
277
281
|
if neg_type == "coordinates":
|
|
278
282
|
layer = self.negative_terminal_info.layer
|
|
279
|
-
point = [self.negative_terminal_info.point_x, self.
|
|
283
|
+
point = [self.negative_terminal_info.point_x, self.negative_terminal_info.point_y]
|
|
280
284
|
net_name = self.negative_terminal_info.net
|
|
281
285
|
self.neg_terminal = self._pedb.get_point_terminal(self.name + "_ref", net_name, point, layer)
|
|
282
286
|
elif neg_type == "nearest_pin":
|
|
@@ -297,9 +301,12 @@ class CfgCircuitElement(CfgBase):
|
|
|
297
301
|
# create pin group
|
|
298
302
|
neg_obj = self._create_pin_group(pins, True)
|
|
299
303
|
elif neg_type == "pin":
|
|
300
|
-
|
|
304
|
+
terminal_name = f"{self.reference_designator}_{neg_value}"
|
|
305
|
+
neg_obj = {
|
|
306
|
+
terminal_name: self._pedb.components.instances[self.reference_designator].pins[neg_value]
|
|
307
|
+
}
|
|
301
308
|
else:
|
|
302
|
-
raise f"Wrong negative terminal type {neg_type}"
|
|
309
|
+
raise Exception(f"Wrong negative terminal type {neg_type}.")
|
|
303
310
|
self.neg_terminal = [
|
|
304
311
|
j.create_terminal(i) if not j.terminal else j.terminal for i, j in neg_obj.items()
|
|
305
312
|
][0]
|
|
@@ -375,6 +382,7 @@ class CfgSource(CfgCircuitElement):
|
|
|
375
382
|
super().__init__(pedb, **kwargs)
|
|
376
383
|
|
|
377
384
|
self.magnitude = kwargs.get("magnitude", 0.001)
|
|
385
|
+
self.equipotential = kwargs.get("equipotential", False)
|
|
378
386
|
|
|
379
387
|
def set_parameters_to_edb(self):
|
|
380
388
|
"""Create sources."""
|
|
@@ -394,6 +402,33 @@ class CfgSource(CfgCircuitElement):
|
|
|
394
402
|
elem.name = f"{self.name}_{elem.name}"
|
|
395
403
|
elem.magnitude = self.magnitude / self._elem_num
|
|
396
404
|
circuit_elements.append(elem)
|
|
405
|
+
for terminal in circuit_elements:
|
|
406
|
+
if self.equipotential:
|
|
407
|
+
terms = [terminal, terminal.ref_terminal] if terminal.ref_terminal else [terminal]
|
|
408
|
+
for t in terms:
|
|
409
|
+
pads = []
|
|
410
|
+
if t.terminal_type == "PadstackInstanceTerminal":
|
|
411
|
+
pads.append(t.reference_object)
|
|
412
|
+
t._edb_object.dcir_equipotential_region = True
|
|
413
|
+
elif t.terminal_type == "PinGroupTerminal":
|
|
414
|
+
name = t._edb_object.GetPinGroup().GetName()
|
|
415
|
+
pg = self._pedb.siwave.pin_groups[name]
|
|
416
|
+
pads.extend([i for _, i in pg.pins.items()])
|
|
417
|
+
elif t.terminal_type == "PointTerminal":
|
|
418
|
+
temp = [i for i in self._pedb.layout.terminals if i.name == t.name][0]
|
|
419
|
+
if not temp.is_reference_terminal:
|
|
420
|
+
radius = self.positive_terminal_info.contact_radius
|
|
421
|
+
else:
|
|
422
|
+
radius = self.negative_terminal_info.contact_radius
|
|
423
|
+
if radius is not None:
|
|
424
|
+
prim = self._pedb.modeler.create_circle(
|
|
425
|
+
temp.layer.name, temp.location[0], temp.location[1], radius, temp.net_name
|
|
426
|
+
)
|
|
427
|
+
prim.dcir_equipotential_region = True
|
|
428
|
+
|
|
429
|
+
for i in pads:
|
|
430
|
+
i._set_equipotential()
|
|
431
|
+
|
|
397
432
|
return circuit_elements
|
|
398
433
|
|
|
399
434
|
def export_properties(self):
|
|
@@ -134,13 +134,17 @@ class Configuration:
|
|
|
134
134
|
|
|
135
135
|
# Configure stackup
|
|
136
136
|
if kwargs.get("fix_padstack_def"):
|
|
137
|
+
from pyedb.configuration.cfg_padstacks import CfgPadstackDefinition
|
|
138
|
+
|
|
137
139
|
pedb_defs = self._pedb.padstacks.definitions
|
|
138
|
-
temp =
|
|
139
|
-
for
|
|
140
|
-
|
|
140
|
+
temp = []
|
|
141
|
+
for _, pdef in pedb_defs.items():
|
|
142
|
+
cfg_def = CfgPadstackDefinition(self._pedb, pdef)
|
|
143
|
+
cfg_def.retrieve_parameters_from_edb()
|
|
144
|
+
temp.append(cfg_def)
|
|
141
145
|
self.cfg_data.stackup.apply()
|
|
142
|
-
for
|
|
143
|
-
|
|
146
|
+
for cfg_pdef in temp:
|
|
147
|
+
cfg_pdef.set_parameters_to_edb()
|
|
144
148
|
else:
|
|
145
149
|
self.cfg_data.stackup.apply()
|
|
146
150
|
|
|
@@ -603,7 +603,7 @@ class Edb(Database):
|
|
|
603
603
|
def import_layout_pcb(
|
|
604
604
|
self,
|
|
605
605
|
input_file,
|
|
606
|
-
working_dir,
|
|
606
|
+
working_dir="",
|
|
607
607
|
anstranslator_full_path="",
|
|
608
608
|
use_ppe=False,
|
|
609
609
|
control_file=None,
|
|
@@ -616,7 +616,7 @@ class Edb(Database):
|
|
|
616
616
|
----------
|
|
617
617
|
input_file : str
|
|
618
618
|
Full path to the board file.
|
|
619
|
-
working_dir : str
|
|
619
|
+
working_dir : str, optional
|
|
620
620
|
Directory in which to create the ``aedb`` folder. The name given to the AEDB file
|
|
621
621
|
is the same as the name of the board file.
|
|
622
622
|
anstranslator_full_path : str, optional
|
|
@@ -1510,6 +1510,13 @@ class Edb(Database):
|
|
|
1510
1510
|
else:
|
|
1511
1511
|
return False
|
|
1512
1512
|
else:
|
|
1513
|
+
if anstranslator_full_path and os.path.exists(anstranslator_full_path):
|
|
1514
|
+
path = anstranslator_full_path
|
|
1515
|
+
else:
|
|
1516
|
+
path = os.path.join(self.base_path, "anstranslator")
|
|
1517
|
+
if is_windows:
|
|
1518
|
+
path += ".exe"
|
|
1519
|
+
|
|
1513
1520
|
temp_map_file = os.path.splitext(inputGDS)[0] + ".map"
|
|
1514
1521
|
temp_layermap_file = os.path.splitext(inputGDS)[0] + ".layermap"
|
|
1515
1522
|
|
|
@@ -1529,10 +1536,10 @@ class Edb(Database):
|
|
|
1529
1536
|
else:
|
|
1530
1537
|
self.logger.error("Unable to define control file.")
|
|
1531
1538
|
|
|
1532
|
-
command = [
|
|
1539
|
+
command = [path, inputGDS, f'-g="{map_file}"', f'-c="{control_file}"']
|
|
1533
1540
|
else:
|
|
1534
1541
|
command = [
|
|
1535
|
-
|
|
1542
|
+
path,
|
|
1536
1543
|
inputGDS,
|
|
1537
1544
|
f'-o="{control_file_temp}"' f'-t="{tech_file}"',
|
|
1538
1545
|
f'-g="{map_file}"',
|
|
@@ -4564,6 +4571,7 @@ class Edb(Database):
|
|
|
4564
4571
|
port_poly = cloned_edb.modeler.create_polygon(
|
|
4565
4572
|
main_shape=void_info[0].polygon_data._edb_object, layer_name="ref", net_name="GND"
|
|
4566
4573
|
)
|
|
4574
|
+
port_poly.scale(1.1)
|
|
4567
4575
|
pec_poly = cloned_edb.modeler.create_polygon(
|
|
4568
4576
|
main_shape=port_poly.polygon_data._edb_object, layer_name="port_pec", net_name="GND"
|
|
4569
4577
|
)
|
|
@@ -66,7 +66,7 @@ class PinPair(object): # pragma: no cover
|
|
|
66
66
|
@resistance.setter
|
|
67
67
|
def resistance(self, value):
|
|
68
68
|
self._pin_pair_rlc.R = value
|
|
69
|
-
self._set_comp_prop(
|
|
69
|
+
self._set_comp_prop() # pragma: no cover
|
|
70
70
|
|
|
71
71
|
@property
|
|
72
72
|
def inductance(self):
|
|
@@ -75,7 +75,7 @@ class PinPair(object): # pragma: no cover
|
|
|
75
75
|
@inductance.setter
|
|
76
76
|
def inductance(self, value):
|
|
77
77
|
self._pin_pair_rlc.L = value
|
|
78
|
-
self._set_comp_prop(
|
|
78
|
+
self._set_comp_prop() # pragma: no cover
|
|
79
79
|
|
|
80
80
|
@property
|
|
81
81
|
def capacitance(self):
|
|
@@ -84,7 +84,7 @@ class PinPair(object): # pragma: no cover
|
|
|
84
84
|
@capacitance.setter
|
|
85
85
|
def capacitance(self, value):
|
|
86
86
|
self._pin_pair_rlc.C = value
|
|
87
|
-
self._set_comp_prop(
|
|
87
|
+
self._set_comp_prop() # pragma: no cover
|
|
88
88
|
|
|
89
89
|
@property
|
|
90
90
|
def rlc_values(self): # pragma: no cover
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
20
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
21
|
# SOFTWARE.
|
|
22
|
+
import re
|
|
22
23
|
|
|
23
24
|
from pyedb.dotnet.edb_core.cell.connectable import Connectable
|
|
24
25
|
from pyedb.dotnet.edb_core.general import convert_py_list_to_net_list
|
|
@@ -787,3 +788,66 @@ class Primitive(Connectable):
|
|
|
787
788
|
self.polygon_data = polygon_data
|
|
788
789
|
return True
|
|
789
790
|
return False
|
|
791
|
+
|
|
792
|
+
@property
|
|
793
|
+
def _em_properties(self):
|
|
794
|
+
"""Get EM properties."""
|
|
795
|
+
default = (
|
|
796
|
+
r"$begin 'EM properties'\n"
|
|
797
|
+
r"\tType('Mesh')\n"
|
|
798
|
+
r"\tDataId='EM properties1'\n"
|
|
799
|
+
r"\t$begin 'Properties'\n"
|
|
800
|
+
r"\t\tGeneral=''\n"
|
|
801
|
+
r"\t\tModeled='true'\n"
|
|
802
|
+
r"\t\tUnion='true'\n"
|
|
803
|
+
r"\t\t'Use Precedence'='false'\n"
|
|
804
|
+
r"\t\t'Precedence Value'='1'\n"
|
|
805
|
+
r"\t\tPlanarEM=''\n"
|
|
806
|
+
r"\t\tRefined='true'\n"
|
|
807
|
+
r"\t\tRefineFactor='1'\n"
|
|
808
|
+
r"\t\tNoEdgeMesh='false'\n"
|
|
809
|
+
r"\t\tHFSS=''\n"
|
|
810
|
+
r"\t\t'Solve Inside'='false'\n"
|
|
811
|
+
r"\t\tSIwave=''\n"
|
|
812
|
+
r"\t\t'DCIR Equipotential Region'='false'\n"
|
|
813
|
+
r"\t$end 'Properties'\n"
|
|
814
|
+
r"$end 'EM properties'\n"
|
|
815
|
+
)
|
|
816
|
+
|
|
817
|
+
pid = self._pedb.edb_api.ProductId.Designer
|
|
818
|
+
_, p = self._edb_object.GetProductProperty(pid, 18, "")
|
|
819
|
+
if p:
|
|
820
|
+
return p
|
|
821
|
+
else:
|
|
822
|
+
return default
|
|
823
|
+
|
|
824
|
+
@_em_properties.setter
|
|
825
|
+
def _em_properties(self, em_prop):
|
|
826
|
+
"""Set EM properties"""
|
|
827
|
+
pid = self._pedb.edb_api.ProductId.Designer
|
|
828
|
+
self._edb_object.SetProductProperty(pid, 18, em_prop)
|
|
829
|
+
|
|
830
|
+
@property
|
|
831
|
+
def dcir_equipotential_region(self):
|
|
832
|
+
"""Check whether dcir equipotential region is enabled.
|
|
833
|
+
|
|
834
|
+
Returns
|
|
835
|
+
-------
|
|
836
|
+
bool
|
|
837
|
+
"""
|
|
838
|
+
pattern = r"'DCIR Equipotential Region'='([^']+)'"
|
|
839
|
+
em_pp = self._em_properties
|
|
840
|
+
result = re.search(pattern, em_pp).group(1)
|
|
841
|
+
if result == "true":
|
|
842
|
+
return True
|
|
843
|
+
else:
|
|
844
|
+
return False
|
|
845
|
+
|
|
846
|
+
@dcir_equipotential_region.setter
|
|
847
|
+
def dcir_equipotential_region(self, value):
|
|
848
|
+
"""Set dcir equipotential region."""
|
|
849
|
+
pp = r"'DCIR Equipotential Region'='true'" if value else r"'DCIR Equipotential Region'='false'"
|
|
850
|
+
em_pp = self._em_properties
|
|
851
|
+
pattern = r"'DCIR Equipotential Region'='([^']+)'"
|
|
852
|
+
new_em_pp = re.sub(pattern, pp, em_pp)
|
|
853
|
+
self._em_properties = new_em_pp
|
{pyedb-0.34.3 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/terminal/padstack_instance_terminal.py
RENAMED
|
@@ -101,3 +101,15 @@ class PadstackInstanceTerminal(Terminal):
|
|
|
101
101
|
def padstack_instance(self):
|
|
102
102
|
p_inst, _ = self._get_parameters()
|
|
103
103
|
return self._pedb.layout.find_object_by_id(p_inst.GetId())
|
|
104
|
+
|
|
105
|
+
@property
|
|
106
|
+
def layer(self):
|
|
107
|
+
"""Get layer of the terminal."""
|
|
108
|
+
_, _, layer = self._edb_object.GetParameters()
|
|
109
|
+
return self._pedb.stackup.all_layers[layer.GetName()]
|
|
110
|
+
|
|
111
|
+
@layer.setter
|
|
112
|
+
def layer(self, value):
|
|
113
|
+
layer = self._pedb.stackup.layers[value]._edb_layer
|
|
114
|
+
point_data = self._pedb.point_data(*self.location)
|
|
115
|
+
self._edb_object.SetParameters(point_data, layer)
|
|
@@ -66,3 +66,15 @@ class PointTerminal(Terminal):
|
|
|
66
66
|
raise Exception(msg)
|
|
67
67
|
else:
|
|
68
68
|
return terminal
|
|
69
|
+
|
|
70
|
+
@property
|
|
71
|
+
def layer(self):
|
|
72
|
+
"""Get layer of the terminal."""
|
|
73
|
+
_, _, layer = self._edb_object.GetParameters()
|
|
74
|
+
return self._pedb.stackup.all_layers[layer.GetName()]
|
|
75
|
+
|
|
76
|
+
@layer.setter
|
|
77
|
+
def layer(self, value):
|
|
78
|
+
layer = self._pedb.stackup.layers[value]._edb_layer
|
|
79
|
+
point_data = self._pedb.point_data(*self.location)
|
|
80
|
+
self._edb_object.SetParameters(point_data, layer)
|
|
@@ -105,25 +105,16 @@ class Terminal(Connectable):
|
|
|
105
105
|
@property
|
|
106
106
|
def layer(self):
|
|
107
107
|
"""Get layer of the terminal."""
|
|
108
|
-
|
|
109
|
-
layer = list(self._pedb.stackup.layers.values())[0]._edb_layer
|
|
110
|
-
if self._edb_object.GetParameters(point_data, layer):
|
|
111
|
-
return self._pedb.stackup.all_layers[layer.GetName()]
|
|
112
|
-
else:
|
|
113
|
-
self._pedb.logger.warning(f"No pad parameters found for terminal {self.name}")
|
|
114
|
-
|
|
115
|
-
@layer.setter
|
|
116
|
-
def layer(self, value):
|
|
117
|
-
layer = self._pedb.stackup.layers[value]._edb_layer
|
|
118
|
-
point_data = self._pedb.point_data(*self.location)
|
|
119
|
-
self._edb_object.SetParameters(point_data, layer)
|
|
108
|
+
return self._pedb.logger.error("Cannot determine terminal layer")
|
|
120
109
|
|
|
121
110
|
@property
|
|
122
111
|
def location(self):
|
|
123
112
|
"""Location of the terminal."""
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
113
|
+
try:
|
|
114
|
+
_, point_data, _ = self._edb_object.GetParameters()
|
|
115
|
+
return [point_data.X.ToDouble(), point_data.Y.ToDouble()]
|
|
116
|
+
except:
|
|
117
|
+
self._pedb.logger.error("Cannot determine terminal location")
|
|
127
118
|
|
|
128
119
|
@location.setter
|
|
129
120
|
def location(self, value):
|
|
@@ -111,16 +111,9 @@ class Components(object):
|
|
|
111
111
|
|
|
112
112
|
def __init__(self, p_edb):
|
|
113
113
|
self._pedb = p_edb
|
|
114
|
-
self.
|
|
115
|
-
self._res = {}
|
|
116
|
-
self._cap = {}
|
|
117
|
-
self._ind = {}
|
|
118
|
-
self._ios = {}
|
|
119
|
-
self._ics = {}
|
|
120
|
-
self._others = {}
|
|
114
|
+
self.refresh_components()
|
|
121
115
|
self._pins = {}
|
|
122
116
|
self._comps_by_part = {}
|
|
123
|
-
self._init_parts()
|
|
124
117
|
self._padstack = EdbPadstacks(self._pedb)
|
|
125
118
|
|
|
126
119
|
@property
|
|
@@ -132,16 +125,6 @@ class Components(object):
|
|
|
132
125
|
def _edb(self):
|
|
133
126
|
return self._pedb.edb_api
|
|
134
127
|
|
|
135
|
-
def _init_parts(self):
|
|
136
|
-
a = self.instances
|
|
137
|
-
a = self.resistors
|
|
138
|
-
a = self.ICs
|
|
139
|
-
a = self.Others
|
|
140
|
-
a = self.inductors
|
|
141
|
-
a = self.IOs
|
|
142
|
-
a = self.components_by_partname
|
|
143
|
-
return True
|
|
144
|
-
|
|
145
128
|
def _get_edb_value(self, value):
|
|
146
129
|
return self._pedb.edb_value(value)
|
|
147
130
|
|
|
@@ -205,8 +188,6 @@ class Components(object):
|
|
|
205
188
|
>>> edbapp.components.instances
|
|
206
189
|
|
|
207
190
|
"""
|
|
208
|
-
if not self._cmp:
|
|
209
|
-
self.refresh_components()
|
|
210
191
|
return self._cmp
|
|
211
192
|
|
|
212
193
|
@property
|
|
@@ -310,10 +291,29 @@ class Components(object):
|
|
|
310
291
|
|
|
311
292
|
def refresh_components(self):
|
|
312
293
|
"""Refresh the component dictionary."""
|
|
313
|
-
# self._logger.info("Refreshing the Components dictionary.")
|
|
314
294
|
self._cmp = {}
|
|
295
|
+
self._res = {}
|
|
296
|
+
self._ind = {}
|
|
297
|
+
self._cap = {}
|
|
298
|
+
self._ics = {}
|
|
299
|
+
self._ios = {}
|
|
300
|
+
self._others = {}
|
|
315
301
|
for i in self._pedb.layout.groups:
|
|
316
302
|
self._cmp[i.name] = i
|
|
303
|
+
if i.type == "Resistor":
|
|
304
|
+
self._res[i.name] = i
|
|
305
|
+
elif i.type == "Capacitor":
|
|
306
|
+
self._cap[i.name] = i
|
|
307
|
+
elif i.type == "Inductor":
|
|
308
|
+
self._ind[i.name] = i
|
|
309
|
+
elif i.type == "IC":
|
|
310
|
+
self._ics[i.name] = i
|
|
311
|
+
elif i.type == "IO":
|
|
312
|
+
self._ios[i.name] = i
|
|
313
|
+
elif i.type == "Other":
|
|
314
|
+
self._others[i.name] = i
|
|
315
|
+
else:
|
|
316
|
+
self._logger.warning(f"Unknown component type {i.name} found while refreshing components, will ignore")
|
|
317
317
|
return True
|
|
318
318
|
|
|
319
319
|
@property
|
|
@@ -332,10 +332,6 @@ class Components(object):
|
|
|
332
332
|
>>> edbapp = Edb("myaedbfolder")
|
|
333
333
|
>>> edbapp.components.resistors
|
|
334
334
|
"""
|
|
335
|
-
self._res = {}
|
|
336
|
-
for el, val in self.instances.items():
|
|
337
|
-
if val.type == "Resistor":
|
|
338
|
-
self._res[el] = val
|
|
339
335
|
return self._res
|
|
340
336
|
|
|
341
337
|
@property
|
|
@@ -354,10 +350,6 @@ class Components(object):
|
|
|
354
350
|
>>> edbapp = Edb("myaedbfolder")
|
|
355
351
|
>>> edbapp.components.capacitors
|
|
356
352
|
"""
|
|
357
|
-
self._cap = {}
|
|
358
|
-
for el, val in self.instances.items():
|
|
359
|
-
if val.type == "Capacitor":
|
|
360
|
-
self._cap[el] = val
|
|
361
353
|
return self._cap
|
|
362
354
|
|
|
363
355
|
@property
|
|
@@ -377,10 +369,6 @@ class Components(object):
|
|
|
377
369
|
>>> edbapp.components.inductors
|
|
378
370
|
|
|
379
371
|
"""
|
|
380
|
-
self._ind = {}
|
|
381
|
-
for el, val in self.instances.items():
|
|
382
|
-
if val.type == "Inductor":
|
|
383
|
-
self._ind[el] = val
|
|
384
372
|
return self._ind
|
|
385
373
|
|
|
386
374
|
@property
|
|
@@ -400,10 +388,6 @@ class Components(object):
|
|
|
400
388
|
>>> edbapp.components.ICs
|
|
401
389
|
|
|
402
390
|
"""
|
|
403
|
-
self._ics = {}
|
|
404
|
-
for el, val in self.instances.items():
|
|
405
|
-
if val.type == "IC":
|
|
406
|
-
self._ics[el] = val
|
|
407
391
|
return self._ics
|
|
408
392
|
|
|
409
393
|
@property
|
|
@@ -423,10 +407,6 @@ class Components(object):
|
|
|
423
407
|
>>> edbapp.components.IOs
|
|
424
408
|
|
|
425
409
|
"""
|
|
426
|
-
self._ios = {}
|
|
427
|
-
for el, val in self.instances.items():
|
|
428
|
-
if val.type == "IO":
|
|
429
|
-
self._ios[el] = val
|
|
430
410
|
return self._ios
|
|
431
411
|
|
|
432
412
|
@property
|
|
@@ -446,10 +426,6 @@ class Components(object):
|
|
|
446
426
|
>>> edbapp.components.others
|
|
447
427
|
|
|
448
428
|
"""
|
|
449
|
-
self._others = {}
|
|
450
|
-
for el, val in self.instances.items():
|
|
451
|
-
if val.type == "Other":
|
|
452
|
-
self._others[el] = val
|
|
453
429
|
return self._others
|
|
454
430
|
|
|
455
431
|
@property
|