dv-flow-mgr 0.0.1.14147547123a1__tar.gz → 0.0.2.14148837747a1__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 (115) hide show
  1. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/PKG-INFO +1 -1
  2. dv_flow_mgr-0.0.2.14148837747a1/docs/ChangeLog.md +8 -0
  3. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/pyproject.toml +1 -1
  4. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/cmds/cmd_run.py +1 -1
  5. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/package_def.py +1 -2
  6. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/std/create_file.py +4 -0
  7. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/task_def.py +6 -3
  8. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/task_graph_builder.py +16 -9
  9. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/task_node.py +33 -2
  10. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/task_node_ctor_compound.py +2 -1
  11. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/task_node_leaf.py +3 -0
  12. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow_mgr.egg-info/PKG-INFO +1 -1
  13. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow_mgr.egg-info/SOURCES.txt +1 -0
  14. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/tests/unit/test_compound_task.py +5 -1
  15. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/tests/unit/test_smoke.py +4 -2
  16. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/.github/workflows/ci.yml +0 -0
  17. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/.gitignore +0 -0
  18. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/.vscode/settings.json +0 -0
  19. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/LICENSE +0 -0
  20. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/README.md +0 -0
  21. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/docs/KeyArchitecture.md +0 -0
  22. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/docs/Makefile +0 -0
  23. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/docs/Notes.md +0 -0
  24. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/docs/Roadmap.md +0 -0
  25. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/docs/RundirLayout.md +0 -0
  26. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/docs/Stages.md +0 -0
  27. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/docs/Steps.md +0 -0
  28. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/docs/Tasks.md +0 -0
  29. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/docs/TypesAndDefs.md +0 -0
  30. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/docs/Usecases.md +0 -0
  31. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/docs/cmdref.rst +0 -0
  32. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/docs/conf.py +0 -0
  33. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/docs/index.rst +0 -0
  34. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/docs/pytask_api.rst +0 -0
  35. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/docs/quickstart.rst +0 -0
  36. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/fwperiph_dma.pss +0 -0
  37. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/ivpm.yaml +0 -0
  38. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/setup.cfg +0 -0
  39. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/__init__.py +0 -0
  40. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/__main__.py +0 -0
  41. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/cmds/cmd_graph.py +0 -0
  42. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/cmds/cmd_show.py +0 -0
  43. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/eval_jq.py +0 -0
  44. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/expr_eval.py +0 -0
  45. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/expr_parser.py +0 -0
  46. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/fileset.py +0 -0
  47. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/fragment_def.py +0 -0
  48. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/out +0 -0
  49. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/package.py +0 -0
  50. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/package_import_spec.py +0 -0
  51. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/param.py +0 -0
  52. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/param_def.py +0 -0
  53. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/param_ref_eval.py +0 -0
  54. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/parsetab.py +0 -0
  55. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/pkg_rgy.py +0 -0
  56. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/share/flow.json +0 -0
  57. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/std/exec.py +0 -0
  58. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/std/fileset.py +0 -0
  59. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/std/flow.dv +0 -0
  60. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/std/message.py +0 -0
  61. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/std/task_null.py +0 -0
  62. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/task_data.py +0 -0
  63. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/task_graph_dot_writer.py +0 -0
  64. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/task_listener_log.py +0 -0
  65. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/task_node_compound.py +0 -0
  66. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/task_node_ctor.py +0 -0
  67. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/task_node_ctor_compound_proxy.py +0 -0
  68. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/task_node_ctor_def_base.py +0 -0
  69. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/task_node_ctor_proxy.py +0 -0
  70. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/task_node_ctor_task.py +0 -0
  71. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/task_node_ctor_wrapper.py +0 -0
  72. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/task_output.py +0 -0
  73. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/task_params_ctor.py +0 -0
  74. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/task_runner.py +0 -0
  75. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/type.py +0 -0
  76. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/type_def.py +0 -0
  77. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/util/__init__.py +0 -0
  78. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/util/__main__.py +0 -0
  79. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/util/cmds/__init__.py +0 -0
  80. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/util/cmds/cmd_schema.py +0 -0
  81. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow/mgr/util/util.py +0 -0
  82. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow_mgr.egg-info/dependency_links.txt +0 -0
  83. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow_mgr.egg-info/entry_points.txt +0 -0
  84. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow_mgr.egg-info/requires.txt +0 -0
  85. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/src/dv_flow_mgr.egg-info/top_level.txt +0 -0
  86. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/tests/examples/example1/example1.flow +0 -0
  87. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/tests/system/test_depends.py +0 -0
  88. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/tests/system/test_pkg_discovery.py +0 -0
  89. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/tests/system/test_stdlib.py +0 -0
  90. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/tests/unit/__init__.py +0 -0
  91. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/tests/unit/data/fileset/test1/files1/file1_1.sv +0 -0
  92. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/tests/unit/data/fileset/test1/files1/file1_2.sv +0 -0
  93. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/tests/unit/data/fileset/test1/files2/file2_1.sv +0 -0
  94. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/tests/unit/data/fileset/test1/files2/file2_2.sv +0 -0
  95. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/tests/unit/data/fileset/test1/flow.dv +0 -0
  96. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/tests/unit/data/fileset/test1 copy/files1/file1_1.sv +0 -0
  97. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/tests/unit/data/fileset/test1 copy/files1/file1_2.sv +0 -0
  98. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/tests/unit/data/fileset/test1 copy/files2/file2_1.sv +0 -0
  99. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/tests/unit/data/fileset/test1 copy/files2/file2_2.sv +0 -0
  100. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/tests/unit/data/fileset/test1 copy/test1.dfs +0 -0
  101. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/tests/unit/data/proj1/proj1.dfs +0 -0
  102. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/tests/unit/data/proj2/proj2.dfs +0 -0
  103. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/tests/unit/data/proj3/proj3.dfs +0 -0
  104. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/tests/unit/test_data_merge.py +0 -0
  105. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/tests/unit/test_dataflow.py +0 -0
  106. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/tests/unit/test_expr_eval.py +0 -0
  107. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/tests/unit/test_expr_parser.py +0 -0
  108. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/tests/unit/test_fileset.py +0 -0
  109. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/tests/unit/test_imports.py +0 -0
  110. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/tests/unit/test_markers.py +0 -0
  111. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/tests/unit/test_parse.py +0 -0
  112. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/tests/unit/test_pyclass.py +0 -0
  113. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/tests/unit/test_pytask_smoke.py +0 -0
  114. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/tests/unit/test_smoke copy.sav +0 -0
  115. {dv_flow_mgr-0.0.1.14147547123a1 → dv_flow_mgr-0.0.2.14148837747a1}/tests/unit/test_stdlib.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dv-flow-mgr
