dv-flow-mgr 0.0.1.13489806632a1__py3-none-any.whl → 0.0.1.13551739897a1__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/eval_jq.py ADDED
@@ -0,0 +1,15 @@
1
+
2
+ import jq
3
+
4
+ def eval_jq(input, args):
5
+ if len(args) != 1:
6
+ raise Exception("jq requires a single argument")
7
+
8
+ filt = jq.compile(args[0])
9
+
10
+ if type(input) == str:
11
+ ret = filt.input_text(input).all()
12
+ else:
13
+ ret = filt.input_value(input).all()
14
+
15
+ return ret
dv_flow/mgr/expr_eval.py CHANGED
@@ -1,5 +1,6 @@
1
1
 
2
2
  import dataclasses as dc
3
+ import json
3
4
  from typing import Any, Callable, Dict, List
4
5
  from .expr_parser import ExprVisitor, Expr, ExprBin, ExprBinOp, ExprCall, ExprId, ExprString, ExprInt
5
6
 
@@ -9,16 +10,38 @@ class ExprEval(ExprVisitor):
9
10
  variables : Dict[str, object] = dc.field(default_factory=dict)
10
11
  value : Any = None
11
12
 
12
- def eval(self, e : Expr):
13
+ def eval(self, e : Expr) -> str:
13
14
  self.value = None
14
15
  e.accept(self)
15
- return self.value
16
+
17
+ val = self._toString(self.value)
18
+
19
+ return val
20
+
21
+ def _toString(self, val):
22
+ obj = self._toObject(val)
23
+ return json.dumps(obj)
24
+ # if isinstance(val, list):
25
+ # val = '[' + ",".join(self._toString(v) for v in val) + ']'
26
+ # elif hasattr(val, "model_dump_json"):
27
+ # val = val.model_dump_json()
28
+ # return val
29
+
30
+ def _toObject(self, val):
31
+ rval = val
32
+ if isinstance(val, list):
33
+ rval = list(self._toObject(v) for v in val)
34
+ elif hasattr(val, "model_dump"):
35
+ rval = val.model_dump()
36
+
37
+ return rval
16
38
 
17
39
  def visitExprId(self, e : ExprId):
18
40
  if e.id in self.variables:
19
- self.value = self.variables[e.id]
41
+ # Always represent data as a JSON object
42
+ self.value = self._toObject(self.variables[e.id])
20
43
  else:
21
- raise Exception("Variable %s not found" % e.id)
44
+ raise Exception("Variable '%s' not found" % e.id)
22
45
 
23
46
  def visitExprString(self, e : ExprString):
24
47
  self.value = e.value
@@ -0,0 +1,48 @@
1
+ import dataclasses as dc
2
+ import json
3
+ from .expr_eval import ExprEval
4
+ from .expr_parser import ExprParser
5
+ from .eval_jq import eval_jq
6
+
7
+ @dc.dataclass
8
+ class ParamRefEval(object):
9
+
10
+ parser : ExprParser = ExprParser()
11
+ expr_eval : ExprEval = ExprEval()
12
+
13
+ def __post_init__(self):
14
+ self.expr_eval.methods["jq"] = eval_jq
15
+
16
+ def eval(self, val : str) -> str:
17
+ idx = 0
18
+
19
+ while True:
20
+ idx = val.find("${{", idx)
21
+
22
+ if idx != -1:
23
+ eidx = val.find("}}", idx+1)
24
+
25
+ if eidx == -1:
26
+ raise Exception("unterminated variable ref")
27
+
28
+ ref = val[idx+3:eidx].strip()
29
+ print("ref: %s" % ref)
30
+
31
+ expr_ast = self.parser.parse(ref)
32
+ print("expr_ast: %s" % str(expr_ast))
33
+ exp_val = self.expr_eval.eval(expr_ast)
34
+ print("exp_val: %s" % str(exp_val))
35
+
36
+ # Replacing [idx..eidx+2] with len(exp_val)
37
+ val = val[:idx] + exp_val + val[eidx+2:]
38
+ idx += len(exp_val)
39
+
40
+
41
+
42
+ else:
43
+ break
44
+
45
+ return val
46
+
47
+ def setVar(self, name, value):
48
+ self.expr_eval.variables[name] = value
dv_flow/mgr/task_data.py CHANGED
@@ -37,6 +37,10 @@ class TaskMarker(BaseModel):
37
37
  severity : str
