from enum import Enum
from typing import NamedTuple
[docs]class ScopeType(Enum):
"""Valid VCD scope types."""
begin = 'begin'
fork = 'fork'
function = 'function'
module = 'module'
task = 'task'
[docs]class VarType(Enum):
"""Valid VCD variable types."""
event = 'event'
integer = 'integer'
parameter = 'parameter'
real = 'real'
realtime = 'realtime'
reg = 'reg'
supply0 = 'supply0'
supply1 = 'supply1'
time = 'time'
tri = 'tri'
triand = 'triand'
trior = 'trior'
trireg = 'trireg'
tri0 = 'tri0'
tri1 = 'tri1'
wand = 'wand'
wire = 'wire'
wor = 'wor'
string = 'string'
def __str__(self) -> str:
return self.value
[docs]class TimescaleMagnitude(Enum):
"""Valid timescale magnitudes."""
one = 1
ten = 10
hundred = 100
[docs]class TimescaleUnit(Enum):
"""Valid timescale units."""
second = 's'
millisecond = 'ms'
microsecond = 'us'
nanosecond = 'ns'
picosecond = 'ps'
femtosecond = 'fs'
[docs]class Timescale(NamedTuple):
"""Timescale magnitude and unit."""
magnitude: TimescaleMagnitude
unit: TimescaleUnit
[docs] @classmethod
def from_str(cls, s: str) -> 'Timescale':
for unit in TimescaleUnit:
if s == unit.value:
mag = TimescaleMagnitude(1)
break
else:
for mag in reversed(TimescaleMagnitude):
mag_str = str(mag.value)
if s.startswith(mag_str):
unit_str = s[len(mag_str) :].lstrip(' ')
unit = TimescaleUnit(unit_str)
break
else:
raise ValueError(f'Invalid timescale magnitude {s!r}')
return Timescale(mag, unit)
def __str__(self) -> str:
return f'{self.magnitude.value} {self.unit.value}'