3
- Version: 0.0.1.14147547123a1
3
+ Version: 0.0.2.14148837747a1
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
@@ -0,0 +1,8 @@
1
+
2
+ # 0.0.2
3
+ - Add support for compound tasks
4
+ - Add support for simple run-directory control
5
+ - Add control over input/output data-item passthrough
6
+
7
+ # 0.0.1
8
+ - Basic leaf-task functionality
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
5
5
 
6
6
  [project]
7
7
  name = "dv-flow-mgr"
8
- version = "0.0.1.14147547123a1"
8
+ version = "0.0.2.14148837747a1"
9
9
  dependencies = [
10
10
  'jq',
11
11
  'pydantic',
@@ -90,7 +90,7 @@ class CmdRun(object):
90
90
  for spec in args.tasks:
91
91
  if spec.find('.') == -1:
92
92
  spec = pkg.name + "." + spec
93
- task = builder.mkTaskGraph(spec)
93
+ task = builder.mkTaskGraph(spec, rundir=spec)
94
94
  tasks.append(task)
95
95
 
96
96
  asyncio.run(runner.run(tasks))
@@ -317,7 +317,7 @@ class PackageDef(BaseModel):
317
317
  consumes = task.consumes.copy() if isinstance(task.consumes, list) else task.consumes
318
318
  needs = [] if task.needs is None else task.needs.copy()
319
319
 
320
- if self.uses is not None:
320
+ if base_ctor_t is not None:
321
321
  if passthrough is None:
322
322
  passthrough = base_ctor_t.passthrough
323
323
  if consumes is None:
@@ -328,7 +328,6 @@ class PackageDef(BaseModel):
328
328
  if consumes is None:
329
329
  consumes = ConsumesE.All
330
330
 
331
-
332
331
  return (passthrough, consumes, needs)
333
332
 
334
333
  def _getParamT(self, session, task, base_t : BaseModel):
@@ -66,6 +66,10 @@ async def CreateFile(runner, input) -> TaskDataResult:
66
66
 
67
67
  with open(filename, "w") as fp:
68
68
  fp.write(input.params.content)
69
+ memento.name = input.params.filename
70
+ memento.hash = hashlib.md5(input.params.content.encode()).hexdigest()
71
+ else:
72
+ memento = ex_memento
69
73
 
70
74
  fs = _FileSet(
71
75
  filetype=input.params.type,
@@ -50,8 +50,9 @@ class PassthroughE(enum.Enum):
50
50
 
51
51
 
52
52
  class StrategyDef(BaseModel):
53
- matrix : Dict[str,List[Any]] = dc.Field(
54
- default_factory=dict,
53
+ chain: Union[bool, None] = dc.Field(default=None)
54
+ matrix : Union[Dict[str,List[Any]],None] = dc.Field(
55
+ default=None,
55
56
  description="Matrix of parameter values to explore")
56
57
 
57
58
  class TaskDef(BaseModel):
@@ -107,5 +108,7 @@ class TaskDef(BaseModel):
107
108
  name=self.name,
108
109
  type=self.type,
109
110
  depends=self.depends.copy())
110
- return ret
111
+ return ret
112
+
113
+ TaskDef.model_rebuild()
111
114
 
@@ -203,13 +203,21 @@ class TaskGraphBuilder(object):
203
203
  if ctxt.rundir is None or ctxt.rundir == RundirE.Unique:
204
204
  self._rundir_s.pop()
205
205
 
206
- def mkTaskGraph(self, task : str) -> TaskNode:
206
+ def mkTaskGraph(self, task : str, rundir=None) -> TaskNode:
207
207
  self._pkg_s.clear()
208
208
  self._task_m.clear()
209
209
 
210
- return self._mkTaskGraph(task, self.rundir)
210
+ if rundir is not None:
211
+ self._rundir_s.append(rundir)
212
+
213
+ ret = self._mkTaskGraph(task)
214
+
215
+ if rundir is not None:
216
+ self._rundir_s.pop()
217
+
218
+ return ret
211
219
 
212
- def _mkTaskGraph(self, task : str, parent_rundir : str) -> TaskNode:
220
+ def _mkTaskGraph(self, task : str) -> TaskNode:
213
221
 
214
222
  elems = task.split(".")
215
223
 
@@ -224,8 +232,6 @@ class TaskGraphBuilder(object):
224
232
  else:
225
233
  pkg_spec = PackageSpec(pkg_name)
226
234
 
227
- rundir = os.path.join(parent_rundir, pkg_name, task_name)
228
-
229
235
  self._logger.debug("pkg_spec: %s" % str(pkg_spec))
230
236
  self._pkg_spec_s.append(pkg_spec)
231
237
  pkg = self.getPackage(pkg_spec)
@@ -243,7 +249,7 @@ class TaskGraphBuilder(object):
243
249
  need_fullname = self._resolveNeedRef(need_def)
244
250
  self._logger.debug("Searching for qualifed-name task %s" % need_fullname)
245
251
  if not need_fullname in self._task_m.keys():
246
- need_t = self._mkTaskGraph(need_fullname, rundir)
252
+ need_t = self._mkTaskGraph(need_fullname)
247
253
  self._task_m[need_fullname] = need_t
248
254
  needs.append(self._task_m[need_fullname])
249
255
 
@@ -258,7 +264,7 @@ class TaskGraphBuilder(object):
258
264
  params=params,
259
265
  name=task,
260
266
  needs=needs)
261
- task.rundir = rundir
267
+ # task.rundir = rundir
262
268
 
263
269
  self._task_m[task.name] = task
264
270
 
@@ -359,7 +365,7 @@ class TaskGraphBuilder(object):
359
365
  need_fullname = self._resolveNeedRef(need_def)
360
366
  self._logger.debug("Searching for qualifed-name task %s" % need_fullname)
361
367
  if not need_fullname in self._task_m.keys():
362
- need_t = self._mkTaskGraph(need_fullname, self.rundir)
368
+ need_t = self._mkTaskGraph(need_fullname)
363
369
  self._task_m[need_fullname] = need_t
364
370
  needs.append(self._task_m[need_fullname])
365
371
 
@@ -371,13 +377,14 @@ class TaskGraphBuilder(object):
371
377
  name=name,
372
378
  srcdir=srcdir,
373
379
  needs=needs)
