dv-flow-mgr 0.0.2.14182043984a1__tar.gz → 1.0.0.14370600369a1__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.
Files changed (138) hide show
  1. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/PKG-INFO +1 -1
  2. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/docs/Roadmap.md +28 -14
  3. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/docs/Stages.md +20 -0
  4. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/pyproject.toml +1 -1
  5. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/__init__.py +2 -1
  6. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/cmds/cmd_graph.py +2 -3
  7. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/cmds/cmd_run.py +7 -9
  8. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/cmds/cmd_show.py +1 -2
  9. dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/cond_def.py +16 -0
  10. dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/config.py +7 -0
  11. dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/config_def.py +33 -0
  12. dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/exec_callable.py +88 -0
  13. dv_flow_mgr-0.0.2.14182043984a1/src/dv_flow/mgr/pkg_rgy.py → dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/ext_rgy.py +44 -35
  14. dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/extend_def.py +21 -0
  15. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/fragment_def.py +4 -3
  16. dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/need_def.py +6 -0
  17. dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/null_callable.py +10 -0
  18. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/package.py +30 -6
  19. dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/package_def.py +172 -0
  20. dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/package_loader.py +701 -0
  21. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/param_def.py +2 -1
  22. dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/parser.out +567 -0
  23. dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/pytask_callable.py +25 -0
  24. dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/root_package.py +9 -0
  25. dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/shell_callable.py +14 -0
  26. dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/srcinfo.py +15 -0
  27. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/std/flow.dv +25 -4
  28. dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/task.py +68 -0
  29. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_def.py +36 -24
  30. dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/task_graph_builder.py +684 -0
  31. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_listener_log.py +4 -0
  32. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_node_ctor.py +11 -3
  33. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_node_ctor_compound.py +21 -33
  34. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_node_leaf.py +25 -3
  35. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_params_ctor.py +0 -1
  36. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_run_ctxt.py +4 -0
  37. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_runner.py +2 -0
  38. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/util/cmds/cmd_schema.py +0 -2
  39. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/util/util.py +4 -3
  40. dv_flow_mgr-1.0.0.14370600369a1/src/dv_flow/mgr/yaml_srcinfo_loader.py +55 -0
  41. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow_mgr.egg-info/PKG-INFO +1 -1
  42. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow_mgr.egg-info/SOURCES.txt +20 -1
  43. dv_flow_mgr-1.0.0.14370600369a1/tests/unit/marker_collector.py +22 -0
  44. dv_flow_mgr-1.0.0.14370600369a1/tests/unit/task_listener_test.py +11 -0
  45. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/test_compound_task.py +81 -8
  46. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/test_fileset.py +12 -11
  47. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/test_imports.py +6 -6
  48. dv_flow_mgr-1.0.0.14370600369a1/tests/unit/test_load_package.py +332 -0
  49. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/test_pyclass.py +75 -17
  50. dv_flow_mgr-1.0.0.14370600369a1/tests/unit/test_pyexec.py +41 -0
  51. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/test_smoke.py +8 -5
  52. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/test_stdlib.py +2 -2
  53. dv_flow_mgr-0.0.2.14182043984a1/src/dv_flow/mgr/package_def.py +0 -576
  54. dv_flow_mgr-0.0.2.14182043984a1/src/dv_flow/mgr/task_graph_builder.py +0 -434
  55. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/.github/workflows/ci.yml +0 -0
  56. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/.gitignore +0 -0
  57. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/.vscode/settings.json +0 -0
  58. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/LICENSE +0 -0
  59. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/README.md +0 -0
  60. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/docs/ChangeLog.md +0 -0
  61. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/docs/KeyArchitecture.md +0 -0
  62. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/docs/Makefile +0 -0
  63. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/docs/Notes.md +0 -0
  64. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/docs/RundirLayout.md +0 -0
  65. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/docs/Steps.md +0 -0
  66. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/docs/Tasks.md +0 -0
  67. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/docs/TypesAndDefs.md +0 -0
  68. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/docs/Usecases.md +0 -0
  69. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/docs/cmdref.rst +0 -0
  70. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/docs/conf.py +0 -0
  71. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/docs/index.rst +0 -0
  72. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/docs/pytask_api.rst +0 -0
  73. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/docs/quickstart.rst +0 -0
  74. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/fwperiph_dma.pss +0 -0
  75. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/ivpm.yaml +0 -0
  76. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/setup.cfg +0 -0
  77. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/__main__.py +0 -0
  78. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/eval_jq.py +0 -0
  79. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/expr_eval.py +0 -0
  80. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/expr_parser.py +0 -0
  81. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/fileset.py +0 -0
  82. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/listener_list.py +0 -0
  83. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/out +0 -0
  84. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/package_import_spec.py +0 -0
  85. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/param.py +0 -0
  86. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/param_ref_eval.py +0 -0
  87. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/parsetab.py +0 -0
  88. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/share/flow.json +0 -0
  89. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/std/create_file.py +0 -0
  90. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/std/exec.py +0 -0
  91. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/std/fileset.py +0 -0
  92. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/std/message.py +0 -0
  93. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/std/task_null.py +0 -0
  94. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_data.py +0 -0
  95. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_graph_dot_writer.py +0 -0
  96. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_node.py +0 -0
  97. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_node_compound.py +0 -0
  98. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_node_ctor_compound_proxy.py +0 -0
  99. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_node_ctor_def_base.py +0 -0
  100. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_node_ctor_proxy.py +0 -0
  101. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_node_ctor_task.py +0 -0
  102. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_node_ctor_wrapper.py +0 -0
  103. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/task_output.py +0 -0
  104. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/type.py +0 -0
  105. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/type_def.py +0 -0
  106. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/util/__init__.py +0 -0
  107. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/util/__main__.py +0 -0
  108. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow/mgr/util/cmds/__init__.py +0 -0
  109. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow_mgr.egg-info/dependency_links.txt +0 -0
  110. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow_mgr.egg-info/entry_points.txt +0 -0
  111. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow_mgr.egg-info/requires.txt +0 -0
  112. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/src/dv_flow_mgr.egg-info/top_level.txt +0 -0
  113. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/examples/example1/example1.flow +0 -0
  114. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/system/test_depends.py +0 -0
  115. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/system/test_pkg_discovery.py +0 -0
  116. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/system/test_stdlib.py +0 -0
  117. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/__init__.py +0 -0
  118. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/data/fileset/test1/files1/file1_1.sv +0 -0
  119. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/data/fileset/test1/files1/file1_2.sv +0 -0
  120. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/data/fileset/test1/files2/file2_1.sv +0 -0
  121. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/data/fileset/test1/files2/file2_2.sv +0 -0
  122. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/data/fileset/test1/flow.dv +0 -0
  123. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/data/fileset/test1 copy/files1/file1_1.sv +0 -0
  124. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/data/fileset/test1 copy/files1/file1_2.sv +0 -0
  125. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/data/fileset/test1 copy/files2/file2_1.sv +0 -0
  126. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/data/fileset/test1 copy/files2/file2_2.sv +0 -0
  127. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/data/fileset/test1 copy/test1.dfs +0 -0
  128. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/data/proj1/proj1.dfs +0 -0
  129. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/data/proj2/proj2.dfs +0 -0
  130. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/data/proj3/proj3.dfs +0 -0
  131. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/test_data_merge.py +0 -0
  132. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/test_dataflow.py +0 -0
  133. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/test_expr_eval.py +0 -0
  134. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/test_expr_parser.py +0 -0
  135. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/test_markers.py +0 -0
  136. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/test_parse.py +0 -0
  137. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/test_pytask_smoke.py +0 -0
  138. {dv_flow_mgr-0.0.2.14182043984a1 → dv_flow_mgr-1.0.0.14370600369a1}/tests/unit/test_smoke copy.sav +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dv-flow-mgr
