[rtems-central commit] interface: Support register sets

Sebastian Huber sebh at rtems.org
Tue May 17 05:47:50 UTC 2022


Module:    rtems-central
Branch:    master
Commit:    7a4218133b565308dfe54bfe993951ad2103633e
Changeset: http://git.rtems.org/rtems-central/commit/?id=7a4218133b565308dfe54bfe993951ad2103633e

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Mon May  2 19:13:08 2022 +0200

interface: Support register sets

---

 rtemsspec/interface.py                             | 43 ++++++++++++++++++++--
 .../spec-interface/register-block-no-size.yml      | 34 +++++++++++++++++
 rtemsspec/tests/test_interface.py                  | 39 +++++++++++++++++++-
 spec-spec/spec/optional-int.yml                    | 16 ++++++++
 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



More information about the vc mailing list