Files
PeakRDL-BusDecoder/src/peakrdl_busdecoder/struct_generator.py
2025-10-19 21:35:17 -07:00

53 lines
1.5 KiB
Python

from collections import deque
from systemrdl.node import AddressableNode
from systemrdl.walker import WalkerAction
from .body import Body, StructBody
from .design_state import DesignState
from .identifier_filter import kw_filter as kwf
from .listener import BusDecoderListener
class StructGenerator(BusDecoderListener):
def __init__(
self,
ds: DesignState,
) -> None:
super().__init__(ds)
self._stack: deque[Body] = deque()
self._stack.append(StructBody("cpuif_sel_t", True, True))
def enter_AddressableComponent(self, node: AddressableNode) -> WalkerAction | None:
action = super().enter_AddressableComponent(node)
if node.children():
# Push new body onto stack
body = StructBody(f"cpuif_sel_{node.inst_name}_t", True, True)
self._stack.append(body)
return action
def exit_AddressableComponent(self, node: AddressableNode) -> None:
type = "logic"
if node.children():
body = self._stack.pop()
if body and isinstance(body, StructBody):
self._stack.appendleft(body)
type = body.name
name = kwf(node.inst_name)
if node.array_dimensions:
for dim in node.array_dimensions:
name += f"[{dim}]"
self._stack[-1] += f"{type} {name};"
super().exit_AddressableComponent(node)
def __str__(self) -> str:
return "\n".join(map(str, self._stack))