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.
Files changed (23) hide show
  1. {wavekit-0.5.2 → wavekit-0.5.4}/PKG-INFO +1 -1
  2. {wavekit-0.5.2 → wavekit-0.5.4}/pyproject.toml +1 -1
  3. {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/__init__.py +29 -5
  4. {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/readers/fsdb/npi_fsdb_reader.pyx +4 -2
  5. {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/readers/fsdb/reader.py +13 -9
  6. {wavekit-0.5.2 → wavekit-0.5.4}/LICENSE +0 -0
  7. {wavekit-0.5.2 → wavekit-0.5.4}/README.md +0 -0
  8. {wavekit-0.5.2 → wavekit-0.5.4}/build.py +0 -0
  9. {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/pattern/__init__.py +0 -0
  10. {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/pattern/dsl.py +0 -0
  11. {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/pattern/engine.py +0 -0
  12. {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/pattern/instance.py +0 -0
  13. {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/pattern/result.py +0 -0
  14. {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/pattern/steps.py +0 -0
  15. {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/readers/base.py +0 -0
  16. {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/readers/expr_parser.py +0 -0
  17. {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/readers/fsdb/npi_fsdb.pxd +0 -0
  18. {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/readers/pattern_parser.py +0 -0
  19. {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/readers/value_change.pyx +0 -0
  20. {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/readers/vcd/reader.py +0 -0
  21. {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/scope.py +0 -0
  22. {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/signal.py +0 -0
  23. {wavekit-0.5.2 → wavekit-0.5.4}/src/wavekit/waveform.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wavekit
3
- Version: 0.5.2
3
+ Version: 0.5.4
4
4
  Summary: a fundamental package for digital circuit waveform analysis
5
5
  License-File: LICENSE
6
6
  Author: cxzzzz
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "wavekit"
3
- version = "0.5.2"
3
+ version = "0.5.4"
4
4
  description = "a fundamental package for digital circuit waveform analysis"
5
5
  authors = ["cxzzzz <cxz19961010@outlook.com>"]
6
6
  readme = "README.md"
@@ -34,11 +34,35 @@ __all__ = [
34
34
  'MatchResult',
35
35
  'MatchStatus',
36
36
  'PatternError',
37
+ 'has_fsdb_support',
37
38
  ]
38
39
 
39
- try:
40
- from .readers.fsdb.reader import FsdbReader as FsdbReader
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
- __all__.append('FsdbReader')
43
- except ImportError:
44
- pass
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
- assert self.scope_handle != NULL
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
- @property
104
+ @cached_property
105
105
  def type(self) -> str:
106
- if not hasattr(self, '_type'):
107
- self._type = self._npi_scope.type()
108
- return self._type
106
+ """Return the NPI scope type string, e.g. 'npiFsdbScopeSvModule'."""
107
+ return self._npi_scope.type()
109
108
 
110
- @property
109
+ @cached_property
111
110
  def def_name(self) -> str | None:
112
- if not hasattr(self, '_def_name'):
113
- self._def_name = self._npi_scope.def_name()
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
- rel_lib_path = os.environ['VERDI_HOME'] + '/share/NPI/python'
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