38
38
  loc : TaskMarkerLoc = dc.Field(default=None)
39
39
 
40
+ class TaskParameterSet(BaseModel):
41
+ task : str = None # Name of the task that produced this param set
42
+ seq : int = -1 # Order in which the param-set must appear
43
+
40
44
  class TaskDataInput(BaseModel):
41
45
  changed : bool
42
46
  srcdir : str
@@ -46,14 +50,15 @@ class TaskDataInput(BaseModel):
46
50
 
47
51
  class TaskDataResult(BaseModel):
48
52
  changed : bool = dc.Field(default=True)
49
- output : List[Any] = dc.Field(default_factory=list)
53
+ output : List[TaskParameterSet] = dc.Field(default_factory=list)
50
54
  memento : Any = dc.Field(default=None)
51
55
  markers : List[TaskMarker] = dc.Field(default_factory=list)
52
56
  status : int = dc.Field(default=0)
53
57
 
54
58
  class TaskDataOutput(BaseModel):
55
- changed : bool
56
- output : List[Any]
59
+ changed : bool = True
60
+ output : List[TaskParameterSet] = dc.Field(default_factory=list)
61
+ dep_m : Dict[str,List[str]] = dc.Field(default_factory=dict)
57
62
 
58
63
  class TaskDataParamOpE(enum.Enum):
59
64
  Set = enum.auto()
dv_flow/mgr/task_node.py CHANGED
@@ -1,9 +1,11 @@
1
1
 
2
2
  import dataclasses as dc
3
+ import pydantic.dataclasses as pdc
3
4
  import logging
4
5
  from typing import Any, Callable, ClassVar, Dict, List
5
6
  from .task_data import TaskDataInput, TaskDataOutput, TaskDataResult
6
7
  from .task_params_ctor import TaskParamsCtor
8
+ from .param_ref_eval import ParamRefEval
7
9
 
8
10
  @dc.dataclass
9
11
  class TaskNode(object):
@@ -24,6 +26,60 @@ class TaskNode(object):
24
26
 
25
27
  _log : ClassVar = logging.getLogger("TaskNode")
26
28
 
29
+ async def do_run(self,
30
+ runner,
31
+ rundir,
32
+ memento : Any = None) -> 'TaskDataResult':
33
+ changed = False
34
+ for dep in self.needs:
35
+ changed |= dep.changed
36
+
37
+ # TODO: Form dep-map from inputs
38
+ # TODO: Order param sets according to dep-map
39
+ in_params = []
40
+ for need in self.needs:
41
+ in_params.extend(need.output.output)
42
+
43
+ # TODO: create an evaluator for substituting param values
44
+ eval = ParamRefEval()
45
+
46
+ eval.setVar("in", in_params)
47
+
48
+ # for attr in dir(self.params):
49
+ # if not attr.startswith("_"):
50
+ # print("Attr: %s" % attr)
51
+ for name,field in self.params.model_fields.items():
52
+ value = getattr(self.params, name)
53
+ print("Field: %s %s" % (name, str(value)))
54
+ if value.find("${{") != -1:
55
+ new_val = eval.eval(value)
56
+ setattr(self.params, name, new_val)
57
+ pass
58
+
59
+ input = TaskDataInput(
60
+ changed=changed,
61
+ srcdir=self.srcdir,
62
+ rundir=rundir,
63
+ params=self.params,
64
+ memento=memento)
65
+
66
+ # TODO: notify of task start
67
+ ret : TaskDataResult = await self.task(self, input)
68
+ # TODO: notify of task complete
69
+
70
+ # TODO: form a dep map from the outgoing param sets
71
+ dep_m = {}
72
+
73
+ # Store the result
74
+ self.output = TaskDataOutput(
75
+ changed=ret.changed,
76
+ dep_m=dep_m,
77
+ output=ret.output.copy())
78
+
79
+ # TODO:
80
+
81
+ return ret
82
+
27
83
  def __hash__(self):
