diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2022-05-02 19:13:08 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2022-05-17 07:51:53 +0200 |
commit | 7a4218133b565308dfe54bfe993951ad2103633e (patch) | |
tree | 611599dba23aaf179e4b7a2a8a7dbeb36641c032 | |
parent | content: Rename close_add_to_group() (diff) | |
download | rtems-central-7a4218133b565308dfe54bfe993951ad2103633e.tar.bz2 |
interface: Support register sets
-rw-r--r-- | rtemsspec/interface.py | 43 | ||||
-rw-r--r-- | rtemsspec/tests/spec-interface/register-block-no-size.yml | 34 | ||||
-rw-r--r-- | rtemsspec/tests/test_interface.py | 39 | ||||
-rw-r--r-- | spec-spec/spec/optional-int.yml | 16 | ||||
-rw-r--r-- | spec/spec/interface-register-block.yml | 6 |
5 files changed, 131 insertions, 7 deletions
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 diff --git a/rtemsspec/tests/spec-interface/register-block-no-size.yml b/rtemsspec/tests/spec-interface/register-block-no-size.yml new file mode 100644 index 00000000..3c78e5b7 --- /dev/null +++ b/rtemsspec/tests/spec-interface/register-block-no-size.yml @@ -0,0 +1,34 @@ +SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause +brief: | + Brief. +copyrights: +- Copyright (C) 2022 embedded brains GmbH (http://www.embedded-brains.de) +description: null +enabled-by: true +identifier: RBNS +index-entries: [] +interface-type: register-block +links: +- role: interface-placement + uid: h +definition: +- default: + count: 1 + name: R + offset: 0 + variants: [] +register-prefix: null +register-block-group: RBNS +register-block-size: null +registers: +- bits: + - default: [] + variants: [] + brief: | + Brief. + description: null + name: R + width: 32 +name: rbns +notes: null +type: interface diff --git a/rtemsspec/tests/test_interface.py b/rtemsspec/tests/test_interface.py index 9e23bb39..14fce46d 100644 --- a/rtemsspec/tests/test_interface.py +++ b/rtemsspec/tests/test_interface.py @@ -61,7 +61,7 @@ def test_interface(tmpdir): */ /* - * Copyright (C) 2020, 2021 embedded brains GmbH (http://www.embedded-brains.de) + * Copyright (C) 2020, 2022 embedded brains GmbH (http://www.embedded-brains.de) * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -484,6 +484,43 @@ typedef struct irqamp { #define MACRO( Param0 ) ( ( Param0 ) + 1 ) #endif +/* Generated from spec:/register-block-no-size */ + +/** + * @defgroup RBNS RBNS + * + * @brief This group contains the RBNS interfaces. + * + * @{ + */ + +/** + * @defgroup RBNSR R + * + * @brief Brief. + * + * @{ + */ + +/** @} */ + +/** + * @name Registers + * + * @brief Brief. + * + * @{ + */ + +/** + * @brief See @ref RBNSR. + */ +#define RBNS_R 0x0 + +/** @} */ + +/** @} */ + /* Generated from spec:/s */ /** diff --git a/spec-spec/spec/optional-int.yml b/spec-spec/spec/optional-int.yml new file mode 100644 index 00000000..fb26d4e9 --- /dev/null +++ b/spec-spec/spec/optional-int.yml @@ -0,0 +1,16 @@ +SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause +copyrights: +- Copyright (C) 2022 embedded brains GmbH (http://www.embedded-brains.de) +enabled-by: true +links: +- role: spec-member + uid: root +spec-description: null +spec-example: null +spec-info: + none: null + int: + description: null +spec-name: Optional Integer +spec-type: optional-int +type: spec diff --git a/spec/spec/interface-register-block.yml b/spec/spec/interface-register-block.yml index ed7c82c3..cc9b95b6 100644 --- a/spec/spec/interface-register-block.yml +++ b/spec/spec/interface-register-block.yml @@ -43,9 +43,9 @@ spec-info: spec-type: str register-block-size: description: | - It shall be the size of the register block in units of the address - space granule. - spec-type: int + If the value is present, then it shall be the size of the register + block in units of the address space granule. + spec-type: optional-int register-prefix: description: | If the value is present, then it will be used to prefix register bit |