dv-flow-mgr 0.0.1.13489806632a1__tar.gz → 0.0.1.13525773676a1__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 (95) hide show
  1. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/PKG-INFO +1 -1
  2. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/docs/Steps.md +5 -0
  3. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/pyproject.toml +1 -1
  4. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/expr_eval.py +13 -3
  5. dv_flow_mgr-0.0.1.13525773676a1/src/dv_flow/mgr/param_ref_eval.py +44 -0
  6. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/task_data.py +8 -3
  7. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/task_node.py +63 -1
  8. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/task_runner.py +4 -45
  9. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow_mgr.egg-info/PKG-INFO +1 -1
  10. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow_mgr.egg-info/SOURCES.txt +1 -0
  11. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/tests/unit/test_pytask_smoke.py +55 -10
  12. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/.github/workflows/ci.yml +0 -0
  13. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/.gitignore +0 -0
  14. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/.vscode/settings.json +0 -0
  15. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/LICENSE +0 -0
  16. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/README.md +0 -0
  17. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/docs/KeyArchitecture.md +0 -0
  18. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/docs/Makefile +0 -0
  19. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/docs/Notes.md +0 -0
  20. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/docs/Roadmap.md +0 -0
  21. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/docs/RundirLayout.md +0 -0
  22. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/docs/Stages.md +0 -0
  23. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/docs/Tasks.md +0 -0
  24. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/docs/TypesAndDefs.md +0 -0
  25. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/docs/Usecases.md +0 -0
  26. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/docs/conf.py +0 -0
  27. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/docs/index.rst +0 -0
  28. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/docs/intro.rst +0 -0
  29. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/docs/quickstart.rst +0 -0
  30. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/docs/reference.rst +0 -0
  31. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/ivpm.yaml +0 -0
  32. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/setup.cfg +0 -0
  33. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/__init__.py +0 -0
  34. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/__main__.py +0 -0
  35. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/cmds/cmd_run.py +0 -0
  36. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/expr_parser.py +0 -0
  37. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/fileset.py +0 -0
  38. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/fragment_def.py +0 -0
  39. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/out +0 -0
  40. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/package.py +0 -0
  41. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/package_def.py +0 -0
  42. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/package_import_spec.py +0 -0
  43. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/param_def.py +0 -0
  44. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/parsetab.py +0 -0
  45. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/pkg_rgy.py +0 -0
  46. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/share/flow.json +0 -0
  47. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/std/fileset.py +0 -0
  48. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/std/flow.dv +0 -0
  49. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/std/message.py +0 -0
  50. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/std/task_null.py +0 -0
  51. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/task.py +0 -0
  52. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/task_ctor.py +0 -0
  53. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/task_def.py +0 -0
  54. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/task_exec_data.py +0 -0
  55. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/task_graph_builder.py +0 -0
  56. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/task_graph_runner.py +0 -0
  57. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/task_graph_runner_local.py +0 -0
  58. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/task_impl_data.py +0 -0
  59. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/task_memento.py +0 -0
  60. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/task_output.py +0 -0
  61. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/task_params_ctor.py +0 -0
  62. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/type.py +0 -0
  63. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/type_def.py +0 -0
  64. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow/mgr/util.py +0 -0
  65. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow_mgr.egg-info/dependency_links.txt +0 -0
  66. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow_mgr.egg-info/entry_points.txt +0 -0
  67. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow_mgr.egg-info/requires.txt +0 -0
  68. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/src/dv_flow_mgr.egg-info/top_level.txt +0 -0
  69. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/tests/examples/example1/example1.flow +0 -0
  70. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/tests/system/test_depends.py +0 -0
  71. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/tests/system/test_pkg_discovery.py +0 -0
  72. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/tests/system/test_stdlib.py +0 -0
  73. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/tests/unit/__init__.py +0 -0
  74. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/tests/unit/data/fileset/test1/files1/file1_1.sv +0 -0
  75. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/tests/unit/data/fileset/test1/files1/file1_2.sv +0 -0
  76. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/tests/unit/data/fileset/test1/files2/file2_1.sv +0 -0
  77. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/tests/unit/data/fileset/test1/files2/file2_2.sv +0 -0
  78. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/tests/unit/data/fileset/test1/flow.dv +0 -0
  79. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/tests/unit/data/fileset/test1 copy/files1/file1_1.sv +0 -0
  80. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/tests/unit/data/fileset/test1 copy/files1/file1_2.sv +0 -0
  81. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/tests/unit/data/fileset/test1 copy/files2/file2_1.sv +0 -0
  82. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/tests/unit/data/fileset/test1 copy/files2/file2_2.sv +0 -0
  83. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/tests/unit/data/fileset/test1 copy/test1.dfs +0 -0
  84. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/tests/unit/data/proj1/proj1.dfs +0 -0
  85. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/tests/unit/data/proj2/proj2.dfs +0 -0
  86. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/tests/unit/data/proj3/proj3.dfs +0 -0
  87. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/tests/unit/test_data_merge.py +0 -0
  88. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/tests/unit/test_expr_eval.py +0 -0
  89. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/tests/unit/test_expr_parser.py +0 -0
  90. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/tests/unit/test_fileset.py +0 -0
  91. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/tests/unit/test_parse.py +0 -0
  92. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/tests/unit/test_pyclass.py +0 -0
  93. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/tests/unit/test_smoke copy.sav +0 -0
  94. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/tests/unit/test_smoke.py +0 -0
  95. {dv_flow_mgr-0.0.1.13489806632a1 → dv_flow_mgr-0.0.1.13525773676a1}/tests/unit/test_stdlib.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: dv-flow-mgr