3
- Version: 0.0.2.14182043984a1
3
+ Version: 1.0.0.14370600369a1
4
4
  Summary: DV Flow Manager is a build system for silicon design
5
5
  Author-email: Matthew Ballance <matt.ballance@gmail.com>
6
6
  License: Apache License
@@ -5,24 +5,24 @@ semantic definition of how task graphs defined using the flow specification
5
5
  are evaluated.
6
6
 
7
7
  ## 1.0.0
8
- - Package definition
9
- - Package import
10
- - Task definition
11
- - "with" variable usage
12
- - Operations on input and output data
13
- - Operations on task parameters
14
- - Package fragments
15
- - Define task status. Tasks can have at least two types of failures
16
- - Pass/Fail: Fail halts successors
8
+ * Package definition
9
+ * Package import
10
+ * Task definition
11
+ * "with" variable usage
12
+ * Operations on input and output data
13
+ * Operations on task parameters
14
+ * Package fragments
15
+ * Define task status. Tasks can have at least two types of failures
16
+ * Pass/Fail: Fail halts successors
17
17
  - Fail must come with a message and extra info
18
- - Status markers/counters
18
+ * Status markers/counters
19
19
  - errors / warnings / notes
20
20
  - Want known fileset to capture logfiles and related info
21
21
  - Central params and datasets?
