pyedb 0.59.0__py3-none-any.whl → 0.61.0__py3-none-any.whl

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 (318) hide show
  1. pyedb/__init__.py +23 -1
  2. pyedb/common/__init__.py +21 -0
  3. pyedb/common/nets.py +22 -0
  4. pyedb/component_libraries/ansys_components.py +22 -0
  5. pyedb/configuration/__init__.py +21 -0
  6. pyedb/configuration/cfg_boundaries.py +1 -1
  7. pyedb/configuration/cfg_common.py +1 -1
  8. pyedb/configuration/cfg_components.py +36 -8
  9. pyedb/configuration/cfg_data.py +1 -1
  10. pyedb/configuration/cfg_general.py +1 -1
  11. pyedb/configuration/cfg_modeler.py +1 -1
  12. pyedb/configuration/cfg_nets.py +1 -1
  13. pyedb/configuration/cfg_operations.py +1 -1
  14. pyedb/configuration/cfg_package_definition.py +1 -1
  15. pyedb/configuration/cfg_padstacks.py +1 -1
  16. pyedb/configuration/cfg_pin_groups.py +1 -1
  17. pyedb/configuration/cfg_ports_sources.py +3 -2
  18. pyedb/configuration/cfg_s_parameter_models.py +1 -1
  19. pyedb/configuration/cfg_setup.py +5 -1
  20. pyedb/configuration/cfg_spice_models.py +1 -1
  21. pyedb/configuration/cfg_stackup.py +1 -1
  22. pyedb/configuration/cfg_terminals.py +22 -0
  23. pyedb/configuration/configuration.py +6 -5
  24. pyedb/dotnet/__init__.py +21 -0
  25. pyedb/dotnet/clr_module.py +22 -0
  26. pyedb/dotnet/database/Variables.py +1 -1
  27. pyedb/dotnet/database/__init__.py +22 -0
  28. pyedb/dotnet/database/cell/__init__.py +21 -0
  29. pyedb/dotnet/database/cell/connectable.py +1 -1
  30. pyedb/dotnet/database/cell/hierarchy/__init__.py +21 -0
  31. pyedb/dotnet/database/cell/hierarchy/component.py +9 -7
  32. pyedb/dotnet/database/cell/hierarchy/hierarchy_obj.py +1 -1
  33. pyedb/dotnet/database/cell/hierarchy/model.py +2 -29
  34. pyedb/dotnet/database/cell/hierarchy/netlist_model.py +1 -1
  35. pyedb/dotnet/database/cell/hierarchy/pin_pair_model.py +1 -1
  36. pyedb/dotnet/database/cell/hierarchy/s_parameter_model.py +11 -15
  37. pyedb/dotnet/database/cell/hierarchy/spice_model.py +14 -8
  38. pyedb/dotnet/database/cell/layout.py +5 -4
  39. pyedb/dotnet/database/cell/layout_obj.py +1 -1
  40. pyedb/dotnet/database/cell/primitive/__init__.py +22 -0
  41. pyedb/dotnet/database/cell/primitive/bondwire.py +1 -1
  42. pyedb/dotnet/database/cell/primitive/path.py +1 -1
  43. pyedb/dotnet/database/cell/primitive/primitive.py +1 -1
  44. pyedb/dotnet/database/cell/terminal/__init__.py +21 -0
  45. pyedb/dotnet/database/cell/terminal/bundle_terminal.py +1 -1
  46. pyedb/dotnet/database/cell/terminal/edge_terminal.py +1 -1
  47. pyedb/dotnet/database/cell/terminal/padstack_instance_terminal.py +1 -1
  48. pyedb/dotnet/database/cell/terminal/pingroup_terminal.py +1 -1
  49. pyedb/dotnet/database/cell/terminal/point_terminal.py +1 -1
  50. pyedb/dotnet/database/cell/terminal/terminal.py +7 -2
  51. pyedb/dotnet/database/cell/voltage_regulator.py +1 -1
  52. pyedb/dotnet/database/components.py +6 -2
  53. pyedb/dotnet/database/definition/__init__.py +21 -0
  54. pyedb/dotnet/database/definition/component_def.py +1 -1
  55. pyedb/dotnet/database/definition/component_model.py +1 -1
  56. pyedb/dotnet/database/definition/definition_obj.py +1 -1
  57. pyedb/dotnet/database/definition/definitions.py +1 -1
  58. pyedb/dotnet/database/definition/package_def.py +1 -1
  59. pyedb/dotnet/database/dotnet/__init__.py +21 -0
  60. pyedb/dotnet/database/dotnet/database.py +1 -1
  61. pyedb/dotnet/database/dotnet/primitive.py +1 -1
  62. pyedb/dotnet/database/edb_data/__init__.py +21 -0
  63. pyedb/dotnet/database/edb_data/control_file.py +1 -1
  64. pyedb/dotnet/database/edb_data/design_options.py +1 -1
  65. pyedb/dotnet/database/edb_data/edbvalue.py +1 -1
  66. pyedb/dotnet/database/edb_data/hfss_extent_info.py +1 -1
  67. pyedb/dotnet/database/edb_data/layer_data.py +1 -1
  68. pyedb/dotnet/database/edb_data/nets_data.py +1 -1
  69. pyedb/dotnet/database/edb_data/padstacks_data.py +6 -4
  70. pyedb/dotnet/database/edb_data/ports.py +1 -1
  71. pyedb/dotnet/database/edb_data/primitives_data.py +1 -1
  72. pyedb/dotnet/database/edb_data/raptor_x_simulation_setup_data.py +1 -1
  73. pyedb/dotnet/database/edb_data/simulation_configuration.py +1 -1
  74. pyedb/dotnet/database/edb_data/sources.py +1 -1
  75. pyedb/dotnet/database/edb_data/utilities.py +1 -1
  76. pyedb/dotnet/database/edb_data/variables.py +1 -1
  77. pyedb/dotnet/database/general.py +1 -1
  78. pyedb/dotnet/database/geometry/__init__.py +21 -0
  79. pyedb/dotnet/database/geometry/point_data.py +1 -1
  80. pyedb/dotnet/database/geometry/polygon_data.py +1 -1
  81. pyedb/dotnet/database/hfss.py +1 -1
  82. pyedb/dotnet/database/layout_obj_instance.py +1 -1
  83. pyedb/dotnet/database/layout_validation.py +1 -1
  84. pyedb/dotnet/database/materials.py +1 -1
  85. pyedb/dotnet/database/modeler.py +3 -2
  86. pyedb/dotnet/database/net_class.py +1 -1
  87. pyedb/dotnet/database/nets.py +1 -1
  88. pyedb/dotnet/database/padstack.py +188 -2
  89. pyedb/dotnet/database/sim_setup_data/__init__.py +22 -0
  90. pyedb/dotnet/database/sim_setup_data/data/__init__.py +22 -0
  91. pyedb/dotnet/database/sim_setup_data/data/adaptive_frequency_data.py +1 -1
  92. pyedb/dotnet/database/sim_setup_data/data/mesh_operation.py +1 -1
  93. pyedb/dotnet/database/sim_setup_data/data/settings.py +1 -1
  94. pyedb/dotnet/database/sim_setup_data/data/sim_setup_info.py +1 -1
  95. pyedb/dotnet/database/sim_setup_data/data/simulation_settings.py +1 -1
  96. pyedb/dotnet/database/sim_setup_data/data/siw_dc_ir_settings.py +1 -1
  97. pyedb/dotnet/database/sim_setup_data/data/sweep_data.py +1 -1
  98. pyedb/dotnet/database/sim_setup_data/io/__init__.py +21 -0
  99. pyedb/dotnet/database/sim_setup_data/io/siwave.py +1 -1
  100. pyedb/dotnet/database/siwave.py +1 -1
  101. pyedb/dotnet/database/stackup.py +1 -1
  102. pyedb/dotnet/database/utilities/__init__.py +22 -0
  103. pyedb/dotnet/database/utilities/heatsink.py +23 -0
  104. pyedb/dotnet/database/utilities/hfss_simulation_setup.py +1 -1
  105. pyedb/dotnet/database/utilities/obj_base.py +1 -1
  106. pyedb/dotnet/database/utilities/simulation_setup.py +1 -1
  107. pyedb/dotnet/database/utilities/siwave_cpa_simulation_setup.py +22 -0
  108. pyedb/dotnet/database/utilities/siwave_simulation_setup.py +22 -0
  109. pyedb/dotnet/database/utilities/value.py +1 -1
  110. pyedb/dotnet/edb.py +119 -123
  111. pyedb/edb_logger.py +1 -1
  112. pyedb/exceptions.py +22 -0
  113. pyedb/extensions/__init__.py +21 -0
  114. pyedb/extensions/create_cell_array.py +1 -1
  115. pyedb/extensions/via_design_backend.py +22 -0
  116. pyedb/generic/__init__.py +21 -0
  117. pyedb/generic/constants.py +1 -1
  118. pyedb/generic/data_handlers.py +22 -0
  119. pyedb/generic/design_types.py +1 -1
  120. pyedb/generic/filesystem.py +22 -0
  121. pyedb/generic/general_methods.py +22 -1
  122. pyedb/generic/grpc_warnings.py +22 -0
  123. pyedb/generic/plot.py +22 -0
  124. pyedb/generic/process.py +29 -2
  125. pyedb/generic/settings.py +1 -1
  126. pyedb/grpc/__init__.py +21 -0
  127. pyedb/grpc/database/__init__.py +21 -0
  128. pyedb/grpc/database/_typing.py +21 -0
  129. pyedb/grpc/database/components.py +9 -8
  130. pyedb/grpc/database/control_file.py +1 -1
  131. pyedb/grpc/database/definition/__init__.py +21 -0
  132. pyedb/grpc/database/definition/component_def.py +1 -1
  133. pyedb/grpc/database/definition/component_model.py +1 -1
  134. pyedb/grpc/database/definition/component_pin.py +1 -1
  135. pyedb/grpc/database/definition/materials.py +2 -2
  136. pyedb/grpc/database/definition/n_port_component_model.py +1 -1
  137. pyedb/grpc/database/definition/package_def.py +1 -1
  138. pyedb/grpc/database/definition/padstack_def.py +17 -10
  139. pyedb/grpc/database/definitions.py +1 -1
  140. pyedb/grpc/database/general.py +1 -1
  141. pyedb/grpc/database/geometry/__init__.py +21 -0
  142. pyedb/grpc/database/geometry/arc_data.py +1 -1
  143. pyedb/grpc/database/geometry/point_3d_data.py +1 -1
  144. pyedb/grpc/database/geometry/point_data.py +1 -1
  145. pyedb/grpc/database/geometry/polygon_data.py +1 -1
  146. pyedb/grpc/database/hfss.py +1 -1
  147. pyedb/grpc/database/hierarchy/__init__.py +21 -0
  148. pyedb/grpc/database/hierarchy/component.py +1 -1
  149. pyedb/grpc/database/hierarchy/model.py +1 -1
  150. pyedb/grpc/database/hierarchy/netlist_model.py +1 -1
  151. pyedb/grpc/database/hierarchy/pin_pair_model.py +1 -1
  152. pyedb/grpc/database/hierarchy/pingroup.py +1 -1
  153. pyedb/grpc/database/hierarchy/s_parameter_model.py +1 -1
  154. pyedb/grpc/database/hierarchy/spice_model.py +1 -1
  155. pyedb/grpc/database/layers/__init__.py +21 -0
  156. pyedb/grpc/database/layers/layer.py +22 -0
  157. pyedb/grpc/database/layers/stackup_layer.py +1 -1
  158. pyedb/grpc/database/layout/__init__.py +21 -0
  159. pyedb/grpc/database/layout/cell.py +1 -1
  160. pyedb/grpc/database/layout/layout.py +1 -1
  161. pyedb/grpc/database/layout/voltage_regulator.py +1 -1
  162. pyedb/grpc/database/layout_validation.py +1 -1
  163. pyedb/grpc/database/modeler.py +31 -9
  164. pyedb/grpc/database/net/__init__.py +21 -0
  165. pyedb/grpc/database/net/differential_pair.py +1 -1
  166. pyedb/grpc/database/net/extended_net.py +1 -1
  167. pyedb/grpc/database/net/net.py +1 -1
  168. pyedb/grpc/database/net/net_class.py +1 -1
  169. pyedb/grpc/database/nets.py +1 -1
  170. pyedb/grpc/database/padstacks.py +209 -9
  171. pyedb/grpc/database/ports/__init__.py +21 -0
  172. pyedb/grpc/database/ports/ports.py +1 -1
  173. pyedb/grpc/database/primitive/__init__.py +22 -0
  174. pyedb/grpc/database/primitive/bondwire.py +1 -1
  175. pyedb/grpc/database/primitive/circle.py +1 -1
  176. pyedb/grpc/database/primitive/padstack_instance.py +111 -16
  177. pyedb/grpc/database/primitive/path.py +1 -1
  178. pyedb/grpc/database/primitive/polygon.py +6 -4
  179. pyedb/grpc/database/primitive/primitive.py +1 -6
  180. pyedb/grpc/database/primitive/rectangle.py +1 -1
  181. pyedb/grpc/database/simulation_setup/__init__.py +21 -0
  182. pyedb/grpc/database/simulation_setup/adaptive_frequency.py +1 -1
  183. pyedb/grpc/database/simulation_setup/hfss_advanced_meshing_settings.py +1 -1
  184. pyedb/grpc/database/simulation_setup/hfss_advanced_settings.py +1 -1
  185. pyedb/grpc/database/simulation_setup/hfss_dcr_settings.py +1 -1
  186. pyedb/grpc/database/simulation_setup/hfss_general_settings.py +1 -1
  187. pyedb/grpc/database/simulation_setup/hfss_settings_options.py +1 -1
  188. pyedb/grpc/database/simulation_setup/hfss_simulation_settings.py +1 -1
  189. pyedb/grpc/database/simulation_setup/hfss_simulation_setup.py +1 -1
  190. pyedb/grpc/database/simulation_setup/hfss_solver_settings.py +1 -1
  191. pyedb/grpc/database/simulation_setup/mesh_operation.py +1 -1
  192. pyedb/grpc/database/simulation_setup/raptor_x_advanced_settings.py +1 -1
  193. pyedb/grpc/database/simulation_setup/raptor_x_general_settings.py +1 -1
  194. pyedb/grpc/database/simulation_setup/raptor_x_simulation_settings.py +1 -1
  195. pyedb/grpc/database/simulation_setup/raptor_x_simulation_setup.py +1 -1
  196. pyedb/grpc/database/simulation_setup/siwave_cpa_simulation_setup.py +22 -0
  197. pyedb/grpc/database/simulation_setup/siwave_dcir_simulation_setup.py +1 -1
  198. pyedb/grpc/database/simulation_setup/siwave_simulation_setup.py +1 -1
  199. pyedb/grpc/database/simulation_setup/sweep_data.py +1 -1
  200. pyedb/grpc/database/siwave.py +1 -1
  201. pyedb/grpc/database/source_excitations.py +1 -1
  202. pyedb/grpc/database/stackup.py +1 -1
  203. pyedb/grpc/database/terminal/__init__.py +21 -0
  204. pyedb/grpc/database/terminal/bundle_terminal.py +1 -1
  205. pyedb/grpc/database/terminal/edge_terminal.py +1 -1
  206. pyedb/grpc/database/terminal/padstack_instance_terminal.py +1 -1
  207. pyedb/grpc/database/terminal/pingroup_terminal.py +1 -1
  208. pyedb/grpc/database/terminal/point_terminal.py +1 -1
  209. pyedb/grpc/database/terminal/terminal.py +1 -1
  210. pyedb/grpc/database/utility/__init__.py +22 -0
  211. pyedb/grpc/database/utility/constants.py +1 -1
  212. pyedb/grpc/database/utility/heat_sink.py +1 -1
  213. pyedb/grpc/database/utility/hfss_extent_info.py +1 -1
  214. pyedb/grpc/database/utility/layout_statistics.py +1 -1
  215. pyedb/grpc/database/utility/rlc.py +1 -1
  216. pyedb/grpc/database/utility/sources.py +1 -1
  217. pyedb/grpc/database/utility/sweep_data_distribution.py +1 -1
  218. pyedb/grpc/database/utility/value.py +1 -1
  219. pyedb/grpc/database/utility/xml_control_file.py +1 -1
  220. pyedb/grpc/edb.py +230 -990
  221. pyedb/grpc/edb_init.py +1 -1
  222. pyedb/grpc/rpc_session.py +17 -4
  223. pyedb/ipc2581/__init__.py +21 -0
  224. pyedb/ipc2581/bom/__init__.py +21 -0
  225. pyedb/ipc2581/bom/bom.py +1 -1
  226. pyedb/ipc2581/bom/bom_item.py +1 -1
  227. pyedb/ipc2581/bom/characteristics.py +1 -1
  228. pyedb/ipc2581/bom/refdes.py +1 -1
  229. pyedb/ipc2581/content/__init__.py +21 -0
  230. pyedb/ipc2581/content/color.py +1 -1
  231. pyedb/ipc2581/content/content.py +1 -1
  232. pyedb/ipc2581/content/dictionary_color.py +1 -1
  233. pyedb/ipc2581/content/dictionary_fill.py +1 -1
  234. pyedb/ipc2581/content/dictionary_line.py +1 -1
  235. pyedb/ipc2581/content/entry_color.py +1 -1
  236. pyedb/ipc2581/content/entry_line.py +1 -1
  237. pyedb/ipc2581/content/fill.py +1 -1
  238. pyedb/ipc2581/content/layer_ref.py +1 -1
  239. pyedb/ipc2581/content/standard_geometries_dictionary.py +1 -1
  240. pyedb/ipc2581/ecad/__init__.py +21 -0
  241. pyedb/ipc2581/ecad/cad_data/__init__.py +21 -0
  242. pyedb/ipc2581/ecad/cad_data/assembly_drawing.py +1 -1
  243. pyedb/ipc2581/ecad/cad_data/cad_data.py +1 -1
  244. pyedb/ipc2581/ecad/cad_data/component.py +1 -1
  245. pyedb/ipc2581/ecad/cad_data/drill.py +1 -1
  246. pyedb/ipc2581/ecad/cad_data/feature.py +1 -1
  247. pyedb/ipc2581/ecad/cad_data/layer.py +1 -1
  248. pyedb/ipc2581/ecad/cad_data/layer_feature.py +1 -1
  249. pyedb/ipc2581/ecad/cad_data/logical_net.py +1 -1
  250. pyedb/ipc2581/ecad/cad_data/outline.py +1 -1
  251. pyedb/ipc2581/ecad/cad_data/package.py +1 -1
  252. pyedb/ipc2581/ecad/cad_data/padstack_def.py +1 -1
  253. pyedb/ipc2581/ecad/cad_data/padstack_hole_def.py +1 -1
  254. pyedb/ipc2581/ecad/cad_data/padstack_instance.py +1 -1
  255. pyedb/ipc2581/ecad/cad_data/padstack_pad_def.py +1 -1
  256. pyedb/ipc2581/ecad/cad_data/path.py +1 -1
  257. pyedb/ipc2581/ecad/cad_data/phy_net.py +1 -1
  258. pyedb/ipc2581/ecad/cad_data/pin.py +1 -1
  259. pyedb/ipc2581/ecad/cad_data/polygon.py +1 -1
  260. pyedb/ipc2581/ecad/cad_data/profile.py +1 -1
  261. pyedb/ipc2581/ecad/cad_data/stackup.py +1 -1
  262. pyedb/ipc2581/ecad/cad_data/stackup_group.py +1 -1
  263. pyedb/ipc2581/ecad/cad_data/stackup_layer.py +1 -1
  264. pyedb/ipc2581/ecad/cad_data/step.py +1 -1
  265. pyedb/ipc2581/ecad/cad_header.py +1 -1
  266. pyedb/ipc2581/ecad/ecad.py +1 -1
  267. pyedb/ipc2581/ecad/spec.py +1 -1
  268. pyedb/ipc2581/history_record.py +1 -1
  269. pyedb/ipc2581/ipc2581.py +1 -1
  270. pyedb/ipc2581/logistic_header.py +1 -1
  271. pyedb/libraries/common.py +1 -1
  272. pyedb/libraries/rf_libraries/base_functions.py +1 -1
  273. pyedb/libraries/rf_libraries/planar_antennas.py +1 -1
  274. pyedb/misc/__init__.py +21 -0
  275. pyedb/misc/aedtlib_personalib_install.py +1 -1
  276. pyedb/misc/decorators.py +22 -0
  277. pyedb/misc/downloads.py +1 -1
  278. pyedb/misc/misc.py +1 -1
  279. pyedb/misc/siw_feature_config/__init__.py +21 -0
  280. pyedb/misc/siw_feature_config/emc/__init__.py +21 -0
  281. pyedb/misc/siw_feature_config/emc/component_tags.py +22 -0
  282. pyedb/misc/siw_feature_config/emc/net_tags.py +22 -0
  283. pyedb/misc/siw_feature_config/emc/tag_library.py +22 -0
  284. pyedb/misc/siw_feature_config/emc/xml_generic.py +22 -0
  285. pyedb/misc/siw_feature_config/emc_rule_checker_settings.py +1 -1
  286. pyedb/misc/siw_feature_config/xtalk_scan/fd_xtalk_scan_config.py +1 -1
  287. pyedb/misc/siw_feature_config/xtalk_scan/impedance_scan_config.py +1 -1
  288. pyedb/misc/siw_feature_config/xtalk_scan/net.py +1 -1
  289. pyedb/misc/siw_feature_config/xtalk_scan/pins.py +1 -1
  290. pyedb/misc/siw_feature_config/xtalk_scan/scan_config.py +1 -1
  291. pyedb/misc/siw_feature_config/xtalk_scan/td_xtalk_config.py +1 -1
  292. pyedb/misc/utilities.py +1 -1
  293. pyedb/modeler/geometry_operators.py +22 -0
  294. pyedb/siwave.py +22 -0
  295. pyedb/siwave_core/__init__.py +21 -0
  296. pyedb/siwave_core/cpa/__init__.py +21 -0
  297. pyedb/siwave_core/cpa/simulation_setup_data_model.py +22 -0
  298. pyedb/siwave_core/icepak.py +1 -1
  299. pyedb/siwave_core/product_properties.py +23 -0
  300. pyedb/workflow.py +22 -0
  301. pyedb/workflows/__init__.py +21 -0
  302. pyedb/workflows/job_manager/__init__.py +21 -0
  303. pyedb/workflows/job_manager/backend/__init__.py +21 -0
  304. pyedb/workflows/job_manager/backend/job_manager_handler.py +910 -0
  305. pyedb/workflows/job_manager/backend/job_submission.py +1169 -0
  306. pyedb/workflows/job_manager/backend/service.py +1663 -0
  307. pyedb/workflows/job_manager/backend/start_service.py +86 -0
  308. pyedb/workflows/job_manager/backend/submit_job_on_scheduler.py +168 -0
  309. pyedb/workflows/job_manager/backend/submit_local_job.py +166 -0
  310. pyedb/workflows/sipi/hfss_auto_configuration.py +1 -1
  311. pyedb/workflows/utilities/__init__.py +21 -0
  312. pyedb/workflows/utilities/cutout.py +1428 -0
  313. pyedb/workflows/utilities/hfss_log_parser.py +446 -0
  314. {pyedb-0.59.0.dist-info → pyedb-0.61.0.dist-info}/METADATA +7 -4
  315. pyedb-0.61.0.dist-info/RECORD +318 -0
  316. {pyedb-0.59.0.dist-info → pyedb-0.61.0.dist-info}/licenses/LICENSE +7 -7
  317. pyedb-0.59.0.dist-info/RECORD +0 -306
  318. {pyedb-0.59.0.dist-info → pyedb-0.61.0.dist-info}/WHEEL +0 -0