28
84
  return id(self)
29
85
 
@@ -76,5 +132,13 @@ class TaskNodeCtorWrapper(TaskNodeCtor):
76
132
 
77
133
  def mkTaskParams(self, params : Dict) -> Any:
78
134
  obj = self.paramT()
79
- # TODO: apply user-specified params
135
+
136
+ # Apply user-specified params
137
+ for key,value in params.items():
138
+ if not hasattr(obj, key):
139
+ raise Exception("Parameters class %s does not contain field %s" % (
140
+ str(type(obj)),
141
+ key))
142
+ else:
143
+ setattr(obj, key, value)
80
144
  return obj
@@ -53,7 +53,10 @@ class TaskSetRunner(TaskRunner):
53
53
  active_task_l.pop(i)
54
54
  break
55
55
  if t not in done_task_s:
56
- coro = asyncio.Task(self.do_run(t))
56
+ coro = asyncio.Task(t.do_run(
57
+ self,
58
+ self.rundir, # TODO
59
+ None)) # TODO: memento
57
60
  active_task_l.append((t, coro))
58
61
 
59
62
  # Now, wait for tasks to complete
@@ -64,50 +67,6 @@ class TaskSetRunner(TaskRunner):
64
67
 
65
68
  pass
66
69
 
67
- async def do_run(self,
68
- task : 'TaskNode',
69
- memento : Any = None) -> 'TaskDataResult':
70
- changed = False
71
- for dep in task.needs:
72
- changed |= dep.changed
73
-
74
- # TODO: create an evaluator for substituting param values
75
- eval = None
76
-
77
- for field in dc.fields(task.params):
78
- print("Field: %s" % field.name)
79
-
80
- input = TaskDataInput(
81
- changed=changed,
82
- srcdir=task.srcdir,
83
- rundir=self.rundir,
84
- params=task.params,
85
- memento=memento)
86
-
87
- # TODO: notify of task start
88
- ret : TaskDataResult = await task.task(self, input)
89
- # TODO: notify of task complete
90
-
91
- # Store the result
92
- task.output = TaskDataOutput(
93
- changed=ret.changed,
94
- output=ret.output.copy())
95
-
96
- # # By definition, none of this have run, since we just ran
97
- # for dep in task.dependents:
98
- # is_sat = True
99
- # for need in dep.needs:
100
- # if need.output is None:
101
- # is_sat = False
102
- # break
103
-
104
- # if is_sat:
105
- # # TODO: queue task for evaluation
106
- # pass
107
- # TODO:
108
-
109
- return ret
110
-
111
70
  def _buildDepMap(self, dep_m, task : TaskNode):
112
71
  if task not in dep_m.keys():
113
72
  dep_m[task] = set(task.needs)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: dv-flow-mgr
3
- Version: 0.0.1.13489806632a1
3
+ Version: 0.0.1.13551739897a1
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,6 +1,7 @@
1
1
  dv_flow/mgr/__init__.py,sha256=IZA7I1u7RH34DrJXSkETxWFpK5Jn_A2zXfnCAzJ8XxA,289
2
2
  dv_flow/mgr/__main__.py,sha256=uik6gDAvtZNG0yyDKYc4FTl6R1QHAR543jNG2lCAa6E,1771
3
- dv_flow/mgr/expr_eval.py,sha256=pfnTDurXPTURgpdzlno5XtXlkoPfnJmAAq45G9T2D3k,1517
3
+ dv_flow/mgr/eval_jq.py,sha256=S3WIfBNWE4uoJb7agJ-lm0v1mwYQ7VkdLcyDEC1VRtw,291
4
+ dv_flow/mgr/expr_eval.py,sha256=nd4MUBQ_NyvBM4E3e8TKWPVhLseYmBDbvFDt1s_qQJ8,2200
4
5
  dv_flow/mgr/expr_parser.py,sha256=aR8n6hgk5xmFknIaSVC02K-So-eU4pkkFtwb7zWsSPs,5474
