90 lines
2.8 KiB
Python
90 lines
2.8 KiB
Python
from typing import TYPE_CHECKING, Union
|
|
from systemrdl.node import Node, SignalNode, FieldNode
|
|
from systemrdl.rdltypes import AccessType, PropertyReference
|
|
|
|
if TYPE_CHECKING:
|
|
from ..exporter import RegblockExporter
|
|
|
|
class HwifBase:
|
|
"""
|
|
Defines how the hardware input/output signals are generated:
|
|
- Field outputs
|
|
- Field inputs
|
|
- Signal inputs (except those that are promoted to the top)
|
|
"""
|
|
|
|
def __init__(self, exporter: 'RegblockExporter', top_node: Node, package_name: str):
|
|
self.exporter = exporter
|
|
self.top_node = top_node
|
|
self.package_name = package_name
|
|
|
|
|
|
def get_package_declaration(self) -> str:
|
|
"""
|
|
If this hwif requires a package, generate the string
|
|
"""
|
|
return ""
|
|
|
|
|
|
@property
|
|
def port_declaration(self) -> str:
|
|
"""
|
|
Returns the declaration string for all I/O ports in the hwif group
|
|
"""
|
|
raise NotImplementedError()
|
|
|
|
#---------------------------------------------------------------------------
|
|
# hwif utility functions
|
|
#---------------------------------------------------------------------------
|
|
def has_value_input(self, obj: Union[FieldNode, SignalNode]) -> bool:
|
|
"""
|
|
Returns True if the object infers an input wire in the hwif
|
|
"""
|
|
if isinstance(obj, FieldNode):
|
|
return obj.is_hw_writable
|
|
elif isinstance(obj, SignalNode):
|
|
# Signals are implicitly always inputs
|
|
return True
|
|
else:
|
|
raise RuntimeError
|
|
|
|
|
|
def has_value_output(self, obj: FieldNode) -> bool:
|
|
"""
|
|
Returns True if the object infers an output wire in the hwif
|
|
"""
|
|
# TODO: Extend this for signals and prop references?
|
|
return obj.is_hw_readable
|
|
|
|
|
|
def get_input_identifier(self, obj: Union[FieldNode, SignalNode, PropertyReference]) -> str:
|
|
"""
|
|
Returns the identifier string that best represents the input object.
|
|
|
|
if obj is:
|
|
Field: the fields input value port
|
|
Signal: signal input value
|
|
Prop reference:
|
|
could be an implied hwclr/hwset/swwe/swwel/we/wel input
|
|
Raise a runtime error if an illegal prop ref is requested, or if
|
|
the prop ref is not actually implied, but explicitly ref a component
|
|
|
|
TODO: finish this
|
|
raises an exception if obj is invalid
|
|
"""
|
|
raise NotImplementedError()
|
|
|
|
|
|
def get_output_identifier(self, obj: FieldNode) -> str:
|
|
"""
|
|
Returns the identifier string that best represents the output object.
|
|
|
|
if obj is:
|
|
Field: the fields output value port
|
|
Property ref: this is also part of the struct
|
|
TODO: finish this
|
|
|
|
raises an exception if obj is invalid
|
|
"""
|
|
raise NotImplementedError()
|