380
+ ret.rundir = self.get_rundir(name)
374
381
  else:
375
382
  raise Exception("Failed to find ctor for task %s" % task_t)
376
383
  self._pkg_s.pop()
377
384
  self._logger.debug("<-- mkTaskNode: %s" % task_t)
378
385
  return ret
379
386
 
380
- def getTaskCtor(self, spec : Union[str,'TaskSpec'], pkg : PackageDef = None) -> 'TaskCtor':
387
+ def getTaskCtor(self, spec : Union[str,'TaskSpec'], pkg : PackageDef = None) -> 'TaskNodeCtor':
381
388
  from .task_def import TaskSpec
382
389
  if type(spec) == str:
383
390
  spec = TaskSpec(spec)
@@ -20,6 +20,7 @@
20
20
  #*
21
21
  #****************************************************************************
22
22
  import enum
23
+ import json
23
24
  import os
24
25
  import sys
25
26
  import dataclasses as dc
@@ -27,7 +28,7 @@ import pydantic.dataclasses as pdc
27
28
  import logging
28
29
  import toposort
29
30
  from typing import Any, Callable, ClassVar, Dict, List, Tuple
30
- from .task_data import TaskDataOutput, TaskDataResult
31
+ from .task_data import TaskDataInput, TaskDataOutput, TaskDataResult
31
32
  from .param import Param
