46 lines
1.2 KiB
Python
46 lines
1.2 KiB
Python
"""
|
|
Set of utilities to build a simple test suite.
|
|
"""
|
|
from amaranth import *
|
|
from amaranth.sim import *
|
|
|
|
from typing import Generator
|
|
import unittest
|
|
import os
|
|
|
|
from contextlib import nullcontext
|
|
|
|
class BaseTestClass(unittest.TestCase):
|
|
"""
|
|
Base test class that provides a run_test helper function to do all the nice things.
|
|
"""
|
|
|
|
def _run_test(self, test: Generator, name: str):
|
|
try:
|
|
sim = Simulator(self.harness)
|
|
except NameError:
|
|
raise NotImplementedError(f"Must define a self.harness module for TestCase {self.__class__.__name__}!")
|
|
|
|
sim.add_clock(100e-9)
|
|
sim.add_sync_process(test)
|
|
sim.reset()
|
|
|
|
# Pretty hacky way to pass this info in but does it look like I care?
|
|
if os.environ.get("TEST_SAVE_VCD"):
|
|
ctx = sim.write_vcd(f"vcd_out/{name}.vcd")
|
|
else:
|
|
ctx = nullcontext()
|
|
|
|
with ctx:
|
|
sim.run()
|
|
|
|
del sim
|
|
|
|
|
|
def provide_testcase_name(fn):
|
|
"""Decorator that provides a function with access to its own class and name."""
|
|
def wrapper(self):
|
|
fn(self, f"{self.__class__.__name__}.{fn.__name__}")
|
|
|
|
return wrapper
|