97 lines
3.1 KiB
Python
97 lines
3.1 KiB
Python
from collections.abc import Callable
|
|
|
|
from systemrdl.node import AddrmapNode
|
|
|
|
from peakrdl_busdecoder.decode_logic_gen import DecodeLogicFlavor, DecodeLogicGenerator
|
|
from peakrdl_busdecoder.design_state import DesignState
|
|
|
|
|
|
class TestDecodeLogicGenerator:
|
|
"""Test the DecodeLogicGenerator."""
|
|
|
|
def test_decode_logic_read(self, compile_rdl: Callable[..., AddrmapNode]) -> None:
|
|
"""Test decode logic generation for read operations."""
|
|
rdl_source = """
|
|
addrmap test {
|
|
reg {
|
|
field {
|
|
sw=rw;
|
|
hw=r;
|
|
} data[31:0];
|
|
} my_reg @ 0x0;
|
|
};
|
|
"""
|
|
top = compile_rdl(rdl_source, top="test")
|
|
|
|
ds = DesignState(top, {})
|
|
gen = DecodeLogicGenerator(ds, DecodeLogicFlavor.READ)
|
|
|
|
# Basic sanity check - it should initialize
|
|
assert gen is not None
|
|
assert gen._flavor == DecodeLogicFlavor.READ # type: ignore
|
|
|
|
def test_decode_logic_write(self, compile_rdl: Callable[..., AddrmapNode]) -> None:
|
|
"""Test decode logic generation for write operations."""
|
|
rdl_source = """
|
|
addrmap test {
|
|
reg {
|
|
field {
|
|
sw=rw;
|
|
hw=r;
|
|
} data[31:0];
|
|
} my_reg @ 0x0;
|
|
};
|
|
"""
|
|
top = compile_rdl(rdl_source, top="test")
|
|
|
|
ds = DesignState(top, {})
|
|
gen = DecodeLogicGenerator(ds, DecodeLogicFlavor.WRITE)
|
|
|
|
assert gen is not None
|
|
assert gen._flavor == DecodeLogicFlavor.WRITE # type: ignore
|
|
|
|
def test_cpuif_addr_predicate(self, compile_rdl: Callable[..., AddrmapNode]) -> None:
|
|
"""Test address predicate generation."""
|
|
rdl_source = """
|
|
addrmap test {
|
|
reg {
|
|
field {
|
|
sw=rw;
|
|
hw=r;
|
|
} data[31:0];
|
|
} my_reg @ 0x100;
|
|
};
|
|
"""
|
|
top = compile_rdl(rdl_source, top="test")
|
|
|
|
ds = DesignState(top, {})
|
|
gen = DecodeLogicGenerator(ds, DecodeLogicFlavor.READ)
|
|
|
|
# Get the register node
|
|
reg_node = None
|
|
for child in top.children():
|
|
if child.inst_name == "my_reg":
|
|
reg_node = child
|
|
break
|
|
assert reg_node is not None
|
|
|
|
predicates = gen.cpuif_addr_predicate(reg_node)
|
|
|
|
# Should return a list of conditions
|
|
assert isinstance(predicates, list)
|
|
assert len(predicates) > 0
|
|
# Should check address bounds
|
|
for pred in predicates:
|
|
assert "cpuif_rd_addr" in pred or ">=" in pred or "<" in pred
|
|
|
|
def test_decode_logic_flavor_enum(self) -> None:
|
|
"""Test DecodeLogicFlavor enum values."""
|
|
assert DecodeLogicFlavor.READ.value == "rd"
|
|
assert DecodeLogicFlavor.WRITE.value == "wr"
|
|
|
|
assert DecodeLogicFlavor.READ.cpuif_address == "cpuif_rd_addr"
|
|
assert DecodeLogicFlavor.WRITE.cpuif_address == "cpuif_wr_addr"
|
|
|
|
assert DecodeLogicFlavor.READ.cpuif_select == "cpuif_rd_sel"
|
|
assert DecodeLogicFlavor.WRITE.cpuif_select == "cpuif_wr_sel"
|