32
33
 
33
34
  class RundirE(enum.Enum):
@@ -49,11 +50,11 @@ class TaskNode(object):
49
50
  consumes : List[Any] = dc.field(default_factory=list)
50
51
  needs : List[Tuple['TaskNode',bool]] = dc.field(default_factory=list)
51
52
  rundir : List[str] = dc.field(default=None)
52
- # rundir_t : RundirE = dc.field(default=RundirE.Unique)
53
53
  output : TaskDataOutput = dc.field(default=None)
54
54
  result : TaskDataResult = dc.field(default=None)
55
55
  start : float = dc.field(default=None)
56
56
  end : float = dc.field(default=None)
57
+ save_exec_data : bool = dc.field(default=True)
57
58
 
58
59
  _log : ClassVar = logging.getLogger("TaskNode")
59
60
 
@@ -101,6 +102,36 @@ class TaskNode(object):
101
102
  self._log.debug("<-- _matches: %s %s" % (self.name, consumed))
102
103
  return consumed
103
104
 
105
+ def _save_exec_data(self, rundir, input : TaskDataInput):
106
+ """Saves execution data to the rundir"""
107
+ data = {
108
+ "name": self.name,
109
+ "srcdir": self.srcdir,
110
+ "rundir": rundir,
111
+ "input": input.model_dump(warnings=False),
112
+ "needs": [need[0].name for need in self.needs],
113
+ "result": {
114
+ "status": self.result.status,
115
+ "changed": self.result.changed,
116
+ "memento": self.result.memento.model_dump() if self.result.memento else None,
117
+ },
118
+ "output": self.output.model_dump(),
119
+ }
120
+
121
+ if isinstance(self.consumes, list):
122
+ data["consumes"] = self.consumes
123
+ else:
124
+ data["consumes"] = str(self.consumes)
125
+
126
+ if isinstance(self.passthrough, list):
127
+ data["passthrough"] = self.passthrough
128
+ else:
129
+ data["passthrough"] = str(self.passthrough)
130
+
131
+ with open(os.path.join(rundir, "%s.exec_data.json" % self.name), "w") as f:
132
+ json.dump(data, f, indent=2)
133
+ f.write("\n")
134
+
104
135
 