22
22
  - Datasets preserve dependency relationships
23
23
  - Datasets are the best way to aggregate settings
24
- - Typed parameter sets
25
- - Dependencies provide order in which to evaluate
24
+ * Typed parameter sets
25
+ * Dependencies provide order in which to evaluate
26
26
  - Operations on variables
27
27
 
28
28
  ## 2.0.0
@@ -38,11 +38,11 @@ are evaluated.
38
38
  determine up-to-date status on a whole collection of source
39
39
 
40
40
  ## 3.0.0
41
- - JQ-based data extraction
41
+ * JQ-based data extraction
42
42
  - YAML task templates / expansions
43
43
  - Support for annotating job requirements
44
44
  - Support capturing schema for structured task data
45
- - Mark tasks as producing and accepting certain data
45
+ ~ Mark tasks as producing and accepting certain data
46
46
  - FileSet task `produces` fileset of `type`
47
47
  - SimImage task `accepts` systemVerilogSource, verilogSource, verilogPreCompLib, etc
48
48
  => Mostly useful for checking and suggestion
@@ -131,3 +131,17 @@ are evaluated.
131
131
  - Allow files to be attached as part of the result
132
132
 
133
133
  - Allow need relationships to be conditional
134
+
135
+
136
+ # Apr-May
137
+ - Configuration
138
+ - Conditional needs
139
+ - package-level parameters
140
+ -
141
+ - Subgraph builders
142
+ - Python
143
+ - Matrix strategy
144
+
145
+ - Identify export tasks
146
+
147
+ - Interop w/external formats
@@ -179,3 +179,23 @@ Key: all
179
179
  - end-to-end system check
180
180
  - avoid recompile when primary sources do not change
181
181
 
182
+ # Load/Elab/Build Refactor
183
+ - Separated loading from graph building
184
+ - Now, package and task information is produced with source info
185
+ - Working on recreating the task-node builder
186
+ - Consider getting rid of the Ctor infrastructure
187
+ - Have parameter-type info
188
+ - Have inheritance info
189
+ - Have fully-qualified names for all dependencies
190
+ - In this mode, graph builder would:
191
+ - Find named 'task' object
192
+ - Determine how to create a node and parameters from it
193
+ - Task should save statically-specified parameter values
194
+ - GraphBuilder can apply programmatically-specified parameters
195
+ - What is a programmatically-specified task?
196
+ - Prototype for a task node
197
+ - Not necessarily registered with the package loader
198
+ - Should have similar characteristics to a task (?)
199
+ - Maybe just a direct way to create a task node
200
+ - Don't think we expect the system to create is programmatically...
201
+
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
5
5
 
6
6
  [project]
7
7
  name = "dv-flow-mgr"
