dv-flow-mgr 0.0.1.12919555073a1__py3-none-any.whl → 0.0.1.12931082290a1__py3-none-any.whl

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.
@@ -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
 
dv_flow/mgr/task.py CHANGED
@@ -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,16 @@ 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
113
  # Merge filesets. A fileset with the same
114
114
  print("deps_o: %s" % str(deps_o))
115
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
116
  input = TaskData.merge(deps_o)
128
117
  input.src = self.name
129
118
  input.deps[self.name] = list(inp.name for inp in self.depends)
@@ -137,29 +126,17 @@ class Task(object):
137
126
 
138
127
  self.init_rundir()
139
128
 
140
- result = await self.run(input)
141
-
142
- if not self.output_set:
143
- if result is None:
144
- result = TaskData()
129
+ self.output = await self.run(input)
145
130
 
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()
131
+ if self.output is None:
132
+ raise Exception("No output produced by %s" % self.name)
133
+ result = TaskData()
155
134
 
156
135
  # Write-back the memento, if specified
157
136
  self.save_memento()
158
137
 
159
- self.running = False
160
-
161
138
  # Combine data from the deps to produce a result
162
- return result
139
+ return self.output
163
140
 
164
141
  async def run(self, input : TaskData) -> TaskData:
165
142
  raise NotImplementedError("TaskImpl.run() not implemented")
@@ -173,24 +150,6 @@ class Task(object):
173
150
  with open(os.path.join(self.rundir, "memento.json"), "w") as fp:
174
151
  fp.write(self.memento.model_dump_json(indent=2))
175
152
 
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
153
  def getOutput(self) -> TaskData:
195
154
  return self.output
196
155
 
@@ -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(
@@ -80,13 +87,6 @@ class TaskGraphBuilder(object):
80
87
  rundir=rundir,
81
88
  srcdir=ctor_t.srcdir)
82
89
 
83
- for i,d in enumerate(task.depend_refs):
84
- if d in self._task_m.keys():
85
- task.depends.append(self._task_m[d])
86
- else:
87
- print("mkTaskGraph: %s" % d)
88
- task.depends.append(self._mkTaskGraph(d, parent_rundir))
89
-
90
90
  self._task_m[task.name] = task
91
91
 
92
92
  self._pkg_s.pop()
@@ -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.12931082290a1
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
@@ -4,16 +4,16 @@ dv_flow/mgr/fileset.py,sha256=FNvC5sU2ArxJ0OO3v8dXTv8zX-bZ5t0a0ljne0fQQ1o,1150
4
4
  dv_flow/mgr/flow.py,sha256=UdgJOIqBS2wTRpO-sNWCCqO9oQFxDfGPGVD0r42aTrA,1562
5
5
  dv_flow/mgr/fragment_def.py,sha256=p5i6ONtBWlDHTBFsduu3Z36_76Bn8PCIylp_xoZ7jfQ,1552
6
6
  dv_flow/mgr/package.py,sha256=k6gaDun9mJeGwGsFP5YOYOaFLmKb3KyPZy5wGRgJd_E,1965
7
- dv_flow/mgr/package_def.py,sha256=hT8wr4ghH61rjK6VEovqTKVUuO_EwrCB5JQuFR-whiU,11455
7
+ dv_flow/mgr/package_def.py,sha256=fdPzhoCqZ-w336ktDVWZ1HKKFk9Zi6iehCcS-iW_EvU,11454
8
8
  dv_flow/mgr/package_import_spec.py,sha256=bStPa727wAKMcixydVY1Ht6ylzXsSMy2K31HWPXhc9k,921
9
9
  dv_flow/mgr/parameters.py,sha256=kUjRss5VtMMz5eL3-Z_M6BS-wFs7MhQu3ANXO54UPo0,896
10
10
  dv_flow/mgr/pkg_rgy.py,sha256=y7HOBZAgKHL4ItnFvjT0lWC_ne81qJi4lJGNLt69au0,2581
11
- dv_flow/mgr/task.py,sha256=gaMlOiV4pKmEBzewTkVle3RN2zfKPkSdYW3oJX0j_Jg,6421
11
+ dv_flow/mgr/task.py,sha256=4ktSrDJOR7N477u8HWOBfeer1Wwc4mwqMYode1vkApY,5144
12
12
  dv_flow/mgr/task_data.py,sha256=-6Dqa3oUI7RJc1Js2SRSnhxNTcASkamXFYMN6UiknZQ,10376