@@ -0,0 +1,86 @@
1
+ #!/usr/bin/env python3
2
+
3
+ # Copyright (C) 2023 - 2025 ANSYS, Inc. and/or its affiliates.
4
+ # SPDX-License-Identifier: MIT
5
+ #
6
+ #
7
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ # of this software and associated documentation files (the "Software"), to deal
9
+ # in the Software without restriction, including without limitation the rights
10
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ # copies of the Software, and to permit persons to whom the Software is
12
+ # furnished to do so, subject to the following conditions:
13
+ #
14
+ # The above copyright notice and this permission notice shall be included in all
15
+ # copies or substantial portions of the Software.
16
+ #
17
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
+ # SOFTWARE.
24
+
25
+ """
26
+ Start the PyEDB Job-Manager service via JobManagerHandler.
27
+
28
+ Usage
29
+ -----
30
+ $ python start_service.py --host 0.0.0.0 --port 9090
31
+ ✅ Job-manager backend listening on http://0.0.0.0:9090
32
+ Press Ctrl-C to shut down gracefully.
33
+ """
34
+
35
+ import argparse
36
+ import signal
37
+ import sys
38
+ import threading
39
+
40
+ from pyedb.workflows.job_manager.backend.job_manager_handler import JobManagerHandler
41
+
42
+
43
+ def parse_cli() -> argparse.Namespace:
44
+ parser = argparse.ArgumentParser(description="Start the PyEDB asynchronous job-manager service.")
45
+ parser.add_argument(
46
+ "--host",
47
+ type=str,
48
+ default="localhost",
49
+ help="IP address or hostname to bind the server (default: localhost)",
50
+ )
51
+ parser.add_argument(
52
+ "--port",
53
+ type=int,
54
+ default=8080,
55
+ help="TCP port to listen on (default: 8080)",
56
+ )
57
+ return parser.parse_args()
58
+
59
+
60
+ def main():
61
+ args = parse_cli()
62
+
63
+ handler = JobManagerHandler(host=args.host, port=args.port)
64
+ handler.start_service() # non-blocking; spins up daemon thread + aiohttp
65
+
66
+ print(f"✅ Job-manager backend listening on http://{handler.host}:{handler.port}")
67
+
68
+ # Graceful shutdown on Ctrl-C
69
+ stop_event = threading.Event()
70
+
71
+ def _shutdown(sig, frame):
72
+ print("\nShutting down...")
73
+ stop_event.set()
74
+
75
+ signal.signal(signal.SIGINT, _shutdown)
76
+ signal.signal(signal.SIGTERM, _shutdown)
77
+
78
+ try:
79
+ stop_event.wait() # keep main thread alive
80
+ finally:
81
+ handler.close()
82
+ sys.exit(0)
83
+
84
+
85
+ if __name__ == "__main__":
86
+ main()
@@ -0,0 +1,168 @@
1
+ # Copyright (C) 2023 - 2025 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
+ # --------------- submit_job_on_scheduler.py -----------------
24
+ #!/usr/bin/env python3
25
+ """
26
+ Submit an HFSS job to the *scheduler* back-end service.
27
+
28
+ The service must be running (default: localhost:8080) before this script is executed.
29
+ To start it:
30
+
31
+ python -m pyedb.workflows.job_manager.backend.job_manager_handler
32
+
33
+ Usage
34
+ -----
35
+ # Get help
36
+ python submit_job_on_scheduler.py --help
37
+
38
+ # Explicit values
39
+ python submit_job_on_scheduler.py \
40
+ --host 127.0.0.1 \
41
+ --port 8080 \
42
+ --project-path "/tmp/jobs/job1.aedb" \
43
+ --partition default \
44
+ --nodes 1 \
45
+ --cores-per-node 8
46
+
47
+ # Use defaults (localhost:8080, 1 node, 1 core, partition default)
48
+ python submit_job_on_scheduler.py \
49
+ --project-path "/tmp/jobs/job1.aedb"
50
+ """
51
+
52
+ """
53
+ Submit an HFSS job to the SLURM back-end service.
54
+ Same CLI as submit_local_job.py, but forces SLURM execution.
55
+ """
56
+
57
+ import argparse
58
+ import asyncio
59
+ import logging
60
+ from pathlib import Path
61
+ import sys
62
+
63
+ import aiohttp
64
+
65
+ from pyedb.workflows.job_manager.backend.job_submission import (
66
+ SchedulerOptions,
67
+ SchedulerType,
68
+ create_hfss_config,
69
+ )
70
+
71
+ logging.basicConfig(level=logging.INFO, format="%(levelname)s | %(message)s")
72
+ logger = logging.getLogger(__name__)
73
+
74
+ DEFAULT_HOST = "localhost"
75
+ DEFAULT_PORT = 8080
76
+ DEFAULT_PARTITION = "default"
77
+ DEFAULT_NODES = 1
78
+ DEFAULT_CORES_PER_NODE = 1
79
+
80
+
81
+ async def submit_slurm_job(
82
+ *,
83
+ host: str,
84
+ port: int,
85
+ project_path: str,
86
+ partition: str,
87
+ nodes: int,
88
+ cores_per_node: int,
89
+ ) -> None:
90
+ """Send the SLURM job-configuration to the REST endpoint."""
91
+ backend_url = f"http://{host}:{port}"
92
+
93
+ # 1. Build the *generic* scheduler options that SLURM understands
94
+ scheduler_opts = SchedulerOptions(
95
+ queue=partition,
96
+ nodes=nodes,
97
+ cores_per_node=cores_per_node,
98
+ time="24:00:00", # you can expose --time if you wish
99
+ )
100
+
101
+ # 2. Create the HFSS config (scheduler_type=SLURM is the key)
102
+ cfg = create_hfss_config(
103
+ project_path=project_path,
104
+ scheduler_options=scheduler_opts,
105
+ )
106
+ cfg.auto = True # keep the original behaviour
107
+
108
+ # 3. POST it
109
+ timeout = aiohttp.ClientTimeout(total=60)
110
+ async with aiohttp.ClientSession(timeout=timeout) as session:
111
+ try:
112
+ async with session.post(
113
+ f"{backend_url}/jobs/submit",
114
+ json={
115
+ "config": cfg.model_dump(mode="json", exclude_defaults=False),
116
+ "priority": 0,
117
+ },
118
+ ) as resp:
119
+ status = resp.status
120
+ try:
121
+ reply = await resp.json()
122
+ except Exception:
123
+ reply = await resp.text()
124
+
125
+ if 200 <= status < 300:
126
+ logger.info("Job submitted successfully (status=%s)", status)
127
+ logger.debug("Server reply: %s", reply)
128
+ else:
129
+ logger.error("Job submission failed (status=%s): %s", status, reply)
130
+ except Exception as exc:
131
+ logger.exception("Failed to submit job to %s: %s", backend_url, exc)
132
+ sys.exit(2)
133
+
134
+
135
+ def parse_cli() -> argparse.Namespace:
136
+ parser = argparse.ArgumentParser(description="Submit an HFSS job to the scheduler back-end service.")
137
+ parser.add_argument("--host", default=DEFAULT_HOST)
138
+ parser.add_argument("--port", type=int, default=DEFAULT_PORT)
139
+ parser.add_argument("--project-path", required=True, type=Path)
140
+ parser.add_argument("--partition", default=DEFAULT_PARTITION)
141
+ parser.add_argument("--nodes", type=int, default=DEFAULT_NODES)
142
+ parser.add_argument("--cores-per-node", type=int, default=DEFAULT_CORES_PER_NODE)
143
+ return parser.parse_args()
144
+
145
+
146
+ def main() -> None:
147
+ args = parse_cli()
148
+ if not args.project_path.exists():
149
+ logger.error("Project path does not exist: %s", args.project_path)
150
+ sys.exit(1)
151
+ if args.nodes <= 0 or args.cores_per_node <= 0:
152
+ logger.error("--nodes and --cores-per-node must be positive")
153
+ sys.exit(1)
154
+
155
+ asyncio.run(
156
+ submit_slurm_job(
157
+ host=args.host,
158
+ port=args.port,
159
+ project_path=str(args.project_path),
160
+ partition=args.partition,
161
+ nodes=args.nodes,
162
+ cores_per_node=args.cores_per_node,
163
+ )
164
+ )
165
+
166
+
167
+ if __name__ == "__main__":
168
+ main()
@@ -0,0 +1,166 @@
1
+ #!/usr/bin/env python3
2
+
3
+ # Copyright (C) 2023 - 2025 ANSYS, Inc. and/or its affiliates.
4
+ # SPDX-License-Identifier: MIT
5
+ #
6
+ #
7
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ # of this software and associated documentation files (the "Software"), to deal
9
+ # in the Software without restriction, including without limitation the rights
10
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ # copies of the Software, and to permit persons to whom the Software is
12
+ # furnished to do so, subject to the following conditions:
13
+ #
14
+ # The above copyright notice and this permission notice shall be included in all
15
+ # copies or substantial portions of the Software.
16
+ #
17
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
+ # SOFTWARE.
24
+
25
+ """
26
+ Submit an HFSS job to the local job-manager service.
27
+ Job Submission is done via REST API asynchronously.
28
+ The service must be running locally (default: localhost:8080) prior to executing this script.
29
+ To start the service, run this command in another terminal:
30
+ python -m pyedb.workflows.job_manager.backend.job_manager_handler
31
+
32
+ Usage examples
33
+ --------------
34
+ # Get help
35
+ python submit_job.py --help
36
+
37
+ # Submit with explicit values
38
+ python submit_local_job.py \
39
+ --host 127.0.0.1 \
40
+ --port 8080 \
41
+ --project-path "D:\\Temp\\test_jobs\\test1.aedb" \
42
+ --num-cores 8
43
+
44
+ # Use defaults (localhost:8080, 8 cores)
45
+ python submit_local_job.py --project-path "D:\\Temp\\test_jobs\\test1.aedb"
46
+ """
47
+
48
+ import argparse
49
+ import asyncio
50
+ import logging
51
+ from pathlib import Path
52
+ import sys
53
+ from typing import Any, cast
54
+
55
+ import aiohttp
56
+
57
+ from pyedb.workflows.job_manager.backend.job_submission import (
58
+ MachineNode,
59
+ create_hfss_config,
60
+ )
61
+
62
+ logger = logging.getLogger(__name__)
63
+
64
+
65
+ async def submit_job(*, host: str, port: int, project_path: str, num_cores: int) -> None:
66
+ """Send the job-configuration to the REST endpoint."""
67
+ backend_url = f"http://{host}:{port}"
68
+ cfg = create_hfss_config(project_path=project_path)
69
+
70
+ # Ensure we have at least one machine node and configure it
71
+ if not cfg.machine_nodes:
72
+ cfg.machine_nodes.append(MachineNode())
73
+
74
+ # Use a typed reference to avoid static-analysis/indexing warnings
75
+ node = cast(MachineNode, cfg.machine_nodes[0])
76
+ node.cores = num_cores
77
+ node.max_cores = num_cores
78
+
79
+ # Use a reasonable timeout for network operations
80
+ timeout = aiohttp.ClientTimeout(total=60)
81
+
82
+ async with aiohttp.ClientSession(timeout=timeout) as session:
83
+ try:
84
+ async with session.post(
85
+ f"{backend_url}/jobs/submit",
86
+ json={
87
+ "config": cfg.model_dump(mode="json", exclude_defaults=False),
88
+ "priority": 0,
89
+ },
90
+ ) as resp:
91
+ status = resp.status
92
+ # Try to parse JSON reply safely; fall back to text
93
+ try:
94
+ reply: Any = await resp.json()
95
+ except Exception:
96
+ reply = await resp.text()
97
+
98
+ if 200 <= status < 300:
99
+ logger.info("Job submit successful (status=%s)", status)
100
+ logger.debug("Reply: %s", reply)
101
+ else:
102
+ logger.error("Job submit failed (status=%s): %s", status, reply)
103
+ except asyncio.CancelledError:
104
+ # Re-raise cancellation so callers can handle it
105
+ raise
106
+ except Exception as exc: # pragma: no cover - defensive logging
107
+ logger.exception("Failed to submit job to %s: %s", backend_url, exc)
108
+
109
+
110
+ def parse_cli() -> argparse.Namespace:
111
+ parser = argparse.ArgumentParser(description="Submit an HFSS job to the local job-manager service.")
112
+ parser.add_argument(
113
+ "--host",
114
+ default="localhost",
115
+ help="Job-manager host (default: localhost)",
116
+ )
117
+ parser.add_argument(
118
+ "--port",
119
+ type=int,
120
+ default=8080,
121
+ help="Job-manager port (default: 8080)",
122
+ )
123
+ parser.add_argument(
124
+ "--project-path",
125
+ required=True,
126
+ type=Path,
127
+ help="Full path to the .aedb project",
128
+ )
129
+ parser.add_argument(
130
+ "--num-cores",
131
+ type=int,
132
+ default=8,
133
+ help="Number of cores to allocate (default: 8)",
134
+ )
135
+ return parser.parse_args()
136
+
137
+
138
+ def main() -> None:
139
+ args = parse_cli()
140
+
141
+ # Configure basic logging if the caller didn't
142
+ if not logging.getLogger().handlers:
143
+ logging.basicConfig(level=logging.INFO)
144
+
145
+ # Basic sanity checks
146
+ if not args.project_path.exists():
147
+ logger.error("Error: project path does not exist: %s", args.project_path)
148
+ print(f"Error: project path does not exist: {args.project_path}", file=sys.stderr)
149
+ sys.exit(1)
150
+ if args.num_cores <= 0:
151
+ logger.error("Error: --num-cores must be positive")
152
+ print("Error: --num-cores must be positive", file=sys.stderr)
153
+ sys.exit(1)
154
+
155
+ asyncio.run(
156
+ submit_job(
157
+ host=args.host,
158
+ port=args.port,
159
+ project_path=str(args.project_path),
160
+ num_cores=args.num_cores,
161
+ )
162
+ )
163
+
164
+
165
+ if __name__ == "__main__":
166
+ main()
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates.
1
+ # Copyright (C) 2023 - 2025 ANSYS, Inc. and/or its affiliates.
2
2
  # SPDX-License-Identifier: MIT
3
3
  #
4
4
  #
@@ -0,0 +1,21 @@
1
+ # Copyright (C) 2023 - 2025 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.