dv-flow-mgr 1.0.0.14502079593a1__py3-none-any.whl → 1.0.0.14528489065a1__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/package.py CHANGED
@@ -24,6 +24,7 @@ import logging
24
24
  from typing import Any, ClassVar, Dict, List
25
25
  from .fragment_def import FragmentDef
26
26
  from .package_def import PackageDef
27
+ from .srcinfo import SrcInfo
27
28
  from .task import Task
28
29
 
29
30
  @dc.dataclass
@@ -37,6 +38,7 @@ class Package(object):
37
38
  types : Dict[str,Any] = dc.field(default_factory=dict)
38
39
  fragment_def_l : List[FragmentDef] = dc.field(default_factory=list)
39
40
  pkg_m : Dict[str, 'Package'] = dc.field(default_factory=dict)
41
+ srcinfo : SrcInfo = None
40
42
  _log : ClassVar = logging.getLogger("Package")
41
43
 
42
44
  @property
@@ -66,4 +68,59 @@ class Package(object):
66
68
 
67
69
  def __hash__(self):
68
70
  return id(self)
71
+
72
+ def to_json(self, markers=None) -> dict:
73
+ """Convert package data to a JSON-compatible dictionary format.
74
+
75
+ Args:
76
+ markers: Optional list of marker objects, each with 'msg' and 'severity' attributes
77
+
78
+ Returns:
79
+ dict: Dictionary containing required package data and markers
80
+ """
81
+ # Collect all imported packages recursively
82
+ imports = set()
83
+ def collect_imports(pkg):
84
+ for name, p in pkg.pkg_m.items():
85
+ if name not in imports:
86
+ imports.add(name)
87
+ collect_imports(p)
88
+ collect_imports(self)
89
+
90
+ # Get files from fragments
91
+ files = []
92
+ for frag in self.fragment_def_l:
93
+ if frag.srcinfo and frag.srcinfo.file:
94
+ files.append(frag.srcinfo.file)
69
95
 
96
+ def format_srcinfo(srcinfo):
97
+ if srcinfo:
98
+ ret = srcinfo.file
99
+ if srcinfo.lineno != -1:
100
+ ret += ":" + str(srcinfo.lineno)
101
+ if srcinfo.linepos != -1:
102
+ ret += ":" + str(srcinfo.linepos)
103
+ return ret
104
+ return None
105
+ result = {
106
+ "name": self.name,
107
+ "file": self.srcinfo.file if self.srcinfo else None,
108
+ "imports": sorted(list(imports)),
109
+ "files": files,
110
+ "markers": [],
111
+ "tasks": [
112
+ {
113
+ "name": name,
114
+ "srcinfo": format_srcinfo(task.srcinfo)
115
+ }
116
+ for name, task in self.task_m.items()
117
+ ]
118
+ }
119
+
120
+ if markers:
121
+ result["markers"] = [
122
+ {"msg": marker.msg, "severity": marker.severity}
123
+ for marker in markers
124
+ ]
125
+
126
+ return result
@@ -11,6 +11,7 @@ from .fragment_def import FragmentDef
11
11
  from .package_def import PackageDef
12
12
  from .package import Package
13
13
  from .ext_rgy import ExtRgy
14
+ from .srcinfo import SrcInfo
14
15
  from .task import Task
15
16
  from .task_def import TaskDef, PassthroughE, ConsumesE, RundirE
16
17
  from .task_data import TaskMarker, TaskMarkerLoc, SeverityE
@@ -60,6 +61,7 @@ class LoaderScope(SymbolScope):
60
61
  else:
61
62
  path = self.loader.pkg_rgy.findPackagePath(pkg_name)
62
63
  if path is not None:
64
+ path = os.path.normpath(path)
63
65
  pkg = self.loader._loadPackage(path)
64
66
  self.loader._pkg_m[pkg_name] = pkg
65
67
  if pkg is not None and name in pkg.task_m.keys():
@@ -169,6 +171,7 @@ class PackageLoader(object):
169
171
 
170
172
  def load(self, root) -> Package:
171
173
  self._log.debug("--> load %s" % root)
174
+ root = os.path.normpath(root)
172
175
  ret = self._loadPackage(root, None)
173
176
  self._log.debug("<-- load %s" % root)
174
177
  return ret
@@ -183,6 +186,7 @@ class PackageLoader(object):
183
186
  pp = self.pkg_rgy.findPackagePath(nn)
184
187
  if pp is None:
185
188
  raise Exception("Package %s not found" % nn)
189
+ root = os.path.normpath(pp)
186
190
  pp_n = self._loadPackage(pp)
187
191
  pkg.pkg_m[pp_n.name] = pp_n
188
192
  self._log.debug("<-- load_rgy %s" % name)