105
136
 
106
137
 
@@ -53,9 +53,10 @@ class TaskNodeCtorCompound(TaskNodeCtor):
53
53
  params=params,
54
54
  needs=needs)
55
55
  # Use the compound task's rundir
56
- node.input.rundir = builder.get_rundir()
57
56
 
58
57
  builder.enter_compound(node, self.task_def.rundir)
58
+ node.input.rundir = builder.get_rundir()
59
+ print("input rundir: %s" % str(node.input.rundir))
59
60
  builder.addTask("in", node.input)
60
61
 
61
62
  self._buildSubGraph(builder, node)
@@ -172,6 +172,9 @@ class TaskNodeLeaf(TaskNode):
172
172
  changed=self.result.changed,
173
173
  dep_m=dep_m,
174
174
  output=output)
175
+
176
+ if self.save_exec_data:
177
+ self._save_exec_data(rundir, input)
175
178
 
176
179
  # TODO:
177
180
  self._log.debug("<-- do_run: %s" % self.name)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dv-flow-mgr
3
- Version: 0.0.1.14147547123a1
3
+ Version: 0.0.2.14148837747a1
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
@@ -6,6 +6,7 @@ ivpm.yaml
6
6
  pyproject.toml
7
7
  .github/workflows/ci.yml
8
8
  .vscode/settings.json
9
+ docs/ChangeLog.md
9
10
  docs/KeyArchitecture.md
10
11
  docs/Makefile
11
12
  docs/Notes.md
@@ -22,6 +22,7 @@ package:
22
22
  rundir: inherit
23
23
  uses: std.FileSet
24
24
  needs: [create_file]
25
+ passthrough: none
25
26
  with:
26
27
  base: ${{ rundir }}
27
28
  include: "*.txt"
@@ -69,6 +70,7 @@ package:
69
70
  - name: glob_txt
70
71
  rundir: inherit
71
72
  uses: std.FileSet
73
+ passthrough: none
72
74
  needs: [create_file]
73
75
  with:
74
76
  base: ${{ rundir }}
@@ -81,13 +83,15 @@ package:
81
83
  uses: TaskType1
82
84
 
83
85
  - name: entry
86
+ passthrough: all
87
+ consumes: none
84
88
  needs: [Task1, Task2]
85
89
  """
86
90
 
87
91
  rundir = os.path.join(tmpdir)
88
92
  with open(os.path.join(rundir, "flow.dv"), "w") as fp:
89
93
  fp.write(flow_dv)
90
-
94
+
91
95
  pkg_def = PackageDef.load(os.path.join(rundir, "flow.dv"))
92
96
  builder = TaskGraphBuilder(
93
97
  root_pkg=pkg_def,
@@ -6,7 +6,7 @@ import pytest
6
6
  import jq
7
7
  from typing import List
8
8
  import yaml
9
- from dv_flow.mgr import FileSet, PackageDef, TaskData, TaskGraphBuilder
9
+ from dv_flow.mgr import TaskSetRunner, PackageDef, TaskData, TaskGraphBuilder
10
10
  from pydantic import BaseModel
11
11
  from shutil import copytree
12
12
 
@@ -26,7 +26,9 @@ package:
26
26
 
27
27
  pkg_def = PackageDef.loads(flowdv)
28
28
  builder = TaskGraphBuilder(pkg_def, os.getcwd())
29
- task = builder.mkTaskGraph("my_pkg.entry")
29
+ task = builder.mkTaskGraph("my_pkg.entry", rundir="mk_pkg.entry")
30
+
31
+ assert len(task.rundir) == 1
30
32
 
31
33
  def test_jq():
32
34
  data = [