dv-flow-mgr 0.0.1.12922457458a1__tar.gz → 0.0.1.12932354274a1__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 (73) hide show
  1. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/PKG-INFO +1 -1
  2. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/pyproject.toml +1 -1
  3. dv_flow_mgr-0.0.1.12922457458a1/src/dv_flow/mgr/parameters.py → dv_flow_mgr-0.0.1.12932354274a1/src/dv_flow/mgr/__main__.py +18 -4
  4. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/src/dv_flow/mgr/package.py +2 -22
  5. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/src/dv_flow/mgr/package_def.py +0 -1
  6. dv_flow_mgr-0.0.1.12932354274a1/src/dv_flow/mgr/package_import_spec.py +51 -0
  7. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/src/dv_flow/mgr/pkg_rgy.py +21 -0
  8. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/src/dv_flow/mgr/task.py +12 -56
  9. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/src/dv_flow/mgr/task_graph_builder.py +21 -7
  10. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/src/dv_flow/mgr/task_graph_runner.py +1 -1
  11. dv_flow_mgr-0.0.1.12932354274a1/src/dv_flow/mgr/util.py +40 -0
  12. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/src/dv_flow_mgr.egg-info/PKG-INFO +1 -1
  13. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/src/dv_flow_mgr.egg-info/SOURCES.txt +0 -2
  14. dv_flow_mgr-0.0.1.12922457458a1/src/dv_flow/mgr/__main__.py +0 -21
  15. dv_flow_mgr-0.0.1.12922457458a1/src/dv_flow/mgr/flow.py +0 -59
  16. dv_flow_mgr-0.0.1.12922457458a1/src/dv_flow/mgr/package_import_spec.py +0 -31
  17. dv_flow_mgr-0.0.1.12922457458a1/src/dv_flow/mgr/util.py +0 -19
  18. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/.github/workflows/ci.yml +0 -0
  19. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/.gitignore +0 -0
  20. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/.vscode/settings.json +0 -0
  21. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/LICENSE +0 -0
  22. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/README.md +0 -0
  23. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/docs/Makefile +0 -0
  24. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/docs/Notes.md +0 -0
  25. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/docs/Roadmap.md +0 -0
  26. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/docs/Stages.md +0 -0
  27. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/docs/TypesAndDefs.md +0 -0
  28. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/docs/conf.py +0 -0
  29. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/docs/index.rst +0 -0
  30. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/docs/intro.rst +0 -0
  31. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/docs/quickstart.rst +0 -0
  32. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/docs/reference.rst +0 -0
  33. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/ivpm.yaml +0 -0
  34. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/setup.cfg +0 -0
  35. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/src/dv_flow/mgr/__init__.py +0 -0
  36. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/src/dv_flow/mgr/cmds/cmd_run.py +0 -0
  37. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/src/dv_flow/mgr/fileset.py +0 -0
  38. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/src/dv_flow/mgr/fragment_def.py +0 -0
  39. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/src/dv_flow/mgr/share/flow.json +0 -0
  40. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/src/dv_flow/mgr/std/fileset.py +0 -0
  41. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/src/dv_flow/mgr/std/flow.dv +0 -0
  42. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/src/dv_flow/mgr/std/message.py +0 -0
  43. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/src/dv_flow/mgr/std/task_fileset.py +0 -0
  44. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/src/dv_flow/mgr/std/task_null.py +0 -0
  45. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/src/dv_flow/mgr/task_data.py +0 -0
  46. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/src/dv_flow/mgr/task_def.py +0 -0
  47. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/src/dv_flow/mgr/task_graph_runner_local.py +0 -0
  48. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/src/dv_flow/mgr/task_memento.py +0 -0
  49. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/src/dv_flow_mgr.egg-info/dependency_links.txt +0 -0
  50. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/src/dv_flow_mgr.egg-info/entry_points.txt +0 -0
  51. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/src/dv_flow_mgr.egg-info/requires.txt +0 -0
  52. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/src/dv_flow_mgr.egg-info/top_level.txt +0 -0
  53. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/tests/examples/example1/example1.flow +0 -0
  54. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/tests/unit/__init__.py +0 -0
  55. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/tests/unit/data/fileset/test1/files1/file1_1.sv +0 -0
  56. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/tests/unit/data/fileset/test1/files1/file1_2.sv +0 -0
  57. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/tests/unit/data/fileset/test1/files2/file2_1.sv +0 -0
  58. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/tests/unit/data/fileset/test1/files2/file2_2.sv +0 -0
  59. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/tests/unit/data/fileset/test1/flow.dv +0 -0
  60. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/tests/unit/data/fileset/test1 copy/files1/file1_1.sv +0 -0
  61. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/tests/unit/data/fileset/test1 copy/files1/file1_2.sv +0 -0
  62. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/tests/unit/data/fileset/test1 copy/files2/file2_1.sv +0 -0
  63. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/tests/unit/data/fileset/test1 copy/files2/file2_2.sv +0 -0
  64. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/tests/unit/data/fileset/test1 copy/test1.dfs +0 -0
  65. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/tests/unit/data/proj1/proj1.dfs +0 -0
  66. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/tests/unit/data/proj2/proj2.dfs +0 -0
  67. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/tests/unit/data/proj3/proj3.dfs +0 -0
  68. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/tests/unit/test_data_merge.py +0 -0
  69. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/tests/unit/test_fileset.py +0 -0
  70. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/tests/unit/test_pyclass.py +0 -0
  71. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/tests/unit/test_smoke copy.sav +0 -0
  72. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/tests/unit/test_smoke.py +0 -0
  73. {dv_flow_mgr-0.0.1.12922457458a1 → dv_flow_mgr-0.0.1.12932354274a1}/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.12922457458a1
