dv-flow-mgr 0.0.1.12919555073a1__tar.gz → 0.0.1.12922457458a1__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 (71) hide show
  1. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/PKG-INFO +1 -1
  2. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/pyproject.toml +1 -1
  3. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/src/dv_flow/mgr/package_def.py +1 -1
  4. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/src/dv_flow/mgr/task_graph_builder.py +7 -0
  5. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/src/dv_flow/mgr/task_graph_runner_local.py +58 -8
  6. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/src/dv_flow_mgr.egg-info/PKG-INFO +1 -1
  7. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/tests/unit/test_pyclass.py +49 -0
  8. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/.github/workflows/ci.yml +0 -0
  9. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/.gitignore +0 -0
  10. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/.vscode/settings.json +0 -0
  11. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/LICENSE +0 -0
  12. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/README.md +0 -0
  13. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/docs/Makefile +0 -0
  14. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/docs/Notes.md +0 -0
  15. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/docs/Roadmap.md +0 -0
  16. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/docs/Stages.md +0 -0
  17. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/docs/TypesAndDefs.md +0 -0
  18. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/docs/conf.py +0 -0
  19. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/docs/index.rst +0 -0
  20. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/docs/intro.rst +0 -0
  21. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/docs/quickstart.rst +0 -0
  22. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/docs/reference.rst +0 -0
  23. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/ivpm.yaml +0 -0
  24. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/setup.cfg +0 -0
  25. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/src/dv_flow/mgr/__init__.py +0 -0
  26. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/src/dv_flow/mgr/__main__.py +0 -0
  27. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/src/dv_flow/mgr/cmds/cmd_run.py +0 -0
  28. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/src/dv_flow/mgr/fileset.py +0 -0
  29. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/src/dv_flow/mgr/flow.py +0 -0
  30. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/src/dv_flow/mgr/fragment_def.py +0 -0
  31. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/src/dv_flow/mgr/package.py +0 -0
  32. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/src/dv_flow/mgr/package_import_spec.py +0 -0
  33. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/src/dv_flow/mgr/parameters.py +0 -0
  34. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/src/dv_flow/mgr/pkg_rgy.py +0 -0
  35. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/src/dv_flow/mgr/share/flow.json +0 -0
  36. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/src/dv_flow/mgr/std/fileset.py +0 -0
  37. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/src/dv_flow/mgr/std/flow.dv +0 -0
  38. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/src/dv_flow/mgr/std/message.py +0 -0
  39. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/src/dv_flow/mgr/std/task_fileset.py +0 -0
  40. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/src/dv_flow/mgr/std/task_null.py +0 -0
  41. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/src/dv_flow/mgr/task.py +0 -0
  42. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/src/dv_flow/mgr/task_data.py +0 -0
  43. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/src/dv_flow/mgr/task_def.py +0 -0
  44. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/src/dv_flow/mgr/task_graph_runner.py +0 -0
  45. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/src/dv_flow/mgr/task_memento.py +0 -0
  46. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/src/dv_flow/mgr/util.py +0 -0
  47. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/src/dv_flow_mgr.egg-info/SOURCES.txt +0 -0
  48. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/src/dv_flow_mgr.egg-info/dependency_links.txt +0 -0
  49. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/src/dv_flow_mgr.egg-info/entry_points.txt +0 -0
  50. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/src/dv_flow_mgr.egg-info/requires.txt +0 -0
  51. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/src/dv_flow_mgr.egg-info/top_level.txt +0 -0
  52. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/tests/examples/example1/example1.flow +0 -0
  53. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/tests/unit/__init__.py +0 -0
  54. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/tests/unit/data/fileset/test1/files1/file1_1.sv +0 -0
  55. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/tests/unit/data/fileset/test1/files1/file1_2.sv +0 -0
  56. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/tests/unit/data/fileset/test1/files2/file2_1.sv +0 -0
  57. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/tests/unit/data/fileset/test1/files2/file2_2.sv +0 -0
  58. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/tests/unit/data/fileset/test1/flow.dv +0 -0
  59. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/tests/unit/data/fileset/test1 copy/files1/file1_1.sv +0 -0
  60. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/tests/unit/data/fileset/test1 copy/files1/file1_2.sv +0 -0
  61. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/tests/unit/data/fileset/test1 copy/files2/file2_1.sv +0 -0
  62. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/tests/unit/data/fileset/test1 copy/files2/file2_2.sv +0 -0
  63. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/tests/unit/data/fileset/test1 copy/test1.dfs +0 -0
  64. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/tests/unit/data/proj1/proj1.dfs +0 -0
  65. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/tests/unit/data/proj2/proj2.dfs +0 -0
  66. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/tests/unit/data/proj3/proj3.dfs +0 -0
  67. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/tests/unit/test_data_merge.py +0 -0
  68. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/tests/unit/test_fileset.py +0 -0
  69. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/tests/unit/test_smoke copy.sav +0 -0
  70. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/tests/unit/test_smoke.py +0 -0
  71. {dv_flow_mgr-0.0.1.12919555073a1 → dv_flow_mgr-0.0.1.12922457458a1}/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.12919555073a1