5
6
  dv_flow/mgr/fileset.py,sha256=FNvC5sU2ArxJ0OO3v8dXTv8zX-bZ5t0a0ljne0fQQ1o,1150
6
7
  dv_flow/mgr/fragment_def.py,sha256=cyzp1XeWtNOaagScmeS-BPsoXj9j2LTBbKq5ZUioz8I,1641
@@ -9,11 +10,12 @@ dv_flow/mgr/package.py,sha256=878twhPD-E1pFlDNUtuyeFEgJ_Y89b560og4St-Iwrs,1679
9
10
  dv_flow/mgr/package_def.py,sha256=dwvs-7kGEp7wFrBK2Fybysb-vSKwtWOtxTrg1VIaL14,14975
10
11
  dv_flow/mgr/package_import_spec.py,sha256=ah3r15v5Jdub2poc3sgi6Uar1L3oGoYsCPPNiOHV-a4,1760
11
12
  dv_flow/mgr/param_def.py,sha256=e2WvRCMArbgcsKC4TKQqZTscZmCdo3WvVR6w3LN0VK8,727
13
+ dv_flow/mgr/param_ref_eval.py,sha256=oc4Eg0v3zp-hvDjE5JofPczUFY5bYGXkwiWFvkAvKOA,1235
12
14
  dv_flow/mgr/parsetab.py,sha256=enSOnMQ-woIsMEzHyeYiefvhAl8enxfX9Ct_o8-jkqs,3780
13
15
  dv_flow/mgr/pkg_rgy.py,sha256=2R_EaeBDJn5qUq9DzSnLc37wUP36MWSv-p0LgUjJRAg,4471
14
16
  dv_flow/mgr/task.py,sha256=kLQSvnVwj9ROIDtxq8lLu-4mJizTxOqvUeogmgN6QAA,5976
15
17
  dv_flow/mgr/task_ctor.py,sha256=hlfl-UVvyjzLFN6D0Oel9eBs0xUQPqCX7gQ0uEHoL7o,1382
16
- dv_flow/mgr/task_data.py,sha256=fkaVzQ81nJBXy4uPWPdnVCNoD9L7rvH5Abt8LXzvnJs,11098
18
+ dv_flow/mgr/task_data.py,sha256=9c5NrVZWECHFXrCPOpwZBQXRhr1O3ni5aFeP2I1P5Rw,11398
17
19
  dv_flow/mgr/task_def.py,sha256=WAW1fPXUfUiQcfmgCx0iCMddMBKATDa5RsRztJWRbUk,1819
18
20
  dv_flow/mgr/task_exec_data.py,sha256=aT__kmVmNxqnS_GbTRS1vrYgKiv8cH-HUSmRb6YYKsI,640
19
21
  dv_flow/mgr/task_graph_builder.py,sha256=-lRSjWU2UJf3euVIFtoVIU7Qdox7MI1sKERWg1k7U_g,7058
@@ -21,10 +23,10 @@ dv_flow/mgr/task_graph_runner.py,sha256=jUGI49QvxUCfQoKQDDk2psbeapIcCg72qNOW1Jip
21
23
  dv_flow/mgr/task_graph_runner_local.py,sha256=OrydPwtQ8E7hYWvSXx0h7lI3nfUNFyklULhsyMwz9dA,4687
22
24
  dv_flow/mgr/task_impl_data.py,sha256=bFPijoKrh9x7fZN2DsvRJp0UHo-gGM0VjtDQISyfhFk,321
23
25
  dv_flow/mgr/task_memento.py,sha256=C7VTQpBhDEoYuDmE6YTM-6TLMLnqHp6Y0Vat1aTgtCs,1096
