61 lines
1.9 KiB
Python
61 lines
1.9 KiB
Python
from collections.abc import Callable
|
|
|
|
from systemrdl.node import AddrmapNode
|
|
from systemrdl.rdltypes.references import PropertyReference
|
|
|
|
from peakrdl_busdecoder.utils import ref_is_internal
|
|
|
|
|
|
def _find_child_by_name(node: AddrmapNode, inst_name: str):
|
|
for child in node.children():
|
|
if child.inst_name == inst_name:
|
|
return child
|
|
raise AssertionError(f"Child with name {inst_name} not found")
|
|
|
|
|
|
class TestRefIsInternal:
|
|
"""Tests for ref_is_internal utility."""
|
|
|
|
def test_external_components_flagged(self, compile_rdl: Callable[..., AddrmapNode]) -> None:
|
|
"""External components should be treated as non-internal."""
|
|
rdl_source = """
|
|
reg reg_t {
|
|
field { sw=rw; hw=r; } data[7:0];
|
|
};
|
|
|
|
addrmap top {
|
|
external reg_t ext @ 0x0;
|
|
reg_t intrnl @ 0x10;
|
|
};
|
|
"""
|
|
top = compile_rdl(rdl_source, top="top")
|
|
|
|
internal_reg = _find_child_by_name(top, "intrnl")
|
|
assert ref_is_internal(top, internal_reg) is True
|
|
|
|
external_reg = _find_child_by_name(top, "ext")
|
|
assert external_reg.external is True
|
|
assert ref_is_internal(top, external_reg) is False
|
|
|
|
external_prop_ref = PropertyReference.__new__(PropertyReference)
|
|
external_prop_ref.node = external_reg
|
|
assert ref_is_internal(top, external_prop_ref) is False
|
|
|
|
def test_property_reference_without_node_defaults_internal(
|
|
self, compile_rdl: Callable[..., AddrmapNode]
|
|
) -> None:
|
|
"""Root-level property references should be treated as internal."""
|
|
rdl_source = """
|
|
addrmap top {
|
|
reg {
|
|
field { sw=rw; hw=r; } data[7:0];
|
|
} reg0 @ 0x0;
|
|
};
|
|
"""
|
|
top = compile_rdl(rdl_source, top="top")
|
|
|
|
prop_ref = PropertyReference.__new__(PropertyReference)
|
|
prop_ref.node = None
|
|
|
|
assert ref_is_internal(top, prop_ref) is True
|