pyedb 0.15.0__tar.gz → 0.16.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 (180) hide show
  1. {pyedb-0.15.0 → pyedb-0.16.0}/PKG-INFO +3 -3
  2. {pyedb-0.15.0 → pyedb-0.16.0}/pyproject.toml +2 -2
  3. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/__init__.py +1 -1
  4. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/configuration/cfg_common.py +1 -3
  5. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/configuration/cfg_components.py +4 -6
  6. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/configuration/cfg_data.py +3 -6
  7. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/configuration/cfg_package_definition.py +3 -5
  8. pyedb-0.16.0/src/pyedb/configuration/cfg_setup.py +239 -0
  9. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/configuration/cfg_stackup.py +4 -4
  10. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/configuration/configuration.py +7 -5
  11. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb.py +6 -2
  12. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/layout.py +4 -1
  13. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/mesh_operation.py +63 -49
  14. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/sweep_data.py +39 -20
  15. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/utilities/hfss_simulation_setup.py +18 -18
  16. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/utilities/simulation_setup.py +33 -2
  17. pyedb-0.15.0/src/pyedb/configuration/cfg_setup.py +0 -201
  18. {pyedb-0.15.0 → pyedb-0.16.0}/LICENSE +0 -0
  19. {pyedb-0.15.0 → pyedb-0.16.0}/README.md +0 -0
  20. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/configuration/__init__.py +0 -0
  21. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/configuration/cfg_boundaries.py +0 -0
  22. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/configuration/cfg_general.py +0 -0
  23. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/configuration/cfg_nets.py +0 -0
  24. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/configuration/cfg_operations.py +0 -0
  25. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/configuration/cfg_padstacks.py +0 -0
  26. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/configuration/cfg_pin_groups.py +0 -0
  27. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/configuration/cfg_ports_sources.py +0 -0
  28. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/configuration/cfg_s_parameter_models.py +0 -0
  29. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/configuration/cfg_spice_models.py +0 -0
  30. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/__init__.py +0 -0
  31. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/application/Variables.py +0 -0
  32. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/application/__init__.py +0 -0
  33. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/clr_module.py +0 -0
  34. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/__init__.py +0 -0
  35. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/cell/__init__.py +0 -0
  36. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/__init__.py +0 -0
  37. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/component.py +0 -0
  38. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/model.py +0 -0
  39. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/netlist_model.py +0 -0
  40. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/pin_pair_model.py +0 -0
  41. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/s_parameter_model.py +0 -0
  42. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/spice_model.py +0 -0
  43. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/cell/layout.py +0 -0
  44. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/cell/layout_obj.py +0 -0
  45. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/cell/primitive.py +0 -0
  46. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/cell/terminal/__init__.py +0 -0
  47. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/cell/terminal/bundle_terminal.py +0 -0
  48. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/cell/terminal/edge_terminal.py +0 -0
  49. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/cell/terminal/padstack_instance_terminal.py +0 -0
  50. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/cell/terminal/pingroup_terminal.py +0 -0
  51. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/cell/terminal/point_terminal.py +0 -0
  52. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/cell/terminal/terminal.py +0 -0
  53. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/cell/voltage_regulator.py +0 -0
  54. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/components.py +0 -0
  55. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/definition/__init__.py +0 -0
  56. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/definition/component_def.py +0 -0
  57. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/definition/component_model.py +0 -0
  58. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/definition/definition_obj.py +0 -0
  59. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/definition/definitions.py +0 -0
  60. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/definition/package_def.py +0 -0
  61. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/dotnet/__init__.py +0 -0
  62. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/dotnet/database.py +0 -0
  63. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/dotnet/layout.py +0 -0
  64. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/dotnet/primitive.py +0 -0
  65. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/edb_data/__init__.py +0 -0
  66. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/edb_data/control_file.py +0 -0
  67. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/edb_data/design_options.py +0 -0
  68. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/edb_data/edbvalue.py +0 -0
  69. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/edb_data/hfss_extent_info.py +0 -0
  70. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/edb_data/hfss_pi_simulation_setup_data.py +0 -0
  71. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/edb_data/layer_data.py +0 -0
  72. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/edb_data/nets_data.py +0 -0
  73. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/edb_data/padstacks_data.py +0 -0
  74. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/edb_data/ports.py +0 -0
  75. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/edb_data/primitives_data.py +0 -0
  76. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/edb_data/raptor_x_simulation_setup_data.py +0 -0
  77. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/edb_data/simulation_configuration.py +0 -0
  78. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/edb_data/sources.py +0 -0
  79. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/edb_data/utilities.py +0 -0
  80. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/edb_data/variables.py +0 -0
  81. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/general.py +0 -0
  82. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/geometry/__init__.py +0 -0
  83. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/geometry/point_data.py +0 -0
  84. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/geometry/polygon_data.py +0 -0
  85. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/hfss.py +0 -0
  86. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/layout_validation.py +0 -0
  87. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/materials.py +0 -0
  88. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/net_class.py +0 -0
  89. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/nets.py +0 -0
  90. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/padstack.py +0 -0
  91. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/sim_setup_data/__init__.py +0 -0
  92. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/__init__.py +0 -0
  93. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/adaptive_frequency_data.py +0 -0
  94. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/settings.py +0 -0
  95. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/sim_setup_info.py +0 -0
  96. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/simulation_settings.py +0 -0
  97. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/sim_setup_data/data/siw_dc_ir_settings.py +0 -0
  98. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/sim_setup_data/io/__init__.py +0 -0
  99. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/sim_setup_data/io/siwave.py +0 -0
  100. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/siwave.py +0 -0
  101. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/stackup.py +0 -0
  102. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/utilities/__init__.py +0 -0
  103. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/utilities/heatsink.py +0 -0
  104. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/utilities/obj_base.py +0 -0
  105. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/dotnet/edb_core/utilities/siwave_simulation_setup.py +0 -0
  106. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/edb_logger.py +0 -0
  107. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/exceptions.py +0 -0
  108. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/generic/__init__.py +0 -0
  109. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/generic/constants.py +0 -0
  110. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/generic/data_handlers.py +0 -0
  111. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/generic/design_types.py +0 -0
  112. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/generic/filesystem.py +0 -0
  113. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/generic/general_methods.py +0 -0
  114. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/generic/plot.py +0 -0
  115. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/generic/process.py +0 -0
  116. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/generic/settings.py +0 -0
  117. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/__init__.py +0 -0
  118. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/bom/__init__.py +0 -0
  119. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/bom/bom.py +0 -0
  120. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/bom/bom_item.py +0 -0
  121. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/bom/characteristics.py +0 -0
  122. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/bom/refdes.py +0 -0
  123. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/content/__init__.py +0 -0
  124. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/content/color.py +0 -0
  125. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/content/content.py +0 -0
  126. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/content/dictionary_color.py +0 -0
  127. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/content/dictionary_fill.py +0 -0
  128. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/content/dictionary_line.py +0 -0
  129. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/content/entry_color.py +0 -0
  130. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/content/entry_line.py +0 -0
  131. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/content/fill.py +0 -0
  132. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/content/layer_ref.py +0 -0
  133. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/content/standard_geometries_dictionary.py +0 -0
  134. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/ecad/__init__.py +0 -0
  135. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/ecad/cad_data/__init__.py +0 -0
  136. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/ecad/cad_data/assembly_drawing.py +0 -0
  137. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/ecad/cad_data/cad_data.py +0 -0
  138. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/ecad/cad_data/component.py +0 -0
  139. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/ecad/cad_data/drill.py +0 -0
  140. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/ecad/cad_data/feature.py +0 -0
  141. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/ecad/cad_data/layer.py +0 -0
  142. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/ecad/cad_data/layer_feature.py +0 -0
  143. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/ecad/cad_data/logical_net.py +0 -0
  144. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/ecad/cad_data/outline.py +0 -0
  145. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/ecad/cad_data/package.py +0 -0
  146. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/ecad/cad_data/padstack_def.py +0 -0
  147. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/ecad/cad_data/padstack_hole_def.py +0 -0
  148. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/ecad/cad_data/padstack_instance.py +0 -0
  149. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/ecad/cad_data/padstack_pad_def.py +0 -0
  150. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/ecad/cad_data/path.py +0 -0
  151. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/ecad/cad_data/phy_net.py +0 -0
  152. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/ecad/cad_data/pin.py +0 -0
  153. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/ecad/cad_data/polygon.py +0 -0
  154. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/ecad/cad_data/profile.py +0 -0
  155. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/ecad/cad_data/stackup.py +0 -0
  156. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/ecad/cad_data/stackup_group.py +0 -0
  157. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/ecad/cad_data/stackup_layer.py +0 -0
  158. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/ecad/cad_data/step.py +0 -0
  159. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/ecad/cad_header.py +0 -0
  160. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/ecad/ecad.py +0 -0
  161. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/ecad/spec.py +0 -0
  162. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/history_record.py +0 -0
  163. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/ipc2581.py +0 -0
  164. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/ipc2581/logistic_header.py +0 -0
  165. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/misc/__init__.py +0 -0
  166. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/misc/aedtlib_personalib_install.py +0 -0
  167. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/misc/downloads.py +0 -0
  168. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/misc/misc.py +0 -0
  169. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/misc/pyedb.runtimeconfig.json +0 -0
  170. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/misc/siw_feature_config/__init__.py +0 -0
  171. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/misc/siw_feature_config/emc/__init__.py +0 -0
  172. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/misc/siw_feature_config/emc/component_tags.py +0 -0
  173. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/misc/siw_feature_config/emc/net_tags.py +0 -0
  174. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/misc/siw_feature_config/emc/tag_library.py +0 -0
  175. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/misc/siw_feature_config/emc/xml_generic.py +0 -0
  176. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/misc/siw_feature_config/emc_rule_checker_settings.py +0 -0
  177. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/misc/utilities.py +0 -0
  178. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/modeler/geometry_operators.py +0 -0
  179. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/siwave.py +0 -0
  180. {pyedb-0.15.0 → pyedb-0.16.0}/src/pyedb/siwave_core/icepak.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyedb
3
- Version: 0.15.0
3
+ Version: 0.16.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>
@@ -22,7 +22,7 @@ Requires-Dist: dotnetcore2 ==3.1.23;platform_system=='Linux'
22
22
  Requires-Dist: pydantic>=2.6.4,<2.8
23
23
  Requires-Dist: toml == 0.10.2
24
24
  Requires-Dist: Rtree >= 1.2.0
25
- Requires-Dist: numpy>=1.20.0,<3
25
+ Requires-Dist: numpy>=1.20.0,<2
26
26
  Requires-Dist: ansys-sphinx-theme>=0.10.0,<0.17 ; extra == "doc"
27
27
  Requires-Dist: imageio>=2.30.0,<2.35 ; extra == "doc"
28
28
  Requires-Dist: ipython>=8.13.0,<8.26 ; extra == "doc"
@@ -41,7 +41,7 @@ Requires-Dist: sphinx_design>=0.4.0,<0.7 ; extra == "doc"
41
41
  Requires-Dist: matplotlib>=3.5.0,<3.10 ; extra == "full"
42
42
  Requires-Dist: pandas>=1.1.0,<2.3 ; extra == "full"
43
43
  Requires-Dist: matplotlib>=3.5.0,<3.10 ; extra == "tests"
44
- Requires-Dist: numpy>=1.20.0,<3 ; extra == "tests"
44
+ Requires-Dist: numpy>=1.20.0,<2 ; extra == "tests"
45
45
  Requires-Dist: mock>=5.1.0,<5.2 ; extra == "tests"