3
+ Version: 0.0.1.12932354274a1
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,7 +5,7 @@ build-backend = "setuptools.build_meta"
5
5
 
6
6
  [project]
7
7
  name = "dv-flow-mgr"
8
- version = "0.0.1.12922457458a1"
8
+ version = "0.0.1.12932354274a1"
9
9
  dependencies = [
10
10
  'pydantic',
11
11
  'pyyaml',
@@ -1,5 +1,5 @@
1
1
  #****************************************************************************
2
- #* parameters.py
2
+ #* __main__.py
3
3
  #*
4
4
  #* Copyright 2023 Matthew Ballance and Contributors
5
5
  #*
@@ -19,9 +19,23 @@
19
19
  #* Author:
20
20
  #*
21
21
  #****************************************************************************
22
+ import argparse
23
+ from .cmds.cmd_run import CmdRun
22
24
 
23
- class Parameters(object):
25
+ def get_parser():
26
+ parser = argparse.ArgumentParser(description='dv_flow_mgr')
27
+ subparsers = parser.add_subparsers(required=True)
24
28
 
25
- def __init__(self):
26
- pass
29
+ run_parser = subparsers.add_parser('run', help='run a flow')
30
+ run_parser.add_argument("tasks", nargs='*', help="tasks to run")
31
+ run_parser.set_defaults(func=CmdRun())
27
32
 
33
+ return parser
34
+
35
+ def main():
36
+ parser = get_parser()
37
+ args = parser.parse_args()
38
+ args.func(args)
39
+
40
+ if __name__ == "__main__":
41
+ main()
@@ -20,22 +20,8 @@
20
20
  #*
21
21
  #****************************************************************************
22
22
  import dataclasses as dc
23
- import json
24
- from pydantic import BaseModel
25
- from typing import Any, Callable, Dict, List, Tuple
26
- from .flow import Flow
27
- from .task import TaskParams, TaskCtor
28
- from .task_def import TaskDef
29
-
30
- class PackageAcc(object):
31
- pkg_spec : 'PackageSpec'
32
- session : 'Session'
33
- pkg : 'Package' = None
34
-
35
- def getPackage(self) -> 'Package':
36
- if self.pkg is None:
37
- self.pkg = self.session.getPackage(self.pkg_spec)
38
- return self.pkg
23
+ from typing import Any, Dict
24
+ from .task import TaskCtor
39
25
 
40
26
  @dc.dataclass
41
27
  class Package(object):
@@ -44,13 +30,7 @@ class Package(object):
44
30
  # Package holds constructors for tasks
45
31
  # - Dict holds the default parameters for the task
46
32
  tasks : Dict[str,TaskCtor] = dc.field(default_factory=dict)
47
- imports : List['PackageAcc'] = dc.field(default_factory=list)
48
33
 
49
- def getPackage(self, name : str) -> 'Package':
50
- for p in self.imports:
51
- if p.name == name:
52
- return p.getPackage()
53
-
54
34
  def getTaskCtor(self, name : str) -> TaskCtor:
55
35
  return self.tasks[name]
56
36
 
@@ -28,7 +28,6 @@ import pydantic
28
28
  import pydantic.dataclasses as dc
29
29
  from pydantic import BaseModel
30
30
  from typing import Any, Dict, List, Callable, Tuple
31
- from .flow import Flow
32
31
  from .fragment_def import FragmentDef
33
32
  from .package import Package
34
33
  from .package_import_spec import PackageImportSpec, PackageSpec
@@ -0,0 +1,51 @@
1
+ #****************************************************************************
2
+ #* package_import_spec.py
3
+ #*
4
+ #* Copyright 2023 Matthew Ballance and Contributors
5
+ #*
6
+ #* Licensed under the Apache License, Version 2.0 (the "License"); you may
7
+ #* not use this file except in compliance with the License.
8
+ #* You may obtain a copy of the License at:
9
+ #*
10
+ #* http://www.apache.org/licenses/LICENSE-2.0
11
+ #*
12
+ #* Unless required by applicable law or agreed to in writing, software
13
+ #* distributed under the License is distributed on an "AS IS" BASIS,
14
+ #* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ #* See the License for the specific language governing permissions and
16
+ #* limitations under the License.
17
+ #*
18
+ #* Created on:
19
+ #* Author:
20
+ #*
21
+ #****************************************************************************
22
+ import pydantic.dataclasses as dc
23
+ import json
24
+ from typing import Dict, Any
25
+
26
+ @dc.dataclass
27
+ class PackageSpec(object):
28
+ name : str
29
+ params : Dict[str,Any] = dc.Field(default_factory=dict)
30
+ _fullname : str = None
31
+
32
+ def get_fullname(self) -> str:
33
+ if self._fullname is None:
34
+ if len(self.params) != 0:
35
+ self._fullname = "%s%s}" % (
36
+ self.name,
37
+ json.dumps(self.params, separators=(',', ':')))
38
+ else:
39
+ self._fullname = self.name
40
+ return self._fullname
41
+
42
+ def __hash__(self):
43
+ return hash(self.get_fullname())
44
+
45
+ def __eq__(self, value):
46
+ return isinstance(value, PackageSpec) and value.get_fullname() == self.get_fullname()
47
+
48
+ @dc.dataclass
49
+ class PackageImportSpec(PackageSpec):
50
+ path : str = dc.Field(default=None, alias="from")
51
+ alias : str = dc.Field(default=None, alias="as")
@@ -1,3 +1,24 @@
1
+ #****************************************************************************
2
+ #* pkg_rgy.py
3
+ #*
4
+ #* Copyright 2023 Matthew Ballance and Contributors
5
+ #*
6
+ #* Licensed under the Apache License, Version 2.0 (the "License"); you may
7
+ #* not use this file except in compliance with the License.
8
+ #* You may obtain a copy of the License at:
9
+ #*
10
+ #* http://www.apache.org/licenses/LICENSE-2.0
11
+ #*
12
+ #* Unless required by applicable law or agreed to in writing, software
13
+ #* distributed under the License is distributed on an "AS IS" BASIS,
14
+ #* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ #* See the License for the specific language governing permissions and
16
+ #* limitations under the License.
17
+ #*
18
+ #* Created on:
19
+ #* Author:
20
+ #*
21
+ #****************************************************************************
1
22
  import os
2
23
  import sys
3
24
  from typing import Dict, Tuple
@@ -68,12 +68,8 @@ class Task(object):
68
68
  session : 'TaskGraphRunner' = None
69
69
  basedir : str = None
70
70
  memento : TaskMemento = None
71
- depend_refs : List['TaskSpec'] = dc.field(default_factory=list)
72
- depends : List[int] = dc.field(default_factory=list)
73
- running : bool = False
74
- output_set : bool = False
71
+ depends : List['Task'] = dc.field(default_factory=list)
75
72
  output : Any = None
76
- output_ev : Any = asyncio.Event()
77
73
 
78
74
  # Implementation data below
79
75
  basedir : str = dc.field(default=None)
@@ -107,23 +103,13 @@ class Task(object):
107
103
  async def do_run(self) -> TaskData:
108
104
  print("do_run: %s - %d depends" % (self.name, len(self.depends)))
109
105
  if len(self.depends) > 0:
110
- awaitables = [dep.waitOutput() for dep in self.depends]
111
- deps_o = await asyncio.gather(*awaitables)
106
+ deps_o = []
107
+ for d in self.depends:
108
+ dep_o = d.getOutput()
109
+ if dep_o is None:
110
+ raise Exception("Null output for %s" % d.name)
111
+ deps_o.append(dep_o)
112
112
 
113
- # Merge filesets. A fileset with the same
114
- print("deps_o: %s" % str(deps_o))
115
-
116
-
117
- # print("deps_m: %s" % str(deps_m))
118
-
119
- # Merge the output of the dependencies into a single input data
120
- # if len(self.depends) > 1:
121
- # raise Exception("TODO: handle >1 inputs")
122
-
123
- # Now that we have a clean input object, we need
124
- # to build the dep map
125
-
126
- # input = self.depends[0].output.copy()
127
113
  input = TaskData.merge(deps_o)
128
114
  input.src = self.name
129
115
  input.deps[self.name] = list(inp.name for inp in self.depends)
@@ -137,29 +123,17 @@ class Task(object):
137
123
 
138
124
  self.init_rundir()
139
125
 
140
- result = await self.run(input)
141
-
142
- if not self.output_set:
143
- if result is None:
144
- result = TaskData()
126
+ self.output = await self.run(input)
145
127
 
146
- # We perform an auto-merge algorithm if the task
147
- # doesn't take control
148
- # for dep_o in deps_o:
149
- # result.deps.append(dep_o.clone())
150
-
151
- self.setOutput(result)
152
- else:
153
- # The task has taken control of the output
154
- result = self.getOutput()
128
+ if self.output is None:
129
+ raise Exception("No output produced by %s" % self.name)
130
+ result = TaskData()
155
131
 
156
132
  # Write-back the memento, if specified
157
133
  self.save_memento()
158
134
 
159
- self.running = False
160
-
161
135
  # Combine data from the deps to produce a result
162
- return result
136
+ return self.output
163
137
 
164
138
  async def run(self, input : TaskData) -> TaskData:
165
139
  raise NotImplementedError("TaskImpl.run() not implemented")
@@ -173,24 +147,6 @@ class Task(object):
173
147
  with open(os.path.join(self.rundir, "memento.json"), "w") as fp:
174
148
  fp.write(self.memento.model_dump_json(indent=2))
175
149
 
176
- def setOutput(self, output : TaskData):
177
- self.output_set = True
178
- output.src = self.name
179
- self.output = output
180
- self.output_ev.set()
181
-
182
- async def waitOutput(self) -> TaskData:
183
- if not self.output_set:
184
- if self.running:
185
- # Task is already running
186
- print("wait")
187
- await self.output_ev.wait()
188
- else:
189
- self.running = True
190
- print("start task")
191
- await self.do_run()
192
- return self.output
193
-
194
150
  def getOutput(self) -> TaskData:
195
151
  return self.output
196
152
 
@@ -1,3 +1,24 @@
1
+ #****************************************************************************
2
+ #* task_graph_builder.py
3
+ #*
4
+ #* Copyright 2023 Matthew Ballance and Contributors
5
+ #*
6
+ #* Licensed under the Apache License, Version 2.0 (the "License"); you may
7
+ #* not use this file except in compliance with the License.
8
+ #* You may obtain a copy of the License at:
9
+ #*
10
+ #* http://www.apache.org/licenses/LICENSE-2.0
11
+ #*
12
+ #* Unless required by applicable law or agreed to in writing, software
13
+ #* distributed under the License is distributed on an "AS IS" BASIS,
14
+ #* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ #* See the License for the specific language governing permissions and
16
+ #* limitations under the License.
17
+ #*
18
+ #* Created on:
19
+ #* Author:
20
+ #*
21
+ #****************************************************************************
1
22
  import os
2
23
  import dataclasses as dc
3
24
  from .package import Package
@@ -87,13 +108,6 @@ class TaskGraphBuilder(object):
87
108
  rundir=rundir,
88
109
  srcdir=ctor_t.srcdir)
