pyedb 0.28.0__tar.gz → 0.29.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.28.0 → pyedb-0.29.0}/PKG-INFO +2 -2
  2. {pyedb-0.28.0 → pyedb-0.29.0}/pyproject.toml +1 -1
  3. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/__init__.py +1 -1
  4. pyedb-0.29.0/src/pyedb/configuration/cfg_boundaries.py +95 -0
  5. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/configuration/cfg_common.py +1 -1
  6. pyedb-0.29.0/src/pyedb/configuration/cfg_components.py +101 -0
  7. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/configuration/cfg_data.py +3 -8
  8. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/configuration/cfg_operations.py +14 -10
  9. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/configuration/cfg_padstacks.py +31 -61
  10. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/configuration/cfg_ports_sources.py +4 -2
  11. pyedb-0.29.0/src/pyedb/configuration/cfg_s_parameter_models.py +116 -0
  12. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/configuration/configuration.py +34 -10
  13. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb.py +12 -4
  14. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/component.py +199 -0
  15. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/cell/primitive/primitive.py +2 -0
  16. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/cell/terminal/terminal.py +4 -3
  17. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/definition/component_def.py +17 -1
  18. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/definition/component_model.py +0 -4
  19. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/edb_data/hfss_extent_info.py +3 -3
  20. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/edb_data/nets_data.py +10 -7
  21. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/edb_data/padstacks_data.py +50 -0
  22. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/layout_validation.py +3 -3
  23. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/nets.py +162 -181
  24. pyedb-0.28.0/src/pyedb/configuration/cfg_boundaries.py +0 -125
  25. pyedb-0.28.0/src/pyedb/configuration/cfg_components.py +0 -175
  26. pyedb-0.28.0/src/pyedb/configuration/cfg_s_parameter_models.py +0 -60
  27. {pyedb-0.28.0 → pyedb-0.29.0}/LICENSE +0 -0
  28. {pyedb-0.28.0 → pyedb-0.29.0}/README.md +0 -0
  29. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/component_libraries/ansys_components.py +0 -0
  30. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/configuration/__init__.py +0 -0
  31. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/configuration/cfg_general.py +0 -0
  32. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/configuration/cfg_nets.py +0 -0
  33. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/configuration/cfg_package_definition.py +0 -0
  34. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/configuration/cfg_pin_groups.py +0 -0
  35. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/configuration/cfg_setup.py +0 -0
  36. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/configuration/cfg_spice_models.py +0 -0
  37. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/configuration/cfg_stackup.py +0 -0
  38. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/__init__.py +0 -0
  39. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/application/Variables.py +0 -0
  40. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/application/__init__.py +0 -0
  41. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/clr_module.py +0 -0
  42. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/__init__.py +0 -0
  43. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/cell/__init__.py +0 -0
  44. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/cell/connectable.py +0 -0
  45. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/__init__.py +0 -0
  46. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/hierarchy_obj.py +0 -0
  47. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/model.py +0 -0
  48. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/netlist_model.py +0 -0
  49. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/pin_pair_model.py +0 -0
  50. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/s_parameter_model.py +0 -0
  51. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/spice_model.py +0 -0
  52. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/cell/layout.py +0 -0
  53. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/cell/layout_obj.py +0 -0
  54. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/cell/primitive/__init__.py +0 -0
  55. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/cell/primitive/bondwire.py +0 -0
  56. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/cell/primitive/path.py +0 -0
  57. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/cell/terminal/__init__.py +0 -0
  58. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/cell/terminal/bundle_terminal.py +0 -0
  59. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/cell/terminal/edge_terminal.py +0 -0
  60. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/cell/terminal/padstack_instance_terminal.py +0 -0
  61. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/cell/terminal/pingroup_terminal.py +0 -0
  62. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/cell/terminal/point_terminal.py +0 -0
  63. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/cell/voltage_regulator.py +0 -0
  64. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/components.py +0 -0
  65. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/definition/__init__.py +0 -0
  66. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/definition/definition_obj.py +0 -0
  67. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/definition/definitions.py +0 -0
  68. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/definition/package_def.py +0 -0
  69. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/dotnet/__init__.py +0 -0
  70. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/dotnet/database.py +0 -0
  71. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/dotnet/primitive.py +0 -0
  72. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/edb_data/__init__.py +0 -0
  73. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/edb_data/control_file.py +0 -0
  74. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/edb_data/design_options.py +0 -0
  75. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/edb_data/edbvalue.py +0 -0
  76. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/edb_data/layer_data.py +0 -0
  77. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/edb_data/ports.py +0 -0
  78. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/edb_data/primitives_data.py +0 -0
  79. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/edb_data/raptor_x_simulation_setup_data.py +0 -0
  80. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/edb_data/simulation_configuration.py +0 -0
  81. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/edb_data/sources.py +0 -0
  82. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/edb_data/utilities.py +0 -0
  83. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/edb_data/variables.py +0 -0
  84. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/general.py +0 -0
  85. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/geometry/__init__.py +0 -0
  86. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/geometry/point_data.py +0 -0
  87. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/geometry/polygon_data.py +0 -0
  88. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/hfss.py +0 -0
  89. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/layout_obj_instance.py +0 -0
  90. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/materials.py +0 -0
  91. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/modeler.py +0 -0
  92. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/net_class.py +0 -0
  93. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/padstack.py +0 -0
  94. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/sim_setup_data/__init__.py +0 -0
  95. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/__init__.py +0 -0
  96. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/adaptive_frequency_data.py +0 -0
  97. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/mesh_operation.py +0 -0
  98. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/settings.py +0 -0
  99. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/sim_setup_info.py +0 -0
  100. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/simulation_settings.py +0 -0
  101. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/siw_dc_ir_settings.py +0 -0
  102. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/sweep_data.py +0 -0
  103. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/sim_setup_data/io/__init__.py +0 -0
  104. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/sim_setup_data/io/siwave.py +0 -0
  105. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/siwave.py +0 -0
  106. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/stackup.py +0 -0
  107. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/utilities/__init__.py +0 -0
  108. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/utilities/heatsink.py +0 -0
  109. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/utilities/hfss_simulation_setup.py +0 -0
  110. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/utilities/obj_base.py +0 -0
  111. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/utilities/simulation_setup.py +0 -0
  112. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/dotnet/edb_core/utilities/siwave_simulation_setup.py +0 -0
  113. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/edb_logger.py +0 -0
  114. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/exceptions.py +0 -0
  115. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/generic/__init__.py +0 -0
  116. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/generic/constants.py +0 -0
  117. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/generic/data_handlers.py +0 -0
  118. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/generic/design_types.py +0 -0
  119. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/generic/filesystem.py +0 -0
  120. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/generic/general_methods.py +0 -0
  121. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/generic/plot.py +0 -0
  122. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/generic/process.py +0 -0
  123. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/generic/settings.py +0 -0
  124. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/__init__.py +0 -0
  125. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/bom/__init__.py +0 -0
  126. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/bom/bom.py +0 -0
  127. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/bom/bom_item.py +0 -0
  128. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/bom/characteristics.py +0 -0
  129. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/bom/refdes.py +0 -0
  130. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/content/__init__.py +0 -0
  131. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/content/color.py +0 -0
  132. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/content/content.py +0 -0
  133. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/content/dictionary_color.py +0 -0
  134. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/content/dictionary_fill.py +0 -0
  135. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/content/dictionary_line.py +0 -0
  136. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/content/entry_color.py +0 -0
  137. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/content/entry_line.py +0 -0
  138. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/content/fill.py +0 -0
  139. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/content/layer_ref.py +0 -0
  140. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/content/standard_geometries_dictionary.py +0 -0
  141. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/ecad/__init__.py +0 -0
  142. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/ecad/cad_data/__init__.py +0 -0
  143. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/ecad/cad_data/assembly_drawing.py +0 -0
  144. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/ecad/cad_data/cad_data.py +0 -0
  145. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/ecad/cad_data/component.py +0 -0
  146. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/ecad/cad_data/drill.py +0 -0
  147. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/ecad/cad_data/feature.py +0 -0
  148. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/ecad/cad_data/layer.py +0 -0
  149. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/ecad/cad_data/layer_feature.py +0 -0
  150. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/ecad/cad_data/logical_net.py +0 -0
  151. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/ecad/cad_data/outline.py +0 -0
  152. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/ecad/cad_data/package.py +0 -0
  153. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/ecad/cad_data/padstack_def.py +0 -0
  154. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/ecad/cad_data/padstack_hole_def.py +0 -0
  155. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/ecad/cad_data/padstack_instance.py +0 -0
  156. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/ecad/cad_data/padstack_pad_def.py +0 -0
  157. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/ecad/cad_data/path.py +0 -0
  158. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/ecad/cad_data/phy_net.py +0 -0
  159. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/ecad/cad_data/pin.py +0 -0
  160. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/ecad/cad_data/polygon.py +0 -0
  161. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/ecad/cad_data/profile.py +0 -0
  162. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/ecad/cad_data/stackup.py +0 -0
  163. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/ecad/cad_data/stackup_group.py +0 -0
  164. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/ecad/cad_data/stackup_layer.py +0 -0
  165. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/ecad/cad_data/step.py +0 -0
  166. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/ecad/cad_header.py +0 -0
  167. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/ecad/ecad.py +0 -0
  168. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/ecad/spec.py +0 -0
  169. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/history_record.py +0 -0
  170. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/ipc2581.py +0 -0
  171. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/ipc2581/logistic_header.py +0 -0
  172. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/misc/__init__.py +0 -0
  173. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/misc/aedtlib_personalib_install.py +0 -0
  174. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/misc/downloads.py +0 -0
  175. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/misc/misc.py +0 -0
  176. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/misc/pyedb.runtimeconfig.json +0 -0
  177. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/misc/siw_feature_config/__init__.py +0 -0
  178. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/misc/siw_feature_config/emc/__init__.py +0 -0
  179. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/misc/siw_feature_config/emc/component_tags.py +0 -0
  180. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/misc/siw_feature_config/emc/net_tags.py +0 -0
  181. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/misc/siw_feature_config/emc/tag_library.py +0 -0
  182. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/misc/siw_feature_config/emc/xml_generic.py +0 -0
  183. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/misc/siw_feature_config/emc_rule_checker_settings.py +0 -0
  184. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/misc/siw_feature_config/xtalk_scan/fd_xtalk_scan_config.py +0 -0
  185. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/misc/siw_feature_config/xtalk_scan/impedance_scan_config.py +0 -0
  186. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/misc/siw_feature_config/xtalk_scan/net.py +0 -0
  187. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/misc/siw_feature_config/xtalk_scan/pins.py +0 -0
  188. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/misc/siw_feature_config/xtalk_scan/scan_config.py +0 -0
  189. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/misc/siw_feature_config/xtalk_scan/td_xtalk_config.py +0 -0
  190. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/misc/utilities.py +0 -0
  191. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/modeler/geometry_operators.py +0 -0
  192. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/siwave.py +0 -0
  193. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/siwave_core/icepak.py +0 -0
  194. {pyedb-0.28.0 → pyedb-0.29.0}/src/pyedb/workflow.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyedb
3
- Version: 0.28.0
3
+ Version: 0.29.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>
@@ -38,7 +38,7 @@ 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
40
  Requires-Dist: sphinx-autobuild==2021.3.14 ; extra == "doc" and ( python_version == '3.8')
41
- Requires-Dist: sphinx-autobuild==2024.2.4 ; extra == "doc" and ( python_version > '3.8')
41
+ Requires-Dist: sphinx-autobuild==2024.9.19 ; 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"
44
44
  Requires-Dist: sphinx_design>=0.4.0,<0.7 ; extra == "doc"
@@ -61,7 +61,7 @@ doc = [
61
61
  "recommonmark",
62
62
  "Sphinx>=7.1.0,<8.1",
63
63
  "sphinx-autobuild==2021.3.14; python_version == '3.8'",
64
- "sphinx-autobuild==2024.2.4; python_version > '3.8'",
64
+ "sphinx-autobuild==2024.9.19; python_version > '3.8'",
65
65
  "sphinx-copybutton>=0.5.0,<0.6",
66
66
  "sphinx-gallery>=0.14.0,<0.18",
67
67
  "sphinx_design>=0.4.0,<0.7",
@@ -44,7 +44,7 @@ deprecation_warning()
44
44
  #
45
45
 
46
46
  pyedb_path = os.path.dirname(__file__)
47
- __version__ = "0.28.0"
47
+ __version__ = "0.29.0"
48
48
  version = __version__
49
49
 
50
50
  #
@@ -0,0 +1,95 @@
1
+ # Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates.
2
+ # SPDX-License-Identifier: MIT
3
+ #
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in all
13
+ # copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ # SOFTWARE.
22
+
23
+ from pyedb.configuration.cfg_common import CfgBase
24
+
25
+
26
+ class CfgBoundaries(CfgBase):
27
+ def __init__(self, pedb, boundary_data):
28
+ self._pedb = pedb
29
+ self.open_region = boundary_data.get("open_region", None)
30
+ self.open_region_type = boundary_data.get("map_open_region_type", None)
31
+ self.pml_visible = boundary_data.get("pml_visible", None)
32
+ self.pml_operation_frequency = boundary_data.get("pml_operation_frequency", None)
33
+ self.pml_radiation_factor = boundary_data.get("pml_radiation_factor", None)
34
+ self.dielectric_extent_type = boundary_data.get("dielectric_extent_type", None)
35
+ # self.dielectric_base_polygon = self.**kwargs.get("dielectric_base_polygon", None)
36
+ self.horizontal_padding = boundary_data.get("horizontal_padding", None)
37
+ self.honor_primitives_on_dielectric_layers = boundary_data.get("honor_primitives_on_dielectric_layers", False)
38
+ self.air_box_extent_type = boundary_data.get("air_box_extent_type", None)
39
+ self.air_box_base_polygon = boundary_data.get("air_box_base_polygon", None)
40
+ self.air_box_truncate_model_ground_layers = boundary_data.get("air_box_truncate_model_ground_layers", None)
41
+ self.air_box_horizontal_padding = boundary_data.get("air_box_horizontal_padding", None)
42
+ self.air_box_positive_vertical_padding = boundary_data.get("air_box_positive_vertical_padding", None)
43
+ self.air_box_negative_vertical_padding = boundary_data.get("air_box_negative_vertical_padding", None)
44
+
45
+ def apply(self):
46
+ """Imports boundary information from JSON."""
47
+ if self.open_region is not None:
48
+ self._pedb.hfss.hfss_extent_info.use_open_region = self.open_region
49
+ if self.open_region_type:
50
+ self._pedb.hfss.hfss_extent_info.open_region_type = self.open_region_type.lower()
51
+ if self.pml_visible is not None:
52
+ self._pedb.hfss.hfss_extent_info.is_pml_visible = self.pml_visible
53
+ if self.pml_operation_frequency:
54
+ self._pedb.hfss.hfss_extent_info.operating_freq = self.pml_operation_frequency
55
+ if self.pml_radiation_factor:
56
+ self._pedb.hfss.hfss_extent_info.radiation_level = self.pml_radiation_factor
57
+ if self.dielectric_extent_type:
58
+ self._pedb.hfss.hfss_extent_info.extent_type = self.dielectric_extent_type.lower()
59
+ # if self.dielectric_base_polygon:
60
+ # self._pedb.hfss.hfss_extent_info.dielectric_base_polygon = self.dielectric_base_polygon
61
+ if self.horizontal_padding:
62
+ self._pedb.hfss.hfss_extent_info.dielectric_extent_size = float(self.horizontal_padding)
63
+ if self.honor_primitives_on_dielectric_layers is not None:
64
+ self._pedb.hfss.hfss_extent_info.honor_user_dielectric = self.honor_primitives_on_dielectric_layers
65
+ if self.air_box_extent_type:
66
+ self._pedb.hfss.hfss_extent_info.extent_type = self.air_box_extent_type.lower()
67
+ if self.air_box_truncate_model_ground_layers is not None:
68
+ self._pedb.hfss.hfss_extent_info.truncate_air_box_at_ground = self.air_box_truncate_model_ground_layers
69
+ if self.air_box_horizontal_padding:
70
+ self._pedb.hfss.hfss_extent_info.air_box_horizontal_extent = float(self.air_box_horizontal_padding)
71
+ if self.air_box_positive_vertical_padding:
72
+ self._pedb.hfss.hfss_extent_info.air_box_positive_vertical_extent = float(
73
+ self.air_box_positive_vertical_padding
74
+ )
75
+ if self.air_box_negative_vertical_padding:
76
+ self._pedb.hfss.hfss_extent_info.air_box_negative_vertical_extent = float(
77
+ self.air_box_negative_vertical_padding
78
+ )
79
+
80
+ def get_data_from_db(self):
81
+ self.open_region = self._pedb.hfss.hfss_extent_info.use_open_region
82
+ self.open_region_type = self._pedb.hfss.hfss_extent_info.open_region_type
83
+ self.pml_visible = self._pedb.hfss.hfss_extent_info.is_pml_visible
84
+ self.pml_operation_frequency = self._pedb.hfss.hfss_extent_info.operating_freq.tostring
85
+ self.pml_radiation_factor = self._pedb.hfss.hfss_extent_info.radiation_level.tostring
86
+ self.dielectric_extent_type = self._pedb.hfss.hfss_extent_info.extent_type
87
+ # self.dielectric_base_polygon = self._pedb.hfss.hfss_extent_info.dielectric_base_polygon
88
+ self.horizontal_padding = self._pedb.hfss.hfss_extent_info.dielectric_extent_size
89
+ self.honor_primitives_on_dielectric_layers = self._pedb.hfss.hfss_extent_info.honor_user_dielectric
90
+ self.air_box_extent_type = self._pedb.hfss.hfss_extent_info.extent_type
91
+ self.air_box_truncate_model_ground_layers = self._pedb.hfss.hfss_extent_info.truncate_air_box_at_ground
92
+ self.air_box_horizontal_padding = self._pedb.hfss.hfss_extent_info.air_box_horizontal_extent
93
+ self.air_box_positive_vertical_padding = self._pedb.hfss.hfss_extent_info.air_box_positive_vertical_extent
94
+ self.air_box_negative_vertical_padding = self._pedb.hfss.hfss_extent_info.air_box_negative_vertical_extent
95
+ return self.get_attributes()
@@ -30,7 +30,7 @@ class CfgBase:
30
30
  exclude = exclude if isinstance(exclude, list) else [exclude]
31
31
  attrs = {i: j for i, j in attrs.items() if i not in exclude}
32
32
  attrs = {i: j for i, j in attrs.items() if not i.startswith("_")}
33
- attrs = {i: j for i, j in attrs.items() if j is not None}
33
+ attrs = {i: j for i, j in attrs.items() if j not in [None, [], {}]}
34
34
  return attrs
35
35
 
36
36
  def set_attributes(self, pedb_object):
@@ -0,0 +1,101 @@
1
+ # Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates.
2
+ # SPDX-License-Identifier: MIT
3
+ #
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in all
13
+ # copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ # SOFTWARE.
22
+
23
+ from pyedb.configuration.cfg_common import CfgBase
24
+
25
+
26
+ class CfgRlcModel(CfgBase):
27
+ def __init__(self, **kwargs):
28
+ self.resistance = kwargs.get("resistance", None)
29
+ self.inductance = kwargs.get("inductance", None)
30
+ self.capacitance = kwargs.get("capacitance", None)
31
+ self.type = kwargs.get("type", None)
32
+ self.p1 = kwargs.get("p1", None)
33
+ self.p2 = kwargs.get("p2", None)
34
+
35
+
36
+ class CfgComponent(CfgBase):
37
+ def __init__(self, **kwargs):
38
+ self.enabled = kwargs.get("enabled", None)
39
+ self.reference_designator = kwargs.get("reference_designator", None)
40
+ self.definition = kwargs.get("definition", None)
41
+ self.type = kwargs["part_type"].lower() if kwargs.get("part_type") else None
42
+ self.port_properties = kwargs.get("port_properties", {})
43
+ self.solder_ball_properties = kwargs.get("solder_ball_properties", {})
44
+ self.ic_die_properties = kwargs.get("ic_die_properties", {})
45
+ self.pin_pair_model = kwargs.get("pin_pair_model", None)
46
+ self.spice_model = kwargs.get("spice_model", None)
47
+ self.s_parameter_model = kwargs.get("s_parameter_model", None)
48
+
49
+
50
+ class CfgComponents:
51
+ def __init__(self, pedb, components_data):
52
+ self._pedb = pedb
53
+ self.components = [CfgComponent(**comp) for comp in components_data]
54
+
55
+ def apply(self):
56
+ comps_in_db = self._pedb.components.components
57
+ for comp in self.components:
58
+ c_db = comps_in_db[comp.reference_designator]
59
+ if comp.definition:
60
+ c_db.definition = comp.definition
61
+ if comp.type:
62
+ c_db.type = comp.type
63
+ if comp.solder_ball_properties:
64
+ c_db.solder_ball_properties = comp.solder_ball_properties
65
+ if comp.port_properties:
66
+ c_db.port_properties = comp.port_properties
67
+ if comp.ic_die_properties:
68
+ c_db.set_ic_die_properties = comp.ic_die_properties
69
+ if comp.pin_pair_model:
70
+ c_db.model_properties = {"pin_pair_model": comp.pin_pair_model}
71
+ if comp.spice_model:
72
+ c_db.model_properties = {"spice_model": comp.spice_model}
73
+ if comp.s_parameter_model:
74
+ c_db.model_properties = {"s_parameter_model": comp.s_parameter_model}
75
+
76
+ def _load_data_from_db(self):
77
+ self.components = []
78
+ comps_in_db = self._pedb.components
79
+ for _, comp in comps_in_db.instances.items():
80
+ cfg_comp = CfgComponent(
81
+ enabled=comp.enabled,
82
+ reference_designator=comp.name,
83
+ part_type=comp.type,
84
+ pin_pair_model=comp.model_properties.get("pin_pair_model"),
85
+ spice_model=comp.model_properties.get("spice_model"),
86
+ s_parameter_model=comp.model_properties.get("s_parameter_model"),
87
+ definition=comp.component_def,
88
+ location=comp.location,
89
+ placement_layer=comp.placement_layer,
90
+ solder_ball_properties=comp.solder_ball_properties,
91
+ ic_die_properties=comp.ic_die_properties,
92
+ port_properties=comp.port_properties,
93
+ )
94
+ self.components.append(cfg_comp)
95
+
96
+ def get_data_from_db(self):
97
+ self._load_data_from_db()
98
+ data = []
99
+ for comp in self.components:
100
+ data.append(comp.get_attributes())
101
+ return data
@@ -30,7 +30,7 @@ from pyedb.configuration.cfg_package_definition import CfgPackageDefinitions
30
30
  from pyedb.configuration.cfg_padstacks import CfgPadstacks
31
31
  from pyedb.configuration.cfg_pin_groups import CfgPinGroups
32
32
  from pyedb.configuration.cfg_ports_sources import CfgPorts, CfgSources
33
- from pyedb.configuration.cfg_s_parameter_models import CfgSParameterModel
33
+ from pyedb.configuration.cfg_s_parameter_models import CfgSParameters
34
34
  from pyedb.configuration.cfg_setup import CfgSetups
35
35
  from pyedb.configuration.cfg_spice_models import CfgSpiceModel
36
36
  from pyedb.configuration.cfg_stackup import CfgStackup
@@ -43,9 +43,7 @@ class CfgData(object):
43
43
  self._pedb = pedb
44
44
  self.general = CfgGeneral(self, kwargs.get("general", None))
45
45
 
46
- self.boundaries = {}
47
- if kwargs.get("boundaries", None):
48
- self.boundaries = CfgBoundaries(self, kwargs.get("boundaries", None))
46
+ self.boundaries = CfgBoundaries(self._pedb, kwargs.get("boundaries", {}))
49
47
 
50
48
  self.nets = CfgNets(
51
49
  self, kwargs.get("nets", {}).get("signal_nets", []), kwargs.get("nets", {}).get("power_ground_nets", [])
@@ -65,10 +63,7 @@ class CfgData(object):
65
63
 
66
64
  self.stackup = CfgStackup(self._pedb, data=kwargs.get("stackup", {}))
67
65
 
68
- self.s_parameters = [
69
- CfgSParameterModel(self, self.general.s_parameter_library, sparam_model)
70
- for sparam_model in kwargs.get("s_parameters", [])
71
- ]
66
+ self.s_parameters = CfgSParameters(self._pedb, kwargs.get("s_parameters", []), self.general.s_parameter_library)
72
67
 
73
68
  self.spice_models = [
74
69
  CfgSpiceModel(self, self.general.spice_model_library, spice_model)
@@ -53,18 +53,20 @@ class CfgCutout(CfgBase):
53
53
 
54
54
  def get_data_from_db(self):
55
55
  if "pyedb_cutout" in self._pedb.stackup.all_layers:
56
- poly = self._pedb.layout.find_primitive(layer_name="pyedb_cutout")[0]
57
- self.custom_extent = poly.polygon_data.points
56
+ polygons = self._pedb.layout.find_primitive(layer_name="pyedb_cutout")
57
+ if polygons:
58
+ poly = polygons[0]
59
+ self.custom_extent = poly.polygon_data.points
58
60
 
59
- net_names = []
60
- for name, obj in self._pedb.nets.nets.items():
61
- if obj.primitives[0].layer.name == "pyedb_cutout":
62
- continue
63
- if len(obj.primitives) > 0:
64
- net_names.append(name)
61
+ net_names = []
62
+ for name, obj in self._pedb.nets.nets.items():
63
+ if obj.primitives[0].layer.name == "pyedb_cutout":
64
+ continue
65
+ if len(obj.primitives) > 0:
66
+ net_names.append(name)
65
67
 
66
- self.reference_list = []
67
- self.signal_list = net_names
68
+ self.reference_list = []
69
+ self.signal_list = net_names
68
70
  return self.export_properties()
69
71
 
70
72
  def export_properties(self):
@@ -95,3 +97,5 @@ class CfgOperations(CfgBase):
95
97
  data_from_db = self.op_cutout.get_data_from_db()
96
98
  if data_from_db:
97
99
  return {"cutout": data_from_db}
100
+ else:
101
+ return {}
@@ -20,9 +20,6 @@
20
20
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  # SOFTWARE.
22
22
 
23
-
24
- from enum import Enum
25
-
26
23
  from pyedb.configuration.cfg_common import CfgBase
27
24
 
28
25
 
@@ -37,16 +34,25 @@ class CfgPadstacks:
37
34
  for pdef in padstack_dict.get("definitions", []):
38
35
  self.definitions.append(Definition(**pdef))
39
36
  for inst in padstack_dict.get("instances", []):
40
- self.instances.append(Instance(self._pedb, inst))
37
+ self.instances.append(Instance(**inst))
41
38
 
42
39
  def apply(self):
43
40
  """Apply padstack definition and instances on layout."""
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())
48
- for instance in self.instances:
49
- instance.apply()
41
+ if self.definitions:
42
+ padstack_defs_layout = self._pedb.padstacks.definitions
43
+ for pdef in self.definitions:
44
+ pdef_layout = padstack_defs_layout[pdef.name]
45
+ pdef_layout.set_properties(**pdef.get_attributes())
46
+ if self.instances:
47
+ instances_layout = self._pedb.padstacks.instances_by_name
48
+ for inst in self.instances:
49
+ inst_layout = instances_layout[inst.name]
50
+ if inst.definition:
51
+ # inst_layout.padstack_definition = inst.definition
52
+ # Not supported by EDB API
53
+ pass
54
+ if inst.backdrill_parameters:
55
+ inst_layout.backdrill_parameters = inst.backdrill_parameters
50
56
 
51
57
  def get_data_from_db(self):
52
58
  self.definitions = []
@@ -66,6 +72,16 @@ class CfgPadstacks:
66
72
  for i in self.definitions:
67
73
  definitions.append(i.get_attributes())
68
74
  data["definitions"] = definitions
75
+
76
+ instances_layout = self._pedb.padstacks.instances_by_name
77
+ for name, obj in instances_layout.items():
78
+ self.instances.append(
79
+ Instance(name=name, definition=obj.padstack_definition, backdrill_parameters=obj.backdrill_parameters)
80
+ )
81
+ instances = []
82
+ for i in self.instances:
83
+ instances.append(i.get_attributes())
84
+ data["instances"] = instances
69
85
  return data
70
86
 
71
87
 
@@ -81,56 +97,10 @@ class Definition(CfgBase):
81
97
  self.hole_parameters = kwargs.get("hole_parameters", None)
82
98
 
83
99
 
84
- class Instance:
100
+ class Instance(CfgBase):
85
101
  """Instance data class."""
86
102
 
87
- def __init__(self, pedb, instances_dict):
88
- self._pedb = pedb
89
- self._instances_dict = instances_dict
90
- self.name = self._instances_dict.get("name", "")
91
- self.backdrill_top = None
92
- self.backdrill_bottom = None
93
- self._update_backdrill()
94
-
95
- def _update_backdrill(self):
96
- if "backdrill_top" in self._instances_dict:
97
- self.backdrill_top = self.BackDrill()
98
- self.backdrill_top.type = self.backdrill_top.BackDrillType.TOP
99
- backdrill_top_dict = self._instances_dict["backdrill_top"]
100
- self.backdrill_top.drill_to_layer = backdrill_top_dict.get("drill_to_layer", "")
101
- self.backdrill_top.drill_diameter = backdrill_top_dict.get("drill_diameter", "")
102
- self.backdrill_top.stub_length = backdrill_top_dict.get("stub_length", "")
103
- if "backdrill_bottom" in self._instances_dict:
104
- self.backdrill_bottom = self.BackDrill()
105
- backdrill_bottom_dict = self._instances_dict["backdrill_bottom"]
106
- self.backdrill_bottom.drill_to_layer = backdrill_bottom_dict.get("drill_to_layer", "")
107
- self.backdrill_bottom.drill_diameter = backdrill_bottom_dict.get("drill_diameter", "")
108
- self.backdrill_bottom.stub_length = backdrill_bottom_dict.get("stub_length", "")
109
-
110
- class BackDrill:
111
- """Backdrill data class."""
112
-
113
- def __init__(self):
114
- self.type = self.BackDrillType.BOTTOM
115
- self.drill_to_layer = ""
116
- self.drill_diameter = ""
117
- self.stub_length = ""
118
-
119
- class BackDrillType(Enum):
120
- TOP = 0
121
- BOTTOM = 1
122
-
123
- def apply(self):
124
- """Apply padstack instance on layout."""
125
- padstack_instances = self._pedb.padstacks.instances_by_name
126
- inst = padstack_instances[self.name]
127
- if self.backdrill_top:
128
- inst.set_backdrill_top(
129
- self.backdrill_top.drill_to_layer, self.backdrill_top.drill_diameter, self.backdrill_top.stub_length
130
- )
131
- if self.backdrill_bottom:
132
- inst.set_backdrill_bottom(
133
- self.backdrill_bottom.drill_to_layer,
134
- self.backdrill_bottom.drill_diameter,
135
- self.backdrill_bottom.stub_length,
136
- )
103
+ def __init__(self, **kwargs):
104
+ self.name = kwargs["name"]
105
+ self.definition = kwargs.get("definition", None)
106
+ self.backdrill_parameters = kwargs.get("backdrill_parameters", None)
@@ -337,13 +337,15 @@ class CfgPort(CfgCircuitElement):
337
337
  return circuit_elements
338
338
 
339
339
  def export_properties(self):
340
- return {
340
+ data = {
341
341
  "name": self.name,
342
342
  "type": self.type,
343
343
  "reference_designator": self.reference_designator,
344
344
  "positive_terminal": self.positive_terminal_info.export_properties(),
345
- "negative_terminal": self.negative_terminal_info.export_properties(),
346
345
  }
346
+ if self.negative_terminal_info:
347
+ data.update({"negative_terminal": self.negative_terminal_info.export_properties()})
348
+ return data
347
349
 
348
350
 
349
351
  class CfgSource(CfgCircuitElement):
@@ -0,0 +1,116 @@
1
+ # Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates.
2
+ # SPDX-License-Identifier: MIT
3
+ #
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in all
13
+ # copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ # SOFTWARE.
22
+
23
+ from pathlib import Path
24
+
25
+
26
+ class CfgSParameterModel:
27
+ def __init__(self, **kwargs):
28
+ self.name = kwargs.get("name", "")
29
+ self.component_definition = kwargs.get("component_definition", "")
30
+ self.file_path = kwargs.get("file_path", "")
31
+ self.apply_to_all = kwargs.get("apply_to_all", False)
32
+ self.components = kwargs.get("components", [])
33
+ self.reference_net = kwargs.get("reference_net", "")
34
+ self.reference_net_per_component = kwargs.get("reference_net_per_component", {})
35
+ self.pin_order = kwargs.get("pin_order", None)
36
+
37
+
38
+ class CfgSParameters:
39
+ def __init__(self, pedb, data, path_lib=None):
40
+ self._pedb = pedb
41
+ self.path_libraries = path_lib
42
+ self.s_parameters_models = [CfgSParameterModel(**i) for i in data]
43
+
44
+ def apply(self):
45
+ for s_param in self.s_parameters_models:
46
+ fpath = s_param.file_path
47
+ if not Path(fpath).anchor:
48
+ fpath = str(Path(self.path_libraries) / fpath)
49
+ comp_def = self._pedb.definitions.component[s_param.component_definition]
50
+ if s_param.pin_order:
51
+ comp_def.set_properties(pin_order=s_param.pin_order)
52
+ comp_def.add_n_port_model(fpath, s_param.name)
53
+ comp_list = dict()
54
+ if s_param.apply_to_all:
55
+ comp_list.update(
56
+ {refdes: comp for refdes, comp in comp_def.components.items() if refdes not in s_param.components}
57
+ )
58
+ else:
59
+ comp_list.update(
60
+ {refdes: comp for refdes, comp in comp_def.components.items() if refdes in s_param.components}
61
+ )
62
+
63
+ for refdes, comp in comp_list.items():
64
+ if refdes in s_param.reference_net_per_component:
65
+ ref_net = s_param.reference_net_per_component[refdes]
66
+ else:
67
+ ref_net = s_param.reference_net
68
+ comp.use_s_parameter_model(s_param.name, reference_net=ref_net)
69
+
70
+ def get_data_from_db(self):
71
+ db_comp_def = self._pedb.definitions.component
72
+ for name, compdef_obj in db_comp_def.items():
73
+ nport_models = compdef_obj.component_models
74
+ if not nport_models:
75
+ continue
76
+ else:
77
+ pin_order = compdef_obj.get_properties()["pin_order"]
78
+ temp_comps = compdef_obj.components
79
+ for model_name, model_obj in nport_models.items():
80
+ temp_comp_list = []
81
+ reference_net_per_component = {}
82
+ for i in temp_comps.values():
83
+ s_param_model = i.model_properties.get("s_parameter_model")
84
+ if s_param_model:
85
+ if s_param_model["model_name"] == model_name:
86
+ temp_comp_list.append(i.refdes)
87
+ reference_net_per_component[i.refdes] = s_param_model["reference_net"]
88
+ else:
89
+ continue
90
+
91
+ self.s_parameters_models.append(
92
+ CfgSParameterModel(
93
+ name=model_name,
94
+ component_definition=name,
95
+ file_path=model_obj.reference_file,
96
+ apply_to_all=False,
97
+ components=temp_comp_list,
98
+ reference_net_per_component=reference_net_per_component,
99
+ pin_order=pin_order,
100
+ )
101
+ )
102
+
103
+ data = []
104
+ for i in self.s_parameters_models:
105
+ data.append(
106
+ {
107
+ "name": i.name,
108
+ "component_definition": i.component_definition,
109
+ "file_path": i.file_path,
110
+ "apply_to_all": i.apply_to_all,
111
+ "components": i.components,
112
+ "reference_net_per_component": i.reference_net_per_component,
113
+ "pin_order": i.pin_order,
114
+ }
115
+ )
116
+ return data
@@ -117,10 +117,6 @@ class Configuration:
117
117
  # Configure components
118
118
  self.cfg_data.components.apply()
119
119
 
120
- # Configure padstacks
121
- if self.cfg_data.padstacks:
122
- self.cfg_data.padstacks.apply()
123
-
124
120
  # Configure pin groups
125
121
  self.cfg_data.pin_groups.apply()
126
122
 
@@ -145,9 +141,12 @@ class Configuration:
145
141
  else:
146
142
  self.cfg_data.stackup.apply()
147
143
 
144
+ # Configure padstacks
145
+ if self.cfg_data.padstacks:
146
+ self.cfg_data.padstacks.apply()
147
+
148
148
  # Configure S-parameter
149
- for s_parameter_model in self.cfg_data.s_parameters:
150
- s_parameter_model.apply()
149
+ self.cfg_data.s_parameters.apply()
151
150
 
152
151
  # Configure SPICE models
153
152
  for spice_model in self.cfg_data.spice_models:
@@ -293,6 +292,10 @@ class Configuration:
293
292
  data["operations"] = self.cfg_data.operations.get_data_from_db()
294
293
  if kwargs.get("padstacks", False):
295
294
  data["padstacks"] = self.cfg_data.padstacks.get_data_from_db()
295
+ if kwargs.get("s_parameters", False):
296
+ data["s_parameters"] = self.cfg_data.s_parameters.get_data_from_db()
297
+ if kwargs.get("boundaries", False):
298
+ data["boundaries"] = self.cfg_data.boundaries.get_data_from_db()
296
299
 
297
300
  return data
298
301
 
@@ -307,6 +310,10 @@ class Configuration:
307
310
  nets=True,
308
311
  pin_groups=True,
309
312
  operations=True,
313
+ components=True,
314
+ boundaries=True,
315
+ s_parameters=True,
316
+ padstacks=True,
310
317
  ):
311
318
  """Export the configuration data from layout to a file.
312
319
 
@@ -330,22 +337,39 @@ class Configuration:
330
337
  Whether to export pin groups.
331
338
  operations : bool
332
339
  Whether to export operations.
340
+ components : bool
341
+ Whether to export component.
342
+ boundaries : bool
343
+ Whether to export boundaries.
344
+ s_parameters : bool
345
+ Whether to export s_parameters.
346
+ padstacks : bool
347
+ Whether to export padstacks.
333
348
  Returns
334
349
  -------
335
350
  bool
336
351
  """
337
- file_path = file_path if isinstance(file_path, Path) else Path(file_path)
338
- file_path = file_path if file_path.suffix == ".json" else file_path.with_suffix(".json")
339
352
  data = self.get_data_from_db(
340
353
  stackup=stackup,
341
354
  package_definitions=package_definitions,
342
- setups=setups,
355
+ setups=False,
343
356
  sources=sources,
344
357
  ports=ports,
345
358
  nets=nets,
346
359
  pin_groups=pin_groups,
347
360
  operations=operations,
361
+ components=components,
362
+ boundaries=boundaries,
363
+ s_parameters=s_parameters,
364
+ padstacks=padstacks,
348
365
  )
366
+
367
+ file_path = file_path if isinstance(file_path, Path) else Path(file_path)
368
+ file_path = file_path.with_suffix(".json") if file_path.suffix == "" else file_path
369
+
349
370
  with open(file_path, "w") as f:
350
- json.dump(data, f, ensure_ascii=False, indent=4)
371
+ if file_path.suffix == ".json":
372
+ json.dump(data, f, ensure_ascii=False, indent=4)
373
+ else:
374
+ toml.dump(data, f)
351
375
  return True if os.path.isfile(file_path) else False