46
46
  Requires-Dist: pandas>=1.1.0,<2.3 ; extra == "tests"
47
47
  Requires-Dist: pytest>=7.4.0,<8.3 ; extra == "tests"
@@ -32,13 +32,13 @@ dependencies = [
32
32
  "pydantic>=2.6.4,<2.8",
33
33
  "toml == 0.10.2",
34
34
  "Rtree >= 1.2.0",
35
- "numpy>=1.20.0,<3",
35
+ "numpy>=1.20.0,<2",
36
36
  ]
37
37
 
38
38
  [project.optional-dependencies]
39
39
  tests = [
40
40
  "matplotlib>=3.5.0,<3.10",
41
- "numpy>=1.20.0,<3",
41
+ "numpy>=1.20.0,<2",
42
42
  "mock>=5.1.0,<5.2",
43
43
  "pandas>=1.1.0,<2.3",
44
44
  "pytest>=7.4.0,<8.3",
@@ -44,7 +44,7 @@ deprecation_warning()
44
44
  #
45
45
 
46
46
  pyedb_path = os.path.dirname(__file__)
47
- __version__ = "0.15.0"
47
+ __version__ = "0.16.0"
48
48
  version = __version__
49
49
 
50
50
  #
@@ -22,9 +22,7 @@
22
22
 
23
23
 
24
24
  class CfgBase:
25
- @property
26
- def protected_attributes(self):
27
- return []
25
+ protected_attributes = []
28
26
 
29
27
  def get_attributes(self, exclude=None):
30
28
  attrs = {i: j for i, j in self.__dict__.items() if i not in self.protected_attributes}
@@ -51,6 +51,8 @@ class CfgRlcModel(CfgBase):
51
51
 
52
52
 
53
53
  class CfgComponent(CfgBase):
54
+ protected_attributes = ["reference_designator"]
55
+
54
56
  def __init__(self, **kwargs):
55
57
  self.enabled = kwargs.get("enabled", None)
56
58
 
@@ -65,15 +67,11 @@ class CfgComponent(CfgBase):
65
67
 
66
68
  self.rlc_model = [CfgRlcModel(**rlc_m) for rlc_m in rlc_models]
67
69
 
68
- @property
69
- def protected_attributes(self):
70
- return ["reference_designator"]
71
-
72
70
 
73
71
  class CfgComponents:
74
- def __init__(self, pedb, data):
72
+ def __init__(self, pedb, components_data):
75
73
  self._pedb = pedb
76
- self.components = [CfgComponent(**comp) for comp in data]
74
+ self.components = [CfgComponent(**comp) for comp in components_data]
77
75
 
78
76
  def apply(self):
79
77
  comps_in_db = self._pedb.components
@@ -31,7 +31,7 @@ from pyedb.configuration.cfg_padstacks import CfgPadstacks
31
31
  from pyedb.configuration.cfg_pin_groups import CfgPinGroup
32
32
  from pyedb.configuration.cfg_ports_sources import CfgPort, CfgSources
33
33
  from pyedb.configuration.cfg_s_parameter_models import CfgSParameterModel
34
- from pyedb.configuration.cfg_setup import CfgSetup
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
37
37
 
@@ -54,8 +54,7 @@ class CfgData(object):
54
54
  self, kwargs.get("nets", {}).get("signal_nets", []), kwargs.get("nets", {}).get("power_ground_nets", [])
55
55
  )