24
- dv_flow/mgr/task_node.py,sha256=wcvxdtrRNwPwV494DerrB79PFYAv6bPdWZDvRGQ0V6Q,2318
26
+ dv_flow/mgr/task_node.py,sha256=UD3p8tpluQM1k57VeJblp_0S_4-ncPdRiNKxTwkp-7E,4277
25
27
  dv_flow/mgr/task_output.py,sha256=l-W-FvVo6YDah1RQS-I9N0KUtB3vp-kl7lxIdmNz0l4,178
26
28
  dv_flow/mgr/task_params_ctor.py,sha256=aXgB8o9xFPjaEjGW_xYkEC0N0apzGzGUPDj7g2ZLvus,1112
27
- dv_flow/mgr/task_runner.py,sha256=5vCKM2UFxdHB9OslUVIx5Ipc0r04Cizvrc2YSKGMqqI,5055
29
+ dv_flow/mgr/task_runner.py,sha256=JmerE6CyXiJJK7-n6P65OzwW9UTYFQqV8Cck7eHe0B8,3882
28
30
  dv_flow/mgr/type.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
31
  dv_flow/mgr/type_def.py,sha256=KdhuNlfw-NKU-4VZFCnMPyj775yEB7cpr5tz73a9yuQ,259
30
32
  dv_flow/mgr/util.py,sha256=06eVyURF4ga-s8C9Sd3ZSDebwO4QS0XXaB8xADVbWRc,1437
@@ -34,9 +36,9 @@ dv_flow/mgr/std/fileset.py,sha256=uP7bGntRq-Tn5_GEFnt0_J_OAmfvep3GlCwCuE8by4o,27
34
36
  dv_flow/mgr/std/flow.dv,sha256=j9wLrF3Ghh1ZLbJxmk7WiNiRYUYEer-8CCUA5hsgtfk,1409
35
37
  dv_flow/mgr/std/message.py,sha256=BPTHnEMD4tBufQ9LvsS9Sa_0xjaJATbBpwqosWslvVA,193
36
38
  dv_flow/mgr/std/task_null.py,sha256=KObmjG_4D08GJ1k6neqKIQrFY72Sj0jLnwXxEkq5HA0,321
37
- dv_flow_mgr-0.0.1.13489806632a1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
38
- dv_flow_mgr-0.0.1.13489806632a1.dist-info/METADATA,sha256=iGQC00bCbcchWcesU4kXOBNBn-ggHWurn1YqLBKB610,13276
39
- dv_flow_mgr-0.0.1.13489806632a1.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
40
- dv_flow_mgr-0.0.1.13489806632a1.dist-info/entry_points.txt,sha256=1roy8wAFM48LabOvr6jiOw0MUs-qE8X3Vf8YykPazxk,50
41
- dv_flow_mgr-0.0.1.13489806632a1.dist-info/top_level.txt,sha256=amfVTkggzYPtWwLqNmRukfz1Buu0pGS2SrYBBLhXm04,8
42
- dv_flow_mgr-0.0.1.13489806632a1.dist-info/RECORD,,
39
+ dv_flow_mgr-0.0.1.13551739897a1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
40
+ dv_flow_mgr-0.0.1.13551739897a1.dist-info/METADATA,sha256=VtNYWj6_n4aAJfxdzGybKBE-WZlCuoPWNA8X3FXzRTM,13276
41
+ dv_flow_mgr-0.0.1.13551739897a1.dist-info/WHEEL,sha256=nn6H5-ilmfVryoAQl3ZQ2l8SH5imPWFpm1A5FgEuFV4,91
42
+ dv_flow_mgr-0.0.1.13551739897a1.dist-info/entry_points.txt,sha256=1roy8wAFM48LabOvr6jiOw0MUs-qE8X3Vf8YykPazxk,50
43
+ dv_flow_mgr-0.0.1.13551739897a1.dist-info/top_level.txt,sha256=amfVTkggzYPtWwLqNmRukfz1Buu0pGS2SrYBBLhXm04,8
44
+ dv_flow_mgr-0.0.1.13551739897a1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.0)
2
+ Generator: setuptools (75.8.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5