pyedb 0.26.3__tar.gz → 0.28.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 (191) hide show
  1. {pyedb-0.26.3 → pyedb-0.28.0}/PKG-INFO +4 -4
  2. {pyedb-0.26.3 → pyedb-0.28.0}/pyproject.toml +3 -3
  3. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/__init__.py +1 -1
  4. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/configuration/cfg_data.py +1 -1
  5. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/configuration/cfg_operations.py +5 -3
  6. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/configuration/cfg_padstacks.py +43 -36
  7. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/configuration/cfg_pin_groups.py +7 -8
  8. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/configuration/cfg_spice_models.py +3 -2
  9. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/configuration/configuration.py +14 -3
  10. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/application/Variables.py +43 -41
  11. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/cell/connectable.py +21 -0
  12. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/component.py +46 -18
  13. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/cell/layout.py +29 -22
  14. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/cell/primitive/primitive.py +1 -22
  15. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/cell/terminal/pingroup_terminal.py +3 -3
  16. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/cell/terminal/terminal.py +0 -10
  17. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/components.py +2 -2
  18. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/definition/component_def.py +13 -3
  19. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/edb_data/padstacks_data.py +251 -69
  20. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/edb_data/primitives_data.py +2 -2
  21. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/general.py +11 -0
  22. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/geometry/polygon_data.py +13 -0
  23. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/layout_validation.py +1 -1
  24. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/modeler.py +5 -2
  25. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/padstack.py +1 -1
  26. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/utilities/obj_base.py +0 -13
  27. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/edb_logger.py +1 -1
  28. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/siwave.py +33 -7
  29. {pyedb-0.26.3 → pyedb-0.28.0}/LICENSE +0 -0
  30. {pyedb-0.26.3 → pyedb-0.28.0}/README.md +0 -0
  31. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/component_libraries/ansys_components.py +0 -0
  32. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/configuration/__init__.py +0 -0
  33. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/configuration/cfg_boundaries.py +0 -0
  34. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/configuration/cfg_common.py +0 -0
  35. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/configuration/cfg_components.py +0 -0
  36. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/configuration/cfg_general.py +0 -0
  37. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/configuration/cfg_nets.py +0 -0
  38. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/configuration/cfg_package_definition.py +0 -0
  39. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/configuration/cfg_ports_sources.py +0 -0
  40. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/configuration/cfg_s_parameter_models.py +0 -0
  41. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/configuration/cfg_setup.py +0 -0
  42. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/configuration/cfg_stackup.py +0 -0
  43. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/__init__.py +0 -0
  44. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/application/__init__.py +0 -0
  45. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/clr_module.py +0 -0
  46. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb.py +0 -0
  47. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/__init__.py +0 -0
  48. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/cell/__init__.py +0 -0
  49. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/__init__.py +0 -0
  50. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/hierarchy_obj.py +0 -0
  51. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/model.py +0 -0
  52. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/netlist_model.py +0 -0
  53. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/pin_pair_model.py +0 -0
  54. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/s_parameter_model.py +0 -0
  55. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/spice_model.py +0 -0
  56. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/cell/layout_obj.py +0 -0
  57. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/cell/primitive/__init__.py +0 -0
  58. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/cell/primitive/bondwire.py +0 -0
  59. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/cell/primitive/path.py +0 -0
  60. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/cell/terminal/__init__.py +0 -0
  61. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/cell/terminal/bundle_terminal.py +0 -0
  62. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/cell/terminal/edge_terminal.py +0 -0
  63. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/cell/terminal/padstack_instance_terminal.py +0 -0
  64. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/cell/terminal/point_terminal.py +0 -0
  65. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/cell/voltage_regulator.py +0 -0
  66. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/definition/__init__.py +0 -0
  67. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/definition/component_model.py +0 -0
  68. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/definition/definition_obj.py +0 -0
  69. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/definition/definitions.py +0 -0
  70. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/definition/package_def.py +0 -0
  71. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/dotnet/__init__.py +0 -0
  72. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/dotnet/database.py +0 -0
  73. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/dotnet/primitive.py +0 -0
  74. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/edb_data/__init__.py +0 -0
  75. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/edb_data/control_file.py +0 -0
  76. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/edb_data/design_options.py +0 -0
  77. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/edb_data/edbvalue.py +0 -0
  78. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/edb_data/hfss_extent_info.py +0 -0
  79. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/edb_data/layer_data.py +0 -0
  80. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/edb_data/nets_data.py +0 -0
  81. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/edb_data/ports.py +0 -0
  82. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/edb_data/raptor_x_simulation_setup_data.py +0 -0
  83. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/edb_data/simulation_configuration.py +0 -0
  84. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/edb_data/sources.py +0 -0
  85. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/edb_data/utilities.py +0 -0
  86. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/edb_data/variables.py +0 -0
  87. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/geometry/__init__.py +0 -0
  88. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/geometry/point_data.py +0 -0
  89. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/hfss.py +0 -0
  90. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/layout_obj_instance.py +0 -0
  91. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/materials.py +0 -0
  92. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/net_class.py +0 -0
  93. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/nets.py +0 -0
  94. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/sim_setup_data/__init__.py +0 -0
  95. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/__init__.py +0 -0
  96. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/adaptive_frequency_data.py +0 -0
  97. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/mesh_operation.py +0 -0
  98. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/settings.py +0 -0
  99. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/sim_setup_info.py +0 -0
  100. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/simulation_settings.py +0 -0
  101. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/siw_dc_ir_settings.py +0 -0
  102. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/sweep_data.py +0 -0
  103. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/sim_setup_data/io/__init__.py +0 -0
  104. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/sim_setup_data/io/siwave.py +0 -0
  105. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/siwave.py +0 -0
  106. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/stackup.py +0 -0
  107. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/utilities/__init__.py +0 -0
  108. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/utilities/heatsink.py +0 -0
  109. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/utilities/hfss_simulation_setup.py +0 -0
  110. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/utilities/simulation_setup.py +0 -0
  111. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/dotnet/edb_core/utilities/siwave_simulation_setup.py +0 -0
  112. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/exceptions.py +0 -0
  113. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/generic/__init__.py +0 -0
  114. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/generic/constants.py +0 -0
  115. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/generic/data_handlers.py +0 -0
  116. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/generic/design_types.py +0 -0
  117. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/generic/filesystem.py +0 -0
  118. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/generic/general_methods.py +0 -0
  119. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/generic/plot.py +0 -0
  120. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/generic/process.py +0 -0
  121. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/generic/settings.py +0 -0
  122. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/__init__.py +0 -0
  123. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/bom/__init__.py +0 -0
  124. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/bom/bom.py +0 -0
  125. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/bom/bom_item.py +0 -0
  126. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/bom/characteristics.py +0 -0
  127. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/bom/refdes.py +0 -0
  128. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/content/__init__.py +0 -0
  129. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/content/color.py +0 -0
  130. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/content/content.py +0 -0
  131. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/content/dictionary_color.py +0 -0
  132. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/content/dictionary_fill.py +0 -0
  133. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/content/dictionary_line.py +0 -0
  134. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/content/entry_color.py +0 -0
  135. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/content/entry_line.py +0 -0
  136. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/content/fill.py +0 -0
  137. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/content/layer_ref.py +0 -0
  138. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/content/standard_geometries_dictionary.py +0 -0
  139. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/ecad/__init__.py +0 -0
  140. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/ecad/cad_data/__init__.py +0 -0
  141. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/ecad/cad_data/assembly_drawing.py +0 -0
  142. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/ecad/cad_data/cad_data.py +0 -0
  143. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/ecad/cad_data/component.py +0 -0
  144. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/ecad/cad_data/drill.py +0 -0
  145. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/ecad/cad_data/feature.py +0 -0
  146. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/ecad/cad_data/layer.py +0 -0
  147. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/ecad/cad_data/layer_feature.py +0 -0
  148. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/ecad/cad_data/logical_net.py +0 -0
  149. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/ecad/cad_data/outline.py +0 -0
  150. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/ecad/cad_data/package.py +0 -0
  151. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/ecad/cad_data/padstack_def.py +0 -0
  152. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/ecad/cad_data/padstack_hole_def.py +0 -0
  153. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/ecad/cad_data/padstack_instance.py +0 -0
  154. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/ecad/cad_data/padstack_pad_def.py +0 -0
  155. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/ecad/cad_data/path.py +0 -0
  156. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/ecad/cad_data/phy_net.py +0 -0
  157. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/ecad/cad_data/pin.py +0 -0
  158. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/ecad/cad_data/polygon.py +0 -0
  159. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/ecad/cad_data/profile.py +0 -0
  160. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/ecad/cad_data/stackup.py +0 -0
  161. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/ecad/cad_data/stackup_group.py +0 -0
  162. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/ecad/cad_data/stackup_layer.py +0 -0
  163. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/ecad/cad_data/step.py +0 -0
  164. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/ecad/cad_header.py +0 -0
  165. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/ecad/ecad.py +0 -0
  166. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/ecad/spec.py +0 -0
  167. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/history_record.py +0 -0
  168. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/ipc2581.py +0 -0
  169. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/ipc2581/logistic_header.py +0 -0
  170. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/misc/__init__.py +0 -0
  171. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/misc/aedtlib_personalib_install.py +0 -0
  172. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/misc/downloads.py +0 -0
  173. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/misc/misc.py +0 -0
  174. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/misc/pyedb.runtimeconfig.json +0 -0
  175. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/misc/siw_feature_config/__init__.py +0 -0
  176. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/misc/siw_feature_config/emc/__init__.py +0 -0
  177. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/misc/siw_feature_config/emc/component_tags.py +0 -0
  178. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/misc/siw_feature_config/emc/net_tags.py +0 -0
  179. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/misc/siw_feature_config/emc/tag_library.py +0 -0
  180. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/misc/siw_feature_config/emc/xml_generic.py +0 -0
  181. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/misc/siw_feature_config/emc_rule_checker_settings.py +0 -0
  182. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/misc/siw_feature_config/xtalk_scan/fd_xtalk_scan_config.py +0 -0
  183. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/misc/siw_feature_config/xtalk_scan/impedance_scan_config.py +0 -0
  184. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/misc/siw_feature_config/xtalk_scan/net.py +0 -0
  185. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/misc/siw_feature_config/xtalk_scan/pins.py +0 -0
  186. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/misc/siw_feature_config/xtalk_scan/scan_config.py +0 -0
  187. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/misc/siw_feature_config/xtalk_scan/td_xtalk_config.py +0 -0
  188. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/misc/utilities.py +0 -0
  189. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/modeler/geometry_operators.py +0 -0
  190. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/siwave_core/icepak.py +0 -0
  191. {pyedb-0.26.3 → pyedb-0.28.0}/src/pyedb/workflow.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyedb
3
- Version: 0.26.3
3
+ Version: 0.28.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>
@@ -19,9 +19,9 @@ Requires-Dist: cffi>=1.16.0,<1.18; platform_system=='Linux'
19
19
  Requires-Dist: pywin32 >= 303;platform_system=='Windows'
20
20
  Requires-Dist: ansys-pythonnet >= 3.1.0rc3
21
21
  Requires-Dist: dotnetcore2 ==3.1.23;platform_system=='Linux'
22
- Requires-Dist: numpy>=1.20.0,<2.2
22
+ Requires-Dist: numpy>=1.20.0,<2
23
23
  Requires-Dist: pandas>=1.1.0,<2.3
24
- Requires-Dist: pydantic>=2.6.4,<2.9
24
+ Requires-Dist: pydantic>=2.6.4,<2.10
25
25
  Requires-Dist: Rtree >= 1.2.0
26
26
  Requires-Dist: toml == 0.10.2
27
27
  Requires-Dist: scikit-rf
@@ -37,7 +37,7 @@ Requires-Dist: numpydoc>=1.5.0,<1.9 ; extra == "doc"
37
37
  Requires-Dist: pypandoc>=1.10.0,<1.14 ; extra == "doc"
38
38
  Requires-Dist: recommonmark ; extra == "doc"