89
110
 
90
- for i,d in enumerate(task.depend_refs):
91
- if d in self._task_m.keys():
92
- task.depends.append(self._task_m[d])
93
- else:
94
- print("mkTaskGraph: %s" % d)
95
- task.depends.append(self._mkTaskGraph(d, parent_rundir))
96
-
97
111
  self._task_m[task.name] = task
98
112
 
99
113
  self._pkg_s.pop()
@@ -1,5 +1,5 @@
1
1
  #****************************************************************************
2
- #* session.py
2
+ #* task_graph_runner.py
3
3
  #*
4
4
  #* Copyright 2023 Matthew Ballance and Contributors
5
5
  #*
@@ -0,0 +1,40 @@
1
+ #****************************************************************************
2
+ #* util.py
3
+ #*
4
+ #* Copyright 2023 Matthew Ballance and Contributors
5
+ #*
6
+ #* Licensed under the Apache License, Version 2.0 (the "License"); you may
7
+ #* not use this file except in compliance with the License.
8
+ #* You may obtain a copy of the License at:
9
+ #*
10
+ #* http://www.apache.org/licenses/LICENSE-2.0
11
+ #*
12
+ #* Unless required by applicable law or agreed to in writing, software
13
+ #* distributed under the License is distributed on an "AS IS" BASIS,
14
+ #* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ #* See the License for the specific language governing permissions and
16
+ #* limitations under the License.
17
+ #*
18
+ #* Created on:
19
+ #* Author:
20
+ #*
21
+ #****************************************************************************
22
+ import os
23
+ import yaml
24
+ from .package_def import PackageDef
25
+
26
+ def loadProjPkgDef(path):
27
+ """Locates the project's flow spec and returns the PackageDef"""
28
+
29
+ dir = path
30
+ ret = None
31
+ while dir != "/" and dir != "" and os.path.isdir(dir):
32
+ if os.path.exists(os.path.join(dir, "flow.dv")):
33
+ with open(os.path.join(dir, "flow.dv")) as f:
34
+ data = yaml.load(f, Loader=yaml.FullLoader)
35
+ if "package" in data.keys():
36
+ ret = PackageDef.load(os.path.join(dir, "flow.dv"))
37
+ break
38
+ dir = os.path.dirname(dir)
39
+ return ret
40
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: dv-flow-mgr
3
- Version: 0.0.1.12922457458a1
3
+ Version: 0.0.1.12932354274a1
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
@@ -18,12 +18,10 @@ docs/reference.rst
18
18
  src/dv_flow/mgr/__init__.py
