dv-flow-mgr 0.0.1.13551739897a1__tar.gz → 0.0.1.13644197178a1__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.
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/PKG-INFO +1 -1
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/docs/Steps.md +33 -2
- dv_flow_mgr-0.0.1.13644197178a1/fwperiph_dma.pss +127 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/pyproject.toml +1 -1
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/__init__.py +1 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/eval_jq.py +3 -2
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/expr_eval.py +5 -2
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/package_def.py +99 -38
- dv_flow_mgr-0.0.1.13644197178a1/src/dv_flow/mgr/param.py +20 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/param_def.py +0 -1
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/param_ref_eval.py +2 -5
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/task_def.py +3 -3
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/task_graph_builder.py +16 -10
- dv_flow_mgr-0.0.1.13644197178a1/src/dv_flow/mgr/task_node.py +247 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow_mgr.egg-info/PKG-INFO +1 -1
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow_mgr.egg-info/SOURCES.txt +2 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/test_pyclass.py +22 -25
- dv_flow_mgr-0.0.1.13644197178a1/tests/unit/test_pytask_smoke.py +235 -0
- dv_flow_mgr-0.0.1.13551739897a1/src/dv_flow/mgr/task_node.py +0 -144
- dv_flow_mgr-0.0.1.13551739897a1/tests/unit/test_pytask_smoke.py +0 -141
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/.github/workflows/ci.yml +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/.gitignore +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/.vscode/settings.json +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/LICENSE +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/README.md +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/docs/KeyArchitecture.md +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/docs/Makefile +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/docs/Notes.md +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/docs/Roadmap.md +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/docs/RundirLayout.md +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/docs/Stages.md +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/docs/Tasks.md +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/docs/TypesAndDefs.md +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/docs/Usecases.md +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/docs/conf.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/docs/index.rst +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/docs/intro.rst +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/docs/quickstart.rst +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/docs/reference.rst +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/ivpm.yaml +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/setup.cfg +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/__main__.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/cmds/cmd_run.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/expr_parser.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/fileset.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/fragment_def.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/out +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/package.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/package_import_spec.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/parsetab.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/pkg_rgy.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/share/flow.json +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/std/fileset.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/std/flow.dv +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/std/message.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/std/task_null.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/task.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/task_ctor.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/task_data.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/task_exec_data.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/task_graph_runner.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/task_graph_runner_local.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/task_impl_data.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/task_memento.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/task_output.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/task_params_ctor.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/task_runner.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/type.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/type_def.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/util.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow_mgr.egg-info/dependency_links.txt +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow_mgr.egg-info/entry_points.txt +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow_mgr.egg-info/requires.txt +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow_mgr.egg-info/top_level.txt +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/examples/example1/example1.flow +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/system/test_depends.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/system/test_pkg_discovery.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/system/test_stdlib.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/__init__.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/data/fileset/test1/files1/file1_1.sv +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/data/fileset/test1/files1/file1_2.sv +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/data/fileset/test1/files2/file2_1.sv +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/data/fileset/test1/files2/file2_2.sv +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/data/fileset/test1/flow.dv +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/data/fileset/test1 copy/files1/file1_1.sv +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/data/fileset/test1 copy/files1/file1_2.sv +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/data/fileset/test1 copy/files2/file2_1.sv +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/data/fileset/test1 copy/files2/file2_2.sv +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/data/fileset/test1 copy/test1.dfs +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/data/proj1/proj1.dfs +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/data/proj2/proj2.dfs +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/data/proj3/proj3.dfs +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/test_data_merge.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/test_expr_eval.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/test_expr_parser.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/test_fileset.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/test_parse.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/test_smoke copy.sav +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/test_smoke.py +0 -0
- {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/test_stdlib.py +0 -0
@@ -105,10 +105,41 @@ runner.run(simImg)
|
|
105
105
|
factory.addTaskType(MyTask.ctor)
|
106
106
|
|
107
107
|
# Proper values
|
108
|
-
|
108
|
+
* Show that can pass individual values
|
109
109
|
- Need to test append/prepend/path-append/path-prepend
|
110
|
-
|
110
|
+
* Need to process and expand expressions
|
111
111
|
-
|
112
112
|
|
113
|
+
with:
|
114
|
+
args: <value>
|
115
|
+
# List-of
|
116
|
+
- append-list:
|
117
|
+
|
118
|
+
# Why PSS?
|
119
|
+
- Key usecases
|
120
|
+
|
121
|
+
# Open Source and PSS
|
122
|
+
|
123
|
+
# YAML basics
|
124
|
+
- Load packages and create TaskNodeCtor objects from a YAML file
|
125
|
+
- Define types in YAML
|
126
|
+
- Implement a 'task factory'
|
127
|
+
- Support package overrides (config setting?)
|
128
|
+
-
|
129
|
+
|
130
|
+
# TaskNode, TaskNodeCtor
|
131
|
+
- TaskNodeCtor exists for each node type
|
132
|
+
- Every node declaration in a YAML file
|
133
|
+
- Node types accessed via the Python API
|
134
|
+
- A new node -- likely with different parameter values -- can be created via the API
|
135
|
+
- A node created via the YAML spec has a dedicated node ctor
|
136
|
+
|
137
|
+
When created via the
|
138
|
+
|
139
|
+
# Early Differentiators
|
140
|
+
- Library of tools with aggressive work avoidance (faster turnaround)
|
141
|
+
- Cross-tool support (strategy for category support)
|
142
|
+
- Extract and display markers (easier identification of failures)
|
143
|
+
|
113
144
|
|
114
145
|
|
@@ -0,0 +1,127 @@
|
|
1
|
+
|
2
|
+
struct wb_if { }
|
3
|
+
struct clk_rst_if { }
|
4
|
+
|
5
|
+
// Need to mark hierarchies as 'verilog'
|
6
|
+
// This allows
|
7
|
+
component fwperiph_dma : vlog_blackbox_c {
|
8
|
+
// All contain refs
|
9
|
+
// Upper must connect during init_down
|
10
|
+
export_c<wb_if> reg_if;
|
11
|
+
port_c<wb_if> mem_if;
|
12
|
+
port_c<wb_if> clk_rst_if;
|
13
|
+
|
14
|
+
exec init_down {
|
15
|
+
module_type = "fwperiph_dma #(%s,%s)" % hh;
|
16
|
+
|
17
|
+
// Append port bindings?
|
18
|
+
}
|
19
|
+
}
|
20
|
+
|
21
|
+
component wb_initiator_bfm_c {
|
22
|
+
|
23
|
+
// Port: consumer - requires something to implement the API
|
24
|
+
// Export: provider - is, or provides, an implementation
|
25
|
+
port_c<
|
26
|
+
}
|
27
|
+
|
28
|
+
// Effectively want to partition such that PSS model is valid,
|
29
|
+
// and we can extract a region to generate as SV
|
30
|
+
|
31
|
+
// Want to create a full testbench env from PSS input
|
32
|
+
// - Still have to pull the
|
33
|
+
|
34
|
+
// Hierarchy mirrors the design and surrounding environment
|
35
|
+
component pss_top {
|
36
|
+
wb_initiator_bfm_c reg_if;
|
37
|
+
fwperiph_dma_c dut;
|
38
|
+
|
39
|
+
exec init_down {
|
40
|
+
|
41
|
+
}
|
42
|
+
}
|
43
|
+
|
44
|
+
// port/export are orthogonal to interface/mirror
|
45
|
+
|
46
|
+
// Wire ports have two components
|
47
|
+
// Always use 'export', since we are providing
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
For wire ports, outside world must be able to determine internal binding (?)
|
52
|
+
- No, not really. Assume netlister will create temp wires with names like container
|
53
|
+
- dma_u_adr_i
|
54
|
+
- ...
|
55
|
+
|
56
|
+
Port must have a reference to an export
|
57
|
+
Directionality may be arbitrary...
|
58
|
+
|
59
|
+
port: initiator
|
60
|
+
export: target
|
61
|
+
|
62
|
+
Need to elaborate component tree in order to connect up bound port/export
|
63
|
+
|
64
|
+
Goal is to be able to:
|
65
|
+
- Instance the dut
|
66
|
+
- Isolate stimulus
|
67
|
+
- Synthesize stimulus
|
68
|
+
|
69
|
+
|
70
|
+
Create reactive tests
|
71
|
+
- Must be able to identify reactive portion
|
72
|
+
- "constraints" surrounding reactive data must be sufficiently open
|
73
|
+
- Must be able to "lower" reactive subset of the description
|
74
|
+
|
75
|
+
"Scope of reactivity"
|
76
|
+
- Loop:
|
77
|
+
repeat (<variable>) {
|
78
|
+
// body must also be autonomous?
|
79
|
+
// body is fixed or autonomous
|
80
|
+
}
|
81
|
+
|
82
|
+
Action traversal cannot cross partition boundaries?
|
83
|
+
- Specifically, must convert to reads/writes
|
84
|
+
- Maybe automate
|
85
|
+
|
86
|
+
Capture required Emu / DfX content as part of UTP
|
87
|
+
- Platform required
|
88
|
+
- Target-specific requirements
|
89
|
+
- Known dependencies (eg content for related blocks)
|
90
|
+
- Stub requirements (which interfaces must be accessed)
|
91
|
+
=> Goal: produce reusable content with minimal additional effort
|
92
|
+
|
93
|
+
Pitch: multiple teams developing cross-platform test content from a natural-language spec
|
94
|
+
- IP team needs to deliver to firmware
|
95
|
+
- Emu team often re-engineers init content, builds SL content on top
|
96
|
+
- Likewise, DfX team often re-engineers ; may be delayed due to dependency
|
97
|
+
-> Want to reduce or eliminate redundant work
|
98
|
+
-> Want consistency in what is used -- verifcation
|
99
|
+
->
|
100
|
+
Pitch: capture initialization in machine-readable format
|
101
|
+
-> Derive natural-language description and diagrams
|
102
|
+
-> Derive platform-appropriate content
|
103
|
+
-> Save time
|
104
|
+
|
105
|
+
Formal capture of init sequences
|
106
|
+
- Capture in PSS
|
107
|
+
- Derive user documentation (AI for summarization + comments)
|
108
|
+
|
109
|
+
struct wishbone_s : protocol_s {
|
110
|
+
|
111
|
+
}
|
112
|
+
|
113
|
+
struct wishbone_rtl_abstraction_s <ADDR_WIDTH=32, DATA_WIDTH=32> : abstraction_s<wishbone_s> {
|
114
|
+
@port(init_dir=Output, targ_dir=Input)
|
115
|
+
bit[DATA_WIDTH] wr_data;
|
116
|
+
|
117
|
+
@port(init_dir=Output, targ_dir=Input)
|
118
|
+
bit[DATA_WIDTH] rd_data;
|
119
|
+
}
|
120
|
+
|
121
|
+
// bus type
|
122
|
+
// abstraction
|
123
|
+
// initiator, target, initiator_mirror,
|
124
|
+
|
125
|
+
component wb_initiator_c {
|
126
|
+
|
127
|
+
}
|
{dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/eval_jq.py
RENAMED
@@ -8,8 +8,9 @@ def eval_jq(input, args):
|
|
8
8
|
filt = jq.compile(args[0])
|
9
9
|
|
10
10
|
if type(input) == str:
|
11
|
-
ret = filt.input_text(input).
|
11
|
+
ret = filt.input_text(input).text()
|
12
12
|
else:
|
13
|
-
ret = filt.input_value(input).
|
13
|
+
ret = filt.input_value(input).text()
|
14
|
+
|
14
15
|
|
15
16
|
return ret
|
{dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/expr_eval.py
RENAMED
@@ -19,8 +19,11 @@ class ExprEval(ExprVisitor):
|
|
19
19
|
return val
|
20
20
|
|
21
21
|
def _toString(self, val):
|
22
|
-
|
23
|
-
|
22
|
+
rval = val
|
23
|
+
if type(val) != str:
|
24
|
+
obj = self._toObject(val)
|
25
|
+
rval = json.dumps(obj)
|
26
|
+
return rval
|
24
27
|
# if isinstance(val, list):
|
25
28
|
# val = '[' + ",".join(self._toString(v) for v in val) + ']'
|
26
29
|
# elif hasattr(val, "model_dump_json"):
|
{dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/package_def.py
RENAMED
@@ -33,7 +33,7 @@ from typing import Any, Dict, List, Callable, Tuple, ClassVar
|
|
33
33
|
from .fragment_def import FragmentDef
|
34
34
|
from .package import Package
|
35
35
|
from .package_import_spec import PackageImportSpec, PackageSpec
|
36
|
-
|
36
|
+
from .task_node import TaskNodeCtor, TaskNodeCtorProxy, TaskNodeCtorTask
|
37
37
|
from .task_ctor import TaskCtor
|
38
38
|
from .task_def import TaskDef, TaskSpec
|
39
39
|
from .std.task_null import TaskNull
|
@@ -151,20 +151,7 @@ class PackageDef(BaseModel):
|
|
151
151
|
if decl_params:
|
152
152
|
self._log.debug("Type declares new parameters")
|
153
153
|
# We need to combine base parameters with new parameters
|
154
|
-
|
155
|
-
"str" : str,
|
156
|
-
"int" : int,
|
157
|
-
"float" : float,
|
158
|
-
"bool" : bool,
|
159
|
-
"list" : List
|
160
|
-
}
|
161
|
-
pdflt_m = {
|
162
|
-
"str" : "",
|
163
|
-
"int" : 0,
|
164
|
-
"float" : 0.0,
|
165
|
-
"bool" : False,
|
166
|
-
"list" : []
|
167
|
-
}
|
154
|
+
|
168
155
|
for p in task.params.keys():
|
169
156
|
param = task.params[p]
|
170
157
|
self._log.debug("param: %s" % str(param))
|
@@ -221,16 +208,24 @@ class PackageDef(BaseModel):
|
|
221
208
|
|
222
209
|
def mkTaskCtor(self, session, task, srcdir, tasks_m) -> TaskCtor:
|
223
210
|
self._log.debug("--> %s::mkTaskCtor %s (srcdir: %s)" % (self.name, task.name, srcdir))
|
211
|
+
base_ctor_t : TaskCtor = None
|
224
212
|
ctor_t : TaskCtor = None
|
213
|
+
base_params : BaseModel = None
|
214
|
+
callable = None
|
215
|
+
needs = [] if task.needs is None else task.needs.copy()
|
216
|
+
|
217
|
+
if task.uses is not None:
|
218
|
+
base_ctor_t = self.getTaskCtor(session, task.uses, tasks_m)
|
219
|
+
base_params = base_ctor_t.mkTaskParams()
|
225
220
|
|
226
221
|
# Determine the implementation constructor first
|
227
|
-
if task.
|
222
|
+
if task.pytask is not None:
|
228
223
|
# Built-in impl
|
229
224
|
# Now, lookup the class
|
230
|
-
self._log.debug("Use
|
231
|
-
last_dot = task.
|
232
|
-
clsname = task.
|
233
|
-
modname = task.
|
225
|
+
self._log.debug("Use PyTask implementation")
|
226
|
+
last_dot = task.pytask.rfind('.')
|
227
|
+
clsname = task.pytask[last_dot+1:]
|
228
|
+
modname = task.pytask[:last_dot]
|
234
229
|
|
235
230
|
try:
|
236
231
|
if modname not in sys.modules:
|
@@ -245,26 +240,26 @@ class PackageDef(BaseModel):
|
|
245
240
|
|
246
241
|
if not hasattr(mod, clsname):
|
247
242
|
raise Exception("Class %s not found in module %s" % (clsname, modname))
|
248
|
-
|
249
|
-
|
250
|
-
# Determine if we need to use a new
|
251
|
-
|
252
|
-
if task.uses is not None:
|
253
|
-
uses = self.getTaskCtor(session, task.uses, tasks_m)
|
254
|
-
else:
|
255
|
-
uses = None
|
243
|
+
callable = getattr(mod, clsname)
|
256
244
|
|
257
|
-
|
245
|
+
# Determine if we need to use a new
|
246
|
+
paramT = self._getParamT(task, base_params)
|
247
|
+
|
248
|
+
if callable is not None:
|
249
|
+
ctor_t = TaskNodeCtorTask(
|
258
250
|
name=task.name,
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
251
|
+
srcdir=srcdir,
|
252
|
+
paramT=paramT, # TODO: need to determine the parameter type
|
253
|
+
needs=needs, # TODO: need to determine the needs
|
254
|
+
task=callable)
|
255
|
+
elif base_ctor_t is not None:
|
263
256
|
# Use the existing (base) to create the implementation
|
264
|
-
ctor_t =
|
257
|
+
ctor_t = TaskNodeCtorProxy(
|
265
258
|
name=task.name,
|
266
|
-
|
267
|
-
|
259
|
+
srcdir=srcdir,
|
260
|
+
paramT=paramT, # TODO: need to determine the parameter type
|
261
|
+
needs=needs,
|
262
|
+
uses=base_ctor_t)
|
268
263
|
else:
|
269
264
|
self._log.debug("Use 'Null' as the class implementation")
|
270
265
|
ctor_t = TaskCtorCls(
|
@@ -272,11 +267,77 @@ class PackageDef(BaseModel):
|
|
272
267
|
task_ctor=TaskNull,
|
273
268
|
srcdir=srcdir)
|
274
269
|
|
275
|
-
|
276
|
-
ctor_t.
|
270
|
+
# TODO:
|
271
|
+
# ctor_t = self.handleParams(task, ctor_t)
|
272
|
+
# ctor_t.depends.extend(task.depends)
|
277
273
|
|
278
274
|
self._log.debug("<-- %s::mkTaskCtor %s" % (self.name, task.name))
|
279
275
|
return ctor_t
|
276
|
+
|
277
|
+
def _getParamT(self, task, base_t : BaseModel):
|
278
|
+
# Get the base parameter type (if available)
|
279
|
+
# We will build a new type with updated fields
|
280
|
+
|
281
|
+
ptype_m = {
|
282
|
+
"str" : str,
|
283
|
+
"int" : int,
|
284
|
+
"float" : float,
|
285
|
+
"bool" : bool,
|
286
|
+
"list" : List
|
287
|
+
}
|
288
|
+
pdflt_m = {
|
289
|
+
"str" : "",
|
290
|
+
"int" : 0,
|
291
|
+
"float" : 0.0,
|
292
|
+
"bool" : False,
|
293
|
+
"list" : []
|
294
|
+
}
|
295
|
+
|
296
|
+
fields = []
|
297
|
+
field_m : Dict[str,int] = {}
|
298
|
+
|
299
|
+
# First, pull out existing fields (if there's a base type)
|
300
|
+
if base_t is not None:
|
301
|
+
self._log.debug("Base type: %s" % str(base_t))
|
302
|
+
for name,f in base_t.model_fields.items():
|
303
|
+
ff : dc.Field = f
|
304
|
+
fields.append(f)
|
305
|
+
field_m[name] = (f.annotation, getattr(base_t, name))
|
306
|
+
else:
|
307
|
+
self._log.debug("No base type")
|
308
|
+
|
309
|
+
for p in task.params.keys():
|
310
|
+
param = task.params[p]
|
311
|
+
self._log.debug("param: %s %s (%s)" % (p, str(param), str(type(param))))
|
312
|
+
if hasattr(param, "type") and param.type is not None:
|
313
|
+
ptype_s = param.type
|
314
|
+
if ptype_s not in ptype_m.keys():
|
315
|
+
raise Exception("Unknown type %s" % ptype_s)
|
316
|
+
ptype = ptype_m[ptype_s]
|
317
|
+
|
318
|
+
if p in field_m.keys():
|
319
|
+
raise Exception("Duplicate field %s" % p)
|
320
|
+
if param.value is not None:
|
321
|
+
field_m[p] = (ptype, param.value)
|
322
|
+
else:
|
323
|
+
field_m[p] = (ptype, pdflt_m[ptype_s])
|
324
|
+
self._log.debug("Set param=%s to %s" % (p, str(field_m[p][1])))
|
325
|
+
else:
|
326
|
+
if p not in field_m.keys():
|
327
|
+
raise Exception("Field %s not found" % p)
|
328
|
+
if type(param) != dict:
|
329
|
+
value = param
|
330
|
+
elif "value" in param.keys():
|
331
|
+
value = param["value"]
|
332
|
+
else:
|
333
|
+
raise Exception("No value specified for param %s: %s" % (
|
334
|
+
p, str(param)))
|
335
|
+
field_m[p] = (field_m[p][0], value)
|
336
|
+
self._log.debug("Set param=%s to %s" % (p, str(field_m[p][1])))
|
337
|
+
|
338
|
+
params_t = pydantic.create_model("Task%sParams" % task.name, **field_m)
|
339
|
+
|
340
|
+
return params_t
|
280
341
|
|
281
342
|
@staticmethod
|
282
343
|
def load(path, exp_pkg_name=None):
|
@@ -0,0 +1,20 @@
|
|
1
|
+
|
2
|
+
from pydantic import BaseModel
|
3
|
+
import pydantic.dataclasses as pdc
|
4
|
+
from typing import Any, List, Union
|
5
|
+
|
6
|
+
class ParamMeta(type):
|
7
|
+
def __getitem__(self, T):
|
8
|
+
ret = Union[T, Param]
|
9
|
+
return ret
|
10
|
+
|
11
|
+
class ParamT(metaclass=ParamMeta):
|
12
|
+
pass
|
13
|
+
|
14
|
+
class Param(BaseModel):
|
15
|
+
append : Union[Any,List] = pdc.Field(default=None)
|
16
|
+
prepend : Union[Any,List] = pdc.Field(default=None)
|
17
|
+
append_path : Union[Any,List] = pdc.Field(default=None, alias="append-path")
|
18
|
+
prepend_path : Union[Any,List] = pdc.Field(default=None, alias="prepend-path")
|
19
|
+
|
20
|
+
|
@@ -7,8 +7,8 @@ from .eval_jq import eval_jq
|
|
7
7
|
@dc.dataclass
|
8
8
|
class ParamRefEval(object):
|
9
9
|
|
10
|
-
parser : ExprParser = ExprParser
|
11
|
-
expr_eval : ExprEval = ExprEval
|
10
|
+
parser : ExprParser = dc.field(default_factory=ExprParser)
|
11
|
+
expr_eval : ExprEval = dc.field(default_factory=ExprEval)
|
12
12
|
|
13
13
|
def __post_init__(self):
|
14
14
|
self.expr_eval.methods["jq"] = eval_jq
|
@@ -26,12 +26,9 @@ class ParamRefEval(object):
|
|
26
26
|
raise Exception("unterminated variable ref")
|
27
27
|
|
28
28
|
ref = val[idx+3:eidx].strip()
|
29
|
-
print("ref: %s" % ref)
|
30
29
|
|
31
30
|
expr_ast = self.parser.parse(ref)
|
32
|
-
print("expr_ast: %s" % str(expr_ast))
|
33
31
|
exp_val = self.expr_eval.eval(expr_ast)
|
34
|
-
print("exp_val: %s" % str(exp_val))
|
35
32
|
|
36
33
|
# Replacing [idx..eidx+2] with len(exp_val)
|
37
34
|
val = val[:idx] + exp_val + val[eidx+2:]
|
{dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/task_def.py
RENAMED
@@ -35,11 +35,11 @@ class TaskDef(BaseModel):
|
|
35
35
|
name : str
|
36
36
|
# type : Union[str,TaskSpec] = dc.Field(default_factory=list)
|
37
37
|
uses : str = dc.Field(default=None)
|
38
|
-
|
38
|
+
pytask : str = dc.Field(default=None)
|
39
39
|
desc : str = dc.Field(default="")
|
40
40
|
doc : str = dc.Field(default="")
|
41
|
-
|
42
|
-
params:
|
41
|
+
needs : List[Union[str,TaskSpec]] = dc.Field(default_factory=list, alias="needs")
|
42
|
+
params: Dict[str,Union[str,ParamDef]] = dc.Field(default_factory=dict, alias="with")
|
43
43
|
# out: List[TaskOutput] = dc.Field(default_factory=list)
|
44
44
|
|
45
45
|
def copy(self) -> 'TaskDef':
|
@@ -96,20 +96,26 @@ class TaskGraphBuilder(object):
|
|
96
96
|
|
97
97
|
self._logger.debug("ctor_t: %s" % ctor_t.name)
|
98
98
|
|
99
|
-
|
99
|
+
needs = []
|
100
100
|
|
101
|
-
for dep in ctor_t.depends:
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
101
|
+
# for dep in ctor_t.depends:
|
102
|
+
# if not dep in self._task_m.keys():
|
103
|
+
# task = self._mkTaskGraph(dep, rundir)
|
104
|
+
# self._task_m[dep] = task
|
105
|
+
# pass
|
106
|
+
# depends.append(self._task_m[dep])
|
107
107
|
|
108
108
|
# The returned task should have all param references resolved
|
109
|
-
|
109
|
+
params = ctor_t.mkTaskParams()
|
110
|
+
|
111
|
+
if params is None:
|
112
|
+
raise Exception("ctor %s returned None for params" % str(ctor_t))
|
113
|
+
|
114
|
+
task = ctor_t.mkTaskNode(
|
115
|
+
params=params,
|
110
116
|
name=task_name,
|
111
|
-
|
112
|
-
|
117
|
+
needs=needs)
|
118
|
+
task.rundir = rundir
|
113
119
|
|
114
120
|
self._task_m[task.name] = task
|
115
121
|
|