pyedb 0.31.0__tar.gz → 0.34.1__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.31.0 → pyedb-0.34.1}/PKG-INFO +12 -9
- {pyedb-0.31.0 → pyedb-0.34.1}/pyproject.toml +12 -8
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/__init__.py +1 -27
- pyedb-0.34.1/src/pyedb/common/nets.py +488 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/configuration/cfg_common.py +20 -0
- pyedb-0.34.1/src/pyedb/configuration/cfg_components.py +262 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/configuration/cfg_data.py +6 -0
- pyedb-0.34.1/src/pyedb/configuration/cfg_modeler.py +139 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/configuration/cfg_operations.py +5 -4
- pyedb-0.34.1/src/pyedb/configuration/cfg_padstacks.py +383 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/configuration/cfg_ports_sources.py +99 -7
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/configuration/cfg_s_parameter_models.py +6 -6
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/configuration/configuration.py +31 -9
- pyedb-0.34.1/src/pyedb/dotnet/clr_module.py +163 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb.py +54 -5
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/cell/hierarchy/component.py +0 -202
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/cell/layout.py +1 -1
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/cell/primitive/primitive.py +5 -27
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/edb_data/control_file.py +21 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/edb_data/layer_data.py +60 -6
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/edb_data/nets_data.py +6 -1
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/edb_data/padstacks_data.py +16 -222
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/edb_data/primitives_data.py +31 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/hfss.py +2 -2
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/layout_validation.py +1 -3
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/materials.py +38 -38
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/modeler.py +4 -1
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/nets.py +2 -373
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/generic/filesystem.py +2 -5
- pyedb-0.34.1/src/pyedb/misc/siw_feature_config/emc/__init__.py +0 -0
- pyedb-0.31.0/src/pyedb/configuration/cfg_components.py +0 -101
- pyedb-0.31.0/src/pyedb/configuration/cfg_padstacks.py +0 -119
- pyedb-0.31.0/src/pyedb/dotnet/clr_module.py +0 -103
- {pyedb-0.31.0 → pyedb-0.34.1}/LICENSE +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/README.md +0 -0
- {pyedb-0.31.0/src/pyedb/configuration → pyedb-0.34.1/src/pyedb/common}/__init__.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/component_libraries/ansys_components.py +0 -0
- {pyedb-0.31.0/src/pyedb/dotnet → pyedb-0.34.1/src/pyedb/configuration}/__init__.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/configuration/cfg_boundaries.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/configuration/cfg_general.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/configuration/cfg_nets.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/configuration/cfg_package_definition.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/configuration/cfg_pin_groups.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/configuration/cfg_setup.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/configuration/cfg_spice_models.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/configuration/cfg_stackup.py +0 -0
- {pyedb-0.31.0/src/pyedb/dotnet/application → pyedb-0.34.1/src/pyedb/dotnet}/__init__.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/application/Variables.py +0 -0
- {pyedb-0.31.0/src/pyedb/dotnet/edb_core/cell → pyedb-0.34.1/src/pyedb/dotnet/application}/__init__.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/__init__.py +0 -0
- {pyedb-0.31.0/src/pyedb/dotnet/edb_core/cell/hierarchy → pyedb-0.34.1/src/pyedb/dotnet/edb_core/cell}/__init__.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/cell/connectable.py +0 -0
- {pyedb-0.31.0/src/pyedb/dotnet/edb_core/cell/terminal → pyedb-0.34.1/src/pyedb/dotnet/edb_core/cell/hierarchy}/__init__.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/cell/hierarchy/hierarchy_obj.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/cell/hierarchy/model.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/cell/hierarchy/netlist_model.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/cell/hierarchy/pin_pair_model.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/cell/hierarchy/s_parameter_model.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/cell/hierarchy/spice_model.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/cell/layout_obj.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/cell/primitive/__init__.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/cell/primitive/bondwire.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/cell/primitive/path.py +0 -0
- {pyedb-0.31.0/src/pyedb/dotnet/edb_core/definition → pyedb-0.34.1/src/pyedb/dotnet/edb_core/cell/terminal}/__init__.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/cell/terminal/bundle_terminal.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/cell/terminal/edge_terminal.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/cell/terminal/padstack_instance_terminal.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/cell/terminal/pingroup_terminal.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/cell/terminal/point_terminal.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/cell/terminal/terminal.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/cell/voltage_regulator.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/components.py +0 -0
- {pyedb-0.31.0/src/pyedb/dotnet/edb_core/dotnet → pyedb-0.34.1/src/pyedb/dotnet/edb_core/definition}/__init__.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/definition/component_def.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/definition/component_model.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/definition/definition_obj.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/definition/definitions.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/definition/package_def.py +0 -0
- {pyedb-0.31.0/src/pyedb/dotnet/edb_core/edb_data → pyedb-0.34.1/src/pyedb/dotnet/edb_core/dotnet}/__init__.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/dotnet/database.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/dotnet/primitive.py +0 -0
- {pyedb-0.31.0/src/pyedb/dotnet/edb_core/geometry → pyedb-0.34.1/src/pyedb/dotnet/edb_core/edb_data}/__init__.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/edb_data/design_options.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/edb_data/edbvalue.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/edb_data/hfss_extent_info.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/edb_data/ports.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/edb_data/raptor_x_simulation_setup_data.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/edb_data/simulation_configuration.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/edb_data/sources.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/edb_data/utilities.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/edb_data/variables.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/general.py +0 -0
- {pyedb-0.31.0/src/pyedb/dotnet/edb_core/sim_setup_data/io → pyedb-0.34.1/src/pyedb/dotnet/edb_core/geometry}/__init__.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/geometry/point_data.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/geometry/polygon_data.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/layout_obj_instance.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/net_class.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/padstack.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/sim_setup_data/__init__.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/sim_setup_data/data/__init__.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/sim_setup_data/data/adaptive_frequency_data.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/sim_setup_data/data/mesh_operation.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/sim_setup_data/data/settings.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/sim_setup_data/data/sim_setup_info.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/sim_setup_data/data/simulation_settings.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/sim_setup_data/data/siw_dc_ir_settings.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/sim_setup_data/data/sweep_data.py +0 -0
- {pyedb-0.31.0/src/pyedb/generic → pyedb-0.34.1/src/pyedb/dotnet/edb_core/sim_setup_data/io}/__init__.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/sim_setup_data/io/siwave.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/siwave.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/stackup.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/utilities/__init__.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/utilities/heatsink.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/utilities/hfss_simulation_setup.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/utilities/obj_base.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/utilities/simulation_setup.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/dotnet/edb_core/utilities/siwave_simulation_setup.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/edb_logger.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/exceptions.py +0 -0
- {pyedb-0.31.0/src/pyedb/ipc2581 → pyedb-0.34.1/src/pyedb/generic}/__init__.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/generic/constants.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/generic/data_handlers.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/generic/design_types.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/generic/general_methods.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/generic/plot.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/generic/process.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/generic/settings.py +0 -0
- {pyedb-0.31.0/src/pyedb/ipc2581/bom → pyedb-0.34.1/src/pyedb/ipc2581}/__init__.py +0 -0
- {pyedb-0.31.0/src/pyedb/ipc2581/content → pyedb-0.34.1/src/pyedb/ipc2581/bom}/__init__.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/bom/bom.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/bom/bom_item.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/bom/characteristics.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/bom/refdes.py +0 -0
- {pyedb-0.31.0/src/pyedb/ipc2581/ecad → pyedb-0.34.1/src/pyedb/ipc2581/content}/__init__.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/content/color.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/content/content.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/content/dictionary_color.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/content/dictionary_fill.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/content/dictionary_line.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/content/entry_color.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/content/entry_line.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/content/fill.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/content/layer_ref.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/content/standard_geometries_dictionary.py +0 -0
- {pyedb-0.31.0/src/pyedb/ipc2581/ecad/cad_data → pyedb-0.34.1/src/pyedb/ipc2581/ecad}/__init__.py +0 -0
- {pyedb-0.31.0/src/pyedb/misc → pyedb-0.34.1/src/pyedb/ipc2581/ecad/cad_data}/__init__.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/ecad/cad_data/assembly_drawing.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/ecad/cad_data/cad_data.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/ecad/cad_data/component.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/ecad/cad_data/drill.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/ecad/cad_data/feature.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/ecad/cad_data/layer.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/ecad/cad_data/layer_feature.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/ecad/cad_data/logical_net.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/ecad/cad_data/outline.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/ecad/cad_data/package.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/ecad/cad_data/padstack_def.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/ecad/cad_data/padstack_hole_def.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/ecad/cad_data/padstack_instance.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/ecad/cad_data/padstack_pad_def.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/ecad/cad_data/path.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/ecad/cad_data/phy_net.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/ecad/cad_data/pin.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/ecad/cad_data/polygon.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/ecad/cad_data/profile.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/ecad/cad_data/stackup.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/ecad/cad_data/stackup_group.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/ecad/cad_data/stackup_layer.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/ecad/cad_data/step.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/ecad/cad_header.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/ecad/ecad.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/ecad/spec.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/history_record.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/ipc2581.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/ipc2581/logistic_header.py +0 -0
- {pyedb-0.31.0/src/pyedb/misc/siw_feature_config → pyedb-0.34.1/src/pyedb/misc}/__init__.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/misc/aedtlib_personalib_install.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/misc/downloads.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/misc/misc.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/misc/pyedb.runtimeconfig.json +0 -0
- {pyedb-0.31.0/src/pyedb/misc/siw_feature_config/emc → pyedb-0.34.1/src/pyedb/misc/siw_feature_config}/__init__.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/misc/siw_feature_config/emc/component_tags.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/misc/siw_feature_config/emc/net_tags.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/misc/siw_feature_config/emc/tag_library.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/misc/siw_feature_config/emc/xml_generic.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/misc/siw_feature_config/emc_rule_checker_settings.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/misc/siw_feature_config/xtalk_scan/fd_xtalk_scan_config.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/misc/siw_feature_config/xtalk_scan/impedance_scan_config.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/misc/siw_feature_config/xtalk_scan/net.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/misc/siw_feature_config/xtalk_scan/pins.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/misc/siw_feature_config/xtalk_scan/scan_config.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/misc/siw_feature_config/xtalk_scan/td_xtalk_config.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/misc/utilities.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/modeler/geometry_operators.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/siwave.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/siwave_core/icepak.py +0 -0
- {pyedb-0.31.0 → pyedb-0.34.1}/src/pyedb/workflow.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.3
|
|
2
2
|
Name: pyedb
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.34.1
|
|
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>
|
|
@@ -17,9 +17,9 @@ Classifier: Programming Language :: Python :: 3.10
|
|
|
17
17
|
Classifier: Programming Language :: Python :: 3.11
|
|
18
18
|
Requires-Dist: cffi>=1.16.0,<1.18; platform_system=='Linux'
|
|
19
19
|
Requires-Dist: pywin32 >= 303;platform_system=='Windows'
|
|
20
|
-
Requires-Dist: ansys-pythonnet >= 3.1.
|
|
20
|
+
Requires-Dist: ansys-pythonnet >= 3.1.0rc4
|
|
21
21
|
Requires-Dist: dotnetcore2 ==3.1.23;platform_system=='Linux'
|
|
22
|
-
Requires-Dist: numpy>=1.20.0,<
|
|
22
|
+
Requires-Dist: numpy>=1.20.0,<3
|
|
23
23
|
Requires-Dist: pandas>=1.1.0,<2.3
|
|
24
24
|
Requires-Dist: pydantic>=2.6.4,<2.10
|
|
25
25
|
Requires-Dist: Rtree >= 1.2.0
|
|
@@ -27,8 +27,8 @@ 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.
|
|
31
|
-
Requires-Dist: jupyterlab>=4.0.0,<4.
|
|
30
|
+
Requires-Dist: ipython>=8.13.0,<8.31 ; extra == "doc"
|
|
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"
|
|
34
34
|
Requires-Dist: nbsphinx>=0.9.0,<0.10 ; extra == "doc"
|
|
@@ -36,19 +36,22 @@ Requires-Dist: nbconvert < 7.17 ; extra == "doc"
|
|
|
36
36
|
Requires-Dist: numpydoc>=1.5.0,<1.9 ; extra == "doc"
|
|
37
37
|
Requires-Dist: pypandoc>=1.10.0,<1.15 ; extra == "doc"
|
|
38
38
|
Requires-Dist: recommonmark ; extra == "doc"
|
|
39
|
-
Requires-Dist: Sphinx>=7.1.0,<8.
|
|
39
|
+
Requires-Dist: Sphinx>=7.1.0,<8.2 ; extra == "doc"
|
|
40
40
|
Requires-Dist: sphinx-autobuild==2021.3.14 ; extra == "doc" and ( python_version == '3.8')
|
|
41
41
|
Requires-Dist: sphinx-autobuild==2024.10.3 ; extra == "doc" and ( python_version > '3.8')
|
|
42
42
|
Requires-Dist: sphinx-copybutton>=0.5.0,<0.6 ; extra == "doc"
|
|
43
|
-
Requires-Dist: sphinx-gallery>=0.14.0,<0.
|
|
43
|
+
Requires-Dist: sphinx-gallery>=0.14.0,<0.19 ; extra == "doc"
|
|
44
44
|
Requires-Dist: sphinx_design>=0.4.0,<0.7 ; extra == "doc"
|
|
45
|
+
Requires-Dist: shapely ; extra == "doc"
|
|
45
46
|
Requires-Dist: matplotlib>=3.5.0,<3.10 ; extra == "full"
|
|
47
|
+
Requires-Dist: shapely ; extra == "full"
|
|
46
48
|
Requires-Dist: matplotlib>=3.5.0,<3.10 ; extra == "tests"
|
|
47
49
|
Requires-Dist: mock>=5.1.0,<5.2 ; extra == "tests"
|
|
48
50
|
Requires-Dist: pytest>=7.4.0,<8.4 ; extra == "tests"
|
|
49
|
-
Requires-Dist: pytest-cov>=4.0.0,<
|
|
51
|
+
Requires-Dist: pytest-cov>=4.0.0,<6.1 ; extra == "tests"
|
|
50
52
|
Requires-Dist: pytest-xdist>=3.5.0,<3.7 ; extra == "tests"
|
|
51
53
|
Requires-Dist: scikit-rf ; extra == "tests"
|
|
54
|
+
Requires-Dist: shapely ; extra == "tests"
|
|
52
55
|
Project-URL: Bugs, https://github.com/ansys/pyedb/issues
|
|
53
56
|
Project-URL: Discussions, https://github.com/ansys/pyedb/discussions
|
|
54
57
|
Project-URL: Documentation, https://edb.docs.pyansys.com
|
|
@@ -27,9 +27,9 @@ classifiers = [
|
|
|
27
27
|
dependencies = [
|
|
28
28
|
"cffi>=1.16.0,<1.18; platform_system=='Linux'",
|
|
29
29
|
"pywin32 >= 303;platform_system=='Windows'",
|
|
30
|
-
"ansys-pythonnet >= 3.1.
|
|
30
|
+
"ansys-pythonnet >= 3.1.0rc4",
|
|
31
31
|
"dotnetcore2 ==3.1.23;platform_system=='Linux'",
|
|
32
|
-
"numpy>=1.20.0,<
|
|
32
|
+
"numpy>=1.20.0,<3",
|
|
33
33
|
"pandas>=1.1.0,<2.3",
|
|
34
34
|
"pydantic>=2.6.4,<2.10",
|
|
35
35
|
"Rtree >= 1.2.0",
|
|
@@ -42,15 +42,16 @@ tests = [
|
|
|
42
42
|
"matplotlib>=3.5.0,<3.10",
|
|
43
43
|
"mock>=5.1.0,<5.2",
|
|
44
44
|
"pytest>=7.4.0,<8.4",
|
|
45
|
-
"pytest-cov>=4.0.0,<
|
|
45
|
+
"pytest-cov>=4.0.0,<6.1",
|
|
46
46
|
"pytest-xdist>=3.5.0,<3.7",
|
|
47
|
-
"scikit-rf"
|
|
47
|
+
"scikit-rf",
|
|
48
|
+
"shapely"
|
|
48
49
|
]
|
|
49
50
|
doc = [
|
|
50
51
|
"ansys-sphinx-theme>=0.10.0,<1.1",
|
|
51
52
|
"imageio>=2.30.0,<2.37",
|
|
52
|
-
"ipython>=8.13.0,<8.
|
|
53
|
-
"jupyterlab>=4.0.0,<4.
|
|
53
|
+
"ipython>=8.13.0,<8.31",
|
|
54
|
+
"jupyterlab>=4.0.0,<4.4",
|
|
54
55
|
"jupytext>=1.16.0,<1.17",
|
|
55
56
|
"matplotlib>=3.5.0,<3.10",
|
|
56
57
|
"nbsphinx>=0.9.0,<0.10",
|
|
@@ -59,15 +60,18 @@ doc = [
|
|
|
59
60
|
"pypandoc>=1.10.0,<1.15",
|
|
60
61
|
# NOTE: Remove recommonmark once examples are reworked.
|
|
61
62
|
"recommonmark",
|
|
62
|
-
"Sphinx>=7.1.0,<8.
|
|
63
|
+
"Sphinx>=7.1.0,<8.2",
|
|
63
64
|
"sphinx-autobuild==2021.3.14; python_version == '3.8'",
|
|
64
65
|
"sphinx-autobuild==2024.10.3; python_version > '3.8'",
|
|
65
66
|
"sphinx-copybutton>=0.5.0,<0.6",
|
|
66
|
-
"sphinx-gallery>=0.14.0,<0.
|
|
67
|
+
"sphinx-gallery>=0.14.0,<0.19",
|
|
67
68
|
"sphinx_design>=0.4.0,<0.7",
|
|
69
|
+
"shapely",
|
|
70
|
+
|
|
68
71
|
]
|
|
69
72
|
full = [
|
|
70
73
|
"matplotlib>=3.5.0,<3.10",
|
|
74
|
+
"shapely",
|
|
71
75
|
]
|
|
72
76
|
|
|
73
77
|
|
|
@@ -11,13 +11,6 @@ if "PYEDB_USE_DOTNET" not in os.environ:
|
|
|
11
11
|
os.environ["PYEDB_USE_DOTNET"] = "0"
|
|
12
12
|
|
|
13
13
|
LATEST_DEPRECATED_PYTHON_VERSION = (3, 7)
|
|
14
|
-
LINUX_WARNING = (
|
|
15
|
-
"Due to compatibility issues between .NET Core and libssl on some Linux versions, "
|
|
16
|
-
"for example Ubuntu 22.04, we are going to stop depending on `dotnetcore2`."
|
|
17
|
-
"Instead of using this package which embeds .NET Core 3, users will be required to "
|
|
18
|
-
"install .NET themselves. For more information, see "
|
|
19
|
-
"https://edb.docs.pyansys.com/version/stable/build_breaking_change.html"
|
|
20
|
-
)
|
|
21
14
|
|
|
22
15
|
|
|
23
16
|
def deprecation_warning():
|
|
@@ -46,31 +39,12 @@ def deprecation_warning():
|
|
|
46
39
|
warnings.showwarning = existing_showwarning
|
|
47
40
|
|
|
48
41
|
|
|
49
|
-
def linux_warning():
|
|
50
|
-
"""Warning message informing Linux users a future breaking change is coming."""
|
|
51
|
-
# Store warnings showwarning
|
|
52
|
-
existing_showwarning = warnings.showwarning
|
|
53
|
-
|
|
54
|
-
# Define and use custom showwarning
|
|
55
|
-
def custom_show_warning(message, category, filename, lineno, file=None, line=None):
|
|
56
|
-
"""Custom warning used to remove <stdin>:loc: pattern."""
|
|
57
|
-
print("{}: {}".format(category.__name__, message))
|
|
58
|
-
|
|
59
|
-
warnings.showwarning = custom_show_warning
|
|
60
|
-
|
|
61
|
-
if os.name == "posix":
|
|
62
|
-
warnings.warn(LINUX_WARNING, FutureWarning)
|
|
63
|
-
|
|
64
|
-
# Restore warnings showwarning
|
|
65
|
-
warnings.showwarning = existing_showwarning
|
|
66
|
-
|
|
67
|
-
|
|
68
42
|
deprecation_warning()
|
|
69
43
|
|
|
70
44
|
#
|
|
71
45
|
|
|
72
46
|
pyedb_path = os.path.dirname(__file__)
|
|
73
|
-
__version__ = "0.
|
|
47
|
+
__version__ = "0.34.1"
|
|
74
48
|
version = __version__
|
|
75
49
|
|
|
76
50
|
#
|
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
import math
|
|
2
|
+
import os
|
|
3
|
+
import time
|
|
4
|
+
|
|
5
|
+
import shapely
|
|
6
|
+
|
|
7
|
+
from pyedb.generic.constants import CSS4_COLORS
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def is_notebook():
|
|
11
|
+
"""Check if pyaedt is running in Jupyter or not.
|
|
12
|
+
|
|
13
|
+
Returns
|
|
14
|
+
-------
|
|
15
|
+
bool
|
|
16
|
+
"""
|
|
17
|
+
try:
|
|
18
|
+
shell = get_ipython().__class__.__name__
|
|
19
|
+
if shell in ["ZMQInteractiveShell"]: # pragma: no cover
|
|
20
|
+
return True # Jupyter notebook or qtconsole
|
|
21
|
+
else:
|
|
22
|
+
return False
|
|
23
|
+
except NameError:
|
|
24
|
+
return False # Probably standard Python interpreter
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def is_ipython():
|
|
28
|
+
"""Check if pyaedt is running in Jupyter or not.
|
|
29
|
+
|
|
30
|
+
Returns
|
|
31
|
+
-------
|
|
32
|
+
bool
|
|
33
|
+
"""
|
|
34
|
+
try:
|
|
35
|
+
shell = get_ipython().__class__.__name__
|
|
36
|
+
if shell in ["TerminalInteractiveShell", "SpyderShell"]:
|
|
37
|
+
return True # Jupyter notebook or qtconsole
|
|
38
|
+
else: # pragma: no cover
|
|
39
|
+
return False
|
|
40
|
+
except NameError:
|
|
41
|
+
return False # Probably standard Python interpreter
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class CommonNets:
|
|
45
|
+
def __init__(self, _pedb):
|
|
46
|
+
self._pedb = _pedb
|
|
47
|
+
|
|
48
|
+
def plot(
|
|
49
|
+
self,
|
|
50
|
+
nets=None,
|
|
51
|
+
layers=None,
|
|
52
|
+
color_by_net=False,
|
|
53
|
+
show_legend=True,
|
|
54
|
+
save_plot=None,
|
|
55
|
+
outline=None,
|
|
56
|
+
size=(6000, 3000),
|
|
57
|
+
plot_components=True,
|
|
58
|
+
top_view=True,
|
|
59
|
+
show=True,
|
|
60
|
+
annotate_component_names=True,
|
|
61
|
+
plot_vias=False,
|
|
62
|
+
include_outline=True,
|
|
63
|
+
plot_edges=True,
|
|
64
|
+
**kwargs,
|
|
65
|
+
):
|
|
66
|
+
"""Plot a Net to Matplotlib 2D Chart.
|
|
67
|
+
|
|
68
|
+
Parameters
|
|
69
|
+
----------
|
|
70
|
+
nets : str, list, optional
|
|
71
|
+
Name of the net or list of nets to plot. If ``None`` all nets will be plotted.
|
|
72
|
+
layers : str, list, optional
|
|
73
|
+
Name of the layers to include in the plot. If ``None`` all the signal layers will be considered.
|
|
74
|
+
color_by_net : bool, optional
|
|
75
|
+
If ``True`` the plot will be colored by net.
|
|
76
|
+
If ``False`` the plot will be colored by layer. (default)
|
|
77
|
+
show_legend : bool, optional
|
|
78
|
+
If ``True`` the legend is shown in the plot. (default)
|
|
79
|
+
If ``False`` the legend is not shown.
|
|
80
|
+
save_plot : str, optional
|
|
81
|
+
If a path is specified the plot will be saved in this location.
|
|
82
|
+
If ``save_plot`` is provided, the ``show`` parameter is ignored.
|
|
83
|
+
outline : list, optional
|
|
84
|
+
Add a customer outline from a list of points of the outline to plot.
|
|
85
|
+
size : tuple, int, optional
|
|
86
|
+
Image size in pixel (width, height). Default value is ``(6000, 3000)``
|
|
87
|
+
top_view : bool, optional
|
|
88
|
+
Whether if use top view or bottom view. Components will be visible only for the highest layer in the view.
|
|
89
|
+
plot_components : bool, optional
|
|
90
|
+
If ``True`` the components placed on top layer are plotted.
|
|
91
|
+
If ``False`` the components are not plotted. (default).
|
|
92
|
+
This may impact in the plot computation time.
|
|
93
|
+
If nets and/or layers is specified, only the components belonging to the specified nets/layers are plotted.
|
|
94
|
+
annotate_component_names: bool, optional
|
|
95
|
+
Whether to add the component names to the plot or not. Default is ``True``.
|
|
96
|
+
plot_vias : bool, optional
|
|
97
|
+
Whether to plot vias (circular and rectangular) or not. This may impact in the plot computation time.
|
|
98
|
+
Default is ``False``.
|
|
99
|
+
show : bool, optional
|
|
100
|
+
Whether to show the plot or not. Default is `True`.
|
|
101
|
+
include_outline : bool, optional
|
|
102
|
+
Whether to include the internal layout outline or not. Default is `True`.
|
|
103
|
+
plot_edges : bool, optional
|
|
104
|
+
Whether to plot polygon edges or not. Default is `True`.
|
|
105
|
+
|
|
106
|
+
Returns
|
|
107
|
+
-------
|
|
108
|
+
(ax, fig)
|
|
109
|
+
Matplotlib ax and figures.
|
|
110
|
+
"""
|
|
111
|
+
|
|
112
|
+
if "plot_components_on_top" in kwargs and top_view:
|
|
113
|
+
plot_components = kwargs["plot_components_on_top"]
|
|
114
|
+
if "plot_components_on_bottom" in kwargs and not top_view:
|
|
115
|
+
plot_components = kwargs["plot_components_on_bottom"]
|
|
116
|
+
|
|
117
|
+
def mirror_poly(poly):
|
|
118
|
+
sign = 1
|
|
119
|
+
if not top_view:
|
|
120
|
+
sign = -1
|
|
121
|
+
return [[sign * i[0], i[1]] for i in poly]
|
|
122
|
+
|
|
123
|
+
import matplotlib.pyplot as plt
|
|
124
|
+
|
|
125
|
+
dpi = 100.0
|
|
126
|
+
figsize = (size[0] / dpi, size[1] / dpi)
|
|
127
|
+
|
|
128
|
+
fig = plt.figure(figsize=figsize)
|
|
129
|
+
ax = fig.add_subplot(1, 1, 1)
|
|
130
|
+
from shapely import affinity
|
|
131
|
+
from shapely.geometry import (
|
|
132
|
+
LinearRing,
|
|
133
|
+
MultiLineString,
|
|
134
|
+
MultiPolygon,
|
|
135
|
+
Point,
|
|
136
|
+
Polygon,
|
|
137
|
+
)
|
|
138
|
+
from shapely.plotting import plot_line, plot_polygon
|
|
139
|
+
|
|
140
|
+
start_time = time.time()
|
|
141
|
+
if not nets:
|
|
142
|
+
nets = list(self.nets.keys())
|
|
143
|
+
if isinstance(nets, str):
|
|
144
|
+
nets = [nets]
|
|
145
|
+
if not layers:
|
|
146
|
+
layers = list(self._pedb.stackup.signal_layers.keys())
|
|
147
|
+
if isinstance(layers, str):
|
|
148
|
+
layers = [layers]
|
|
149
|
+
color_index = 0
|
|
150
|
+
label_colors = {}
|
|
151
|
+
edge_colors = {}
|
|
152
|
+
if outline:
|
|
153
|
+
poly = Polygon(outline)
|
|
154
|
+
plot_line(poly.boundary, add_points=False, color=(0.7, 0, 0), linewidth=4)
|
|
155
|
+
elif include_outline:
|
|
156
|
+
prims = self._pedb.modeler.primitives_by_layer.get("Outline", [])
|
|
157
|
+
if prims:
|
|
158
|
+
for prim in prims:
|
|
159
|
+
if prim.is_void:
|
|
160
|
+
continue
|
|
161
|
+
xt, yt = prim.points()
|
|
162
|
+
p1 = [(i, j) for i, j in zip(xt[::-1], yt[::-1])]
|
|
163
|
+
p1 = mirror_poly(p1)
|
|
164
|
+
poly = LinearRing(p1)
|
|
165
|
+
plot_line(poly, add_points=False, color=(0.7, 0, 0), linewidth=4)
|
|
166
|
+
else:
|
|
167
|
+
bbox = self._pedb.hfss.get_layout_bounding_box()
|
|
168
|
+
if not bbox:
|
|
169
|
+
return False, False
|
|
170
|
+
x1 = bbox[0]
|
|
171
|
+
x2 = bbox[2]
|
|
172
|
+
y1 = bbox[1]
|
|
173
|
+
y2 = bbox[3]
|
|
174
|
+
p = [(x1, y1), (x1, y2), (x2, y2), (x2, y1), (x1, y1)]
|
|
175
|
+
p = mirror_poly(p)
|
|
176
|
+
poly = LinearRing(p)
|
|
177
|
+
plot_line(poly, add_points=False, color=(0.7, 0, 0), linewidth=4)
|
|
178
|
+
layer_colors = {i: k.color for i, k in self._pedb.stackup.layers.items()}
|
|
179
|
+
top_layer = list(self._pedb.stackup.signal_layers.keys())[0]
|
|
180
|
+
bottom_layer = list(self._pedb.stackup.signal_layers.keys())[-1]
|
|
181
|
+
lines = []
|
|
182
|
+
top_comps = []
|
|
183
|
+
bottom_comps = []
|
|
184
|
+
if plot_components:
|
|
185
|
+
nc = 0
|
|
186
|
+
|
|
187
|
+
for comp in self._pedb.components.instances.values():
|
|
188
|
+
if not comp.is_enabled:
|
|
189
|
+
continue
|
|
190
|
+
net_names = comp.nets
|
|
191
|
+
if nets and not any([i in nets for i in net_names]):
|
|
192
|
+
continue
|
|
193
|
+
layer_name = comp.placement_layer
|
|
194
|
+
if layer_name not in layers:
|
|
195
|
+
continue
|
|
196
|
+
if plot_components and top_view and layer_name == top_layer:
|
|
197
|
+
component_color = (0 / 255, 0 / 255, 0 / 255) # this is the color used in AEDT
|
|
198
|
+
label = "Component on top layer"
|
|
199
|
+
label_colors[label] = component_color
|
|
200
|
+
elif plot_components and not top_view and layer_name == bottom_layer:
|
|
201
|
+
component_color = (41 / 255, 41 / 255, 41 / 255) # 41, 171, 135
|
|
202
|
+
label = "Component on bottom layer"
|
|
203
|
+
label_colors[label] = component_color
|
|
204
|
+
else:
|
|
205
|
+
continue
|
|
206
|
+
for pinst in comp.pins.values():
|
|
207
|
+
pdef = pinst.definition
|
|
208
|
+
p_b_l = {i: j for i, j in pdef.pad_by_layer.items()}
|
|
209
|
+
pinst_net_name = pinst.net_name
|
|
210
|
+
if top_view and top_layer in p_b_l and pinst_net_name in nets:
|
|
211
|
+
try:
|
|
212
|
+
shape = p_b_l[top_layer].shape
|
|
213
|
+
if shape.lower() == "circle":
|
|
214
|
+
poly = Point(pinst.position)
|
|
215
|
+
top_comps.append(poly.buffer(p_b_l[top_layer].parameters_values[0] / 2))
|
|
216
|
+
elif shape.lower() == "rectangle":
|
|
217
|
+
px, py = pinst.position
|
|
218
|
+
w, h = p_b_l[top_layer].parameters_values
|
|
219
|
+
poly = [
|
|
220
|
+
[px - w / 2, py - h / 2],
|
|
221
|
+
[px - w / 2, py + h / 2],
|
|
222
|
+
[px + w / 2, py + h / 2],
|
|
223
|
+
[px + w / 2, py - h / 2],
|
|
224
|
+
]
|
|
225
|
+
poly = Polygon(poly)
|
|
226
|
+
top_comps.append(
|
|
227
|
+
affinity.rotate(
|
|
228
|
+
poly,
|
|
229
|
+
(float(p_b_l[top_layer].rotation) + pinst.rotation + comp.rotation)
|
|
230
|
+
/ math.pi
|
|
231
|
+
* 180,
|
|
232
|
+
)
|
|
233
|
+
)
|
|
234
|
+
except KeyError:
|
|
235
|
+
pass
|
|
236
|
+
elif not top_view and bottom_layer in p_b_l and pinst.net_name in nets:
|
|
237
|
+
try:
|
|
238
|
+
shape = p_b_l[bottom_layer].shape
|
|
239
|
+
if shape == "Circle":
|
|
240
|
+
x, y = pinst.position
|
|
241
|
+
poly = Point(-x, y)
|
|
242
|
+
bottom_comps.append(poly.buffer(p_b_l[bottom_layer].parameters_values[0] / 2))
|
|
243
|
+
elif shape == "Rectangle":
|
|
244
|
+
px, py = pinst.position
|
|
245
|
+
w, h = p_b_l[bottom_layer].parameters_values
|
|
246
|
+
poly = [
|
|
247
|
+
[px - w / 2, py - h / 2],
|
|
248
|
+
[px - w / 2, py + h / 2],
|
|
249
|
+
[px + w / 2, py + h / 2],
|
|
250
|
+
[px + w / 2, py - h / 2],
|
|
251
|
+
]
|
|
252
|
+
poly = Polygon(mirror_poly(poly))
|
|
253
|
+
bottom_comps.append(
|
|
254
|
+
affinity.rotate(
|
|
255
|
+
poly,
|
|
256
|
+
-(float(p_b_l[bottom_layer].rotation) + pinst.rotation + comp.rotation)
|
|
257
|
+
/ math.pi
|
|
258
|
+
* 180,
|
|
259
|
+
)
|
|
260
|
+
)
|
|
261
|
+
except KeyError:
|
|
262
|
+
pass
|
|
263
|
+
cbb = comp.bounding_box
|
|
264
|
+
x = [cbb[0], cbb[0], cbb[2], cbb[2]]
|
|
265
|
+
y = [cbb[1], cbb[3], cbb[3], cbb[1]]
|
|
266
|
+
vertices = [(i, j) for i, j in zip(x, y)]
|
|
267
|
+
vertices = mirror_poly(vertices)
|
|
268
|
+
poly = Polygon(vertices)
|
|
269
|
+
lines.append(poly.boundary)
|
|
270
|
+
if annotate_component_names:
|
|
271
|
+
font_size = 6 if poly.area < 6e-6 else 10
|
|
272
|
+
ax.annotate(
|
|
273
|
+
comp.name,
|
|
274
|
+
(poly.centroid.x, poly.centroid.y),
|
|
275
|
+
va="center",
|
|
276
|
+
ha="center",
|
|
277
|
+
color=component_color,
|
|
278
|
+
size=font_size,
|
|
279
|
+
rotation=comp.rotation * 180 / math.pi,
|
|
280
|
+
)
|
|
281
|
+
self._logger.debug("Plotted {} component(s)".format(nc))
|
|
282
|
+
|
|
283
|
+
if top_comps:
|
|
284
|
+
ob = MultiPolygon(top_comps)
|
|
285
|
+
plot_polygon(ob, add_points=False, ax=ax)
|
|
286
|
+
if bottom_comps:
|
|
287
|
+
ob = MultiPolygon(bottom_comps)
|
|
288
|
+
plot_polygon(ob, add_points=False, ax=ax)
|
|
289
|
+
|
|
290
|
+
if lines:
|
|
291
|
+
ob = MultiLineString(lines)
|
|
292
|
+
plot_line(ob, ax=ax, add_points=False, color=(1, 0, 0), linewidth=1)
|
|
293
|
+
|
|
294
|
+
def create_poly(prim, polys, lines):
|
|
295
|
+
if prim.is_void:
|
|
296
|
+
return
|
|
297
|
+
net_name = prim.net_name
|
|
298
|
+
layer_name = prim.layer_name
|
|
299
|
+
if nets and (net_name not in nets or layer_name not in layers):
|
|
300
|
+
return
|
|
301
|
+
# if prim.primitive_type == "path":
|
|
302
|
+
# line = prim.center_line
|
|
303
|
+
# line = mirror_poly(line)
|
|
304
|
+
# poly = LineString(line).buffer(prim.width / 2)
|
|
305
|
+
# else:
|
|
306
|
+
xt, yt = prim.points()
|
|
307
|
+
if len(xt) < 3:
|
|
308
|
+
return
|
|
309
|
+
p1 = [(i, j) for i, j in zip(xt[::-1], yt[::-1])]
|
|
310
|
+
p1 = mirror_poly(p1)
|
|
311
|
+
|
|
312
|
+
holes = []
|
|
313
|
+
for void in prim.voids:
|
|
314
|
+
xvt, yvt = void.points(arc_segments=3)
|
|
315
|
+
if len(xvt) < 3:
|
|
316
|
+
continue
|
|
317
|
+
h1 = mirror_poly([(i, j) for i, j in zip(xvt, yvt)])
|
|
318
|
+
holes.append(h1)
|
|
319
|
+
if len(holes) > 1:
|
|
320
|
+
holes = shapely.union_all([Polygon(i) for i in holes])
|
|
321
|
+
if isinstance(holes, MultiPolygon):
|
|
322
|
+
holes = [i.boundary for i in list(holes.geoms)]
|
|
323
|
+
else:
|
|
324
|
+
holes = [holes.boundary]
|
|
325
|
+
poly = Polygon(p1, holes)
|
|
326
|
+
if layer_name == "Outline":
|
|
327
|
+
if label_colors[label] in lines:
|
|
328
|
+
lines.append(poly.boundary)
|
|
329
|
+
elif poly:
|
|
330
|
+
polys.append(poly)
|
|
331
|
+
return
|
|
332
|
+
|
|
333
|
+
if color_by_net:
|
|
334
|
+
for net in nets:
|
|
335
|
+
prims = self._pedb.nets.nets[net].primitives
|
|
336
|
+
polys = []
|
|
337
|
+
lines = []
|
|
338
|
+
if net not in nets:
|
|
339
|
+
continue
|
|
340
|
+
label = "Net " + net
|
|
341
|
+
label_colors[label] = list(CSS4_COLORS.keys())[color_index]
|
|
342
|
+
try:
|
|
343
|
+
edge_colors[label] = [i * 0.5 for i in label_colors[label]]
|
|
344
|
+
except TypeError:
|
|
345
|
+
edge_colors[label] = label_colors[label]
|
|
346
|
+
color_index += 1
|
|
347
|
+
if color_index >= len(CSS4_COLORS):
|
|
348
|
+
color_index = 0
|
|
349
|
+
for prim in prims:
|
|
350
|
+
create_poly(prim, polys, lines)
|
|
351
|
+
if polys:
|
|
352
|
+
ob = MultiPolygon(polys)
|
|
353
|
+
plot_polygon(
|
|
354
|
+
ob,
|
|
355
|
+
ax=ax,
|
|
356
|
+
color=label_colors[label],
|
|
357
|
+
add_points=False,
|
|
358
|
+
alpha=0.7,
|
|
359
|
+
label=label,
|
|
360
|
+
edgecolor="none" if not plot_edges else edge_colors[label],
|
|
361
|
+
)
|
|
362
|
+
if lines:
|
|
363
|
+
ob = MultiLineString(p)
|
|
364
|
+
plot_line(ob, ax=ax, add_points=False, color=label_colors[label], linewidth=1, label=label)
|
|
365
|
+
else:
|
|
366
|
+
prims_by_layers_dict = {i: j for i, j in self._pedb.modeler.primitives_by_layer.items()}
|
|
367
|
+
if not top_view:
|
|
368
|
+
prims_by_layers_dict = {
|
|
369
|
+
i: prims_by_layers_dict[i] for i in reversed(self._pedb.modeler.primitives_by_layer.keys())
|
|
370
|
+
}
|
|
371
|
+
num_layers = len(layers)
|
|
372
|
+
delta_alpha = 0.7 / num_layers
|
|
373
|
+
alpha = 0.3
|
|
374
|
+
for layer, prims in prims_by_layers_dict.items():
|
|
375
|
+
polys = []
|
|
376
|
+
lines = []
|
|
377
|
+
if layer not in layers:
|
|
378
|
+
continue
|
|
379
|
+
label = "Layer " + layer
|
|
380
|
+
if label not in label_colors:
|
|
381
|
+
try:
|
|
382
|
+
color = layer_colors[layer]
|
|
383
|
+
c = (
|
|
384
|
+
float(color[0] / 255),
|
|
385
|
+
float(color[1] / 255),
|
|
386
|
+
float(color[2] / 255),
|
|
387
|
+
)
|
|
388
|
+
except:
|
|
389
|
+
c = list(CSS4_COLORS.keys())[color_index]
|
|
390
|
+
color_index += 1
|
|
391
|
+
if color_index >= len(CSS4_COLORS):
|
|
392
|
+
color_index = 0
|
|
393
|
+
label_colors[label] = c
|
|
394
|
+
try:
|
|
395
|
+
edge_colors[label] = [i * 0.5 for i in c]
|
|
396
|
+
except TypeError:
|
|
397
|
+
edge_colors[label] = label_colors[label]
|
|
398
|
+
for prim in prims:
|
|
399
|
+
create_poly(prim, polys, lines)
|
|
400
|
+
if polys:
|
|
401
|
+
ob = MultiPolygon(polys)
|
|
402
|
+
plot_polygon(
|
|
403
|
+
ob,
|
|
404
|
+
ax=ax,
|
|
405
|
+
color=label_colors[label],
|
|
406
|
+
add_points=False,
|
|
407
|
+
alpha=alpha,
|
|
408
|
+
label=label,
|
|
409
|
+
edgecolor="none" if not plot_edges else edge_colors[label],
|
|
410
|
+
)
|
|
411
|
+
if lines:
|
|
412
|
+
ob = MultiLineString(p)
|
|
413
|
+
plot_line(ob, ax=ax, add_points=False, color=label_colors[label], linewidth=1, label=label)
|
|
414
|
+
alpha = alpha + delta_alpha
|
|
415
|
+
|
|
416
|
+
if plot_vias:
|
|
417
|
+
polys = []
|
|
418
|
+
|
|
419
|
+
for pinst in self._pedb.padstacks.instances.values():
|
|
420
|
+
if pinst.is_pin:
|
|
421
|
+
continue
|
|
422
|
+
pdef = pinst.definition
|
|
423
|
+
p_b_l = {i: j for i, j in pdef.pad_by_layer.items()}
|
|
424
|
+
pinst_net_name = pinst.net_name
|
|
425
|
+
if top_view and pinst_net_name in nets:
|
|
426
|
+
for k in range(len(layers)):
|
|
427
|
+
if layers[k] in p_b_l.keys():
|
|
428
|
+
pad_value = p_b_l[layers[k]]
|
|
429
|
+
break
|
|
430
|
+
elif not top_view and pinst_net_name in nets:
|
|
431
|
+
rev_layers = list(reversed(layers))
|
|
432
|
+
for k in range(len(rev_layers)):
|
|
433
|
+
if rev_layers[k] in p_b_l.keys():
|
|
434
|
+
pad_value = p_b_l[rev_layers[k]]
|
|
435
|
+
break
|
|
436
|
+
else:
|
|
437
|
+
continue
|
|
438
|
+
try:
|
|
439
|
+
shape = pad_value.shape
|
|
440
|
+
if shape.lower() == "circle":
|
|
441
|
+
x, y = pinst.position
|
|
442
|
+
if top_view:
|
|
443
|
+
poly = Point(pinst.position)
|
|
444
|
+
else:
|
|
445
|
+
poly = Point(-x, y)
|
|
446
|
+
polys.append(poly.buffer(p_b_l[top_layer].parameters_values[0] / 2))
|
|
447
|
+
elif shape.lower() == "rectangle":
|
|
448
|
+
px, py = pinst.position
|
|
449
|
+
w, h = pad_value.parameters_values
|
|
450
|
+
poly = [
|
|
451
|
+
[px - w / 2, py - h / 2],
|
|
452
|
+
[px - w / 2, py + h / 2],
|
|
453
|
+
[px + w / 2, py + h / 2],
|
|
454
|
+
[px + w / 2, py - h / 2],
|
|
455
|
+
]
|
|
456
|
+
poly = Polygon(mirror_poly(poly))
|
|
457
|
+
polys.append(
|
|
458
|
+
affinity.rotate(
|
|
459
|
+
poly, (float(pad_value.rotation) + pinst.rotation + comp.rotation) / math.pi * 180
|
|
460
|
+
)
|
|
461
|
+
)
|
|
462
|
+
except KeyError:
|
|
463
|
+
pass
|
|
464
|
+
if polys:
|
|
465
|
+
ob = MultiPolygon(polys)
|
|
466
|
+
plot_polygon(ob, add_points=False, ax=ax, edgecolor="none")
|
|
467
|
+
# Hide grid lines
|
|
468
|
+
ax.grid(False)
|
|
469
|
+
ax.set_axis_off()
|
|
470
|
+
# Hide axes ticks
|
|
471
|
+
ax.set_xticks([])
|
|
472
|
+
ax.set_yticks([])
|
|
473
|
+
message = "Edb Top View" if top_view else "Edb Bottom View"
|
|
474
|
+
plt.title(message, size=20)
|
|
475
|
+
if show_legend:
|
|
476
|
+
plt.legend(loc="upper left", fontsize="x-large")
|
|
477
|
+
end_time = time.time() - start_time
|
|
478
|
+
self._logger.info(f"Plot Generation time {round(end_time, 3)}")
|
|
479
|
+
if save_plot:
|
|
480
|
+
plt.savefig(save_plot)
|
|
481
|
+
if show: # pragma: no cover
|
|
482
|
+
if is_notebook():
|
|
483
|
+
pass
|
|
484
|
+
elif is_ipython() or "PYTEST_CURRENT_TEST" in os.environ:
|
|
485
|
+
fig.show()
|
|
486
|
+
else:
|
|
487
|
+
plt.show()
|
|
488
|
+
return fig, ax
|
|
@@ -39,3 +39,23 @@ class CfgBase:
|
|
|
39
39
|
if attr not in dir(pedb_object):
|
|
40
40
|
raise AttributeError(f"Invalid attribute '{attr}' in '{pedb_object}'")
|
|
41
41
|
setattr(pedb_object, attr, value)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class CfgVar:
|
|
45
|
+
def __init__(self, **kwargs):
|
|
46
|
+
self.name = kwargs["name"]
|
|
47
|
+
self.value = kwargs["value"]
|
|
48
|
+
self.description = kwargs.get("description", "")
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class CfgVariables:
|
|
52
|
+
def __init__(self, pedb, data):
|
|
53
|
+
self._pedb = pedb
|
|
54
|
+
self.variables = [CfgVar(**i) for i in data]
|
|
55
|
+
|
|
56
|
+
def apply(self):
|
|
57
|
+
for i in self.variables:
|
|
58
|
+
if i.name.startswith("$"):
|
|
59
|
+
self._pedb.add_project_variable(i.name, i.value)
|
|
60
|
+
else:
|
|
61
|
+
self._pedb.add_design_variable(i.name, i.value)
|