@@ -227,15 +231,21 @@ class PackageLoader(object):
227
231
  # t.fullname = pkg.name + "." + t.name
228
232
 
229
233
  except pydantic.ValidationError as e:
230
- print("Errors: %s" % root)
234
+ # print("Errors: %s" % root)
231
235
  error_paths = []
232
236
  loc = None
237
+ loc_s = ""
233
238
  for ee in e.errors():
234
239
  # print(" Error: %s" % str(ee))
235
240
  obj = doc["package"]
236
241
  loc = None
242
+ print("Errors: %s" % str(ee))
237
243
  for el in ee['loc']:
238
- print("el: %s" % str(el))
244
+ # print("el: %s" % str(el))
245
+ if loc_s != "":
246
+ loc_s += "." + str(el)
247
+ else:
248
+ loc_s = str(el)
239
249
  obj = obj[el]
240
250
  if type(obj) == dict and 'srcinfo' in obj.keys():
241
251
  loc = obj['srcinfo']
@@ -251,7 +261,11 @@ class PackageLoader(object):
251
261
  severity=SeverityE.Error,
252
262
  loc=marker_loc)
253
263
  else:
254
- marker = TaskMarker(msg=ee['msg'])
264
+ marker_loc = TaskMarkerLoc(path=root)
265
+ marker = TaskMarker(
266
+ msg=("%s (at '%s')" % (ee['msg'], loc_s)),
267
+ severity=SeverityE.Error,
268
+ loc=marker_loc)
255
269
  self.marker(marker)
256
270
 
257
271
  if pkg_def is not None:
@@ -265,28 +279,34 @@ class PackageLoader(object):
265
279
 
266
280
  def _mkPackage(self, pkg_def : PackageDef, root : str) -> Package:
267
281
  self._log.debug("--> _mkPackage %s" % pkg_def.name)
268
- pkg = Package(pkg_def, os.path.dirname(root))
269
-
270
- pkg_scope = self.package_scope()
271
- if pkg_scope is not None:
272
- self._log.debug("Add self (%s) as a subpkg of %s" % (pkg.name, pkg_scope.pkg.name))
273
- pkg_scope.pkg.pkg_m[pkg.name] = pkg
282
+ pkg = Package(
283
+ pkg_def,
284
+ os.path.dirname(root),
285
+ srcinfo=SrcInfo(file=root))
274
286
 
275
287
  if pkg.name in self._pkg_m.keys():
276
- raise Exception("Duplicate package %s" % pkg.name)
288
+ epkg = self._pkg_m[pkg.name]
289
+ if epkg.srcinfo.file != pkg.srcinfo.file:
290
+ self.error("Package %s already loaded from %s. Duplicate defined in %s" % (
291
+ pkg.name, epkg.srcinfo.file, pkg.srcinfo.file))
292
+ else:
293
+ pkg_scope = self.package_scope()
294
+ if pkg_scope is not None:
295
+ self._log.debug("Add self (%s) as a subpkg of %s" % (pkg.name, pkg_scope.pkg.name))
296
+ pkg_scope.pkg.pkg_m[pkg.name] = pkg
277
297
 
278
- self._pkg_m[pkg.name] = pkg
279
- self._pkg_s.append(PackageScope(name=pkg.name, pkg=pkg, loader=self._loader_scope))
280
- # Imports are loaded first
281
- self._loadPackageImports(pkg, pkg_def.imports, pkg.basedir)
298
+ self._pkg_m[pkg.name] = pkg
299
+ self._pkg_s.append(PackageScope(name=pkg.name, pkg=pkg, loader=self._loader_scope))
300
+ # Imports are loaded first
301
+ self._loadPackageImports(pkg, pkg_def.imports, pkg.basedir)
282
302
 
283
- taskdefs = pkg_def.tasks.copy()
303
+ taskdefs = pkg_def.tasks.copy()
284
304
 
285
- self._loadFragments(pkg, pkg_def.fragments, pkg.basedir, taskdefs)
305
+ self._loadFragments(pkg, pkg_def.fragments, pkg.basedir, taskdefs)
286
306
 
287
- self._loadTasks(pkg, taskdefs, pkg.basedir)
307
+ self._loadTasks(pkg, taskdefs, pkg.basedir)
288
308
 
289
- self._pkg_s.pop()
309
+ self._pkg_s.pop()
290
310
 
291
311
  self._log.debug("<-- _mkPackage %s (%s)" % (pkg_def.name, pkg.name))
292
312
  return pkg
@@ -343,6 +363,7 @@ class PackageLoader(object):
343
363
  sub_pkg = self._pkg_path_m[imp_path]
344
364
  else:
345
365
  self._log.info("Loading imported file %s" % imp_path)
