dv-flow-mgr 0.0.1.12703462647a1__tar.gz → 0.0.1.12750690879a1__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 (74) hide show
  1. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/PKG-INFO +1 -1
  2. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/docs/Roadmap.md +20 -0
  3. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/docs/conf.py +2 -1
  4. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/docs/index.rst +12 -1
  5. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/ivpm.yaml +5 -0
  6. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/pyproject.toml +1 -1
  7. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr/fragment_def.py +2 -2
  8. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr/session.py +2 -1
  9. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr/task.py +21 -1
  10. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr/task_data.py +21 -4
  11. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr/task_def.py +3 -3
  12. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr/tasklib/hdl/sim/vcs_task_sim_image.py +1 -1
  13. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr/tasklib/hdl/sim/vcs_task_sim_run.py +1 -1
  14. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr/tasklib/hdl/sim/vl_task_sim_image.py +27 -3
  15. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr/tasklib/hdl/sim/vlt_task_sim_run.py +1 -1
  16. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr/tasklib/std/task_fileset.py +2 -1
  17. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr.egg-info/PKG-INFO +1 -1
  18. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/.github/workflows/ci.yml +0 -0
  19. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/.gitignore +0 -0
  20. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/.vscode/settings.json +0 -0
  21. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/LICENSE +0 -0
  22. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/README.md +0 -0
  23. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/docs/Makefile +0 -0
  24. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/docs/Notes.md +0 -0
  25. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/docs/Stages.md +0 -0
  26. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/docs/TypesAndDefs.md +0 -0
  27. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/docs/quickstart.rst +0 -0
  28. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/docs/reference.rst +0 -0
  29. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/setup.cfg +0 -0
  30. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr/__init__.py +0 -0
  31. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr/__main__.py +0 -0
  32. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr/cmds/cmd_run.py +0 -0
  33. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr/fileset.py +0 -0
  34. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr/flow.py +0 -0
  35. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr/package.py +0 -0
  36. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr/package_def.py +0 -0
  37. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr/package_import_spec.py +0 -0
  38. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr/parameters.py +0 -0
  39. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr/share/flow.json +0 -0
  40. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr/task_memento.py +0 -0
  41. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr/tasklib/hdl/sim/mti_pkg.py +0 -0
  42. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr/tasklib/hdl/sim/mti_task_sim_image.py +0 -0
  43. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr/tasklib/hdl/sim/mti_task_sim_run.py +0 -0
  44. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr/tasklib/hdl/sim/pkg_hdl_sim.py +0 -0
  45. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr/tasklib/hdl/sim/task_sim_image.py +0 -0
  46. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr/tasklib/hdl/sim/vcs_pkg.py +0 -0
  47. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr/tasklib/hdl/sim/vlt_pkg.py +0 -0
  48. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr/tasklib/hdl/sim/vlt_task_sim_image.py +0 -0
  49. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr/tasklib/std/fileset.py +0 -0
  50. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr/tasklib/std/pkg_std.py +0 -0
  51. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr/tasklib/std/std.dfs +0 -0
  52. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr/tasklib/std/task_null.py +0 -0
  53. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr.egg-info/SOURCES.txt +0 -0
  54. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr.egg-info/dependency_links.txt +0 -0
  55. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr.egg-info/entry_points.txt +0 -0
  56. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr.egg-info/requires.txt +0 -0
  57. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/src/dv_flow_mgr.egg-info/top_level.txt +0 -0
  58. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/tests/examples/example1/example1.flow +0 -0
  59. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/tests/unit/data/fileset/test1/files1/file1_1.sv +0 -0
  60. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/tests/unit/data/fileset/test1/files1/file1_2.sv +0 -0
  61. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/tests/unit/data/fileset/test1/files2/file2_1.sv +0 -0
  62. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/tests/unit/data/fileset/test1/files2/file2_2.sv +0 -0
  63. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/tests/unit/data/fileset/test1/test1.dfs +0 -0
  64. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/tests/unit/data/fileset/test1 copy/files1/file1_1.sv +0 -0
  65. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/tests/unit/data/fileset/test1 copy/files1/file1_2.sv +0 -0
  66. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/tests/unit/data/fileset/test1 copy/files2/file2_1.sv +0 -0
  67. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/tests/unit/data/fileset/test1 copy/files2/file2_2.sv +0 -0
  68. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/tests/unit/data/fileset/test1 copy/test1.dfs +0 -0
  69. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/tests/unit/data/proj1/proj1.dfs +0 -0
  70. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/tests/unit/data/proj2/proj2.dfs +0 -0
  71. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/tests/unit/data/proj3/proj3.dfs +0 -0
  72. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/tests/unit/test_fileset.py +0 -0
  73. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/tests/unit/test_smoke copy.sav +0 -0
  74. {dv_flow_mgr-0.0.1.12703462647a1 → dv_flow_mgr-0.0.1.12750690879a1}/tests/unit/test_smoke.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: dv-flow-mgr