56
56
 
57
- # self.components = [CfgComponent(self, **component) for component in kwargs.get("components", [])]
58
- self.components = CfgComponents(self._pedb, data=kwargs.get("components", []))
57
+ self.components = CfgComponents(self._pedb, components_data=kwargs.get("components", []))
59
58
 
60
59
  self.padstacks = CfgPadstacks(self, kwargs.get("padstacks", None))
61
60
 
@@ -65,9 +64,7 @@ class CfgData(object):
65
64
 
66
65
  self.sources = [CfgSources(self, **source) for source in kwargs.get("sources", [])]
67
66
 
68
- self.setups = []
69
- if kwargs.get("setups", None):
70
- self.setups = [CfgSetup(self, setup) for setup in kwargs.get("setups", [])]
67
+ self.setups = CfgSetups(self._pedb, setups_data=kwargs.get("setups", []))
71
68
 
72
69
  self.stackup = CfgStackup(self._pedb, data=kwargs.get("stackup", {}))
73
70
 
@@ -27,6 +27,9 @@ from pyedb.dotnet.edb_core.definition.package_def import PackageDef
27
27
  class CfgPackage(CfgBase):
28
28
  """Configuration package class."""
29
29
 
30
+ # Attributes cannot be set to package definition class or don't exist in package definition class.
31
+ protected_attributes = ["apply_to_all", "components", "extent_bounding_box", "component_definition"]
32
+
30
33
  def __init__(self, **kwargs):