366
+ imp_path = os.path.normpath(imp_path)
346
367
  sub_pkg = self._loadPackage(imp_path)
347
368
  self._log.info("Loaded imported package %s" % sub_pkg.name)
348
369
 
@@ -701,10 +722,10 @@ class PackageLoader(object):
701
722
 
702
723
  def error(self, msg, loc=None):
703
724
  if loc is not None:
704
- marker = TaskMarker(msg=msg, severity=TaskMarker.SeverityE.Error,
725
+ marker = TaskMarker(msg=msg, severity=SeverityE.Error,
705
726
  loc=loc)
706
727
  else:
707
- marker = TaskMarker(msg=msg, severity=TaskMarker.SeverityE.Error)
728
+ marker = TaskMarker(msg=msg, severity=SeverityE.Error)
708
729
  self.marker(marker)
709
730
 
710
731
  def marker(self, marker):
@@ -1,6 +1,7 @@
1
1
  import argparse
2
2
  import logging
3
3
  from .cmds.cmd_schema import CmdSchema
4
+ from .cmds.cmd_workspace import CmdWorkspace
4
5
 
5
6
  def get_parser():
6
7
  parser = argparse.ArgumentParser(description="dv-flow-mgr.util")
@@ -16,6 +17,10 @@ def get_parser():
16
17
  default="-")
17
18
  schema.set_defaults(f=CmdSchema())
18
19
 
20
+ workspace = subparsers.add_parser('workspace',
21
+ help='Dumps the workspace structure in JSON')
22
+ workspace.set_defaults(f=CmdWorkspace())
23
+
19
24
  return parser
20
25
 
21
26
 
@@ -0,0 +1,34 @@
1
+ import json
2
+ import os
3
+ from ...package import Package
4
+ from ...util.util import loadProjPkgDef
5
+
6
+ class CmdWorkspace(object):
7
+
8
+ def __call__(self, args):
9
+
10
+ pkg : Package = None
11
+ markers = None
12
+
13
+ if os.path.isfile(os.path.join(os.getcwd(), "flow.dv")):
14
+ markers = []
15
+ def marker(m):
16
+ nonlocal markers
17
+ print("marker: %s" % str(m))
18
+ markers.append(m)
19
+ pkg = loadProjPkgDef(os.getcwd(), marker)
20
+
21
+
22
+ if pkg is None and markers is None:
23
+ print("{abc}")
24
+ elif pkg is not None:
25
+ print(json.dumps(pkg.to_json(markers)))
26
+ else:
27
+ result = {}
28
+ result["markers"] = [
29
+ {"msg": marker.msg, "severity": str(marker.severity)}
30
+ for marker in markers
31
+ ]
32
+ print(json.dumps(result))
33
+
34
+ pass
dv_flow/mgr/util/util.py CHANGED
@@ -33,7 +33,7 @@ def loadProjPkgDef(path, listener=None):
33
33
  with open(os.path.join(dir, "flow.dv")) as f:
34
34
  data = yaml.load(f, Loader=yaml.FullLoader)
35
35
  if "package" in data.keys():
36
- listeners = [listener] if listener is None else []
36
+ listeners = [listener] if listener is not None else []
37
37
  ret = PackageLoader(marker_listeners=listeners).load(os.path.join(dir, "flow.dv"))
38
38
  break
39
39
  dir = os.path.dirname(dir)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dv-flow-mgr
3
- Version: 1.0.0.14502079593a1
3
+ Version: 1.0.0.14528489065a1
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
@@ -15,10 +15,10 @@ dv_flow/mgr/listener_list.py,sha256=BfqvEO2AyJvyc4ClU-hPgDPqWSlqvSdG-yaFEHvUrMc,
15
15
  dv_flow/mgr/need_def.py,sha256=X52FJnhukwFsGCkIM-W6apZEdxqS5Gmm-rRO-TS83aU,173
16
16
  dv_flow/mgr/null_callable.py,sha256=x6hlJ9EL6xFLSGFgd14eXbxSWxsUGF56jpbLhERjPtg,243
17
17
  dv_flow/mgr/out,sha256=d8GGBi3J43fhdLBlnsUbzBfRe0TD0QTP3nOTz54l2bI,200
18
- dv_flow/mgr/package.py,sha256=PvOuNfuy-SlaiMDzT5SU48OlPJrhS9vpNCgX06KNyTo,2336
18
+ dv_flow/mgr/package.py,sha256=11R-bkr9q8eKXET9t7MstCo4s_fKLROp3lzCka08vzg,4252
19
19
  dv_flow/mgr/package_def.py,sha256=-UyeFb_0Sj16RtS2vxtIxTfl-oW7adJjM1I3ZSjcRpc,5729
