dv-flow-mgr 0.0.1.13667970156a1__py3-none-any.whl → 0.0.1.13689116055a1__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.
dv_flow/mgr/__main__.py CHANGED
@@ -25,12 +25,15 @@ from .cmds.cmd_run import CmdRun
25
25
 
26
26
  def get_parser():
27
27
  parser = argparse.ArgumentParser(description='dv_flow_mgr')
28
- parser.add_argument("-d", "--debug",
29
- help="Enable debug",
30
- action="store_true")
31
- parser.add_argument("-v", "--verbose",
32
- help="Enable verbose output",
33
- action="store_true")
28
+ # parser.add_argument("-d", "--debug",
29
+ # help="Enable debug",
30
+ # action="store_true")
31
+ parser.add_argument("--log-level",
32
+ help="Configures debug level [INFO, DEBUG]",
33
+ choices=("NONE", "INFO", "DEBUG"))
34
+ # parser.add_argument("-v", "--verbose",
35
+ # help="Enable verbose output",
36
+ # action="store_true")
34
37
  subparsers = parser.add_subparsers(required=True)
35
38
 
36
39
  run_parser = subparsers.add_parser('run', help='run a flow')
@@ -43,10 +46,12 @@ def main():
43
46
  parser = get_parser()
44
47
  args = parser.parse_args()
45
48
 
46
- if args.debug:
47
- logging.basicConfig(level=logging.DEBUG)
48
- elif args.verbose:
49
- logging.basicConfig(level=logging.INFO)
49
+ if args.log_level is not None and args.log_level != "NONE":
50
+ opt_m = {
51
+ "INFO": logging.INFO,
52
+ "DEBUG": logging.DEBUG
53
+ }
54
+ logging.basicConfig(level=opt_m[args.log_level])
50
55
 
51
56
  args.func(args)
52
57
 
@@ -6,6 +6,8 @@ from ..task_graph_runner import TaskGraphRunner
6
6
  from ..util import loadProjPkgDef
7
7
  from ..task_graph_builder import TaskGraphBuilder
8
8
  from ..task_graph_runner_local import TaskGraphRunnerLocal
9
+ from ..task_runner import TaskSetRunner
10
+ from ..task_listener_log import TaskListenerLog
9
11
  from ..pkg_rgy import PkgRgy
10
12
 
11
13
 
@@ -57,7 +59,9 @@ class CmdRun(object):
57
59
  rundir = os.path.join(pkg.basedir, "rundir")
58
60
 
59
61
  builder = TaskGraphBuilder(root_pkg=pkg, rundir=rundir)
60
- runner = TaskGraphRunnerLocal(rundir)
62
+ runner = TaskSetRunner(rundir)
63
+
64
+ runner.add_listener(TaskListenerLog().event)
61
65
 
62
66
  tasks = []
63
67
 
@@ -69,27 +73,4 @@ class CmdRun(object):
69
73
 
70
74
  asyncio.run(runner.run(tasks))
71
75
 
72
- # rgy = PkgRgy.inst()
73
- # rgy.registerPackage(pkg)
74
-
75
-
76
- # srcdir = os.getcwd()
77
-
78
- # session = Session(srcdir, rundir)
79
-
80
- # package = session.load(srcdir)
81
-
82
- # graphs = []
83
- # for task in args.tasks:
84
- # if task.find(".") == -1:
85
- # task = package.name + "." + task
86
- # subgraph = session.mkTaskGraph(task)
87
- # graphs.append(subgraph)
88
-
89
- # awaitables = [subgraph.do_run() for subgraph in graphs]
90
- # print("%d awaitables" % len(awaitables))
91
-
92
- # out = asyncio.get_event_loop().run_until_complete(asyncio.gather(*awaitables))
93
-
94
- # print("out: %s" % str(out))
95
76
 
@@ -134,7 +134,7 @@ class PackageDef(BaseModel):
134
134
  ctor_t : TaskCtor = None
135
135
  base_params : BaseModel = None
136
136
  callable = None
137
- passthrough = False
137
+ passthrough = task.passthrough
138
138
  needs = [] if task.needs is None else task.needs.copy()
139
139
 
140
140
  if task.uses is not None:
@@ -142,6 +142,11 @@ class PackageDef(BaseModel):
142
142
  base_ctor_t = self.getTaskCtor(session, task.uses, tasks_m)
143
143
  base_params = base_ctor_t.mkTaskParams()
144
144
 
145
+ if base_ctor_t is None:
146
+ self._log.error("Failed to load task ctor %s" % task.uses)
147
+ else:
148
+ self._log.debug("No 'uses' specified")
149
+
145
150
  # Determine the implementation constructor first
