summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2022-05-02 19:13:08 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2022-05-17 07:51:53 +0200
commit7a4218133b565308dfe54bfe993951ad2103633e (patch)
tree611599dba23aaf179e4b7a2a8a7dbeb36641c032
parentcontent: Rename close_add_to_group() (diff)
downloadrtems-central-7a4218133b565308dfe54bfe993951ad2103633e.tar.bz2
interface: Support register sets
-rw-r--r--rtemsspec/interface.py43
-rw-r--r--rtemsspec/tests/spec-interface/register-block-no-size.yml34
-rw-r--r--rtemsspec/tests/test_interface.py39
-rw-r--r--spec-spec/spec/optional-int.yml16
-rw-r--r--spec/spec/interface-register-block.yml6
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