20
20
  dv_flow/mgr/package_import_spec.py,sha256=aZMpnS9a5NFY76_pYXEuO3-Mkc_xFzy73fdrUe_54Dc,1760
21
- dv_flow/mgr/package_loader.py,sha256=2qZ9jrqJJ_ChNb8bIwpuFpxW1qHrmZ3LoKoRc3MYsy0,25380
21
+ dv_flow/mgr/package_loader.py,sha256=7k85_5Q6fvj0Q6dIiEuXWJPrg6Cs55qtzvvDjIO5lHA,26348
22
22
  dv_flow/mgr/param.py,sha256=kkxMRGf6mPjSZJsjgLKH2vJL62Sn0ZESvjBLkEYOp20,1386
23
23
  dv_flow/mgr/param_def.py,sha256=hOBBRLiXJ5DakXkhrLCBAQ9GPlgq-QS52r0aflmIgbg,1832
24
24
  dv_flow/mgr/param_ref_eval.py,sha256=5yH37oIX6f2qmk7GfRgNT5qZx0jm3CJFgB9lLDZZ1yQ,1981
@@ -62,13 +62,14 @@ dv_flow/mgr/std/flow.dv,sha256=YXcbELBExqcQirSKQJ_yt6JlxyaOphP-EL09zXppaAs,4164
62
62
  dv_flow/mgr/std/message.py,sha256=0JHLErg8whqMLAasG1fumZ2O7R7WNWeNQ9ibJaLDpVY,1029
63
63
  dv_flow/mgr/std/task_null.py,sha256=dw6LXBXVwth6gLPeduDvlz5znAhcVpDH8r1DticD-0w,1041
64
64
  dv_flow/mgr/util/__init__.py,sha256=6uuA6z5cKS2hcjJw6YyEM2M79g6OpXb6tZF_Gku-AGU,22
65
- dv_flow/mgr/util/__main__.py,sha256=F0LXpCDpYTPalSo0dc1h_qZkip5v1AZYYh-vcYbh5s0,983
66
- dv_flow/mgr/util/util.py,sha256=cBNt3JJ0PGLlUQFTtBLi12i2j_9gNgSBtKdwS3VfF5Y,1566
65
+ dv_flow/mgr/util/__main__.py,sha256=ioXQ-IMZctzYysJM4RswuPWNSRxtPxzEcG5hutp3Cd4,1210
66
+ dv_flow/mgr/util/util.py,sha256=moHKw_je5pU2ZCfSuFVyiBznFL5q2etTLf70cgCDJ0o,1570
67
67
  dv_flow/mgr/util/cmds/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
68
68
  dv_flow/mgr/util/cmds/cmd_schema.py,sha256=IJzZdxCSEgIQ79LpYiM7UqJ9RJ-7yraqmBN2XVgAgXA,1752
69
- dv_flow_mgr-1.0.0.14502079593a1.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
70
- dv_flow_mgr-1.0.0.14502079593a1.dist-info/METADATA,sha256=TgIMi-Dm8e9VfinDzIARWuEZiN7vIijuWbAYAjdeL-E,13336
71
- dv_flow_mgr-1.0.0.14502079593a1.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
72
- dv_flow_mgr-1.0.0.14502079593a1.dist-info/entry_points.txt,sha256=1roy8wAFM48LabOvr6jiOw0MUs-qE8X3Vf8YykPazxk,50
73
- dv_flow_mgr-1.0.0.14502079593a1.dist-info/top_level.txt,sha256=amfVTkggzYPtWwLqNmRukfz1Buu0pGS2SrYBBLhXm04,8
74
- dv_flow_mgr-1.0.0.14502079593a1.dist-info/RECORD,,
69
+ dv_flow/mgr/util/cmds/cmd_workspace.py,sha256=egmaIXpe5L-TePwmcfisfrG6tdiTUWSjqa9Za5WChVs,890
70
+ dv_flow_mgr-1.0.0.14528489065a1.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
71
+ dv_flow_mgr-1.0.0.14528489065a1.dist-info/METADATA,sha256=MTnLotpOD2Jsur0qkaPp62A8K-VVPce112cD4XcSEj4,13336
72
+ dv_flow_mgr-1.0.0.14528489065a1.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
73
+ dv_flow_mgr-1.0.0.14528489065a1.dist-info/entry_points.txt,sha256=1roy8wAFM48LabOvr6jiOw0MUs-qE8X3Vf8YykPazxk,50
74
+ dv_flow_mgr-1.0.0.14528489065a1.dist-info/top_level.txt,sha256=amfVTkggzYPtWwLqNmRukfz1Buu0pGS2SrYBBLhXm04,8
75
+ dv_flow_mgr-1.0.0.14528489065a1.dist-info/RECORD,,