Open
Description
Describe the bug
Dear systemrdl-compiler community,
I'm encountering what I believe is a bug. The RDLImporter class as a method called add_child() but it does not support adding signals to an addrmap because the method checks that the child is an AddressableComponent.
def add_child(self, parent: comp.Component, child: comp.Component) -> None:
"""
Add a child component instance to an existing parent definition or instance
.. versionadded:: 1.16
"""
bad = True
if isinstance(parent, comp.Addrmap):
if isinstance(child, comp.AddressableComponent):
bad = False
elif isinstance(parent, comp.Regfile):
if isinstance(child, (comp.Regfile, comp.Reg)):
bad = False
elif isinstance(parent, comp.Mem):
if isinstance(child, comp.Reg):
bad = False
elif isinstance(parent, comp.Reg):
if isinstance(child, comp.Field):
bad = False
if bad:
raise TypeError("Parent %s cannot be assigned child %s" % (repr(parent), repr(child)))
if not child.is_instance:
raise ValueError("Child must be an instance if adding to a parent")
parent.children.append(child)
On the other hand, the Node class as a method called children() (which calls the _factory() method below) which returns signal components:
def _factory(inst: comp.Component, env: 'RDLEnvironment', parent: Optional['Node']=None) -> 'Node':
if isinstance(inst, comp.Field):
return FieldNode(inst, env, parent)
elif isinstance(inst, comp.Reg):
return RegNode(inst, env, parent)
elif isinstance(inst, comp.Regfile):
return RegfileNode(inst, env, parent)
elif isinstance(inst, comp.Addrmap):
return AddrmapNode(inst, env, parent)
elif isinstance(inst, comp.Mem):
return MemNode(inst, env, parent)
elif isinstance(inst, comp.Signal):
return SignalNode(inst, env, parent)
else:
raise RuntimeError
systemrdl-compiler version: 1.27.3
Additional context
I'm converting an hjson description from the opentitan project to systemrdl and I want to add signal inside an addrmap node. Currently I'm overloading the add_child method to change the behavior with the one I want, but to me it seems the original method should provide this possibility.