3
+ Version: 0.0.1.12922457458a1
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.12919555073a1"
8
+ version = "0.0.1.12922457458a1"
9
9
  dependencies = [
10
10
  'pydantic',
11
11
  'pyyaml',
@@ -215,7 +215,7 @@ class PackageDef(BaseModel):
215
215
  if len(task.params) > 0:
216
216
  ctor_t.params = task.params
217
217
  if len(task.depends) > 0:
218
- ctor_t.depends.extends(task.depends)
218
+ ctor_t.depends.extend(task.depends)
219
219
 
220
220
  return ctor_t
221
221
 
@@ -70,6 +70,13 @@ class TaskGraphBuilder(object):
70
70
 
71
71
  depends = []
72
72
 
73
+ for dep in ctor_t.depends:
74
+ if not dep in self._task_m.keys():
75
+ task = self._mkTaskGraph(dep, rundir)
76
+ self._task_m[dep] = task
77
+ pass
78
+ depends.append(self._task_m[dep])
79
+
73
80
  # The returned task should have all param references resolved
74
81
  print("task_ctor=%s" % str(ctor_t.task_ctor), flush=True)
75
82
  task = ctor_t.task_ctor(
@@ -23,7 +23,8 @@ import asyncio
23
23
  import os
24
24
  import yaml
25
25
  import dataclasses as dc
26
- from typing import Any, Callable, ClassVar, Dict, List, Union
26
+ from toposort import toposort
27
+ from typing import Any, Callable, ClassVar, Coroutine, Dict, List, Tuple, Union
27
28
  from .fragment_def import FragmentDef
28
29
  from .package import Package
29
30
  from .pkg_rgy import PkgRgy
@@ -37,7 +38,8 @@ class TaskGraphRunnerLocal(TaskGraphRunner):
37
38
  """Session manages execution of a task graph"""
38
39
 
39
40
  rundir : str
40
- nproc : int = -1
41
+ nproc : int = 4
42
+ done_task_m : Dict = dc.field(default_factory=dict)
41
43
  _workers : List = dc.field(default_factory=list)
42
44
 
43
45
  _inst : ClassVar['TaskGraphRunner'] = None
@@ -62,15 +64,62 @@ class TaskGraphRunnerLocal(TaskGraphRunner):
62
64
  task = [task]
63
65
  else:
64
66
  unwrap = False
65
-
66
- run_o = list(t.do_run() for t in task)
67
67
 
68
- ret = await asyncio.gather(*run_o)
68
+ dep_m = {}
69
+ task_m = {}
70
+
71
+ for t in task:
72
+ self._mkDeps(dep_m, task_m, t)
73
+
74
+ print("dep_m: %s" % str(dep_m))
75
+
76
+ order = list(toposort(dep_m))
77
+
78
+ active_task_l : List[Tuple[Task,Coroutine]]= []
79
+ # Now, iterate over the concurrent sets
80
+ for active_s in order:
81
+
82
+ # Check to see if all tasks are complete
83
+ done = True
84
+ for t in active_s:
85
+ while len(active_task_l) >= self.nproc and t not in self.done_task_m.keys():
86
+ # Wait for at least one job to complete
87
+ done, pending = await asyncio.wait(at[1] for at in active_task_l)
88
+ for d in done:
89
+ for i in range(len(active_task_l)):
90
+ if active_task_l[i][1] == d:
91
+ tt = active_task_l[i][0]
92
+ self.done_task_m[tt.name] = tt
93
+ active_task_l.pop(i)
94
+ break
95
+ if t not in self.done_task_m.keys():
96
+ task = task_m[t]
97
+ coro = asyncio.Task(task.do_run())
98
+ active_task_l.append((task, coro))
99
+
100
+ # Now, wait for tasks to complete
101
+ if len(active_task_l):
102
+ coros = list(at[1] for at in active_task_l)
103
+ res = await asyncio.gather(*coros)
104
+
105
+ # print("order: %s" % str(order))
106
+ #
107
+ # run_o = list(t.do_run() for t in task)
108
+
109
+ # ret = await asyncio.gather(*run_o)
110
+ ret = None
69
111
 
70
112
  if unwrap:
71
- return ret[0]
113
+ return task.output
72
114
  else:
73
- return ret
115
+ return list(t.output for t in task)
116
+
117
+ def _mkDeps(self, dep_m, task_m, task):
118
+ if task.name not in dep_m.keys():
119
+ task_m[task.name] = task
120
+ dep_m[task.name] = set(t.name for t in task.depends)
121
+ for d in task.depends:
122
+ self._mkDeps(dep_m, task_m, d)
74
123
 
75
124
  async def runTask(self, task : Task) -> 'TaskData':
76
125
  return await task.do_run()
@@ -82,6 +131,7 @@ class TaskGraphRunnerLocal(TaskGraphRunner):
82
131
  @dc.dataclass
83
132
  class LocalRunnerWorker(object):
84
133
  runner : TaskGraphRunnerLocal
85
- pass
134
+ task_s : List = dc.field(default_factory=list)
135
+
86
136
 
87
137
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: dv-flow-mgr
3
- Version: 0.0.1.12919555073a1
3
+ Version: 0.0.1.12922457458a1
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
@@ -193,3 +193,52 @@ class foo(Task):
193
193
 
194
194
  task = builder.mkTaskGraph("pkg1.foo2")
195
195
  output = asyncio.run(runner.run(task))
196
+
197
+ def test_broad_parallel(tmpdir):
198
+ # Test that we can
199
+ flow = """
200
+ package:
201
+ name: pkg1
202
+ tasks:
203
+ - name: foo
204
+ pyclass: my_module.foo
205
+ with:
206
+ param1:
207
+ type: str
208
+ value: "1"
209
+ """
210
+
211
+ count = 1000
212
+
213
+ for t in range(count):
214
+ flow += " - name: foo_%02d\n" % t
215
+ flow += " uses: foo\n"
216
+ flow += " with:\n"
217
+ flow += " param1: \"%d\"\n" % t
218
+ flow += " - name: final\n"
219
+ flow += " needs: [" + ",".join("foo_%02d" % t for t in range(count)) + "]\n"
220
+
221
+ module = """
222
+ from dv_flow.mgr import Task, TaskData
223
+
224
+ class foo(Task):
225
+ async def run(self, input : TaskData) -> TaskData:
226
+ print("foo::run", flush=True)
227
+ print("params: %s" % str(self.params), flush=True)
228
+ return input
229
+ """
230
+
231
+ with open(os.path.join(tmpdir, "my_module.py"), "w") as f:
232
+ f.write(module)
233
+ with open(os.path.join(tmpdir, "flow.dv"), "w") as f:
234
+ f.write(flow)
235
+
236
+ pkg_def = PackageDef.load(os.path.join(tmpdir, "flow.dv"))
237
+ builder = TaskGraphBuilder(
238
+ root_pkg=pkg_def,
239
+ rundir=os.path.join(tmpdir, "rundir"))
240
+ runner = TaskGraphRunnerLocal(rundir=os.path.join(tmpdir, "rundir"))
241
+
242
+ task = builder.mkTaskGraph("pkg1.final")
243
+ output = asyncio.run(runner.run(task))
244
+