3
- Version: 0.0.1.13489806632a1
3
+ Version: 0.0.1.13525773676a1
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
@@ -104,6 +104,11 @@ runner.run(simImg)
104
104
 
105
105
  factory.addTaskType(MyTask.ctor)
106
106
 
107
+ # Proper values
108
+ - Show that can pass individual values
109
+ - Need to test append/prepend/path-append/path-prepend
110
+ - Need to process and expand expressions
111
+ -
107
112
 
108
113
 
109
114
 
@@ -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.13489806632a1"
8
+ version = "0.0.1.13525773676a1"
9
9
  dependencies = [
10
10
  'pydantic',
11
11
  'pyyaml',
@@ -9,16 +9,26 @@ class ExprEval(ExprVisitor):
9
9
  variables : Dict[str, object] = dc.field(default_factory=dict)
10
10
  value : Any = None
11
11
 
12
- def eval(self, e : Expr):
12
+ def eval(self, e : Expr) -> str:
13
13
  self.value = None
14
14
  e.accept(self)
15
- return self.value
15
+
16
+ val = self._toString(self.value)
17
+
18
+ return val
19
+
20
+ def _toString(self, val):
21
+ if isinstance(val, list):
22
+ val = '[' + ",".join(self._toString(v) for v in val) + ']'
23
+ elif hasattr(val, "model_dump_json"):
24
+ val = val.model_dump_json()
25
+ return val
16
26
 
17
27
  def visitExprId(self, e : ExprId):
18
28
  if e.id in self.variables:
19
29
  self.value = self.variables[e.id]
20
30
  else:
21
- raise Exception("Variable %s not found" % e.id)
31
+ raise Exception("Variable '%s' not found" % e.id)
22
32
 
23
33
  def visitExprString(self, e : ExprString):
24
34
  self.value = e.value
@@ -0,0 +1,44 @@
1
+ import dataclasses as dc
2
+ import json
3
+ from .expr_eval import ExprEval
4
+ from .expr_parser import ExprParser
5
+
6
+ @dc.dataclass
7
+ class ParamRefEval(object):
8
+
9
+ parser : ExprParser = ExprParser()
10
+ expr_eval : ExprEval = ExprEval()
11
+
12
+ def eval(self, val : str) -> str:
13
+ idx = 0
14
+
15
+ while True:
16
+ idx = val.find("${{", idx)
17
+
18
+ if idx != -1:
19
+ eidx = val.find("}}", idx+1)
20
+
21
+ if eidx == -1:
22
+ raise Exception("unterminated variable ref")
23
+
24
+ ref = val[idx+3:eidx].strip()
25
+ print("ref: %s" % ref)
26
+
27
+ expr_ast = self.parser.parse(ref)
28
+ print("expr_ast: %s" % str(expr_ast))
29
+ exp_val = self.expr_eval.eval(expr_ast)
30
+ print("exp_val: %s" % str(exp_val))
31
+
32
+ # Replacing [idx..eidx+2] with len(exp_val)
33
+ val = val[:idx] + exp_val + val[eidx+2:]
34
+ idx += len(exp_val)
35
+
36
+
37
+
38
+ else:
39
+ break
40
+
41
+ return val
42
+
43
+ def setVar(self, name, value):
44
+ self.expr_eval.variables[name] = value
@@ -37,6 +37,10 @@ class TaskMarker(BaseModel):
37
37
  severity : str
38
38
  loc : TaskMarkerLoc = dc.Field(default=None)
39
39
 
40
+ class TaskParameterSet(BaseModel):
41
+ task : str = None # Name of the task that produced this param set
42
+ seq : int = -1 # Order in which the param-set must appear
43
+
40
44
  class TaskDataInput(BaseModel):
41
45
  changed : bool
42
46
  srcdir : str
@@ -46,14 +50,15 @@ class TaskDataInput(BaseModel):
46
50
 
47
51
  class TaskDataResult(BaseModel):
48
52
  changed : bool = dc.Field(default=True)
49
- output : List[Any] = dc.Field(default_factory=list)
53
+ output : List[TaskParameterSet] = dc.Field(default_factory=list)
50
54
  memento : Any = dc.Field(default=None)
51
55
  markers : List[TaskMarker] = dc.Field(default_factory=list)
52
56
  status : int = dc.Field(default=0)
53
57
 
54
58
  class TaskDataOutput(BaseModel):
55
- changed : bool
56
- output : List[Any]
59
+ changed : bool = True
60
+ output : List[TaskParameterSet] = dc.Field(default_factory=list)
61
+ dep_m : Dict[str,List[str]] = dc.Field(default_factory=dict)
57
62
 
58
63
  class TaskDataParamOpE(enum.Enum):
59
64
  Set = enum.auto()
@@ -1,9 +1,11 @@
1
1
 
2
2
  import dataclasses as dc
3
+ import pydantic.dataclasses as pdc
3
4
  import logging
4
5
  from typing import Any, Callable, ClassVar, Dict, List
5
6
  from .task_data import TaskDataInput, TaskDataOutput, TaskDataResult
6
7
  from .task_params_ctor import TaskParamsCtor
8
+ from .param_ref_eval import ParamRefEval
7
9
 
8
10
  @dc.dataclass
9
11
  class TaskNode(object):
@@ -24,6 +26,58 @@ class TaskNode(object):
24
26
 
25
27
  _log : ClassVar = logging.getLogger("TaskNode")
26
28
 
29
+ async def do_run(self,
30
+ runner,
31
+ rundir,
32
+ memento : Any = None) -> 'TaskDataResult':
33
+ changed = False
34
+ for dep in self.needs:
35
+ changed |= dep.changed
36
+
37
+ # TODO: Form dep-map from inputs
38
+ # TODO: Order param sets according to dep-map
39
+ in_params = []
40
+ for need in self.needs:
41
+ in_params.extend(need.output.output)
42
+
43
+ # TODO: create an evaluator for substituting param values
44
+ eval = ParamRefEval()
45
+
46
+ eval.setVar("in", in_params)
47
+
48
+ for name,field in self.params.model_fields.items():
49
+ value = getattr(self.params, name)
50
+ if value.find("${{") != -1:
51
+ new_val = eval.eval(value)
52
+ setattr(self.params, name, new_val)
53
+ print("TODO: expand")
54
+ print("Field: %s %s" % (name, str(value)))
55
+ pass
56
+
57
+ input = TaskDataInput(
58
+ changed=changed,
59
+ srcdir=self.srcdir,
60
+ rundir=rundir,
61
+ params=self.params,
62
+ memento=memento)
63
+
64
+ # TODO: notify of task start
65
+ ret : TaskDataResult = await self.task(self, input)
66
+ # TODO: notify of task complete
67
+
68
+ # TODO: form a dep map from the outgoing param sets
69
+ dep_m = {}
70
+
71
+ # Store the result
72
+ self.output = TaskDataOutput(
73
+ changed=ret.changed,
74
+ dep_m=dep_m,
75
+ output=ret.output.copy())
76
+
77
+ # TODO:
78
+
79
+ return ret
80
+
27
81
  def __hash__(self):
28
82
  return id(self)
29
83
 
@@ -76,5 +130,13 @@ class TaskNodeCtorWrapper(TaskNodeCtor):
76
130
 
77
131
  def mkTaskParams(self, params : Dict) -> Any:
78
132
  obj = self.paramT()
79
- # TODO: apply user-specified params
133
+
134
+ # Apply user-specified params
135
+ for key,value in params.items():
136
+ if not hasattr(obj, key):
137
+ raise Exception("Parameters class %s does not contain field %s" % (
138
+ str(type(obj)),
139
+ key))
140
+ else:
141
+ setattr(obj, key, value)
80
142
  return obj
@@ -53,7 +53,10 @@ class TaskSetRunner(TaskRunner):
53
53
  active_task_l.pop(i)
54
54
  break
55
55
  if t not in done_task_s:
56
- coro = asyncio.Task(self.do_run(t))
56
+ coro = asyncio.Task(t.do_run(
57
+ self,
58
+ self.rundir, # TODO
59
+ None)) # TODO: memento
57
60
  active_task_l.append((t, coro))
58
61
 
59
62
  # Now, wait for tasks to complete
@@ -64,50 +67,6 @@ class TaskSetRunner(TaskRunner):
64
67
 
65
68
  pass
66
69
 
67
- async def do_run(self,
68
- task : 'TaskNode',
69
- memento : Any = None) -> 'TaskDataResult':
70
- changed = False
71
- for dep in task.needs:
72
- changed |= dep.changed
73
-
74
- # TODO: create an evaluator for substituting param values
75
- eval = None
76
-
77
- for field in dc.fields(task.params):
78
- print("Field: %s" % field.name)
79
-
80
- input = TaskDataInput(
81
- changed=changed,
82
- srcdir=task.srcdir,
83
- rundir=self.rundir,
84
- params=task.params,
85
- memento=memento)
86
-
87
- # TODO: notify of task start
88
- ret : TaskDataResult = await task.task(self, input)
89
- # TODO: notify of task complete
90
-
91
- # Store the result
92
- task.output = TaskDataOutput(
93
- changed=ret.changed,
94
- output=ret.output.copy())
95
-
96
- # # By definition, none of this have run, since we just ran
97
- # for dep in task.dependents:
98
- # is_sat = True
99
- # for need in dep.needs:
100
- # if need.output is None:
101
- # is_sat = False
102
- # break
103
-
104
- # if is_sat:
105
- # # TODO: queue task for evaluation
106
- # pass
107
- # TODO:
108
-
109
- return ret
110
-
111
70
  def _buildDepMap(self, dep_m, task : TaskNode):
112
71
  if task not in dep_m.keys():
113
72
  dep_m[task] = set(task.needs)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: dv-flow-mgr
3
- Version: 0.0.1.13489806632a1
3
+ Version: 0.0.1.13525773676a1
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
@@ -31,6 +31,7 @@ src/dv_flow/mgr/package.py
31
31
  src/dv_flow/mgr/package_def.py
32
32
  src/dv_flow/mgr/package_import_spec.py
33
33
  src/dv_flow/mgr/param_def.py
34
+ src/dv_flow/mgr/param_ref_eval.py
34
35
  src/dv_flow/mgr/parsetab.py
35
36
  src/dv_flow/mgr/pkg_rgy.py
36
37
  src/dv_flow/mgr/task.py
@@ -1,8 +1,9 @@
1
1
  import asyncio
2
2
  import pytest
3
3
  import dataclasses as dc
4
+ from pydantic import BaseModel
4
5
  from dv_flow.mgr.task import Task
5
- from dv_flow.mgr.task_data import TaskDataResult, TaskMarker
6
+ from dv_flow.mgr.task_data import TaskDataResult, TaskMarker, TaskParameterSet
6
7
  from dv_flow.mgr.task_node import task as t_decorator
7
8
  from dv_flow.mgr.task_runner import SingleTaskRunner, TaskSetRunner
8
9
 
@@ -63,34 +64,78 @@ def test_smoke_3(tmpdir):
63
64
  class Params(object):
64
65
  p1 : str = None
65
66
 
66
- called = False
67
+ called = []
67
68
 
68
69
  @t_decorator(Params)
69
70
  async def MyTask1(runner, input):
70
71
  nonlocal called
71
- called = True
72
- print("Hello from run1 (%s)" % input.params.p1)
72
+ called.append(("MyTask1", input.params.p1))
73
73
  return TaskDataResult()
74
74
 
75
75
  @t_decorator(Params)
76
76
  async def MyTask2(runner, input):
77
77
  nonlocal called
78
- called = True
79
- print("Hello from run2 (%s)" % input.params.p1)
78
+ called.append(("MyTask2", input.params.p1))
80
79
  return TaskDataResult()
81
80
 
82
81
  @t_decorator(Params)
83
82
  async def MyTask3(runner, input):
84
83
  nonlocal called
85
- called = True
86
- print("Hello from run3 (%s)" % input.params.p1)
84
+ called.append(("MyTask3", input.params.p1))
87
85
  return TaskDataResult()
88
86
 
89
87
  task1 = MyTask1("srcdir", p1="1")
90
88
  task2 = MyTask2("srcdir", p1="2")
91
- task3 = MyTask3("srcdir", p1="2", needs=[task1, task2])
89
+ task3 = MyTask3("srcdir", p1="3", needs=[task1, task2])
92
90
  runner = TaskSetRunner("rundir")
93
91
 
94
92
  result = asyncio.run(runner.run(task3))
95
93
 
96
- assert called
94
+ assert len(called) == 3
95
+ assert called[-1][0] == "MyTask3"
96
+ assert called[-1][1] == "3"
97
+
98
+ def test_smoke_4(tmpdir):
99
+
100
+ class Params(BaseModel):
101
+ p1 : str = None
102
+
103
+ class TaskData(TaskParameterSet):
104
+ val : int = -1
105
+
106
+ called = []
107
+
108
+ @t_decorator(Params)
109
+ async def MyTask1(runner, input):
110
+ nonlocal called
111
+ called.append(("MyTask1", input.params.p1))
112
+ return TaskDataResult(
113
+ output=[TaskData(val=1)]
114
+ )
115
+
116
+ @t_decorator(Params)
117
+ async def MyTask2(runner, input):
118
+ nonlocal called
119
+ called.append(("MyTask2", input.params.p1))
120
+ return TaskDataResult(
121
+ output=[TaskData(val=2)]
122
+ )
123
+
124
+ @t_decorator(Params)
125
+ async def MyTask3(runner, input):
126
+ nonlocal called
127
+ called.append(("MyTask3", input.params.p1))
128
+ return TaskDataResult()
129
+
130
+ task1 = MyTask1("srcdir", p1="1")
131
+ task2 = MyTask2("srcdir", p1="2")
132
+ task3 = MyTask3("srcdir",
133
+ p1="${{ in }}",
134
+ needs=[task1, task2])
135
+ runner = TaskSetRunner("rundir")
136
+
137
+ result = asyncio.run(runner.run(task3))
138
+
139
+ assert len(called) == 3
140
+ assert called[-1][0] == "MyTask3"
141
+ assert called[-1][1] == "3"