146
151
  if task.pytask is not None:
147
152
  # Built-in impl
@@ -376,7 +381,7 @@ class PackageDef(BaseModel):
376
381
 
377
382
  with open(file, "r") as fp:
378
383
  doc = yaml.load(fp, Loader=yaml.FullLoader)
379
- PackageDef._log.debug("doc: %s" % str(doc), flush=True)
384
+ PackageDef._log.debug("doc: %s" % str(doc))
380
385
  if "fragment" in doc.keys():
381
386
  # Merge the package definition
382
387
  frag = FragmentDef(**(doc["fragment"]))
@@ -2,5 +2,5 @@
2
2
  from dv_flow.mgr import Task, TaskDataResult
3
3
 
4
4
  async def Message(runner, input) -> TaskDataResult:
5
- print("%s: %s" % (input.name, input.params.msg))
5
+ print("%s: %s" % (input.name, input.params.msg), flush=True)
6
6
  return TaskDataResult()
@@ -179,14 +179,18 @@ class TaskGraphBuilder(object):
179
179
 
180
180
  return pkg
181
181
 
182
- def mkTaskNode(self, typename, name=None, srcdir=None, needs=None, **kwargs):
183
- ctor = self.getTaskCtor(typename)
184
- params = ctor.mkTaskParams(**kwargs)
185
- return ctor.mkTaskNode(
182
+ def mkTaskNode(self, task_t, name=None, srcdir=None, needs=None, **kwargs):
183
+ self._logger.debug("--> mkTaskNode: %s" % task_t)
184
+ ctor = self.getTaskCtor(task_t)
185
+ self._logger.debug("ctor: %s" % ctor.name)
186
+ params = ctor.mkTaskParams(kwargs)
187
+ ret = ctor.mkTaskNode(
186
188
  params=params,
187
189
  name=name,
188
190
  srcdir=srcdir,
189
191
  needs=needs)
192
+ self._logger.debug("<-- mkTaskNode: %s" % task_t)
193
+ return ret
190
194
 
191
195
  def getTaskCtor(self, spec : Union[str,'TaskSpec'], pkg : PackageDef = None) -> 'TaskCtor':
192
196
  from .task_def import TaskSpec
@@ -5,15 +5,21 @@ from rich.console import Console
5
5
  class TaskListenerLog(object):
6
6
  console : Console = dc.field(default_factory=Console)
7
7
  level : int = 0
8
+ quiet : bool = True
8
9
 
9
10
  def event(self, task : 'Task', reason : 'Reason'):
10
11
  if reason == 'enter':
11
12
  self.level += 1
12
- self.console.print("[green]>[%d][/green] Task %s" % (self.level, task.name))
13
+ if not self.quiet:
14
+ self.console.print("[green]>[%d][/green] Task %s" % (self.level, task.name))
13
15
  elif reason == 'leave':
14
16
  for m in task.result.markers:
15
17
  print(" %s" % m)
16
- self.console.print("[green]<[%d][/green] Task %s" % (self.level, task.name))
18
+ if self.quiet:
19
+ if task.result.changed:
20
+ self.console.print("[green]Done:[/green] %s" % (task.name,))
21
+ else:
22
+ self.console.print("[green]<[%d][/green] Task %s" % (self.level, task.name))
17
23
  self.level -= 1
18
24
  else:
19
25
  self.console.print("[red]-[/red] Task %s" % task.name)
dv_flow/mgr/task_node.py CHANGED
@@ -3,6 +3,7 @@ import sys
3
3
  import dataclasses as dc
4
4
  import pydantic.dataclasses as pdc
5
5
  import logging
6
+ import toposort
6
7
  from typing import Any, Callable, ClassVar, Dict, List
7
8
  from .task_data import TaskDataInput, TaskDataOutput, TaskDataResult
8
9
  from .task_params_ctor import TaskParamsCtor
@@ -38,19 +39,46 @@ class TaskNode(object):
38
39
  runner,
39
40
  rundir,
40
41
  memento : Any = None) -> 'TaskDataResult':
42
+ self._log.debug("--> do_run: %s" % self.name)
41
43
  changed = False
42
44
  for dep in self.needs:
43
45
  changed |= dep.changed
44
46
 
45
47
  # TODO: Form dep-map from inputs
