pyedb 0.35.0__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.35.0 → pyedb-0.36.0}/PKG-INFO +1 -1
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/__init__.py +1 -1
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/cfg_ports_sources.py +33 -1
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb.py +11 -4
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/primitive/primitive.py +64 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/control_file.py +60 -13
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/padstacks_data.py +22 -64
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/padstack.py +25 -6
- {pyedb-0.35.0 → pyedb-0.36.0}/LICENSE +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/README.md +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/pyproject.toml +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/common/__init__.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/common/nets.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/component_libraries/ansys_components.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/__init__.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/cfg_boundaries.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/cfg_common.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/cfg_components.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/cfg_data.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/cfg_general.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/cfg_modeler.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/cfg_nets.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/cfg_operations.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/cfg_package_definition.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/cfg_padstacks.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/cfg_pin_groups.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/cfg_s_parameter_models.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/cfg_setup.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/cfg_spice_models.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/cfg_stackup.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/configuration.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/__init__.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/application/Variables.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/application/__init__.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/clr_module.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/__init__.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/__init__.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/connectable.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/__init__.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/component.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/hierarchy_obj.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/model.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/netlist_model.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/pin_pair_model.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/s_parameter_model.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/spice_model.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/layout.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/layout_obj.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/primitive/__init__.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/primitive/bondwire.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/primitive/path.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/terminal/__init__.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/terminal/bundle_terminal.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/terminal/edge_terminal.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/terminal/padstack_instance_terminal.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/terminal/pingroup_terminal.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/terminal/point_terminal.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/terminal/terminal.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/voltage_regulator.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/components.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/definition/__init__.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/definition/component_def.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/definition/component_model.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/definition/definition_obj.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/definition/definitions.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/definition/package_def.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/dotnet/__init__.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/dotnet/database.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/dotnet/primitive.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/__init__.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/design_options.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/edbvalue.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/hfss_extent_info.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/layer_data.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/nets_data.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/ports.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/primitives_data.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/raptor_x_simulation_setup_data.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/simulation_configuration.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/sources.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/utilities.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/variables.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/general.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/geometry/__init__.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/geometry/point_data.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/geometry/polygon_data.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/hfss.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/layout_obj_instance.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/layout_validation.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/materials.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/modeler.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/net_class.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/nets.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/sim_setup_data/__init__.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/__init__.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/adaptive_frequency_data.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/mesh_operation.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/settings.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/sim_setup_info.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/simulation_settings.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/siw_dc_ir_settings.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/sweep_data.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/sim_setup_data/io/__init__.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/sim_setup_data/io/siwave.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/siwave.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/stackup.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/utilities/__init__.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/utilities/heatsink.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/utilities/hfss_simulation_setup.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/utilities/obj_base.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/utilities/simulation_setup.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/utilities/siwave_simulation_setup.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/edb_logger.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/exceptions.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/generic/__init__.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/generic/constants.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/generic/data_handlers.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/generic/design_types.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/generic/filesystem.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/generic/general_methods.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/generic/plot.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/generic/process.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/generic/settings.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/__init__.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/bom/__init__.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/bom/bom.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/bom/bom_item.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/bom/characteristics.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/bom/refdes.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/content/__init__.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/content/color.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/content/content.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/content/dictionary_color.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/content/dictionary_fill.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/content/dictionary_line.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/content/entry_color.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/content/entry_line.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/content/fill.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/content/layer_ref.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/content/standard_geometries_dictionary.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/__init__.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/__init__.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/assembly_drawing.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/cad_data.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/component.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/drill.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/feature.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/layer.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/layer_feature.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/logical_net.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/outline.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/package.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/padstack_def.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/padstack_hole_def.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/padstack_instance.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/padstack_pad_def.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/path.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/phy_net.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/pin.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/polygon.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/profile.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/stackup.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/stackup_group.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/stackup_layer.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/step.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_header.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/ecad.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/spec.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/history_record.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ipc2581.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/logistic_header.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/__init__.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/aedtlib_personalib_install.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/downloads.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/misc.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/pyedb.runtimeconfig.json +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/__init__.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/emc/__init__.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/emc/component_tags.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/emc/net_tags.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/emc/tag_library.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/emc/xml_generic.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/emc_rule_checker_settings.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/xtalk_scan/fd_xtalk_scan_config.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/xtalk_scan/impedance_scan_config.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/xtalk_scan/net.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/xtalk_scan/pins.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/xtalk_scan/scan_config.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/xtalk_scan/td_xtalk_config.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/utilities.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/modeler/geometry_operators.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/siwave.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/siwave_core/icepak.py +0 -0
- {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/workflow.py +0 -0
|
@@ -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)
|
|
@@ -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":
|
|
@@ -378,6 +382,7 @@ class CfgSource(CfgCircuitElement):
|
|
|
378
382
|
super().__init__(pedb, **kwargs)
|
|
379
383
|
|
|
380
384
|
self.magnitude = kwargs.get("magnitude", 0.001)
|
|
385
|
+
self.equipotential = kwargs.get("equipotential", False)
|
|
381
386
|
|
|
382
387
|
def set_parameters_to_edb(self):
|
|
383
388
|
"""Create sources."""
|
|
@@ -397,6 +402,33 @@ class CfgSource(CfgCircuitElement):
|
|
|
397
402
|
elem.name = f"{self.name}_{elem.name}"
|
|
398
403
|
elem.magnitude = self.magnitude / self._elem_num
|
|
399
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
|
+
|
|
400
432
|
return circuit_elements
|
|
401
433
|
|
|
402
434
|
def export_properties(self):
|
|
@@ -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}"',
|
|
@@ -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
|
|
@@ -25,6 +25,7 @@ import os
|
|
|
25
25
|
import re
|
|
26
26
|
import subprocess
|
|
27
27
|
import sys
|
|
28
|
+
import xml
|
|
28
29
|
|
|
29
30
|
from pyedb.edb_logger import pyedb_logger
|
|
30
31
|
from pyedb.generic.general_methods import ET, env_path, env_value, is_linux
|
|
@@ -964,14 +965,14 @@ class ControlFileMeshOp:
|
|
|
964
965
|
class ControlFileSetup:
|
|
965
966
|
"""Setup Class."""
|
|
966
967
|
|
|
967
|
-
def __init__(self, name):
|
|
968
|
+
def __init__(self, name, adapt_freq="1GHz", maxdelta=0.02, maxpasses=10):
|
|
968
969
|
self.name = name
|
|
969
970
|
self.enabled = True
|
|
970
971
|
self.save_fields = False
|
|
971
972
|
self.save_rad_fields = False
|
|
972
|
-
self.frequency =
|
|
973
|
-
self.maxpasses =
|
|
974
|
-
self.max_delta =
|
|
973
|
+
self.frequency = adapt_freq
|
|
974
|
+
self.maxpasses = maxpasses
|
|
975
|
+
self.max_delta = maxdelta
|
|
975
976
|
self.union_polygons = True
|
|
976
977
|
self.small_voids_area = 0
|
|
977
978
|
self.mode_type = "IC"
|
|
@@ -1082,22 +1083,25 @@ class ControlFileSetups:
|
|
|
1082
1083
|
def __init__(self):
|
|
1083
1084
|
self.setups = []
|
|
1084
1085
|
|
|
1085
|
-
def add_setup(self, name,
|
|
1086
|
+
def add_setup(self, name, adapt_freq, maxdelta, maxpasses):
|
|
1086
1087
|
"""Add a new setup
|
|
1087
1088
|
|
|
1088
1089
|
Parameters
|
|
1089
1090
|
----------
|
|
1090
1091
|
name : str
|
|
1091
|
-
Setup
|
|
1092
|
-
|
|
1092
|
+
Setup Name.
|
|
1093
|
+
adapt_freq : str, optional
|
|
1093
1094
|
Setup Frequency.
|
|
1095
|
+
maxdelta : float, optional
|
|
1096
|
+
Maximum Delta.
|
|
1097
|
+
maxpasses : int, optional
|
|
1098
|
+
Maximum Number of Passes.
|
|
1094
1099
|
|
|
1095
1100
|
Returns
|
|
1096
1101
|
-------
|
|
1097
1102
|
:class:`pyedb.dotnet.edb_core.edb_data.control_file.ControlFileSetup`
|
|
1098
1103
|
"""
|
|
1099
|
-
setup = ControlFileSetup(name)
|
|
1100
|
-
setup.frequency = frequency
|
|
1104
|
+
setup = ControlFileSetup(name, adapt_freq, maxdelta, maxpasses)
|
|
1101
1105
|
self.setups.append(setup)
|
|
1102
1106
|
return setup
|
|
1103
1107
|
|
|
@@ -1112,17 +1116,17 @@ class ControlFile:
|
|
|
1112
1116
|
|
|
1113
1117
|
def __init__(self, xml_input=None, tecnhology=None, layer_map=None):
|
|
1114
1118
|
self.stackup = ControlFileStackup()
|
|
1119
|
+
self.boundaries = ControlFileBoundaries()
|
|
1120
|
+
self.setups = ControlFileSetups()
|
|
1115
1121
|
if xml_input:
|
|
1116
1122
|
self.parse_xml(xml_input)
|
|
1117
1123
|
if tecnhology:
|
|
1118
1124
|
self.parse_technology(tecnhology)
|
|
1119
1125
|
if layer_map:
|
|
1120
1126
|
self.parse_layer_map(layer_map)
|
|
1121
|
-
self.boundaries = ControlFileBoundaries()
|
|
1122
1127
|
self.remove_holes = False
|
|
1123
1128
|
self.remove_holes_area_minimum = 30
|
|
1124
1129
|
self.remove_holes_units = "um"
|
|
1125
|
-
self.setups = ControlFileSetups()
|
|
1126
1130
|
self.components = ControlFileComponents()
|
|
1127
1131
|
self.import_options = ControlFileImportOptions()
|
|
1128
1132
|
pass
|
|
@@ -1262,6 +1266,50 @@ class ControlFile:
|
|
|
1262
1266
|
via.remove_unconnected = (
|
|
1263
1267
|
True if i.attrib["RemoveUnconnected"] == "true" else False
|
|
1264
1268
|
)
|
|
1269
|
+
if el.tag == "Boundaries":
|
|
1270
|
+
for port_el in el:
|
|
1271
|
+
if port_el.tag == "CircuitPortPt":
|
|
1272
|
+
self.boundaries.add_port(
|
|
1273
|
+
name=port_el.attrib["Name"],
|
|
1274
|
+
x1=port_el.attrib["x1"],
|
|
1275
|
+
y1=port_el.attrib["y1"],
|
|
1276
|
+
layer1=port_el.attrib["Layer1"],
|
|
1277
|
+
x2=port_el.attrib["x2"],
|
|
1278
|
+
y2=port_el.attrib["y2"],
|
|
1279
|
+
layer2=port_el.attrib["Layer2"],
|
|
1280
|
+
z0=port_el.attrib["Z0"],
|
|
1281
|
+
)
|
|
1282
|
+
setups = root.find("SimulationSetups")
|
|
1283
|
+
if setups:
|
|
1284
|
+
hfsssetup = setups.find("HFSSSetup")
|
|
1285
|
+
if hfsssetup:
|
|
1286
|
+
if "Name" in hfsssetup.attrib:
|
|
1287
|
+
name = hfsssetup.attrib["Name"]
|
|
1288
|
+
hfsssimset = hfsssetup.find("HFSSSimulationSettings")
|
|
1289
|
+
if hfsssimset:
|
|
1290
|
+
hfssadaptset = hfsssimset.find("HFSSAdaptiveSettings")
|
|
1291
|
+
if hfssadaptset:
|
|
1292
|
+
adaptset = hfssadaptset.find("AdaptiveSettings")
|
|
1293
|
+
if adaptset:
|
|
1294
|
+
singlefreqdatalist = adaptset.find("SingleFrequencyDataList")
|
|
1295
|
+
if singlefreqdatalist:
|
|
1296
|
+
adaptfreqdata = singlefreqdatalist.find("AdaptiveFrequencyData")
|
|
1297
|
+
if adaptfreqdata:
|
|
1298
|
+
if isinstance(
|
|
1299
|
+
adaptfreqdata.find("AdaptiveFrequency"), xml.etree.ElementTree.Element
|
|
1300
|
+
):
|
|
1301
|
+
adapt_freq = adaptfreqdata.find("AdaptiveFrequency").text
|
|
1302
|
+
else:
|
|
1303
|
+
adapt_freq = "1GHz"
|
|
1304
|
+
if isinstance(adaptfreqdata.find("MaxDelta"), xml.etree.ElementTree.Element):
|
|
1305
|
+
maxdelta = adaptfreqdata.find("MaxDelta").text
|
|
1306
|
+
else:
|
|
1307
|
+
maxdelta = 0.02
|
|
1308
|
+
if isinstance(adaptfreqdata.find("MaxPasses"), xml.etree.ElementTree.Element):
|
|
1309
|
+
maxpasses = adaptfreqdata.find("MaxPasses").text
|
|
1310
|
+
else:
|
|
1311
|
+
maxpasses = 10
|
|
1312
|
+
self.setups.add_setup(name, adapt_freq, maxdelta, maxpasses)
|
|
1265
1313
|
return True
|
|
1266
1314
|
|
|
1267
1315
|
def write_xml(self, xml_output):
|
|
@@ -1278,8 +1326,7 @@ class ControlFile:
|
|
|
1278
1326
|
"""
|
|
1279
1327
|
control = ET.Element("{http://www.ansys.com/control}Control", attrib={"schemaVersion": "1.0"})
|
|
1280
1328
|
self.stackup._write_xml(control)
|
|
1281
|
-
|
|
1282
|
-
self.boundaries._write_xml(control)
|
|
1329
|
+
self.boundaries._write_xml(control)
|
|
1283
1330
|
if self.remove_holes:
|
|
1284
1331
|
hole = ET.SubElement(control, "RemoveHoles")
|
|
1285
1332
|
hole.set("HoleAreaMinimum", str(self.remove_holes_area_minimum))
|
|
@@ -22,7 +22,6 @@
|
|
|
22
22
|
|
|
23
23
|
from collections import OrderedDict
|
|
24
24
|
import math
|
|
25
|
-
import re
|
|
26
25
|
import warnings
|
|
27
26
|
|
|
28
27
|
from pyedb.dotnet.clr_module import String
|
|
@@ -1248,68 +1247,30 @@ class EDBPadstackInstance(Primitive):
|
|
|
1248
1247
|
|
|
1249
1248
|
return self._pedb.create_port(terminal, ref_terminal, is_circuit_port)
|
|
1250
1249
|
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
r"\t\t'Solve Inside'='false'\n"
|
|
1270
|
-
r"\t\tSIwave=''\n"
|
|
1271
|
-
r"\t\t'DCIR Equipotential Region'='false'\n"
|
|
1272
|
-
r"\t$end 'Properties'\n"
|
|
1273
|
-
r"$end 'EM properties'\n"
|
|
1274
|
-
)
|
|
1275
|
-
|
|
1276
|
-
pid = self._pedb.edb_api.ProductId.Designer
|
|
1277
|
-
_, p = self._edb_padstackinstance.GetProductProperty(pid, 18, "")
|
|
1278
|
-
if p:
|
|
1279
|
-
return p
|
|
1280
|
-
else:
|
|
1281
|
-
return default
|
|
1282
|
-
|
|
1283
|
-
@_em_properties.setter
|
|
1284
|
-
def _em_properties(self, em_prop):
|
|
1285
|
-
"""Set EM properties"""
|
|
1286
|
-
pid = self._pedb.edb_api.ProductId.Designer
|
|
1287
|
-
self._edb_padstackinstance.SetProductProperty(pid, 18, em_prop)
|
|
1288
|
-
|
|
1289
|
-
@property
|
|
1290
|
-
def dcir_equipotential_region(self):
|
|
1291
|
-
"""Check whether dcir equipotential region is enabled.
|
|
1250
|
+
def _set_equipotential(self):
|
|
1251
|
+
"""Workaround solution. Remove when EDBAPI bug is fixed for dcir_equipotential_region."""
|
|
1252
|
+
pad = self.definition.pad_by_layer[self.start_layer]
|
|
1253
|
+
if pad.shape.lower() == "circle":
|
|
1254
|
+
ra = self._pedb.edb_value(pad.parameters_values[0] / 2)
|
|
1255
|
+
pos = self.position
|
|
1256
|
+
prim = self._pedb.modeler.create_circle(pad.layer_name, pos[0], pos[1], ra, self.net_name)
|
|
1257
|
+
elif pad.shape.lower() == "rectangle":
|
|
1258
|
+
width, height = pad.parameters_values
|
|
1259
|
+
prim = self._pedb.modeler.create_rectangle(
|
|
1260
|
+
pad.layer_name,
|
|
1261
|
+
self.net_name,
|
|
1262
|
+
width=width,
|
|
1263
|
+
height=height,
|
|
1264
|
+
representation_type="CenterWidthHeight",
|
|
1265
|
+
center_point=self.position,
|
|
1266
|
+
rotation=self.component.rotation,
|
|
1267
|
+
)
|
|
1292
1268
|
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
bool
|
|
1296
|
-
"""
|
|
1297
|
-
pattern = r"'DCIR Equipotential Region'='([^']+)'"
|
|
1298
|
-
em_pp = self._em_properties
|
|
1299
|
-
result = re.search(pattern, em_pp).group(1)
|
|
1300
|
-
if result == "true":
|
|
1301
|
-
return True
|
|
1269
|
+
elif pad.polygon_data:
|
|
1270
|
+
prim = self._pedb.modeler.create_polygon(pad.polygon_data, self.start_layer, net_name=self.net_name)
|
|
1302
1271
|
else:
|
|
1303
|
-
return
|
|
1304
|
-
|
|
1305
|
-
@dcir_equipotential_region.setter
|
|
1306
|
-
def dcir_equipotential_region(self, value):
|
|
1307
|
-
"""Set dcir equipotential region."""
|
|
1308
|
-
pp = r"'DCIR Equipotential Region'='true'" if value else r"'DCIR Equipotential Region'='false'"
|
|
1309
|
-
em_pp = self._em_properties
|
|
1310
|
-
pattern = r"'DCIR Equipotential Region'='([^']+)'"
|
|
1311
|
-
new_em_pp = re.sub(pattern, pp, em_pp)
|
|
1312
|
-
self._em_properties = new_em_pp
|
|
1272
|
+
return
|
|
1273
|
+
prim.dcir_equipotential_region = True
|
|
1313
1274
|
|
|
1314
1275
|
@property
|
|
1315
1276
|
def object_instance(self):
|
|
@@ -1577,7 +1538,6 @@ class EDBPadstackInstance(Primitive):
|
|
|
1577
1538
|
str
|
|
1578
1539
|
Name of the starting layer.
|
|
1579
1540
|
"""
|
|
1580
|
-
layer = self._pedb.edb_api.cell.layer("", self._pedb.edb_api.cell.layer_type.SignalLayer)
|
|
1581
1541
|
_, start_layer, stop_layer = self._edb_object.GetLayerRange()
|
|
1582
1542
|
|
|
1583
1543
|
if start_layer:
|
|
@@ -1599,7 +1559,6 @@ class EDBPadstackInstance(Primitive):
|
|
|
1599
1559
|
str
|
|
1600
1560
|
Name of the stopping layer.
|
|
1601
1561
|
"""
|
|
1602
|
-
layer = self._pedb.edb_api.cell.layer("", self._pedb.edb_api.cell.layer_type.SignalLayer)
|
|
1603
1562
|
_, start_layer, stop_layer = self._edb_padstackinstance.GetLayerRange()
|
|
1604
1563
|
|
|
1605
1564
|
if stop_layer:
|
|
@@ -1705,7 +1664,6 @@ class EDBPadstackInstance(Primitive):
|
|
|
1705
1664
|
float
|
|
1706
1665
|
Rotatation value for the padstack instance.
|
|
1707
1666
|
"""
|
|
1708
|
-
point_data = self._pedb.edb_api.geometry.point_data(self._pedb.edb_value(0.0), self._pedb.edb_value(0.0))
|
|
1709
1667
|
out = self._edb_padstackinstance.GetPositionAndRotationValue()
|
|
1710
1668
|
|
|
1711
1669
|
if out[0]:
|
|
@@ -1636,14 +1636,12 @@ class EdbPadstacks(object):
|
|
|
1636
1636
|
merged_via_ids = []
|
|
1637
1637
|
if not contour_boxes:
|
|
1638
1638
|
raise Exception("No contour box provided, you need to pass a nested list as argument.")
|
|
1639
|
-
|
|
1640
|
-
start_layer = list(self._pedb.stackup.layers.values())[0].name
|
|
1641
|
-
if not stop_layer:
|
|
1642
|
-
stop_layer = list(self._pedb.stackup.layers.values())[-1].name
|
|
1639
|
+
|
|
1643
1640
|
instances_index = {}
|
|
1644
1641
|
for id, inst in self.instances.items():
|
|
1645
1642
|
instances_index[id] = inst.position
|
|
1646
1643
|
for contour_box in contour_boxes:
|
|
1644
|
+
all_instances = self.instances
|
|
1647
1645
|
instances = self.get_padstack_instances_id_intersecting_polygon(
|
|
1648
1646
|
points=contour_box, padstack_instances_index=instances_index
|
|
1649
1647
|
)
|
|
@@ -1651,7 +1649,28 @@ class EdbPadstacks(object):
|
|
|
1651
1649
|
raise Exception(f"No padstack instances found inside {contour_box}")
|
|
1652
1650
|
else:
|
|
1653
1651
|
if net_filter:
|
|
1654
|
-
instances = [id for id in instances if not self.instances[id].net_name in net_filter]
|
|
1652
|
+
# instances = [id for id in instances if not self.instances[id].net_name in net_filter]
|
|
1653
|
+
instances = [id for id in instances if all_instances[id].net_name not in net_filter]
|
|
1654
|
+
# filter instances by start and stop layer
|
|
1655
|
+
if start_layer:
|
|
1656
|
+
if start_layer not in self._pedb.stackup.layers.keys():
|
|
1657
|
+
raise Exception(f"{start_layer} not exist")
|
|
1658
|
+
else:
|
|
1659
|
+
instances = [id for id in instances if all_instances[id].start_layer == start_layer]
|
|
1660
|
+
if stop_layer:
|
|
1661
|
+
if stop_layer not in self._pedb.stackup.layers.keys():
|
|
1662
|
+
raise Exception(f"{stop_layer} not exist")
|
|
1663
|
+
else:
|
|
1664
|
+
instances = [id for id in instances if all_instances[id].stop_layer == stop_layer]
|
|
1665
|
+
if not instances:
|
|
1666
|
+
raise Exception(
|
|
1667
|
+
f"No padstack instances found inside {contour_box} between {start_layer} and {stop_layer}"
|
|
1668
|
+
)
|
|
1669
|
+
|
|
1670
|
+
if not start_layer:
|
|
1671
|
+
start_layer = list(self._pedb.stackup.layers.values())[0].name
|
|
1672
|
+
if not stop_layer:
|
|
1673
|
+
stop_layer = list(self._pedb.stackup.layers.values())[-1].name
|
|
1655
1674
|
|
|
1656
1675
|
net = self.instances[instances[0]].net_name
|
|
1657
1676
|
x_values = []
|
|
@@ -1692,7 +1711,7 @@ class EdbPadstacks(object):
|
|
|
1692
1711
|
merged_instance.stop_layer = stop_layer
|
|
1693
1712
|
|
|
1694
1713
|
merged_via_ids.append(merged_instance.id)
|
|
1695
|
-
[
|
|
1714
|
+
_ = [all_instances[id].delete() for id in instances]
|
|
1696
1715
|
return merged_via_ids
|
|
1697
1716
|
|
|
1698
1717
|
def merge_via_along_lines(
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/terminal/padstack_instance_terminal.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|