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.

Files changed (194) hide show
  1. {pyedb-0.35.0 → pyedb-0.36.0}/PKG-INFO +1 -1
  2. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/__init__.py +1 -1
  3. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/cfg_ports_sources.py +33 -1
  4. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb.py +11 -4
  5. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/primitive/primitive.py +64 -0
  6. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/control_file.py +60 -13
  7. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/padstacks_data.py +22 -64
  8. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/padstack.py +25 -6
  9. {pyedb-0.35.0 → pyedb-0.36.0}/LICENSE +0 -0
  10. {pyedb-0.35.0 → pyedb-0.36.0}/README.md +0 -0
  11. {pyedb-0.35.0 → pyedb-0.36.0}/pyproject.toml +0 -0
  12. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/common/__init__.py +0 -0
  13. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/common/nets.py +0 -0
  14. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/component_libraries/ansys_components.py +0 -0
  15. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/__init__.py +0 -0
  16. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/cfg_boundaries.py +0 -0
  17. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/cfg_common.py +0 -0
  18. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/cfg_components.py +0 -0
  19. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/cfg_data.py +0 -0
  20. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/cfg_general.py +0 -0
  21. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/cfg_modeler.py +0 -0
  22. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/cfg_nets.py +0 -0
  23. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/cfg_operations.py +0 -0
  24. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/cfg_package_definition.py +0 -0
  25. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/cfg_padstacks.py +0 -0
  26. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/cfg_pin_groups.py +0 -0
  27. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/cfg_s_parameter_models.py +0 -0
  28. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/cfg_setup.py +0 -0
  29. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/cfg_spice_models.py +0 -0
  30. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/cfg_stackup.py +0 -0
  31. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/configuration/configuration.py +0 -0
  32. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/__init__.py +0 -0
  33. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/application/Variables.py +0 -0
  34. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/application/__init__.py +0 -0
  35. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/clr_module.py +0 -0
  36. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/__init__.py +0 -0
  37. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/__init__.py +0 -0
  38. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/connectable.py +0 -0
  39. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/__init__.py +0 -0
  40. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/component.py +0 -0
  41. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/hierarchy_obj.py +0 -0
  42. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/model.py +0 -0
  43. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/netlist_model.py +0 -0
  44. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/pin_pair_model.py +0 -0
  45. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/s_parameter_model.py +0 -0
  46. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/spice_model.py +0 -0
  47. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/layout.py +0 -0
  48. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/layout_obj.py +0 -0
  49. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/primitive/__init__.py +0 -0
  50. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/primitive/bondwire.py +0 -0
  51. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/primitive/path.py +0 -0
  52. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/terminal/__init__.py +0 -0
  53. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/terminal/bundle_terminal.py +0 -0
  54. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/terminal/edge_terminal.py +0 -0
  55. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/terminal/padstack_instance_terminal.py +0 -0
  56. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/terminal/pingroup_terminal.py +0 -0
  57. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/terminal/point_terminal.py +0 -0
  58. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/terminal/terminal.py +0 -0
  59. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/cell/voltage_regulator.py +0 -0
  60. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/components.py +0 -0
  61. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/definition/__init__.py +0 -0
  62. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/definition/component_def.py +0 -0
  63. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/definition/component_model.py +0 -0
  64. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/definition/definition_obj.py +0 -0
  65. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/definition/definitions.py +0 -0
  66. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/definition/package_def.py +0 -0
  67. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/dotnet/__init__.py +0 -0
  68. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/dotnet/database.py +0 -0
  69. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/dotnet/primitive.py +0 -0
  70. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/__init__.py +0 -0
  71. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/design_options.py +0 -0
  72. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/edbvalue.py +0 -0
  73. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/hfss_extent_info.py +0 -0
  74. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/layer_data.py +0 -0
  75. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/nets_data.py +0 -0
  76. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/ports.py +0 -0
  77. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/primitives_data.py +0 -0
  78. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/raptor_x_simulation_setup_data.py +0 -0
  79. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/simulation_configuration.py +0 -0
  80. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/sources.py +0 -0
  81. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/utilities.py +0 -0
  82. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/edb_data/variables.py +0 -0
  83. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/general.py +0 -0
  84. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/geometry/__init__.py +0 -0
  85. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/geometry/point_data.py +0 -0
  86. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/geometry/polygon_data.py +0 -0
  87. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/hfss.py +0 -0
  88. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/layout_obj_instance.py +0 -0
  89. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/layout_validation.py +0 -0
  90. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/materials.py +0 -0
  91. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/modeler.py +0 -0
  92. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/net_class.py +0 -0
  93. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/nets.py +0 -0
  94. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/sim_setup_data/__init__.py +0 -0
  95. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/__init__.py +0 -0
  96. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/adaptive_frequency_data.py +0 -0
  97. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/mesh_operation.py +0 -0
  98. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/settings.py +0 -0
  99. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/sim_setup_info.py +0 -0
  100. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/simulation_settings.py +0 -0
  101. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/siw_dc_ir_settings.py +0 -0
  102. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/sweep_data.py +0 -0
  103. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/sim_setup_data/io/__init__.py +0 -0
  104. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/sim_setup_data/io/siwave.py +0 -0
  105. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/siwave.py +0 -0
  106. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/stackup.py +0 -0
  107. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/utilities/__init__.py +0 -0
  108. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/utilities/heatsink.py +0 -0
  109. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/utilities/hfss_simulation_setup.py +0 -0
  110. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/utilities/obj_base.py +0 -0
  111. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/utilities/simulation_setup.py +0 -0
  112. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/dotnet/edb_core/utilities/siwave_simulation_setup.py +0 -0
  113. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/edb_logger.py +0 -0
  114. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/exceptions.py +0 -0
  115. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/generic/__init__.py +0 -0
  116. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/generic/constants.py +0 -0
  117. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/generic/data_handlers.py +0 -0
  118. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/generic/design_types.py +0 -0
  119. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/generic/filesystem.py +0 -0
  120. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/generic/general_methods.py +0 -0
  121. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/generic/plot.py +0 -0
  122. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/generic/process.py +0 -0
  123. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/generic/settings.py +0 -0
  124. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/__init__.py +0 -0
  125. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/bom/__init__.py +0 -0
  126. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/bom/bom.py +0 -0
  127. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/bom/bom_item.py +0 -0
  128. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/bom/characteristics.py +0 -0
  129. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/bom/refdes.py +0 -0
  130. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/content/__init__.py +0 -0
  131. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/content/color.py +0 -0
  132. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/content/content.py +0 -0
  133. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/content/dictionary_color.py +0 -0
  134. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/content/dictionary_fill.py +0 -0
  135. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/content/dictionary_line.py +0 -0
  136. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/content/entry_color.py +0 -0
  137. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/content/entry_line.py +0 -0
  138. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/content/fill.py +0 -0
  139. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/content/layer_ref.py +0 -0
  140. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/content/standard_geometries_dictionary.py +0 -0
  141. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/__init__.py +0 -0
  142. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/__init__.py +0 -0
  143. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/assembly_drawing.py +0 -0
  144. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/cad_data.py +0 -0
  145. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/component.py +0 -0
  146. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/drill.py +0 -0
  147. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/feature.py +0 -0
  148. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/layer.py +0 -0
  149. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/layer_feature.py +0 -0
  150. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/logical_net.py +0 -0
  151. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/outline.py +0 -0
  152. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/package.py +0 -0
  153. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/padstack_def.py +0 -0
  154. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/padstack_hole_def.py +0 -0
  155. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/padstack_instance.py +0 -0
  156. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/padstack_pad_def.py +0 -0
  157. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/path.py +0 -0
  158. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/phy_net.py +0 -0
  159. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/pin.py +0 -0
  160. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/polygon.py +0 -0
  161. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/profile.py +0 -0
  162. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/stackup.py +0 -0
  163. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/stackup_group.py +0 -0
  164. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/stackup_layer.py +0 -0
  165. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_data/step.py +0 -0
  166. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/cad_header.py +0 -0
  167. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/ecad.py +0 -0
  168. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ecad/spec.py +0 -0
  169. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/history_record.py +0 -0
  170. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/ipc2581.py +0 -0
  171. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/ipc2581/logistic_header.py +0 -0
  172. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/__init__.py +0 -0
  173. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/aedtlib_personalib_install.py +0 -0
  174. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/downloads.py +0 -0
  175. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/misc.py +0 -0
  176. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/pyedb.runtimeconfig.json +0 -0
  177. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/__init__.py +0 -0
  178. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/emc/__init__.py +0 -0
  179. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/emc/component_tags.py +0 -0
  180. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/emc/net_tags.py +0 -0
  181. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/emc/tag_library.py +0 -0
  182. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/emc/xml_generic.py +0 -0
  183. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/emc_rule_checker_settings.py +0 -0
  184. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/xtalk_scan/fd_xtalk_scan_config.py +0 -0
  185. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/xtalk_scan/impedance_scan_config.py +0 -0
  186. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/xtalk_scan/net.py +0 -0
  187. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/xtalk_scan/pins.py +0 -0
  188. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/xtalk_scan/scan_config.py +0 -0
  189. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/siw_feature_config/xtalk_scan/td_xtalk_config.py +0 -0
  190. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/misc/utilities.py +0 -0
  191. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/modeler/geometry_operators.py +0 -0
  192. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/siwave.py +0 -0
  193. {pyedb-0.35.0 → pyedb-0.36.0}/src/pyedb/siwave_core/icepak.py +0 -0
  194. {pyedb-0.35.0 → 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.35.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>
@@ -44,7 +44,7 @@ deprecation_warning()
44
44
  #
45
45
 
46
46
  pyedb_path = os.path.dirname(__file__)
47
- __version__ = "0.35.0"
47
+ __version__ = "0.36.0"
48
48
  version = __version__
49
49
 
50
50
  #
@@ -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.positive_terminal_info.point_y]
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 = [anstranslator_full_path, inputGDS, f'-g="{map_file}"', f'-c="{control_file}"']
1539
+ command = [path, inputGDS, f'-g="{map_file}"', f'-c="{control_file}"']
1533
1540
  else:
1534
1541
  command = [
1535
- anstranslator_full_path,
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 = "1GHz"
973
- self.maxpasses = 10
974
- self.max_delta = 0.02
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, frequency):
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 name.
1092
- frequency : str
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
- if self.boundaries.ports or self.boundaries.extents:
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
- @property
1252
- def _em_properties(self):
1253
- """Get EM properties."""
1254
- default = (
1255
- r"$begin 'EM properties'\n"
1256
- r"\tType('Mesh')\n"
1257
- r"\tDataId='EM properties1'\n"
1258
- r"\t$begin 'Properties'\n"
1259
- r"\t\tGeneral=''\n"
1260
- r"\t\tModeled='true'\n"
1261
- r"\t\tUnion='true'\n"
1262
- r"\t\t'Use Precedence'='false'\n"
1263
- r"\t\t'Precedence Value'='1'\n"
1264
- r"\t\tPlanarEM=''\n"
1265
- r"\t\tRefined='true'\n"
1266
- r"\t\tRefineFactor='1'\n"
1267
- r"\t\tNoEdgeMesh='false'\n"
1268
- r"\t\tHFSS=''\n"
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
- Returns
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 False
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
- if not start_layer:
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
- [self.instances[id].delete() for id in instances]
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