46
- # TODO: Order param sets according to dep-map
47
- in_params = []
48
+
49
+ dep_m = {}
50
+ for need in self.needs:
51
+ self._log.debug("dep %s dep_m: %s" % (need.name, str(dep_m)))
52
+ for subdep in need.output.dep_m.keys():
53
+ if subdep not in dep_m.keys():
54
+ dep_m[subdep] = []
55
+ dep_m[subdep].extend(need.output.dep_m[subdep])
56
+
57
+ self._log.debug("input dep_m: %s" % str(dep_m))
58
+ sorted = toposort.toposort(dep_m)
59
+
60
+ in_params_m = {}
48
61
  for need in self.needs:
49
- in_params.extend(need.output.output)
62
+ for p in need.output.output:
63
+ if p.src not in in_params_m.keys():
64
+ in_params_m[p.src] = []
65
+ in_params_m[p.src].append(p)
66
+
67
+ # in_params holds parameter sets ordered by dependency
68
+ in_params = []
69
+ for sorted_s in sorted:
70
+ self._log.debug("sorted_s: %s" % str(sorted_s))
71
+ for dep in sorted_s:
72
+ if dep in in_params_m.keys():
73
+ self._log.debug("(%s) Extend with: %s" % (dep, str(in_params_m[dep])))
74
+ in_params.extend(in_params_m[dep])
75
+
76
+ self._log.debug("in_params[1]: %s" % ",".join(p.src for p in in_params))
50
77
 
51
78
  # Create an evaluator for substituting param values
52
79
  eval = ParamRefEval()
53
80
 
81
+ self._log.debug("in_params[2]: %s" % ",".join(p.src for p in in_params))
54
82
  eval.setVar("in", in_params)
55
83
 
56
84
  for name,field in self.params.model_fields.items():
@@ -58,6 +86,7 @@ class TaskNode(object):
58
86
  if type(value) == str:
59
87
  if value.find("${{") != -1:
60
88
  new_val = eval.eval(value)
89
+ self._log.debug("Param %s: Evaluate expression \"%s\" => \"%s\"" % (name, value, new_val))
61
90
  setattr(self.params, name, new_val)
62
91
  elif isinstance(value, list):
63
92
  for i,elem in enumerate(value):
@@ -75,20 +104,40 @@ class TaskNode(object):
75
104
  params=self.params,
76
105
  memento=memento)
77
106
 
78
- # TODO: notify of task start
107
+ self._log.debug("--> Call task method %s" % str(self.task))
79
108
  self.result : TaskDataResult = await self.task(self, input)
80
- # TODO: notify of task complete
109
+ self._log.debug("<-- Call task method %s" % str(self.task))
81
110
 
82
- # TODO: form a dep map from the outgoing param sets
83
- dep_m = {}
111
+ output=self.result.output.copy()
112
+ for out in output:
113
+ out.src = self.name
114
+
115
+ self._log.debug("output[1]: %s" % str(output))
116
+
117
+ if self.passthrough:
118
+ self._log.debug("passthrough: %s" % self.name)
119
+ # Add an entry for ourselves
120
+ dep_m[self.name] = list(need.name for need in self.needs)
121
+
122
+ for need in self.needs:
123
+ output.extend(need.output.output)
124
+ else:
125
+ # empty dependency map
126
+ dep_m = {
127
+ self.name : []
128
+ }
129
+
130
+ self._log.debug("output dep_m: %s" % str(dep_m))
131
+ self._log.debug("output[2]: %s" % str(output))
84
132
 
85
133
  # Store the result
86
134
  self.output = TaskDataOutput(
87
135
  changed=self.result.changed,
88
136
  dep_m=dep_m,
89
- output=self.result.output.copy())
137
+ output=output)
90
138
 
91
139
  # TODO:
140
+ self._log.debug("<-- do_run: %s" % self.name)
92
141
 
93
142
  return self.result
94
143
 
@@ -1,6 +1,7 @@
1
1
  from pydantic import BaseModel, Field
2
- from typing import Any, List
2
+ from typing import Any, Dict, List
3
3
 
4
4
  class TaskOutput(BaseModel):
5
5
  type : str
6
- params : List[Any] = Field(default_factory=list, alias="with")
6
+ params : List[Any] = Field(default_factory=list, alias="with")
7
+ deps : Dict[str,List[str]] = Field(default_factory=dict)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: dv-flow-mgr
3
- Version: 0.0.1.13667970156a1
3
+ Version: 0.0.1.13689116055a1
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
@@ -1,5 +1,5 @@
1
1
  dv_flow/mgr/__init__.py,sha256=2iTpSe1M8g_u2UlAQFa3XFfqcw8gBOWdBvrstce1c5E,403