8
- version = "0.0.2.14182043984a1"
8
+ version = "1.0.0.14370600369a1"
9
9
  dependencies = [
10
10
  'jq',
11
11
  'pydantic',
@@ -20,7 +20,8 @@
20
20
  #*
21
21
  #****************************************************************************
22
22
  from .package_def import *
23
- from .pkg_rgy import PkgRgy
23
+ from .package_loader import PackageLoader
24
+ from .ext_rgy import ExtRgy
24
25
  from .task_data import *
25
26
  from .task_def import *
26
27
  from .task_graph_builder import TaskGraphBuilder
@@ -27,7 +27,6 @@ from ..util import loadProjPkgDef
27
27
  from ..task_graph_builder import TaskGraphBuilder
28
28
  from ..task_runner import TaskSetRunner
29
29
  from ..task_listener_log import TaskListenerLog
30
- from ..pkg_rgy import PkgRgy
31
30
  from ..task_graph_dot_writer import TaskGraphDotWriter
32
31
 
33
32
 
@@ -66,11 +65,11 @@ class CmdGraph(object):
66
65
  "<no descripion>"
67
66
  print("%s - %s" % (t.name.ljust(max_name_len), desc))
68
67
  else:
69
- rundir = os.path.join(pkg._basedir, "rundir")
68
+ rundir = os.path.join(pkg.basedir, "rundir")
70
69
 
71
70
  builder = TaskGraphBuilder(root_pkg=pkg, rundir=rundir)
72
71
 
73
- t = builder.mkTaskGraph(pkg.name + "." + args.task)
72
+ t = builder.mkTaskNode(pkg.name + "." + args.task)
74
73
 
75
74
  TaskGraphDotWriter().write(
76
75
  t,
@@ -27,7 +27,6 @@ from ..util import loadProjPkgDef
27
27
  from ..task_graph_builder import TaskGraphBuilder
28
28
  from ..task_runner import TaskSetRunner
29
29
  from ..task_listener_log import TaskListenerLog
30
- from ..pkg_rgy import PkgRgy
31
30
 
32
31
 
33
32
  class CmdRun(object):
@@ -36,7 +35,8 @@ class CmdRun(object):
36
35
  def __call__(self, args):
37
36
 
38
37
  # First, find the project we're working with
39
- pkg = loadProjPkgDef(os.getcwd())
38
+ listener = TaskListenerLog()
39
+ pkg = loadProjPkgDef(os.getcwd(), listener=listener)
40
40
 
41
41
  if pkg is None:
42
42
  raise Exception("Failed to find a 'flow.dv' file that defines a package in %s or its parent directories" % os.getcwd())
@@ -48,11 +48,8 @@ class CmdRun(object):
48
48
  else:
49
49
  # Print out available tasks
50
50
  tasks = []
51
- for task in pkg.tasks:
51
+ for task in pkg.task_m.values():
52
52
  tasks.append(task)
53
- for frag in pkg._fragment_l:
54
- for task in frag.tasks:
55
- tasks.append(task)
56
53
  tasks.sort(key=lambda x: x.name)
57
54
 
58
55
  max_name_len = 0
@@ -75,7 +72,8 @@ class CmdRun(object):
75
72
  # Maybe separate into a task-graph builder and a task-graph runner
76
73
 
77
74
  # TODO: allow user to specify run root -- maybe relative to some fixed directory?
78
- rundir = os.path.join(pkg._basedir, "rundir")
75
+ rundir = os.path.join(pkg.basedir, "rundir")
76
+
79
77
 
80
78
  if args.clean:
81
79
  print("Note: Cleaning rundir %s" % rundir)
@@ -89,14 +87,14 @@ class CmdRun(object):
89
87
  if args.j != -1:
90
88
  runner.nproc = int(args.j)
91
89
 
92
- runner.add_listener(TaskListenerLog().event)
90
+ runner.add_listener(listener.event)
93
91
 
94
92
  tasks = []
95
93
 
96
94
  for spec in args.tasks:
97
95
  if spec.find('.') == -1:
98
96
  spec = pkg.name + "." + spec
99
- task = builder.mkTaskGraph(spec, rundir=spec)
97
+ task = builder.mkTaskNode(spec)
100
98
  tasks.append(task)
101
99
 
102
100
  asyncio.run(runner.run(tasks))
@@ -28,7 +28,6 @@ from ..util import loadProjPkgDef
28
28
  from ..task_graph_builder import TaskGraphBuilder
29
29
  from ..task_runner import TaskSetRunner
30
30
  from ..task_listener_log import TaskListenerLog
31
- from ..pkg_rgy import PkgRgy
32
31
  from ..task_graph_dot_writer import TaskGraphDotWriter
33
32
 
34
33
 
@@ -73,7 +72,7 @@ class CmdShow(object):
73
72
 
74
73
 
75
74
  if args.all:
76
- t = builder.mkTaskGraph(pkg.name + "." + args.task)
75
+ t = builder.mkTaskNode(pkg.name + "." + args.task)
77
76
  dep_m = TaskSetRunner(rundir=None).buildDepMap(t)
78
77
 
79
78
  order = list(toposort.toposort(dep_m))
@@ -0,0 +1,16 @@
1
+
2
+ import pydantic.dataclasses as pdc
3
+ from pydantic import BaseModel
4
+
5
+ #
6
+ # - task:
7
+ # needs:
8
+ # - if: abc
9
+ # then: abc
10
+ # else: def
11
+ #
12
+ class CondDef(BaseModel):
13
+ if_then : str = pdc.Field(
14
+ description="Condition to evaluate")
15
+ then : str = pdc.Field(
16
+ description="Task to execute if the condition is true")
@@ -0,0 +1,7 @@
1
+
2
+ import dataclasses as dc
3
+ from typing import List
4
+
5
+ @dc.dataclass
6
+ class Config(object):
7
+ overrides : List
@@ -0,0 +1,33 @@
1
+
2
+ import pydantic.dataclasses as pdc
3
+ from pydantic import BaseModel
4
+ from typing import List, Union, Any
5
+ from .extend_def import ExtendDef
6
+ from .param_def import ParamDef
7
+
8
+ class OverrideDef(BaseModel):
9
+ """Override definition"""
10
+ package : Union[str, None] = pdc.Field(
11
+ description="Package to override")
12
+ task : Union[str, None] = pdc.Field(
13
+ description="Task to override")
14
+ value : str = pdc.Field(
15
+ description="Override to use",
16
+ alias="with")
17
+
18
+ class ConfigDef(BaseModel):
19
+ name : str = pdc.Field(
20
+ description="Name of the configuration")
21
+ params : List[ParamDef] = pdc.Field(
22
+ default_factory=list,
23
+ description="List of configuration parameters",
24
+ alias="with")
25
+ uses : str = pdc.Field(
26
+ default=None,
27
+ description="Name of the configuration to use as a base")
28
+ overrides : List[OverrideDef] = pdc.Field(
29
+ default_factory=list,
30
+ description="List of package and task overrides")
31
+ extensions : List[ExtendDef] = pdc.Field(
32
+ default_factory=list,
33
+ description="List of extensions to apply")
@@ -0,0 +1,88 @@
1
+ import dataclasses as dc
2
+ import importlib
3
+ import importlib.util
4
+ import logging
5
+ import os
6
+ import sys
7
+ from typing import ClassVar, List
8
+ from .task_data import TaskDataResult
9
+
10
+ @dc.dataclass
11
+ class ExecCallable(object):
12
+ body : str
13
+ _log : ClassVar = logging.getLogger("ExecCallable")
14
+
15
+ async def __call__(self, ctxt, input):
16
+ self._log.debug("--> ExecCallable")
17
+ self._log.debug("Body:\n%s" % self.body)
18
+
19
+ # If it is a single line, then we have a spec to load
20
+ # Otherwise, we have an inline task
21
+
22
+ if self.body.find("\n") == -1:
23
+ # Two forms:
24
+ # <path>::method
25
+ # <method-path>
26
+
27
+ ci = self.body.find("::")
28
+ if ci != -1:
29
+ # have a file to load
30
+ file = self.body[:ci]
31
+ method = self.body[ci+2:]
32
+ spec = importlib.util.spec_from_file_location(input.name, file)
33
+ module = importlib.util.module_from_spec(spec)
34
+ sys.modules[input.name] = module
35
+ spec.loader.exec_module(module)
36
+
37
+ callable = getattr(module, method)
38
+ pass
39
+ else:
40
+ # self._log.debug("Use PyTask implementation")
41
+ last_dot = self.body.rfind('.')
42
+ clsname = self.body[last_dot+1:]
43
+ modname = self.body[:last_dot]
44
+
45
+ try:
46
+ if modname not in sys.modules:
47
+ if input.srcdir not in sys.path:
48
+ sys.path.append(input.srcdir)
49
+ mod = importlib.import_module(modname)
50
+ else:
51
+ mod = sys.modules[modname]
52
+ except ModuleNotFoundError as e:
53
+ raise Exception("Failed to import module %s: %s" % (modname, str(e)))
54
+
55
+ if not hasattr(mod, clsname):
56
+ raise Exception("Method %s not found in module %s" % (clsname, modname))
57
+ callable = getattr(mod, clsname)
58
+ else:
59
+ text_lines = self.body.splitlines()
60
+
61
+ least_whitespace = 2^32
62
+ have_content = False
63
+ for line in text_lines:
64
+ line_no_leading_ws = line.lstrip()
65
+ if line_no_leading_ws != "":
66
+ have_content = True
67
+ leading_ws = len(line) - len(line_no_leading_ws)
68
+ if leading_ws < least_whitespace:
69
+ least_whitespace = leading_ws
70
+ # Remove leading whitespace
71
+ if have_content:
72
+ for i,line in enumerate(text_lines):
73
+ if len(line) >= least_whitespace:
74
+ text_lines[i] = line[least_whitespace:]
75
+
76
+ method = "async def pytask(ctxt, input):\n" + "\n".join([" %s" % l for l in text_lines])
77
+
78
+ exec(method)
79
+
80
+ callable = locals()['pytask']
81
+
82
+ result = await callable(ctxt, input)
83
+
84
+ if result is None:
85
+ result = TaskDataResult()
86
+
87
+ self._log.debug("<-- ExecCallable")
88
+ return result
@@ -1,5 +1,5 @@
1
1
  #****************************************************************************
2
- #* pkg_rgy.py
2
+ #* ext_rgy.py
3
3
  #*
4
4
  #* Copyright 2023-2025 Matthew Ballance and Contributors
5
5
  #*
@@ -19,18 +19,23 @@
19
19
  #* Author:
20
20
  #*
21
21
  #****************************************************************************
22
+ import dataclasses as dc
22
23
  import os
23
24
  import logging
24
25
  import sys
25
- from typing import Dict, Tuple
26
- from .package_def import PackageDef
26
+ from typing import Callable, ClassVar, Dict, Tuple
27
+ from .exec_callable import ExecCallable
28
+ from .pytask_callable import PytaskCallable
29
+ from .shell_callable import ShellCallable
27
30
 
28
- class PkgRgy(object):
29
- _inst = None
31
+ @dc.dataclass
32
+ class ExtRgy(object):
33
+ _inst : ClassVar = None
30
34
 
31
35
  def __init__(self):
32
36
  self._pkgpath = []
33
- self._pkg_m : Dict[str, Tuple[str,PackageDef]] = {}
37
+ self._pkg_m : Dict[str, str] = {}
38
+ self._shell_m : Dict[str, Callable] = {}
34
39
  self._log = logging.getLogger(type(self).__name__)
35
40
  self._override_m : Dict[str,str] = {}
36
41
 
@@ -47,21 +52,19 @@ class PkgRgy(object):
47
52
  return True
48
53
  else:
49
54
  return False
50
-
51
- def getPackage(self, name):
52
- self._log.debug("--> getPackage(%s)" % name)
55
+
56
+ def findShell(self, name) -> Callable:
57
+ if name in self._shell_m.keys():
58
+ return self._shell_m[name]
59
+
60
+ def findPackagePath(self, name) -> str:
61
+ ret = None
62
+ self._log.debug("--> findPackagePath(%s)" % name)
53
63
  if name in self._pkg_m.keys():
54
- if self._pkg_m[name][1] is None:
55
- pkg_def = PackageDef.load(self._pkg_m[name][0])
56
- # Load the package
57
- self._pkg_m[name] = (
58
- self._pkg_m[name][0],
59
- pkg_def
60
- )
61
- ret = self._pkg_m[name][1]
64
+ ret = self._pkg_m[name]
62
65
  else:
63
66
  ret = self._findOnPath(name)
64
- self._log.debug("<-- getPackage(%s)" % name)
67
+ self._log.debug("<-- findPackagePath(%s)" % name)
65
68
  return ret
66
69
 
67
70
  def _findOnPath(self, name):
@@ -72,33 +75,31 @@ class PkgRgy(object):
72
75
  else:
73
76
  name_pref = None
74
77
 
75
- pkg = None
78
+ ret = None
76
79
 
77
80
  for path in self._pkgpath:
78
81
  if os.path.isfile(os.path.join(path, name_dir, "flow.dv")):
79
- pkg = PackageDef.load(os.path.join(path, name_dir, "flow.dv"))
82
+ ret = os.path.join(path, name_dir, "flow.dv")
80
83
  elif name_pref is not None and os.path.isfile(os.path.join(path, name_pref, name_s[-1] + ".dv")):
81
- pkg = PackageDef.load(os.path.join(path, name_pref, name_s[-1] + ".dv"))
84
+ ret = os.path.join(path, name_pref, name_s[-1] + ".dv")
82
85
  elif os.path.isfile(os.path.join(path, name + ".dv")):
83
- pkg = PackageDef.load(os.path.join(path, name + ".dv"))
86
+ ret = os.path.join(path, name + ".dv")
84
87
 
85
- if pkg is not None:
86
- self._pkg_m[name] = (pkg.name, pkg)
88
+ if ret is not None:
89
+ self._pkg_m[name] = ret
87
90
  break
88
91
 
89
- return pkg
90
-
91
- def registerPackage(self, pkg_def):
92
- self._log.debug("--> registerPackage %s" % pkg_def.name)
93
- if pkg_def.name in self._pkg_m.keys():
94
- raise Exception("Duplicate package %s" % pkg_def.name)
95
- self._pkg_m[pkg_def.name] = (pkg_def.basedir, pkg_def)
96
- self._log.debug("<-- registerPackage %s" % pkg_def.name)
92
+ return ret
97
93
 
98
94
  def _discover_plugins(self):
99
95
  self._log.debug("--> discover_plugins")
100
96
  # Register built-in package
101
- self._pkg_m["std"] = (os.path.join(os.path.dirname(__file__), "std/flow.dv"), None)
97
+ self._pkg_m["std"] = os.path.join(os.path.dirname(__file__), "std/flow.dv")
98
+
99
+ # Register built-in shells
100
+ self._shell_m["shell"] = ShellCallable
101
+ self._shell_m["pytask"] = ExecCallable
102
+
102
103
 
103
104
  if "DV_FLOW_PATH" in os.environ.keys() and os.environ["DV_FLOW_PATH"] != "":
104
105
  paths = os.environ["DV_FLOW_PATH"].split(':')
@@ -124,7 +125,15 @@ class PkgRgy(object):
124
125
  self._log.debug("Package %s already registered using path %s. Conflicting path: %s" % (
125
126
  name, self._pkg_m[name][0], path))
126
127
  else:
127
- self._pkg_m[name] = (path, None)
128
+ self._pkg_m[name] = path
129
+ if hasattr(mod, "dvfm_shells"):
130
+ shell_m = mod.dvfm_shells()
131
+ for name, shell in shell_m.items():
132
+ self._log.debug("Registering shell %s" % name)
133
+ if name in self._shell_m.keys():
134
+ self._log.debug("Shell %s already registered" % name)
135
+ else:
136
+ self._shell_m[name] = shell
128
137
  except Exception as e:
129
138
  self._log.critical("Error loading plugin %s: %s" % (p.name, str(e)))
130
139
  raise e
@@ -135,7 +144,7 @@ class PkgRgy(object):
135
144
  self._log.debug("<-- discover_plugins")
136
145
 
137
146
  def copy(self):
138
- ret = PkgRgy()
147
+ ret = ExtRgy()
139
148
  ret._pkgpath = self._pkgpath.copy()
140
149
  ret._pkg_m = self._pkg_m.copy()
141
150
  return ret
@@ -0,0 +1,21 @@
1
+
2
+ import pydantic.dataclasses as pdc
3
+ from pydantic import BaseModel
4
+ from typing import List, Union
5
+ from .param_def import ParamDef
6
+
7
+ class ExtendDef(BaseModel):
8
+ """Extension definition"""
9
+ task : str = pdc.Field(
10
+ description="Name of the task to extend")
11
+ params : List[ParamDef] = pdc.Field(
12
+ default_factory=list,
13
+ description="Parameter extensions to apply to the task",
14
+ alias="with")
15
+ uses : str = pdc.Field(
16
+ default=None,
17
+ description="Name of the extension to use as a base")
18
+ needs: List[str] = pdc.Field(
19
+ default_factory=list,
20
+ description="List of tasks to depend on")
21
+
@@ -23,8 +23,8 @@ import pydantic.dataclasses as dc
23
23
  import json
24
24
  from pydantic import BaseModel
25
25
  from typing import Any, Dict, List, Union
26
- from .package import Package
27
26
  from .package_import_spec import PackageImportSpec
27
+ from .srcinfo import SrcInfo
28
28
  from .task_def import TaskDef
29
29
  from .type_def import TypeDef
30
30
 
@@ -33,6 +33,7 @@ class FragmentDef(BaseModel):
33
33
  imports : List[Union[str,PackageImportSpec]] = dc.Field(default_factory=list, alias="imports")
34
34
  fragments: List[str] = dc.Field(default_factory=list)
35
35
  types : List[TypeDef] = dc.Field(default_factory=list)
36
+ srcinfo : SrcInfo = dc.Field(default=None)
36
37
 
37
38
  _basedir : str = None
38
39
 
@@ -41,6 +42,6 @@ class FragmentDef(BaseModel):
41
42
  if t.name == name:
42
43
  return t
43
44
 
44
- def apply(self, session, pkg : Package):
45
- pass
45
+ # def apply(self, session, pkg : Package):
46
+ # pass
46
47
 
@@ -0,0 +1,6 @@
1
+ import pydantic.dataclasses as pdc
2
+ from pydantic import BaseModel
3
+
4
+ class NeedDef(BaseModel):
5
+ task : str = pdc.Field(
6
+ description="Name of the task to depend on")
@@ -0,0 +1,10 @@
1
+ import dataclasses as dc
2
+ from .task_data import TaskDataResult
3
+
4
+ @dc.dataclass
5
+ class NullCallable(object):
6
+ body : str
7
+
8
+ async def __call__(self, ctxt, input):
9
+ """Null callable that does nothing"""
10
+ return TaskDataResult()
@@ -21,25 +21,49 @@
21
21
  #****************************************************************************
22
22
  import dataclasses as dc
23
23
  import logging
24
- from typing import Any, ClassVar, Dict
25
- from .task_node_ctor import TaskNodeCtor
24
+ from typing import Any, ClassVar, Dict, List
25
+ from .fragment_def import FragmentDef
26
+ from .package_def import PackageDef
27
+ from .task import Task
26
28
 
27
29
  @dc.dataclass
28
30
  class Package(object):
29
- name : str
31
+ pkg_def : PackageDef
32
+ basedir : str = None
30
33
  params : Dict[str,Any] = dc.field(default_factory=dict)
31
34
  # Package holds constructors for tasks
32
35
  # - Dict holds the default parameters for the task
33
- tasks : Dict[str,TaskNodeCtor] = dc.field(default_factory=dict)
36
+ task_m : Dict[str,Task] = dc.field(default_factory=dict)
34
37
  types : Dict[str,Any] = dc.field(default_factory=dict)
38
+ fragment_def_l : List[FragmentDef] = dc.field(default_factory=list)
39
+ pkg_m : Dict[str, 'Package'] = dc.field(default_factory=dict)
35
40
  _log : ClassVar = logging.getLogger("Package")
36
41
 
37
- def getTaskCtor(self, name : str) -> TaskNodeCtor:
42
+ @property
43
+ def name(self):
44
+ return self.pkg_def.name
45
+
46
+ def getTaskCtor(self, name : str) -> Task:
38
47
  self._log.debug("-- %s::getTaskCtor: %s" % (self.name, name))
39
48
  if name not in self.tasks.keys():
40
49
  raise Exception("Task %s not present in package %s" % (name, self.name))
41
50
  return self.tasks[name]
51
+
52
+ def dump(self):
53
+ tasks = {}
54
+ for k, v in self.task_m.items():
55
+ tasks[k] = v.dump()
56
+
57
+ pkg = {
58
+ "name": self.name,
59
+ "basedir": self.basedir,
60
+ "params": self.params,
61
+ "tasks": tasks,
62
+ "fragments": [f.dump() for f in self.fragment_def_l]
63
+ }
64
+
65
+ return pkg
42
66
 
43
67
  def __hash__(self):
44
- return hash(self.fullname())
68
+ return id(self)
45
69