From 7a4218133b565308dfe54bfe993951ad2103633e Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Mon, 2 May 2022 19:13:08 +0200 Subject: interface: Support register sets --- rtemsspec/interface.py | 43 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) (limited to 'rtemsspec/interface.py') diff --git a/rtemsspec/interface.py b/rtemsspec/interface.py index 9c25e729..1f951b40 100644 --- a/rtemsspec/interface.py +++ b/rtemsspec/interface.py @@ -394,13 +394,30 @@ class Node: assert ctx.sizes[index] == ctx.regs[name]["size"] * count ctx.reg_counts[alias] += 1 - def _add_register_members(self, ctx: _RegisterMemberContext) -> None: - default_padding = min(min(ctx.sizes.values()), 8) + def _add_register_defines(self, ctx: _RegisterMemberContext) -> None: + with self.content.doxygen_block(): + self.content.add("@name Registers") + self.content.add_brief_description( + self.substitute_text(self.item["brief"])) + self.content.doxyfy(self.substitute_text(self.item["description"])) + self.content.add("@{") + for index, member in enumerate(self.item["definition"]): + self.content.add( + _add_definition( + self, self.item, f"definition[{index}]", member, + functools.partial(Node._get_register_define_definition, + ctx=ctx, + offset=member["offset"]))) + self.content.add_close_group() + + def _add_register_struct(self, ctx: _RegisterMemberContext, + size: int) -> None: with self.content.doxygen_block(): self.content.add_brief_description( self.substitute_text(self.item["brief"])) self.content.doxyfy(self.substitute_text(self.item["description"])) self.content.append(f"typedef struct {self.item['name']} {{") + default_padding = min(min(ctx.sizes.values()), 8) offset = 0 with self.content.indent(): for index, member in enumerate(self.item["definition"]): @@ -413,11 +430,17 @@ class Node: functools.partial(Node._get_register_member_definition, ctx=ctx))) offset = member_offset + ctx.sizes[index] - size = self.item["register-block-size"] assert offset <= size _add_register_padding(self.content, size, offset, default_padding) self.content.add(f"}} {self.item['name']};") + def _add_register_members(self, ctx: _RegisterMemberContext) -> None: + size = self.item["register-block-size"] + if size is None: + self._add_register_defines(ctx) + else: + self._add_register_struct(ctx, size) + def generate_register_block(self) -> None: """ Generates a register block. """ self.header_file.add_includes(self.item.map("/c/if/uint32_t")) @@ -569,6 +592,20 @@ class Node: ]) return lines + def _get_register_define_definition(self, item: Item, definition: Any, + ctx: _RegisterMemberContext, + offset: int) -> Lines: + # pylint: disable=no-self-use + name, alias = _get_register_name(definition) + count = definition["count"] + assert count == 1 + content = CContent() + with content.doxygen_block(): + content.add(f"@brief See @ref {ctx.regs[name]['group']}.") + content.append( + f"#define {item['name'].upper()}_{alias.upper()} {offset:#x}") + return content.lines + def _get_register_member_definition(self, _item: Item, definition: Any, ctx: _RegisterMemberContext) -> Lines: # pylint: disable=no-self-use -- cgit v1.2.3