wavekit 0.5.2__tar.gz → 0.5.4__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.
- {wavekit-0.5.2 → wavekit-0.5.4}/PKG-INFO +1 -1
- {wavekit-0.5.2 → wavekit-0.5.4}/pyproject.toml +1 -1
- {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/__init__.py +29 -5
- {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/readers/fsdb/npi_fsdb_reader.pyx +4 -2
- {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/readers/fsdb/reader.py +13 -9
- {wavekit-0.5.2 → wavekit-0.5.4}/LICENSE +0 -0
- {wavekit-0.5.2 → wavekit-0.5.4}/README.md +0 -0
- {wavekit-0.5.2 → wavekit-0.5.4}/build.py +0 -0
- {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/pattern/__init__.py +0 -0
- {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/pattern/dsl.py +0 -0
- {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/pattern/engine.py +0 -0
- {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/pattern/instance.py +0 -0
- {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/pattern/result.py +0 -0
- {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/pattern/steps.py +0 -0
- {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/readers/base.py +0 -0
- {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/readers/expr_parser.py +0 -0
- {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/readers/fsdb/npi_fsdb.pxd +0 -0
- {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/readers/pattern_parser.py +0 -0
- {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/readers/value_change.pyx +0 -0
- {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/readers/vcd/reader.py +0 -0
- {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/scope.py +0 -0
- {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/signal.py +0 -0
- {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/waveform.py +0 -0
|
@@ -34,11 +34,35 @@ __all__ = [
|
|
|
34
34
|
'MatchResult',
|
|
35
35
|
'MatchStatus',
|
|
36
36
|
'PatternError',
|
|
37
|
+
'has_fsdb_support',
|
|
37
38
|
]
|
|
38
39
|
|
|
39
|
-
|
|
40
|
-
|
|
40
|
+
# Detect if FSDB support is available (compiled with VERDI_HOME)
|
|
41
|
+
import importlib.util
|
|
42
|
+
|
|
43
|
+
_fsdb_available = (
|
|
44
|
+
importlib.util.find_spec('.readers.fsdb.npi_fsdb_reader', package=__name__) is not None
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def has_fsdb_support() -> bool:
|
|
49
|
+
"""Check if FsdbReader is available in the current installation."""
|
|
50
|
+
return _fsdb_available
|
|
41
51
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
52
|
+
|
|
53
|
+
class _FsdbReaderStub:
|
|
54
|
+
"""Placeholder that raises an error when FsdbReader is used without Verdi support."""
|
|
55
|
+
|
|
56
|
+
def __init__(self, *args, **kwargs):
|
|
57
|
+
raise RuntimeError(
|
|
58
|
+
'FsdbReader requires Verdi to be installed and configured.\n\n'
|
|
59
|
+
'1. Set VERDI_HOME environment variable to your Verdi installation path.\n'
|
|
60
|
+
'2. Reinstall wavekit:\n'
|
|
61
|
+
' pip install --force-reinstall --no-cache-dir --no-deps wavekit'
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
if _fsdb_available:
|
|
66
|
+
from .readers.fsdb.reader import FsdbReader as FsdbReader
|
|
67
|
+
else:
|
|
68
|
+
FsdbReader = _FsdbReaderStub # type: ignore[assignment]
|
|
@@ -162,8 +162,10 @@ cdef class NpiFsdbScope:
|
|
|
162
162
|
assert self.scope_handle != NULL
|
|
163
163
|
return npi_fsdb_scope_property_str(npiFsdbScopeType, self.scope_handle).decode('ascii')
|
|
164
164
|
|
|
165
|
-
def def_name(self) -> str:
|
|
166
|
-
|
|
165
|
+
def def_name(self) -> str | None:
|
|
166
|
+
"""Return the module definition name, or None if this scope is not a module."""
|
|
167
|
+
if self.type() != 'npiFsdbScopeSvModule':
|
|
168
|
+
return None
|
|
167
169
|
return npi_fsdb_scope_property_str(npiFsdbScopeDefName, self.scope_handle).decode('ascii')
|
|
168
170
|
|
|
169
171
|
|
|
@@ -101,17 +101,15 @@ class FsdbScope(Scope):
|
|
|
101
101
|
def child_scope_list(self) -> Sequence[Scope]:
|
|
102
102
|
return [FsdbScope(c, self, self.reader) for c in self._npi_scope.child_scope_list()]
|
|
103
103
|
|
|
104
|
-
@
|
|
104
|
+
@cached_property
|
|
105
105
|
def type(self) -> str:
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
return self._type
|
|
106
|
+
"""Return the NPI scope type string, e.g. 'npiFsdbScopeSvModule'."""
|
|
107
|
+
return self._npi_scope.type()
|
|
109
108
|
|
|
110
|
-
@
|
|
109
|
+
@cached_property
|
|
111
110
|
def def_name(self) -> str | None:
|
|
112
|
-
if not
|
|
113
|
-
|
|
114
|
-
return self._def_name
|
|
111
|
+
"""Return the module definition name, or None if this scope is not a module."""
|
|
112
|
+
return self._npi_scope.def_name()
|
|
115
113
|
|
|
116
114
|
def find_scope_by_module(self, module_name: str, depth: int = 0) -> list[Scope]:
|
|
117
115
|
if not hasattr(self, '_preloaded_module_scope'):
|
|
@@ -140,7 +138,13 @@ class FsdbReader(Reader):
|
|
|
140
138
|
import os
|
|
141
139
|
import sys
|
|
142
140
|
|
|
143
|
-
|
|
141
|
+
verdi_home = os.environ.get('VERDI_HOME')
|
|
142
|
+
if verdi_home is None:
|
|
143
|
+
raise RuntimeError(
|
|
144
|
+
'VERDI_HOME environment variable is not set.\n'
|
|
145
|
+
'Please set VERDI_HOME to your Verdi installation path.'
|
|
146
|
+
)
|
|
147
|
+
rel_lib_path = verdi_home + '/share/NPI/python'
|
|
144
148
|
sys.path.append(os.path.abspath(rel_lib_path))
|
|
145
149
|
FsdbReader.pynpi['npisys'] = importlib.import_module('pynpi.npisys')
|
|
146
150
|
FsdbReader.pynpi['waveform'] = importlib.import_module('pynpi.waveform')
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|