39
39
  Requires-Dist: Sphinx>=7.1.0,<8.1 ; extra == "doc"
40
- Requires-Dist: sphinx-autobuild==2024.2.4 ; extra == "doc" and ( python_version == '3.8')
40
+ Requires-Dist: sphinx-autobuild==2021.3.14 ; extra == "doc" and ( python_version == '3.8')
41
41
  Requires-Dist: sphinx-autobuild==2024.2.4 ; extra == "doc" and ( python_version > '3.8')
42
42
  Requires-Dist: sphinx-copybutton>=0.5.0,<0.6 ; extra == "doc"
43
43
  Requires-Dist: sphinx-gallery>=0.14.0,<0.18 ; extra == "doc"
@@ -29,9 +29,9 @@ dependencies = [
29
29
  "pywin32 >= 303;platform_system=='Windows'",
30
30
  "ansys-pythonnet >= 3.1.0rc3",
31
31
  "dotnetcore2 ==3.1.23;platform_system=='Linux'",
32
- "numpy>=1.20.0,<2.2",
32
+ "numpy>=1.20.0,<2",
33
33
  "pandas>=1.1.0,<2.3",
34
- "pydantic>=2.6.4,<2.9",
34
+ "pydantic>=2.6.4,<2.10",
35
35
  "Rtree >= 1.2.0",
36
36
  "toml == 0.10.2",
37
37
  "scikit-rf"
@@ -60,7 +60,7 @@ doc = [
60
60
  # NOTE: Remove recommonmark once examples are reworked.
61
61
  "recommonmark",
62
62
  "Sphinx>=7.1.0,<8.1",
63
- "sphinx-autobuild==2024.2.4; python_version == '3.8'",
63
+ "sphinx-autobuild==2021.3.14; python_version == '3.8'",
64
64
  "sphinx-autobuild==2024.2.4; python_version > '3.8'",
65
65
  "sphinx-copybutton>=0.5.0,<0.6",
66
66
  "sphinx-gallery>=0.14.0,<0.18",
@@ -44,7 +44,7 @@ deprecation_warning()
44
44
  #
45
45
 
46
46
  pyedb_path = os.path.dirname(__file__)
47
- __version__ = "0.26.3"
47
+ __version__ = "0.28.0"
48
48
  version = __version__
49
49
 
50
50
  #
@@ -53,7 +53,7 @@ class CfgData(object):
53
53
 
54
54
  self.components = CfgComponents(self._pedb, components_data=kwargs.get("components", []))
55
55
 
56
- self.padstacks = CfgPadstacks(self, kwargs.get("padstacks", None))
56
+ self.padstacks = CfgPadstacks(self._pedb, kwargs.get("padstacks", None))
57
57
 
58
58
  self.pin_groups = CfgPinGroups(self._pedb, pingroup_data=kwargs.get("pin_groups", []))
59
59
 
@@ -65,7 +65,7 @@ class CfgCutout(CfgBase):
65
65
 
66
66
  self.reference_list = []
67
67
  self.signal_list = net_names
68
- return self.export_properties()
68
+ return self.export_properties()
69
69
 
70
70
  def export_properties(self):
71
71
  return {
@@ -84,7 +84,7 @@ class CfgOperations(CfgBase):
84
84
  """Imports operation information from JSON."""
85
85
  if self.op_cutout:
86
86
  polygon_points = self._pedb.cutout(**self.op_cutout.get_attributes())
87
- if not "pyedb_cutout" in self._pedb.stackup.all_layers:
87
+ if "pyedb_cutout" not in self._pedb.stackup.all_layers:
88
88
  self._pedb.stackup.add_document_layer(name="pyedb_cutout")
89
89
  self._pedb.modeler.create_polygon(polygon_points, layer_name="pyedb_cutout", net_name="pyedb_cutout")
90
90
 
@@ -92,4 +92,6 @@ class CfgOperations(CfgBase):
92
92
 
93
93
  def get_data_from_db(self):
94
94
  self.op_cutout = CfgCutout(self._pedb)
95
- return {"cutout": self.op_cutout.get_data_from_db()}
95
+ data_from_db = self.op_cutout.get_data_from_db()
96
+ if data_from_db:
97
+ return {"cutout": data_from_db}
@@ -23,62 +23,69 @@
23
23
 
24
24
  from enum import Enum
25
25
 
26
+ from pyedb.configuration.cfg_common import CfgBase
27
+
26
28
 
27
29
  class CfgPadstacks:
28
30
  """Padstack data class."""
29
31
 
30
- def __init__(self, pdata, padstack_dict=None):
31
- self._pedb = pdata._pedb
32
+ def __init__(self, pedb, padstack_dict=None):
33
+ self._pedb = pedb
32
34
  self.definitions = []
33
35
  self.instances = []
34
- self._padstack_dict = padstack_dict
35
- if self._padstack_dict:
36
- if self._padstack_dict.get("definitions", ""):
37
- self._definitions_dict = self._padstack_dict.get("definitions", "")
38
- self.definitions = [Definition(pdata, definition) for definition in self._definitions_dict]
39
- if self._padstack_dict.get("instances", None):
40
- self._instances_dict = self._padstack_dict.get("instances", "")
41
- self.instances = [Instance(pdata, inst) for inst in self._instances_dict]
36
+ if padstack_dict:
37
+ for pdef in padstack_dict.get("definitions", []):
38
+ self.definitions.append(Definition(**pdef))
39
+ for inst in padstack_dict.get("instances", []):
40
+ self.instances.append(Instance(self._pedb, inst))
42
41
 
43
42
  def apply(self):
44
43
  """Apply padstack definition and instances on layout."""
45
- for definition in self.definitions:
46
- definition.apply()
44
+ padstack_defs_layout = self._pedb.padstacks.definitions
45
+ for pdef in self.definitions:
46
+ pdef_layout = padstack_defs_layout[pdef.name]
47
+ pdef_layout.set_properties(**pdef.get_attributes())
47
48
  for instance in self.instances:
48
49
  instance.apply()
49
50
 
51
+ def get_data_from_db(self):
52
+ self.definitions = []
53
+ for pdef_name, pdef in self._pedb.padstacks.definitions.items():
54
+ self.definitions.append(
55
+ Definition(
56
+ name=pdef_name,
57
+ hole_plating_thickness=pdef.hole_plating_thickness,
58
+ hole_material=pdef.material,
59
+ hole_range=pdef.hole_range,
60
+ pad_parameters=pdef.pad_parameters,
61
+ hole_parameters=pdef.hole_parameters,
62
+ )
63
+ )
64
+ data = {}
65
+ definitions = []
66
+ for i in self.definitions:
67
+ definitions.append(i.get_attributes())
68
+ data["definitions"] = definitions
69
+ return data
70
+
50
71
 
51
- class Definition:
72
+ class Definition(CfgBase):
52
73
  """Padstack definition data class."""
53
74
 
54
- def __init__(self, pdata, definition_dict):
55
- self._pedb = pdata._pedb
56
- self._definition_dict = definition_dict
57
- self.name = self._definition_dict.get("name", None)
58
- self.hole_diameter = self._definition_dict.get("hole_diameter", None)
59
- self.hole_plating_thickness = self._definition_dict.get("hole_plating_thickness", None)
60
- self.hole_material = self._definition_dict.get("hole_material", None)
61
- self.hole_range = self._definition_dict.get("hole_range", None)
62
-
63
- def apply(self):
64
- """Apply padstack definition on layout."""
65
- padstack_defs = self._pedb.padstacks.definitions
66
- pdef = padstack_defs[self.name]
67
- if self.hole_diameter:
68
- pdef.hole_diameter = self.hole_diameter
69
- if self.hole_plating_thickness:
70
- pdef.hole_plating_thickness = self.hole_plating_thickness
71
- if self.hole_material:
72
- pdef.material = self.hole_material
73
- if self.hole_range:
74
- pdef.hole_range = self.hole_range
75
+ def __init__(self, **kwargs):
76
+ self.name = kwargs.get("name", None)
77
+ self.hole_plating_thickness = kwargs.get("hole_plating_thickness", None)
78
+ self.material = kwargs.get("hole_material", None)
79
+ self.hole_range = kwargs.get("hole_range", None)
80
+ self.pad_parameters = kwargs.get("pad_parameters", None)
81
+ self.hole_parameters = kwargs.get("hole_parameters", None)
75
82
 
76
83
 
77
84
  class Instance:
78
85
  """Instance data class."""
79
86
 
80
- def __init__(self, pdata, instances_dict):
81
- self._pedb = pdata._pedb
87
+ def __init__(self, pedb, instances_dict):
88
+ self._pedb = pedb
82
89
  self._instances_dict = instances_dict
83
90
  self.name = self._instances_dict.get("name", "")
84
91
  self.backdrill_top = None
@@ -36,12 +36,14 @@ class CfgPinGroups:
36
36
 
37
37
  def get_data_from_db(self):
38
38
  self.pin_groups = []
39
- for name, pg in self._pedb.siwave.pin_groups.items():
40
- pins = [p.aedt_name for p in pg.pins.values()]
39
+ layout_pin_groups = self._pedb.siwave.pin_groups
40
+ for pg_name, pg_obj in layout_pin_groups.items():
41
+ pins = list(pg_obj.pins.keys())
42
+ refdes = list(pg_obj.pins.values())[0].component.name
41
43
  cfg_pg = CfgPinGroup(
42
44
  self._pedb,
43
- name=name,
44
- reference_designator=None,
45
+ name=pg_name,
46
+ reference_designator=refdes,
45
47
  pins=pins,
46
48
  )
47
49
  self.pin_groups.append(cfg_pg)
@@ -65,10 +67,7 @@ class CfgPinGroup(CfgBase):
65
67
  def create(self):
66
68
  """Apply pin group on layout."""
67
69
  if self.pins:
68
- if self.reference_designator is None:
69
- self._pedb.modeler.create_pin_group(self.name, pins_by_aedt_name=self.pins)
70
- else:
71
- self._pedb.siwave.create_pin_group(self.reference_designator, list(self.pins), self.name)
70
+ self._pedb.siwave.create_pin_group(self.reference_designator, list(self.pins), self.name)
72
71
  elif self.net:
73
72
  if self.reference_designator in self._pedb.components.instances:
74
73
  comp = self._pedb.components.instances[self.reference_designator]
@@ -34,6 +34,7 @@ class CfgSpiceModel:
34
34
  self.sub_circuit_name = self._spice_dict.get("sub_circuit_name", "")
35
35
  self.apply_to_all = self._spice_dict.get("apply_to_all", True)
36
36
  self.components = list(self._spice_dict.get("components", []))
37
+ self.terminal_pairs = self._spice_dict.get("terminal_pairs", None)
37
38
 
38
39
  def apply(self):
39
40
  """Apply Spice model on layout."""
@@ -45,8 +46,8 @@ class CfgSpiceModel:
45
46
  comps = self._pedb.components.definitions[self.component_definition].components
46
47
  if self.apply_to_all:
47
48
  for ref_des, comp in comps.items():
48
- comp.assign_spice_model(fpath, self.name, self.sub_circuit_name)
49
+ comp.assign_spice_model(fpath, self.name, self.sub_circuit_name, self.terminal_pairs)
49
50
  else:
50
51
  for ref_des, comp in comps.items():
51
52
  if ref_des in self.components:
52
- comp.assign_spice_model(fpath, self.name, self.sub_circuit_name)
53
+ comp.assign_spice_model(fpath, self.name, self.sub_circuit_name, self.terminal_pairs)
@@ -74,7 +74,7 @@ class Configuration:
74
74
  elif config_file.endswith(".toml"):
75
75
  data = toml.load(f)
76
76
  else: # pragma: no cover
77
- return False
77
+ raise RuntimeError(f"File {config_file} does not exist.")
78
78
 
79
79
  if not append: # pragma: no cover
80
80
  self.data = {}
@@ -103,7 +103,7 @@ class Configuration:
103
103
  self._pedb.open_edb()
104
104
  return self.cfg_data
105
105
 
106
- def run(self):
106
+ def run(self, **kwargs):
107
107
  """Apply configuration settings to the current design"""
108
108
 
109
109
  # Configure boundary settings
@@ -134,7 +134,16 @@ class Configuration:
134
134
  self.cfg_data.setups.apply()
135
135
 
136
136
  # Configure stackup
137
- self.cfg_data.stackup.apply()
137
+ if kwargs.get("fix_padstack_def"):
138
+ pedb_defs = self._pedb.padstacks.definitions
139
+ temp = {}
140
+ for name, pdef in pedb_defs.items():
141
+ temp[name] = pdef.get_properties()
142
+ self.cfg_data.stackup.apply()
143
+ for name, pdef_p in temp.items():
144
+ pedb_defs[name].set_properties(**pdef_p)
145
+ else:
146
+ self.cfg_data.stackup.apply()
138
147
 
139
148
  # Configure S-parameter
140
149
  for s_parameter_model in self.cfg_data.s_parameters:
@@ -282,6 +291,8 @@ class Configuration:
282
291
  data["pin_groups"] = self.cfg_data.pin_groups.get_data_from_db()
283
292
  if kwargs.get("operations", False):
284
293
  data["operations"] = self.cfg_data.operations.get_data_from_db()
294
+ if kwargs.get("padstacks", False):
295
+ data["padstacks"] = self.cfg_data.padstacks.get_data_from_db()
285
296
 
286
297
  return data
287
298
 
@@ -27,7 +27,7 @@ This module is used to create and edit design and project variables in the 3D to
27
27
 
28
28
  Examples
29
29
  --------
30
- >>> from pyaedt import Hfss
30
+ >>> from ansys.aedt.core import Hfss
31
31
  >>> hfss = Hfss()
32
32
  >>> hfss["$d"] = "5mm"
33
33
  >>> hfss["d"] = "5mm"
@@ -415,8 +415,8 @@ class VariableManager(object):
415
415
  Examples
416
416
  --------
417
417
 
418
- >>> from pyaedt.maxwell import Maxwell3d
419
- >>> from pyaedt.desktop import Desktop
418
+ >>> from ansys.aedt.core.maxwell import Maxwell3d
419
+ >>> from ansys.aedt.core.desktop import Desktop
420
420
  >>> d = Desktop()
421
421
  >>> aedtapp = Maxwell3d()
422
422
 
@@ -1765,40 +1765,42 @@ class Variable(object):
1765
1765
  def __mul__(self, other): # pragma: no cover
1766
1766
  """Multiply the variable with a number or another variable and return a new object.
1767
1767
 
1768
- Parameters
1769
- ----------
1770
- other : numbers.Number or variable
1771
- Object to be multiplied.
1772
-
1773
- Returns
1774
- -------
1775
- type
1776
- Variable.
1777
-
1778
- Examples
1779
- --------
1780
- >>> from pyedb.dotnet.application.Variables import Variable
1781
-
1782
- Multiply ``'Length1'`` by unitless ``'None'``` to obtain ``'Length'``.
1783
- A numerical value is also considered to be unitless.
1784
-
1785
- import pyaedt.generic.constants >>> v1 = Variable("10mm")
1786
- >>> v2 = Variable(3)
1787
- >>> result_1 = v1 * v2
1788
- >>> result_2 = v1 * 3
1789
- >>> assert result_1.numeric_value == 30.0
1790
- >>> assert result_1.unit_system == "Length"
1791
- >>> assert result_2.numeric_value == result_1.numeric_value
1792
- >>> assert result_2.unit_system == "Length"
1793
-
1794
- Multiply voltage times current to obtain power.
1795
-
1796
- import pyaedt.generic.constants >>> v3 = Variable("3mA")
1797
- >>> v4 = Variable("40V")
1798
- >>> result_3 = v3 * v4
1799
- >>> assert result_3.numeric_value == 0.12
1800
- >>> assert result_3.units == "W"
1801
- >>> assert result_3.unit_system == "Power"
1768
+ Parameters
1769
+ ----------
1770
+ other : numbers.Number or variable
1771
+ Object to be multiplied.
1772
+
1773
+ Returns
1774
+ -------
1775
+ type
1776
+ Variable.
1777
+
1778
+ Examples
1779
+ --------
1780
+ >>> from pyedb.dotnet.application.Variables import Variable
1781
+
1782
+ Multiply ``'Length1'`` by unitless ``'None'``` to obtain ``'Length'``.
1783
+ A numerical value is also considered to be unitless.
1784
+
1785
+ >>> import ansys.aedt.core.generic.constants
1786
+ >>> v1 = Variable("10mm")
1787
+ >>> v2 = Variable(3)
1788
+ >>> result_1 = v1 * v2
1789
+ >>> result_2 = v1 * 3
1790
+ >>> assert result_1.numeric_value == 30.0
1791
+ >>> assert result_1.unit_system == "Length"
1792
+ >>> assert result_2.numeric_value == result_1.numeric_value
1793
+ >>> assert result_2.unit_system == "Length"
1794
+
1795
+ Multiply voltage times current to obtain power.
1796
+
1797
+ >>> import ansys.aedt.core.generic.constants
1798
+ >>> v3 = Variable("3mA")
1799
+ >>> v4 = Variable("40V")
1800
+ >>> result_3 = v3 * v4
1801
+ >>> assert result_3.numeric_value == 0.12
1802
+ >>> assert result_3.units == "W"
1803
+ >>> assert result_3.unit_system == "Power"
1802
1804
 
1803
1805
  """
1804
1806
  assert is_number(other) or isinstance(other, Variable), "Multiplier must be a scalar quantity or a variable."
@@ -1836,7 +1838,7 @@ class Variable(object):
1836
1838
  Examples
1837
1839
  --------
1838
1840
  >>> from pyedb.dotnet.application.Variables import Variable
1839
- >>> import pyaedt.generic.constants
1841
+ >>> import ansys.aedt.core.generic.constants
1840
1842
  >>> v1 = Variable("3mA")
1841
1843
  >>> v2 = Variable("10A")
1842
1844
  >>> result = v1 + v2
@@ -1876,7 +1878,7 @@ class Variable(object):
1876
1878
  Examples
1877
1879
  --------
1878
1880
 
1879
- >>> import pyaedt.generic.constants
1881
+ >>> import ansys.aedt.core.generic.constants
1880
1882
  >>> from pyedb.dotnet.application.Variables import Variable
1881
1883
  >>> v3 = Variable("3mA")
1882
1884
  >>> v4 = Variable("10A")
@@ -1922,7 +1924,7 @@ class Variable(object):
1922
1924
  resolve the new units to ``"A"``.
1923
1925
 
1924
1926
  >>> from pyedb.dotnet.application.Variables import Variable
1925
- >>> import pyaedt.generic.constants
1927
+ >>> import ansys.aedt.core.generic.constants
1926
1928
  >>> v1 = Variable("10W")
1927
1929
  >>> v2 = Variable("40V")
1928
1930
  >>> result = v1 / v2
@@ -1964,7 +1966,7 @@ class Variable(object):
1964
1966
  Divide a number by a variable with units ``"s"`` and automatically determine that
1965
1967
  the result is in ``"Hz"``.
1966
1968
 
1967
- >>> import pyaedt.generic.constants
1969
+ >>> import ansys.aedt.core.generic.constants
1968
1970
  >>> from pyedb.dotnet.application.Variables import Variable
1969
1971
  >>> v = Variable("1s")
1970
1972
  >>> result = 3.0 / v
@@ -47,6 +47,27 @@ class Connectable(LayoutObj):
47
47
  net = self._pedb.nets[value]
48
48
  self._edb_object.SetNet(net.net_object)
49
49
 
50
+ @property
51
+ def net_name(self):
52
+ """Get the primitive layer name.
53
+
54
+ Returns
55
+ -------
56
+ str
57
+ """
58
+ try:
59
+ return self._edb_object.GetNet().GetName()
60
+ except (KeyError, AttributeError): # pragma: no cover
61
+ return None
62
+
63
+ @net_name.setter
64
+ def net_name(self, name):
65
+ if name in self._pedb.nets.netlist:
66
+ obj = self._pedb.nets.nets[name].net_object
67
+ self._edb_object.SetNet(obj)
68
+ else:
69
+ raise ValueError(f"Net {name} not found.")
70
+
50
71
  @property
51
72
  def component(self):
52
73
  """Component connected to this object.
@@ -22,6 +22,7 @@
22
22
 
23
23
  import logging
24
24
  import re
25
+ from typing import Optional
25
26
  import warnings
26
27
 
27
28
  from pyedb.dotnet.edb_core.cell.hierarchy.hierarchy_obj import Group
@@ -61,6 +62,15 @@ class EDBComponent(Group):
61
62
  self._layout_instance = None
62
63
  self._comp_instance = None
63
64
 
65
+ @property
66
+ def name(self):
67
+ """Name of the definition."""
68
+ return self._edb_object.GetName()
69
+
70
+ @name.setter
71
+ def name(self, value):
72
+ self._edb_object.SetName(value)
73
+
64
74
  @property
65
75
  def group_type(self):
66
76
  return self._edb_object.ToString().split(".")[-1].lower()
@@ -808,7 +818,13 @@ class EDBComponent(Group):
808
818
  return False
809
819
  return True
810
820
 
811
- def assign_spice_model(self, file_path, name=None, sub_circuit_name=None):
821
+ def assign_spice_model(
822
+ self,
823
+ file_path: str,
824
+ name: Optional[str] = None,
825
+ sub_circuit_name: Optional[str] = None,
826
+ terminal_pairs: Optional[list] = None,
827
+ ):
812
828
  """Assign Spice model to this component.
813
829
 
814
830
  Parameters
@@ -817,6 +833,10 @@ class EDBComponent(Group):
817
833
  File path of the Spice model.
818
834
  name : str, optional
819
835
  Name of the Spice model.
836
+ sub_circuit_name : str, optional
837
+ Name of the sub circuit.
838
+ terminal_pairs : list, optional
839
+ list of terminal pairs.
820
840
 
821
841
  Returns
822
842
  -------
@@ -828,23 +848,30 @@ class EDBComponent(Group):
828
848
  with open(file_path, "r") as f:
829
849
  for line in f:
830
850
  if "subckt" in line.lower():
831
- pinNames = [i.strip() for i in re.split(" |\t", line) if i]
832
- pinNames.remove(pinNames[0])
833
- pinNames.remove(pinNames[0])
851
+ pin_names_sp = [i.strip() for i in re.split(" |\t", line) if i]
852
+ pin_names_sp.remove(pin_names_sp[0])
853
+ pin_names_sp.remove(pin_names_sp[0])
834
854
  break
835
- if len(pinNames) == self.numpins:
836
- model = self._edb.cell.hierarchy._hierarchy.SPICEModel()
837
- model.SetModelPath(file_path)
838
- model.SetModelName(name)
839
- if sub_circuit_name:
840
- model.SetSubCkt(sub_circuit_name)
841
- terminal = 1
842
- for pn in pinNames:
843
- model.AddTerminalPinPair(pn, str(terminal))
844
- terminal += 1
845
- else: # pragma: no cover
846
- logging.error("Wrong number of Pins")
847
- return False
855
+ if not len(pin_names_sp) == self.numpins: # pragma: no cover
856
+ raise ValueError(f"Pin counts doesn't match component {self.name}.")
857
+
858
+ model = self._edb.cell.hierarchy._hierarchy.SPICEModel()
859
+ model.SetModelPath(file_path)
860
+ model.SetModelName(name)
861
+ if sub_circuit_name:
862
+ model.SetSubCkt(sub_circuit_name)
863
+
864
+ if terminal_pairs:
865
+ terminal_pairs = terminal_pairs if isinstance(terminal_pairs[0], list) else [terminal_pairs]
866
+ for pair in terminal_pairs:
867
+ pname, pnumber = pair
868
+ if pname not in pin_names_sp: # pragma: no cover
869
+ raise ValueError(f"Pin name {pname} doesn't exist in {file_path}.")
870
+ model.AddTerminalPinPair(pname, str(pnumber))
871
+ else:
872
+ for idx, pname in enumerate(pin_names_sp):
873
+ model.AddTerminalPinPair(pname, str(idx + 1))
874
+
848
875
  return self._set_model(model)
849
876
 
850
877
  def assign_s_param_model(self, file_path, name=None, reference_net=None):
@@ -856,7 +883,8 @@ class EDBComponent(Group):
856
883
  File path of the S-parameter model.
857
884
  name : str, optional
858
885
  Name of the S-parameter model.
859
-
886
+ reference_net : str, optional
887
+ Name of the reference net.
860
888
  Returns
861
889
  -------
862
890
 
@@ -54,6 +54,29 @@ from pyedb.dotnet.edb_core.general import convert_py_list_to_net_list
54
54
  from pyedb.dotnet.edb_core.utilities.obj_base import ObjBase
55
55
 
56
56
 
57
+ def primitive_cast(pedb, edb_object):
58
+ if edb_object.GetPrimitiveType().ToString() == "Rectangle":
59
+ return EdbRectangle(edb_object, pedb)
60
+ elif edb_object.GetPrimitiveType().ToString() == "Circle":
61
+ return EdbCircle(edb_object, pedb)
62
+ elif edb_object.GetPrimitiveType().ToString() == "Polygon":
63
+ return EdbPolygon(edb_object, pedb)
64
+ elif edb_object.GetPrimitiveType().ToString() == "Path":
65
+ return Path(pedb, edb_object)
66
+ elif edb_object.GetPrimitiveType().ToString() == "Bondwire":
67
+ return Bondwire(pedb, edb_object)
68
+ elif edb_object.GetPrimitiveType().ToString() == "Text":
69
+ return EdbText(edb_object, pedb)
70
+ elif edb_object.GetPrimitiveType().ToString() == "PrimitivePlugin":
71
+ return
72
+ elif edb_object.GetPrimitiveType().ToString() == "Path3D":
73
+ return
74
+ elif edb_object.GetPrimitiveType().ToString() == "BoardBendDef":
75
+ return
76
+ else:
77
+ return
78
+
79
+
57
80
  class Layout(ObjBase):
58
81
  def __init__(self, pedb, edb_object):
59
82
  super().__init__(pedb, edb_object)
@@ -209,7 +232,7 @@ class Layout(ObjBase):
209
232
  """
210
233
  prims = []
211
234
  for p in self._edb_object.Primitives:
212
- obj = self.find_object_by_id(p.GetId())
235
+ obj = primitive_cast(self._pedb, p)
213
236
  prims.append(obj)
214
237
  return prims
215
238
 
@@ -285,26 +308,7 @@ class Layout(ObjBase):
285
308
  return EDBPadstackInstance(obj, self._pedb)
286
309
 
287
310
  if obj.GetObjType().ToString() == "Primitive":
288
- if obj.GetPrimitiveType().ToString() == "Rectangle":
289
- return EdbRectangle(obj, self._pedb)
290
- elif obj.GetPrimitiveType().ToString() == "Circle":
291
- return EdbCircle(obj, self._pedb)
292
- elif obj.GetPrimitiveType().ToString() == "Polygon":
293
- return EdbPolygon(obj, self._pedb)
294
- elif obj.GetPrimitiveType().ToString() == "Path":
295
- return Path(self._pedb, obj)
296
- elif obj.GetPrimitiveType().ToString() == "Bondwire":
297
- return Bondwire(self._pedb, obj)
298
- elif obj.GetPrimitiveType().ToString() == "Text":
299
- return EdbText(obj, self._pedb)
300
- elif obj.GetPrimitiveType().ToString() == "PrimitivePlugin":
301
- pass
302
- elif obj.GetPrimitiveType().ToString() == "Path3D":
303
- pass
304
- elif obj.GetPrimitiveType().ToString() == "BoardBendDef":
305
- pass
306
- else:
307
- pass
311
+ return primitive_cast(self._pedb, obj)
308
312
 
309
313
  def find_net_by_name(self, value: str):
310
314
  """Find a net object by name
@@ -319,7 +323,10 @@ class Layout(ObjBase):
319
323
 
320
324
  """
321
325
  obj = self._pedb._edb.Cell.Net.FindByName(self._edb_object, value)
322
- return EDBNetsData(obj, self._pedb) if obj is not None else None
326
+ if obj.IsNull():
327
+ raise ValueError(f"Net {value} doesn't exist")
328
+ else:
329
+ return EDBNetsData(obj, self._pedb)
323
330
 
324
331
  def find_component_by_name(self, value: str):
325
332
  """Find a component object by name. Component name is the reference designator in layout.