3
- Version: 0.0.1.12703462647a1
3
+ Version: 0.0.1.12750690879a1
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
@@ -18,6 +18,12 @@ are evaluated.
18
18
  - Package "uses" (type/inheritance)
19
19
  - Task "with"-data definition (tasks can add their own parameters)
20
20
  - Task Groups / Sub-DAG
21
+ - Coarse/fine-grained dependency management
22
+ - Mark task dependency as having a "coarse" requirement. Causes
23
+ the task to be run if it hasn't been run already. Doesn't perform
24
+ exhaustive analysis.
25
+ - Maybe allow subtree dependency analysis? Single analysis point to
26
+ determine up-to-date status on a whole collection of source
21
27
 
22
28
  ## 3.0.0
23
29
  - JQ-based data extraction
@@ -73,3 +79,17 @@ are evaluated.
73
79
  ## 5.0.0
74
80
  - Need some form of site settings
75
81
 
82
+
83
+ # Core Principles
84
+ - Relevant DAG can be constructed statically
85
+ - Tasks are not inferred based on dataflow content
86
+ - Tasks may be created based on statically-available data
87
+ - Dataflow is dynamically typed (union of content)
88
+ - Tasks pass-through filesets that are not relevant for them
89
+ - Enables injecting new data when convenient, even if it won't be used until later
90
+ - Can have 'filter' tasks if there is a need to clean-up
91
+ - Dependency analysis is not delegated
92
+ - Allows static DAG construction
93
+ - Extensible -- by users and organizations
94
+ - Implementation independent (not tied to a specific implementation language)
95
+
@@ -14,7 +14,8 @@ author = 'Matthew Ballance'
14
14
  # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
15
15
 
16
16
  extensions = [
17
- 'sphinx-jsonschema'
17
+ 'sphinx-jsonschema',
18
+ 'sphinxcontrib.mermaid'
18
19
  ]
19
20
 
20
21
  templates_path = ['_templates']
@@ -10,6 +10,18 @@ DV Flow Manager helps users capture the tasks and dataflow in their
10
10
  design and verification (DV) flows. You can think of DV Flow Manager as a
11
11
  sort of "make for silicon engineering".
12
12
 
13
+ .. mermaid::
14
+
15
+ flowchart TD
16
+ A[IP Fileset] --> B[Testbench]
17
+ C[VIP Fileset] --> D[Precompile]
18
+ D --> B
19
+ B --> E[SimImage]
20
+ E --> F[Test1]
21
+ E --> G[Test2]
22
+ E --> H[Test3]
23
+
24
+
13
25
 
14
26
  .. toctree::
15
27
  :maxdepth: 2
@@ -17,4 +29,3 @@ sort of "make for silicon engineering".
17
29
 
18
30
  quickstart
19
31
  reference
20
-
@@ -21,11 +21,16 @@ package:
21
21
  src: pypi
