dv-flow-mgr 0.0.2.14148837747a1__py3-none-any.whl → 0.0.2.14149088756a1__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.
@@ -192,10 +192,6 @@ class TaskGraphBuilder(object):
192
192
  if task is None and name in self._task_m.keys():
193
193
  task = self._task_m[name]
194
194
 
195
- # if task is None:
196
- # # TODO: Look for a def that hasn't yet been constructed
197
- # task = self._mkTaskGraph(name, self.rundir)
198
-
199
195
  return task
200
196
 
201
197
  def leave_compound(self, task : TaskNode):
@@ -249,7 +245,11 @@ class TaskGraphBuilder(object):
249
245
  need_fullname = self._resolveNeedRef(need_def)
250
246
  self._logger.debug("Searching for qualifed-name task %s" % need_fullname)
251
247
  if not need_fullname in self._task_m.keys():
248
+ # Go back to the root from a rundir perspective
249
+ rundir_s = self._rundir_s
250
+ self._rundir_s = [need_fullname]
252
251
  need_t = self._mkTaskGraph(need_fullname)
252
+ self._rundir_s = rundir_s
253
253
  self._task_m[need_fullname] = need_t
254
254
  needs.append(self._task_m[need_fullname])
255
255
 
@@ -365,7 +365,10 @@ class TaskGraphBuilder(object):
365
365
  need_fullname = self._resolveNeedRef(need_def)
366
366
  self._logger.debug("Searching for qualifed-name task %s" % need_fullname)
367
367
  if not need_fullname in self._task_m.keys():
368
+ rundir_s = self._rundir_s
369
+ self._rundir_s = [need_fullname]
368
370
  need_t = self._mkTaskGraph(need_fullname)
371
+ self._rundir_s = rundir_s
369
372
  self._task_m[need_fullname] = need_t
370
373
  needs.append(self._task_m[need_fullname])
371
374
 
dv_flow/mgr/task_node.py CHANGED
@@ -29,6 +29,7 @@ import logging
29
29
  import toposort
30
30
  from typing import Any, Callable, ClassVar, Dict, List, Tuple
31
31
  from .task_data import TaskDataInput, TaskDataOutput, TaskDataResult
32
+ from .task_run_ctxt import TaskRunCtxt
32
33
  from .param import Param
33
34
 
34
35
  class RundirE(enum.Enum):
@@ -102,7 +103,7 @@ class TaskNode(object):
102
103
  self._log.debug("<-- _matches: %s %s" % (self.name, consumed))
103
104
  return consumed
104
105
 
105
- def _save_exec_data(self, rundir, input : TaskDataInput):
106
+ def _save_exec_data(self, rundir, ctxt : TaskRunCtxt, input : TaskDataInput):
106
107
  """Saves execution data to the rundir"""
107
108
  data = {
108
109
  "name": self.name,
@@ -110,6 +111,7 @@ class TaskNode(object):
110
111
  "rundir": rundir,
111
112
  "input": input.model_dump(warnings=False),
112
113
  "needs": [need[0].name for need in self.needs],
114
+ "commands": [cmd.dump_model() for cmd in ctxt._exec_info],
113
115
  "result": {
114
116
  "status": self.result.status,
115
117
  "changed": self.result.changed,
@@ -9,6 +9,7 @@ from typing import Any, Callable, ClassVar, Dict, List, Tuple
9
9
  from .task_data import TaskDataInput, TaskDataOutput, TaskDataResult
10
10
  from .task_def import ConsumesE, PassthroughE
11
11
  from .task_node import TaskNode
12
+ from .task_run_ctxt import TaskRunCtxt
12
13
  from .param_ref_eval import ParamRefEval
13
14
  from .param import Param
14
15
 
@@ -114,11 +115,15 @@ class TaskNodeLeaf(TaskNode):
114
115
  params=self.params,
115
116
  inputs=inputs,
116
117
  memento=memento)
118
+
119
+ ctxt = TaskRunCtxt(runner=self, rundir=input.rundir)
117
120
 
118
121
  self._log.debug("--> Call task method %s" % str(self.task))
119
122
  self.result : TaskDataResult = await self.task(self, input)
120
123
  self._log.debug("<-- Call task method %s" % str(self.task))
121
124
 
125
+ self.result.markers.extend(ctxt._markers)
126
+
122
127
  output=self.result.output.copy()
123
128
  for i,out in enumerate(output):
124
129
  out.src = self.name
@@ -174,7 +179,7 @@ class TaskNodeLeaf(TaskNode):
174
179
  output=output)
175
180
 
176
181
  if self.save_exec_data:
177
- self._save_exec_data(rundir, input)
182
+ self._save_exec_data(rundir, ctxt, input)
178
183
 
