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.
Files changed (100) hide show
  1. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/PKG-INFO +1 -1
  2. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/docs/Steps.md +33 -2
  3. dv_flow_mgr-0.0.1.13644197178a1/fwperiph_dma.pss +127 -0
  4. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/pyproject.toml +1 -1
  5. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/__init__.py +1 -0
  6. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/eval_jq.py +3 -2
  7. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/expr_eval.py +5 -2
  8. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/package_def.py +99 -38
  9. dv_flow_mgr-0.0.1.13644197178a1/src/dv_flow/mgr/param.py +20 -0
  10. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/param_def.py +0 -1
  11. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/param_ref_eval.py +2 -5
  12. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/task_def.py +3 -3
  13. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/task_graph_builder.py +16 -10
  14. dv_flow_mgr-0.0.1.13644197178a1/src/dv_flow/mgr/task_node.py +247 -0
  15. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow_mgr.egg-info/PKG-INFO +1 -1
  16. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow_mgr.egg-info/SOURCES.txt +2 -0
  17. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/test_pyclass.py +22 -25
  18. dv_flow_mgr-0.0.1.13644197178a1/tests/unit/test_pytask_smoke.py +235 -0
  19. dv_flow_mgr-0.0.1.13551739897a1/src/dv_flow/mgr/task_node.py +0 -144
  20. dv_flow_mgr-0.0.1.13551739897a1/tests/unit/test_pytask_smoke.py +0 -141
  21. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/.github/workflows/ci.yml +0 -0
  22. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/.gitignore +0 -0
  23. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/.vscode/settings.json +0 -0
  24. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/LICENSE +0 -0
  25. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/README.md +0 -0
  26. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/docs/KeyArchitecture.md +0 -0
  27. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/docs/Makefile +0 -0
  28. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/docs/Notes.md +0 -0
  29. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/docs/Roadmap.md +0 -0
  30. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/docs/RundirLayout.md +0 -0
  31. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/docs/Stages.md +0 -0
  32. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/docs/Tasks.md +0 -0
  33. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/docs/TypesAndDefs.md +0 -0
  34. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/docs/Usecases.md +0 -0
  35. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/docs/conf.py +0 -0
  36. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/docs/index.rst +0 -0
  37. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/docs/intro.rst +0 -0
  38. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/docs/quickstart.rst +0 -0
  39. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/docs/reference.rst +0 -0
  40. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/ivpm.yaml +0 -0
  41. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/setup.cfg +0 -0
  42. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/__main__.py +0 -0
  43. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/cmds/cmd_run.py +0 -0
  44. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/expr_parser.py +0 -0
  45. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/fileset.py +0 -0
  46. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/fragment_def.py +0 -0
  47. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/out +0 -0
  48. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/package.py +0 -0
  49. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/package_import_spec.py +0 -0
  50. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/parsetab.py +0 -0
  51. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/pkg_rgy.py +0 -0
  52. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/share/flow.json +0 -0
  53. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/std/fileset.py +0 -0
  54. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/std/flow.dv +0 -0
  55. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/std/message.py +0 -0
  56. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/std/task_null.py +0 -0
  57. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/task.py +0 -0
  58. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/task_ctor.py +0 -0
  59. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/task_data.py +0 -0
  60. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/task_exec_data.py +0 -0
  61. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/task_graph_runner.py +0 -0
  62. {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
  63. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/task_impl_data.py +0 -0
  64. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/task_memento.py +0 -0
  65. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/task_output.py +0 -0
  66. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/task_params_ctor.py +0 -0
  67. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/task_runner.py +0 -0
  68. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/type.py +0 -0
  69. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/type_def.py +0 -0
  70. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow/mgr/util.py +0 -0
  71. {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
  72. {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
  73. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/src/dv_flow_mgr.egg-info/requires.txt +0 -0
  74. {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
  75. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/examples/example1/example1.flow +0 -0
  76. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/system/test_depends.py +0 -0
  77. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/system/test_pkg_discovery.py +0 -0
  78. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/system/test_stdlib.py +0 -0
  79. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/__init__.py +0 -0
  80. {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
  81. {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
  82. {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
  83. {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
  84. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/data/fileset/test1/flow.dv +0 -0
  85. {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
  86. {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
  87. {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
  88. {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
  89. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/data/fileset/test1 copy/test1.dfs +0 -0
  90. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/data/proj1/proj1.dfs +0 -0
  91. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/data/proj2/proj2.dfs +0 -0
  92. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/data/proj3/proj3.dfs +0 -0
  93. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/test_data_merge.py +0 -0
  94. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/test_expr_eval.py +0 -0
  95. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/test_expr_parser.py +0 -0
  96. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/test_fileset.py +0 -0
  97. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/test_parse.py +0 -0
  98. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/test_smoke copy.sav +0 -0
  99. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/test_smoke.py +0 -0
  100. {dv_flow_mgr-0.0.1.13551739897a1 → dv_flow_mgr-0.0.1.13644197178a1}/tests/unit/test_stdlib.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: dv-flow-mgr
3
- Version: 0.0.1.13551739897a1
3
+ Version: 0.0.1.13644197178a1
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
@@ -105,10 +105,41 @@ runner.run(simImg)
105
105
  factory.addTaskType(MyTask.ctor)
106
106
 
107
107
  # Proper values
108
- - Show that can pass individual values
108
+ * Show that can pass individual values
109
109
  - Need to test append/prepend/path-append/path-prepend
110
- - Need to process and expand expressions
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
+ }
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
5
5
 
6
6
  [project]
7
7
  name = "dv-flow-mgr"
8
- version = "0.0.1.13551739897a1"
8
+ version = "0.0.1.13644197178a1"
9
9
  dependencies = [
10
10
  'pydantic',
11
11
  'pyyaml',
@@ -7,4 +7,5 @@ from .task_data import *
7
7
  from .task_graph_runner import TaskGraphRunner
8
8
  from .task_graph_runner_local import TaskGraphRunnerLocal
9
9
  from .task_graph_builder import TaskGraphBuilder
10
+ from .task_node import task
10
11
 
@@ -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).all()
11
+ ret = filt.input_text(input).text()
12
12
  else:
13
- ret = filt.input_value(input).all()
13
+ ret = filt.input_value(input).text()
14
+
14
15
 
15
16
  return ret
@@ -19,8 +19,11 @@ class ExprEval(ExprVisitor):
19
19
  return val
20
20
 
21
21
  def _toString(self, val):
22
- obj = self._toObject(val)
23
- return json.dumps(obj)
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"):
@@ -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
- #from .task import TaskCtorCls, TaskCtorParam, TaskCtorParamCls
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
- ptype_m = {
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.pyclass is not None:
222
+ if task.pytask is not None:
228
223
  # Built-in impl
229
224
  # Now, lookup the class
230
- self._log.debug("Use PyClass implementation")
231
- last_dot = task.pyclass.rfind('.')
232
- clsname = task.pyclass[last_dot+1:]
233
- modname = task.pyclass[:last_dot]
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
- task_ctor = getattr(mod, clsname)
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
- ctor_t = TaskCtorCls(
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
- uses=uses,
260
- task_ctor=task_ctor,
261
- srcdir=srcdir)
262
- elif task.uses is not None:
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 = TaskCtor(
257
+ ctor_t = TaskNodeCtorProxy(
265
258
  name=task.name,
266
- uses=self.getTaskCtor(session, task.uses, tasks_m),
267
- srcdir=srcdir)
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
- ctor_t = self.handleParams(task, ctor_t)
276
- ctor_t.depends.extend(task.depends)
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
+
@@ -14,7 +14,6 @@ class ComplexType(BaseModel):
14
14
  map : Union[MapType, None] = None
15
15
 
16
16
  class ParamDef(BaseModel):
17
- name : str
18
17
  doc : str = None
19
18
  type : Union[str, 'ComplexType'] = None
20
19
  value : Union[Any, None] = None
@@ -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:]
@@ -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
- pyclass : str = dc.Field(default=None)
38
+ pytask : str = dc.Field(default=None)
39
39
  desc : str = dc.Field(default="")
40
40
  doc : str = dc.Field(default="")
41
- depends : List[Union[str,TaskSpec]] = dc.Field(default_factory=list, alias="needs")
42
- params: List[ParamDef] = dc.Field(default_factory=list, alias="with")
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
- depends = []
99
+ needs = []
100
100
 
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])
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
- task = ctor_t.mkTask(
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
- depends=depends,
112
- rundir=rundir)
117
+ needs=needs)
118
+ task.rundir = rundir
113
119
 
114
120
  self._task_m[task.name] = task
115
121