wavekit 0.8.0__tar.gz → 0.8.1__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.8.0 → wavekit-0.8.1}/PKG-INFO +1 -1
- {wavekit-0.8.0 → wavekit-0.8.1}/pyproject.toml +1 -1
- wavekit-0.8.0/src/wavekit/readers/expr_parser.py +0 -65
- {wavekit-0.8.0 → wavekit-0.8.1}/LICENSE +0 -0
- {wavekit-0.8.0 → wavekit-0.8.1}/README.md +0 -0
- {wavekit-0.8.0 → wavekit-0.8.1}/build_exts.py +0 -0
- {wavekit-0.8.0 → wavekit-0.8.1}/src/wavekit/__init__.py +0 -0
- {wavekit-0.8.0 → wavekit-0.8.1}/src/wavekit/expression.py +0 -0
- {wavekit-0.8.0 → wavekit-0.8.1}/src/wavekit/pattern/__init__.py +0 -0
- {wavekit-0.8.0 → wavekit-0.8.1}/src/wavekit/pattern/compiler.py +0 -0
- {wavekit-0.8.0 → wavekit-0.8.1}/src/wavekit/pattern/dsl.py +0 -0
- {wavekit-0.8.0 → wavekit-0.8.1}/src/wavekit/pattern/errors.py +0 -0
- {wavekit-0.8.0 → wavekit-0.8.1}/src/wavekit/pattern/result.py +0 -0
- {wavekit-0.8.0 → wavekit-0.8.1}/src/wavekit/pattern/runtime.py +0 -0
- {wavekit-0.8.0 → wavekit-0.8.1}/src/wavekit/pattern/steps.py +0 -0
- {wavekit-0.8.0 → wavekit-0.8.1}/src/wavekit/readers/__init__.py +0 -0
- {wavekit-0.8.0 → wavekit-0.8.1}/src/wavekit/readers/base.py +0 -0
- {wavekit-0.8.0 → wavekit-0.8.1}/src/wavekit/readers/clock_domain.py +0 -0
- {wavekit-0.8.0 → wavekit-0.8.1}/src/wavekit/readers/fsdb/__init__.py +0 -0
- {wavekit-0.8.0 → wavekit-0.8.1}/src/wavekit/readers/fsdb/npi_fsdb.pxd +0 -0
- {wavekit-0.8.0 → wavekit-0.8.1}/src/wavekit/readers/fsdb/npi_fsdb_reader.pyx +0 -0
- {wavekit-0.8.0 → wavekit-0.8.1}/src/wavekit/readers/fsdb/reader.py +0 -0
- {wavekit-0.8.0 → wavekit-0.8.1}/src/wavekit/readers/fst/__init__.py +0 -0
- {wavekit-0.8.0 → wavekit-0.8.1}/src/wavekit/readers/fst/reader.py +0 -0
- {wavekit-0.8.0 → wavekit-0.8.1}/src/wavekit/readers/hierarchy.py +0 -0
- {wavekit-0.8.0 → wavekit-0.8.1}/src/wavekit/readers/matcher.py +0 -0
- {wavekit-0.8.0 → wavekit-0.8.1}/src/wavekit/readers/range.py +0 -0
- {wavekit-0.8.0 → wavekit-0.8.1}/src/wavekit/readers/value_change.pyx +0 -0
- {wavekit-0.8.0 → wavekit-0.8.1}/src/wavekit/readers/vcd/__init__.py +0 -0
- {wavekit-0.8.0 → wavekit-0.8.1}/src/wavekit/readers/vcd/reader.py +0 -0
- {wavekit-0.8.0 → wavekit-0.8.1}/src/wavekit/readers/wellen/__init__.py +0 -0
- {wavekit-0.8.0 → wavekit-0.8.1}/src/wavekit/readers/wellen/reader.py +0 -0
- {wavekit-0.8.0 → wavekit-0.8.1}/src/wavekit/waveform.py +0 -0
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import re
|
|
4
|
-
|
|
5
|
-
# Matches a waveform signal path token in an expression.
|
|
6
|
-
# A valid path is one of:
|
|
7
|
-
# - Starts with $$ or $ (module search)
|
|
8
|
-
# - Starts with @ (regex pattern)
|
|
9
|
-
# - Contains at least one . separator (hierarchical path)
|
|
10
|
-
#
|
|
11
|
-
# Path structure:
|
|
12
|
-
# [$$|$|@] first_ident (.segment[{brace}])* ([N:M]|[N])?
|
|
13
|
-
#
|
|
14
|
-
# The trailing [N:M] / [N] is consumed as the signal range (not a bit-slice).
|
|
15
|
-
# Any further [N:M] after the placeholder in the resulting expression will be
|
|
16
|
-
# handled as a Python subscript on the Waveform object (i.e. bit-slicing).
|
|
17
|
-
_WAVE_PATH_RE = re.compile(
|
|
18
|
-
r'(?P<path>'
|
|
19
|
-
r'(?:[$]{1,2}|@)?' # optional prefix $$ / $ / @
|
|
20
|
-
r'(?:[A-Za-z_][A-Za-z0-9_]*)' # first identifier segment
|
|
21
|
-
r'(?:[.][A-Za-z_][A-Za-z0-9_{}.,]*)*' # dot-separated segments (allow braces, no [ ])
|
|
22
|
-
r'(?:\[\d+(?::\d+)?\])?' # optional trailing [N:M] or [N] range
|
|
23
|
-
r')'
|
|
24
|
-
)
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
def _is_wave_path(token: str) -> bool:
|
|
28
|
-
"""Return True if token looks like a waveform signal path."""
|
|
29
|
-
if token.startswith('$') or token.startswith('@'):
|
|
30
|
-
return True
|
|
31
|
-
# Must contain a dot (hierarchy) but not look like a floating-point literal
|
|
32
|
-
if '.' in token:
|
|
33
|
-
try:
|
|
34
|
-
float(token)
|
|
35
|
-
return False # it's a numeric literal like "1.0"
|
|
36
|
-
except ValueError:
|
|
37
|
-
return True
|
|
38
|
-
return False
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
def extract_wave_paths(expr: str) -> tuple[str, list[tuple[str, str]]]:
|
|
42
|
-
"""Parse *expr* and replace wave path tokens with placeholder identifiers.
|
|
43
|
-
|
|
44
|
-
Returns
|
|
45
|
-
-------
|
|
46
|
-
substituted_expr : str
|
|
47
|
-
The expression with every wave path replaced by ``__wave_N__``.
|
|
48
|
-
paths : list of (placeholder, original_path)
|
|
49
|
-
The ordered list of substitutions made.
|
|
50
|
-
"""
|
|
51
|
-
paths: list[tuple[str, str]] = []
|
|
52
|
-
counter = 0
|
|
53
|
-
|
|
54
|
-
def replacer(m: re.Match) -> str:
|
|
55
|
-
nonlocal counter
|
|
56
|
-
token = m.group('path')
|
|
57
|
-
if not _is_wave_path(token):
|
|
58
|
-
return token
|
|
59
|
-
placeholder = f'__wave_{counter}__'
|
|
60
|
-
paths.append((placeholder, token))
|
|
61
|
-
counter += 1
|
|
62
|
-
return placeholder
|
|
63
|
-
|
|
64
|
-
substituted = _WAVE_PATH_RE.sub(replacer, expr)
|
|
65
|
-
return substituted, paths
|
|
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
|
|
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
|