19
19
  src/dv_flow/mgr/__main__.py
20
20
  src/dv_flow/mgr/fileset.py
21
- src/dv_flow/mgr/flow.py
22
21
  src/dv_flow/mgr/fragment_def.py
23
22
  src/dv_flow/mgr/package.py
24
23
  src/dv_flow/mgr/package_def.py
25
24
  src/dv_flow/mgr/package_import_spec.py
26
- src/dv_flow/mgr/parameters.py
27
25
  src/dv_flow/mgr/pkg_rgy.py
28
26
  src/dv_flow/mgr/task.py
29
27
  src/dv_flow/mgr/task_data.py
@@ -1,21 +0,0 @@
1
-
2
- import argparse
3
- from .cmds.cmd_run import CmdRun
4
-
5
- def get_parser():
6
- parser = argparse.ArgumentParser(description='dv_flow_mgr')
7
- subparsers = parser.add_subparsers(required=True)
8
-
9
- run_parser = subparsers.add_parser('run', help='run a flow')
10
- run_parser.add_argument("tasks", nargs='*', help="tasks to run")
11
- run_parser.set_defaults(func=CmdRun())
12
-
13
- return parser
14
-
15
- def main():
16
- parser = get_parser()
17
- args = parser.parse_args()
18
- args.func(args)
19
-
20
- if __name__ == "__main__":
21
- main()
@@ -1,59 +0,0 @@
1
- #****************************************************************************
2
- #* flow.py
3
- #*
4
- #* Copyright 2023 Matthew Ballance and Contributors
5
- #*
6
- #* Licensed under the Apache License, Version 2.0 (the "License"); you may
7
- #* not use this file except in compliance with the License.
8
- #* You may obtain a copy of the License at:
9
- #*
10
- #* http://www.apache.org/licenses/LICENSE-2.0
11
- #*
12
- #* Unless required by applicable law or agreed to in writing, software
13
- #* distributed under the License is distributed on an "AS IS" BASIS,
14
- #* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- #* See the License for the specific language governing permissions and
16
- #* limitations under the License.
17
- #*
18
- #* Created on:
19
- #* Author:
20
- #*
21
- #****************************************************************************
22
- from pydantic import BaseModel, Field
23
- from typing import ClassVar
24
- #from .task import Task
25
-
26
- class Flow(BaseModel):
27
- # - Parameters are user-facing
28
- # - Any implementation data must be stored elsewhere, such that it isn't
29
- # checked for equality...
30
- name : str
31
- description : str = Field(None)
32
-
33
-
34
- @classmethod
35
- def mk(cls, *args, **kwargs):
36
- pass
37
-
38
- async def my_method(self):
39
- return Task(a,b,c)(self, input)
40
-
41
- #@extend(target)
42
- #class FlowExt(object):
43
- # pass
44
-
45
-
46
- class Flow2(Flow):
47
- description : str = "abc"
48
-
49
- async def my_method(self):
50
- super().my_method()
51
-
52
- f = Flow2(name="foo")
53
-
54
- #for d in dir(f):
55
- # if not d.startswith("_"):
56
- # print("%s: %s" % (d, str(getattr(f, d))))
57
-
58
-
59
-
@@ -1,31 +0,0 @@
1
-
2
- import pydantic.dataclasses as dc
3
- import json
4
- from typing import Dict, Any
5
-
6
- @dc.dataclass
7
- class PackageSpec(object):
8
- name : str
9
- params : Dict[str,Any] = dc.Field(default_factory=dict)
10
- _fullname : str = None
11
-
12
- def get_fullname(self) -> str:
13
- if self._fullname is None:
14
- if len(self.params) != 0:
15
- self._fullname = "%s%s}" % (
16
- self.name,
17
- json.dumps(self.params, separators=(',', ':')))
18
- else:
19
- self._fullname = self.name
20
- return self._fullname
21
-
22
- def __hash__(self):
23
- return hash(self.get_fullname())
24
-
25
- def __eq__(self, value):
26
- return isinstance(value, PackageSpec) and value.get_fullname() == self.get_fullname()
27
-
28
- @dc.dataclass
29
- class PackageImportSpec(PackageSpec):
30
- path : str = dc.Field(default=None, alias="from")
31
- alias : str = dc.Field(default=None, alias="as")
@@ -1,19 +0,0 @@
1
- import os
2
- import yaml
3
- from .package_def import PackageDef
4
-
5
- def loadProjPkgDef(path):
6
- """Locates the project's flow spec and returns the PackageDef"""
7
-
8
- dir = path
9
- ret = None
10
- while dir != "/" and dir != "" and os.path.isdir(dir):
11
- if os.path.exists(os.path.join(dir, "flow.dv")):
12
- with open(os.path.join(dir, "flow.dv")) as f:
13
- data = yaml.load(f, Loader=yaml.FullLoader)
14
- if "package" in data.keys():
15
- ret = PackageDef.load(os.path.join(dir, "flow.dv"))
16
- break
17
- dir = os.path.dirname(dir)
18
- return ret
19
-