31
34
  self.name = kwargs.get("name", None)
32
35
  self.component_definition = kwargs.get("component_definition", None)
@@ -48,11 +51,6 @@ class CfgPackage(CfgBase):
48
51
  def heatsink(self, value):
49
52
  self._heatsink = value
50
53
 
51
- @property
52
- def protected_attributes(self):
53
- """Attributes cannot be set to package definition class or don't exist in package definition class."""
54
- return ["apply_to_all", "components", "extent_bounding_box", "component_definition"]
55
-
56
54
 
57
55
  class CfgHeatSink(CfgBase):
58
56
  """Configuration heat sink class."""
@@ -0,0 +1,239 @@
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 CfgFrequencies(CfgBase):
27
+ def __init__(self, **kwargs):
28
+ self.distribution = kwargs.get("distribution").replace(" ", "_") if kwargs.get("distribution") else None
29
+ self.start = kwargs.get("start")
30
+ self.stop = kwargs.get("stop")
31
+ self.increment = kwargs.get("increment", kwargs.get("points", kwargs.get("samples", kwargs.get("step"))))
32
+
33
+
34
+ class CfgSweepData(CfgBase):
35
+ def __init__(self, **kwargs):
36
+ self.name = kwargs.get("name")
37
+ self.type = kwargs.get("type").lower() if kwargs.get("type") else None
38
+ self.frequencies = []
39
+ for kw in kwargs.get("frequencies", []):
40
+ self.frequencies.append(CfgFrequencies(**kw))
41
+
42
+
43
+ class CfgSetup(CfgBase):
44
+ def __init__(self, pedb, **kwargs):
45
+ self._pedb = pedb
46
+ self.name = kwargs.get("name")
47
+ self.type = kwargs.get("type").lower() if kwargs.get("type") else None
48
+
49
+ self.freq_sweep = []
50
+ for i in kwargs.get("freq_sweep", []):
51
+ self.freq_sweep.append(CfgSweepData(**i))
52
+
53
+ def _apply_freq_sweep(self, edb_setup):
54
+ for i in self.freq_sweep:
55
+ f_set = []
56
+ kw = {}
57
+ for attr in i.get_attributes(exclude="name"):
58
+ if attr == "frequencies":
59
+ for f in i.frequencies:
60
+ f_set.append([f.distribution, f.start, f.stop, f.increment])
61
+ else:
62
+ kw[attr] = getattr(i, attr)
63
+ edb_setup.add_sweep(i.name, frequency_set=f_set, **kw)
64
+
65
+
66
+ class CfgSIwaveACSetup(CfgSetup):
67
+ def __init__(self, pedb, **kwargs):
68
+ super().__init__(pedb, **kwargs)
69
+ self.si_slider_position = kwargs.get("si_slider_position")
70
+ self.pi_slider_position = kwargs.get("pi_slider_position")
71
+
72
+ def apply(self):
73
+ if self.name in self._pedb.setups:
74
+ raise "Setup {} already existing. Editing it.".format(self.name)
75
+
76
+ kwargs = (
77
+ {"si_slider_position": self.si_slider_position}
78
+ if self.si_slider_position is not None
79
+ else {"pi_slider_position": self.pi_slider_position}
80
+ )
81
+
82
+ edb_setup = self._pedb.create_siwave_syz_setup(name=self.name, **kwargs)
83
+ self._apply_freq_sweep(edb_setup)
84
+
85
+
86
+ class CfgSIwaveDCSetup(CfgSetup):
87
+ def __init__(self, pedb, **kwargs):
88
+ super().__init__(pedb, **kwargs)
89
+ self.dc_slider_position = kwargs.get("dc_slider_position")
90
+ self.dc_ir_settings = CfgDcIrSettings(**kwargs.get("dc_ir_settings", {}))
91
+ self.freq_sweep = None
92
+
93
+ def apply(self):
94
+ edb_setup = self._pedb.create_siwave_dc_setup(name=self.name, dc_slider_position=self.dc_slider_position)
95
+ for k, v in self.dc_ir_settings.get_attributes().items():
96
+ if k == "dc_slider_postion":
97
+ edb_setup.dc_settings.dc_slider_position = v
98
+ else:
99
+ setattr(edb_setup.dc_ir_settings, k, v)
100
+
101
+
102
+ class CfgHFSSSetup(CfgSetup):
103
+ def __init__(self, pedb, **kwargs):
104
+ super().__init__(pedb, **kwargs)
105
+
106
+ self.f_adapt = kwargs.get("f_adapt")
107
+ self.max_num_passes = kwargs.get("max_num_passes")
108
+ self.max_mag_delta_s = kwargs.get("max_mag_delta_s")
109
+
110
+ self.mesh_operations = []
111
+ for i in kwargs.get("mesh_operations", []):
112
+ self.mesh_operations.append(CfgLengthMeshOperation(**i))
113
+
114
+ def apply(self):
115
+ if self.name in self._pedb.setups:
116
+ raise "Setup {} already existing. Editing it.".format(self.name)
117
+
118
+ edb_setup = self._pedb.create_hfss_setup(self.name)
119
+ edb_setup.set_solution_single_frequency(self.f_adapt, self.max_num_passes, self.max_mag_delta_s)
120
+
121
+ self._apply_freq_sweep(edb_setup)
122
+
123
+ for i in self.mesh_operations:
124
+ edb_setup.add_length_mesh_operation(
125
+ net_layer_list=i.nets_layers_list,
126
+ name=i.name,
127
+ # max_elements=i.max_elements,
128
+ max_length=i.max_length,
129
+ # restrict_elements=i.restrict_max_elements,
130
+ restrict_length=i.restrict_length,
131
+ refine_inside=i.refine_inside,
132
+ # mesh_region=i.mesh_region
133
+ )
134
+
135
+
136
+ class CfgDcIrSettings(CfgBase):
137
+ def __init__(self, **kwargs):
138
+ self.export_dc_thermal_data = kwargs.get("export_dc_thermal_data")
139
+
140
+
141
+ class CfgMeshOperation(CfgBase):
142
+ def __init__(self, **kwargs):
143
+ self.name = kwargs.get("name")
144
+ self.type = kwargs.get("type")
145
+ # self.mesh_region = kwargs.get("mesh_region")
146
+ self.nets_layers_list = kwargs.get("nets_layers_list", {})
147
+ self.refine_inside = kwargs.get("refine_inside", False)
148
+
149
+
150
+ class CfgLengthMeshOperation(CfgMeshOperation):
151
+ def __init__(self, **kwargs):
152
+ super().__init__(**kwargs)
153
+
154
+ # waiting bug review
155
+ # self.restrict_max_elements = kwargs.get("restrict_max_elements", True)
156
+ # self.max_elements = kwargs.get("max_elements", 1000)
157
+ self.restrict_length = kwargs.get("restrict_length", True)
158
+ self.max_length = kwargs.get("max_length", "1mm")
159
+
160
+
161
+ class CfgSetups:
162
+ def __init__(self, pedb, setups_data):
163
+ self._pedb = pedb
164
+ self.setups = []
165
+ for stp in setups_data:
166
+ if stp.get("type").lower() == "hfss":
167
+ self.setups.append(CfgHFSSSetup(self._pedb, **stp))
168
+ elif stp.get("type").lower() in ["siwave_ac", "siwave_syz"]:
169
+ self.setups.append(CfgSIwaveACSetup(self._pedb, **stp))
170
+ elif stp.get("type").lower() == "siwave_dc":
171
+ self.setups.append(CfgSIwaveDCSetup(self._pedb, **stp))
172
+
173
+ def apply(self):
174
+ for s in self.setups:
175
+ s.apply()
176
+
177
+ def get_data_from_db(self):
178
+ setups = []
179
+ for _, s in self._pedb.setups.items():
180
+ stp = {}
181
+ if s.type == "hfss":
182
+ for p_name in CfgHFSSSetup(self._pedb).__dict__:
183
+ if p_name.startswith("_"):
184
+ continue
185
+ elif p_name == "type":
186
+ stp[p_name] = s.type
187
+ elif p_name == "f_adapt":
188
+ stp[p_name] = list(s.adaptive_settings.adaptive_frequency_data_list)[0].adaptive_frequency
189
+ elif p_name == "max_num_passes":
190
+ stp[p_name] = list(s.adaptive_settings.adaptive_frequency_data_list)[0].max_passes
191
+ elif p_name == "max_mag_delta_s":
192
+ stp[p_name] = list(s.adaptive_settings.adaptive_frequency_data_list)[0].max_delta
193
+ elif p_name == "freq_sweep":
194
+ f_sweep = []
195
+ for _, sw in s.sweeps.items():
196
+ sweep_data = {}
197
+ for sw_p_name in CfgSweepData().__dict__:
198
+ if sw_p_name == "frequencies":
199
+ pass # Frequencies cannot be read from EDB
200
+ else:
201
+ sweep_data[sw_p_name] = getattr(sw, sw_p_name)
202
+ f_sweep.append(sweep_data)
203
+ stp["freq_sweep"] = f_sweep
204
+ elif p_name == "mesh_operations":
205
+ mops = []
206
+ for _, i in s.mesh_operations.items():
207
+ mop = {}
208
+ for mop_p_name in CfgLengthMeshOperation().__dict__:
209
+ mop[mop_p_name] = getattr(i, mop_p_name)
210
+ mops.append(mop)
211
+ stp["mesh_operations"] = mops
212
+ else:
213
+ stp[p_name] = getattr(s, p_name)
214
+
215
+ elif s.type == "siwave_ac":
216
+ for p_name in CfgSIwaveACSetup(self._pedb).__dict__:
217
+ if p_name.startswith("_"):
218
+ continue
219
+ elif p_name == "freq_sweep":
220
+ pass # Bug in EDB API
221
+ else:
222
+ stp[p_name] = getattr(s, p_name)
223
+ elif s.type == "siwave_dc":
224
+ for p_name in CfgSIwaveDCSetup(self._pedb).__dict__:
225
+ if p_name.startswith("_"):
226
+ continue
227
+ elif p_name == "freq_sweep":
228
+ pass
229
+ elif p_name == "dc_ir_settings":
230
+ dc_ir_s = {}
231
+ for dcir_p_name in CfgDcIrSettings().__dict__:
232
+ dc_ir_s[dcir_p_name] = getattr(s.dc_ir_settings, dcir_p_name)
233
+ stp["dc_ir_settings"] = dc_ir_s
234
+ elif p_name == "dc_slider_position":
235
+ stp[p_name] = getattr(s.dc_settings, p_name)
236
+ else:
237
+ stp[p_name] = getattr(s, p_name)
238
+ setups.append(stp)
239
+ return setups
@@ -127,7 +127,7 @@ class CfgStackup:
127
127
  attrs = mat_in_cfg.get_attributes()