179
184
  # TODO:
180
185
  self._log.debug("<-- do_run: %s" % self.name)
@@ -0,0 +1,52 @@
1
+ import asyncio
2
+ import dataclasses as dc
3
+ from pydantic import BaseModel
4
+ import pydantic.dataclasses as pdc
5
+ import os
6
+ from typing import List
7
+ from .task_data import TaskMarker, SeverityE, TaskMarkerLoc
8
+
9
+ class ExecInfo(BaseModel):
10
+ cmd : List[str] = pdc.Field(default_factory=list)
11
+ status : int = pdc.Field(default=0)
12
+
13
+ @dc.dataclass
14
+ class TaskRunCtxt(object):
15
+ runner : 'TaskRunner'
16
+ rundir : str
17
+ _markers : List[TaskMarker] = dc.field(default_factory=list)
18
+ _exec_info : List[ExecInfo] = dc.field(default_factory=list)
19
+
20
+ async def exec(self,
21
+ cmd : List[str],
22
+ logfile=None,
23
+ logfilter=None,
24
+ cwd=None,
25
+ env=None):
26
+ if logfile is None:
27
+ logfile = "cmd_%d.log" % (self._exec_info.__len__() + 1)
28
+
29
+ fp = open(os.path.join(self.rundir, logfile), "w")
30
+ proc = await asyncio.create_subprocess_exec(
31
+ *cmd,
32
+ stdout=fp,
33
+ stderr=asyncio.subprocess.STDOUT,
34
+ cwd=(cwd if cwd is not None else self.rundir),
35
+ env=env)
36
+ fp.close()
37
+
38
+ status = await proc.wait()
39
+
40
+ self._exec_info.append(ExecInfo(cmd=cmd, status=status))
41
+
42
+ if status != 0:
43
+ self.error_marker("Command failed: %s" % " ".join(cmd))
44
+
45
+ def marker(self, msg : str, severity : SeverityE, loc : TaskMarkerLoc=None):
46
+ if loc is not None:
47
+ self._markers.append(TaskMarker(msg=msg, severity=severity, loc=loc))
48
+ else:
49
+ self._markers.append(TaskMarker(msg=msg, severity=severity))
50
+
51
+ def error(self, msg : str, loc : TaskMarkerLoc=None):
52
+ self.marker(msg=msg, severity=SeverityE.Error, loc=loc)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dv-flow-mgr
3
- Version: 0.0.2.14148837747a1
3
+ Version: 0.0.2.14149088756a1
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
@@ -16,10 +16,10 @@ dv_flow/mgr/parsetab.py,sha256=I-p3nC60t9jiNtPhKyl_sE92SiP96zJLnNdydcLy33g,3780
16
16
  dv_flow/mgr/pkg_rgy.py,sha256=d1nIjRm3ymMNJT-yiMDxCS6bFisTPvLMqh5VrfsHVKM,5404
17
17
  dv_flow/mgr/task_data.py,sha256=lN7Iq8YTitEMGG4rZqYQi6Ri2HuPgBQ5oGQbW-63T8c,12436
18
18
  dv_flow/mgr/task_def.py,sha256=Yf9bkWqSETeFUSbddbpvl2Cu3pyssvhdz0X2jxabniA,3751
19
- dv_flow/mgr/task_graph_builder.py,sha256=dZ4BBUfy158k8uHfzowpIpwf7lt-vleAmQWl66iu3As,15130
19
+ dv_flow/mgr/task_graph_builder.py,sha256=Z14ySv1SFanFovR8HePwKglyFSzc6JsS8Z4RLmggM6c,15316
20
20
  dv_flow/mgr/task_graph_dot_writer.py,sha256=GxqiYwQJbFgUQdnPCS9vpIYmYFbSXwnXCSbGmjbxC3M,2418
21
21
  dv_flow/mgr/task_listener_log.py,sha256=hrJEjSRXXoovDTcD1Cmhi3Spzw7uEJ-WP6tv6JUaa6s,4060
22
- dv_flow/mgr/task_node.py,sha256=7lZKsTbOS0Cuhe-TyPj9Gcuh1a4k3sliRXW81R4UGCg,4851
22
+ dv_flow/mgr/task_node.py,sha256=4LlMRQ30ZdIk-nZ0FCTfyrusrQWF9LQ1g3vhgMJXMcc,4981
23
23
  dv_flow/mgr/task_node_compound.py,sha256=mNu4nf9hVqu2698ue5fpE3FeAOkvJH0Ke2W9V0G3-As,2975
24
24
  dv_flow/mgr/task_node_ctor.py,sha256=COFGvm5PR2B92H3uW1yhDIUCmppo9U4IfOcv_Jrsreo,3952