2
- dv_flow/mgr/__main__.py,sha256=uik6gDAvtZNG0yyDKYc4FTl6R1QHAR543jNG2lCAa6E,1771
2
+ dv_flow/mgr/__main__.py,sha256=_qiAyACu_Ugo64EIQDWmC0v92nHeaZCxequXTKoCRyo,2030
3
3
  dv_flow/mgr/eval_jq.py,sha256=Ue-qkyNW6uOu2Wy8u6nrTbPPY7ujaHd0-4iki0eV3Ec,294
4
4
  dv_flow/mgr/expr_eval.py,sha256=Mp0TvrV6gZWcj1uYwLfPNI-ARwwdAfwntE5byLBfBuY,2276
5
5
  dv_flow/mgr/expr_parser.py,sha256=FhBTkKKkJXubGHUzmcMWubPfPklYLGzVz1jK4-dYb44,5702
@@ -7,7 +7,7 @@ dv_flow/mgr/fileset.py,sha256=ewyjKLzuOecZg0vtabN_UkbzNEnk1sXgrH8uDyeKB60,1184
7
7
  dv_flow/mgr/fragment_def.py,sha256=cyzp1XeWtNOaagScmeS-BPsoXj9j2LTBbKq5ZUioz8I,1641
8
8
  dv_flow/mgr/out,sha256=d8GGBi3J43fhdLBlnsUbzBfRe0TD0QTP3nOTz54l2bI,200
9
9
  dv_flow/mgr/package.py,sha256=878twhPD-E1pFlDNUtuyeFEgJ_Y89b560og4St-Iwrs,1679
10
- dv_flow/mgr/package_def.py,sha256=ek60ERvWFOVlL71_Fgk1-RWQMrkxNt4USrfZXwLS2d0,14603
10
+ dv_flow/mgr/package_def.py,sha256=EaDPLljg6iewOuZwUgAF4lTkLH9fYAgigD2klXaKBRE,14779
11
11
  dv_flow/mgr/package_import_spec.py,sha256=ah3r15v5Jdub2poc3sgi6Uar1L3oGoYsCPPNiOHV-a4,1760
12
12
  dv_flow/mgr/param.py,sha256=3BY-ucig6JRw73FhjyJQL-vpd57qhAzixgZ8I5FoUpw,553
13
13
  dv_flow/mgr/param_def.py,sha256=gLua-EQiY8V2CFX-2svLRIlrs8PEeGh4-EPtn4a2Mng,712
@@ -19,29 +19,29 @@ dv_flow/mgr/task_ctor.py,sha256=hlfl-UVvyjzLFN6D0Oel9eBs0xUQPqCX7gQ0uEHoL7o,1382
19
19
  dv_flow/mgr/task_data.py,sha256=F0X-e0IHTh06Z0F67TWIUPKuJYf6JPzZyMPrDzOJvK0,11409
20
20
  dv_flow/mgr/task_def.py,sha256=T06dvQegPJunH8ekuN5aPxIVcaUWiv5qkfqbZnCacLk,1923
21
21
  dv_flow/mgr/task_exec_data.py,sha256=aT__kmVmNxqnS_GbTRS1vrYgKiv8cH-HUSmRb6YYKsI,640
22
- dv_flow/mgr/task_graph_builder.py,sha256=okqJDDu6qyubXQoyI-r0jUTd53Tq7ISSYCymZh_Cppw,7708
22
+ dv_flow/mgr/task_graph_builder.py,sha256=fEqJalmDDDzayJbuyDWAcmumDGK3XgnZmcScoBY8HGg,7887
23
23
  dv_flow/mgr/task_graph_runner.py,sha256=jUGI49QvxUCfQoKQDDk2psbeapIcCg72qNOW1JipHzM,2182
24
24
  dv_flow/mgr/task_graph_runner_local.py,sha256=OrydPwtQ8E7hYWvSXx0h7lI3nfUNFyklULhsyMwz9dA,4687
25
25
  dv_flow/mgr/task_impl_data.py,sha256=bFPijoKrh9x7fZN2DsvRJp0UHo-gGM0VjtDQISyfhFk,321
26
- dv_flow/mgr/task_listener_log.py,sha256=5N-WG6ii-R6XPbgPR6zcfKjABOoGYab6I_04Lfwux5Q,705
26
+ dv_flow/mgr/task_listener_log.py,sha256=u7hm8Q8ZVCIY25mNQEI3DIgSMJ_zJ5nbvqukGMXyido,934
27
27
  dv_flow/mgr/task_memento.py,sha256=C7VTQpBhDEoYuDmE6YTM-6TLMLnqHp6Y0Vat1aTgtCs,1096