128
128
  mat = self._pedb.materials.add_material(**attrs)
129
129
 
130
- def __get_materials_from_db(self):
130
+ def get_materials_from_db(self):
131
131
  materials = []
132
132
  for name, p in self._pedb.materials.materials.items():
133
133
  mat = {}
@@ -136,7 +136,7 @@ class CfgStackup:
136
136
  materials.append(mat)
137
137
  return materials
138
138
 
139
- def __get_layers_from_db(self):
139
+ def get_layers_from_db(self):
140
140
  layers = []
141
141
  for name, obj in self._pedb.stackup.all_layers.items():
142
142
  layer = {}
@@ -155,8 +155,8 @@ class CfgStackup:
155
155
  dict
156
156
  """
157
157
  stackup = {}
158
- materials = self.__get_materials_from_db()
158
+ materials = self.get_materials_from_db()
159
159
  stackup["materials"] = materials
160
- layers = self.__get_layers_from_db()
160
+ layers = self.get_layers_from_db()
161
161
  stackup["layers"] = layers
162
162
  return stackup
@@ -131,9 +131,8 @@ class Configuration:
131
131
  for source in self.cfg_data.sources:
132
132
  source.create()
133
133
 
134
- # Configure HFSS setup
135
- for setup in self.cfg_data.setups:
136
- setup.apply()
134
+ # Configure setup
135
+ self.cfg_data.setups.apply()
137
136
 
138
137
  # Configure stackup
139
138
  self.cfg_data.stackup.apply()
@@ -264,15 +263,18 @@ class Configuration:
264
263
  -------
265
264
 
266
265
  """