13
13
  dv_flow/mgr/task_def.py,sha256=96hSwqJo0MazJ1VcLhovYRmNCplsNLt47AumtyjSddU,1690
14
- dv_flow/mgr/task_graph_builder.py,sha256=wDBRf6g0ILN1lBYgHI4nOGFqSObUQBsJHRR9HX983-g,7131
14
+ dv_flow/mgr/task_graph_builder.py,sha256=1b636njhFJ7gu-re2zBzb1g4GMKQkQmmCqk51niYnU0,7097
15
15
  dv_flow/mgr/task_graph_runner.py,sha256=x2e-wpJFhZ4Zkov30PtC8CuKyOK6htA1SKzmrcVBI9M,2154
16
- dv_flow/mgr/task_graph_runner_local.py,sha256=PeVtJDUgOcolWhB0dir1Twco8Nx3s8WzbsZpgQbgNq0,2585
16
+ dv_flow/mgr/task_graph_runner_local.py,sha256=QDCUyFj_m4hJTUsZD5nCUCnPu3hysdk65-gVA8eJ894,4546
17
17
  dv_flow/mgr/task_memento.py,sha256=C7VTQpBhDEoYuDmE6YTM-6TLMLnqHp6Y0Vat1aTgtCs,1096
18
18
  dv_flow/mgr/util.py,sha256=WKwMF4vwYdte5wzieSTDpZTmZU0sjQro3Ofi9moCayE,613
19
19
  dv_flow/mgr/cmds/cmd_run.py,sha256=PqAbPMwqovaaq14tnNrCvP7-De8lMI09X0R7d6RIbwY,2691
@@ -23,9 +23,9 @@ dv_flow/mgr/std/flow.dv,sha256=pSpzrPPEu_L8DHccGfArxsKYgUfyQidShZc0ShgGtsY,500
23
23
  dv_flow/mgr/std/message.py,sha256=BPTHnEMD4tBufQ9LvsS9Sa_0xjaJATbBpwqosWslvVA,193
24
24
  dv_flow/mgr/std/task_fileset.py,sha256=UzTYONvK0X9rgy3rP9LiX4giBU8SyCCJav0LSNUJ1Qg,3140
25
25
  dv_flow/mgr/std/task_null.py,sha256=UEJ3fIoIMYWVsagiQC7GHD23UES7WoH4wtq94b4tcs4,265
26
- dv_flow_mgr-0.0.1.12919555073a1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
27
- dv_flow_mgr-0.0.1.12919555073a1.dist-info/METADATA,sha256=8UjxIrdl3PJYhr7p9u-WRmRpOkg0IAYf7I_SGMI0ESc,13276
28
- dv_flow_mgr-0.0.1.12919555073a1.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
29
- dv_flow_mgr-0.0.1.12919555073a1.dist-info/entry_points.txt,sha256=1roy8wAFM48LabOvr6jiOw0MUs-qE8X3Vf8YykPazxk,50
30
- dv_flow_mgr-0.0.1.12919555073a1.dist-info/top_level.txt,sha256=amfVTkggzYPtWwLqNmRukfz1Buu0pGS2SrYBBLhXm04,8
31
- dv_flow_mgr-0.0.1.12919555073a1.dist-info/RECORD,,
26
+ dv_flow_mgr-0.0.1.12931082290a1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
27
+ dv_flow_mgr-0.0.1.12931082290a1.dist-info/METADATA,sha256=_K8BKKre8AzPLV2GnOy2xkn21sti9eA-liuG63-qP6E,13276
28
+ dv_flow_mgr-0.0.1.12931082290a1.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
29
+ dv_flow_mgr-0.0.1.12931082290a1.dist-info/entry_points.txt,sha256=1roy8wAFM48LabOvr6jiOw0MUs-qE8X3Vf8YykPazxk,50
30
+ dv_flow_mgr-0.0.1.12931082290a1.dist-info/top_level.txt,sha256=amfVTkggzYPtWwLqNmRukfz1Buu0pGS2SrYBBLhXm04,8
31
+ dv_flow_mgr-0.0.1.12931082290a1.dist-info/RECORD,,