28
- dv_flow/mgr/task_node.py,sha256=BxkjUJU7WdIhyBbP7FMBFY6EgHenhnnYGGdGW3Xukck,8450
29
- dv_flow/mgr/task_output.py,sha256=l-W-FvVo6YDah1RQS-I9N0KUtB3vp-kl7lxIdmNz0l4,178
28
+ dv_flow/mgr/task_node.py,sha256=5R51VLuHDFnY3c5E8kLccxFRoshJRB1bDKJXIJr9EKc,10394
29
+ dv_flow/mgr/task_output.py,sha256=dkJhhNRFGFQSkVsw_bGirK0_0ghTxBYq1LjRMZCVWnA,245
30
30
  dv_flow/mgr/task_params_ctor.py,sha256=aXgB8o9xFPjaEjGW_xYkEC0N0apzGzGUPDj7g2ZLvus,1112
31
31
  dv_flow/mgr/task_runner.py,sha256=Ky10BWKy_NhvJp2nsbB0pyS8n1K0pKatBEmTdD1ZKOc,7071
32
32
  dv_flow/mgr/type.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
33
  dv_flow/mgr/type_def.py,sha256=KdhuNlfw-NKU-4VZFCnMPyj775yEB7cpr5tz73a9yuQ,259
34
34
  dv_flow/mgr/util.py,sha256=06eVyURF4ga-s8C9Sd3ZSDebwO4QS0XXaB8xADVbWRc,1437
35
- dv_flow/mgr/cmds/cmd_run.py,sha256=eths8kT7mBmpZqwOuMtpKAaux4rg-f7hPBxxTHbpKT4,2903
35
+ dv_flow/mgr/cmds/cmd_run.py,sha256=r5j-T121oXYDyOYfrCZSjzeblp1awiAn17HkPtLaGg4,2372
36
36
  dv_flow/mgr/share/flow.json,sha256=lNmZex9NXkYbyb2aZseQfUOkV9CMyfH0iLODEI7EPBw,5096
37
37
  dv_flow/mgr/std/exec.py,sha256=ETx9xSxhdCD_iw6pcmhrafDCJ-41AneyEAPwQf3q-3w,452
38
38
  dv_flow/mgr/std/fileset.py,sha256=abHgTxz25FD1ep5QXlCZKt4gCyfplJsjx6LyfQ11f_Q,2683
39
39
  dv_flow/mgr/std/flow.dv,sha256=jlFOh3xVECOzHws7x6YvJ9eCIGHM5gsPeEnheiGOukY,1553
40
- dv_flow/mgr/std/message.py,sha256=CWrBKImbXKe2d7hJ223U3Ifuxo54zLpFPJviE8BUJvk,188
40
+ dv_flow/mgr/std/message.py,sha256=T8Ye44784rD6CT2qIAP5SD7sKPdAlGMFimc4IaPCxxE,200
41
41
  dv_flow/mgr/std/task_null.py,sha256=UKwUnqwFPBY8BO44ZAPcgehQB59kHZFa1qyZc1TwUqE,196
42
- dv_flow_mgr-0.0.1.13667970156a1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
43
- dv_flow_mgr-0.0.1.13667970156a1.dist-info/METADATA,sha256=KkpZBeRE5Av-3wHTQewdBoyjAtM3voZTDxeXsjrsjhs,13276
44
- dv_flow_mgr-0.0.1.13667970156a1.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
45
- dv_flow_mgr-0.0.1.13667970156a1.dist-info/entry_points.txt,sha256=1roy8wAFM48LabOvr6jiOw0MUs-qE8X3Vf8YykPazxk,50
46
- dv_flow_mgr-0.0.1.13667970156a1.dist-info/top_level.txt,sha256=amfVTkggzYPtWwLqNmRukfz1Buu0pGS2SrYBBLhXm04,8
47
- dv_flow_mgr-0.0.1.13667970156a1.dist-info/RECORD,,
42
+ dv_flow_mgr-0.0.1.13689116055a1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
43
+ dv_flow_mgr-0.0.1.13689116055a1.dist-info/METADATA,sha256=fuUi6tX_RwxMXl0XsApdKkyUlKyKOgYaouavIevi0w4,13276
44
+ dv_flow_mgr-0.0.1.13689116055a1.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
45
+ dv_flow_mgr-0.0.1.13689116055a1.dist-info/entry_points.txt,sha256=1roy8wAFM48LabOvr6jiOw0MUs-qE8X3Vf8YykPazxk,50
46
+ dv_flow_mgr-0.0.1.13689116055a1.dist-info/top_level.txt,sha256=amfVTkggzYPtWwLqNmRukfz1Buu0pGS2SrYBBLhXm04,8
47
+ dv_flow_mgr-0.0.1.13689116055a1.dist-info/RECORD,,