22
22
  - name: svdep
23
23
  url: https://github.com/fvutils/svdep.git
24
+ anonymous: True
25
+ - name: ply
26
+ src: pypi
24
27
  - name: pyyaml
25
28
  src: pypi
26
29
  - name: Sphinx
27
30
  src: pypi
28
31
  - name: sphinx-jsonschema
29
32
  src: pypi
33
+ - name: sphinxcontrib-mermaid
34
+ src: pypi
30
35
 
31
36
 
@@ -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.12703462647a1"
8
+ version = "0.0.1.12750690879a1"
9
9
  dependencies = [
10
10
  "pyyaml",
11
11
  "toposort",
@@ -22,14 +22,14 @@
22
22
  import pydantic.dataclasses as dc
23
23
  import json
24
24
  from pydantic import BaseModel
25
- from typing import Any, Dict, List
25
+ from typing import Any, Dict, List, Union
26
26
  from .package import Package
27
27
  from .package_import_spec import PackageImportSpec
28
28
  from .task_def import TaskDef
29
29
 
30
30
  class FragmentDef(BaseModel):
31
31
  tasks : List[TaskDef] = dc.Field(default_factory=list)
32
- imports : List[(str|PackageImportSpec)] = dc.Field(default_factory=list, alias="imports")
32
+ imports : List[Union[str,PackageImportSpec]] = dc.Field(default_factory=list, alias="imports")
33
33
  fragments: List[str] = dc.Field(default_factory=list)
34
34
 
35
35
  basedir : str = None
@@ -196,7 +196,7 @@ class Session(object):
196
196
  for file in os.listdir(dir):
197
197
  if os.path.isdir(os.path.join(dir, file)):
198
198
  self._load_fragment_dir(pkg, os.path.join(dir, file), file_s)
199
- elif os.path.isfile(os.path.join(dir, file)):
199
+ elif os.path.isfile(os.path.join(dir, file)) and file == "flow.yaml":
200
200
  self._load_fragment_file(pkg, os.path.join(dir, file), file_s)
201
201
 
202
202
  def _load_fragment_file(self, pkg : PackageDef, file : str, file_s : List[str]):
@@ -207,6 +207,7 @@ class Session(object):
207
207
 
208
208
  with open(file, "r") as fp:
209
209
  doc = yaml.load(fp, Loader=yaml.FullLoader)
210
+ print("doc: %s" % str(doc), flush=True)
210
211
  if "fragment" in doc.keys():
211
212
  # Merge the package definition
212
213
  frag = FragmentDef(**(doc["fragment"]))
@@ -152,15 +152,35 @@ class Task(object):
152
152
  awaitables = [dep.waitOutput() for dep in self.depends]
153
153
  deps_o = await asyncio.gather(*awaitables)
154
154
 
155
+ # Merge filesets. A fileset with the same
155
156
  print("deps_o: %s" % str(deps_o))
156
157
 
158
+ # First, merge the dep maps of all the inputs
159
+ deps_m = self.depends[0].output.deps.copy()
160
+ for deps in map(lambda d: d.deps, self.depends[1:]):
161
+ for k,v in deps.items():
162
+ if k in deps_m:
163
+ deps_m[k].add(v)
164
+ else:
165
+ deps_m[k] = set(v)
166
+
167
+ print("deps_m: %s" % str(deps_m))
168
+
157
169
  # Merge the output of the dependencies into a single input data
158
170
  # if len(self.depends) > 1:
159
171
  # raise Exception("TODO: handle >1 inputs")
160
172
 
173
+ # Now that we have a clean input object, we need
174
+ # to build the dep map
175
+
161
176
  input = self.depends[0].output.copy()
162
177
  else:
163
178
  input = TaskData()
179
+
180
+
181
+
182
+ # Mark the source of this data as being this task
183
+ input.src = self.name
164
184
 
165
185
  if not os.path.isdir(self.rundir):
166
186
  os.makedirs(self.rundir)
@@ -196,7 +216,7 @@ class Task(object):
196
216
 
197
217
  def setOutput(self, output : TaskData):
198
218
  self.output_set = True
199
- output.task_id = self.task_id
219
+ output.src = self.name
200
220
  self.output = output
201
221
  self.output_ev.set()
202
222
 
@@ -19,15 +19,31 @@
19
19
  #* Author:
20
20
  #*
21
21
  #****************************************************************************
22
+ import enum
22
23
  import pydantic.dataclasses as dc
23
24
  from pydantic import BaseModel
24
25
  from typing import Any, Dict, Set, List, Tuple
25
26
  from .fileset import FileSet
26
27
 
28
+ class TaskDataParamOpE(enum.Enum):
29
+ Set = enum.auto()
30
+ Append = enum.auto()
31
+ Prepend = enum.auto()
32
+ PathAppend = enum.auto()
33
+ PathPrepend = enum.auto()
34
+
35
+ class TaskDataParamOp(BaseModel):
36
+ op : TaskDataParamOpE
37
+ value : Any
38
+
39
+ class TaskDataParam(BaseModel):
40
+ value : Any
41
+ ops : List[TaskDataParamOp] = dc.Field(default_factory=list)
42
+
27
43
  class TaskData(BaseModel):
28
- task_id : int = -1
44
+ src : str = None
29
45
  params : Dict[str,Any] = dc.Field(default_factory=dict)
30
- deps : List['TaskData'] = dc.Field(default_factory=list)
46
+ deps : Dict[str,Set[str]] = dc.Field(default_factory=dict)
31
47
  changed : bool = False
32
48
 
33
49
  def hasParam(self, name: str) -> bool:
@@ -40,11 +56,12 @@ class TaskData(BaseModel):
40
56
  self.params[name] = value
41
57
 
42
58
  def addFileSet(self, fs : FileSet):
59
+ fs.src = self.src
43
60
  if "filesets" not in self.params:
44
61
  self.params["filesets"] = []
45
62
  self.params["filesets"].append(fs)
46
63
 
47
- def getFileSets(self, type : (str|Set[str])=None) -> List[FileSet]:
64
+ def getFileSets(self, type=None) -> List[FileSet]:
48
65
  ret = []
49
66
 
50
67
  if "filesets" in self.params:
@@ -56,7 +73,7 @@ class TaskData(BaseModel):
56
73
 
57
74
  def copy(self) -> 'TaskData':
58
75
  ret = TaskData()
59
- ret.task_id = self.task_id
76
+ ret.src = self.src
60
77
  ret.params = self.params.copy()
61
78
  for d in self.deps:
62
79
  ret.deps.append(d.clone())
@@ -21,7 +21,7 @@
21
21
  #****************************************************************************
22
22
  import pydantic.dataclasses as dc
23
23
  from pydantic import BaseModel
24
- from typing import Any, Dict, List, Tuple
24
+ from typing import Any, Dict, List, Union, Tuple
25
25
  from .task import Task
26
26
 
27
27
  @dc.dataclass
@@ -32,8 +32,8 @@ class TaskSpec(object):
32
32
  class TaskDef(BaseModel):
33
33
  """Holds definition information (ie the YAML view) for a task"""
34
34
  name : str
35
- type : (str|TaskSpec) = dc.Field(default_factory=list)
36
- depends : List[(str|TaskSpec)] = dc.Field(default_factory=list, alias="needs")
35
+ type : Union[str,TaskSpec] = dc.Field(default_factory=list)
36
+ depends : List[Union[str,TaskSpec]] = dc.Field(default_factory=list, alias="needs")
37
37
  params: Dict[str,Any] = dc.Field(default_factory=dict, alias="with")
38
38
 
39
39
  def copy(self) -> 'TaskDef':
@@ -15,7 +15,7 @@ from svdep import FileCollection, TaskCheckUpToDate, TaskBuildFileCollection
15
15
  class TaskVcsSimImage(VlTaskSimImage):
16
16
 
17
17
  def getRefTime(self):
18
- if os.path.isdir(os.path.join(self.rundir, 'simv')):
18
+ if os.path.isfile(os.path.join(self.rundir, 'simv')):
19
19
  return os.path.getmtime(os.path.join(self.rundir, 'simv'))
20
20
  else:
21
21
  raise Exception
@@ -11,7 +11,7 @@ from typing import List, Tuple
11
11
  class TaskVcsSimRun(Task):
12
12
 
13
13
  async def run(self, input : TaskData) -> TaskData:
14
- vl_fileset = input.getFileSets("simBinary")
14
+ vl_fileset = input.getFileSets("simDir")
15
15
 
16
16
  build_dir = vl_fileset[0].basedir
17
17
 
@@ -3,6 +3,7 @@ import fnmatch
3
3
  import dataclasses
4
4
  import shutil
5
5
  import pydantic.dataclasses as dc
6
+ from toposort import toposort
6
7
  from ....fileset import FileSet
7
8
  from ....package import TaskCtor
8
9
  from ....task import Task, TaskParams, TaskCtorT
@@ -31,9 +32,8 @@ class VlTaskSimImage(Task):
31
32
  incdirs = []
32
33
  memento = ex_memento
33
34
 
34
- vl_filesets = input.getFileSets(("verilogSource", "systemVerilogSource"))
35
- for file in vl_filesets[0].files:
36
- files.append(os.path.join(vl_filesets[0].basedir, file))
35
+
36
+ self._gatherSvSources(files, incdirs, input)
37
37
 
38
38
  if not in_changed:
39
39
  try:
@@ -61,6 +61,30 @@ class VlTaskSimImage(Task):
61
61
 
62
62
  self.setMemento(memento)
63
63
  return output
64
+
65
+ def _gatherSvSources(self, files, incdirs, input):
66
+ # input must represent dependencies for all tasks related to filesets
67
+ # references must support transitivity
68
+
69
+ vl_filesets = input.getFileSets(("verilogSource", "systemVerilogSource"))
70
+ fs_tasks = [fs.src for fs in vl_filesets]
71
+
72
+ # Want dependencies just for the filesets
73
+ # - key is the task associated with a filelist
74
+ # - deps is the dep-set of the on the incoming
75
+ #
76
+ # -> Send output set of dependencies
77
+ # - Task -> deps map
78
+ # "task" : ["dep1", "dep2", ...],
79
+ # "task2" :
80
+ # - All tasks are represented in the map
81
+ # -> Assume projects will often flatten before exporting
82
+
83
+ # Sort the deps
84
+ order = list(toposort(input.deps))
85
+
86
+ print("order: %s" % str(order))
87
+
64
88
 
65
89
 
66
90
  class VlTaskSimImageParams(TaskParams):
@@ -11,7 +11,7 @@ from typing import List, Tuple
11
11
  class TaskVltSimRun(Task):
12
12
 
13
13
  async def run(self, input : TaskData) -> TaskData:
14
- vl_fileset = input.getFileSets("simBinary")
14
+ vl_fileset = input.getFileSets("simDir")
15
15
 
16
16
  build_dir = vl_fileset[0].basedir
17
17
 
@@ -12,8 +12,9 @@ from typing import List, Tuple
12
12
  class TaskFileSet(Task):
13
13
 
14
14
  async def run(self, input : TaskData) -> TaskData:
15
- print("run: %s: base=%s type=%s include=%s" % (
15
+ print("TaskFileSet run: %s: basedir=%s, base=%s type=%s include=%s" % (
16
16
  self.name,
17
+ self.basedir,
17
18
  self.params.base, self.params.type, str(self.params.include)
18
19
  ))
19
20
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: dv-flow-mgr
3
- Version: 0.0.1.12703462647a1
3
+ Version: 0.0.1.12750690879a1
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