25
25
  dv_flow/mgr/task_node_ctor_compound.py,sha256=n2Ad1jtX147cb99HTlLrx_21XUn109bJ18zDXr0pn2Q,4259
@@ -28,9 +28,10 @@ dv_flow/mgr/task_node_ctor_def_base.py,sha256=_8QQHKDkONio_ve0Z409yxC0AMO8ocNBPD
28
28
  dv_flow/mgr/task_node_ctor_proxy.py,sha256=ViOFJ64JM4-CGFZNl89BghFuKSQ66kZVqSj4v2PA6VA,1906
29
29
  dv_flow/mgr/task_node_ctor_task.py,sha256=d49g90TyPCMFR8BuWWqp4ym-MW5vGSdDR0V47Ru28JY,2232
30
30
  dv_flow/mgr/task_node_ctor_wrapper.py,sha256=Nb1CVcPHZofnb-iLWDHQWAxlTOdbRrnR9DdSxY8yOec,3626
31
- dv_flow/mgr/task_node_leaf.py,sha256=tI9m0GcaKsBccHmZCSTzc6vKyNgXezVB5vC28B75AFg,7416
31
+ dv_flow/mgr/task_node_leaf.py,sha256=f7LvifhUCRs94t_HpqJWyBygmjiN3KWgNjv-FaALj1s,7582
32
32
  dv_flow/mgr/task_output.py,sha256=ZwyvwnYj_gHOEFAEOH3m24Xfc4Cn77hb1j7LkX8_3C4,1086
33
33
  dv_flow/mgr/task_params_ctor.py,sha256=BPkbnoCtzhCxc1g8CJ6VimCcm5UAu92PXeDMhQ4lYsQ,1957
34
+ dv_flow/mgr/task_run_ctxt.py,sha256=ZyO0EzhWZ6uOAYhlByQQoYizyQWmJBSt8UhobTSb6n0,1728
34
35
  dv_flow/mgr/task_runner.py,sha256=-919VntXAe2XSuFW2dFpgvUre-NkILBnDBbAKBZYn5w,9594
35
36
  dv_flow/mgr/type.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
37
  dv_flow/mgr/type_def.py,sha256=NDeyplKrPnWwEv4yHkhXEMK9d9j39b5MOeLB-1Mchqo,1095
@@ -49,9 +50,9 @@ dv_flow/mgr/util/__main__.py,sha256=F0LXpCDpYTPalSo0dc1h_qZkip5v1AZYYh-vcYbh5s0,
49
50
  dv_flow/mgr/util/util.py,sha256=yg9oTPRiO87mkCSOQpOtlG9vyKPQzY3qp4OJkEMbWyY,1443
50
51
  dv_flow/mgr/util/cmds/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
52
  dv_flow/mgr/util/cmds/cmd_schema.py,sha256=lrEI-Jwb8j4I4yYOn9hq7_7NYbK8leVxLesrHyEWm-E,1879
52
- dv_flow_mgr-0.0.2.14148837747a1.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
53
- dv_flow_mgr-0.0.2.14148837747a1.dist-info/METADATA,sha256=LrYCwf6jPAr1wJkBercc0PQSJ3BUAL0B4SYETCUeWW8,13336
54
- dv_flow_mgr-0.0.2.14148837747a1.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
55
- dv_flow_mgr-0.0.2.14148837747a1.dist-info/entry_points.txt,sha256=1roy8wAFM48LabOvr6jiOw0MUs-qE8X3Vf8YykPazxk,50
56
- dv_flow_mgr-0.0.2.14148837747a1.dist-info/top_level.txt,sha256=amfVTkggzYPtWwLqNmRukfz1Buu0pGS2SrYBBLhXm04,8
57
- dv_flow_mgr-0.0.2.14148837747a1.dist-info/RECORD,,
53
+ dv_flow_mgr-0.0.2.14149088756a1.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
54
+ dv_flow_mgr-0.0.2.14149088756a1.dist-info/METADATA,sha256=nHqGvVQydbFlAzyHjJhoWc51_cqtJzbUbjkWFVerQus,13336
55
+ dv_flow_mgr-0.0.2.14149088756a1.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
56
+ dv_flow_mgr-0.0.2.14149088756a1.dist-info/entry_points.txt,sha256=1roy8wAFM48LabOvr6jiOw0MUs-qE8X3Vf8YykPazxk,50
57
+ dv_flow_mgr-0.0.2.14149088756a1.dist-info/top_level.txt,sha256=amfVTkggzYPtWwLqNmRukfz1Buu0pGS2SrYBBLhXm04,8
58
+ dv_flow_mgr-0.0.2.14149088756a1.dist-info/RECORD,,