266
+ self._pedb.logger.info("Getting data from layout database.")
267
267
  data = {}
268
268
  if kwargs.get("stackup", False):
269
269
  data["stackup"] = self.cfg_data.stackup.get_data_from_db()
270
270
  if kwargs.get("package_definitions", False):
271
271
  data["package_definitions"] = self.cfg_data.package_definitions.get_data_from_db()
272
+ if kwargs.get("setups", False):
273
+ data["setups"] = self.cfg_data.setups.get_data_from_db()
272
274
 
273
275
  return data
274
276
 
275
- def export(self, file_path, stackup=True, package_definitions=True):
277
+ def export(self, file_path, stackup=True, package_definitions=True, setups=True):
276
278
  """Export the configuration data from layout to a file.
277
279
 
278
280
  Parameters
@@ -288,7 +290,7 @@ class Configuration:
288
290
  """
289
291
  file_path = file_path if isinstance(file_path, Path) else Path(file_path)
290
292
  file_path = file_path if file_path.suffix == ".json" else file_path.with_suffix(".json")
291
- data = self.get_data_from_db(stackup=stackup, package_definitions=package_definitions)
293
+ data = self.get_data_from_db(stackup=stackup, package_definitions=package_definitions, setups=setups)
292
294
  with open(file_path, "w") as f:
293
295
  json.dump(data, f, ensure_ascii=False, indent=4)
294
296
  return True if os.path.isfile(file_path) else False
@@ -3681,7 +3681,7 @@ class Edb(Database):
3681
3681
  return False
3682
3682
  return HFSSPISimulationSetup(self).create(name)
3683
3683
 
3684
- def create_siwave_syz_setup(self, name=None):
3684
+ def create_siwave_syz_setup(self, name=None, **kwargs):
3685
3685
  """Create a setup from a template.
3686
3686
 
3687
3687
  Parameters
@@ -3709,9 +3709,11 @@ class Edb(Database):
3709
3709
  if name in self.setups:
3710
3710
  return False
3711
3711
  setup = SiwaveSimulationSetup(self, name=name)
3712
+ for k, v in kwargs.items():
3713
+ setattr(setup, k, v)
3712
3714
  return self.setups[name]
3713
3715
 
3714
- def create_siwave_dc_setup(self, name=None):
3716
+ def create_siwave_dc_setup(self, name=None, **kwargs):
3715
3717
  """Create a setup from a template.
3716
3718
 
3717
3719
  Parameters
@@ -3736,6 +3738,8 @@ class Edb(Database):
3736
3738
  if name in self.setups:
3737
3739
  return False
3738
3740
  setup = SiwaveDCSimulationSetup(self, name=name)
3741
+ for k, v in kwargs.items():
3742
+ setattr(setup, k, v)
3739
3743
  return setup
3740
3744
 
3741
3745
  def calculate_initial_extent(self, expansion_factor):
@@ -149,10 +149,13 @@ class EdbLayout(object):
149
149
  _primitives_by_layer = {}
150
150
  for lay in self.layers:
151
151
  _primitives_by_layer[lay] = []
152
+ for lay in self._pedb.stackup.non_stackup_layers:
153
+ _primitives_by_layer[lay] = []
152
154
  for i in self._layout.primitives:
153
155
  try:
154
156
  lay = i.GetLayer().GetName()
155
- _primitives_by_layer[lay].append(cast(i, self._pedb))
157
+ if lay in _primitives_by_layer:
158
+ _primitives_by_layer[lay].append(cast(i, self._pedb))
156
159
  except:
157
160
  self._logger.warning(f"Failed to get layer on primitive {i}, skipping.")
158
161
  continue