[rtems-central commit] interfacedoc: Generate type documentation

Sebastian Huber sebh at rtems.org
Tue May 9 13:45:27 UTC 2023


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

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Fri May  5 14:41:19 2023 +0200

interfacedoc: Generate type documentation

---

 config.yml                                         |   6 +
 rtemsspec/interface.py                             |   4 +-
 rtemsspec/interfacedoc.py                          | 110 +++++++++-
 rtemsspec/sphinxcontent.py                         |  60 +++++-
 rtemsspec/tests/spec-interface/asm.yml             |   2 +-
 rtemsspec/tests/spec-interface/c/if/uint32_t.yml   |   2 +-
 .../tests/spec-interface/command-line-other.yml    |   2 +-
 rtemsspec/tests/spec-interface/command-line.yml    |   2 +-
 rtemsspec/tests/spec-interface/constraint-a.yml    |   2 +-
 .../tests/spec-interface/constraint/other.yml      |   9 +
 .../spec-interface/constraint/type-opaque.yml      |   9 +
 rtemsspec/tests/spec-interface/define-a.yml        |   2 +-
 rtemsspec/tests/spec-interface/define-b.yml        |   2 +-
 rtemsspec/tests/spec-interface/define-c.yml        |   2 +-
 rtemsspec/tests/spec-interface/define.yml          |   2 +-
 rtemsspec/tests/spec-interface/domain-abc.yml      |   2 +-
 rtemsspec/tests/spec-interface/domain-c.yml        |   2 +-
 .../tests/spec-interface/domain-command-line.yml   |   2 +-
 rtemsspec/tests/spec-interface/enum.yml            |   2 +-
 rtemsspec/tests/spec-interface/enum2.yml           |   2 +-
 rtemsspec/tests/spec-interface/enum3.yml           |   2 +-
 rtemsspec/tests/spec-interface/enum4.yml           |   2 +-
 rtemsspec/tests/spec-interface/enumerator-0.yml    |   2 +-
 rtemsspec/tests/spec-interface/enumerator-1.yml    |   2 +-
 rtemsspec/tests/spec-interface/enumerator-2.yml    |   2 +-
 rtemsspec/tests/spec-interface/enumerator-a.yml    |   2 +-
 rtemsspec/tests/spec-interface/enumerator-b.yml    |   2 +-
 rtemsspec/tests/spec-interface/float_t.yml         |   2 +-
 rtemsspec/tests/spec-interface/forward-decl.yml    |   2 +-
 rtemsspec/tests/spec-interface/func.yml            |   2 +-
 rtemsspec/tests/spec-interface/func2.yml           |   2 +-
 rtemsspec/tests/spec-interface/func3.yml           |   2 +-
 rtemsspec/tests/spec-interface/func4.yml           |   2 +-
 rtemsspec/tests/spec-interface/func5.yml           |   2 +-
 rtemsspec/tests/spec-interface/func6.yml           |   2 +-
 rtemsspec/tests/spec-interface/ga.yml              |   2 +-
 rtemsspec/tests/spec-interface/gb.yml              |   2 +-
 rtemsspec/tests/spec-interface/gc.yml              |   2 +-
 rtemsspec/tests/spec-interface/ge.yml              |   2 +-
 rtemsspec/tests/spec-interface/gf.yml              |   2 +-
 rtemsspec/tests/spec-interface/h.yml               |   2 +-
 rtemsspec/tests/spec-interface/h2.yml              |   2 +-
 rtemsspec/tests/spec-interface/h3.yml              |   2 +-
 rtemsspec/tests/spec-interface/h4.yml              |   2 +-
 .../tests/spec-interface/irqamp-timestamp.yml      |   2 +-
 rtemsspec/tests/spec-interface/irqamp.yml          |   2 +-
 rtemsspec/tests/spec-interface/macro.yml           |   2 +-
 rtemsspec/tests/spec-interface/macro2.yml          |   2 +-
 rtemsspec/tests/spec-interface/macro3.yml          |   2 +-
 rtemsspec/tests/spec-interface/math.yml            |   2 +-
 rtemsspec/tests/spec-interface/option.yml          |   2 +-
 .../spec-interface/register-block-no-size.yml      |   2 +-
 rtemsspec/tests/spec-interface/s.yml               |   2 +-
 rtemsspec/tests/spec-interface/s2.yml              |  30 +++
 rtemsspec/tests/spec-interface/smp.yml             |   2 +-
 rtemsspec/tests/spec-interface/stdint.yml          |   2 +-
 rtemsspec/tests/spec-interface/td.yml              |   2 +-
 rtemsspec/tests/spec-interface/td3.yml             |   2 +-
 rtemsspec/tests/spec-interface/u.yml               |   2 +-
 rtemsspec/tests/spec-interface/uint32_t.yml        |   2 +-
 rtemsspec/tests/spec-interface/var.yml             |   2 +-
 rtemsspec/tests/spec-sphinx/s.yml                  |  14 ++
 rtemsspec/tests/test_content_sphinx.py             |   1 +
 rtemsspec/tests/test_interface.py                  |  30 ++-
 rtemsspec/tests/test_interfacedoc.py               | 224 +++++++++++++++++++--
 65 files changed, 517 insertions(+), 88 deletions(-)

diff --git a/config.yml b/config.yml
index 975f9f6d..82ef9bd4 100644
--- a/config.yml
+++ b/config.yml
@@ -195,6 +195,12 @@ interface-documentation:
   - directives-target: modules/rtems-docs/c-user/rate-monotonic/directives.rst
     group: /rtems/ratemon/if/group
     introduction-target: modules/rtems-docs/c-user/rate-monotonic/introduction.rst
+  types:
+    domains:
+    - /if/domain
+    groups:
+    - /rtems/type/if/group
+    target: modules/rtems-docs/c-user/rtems_data_types.rst
 spec-verification:
   root-type: /spec/root
 spec-documentation:
diff --git a/rtemsspec/interface.py b/rtemsspec/interface.py
index 6a11f1c3..10ecf40a 100644
--- a/rtemsspec/interface.py
+++ b/rtemsspec/interface.py
@@ -267,10 +267,12 @@ def _get_register_name(definition: Dict[str, Any]) -> Tuple[str, str]:
 
 
 _CONSTRAINT_TARGET = {
-    "interface/function": "this directive",
     "interface/define": "this constant",
+    "interface/function": "this directive",
     "interface/macro": "this directive",
+    "interface/struct": "this structure",
     "interface/typedef": "functions of this type",
+    "interface/union": "this union",
     "interface/variable": "this object",
 }
 
diff --git a/rtemsspec/interfacedoc.py b/rtemsspec/interfacedoc.py
index 02242227..b9d52845 100644
--- a/rtemsspec/interfacedoc.py
+++ b/rtemsspec/interfacedoc.py
@@ -28,7 +28,7 @@ This module provides functions for the generation of interface documentation.
 
 import functools
 import os
-from typing import Any, Dict, List, Tuple
+from typing import Any, Dict, List, Optional, Tuple
 
 from rtemsspec.content import CContent, get_value_compound, \
     get_value_forward_declaration, get_value_unspecified_type
@@ -128,6 +128,14 @@ def _add_definition(content: CContent, mapper: ItemMapper, item: Item,
         add_definition(content, mapper, item, definition)
 
 
+def _add_text(content: SphinxContent, mapper: ItemMapper, item: Item,
+              key: str) -> None:
+    text = item[key]
+    if text:
+        content.add(f".. rubric:: {key.upper()}:")
+        content.wrap(mapper.substitute(text))
+
+
 def _document_directive(content: SphinxContent, mapper: ItemMapper,
                         code_mapper: CodeMapper, item: Item,
                         enabled: List[str]) -> None:
@@ -147,9 +155,7 @@ def _document_directive(content: SphinxContent, mapper: ItemMapper,
                     f"``{sanitize_name(param['name'])}``",
                     mapper.substitute(f"This parameter {description}"),
                     wrap=True)
-    if item["description"]:
-        content.add_rubric("DESCRIPTION:")
-        content.wrap(mapper.substitute(item["description"]))
+    _add_text(content, mapper, item, "description")
     ret = item["return"]
     if ret:
         content.add_rubric("RETURN VALUES:")
@@ -163,9 +169,7 @@ def _document_directive(content: SphinxContent, mapper: ItemMapper,
                                             retval["description"]),
                                         wrap=True)
         content.wrap(mapper.substitute(ret["return"]))
-    if item["notes"]:
-        content.add_rubric("NOTES:")
-        content.wrap(mapper.substitute(item["notes"]))
+    _add_text(content, mapper, item, "notes")
     constraints = [
         mapper.substitute(parent["text"], parent)
         for parent in item.parents("constraint") if parent.is_enabled(enabled)
@@ -227,6 +231,96 @@ def _directive_key(order: List[Item], item: Item) -> Tuple[int, str]:
     return (index, item.uid)
 
 
+def _add_type_definition(definition: Any, mapper: SphinxInterfaceMapper,
+                         content: SphinxContent) -> None:
+    text = definition["brief"].strip()
+    if definition["description"]:
+        text += "\n" + definition["description"].strip()
+    content.add_definition_item(definition["name"],
+                                mapper.substitute(text),
+                                wrap=True)
+
+
+def _type_compound(item: Item, mapper: SphinxInterfaceMapper,
+                   content: SphinxContent) -> None:
+    content.add(".. rubric:: MEMBERS:")
+    for member in item["definition"]:
+        _add_type_definition(member["default"], mapper, content)
+
+
+def _type_enum(item: Item, mapper: SphinxInterfaceMapper,
+               content: SphinxContent) -> None:
+    content.add(".. rubric:: ENUMERATORS:")
+    for enumerator in item.parents("interface-enumerator"):
+        _add_type_definition(enumerator, mapper, content)
+
+
+def _type_nop(_item: Item, _mapper: SphinxInterfaceMapper,
+              _content: SphinxContent) -> None:
+    pass
+
+
+_TYPE_GENERATORS = {
+    "interface/enum": _type_enum,
+    "interface/struct": _type_compound,
+    "interface/typedef": _type_nop,
+    "interface/union": _type_compound
+}
+
+
+def _gather_types(item: Item, types: List[Item]) -> None:
+    for child in item.children("interface-placement"):
+        if child.type in _TYPE_GENERATORS:
+            types.append(child)
+        _gather_types(child, types)
+
+
+def _is_opaque_type(item: Item) -> Optional[Item]:
+    for constraint in item.parents("constraint"):
+        if constraint.uid == "/constraint/type-opaque":
+            return constraint
+    return None
+
+
+def _generate_types(config: dict, group_uids: List[str],
+                    item_cache: ItemCache) -> None:
+    types: List[Item] = []
+    for domain in config["domains"]:
+        _gather_types(item_cache[domain], types)
+    content = SphinxContent()
+    content.add_automatically_generated_warning()
+    content.add_index_entries(["RTEMS Data Types", "data types"])
+    content.add_header("RTEMS Data Types", level=1)
+    with content.section("Introduction"):
+        content.wrap("""This chapter contains a complete list of the RTEMS
+primitive data types in alphabetical order.  This is intended to be an overview
+and the user is encouraged to look at the appropriate chapters in the manual
+for more information about the usage of the various data types.""")
+
+    with content.section("List of Data Types"):
+        content.wrap(
+            "The following is a complete list of the RTEMS primitive data "
+            "types in alphabetical order:")
+        for item in sorted(types, key=lambda x: x["name"]):
+            content.register_license_and_copyrights_of_item(item)
+            content.add(f".. Generated from spec:{item.uid}")
+            name = item["name"]
+            content.add_index_entries([name] + item["index-entries"])
+            with content.section(name, label=make_label(f"Interface {name}")):
+                mapper = SphinxInterfaceMapper(item, group_uids)
+                content.wrap(mapper.substitute(item["brief"]))
+                constraint = _is_opaque_type(item)
+                if constraint is None:
+                    _TYPE_GENERATORS[item.type](item, mapper, content)
+                else:
+                    content.add(".. rubric:: MEMBERS:")
+                    content.wrap(mapper.substitute(constraint["text"]))
+                _add_text(content, mapper, item, "description")
+                _add_text(content, mapper, item, "notes")
+    content.add_licence_and_copyrights()
+    content.write(config["target"])
+
+
 def generate(config: dict, item_cache: ItemCache) -> None:
     """
     Generates interface documentation according to the configuration.
@@ -237,6 +331,7 @@ def generate(config: dict, item_cache: ItemCache) -> None:
     groups = config["groups"]
     enabled = config["enabled"]
     group_uids = [doc_config["group"] for doc_config in groups]
+    group_uids.extend(uid for uid in config["types"]["groups"])
     for doc_config in groups:
         items: List[Item] = []
         group = item_cache[doc_config["group"]]
@@ -250,3 +345,4 @@ def generate(config: dict, item_cache: ItemCache) -> None:
                                group_uids, items)
         _generate_directives(doc_config["directives-target"], group,
                              group_uids, items, enabled)
+    _generate_types(config["types"], group_uids, item_cache)
diff --git a/rtemsspec/sphinxcontent.py b/rtemsspec/sphinxcontent.py
index 18b4ed53..49cdeb85 100644
--- a/rtemsspec/sphinxcontent.py
+++ b/rtemsspec/sphinxcontent.py
@@ -337,20 +337,32 @@ def _get_value_sphinx_type(ctx: ItemGetValueContext) -> Any:
     return f":c:type:`{ctx.value[ctx.key]}`"
 
 
-def _get_value_sphinx_ref(ctx: ItemGetValueContext, get_value: ItemGetValue,
-                          postfix: str) -> Any:
+def _compound_kind(ctx: ItemGetValueContext) -> str:
+    type_name = ctx.item.type
+    return f"{type_name[type_name.rfind('-') + 1:]} "
+
+
+def _get_value_sphinx_compound(ctx: ItemGetValueContext) -> Any:
+    return f"``{_compound_kind(ctx)}{ctx.value[ctx.key]}``"
+
+
+def _get_value_sphinx_ref(ctx: ItemGetValueContext,
+                          get_value: ItemGetValue,
+                          postfix: str = "",
+                          prefix: str = "") -> Any:
     for ref in ctx.item["references"]:
         ref_type = ref["type"]
         identifier = ref["identifier"]
+        name_ref = f"`{prefix}{ctx.value[ctx.key]}{postfix} <{identifier}>`"
         if ref_type == "document" and ref["name"] == "c-user":
-            return f":ref:`{ctx.value[ctx.key]}{postfix} <{identifier}>`"
+            return f":ref:{name_ref}"
         if ref_type == "url":
-            return f"`{ctx.value[ctx.key]}{postfix} <{identifier}>`_"
+            return f"{name_ref}_"
     return get_value(ctx)
 
 
 def _get_value_sphinx_unspecified_define(ctx: ItemGetValueContext) -> Any:
-    return _get_value_sphinx_ref(ctx, _get_value_sphinx_macro, "")
+    return _get_value_sphinx_ref(ctx, _get_value_sphinx_macro)
 
 
 def _get_value_sphinx_unspecified_function(ctx: ItemGetValueContext) -> Any:
@@ -369,7 +381,13 @@ def _get_value_sphinx_unspecified_group(ctx: ItemGetValueContext) -> Any:
 
 
 def _get_value_sphinx_unspecified_type(ctx: ItemGetValueContext) -> Any:
-    return _get_value_sphinx_ref(ctx, _get_value_sphinx_type, "")
+    return _get_value_sphinx_ref(ctx, _get_value_sphinx_type)
+
+
+def _get_value_sphinx_unspecified_compound(ctx: ItemGetValueContext) -> Any:
+    return _get_value_sphinx_ref(ctx,
+                                 _get_value_sphinx_compound,
+                                 prefix=_compound_kind(ctx))
 
 
 class SphinxMapper(ItemMapper):
@@ -412,11 +430,11 @@ class SphinxMapper(ItemMapper):
         self.add_get_value("interface/unspecified-enum:/name",
                            _get_value_sphinx_unspecified_type)
         self.add_get_value("interface/unspecified-struct:/name",
-                           _get_value_sphinx_unspecified_type)
+                           _get_value_sphinx_unspecified_compound)
         self.add_get_value("interface/unspecified-typedef:/name",
                            _get_value_sphinx_unspecified_type)
         self.add_get_value("interface/unspecified-union:/name",
-                           _get_value_sphinx_unspecified_type)
+                           _get_value_sphinx_unspecified_compound)
 
 
 def sanitize_name(name: str) -> str:
@@ -446,6 +464,7 @@ class SphinxInterfaceMapper(SphinxMapper):
                            _get_appl_config_option)
         self.add_get_value("interface/appl-config-option/integer:/name",
                            _get_appl_config_option)
+        self.add_get_value("interface/enum:/name", self._get_type)
         self.add_get_value("interface/function:/name", self._get_function)
         self.add_get_value("interface/function:/params/name",
                            get_value_sphinx_param)
@@ -453,13 +472,32 @@ class SphinxInterfaceMapper(SphinxMapper):
         self.add_get_value("interface/macro:/name", self._get_function)
         self.add_get_value("interface/macro:/params/name",
                            get_value_sphinx_param)
+        self.add_get_value("interface/struct:/name", self._get_compound)
+        self.add_get_value("interface/typedef:/name", self._get_type)
+        self.add_get_value("interface/union:/name", self._get_compound)
 
-    def _get_function(self, ctx: ItemGetValueContext) -> Any:
-        name = ctx.value[ctx.key]
+    def _get_reference(self, ctx: ItemGetValueContext, name: str,
+                       fallback: str) -> str:
         for group in ctx.item.parents("interface-ingroup"):
             if group.uid in self._group_uids:
                 return get_reference(make_label(f"Interface {name}"))
-        return f":c:func:`{name}`"
+        return fallback
+
+    def _get_compound(self, ctx: ItemGetValueContext) -> Any:
+        if ctx.item["definition-kind"] in ["struct-only", "union-only"]:
+            prefix = f"{ctx.item['interface-type']} "
+        else:
+            prefix = ""
+        name = ctx.value[ctx.key]
+        return self._get_reference(ctx, name, f"``{prefix}{name}``")
+
+    def _get_function(self, ctx: ItemGetValueContext) -> Any:
+        name = ctx.value[ctx.key]
+        return self._get_reference(ctx, name, f":c:func:`{name}`")
+
+    def _get_type(self, ctx: ItemGetValueContext) -> Any:
+        name = ctx.value[ctx.key]
+        return self._get_reference(ctx, name, f":c:type:`{name}`")
 
     def _get_group(self, ctx: ItemGetValueContext) -> Any:
         if ctx.item.uid in self._group_uids:
diff --git a/rtemsspec/tests/spec-interface/asm.yml b/rtemsspec/tests/spec-interface/asm.yml
index d608a770..5f7be4fc 100644
--- a/rtemsspec/tests/spec-interface/asm.yml
+++ b/rtemsspec/tests/spec-interface/asm.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: null
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 definition:
   defaults: null
   variants: []
diff --git a/rtemsspec/tests/spec-interface/c/if/uint32_t.yml b/rtemsspec/tests/spec-interface/c/if/uint32_t.yml
index ce9cd90d..9032bd15 100644
--- a/rtemsspec/tests/spec-interface/c/if/uint32_t.yml
+++ b/rtemsspec/tests/spec-interface/c/if/uint32_t.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: null
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 definition:
   default: unsigned
   variants: []
diff --git a/rtemsspec/tests/spec-interface/command-line-other.yml b/rtemsspec/tests/spec-interface/command-line-other.yml
index 7b317f9f..c74d8e8f 100644
--- a/rtemsspec/tests/spec-interface/command-line-other.yml
+++ b/rtemsspec/tests/spec-interface/command-line-other.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: null
 copyrights:
-- Copyright (C) 2022 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2022 embedded brains GmbH & Co. KG
 definition:
   defaults: null
   variants: []
diff --git a/rtemsspec/tests/spec-interface/command-line.yml b/rtemsspec/tests/spec-interface/command-line.yml
index 4f5144e2..79be22d7 100644
--- a/rtemsspec/tests/spec-interface/command-line.yml
+++ b/rtemsspec/tests/spec-interface/command-line.yml
@@ -1,6 +1,6 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 enabled-by: true
 index-entries: []
 interface-type: group
diff --git a/rtemsspec/tests/spec-interface/constraint-a.yml b/rtemsspec/tests/spec-interface/constraint-a.yml
index 7bde0282..0c679073 100644
--- a/rtemsspec/tests/spec-interface/constraint-a.yml
+++ b/rtemsspec/tests/spec-interface/constraint-a.yml
@@ -1,6 +1,6 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 copyrights:
-- Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2021 embedded brains GmbH & Co. KG
 enabled-by: true
 links: []
 rationale: null
diff --git a/rtemsspec/tests/spec-interface/constraint/other.yml b/rtemsspec/tests/spec-interface/constraint/other.yml
new file mode 100644
index 00000000..6067f412
--- /dev/null
+++ b/rtemsspec/tests/spec-interface/constraint/other.yml
@@ -0,0 +1,9 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2023 embedded brains GmbH & Co. KG
+enabled-by: true
+links: []
+rationale: null
+text: |
+  Some constraint.
+type: constraint
diff --git a/rtemsspec/tests/spec-interface/constraint/type-opaque.yml b/rtemsspec/tests/spec-interface/constraint/type-opaque.yml
new file mode 100644
index 00000000..3cf3535f
--- /dev/null
+++ b/rtemsspec/tests/spec-interface/constraint/type-opaque.yml
@@ -0,0 +1,9 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2023 embedded brains GmbH & Co. KG
+enabled-by: true
+links: []
+rationale: null
+text: |
+  Members of the type shall not be accessed directly by the application.
+type: constraint
diff --git a/rtemsspec/tests/spec-interface/define-a.yml b/rtemsspec/tests/spec-interface/define-a.yml
index 8f5f7845..4a3874d6 100644
--- a/rtemsspec/tests/spec-interface/define-a.yml
+++ b/rtemsspec/tests/spec-interface/define-a.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: null
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 definition:
   default: ''
   variants: []
diff --git a/rtemsspec/tests/spec-interface/define-b.yml b/rtemsspec/tests/spec-interface/define-b.yml
index cb88ef6b..73663599 100644
--- a/rtemsspec/tests/spec-interface/define-b.yml
+++ b/rtemsspec/tests/spec-interface/define-b.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: null
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 definition:
   default: '1'
   variants: []
diff --git a/rtemsspec/tests/spec-interface/define-c.yml b/rtemsspec/tests/spec-interface/define-c.yml
index e5422c04..ea9d9714 100644
--- a/rtemsspec/tests/spec-interface/define-c.yml
+++ b/rtemsspec/tests/spec-interface/define-c.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: null
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 definition:
   default: '2'
   variants: []
diff --git a/rtemsspec/tests/spec-interface/define.yml b/rtemsspec/tests/spec-interface/define.yml
index 00fec0c0..0c3e6724 100644
--- a/rtemsspec/tests/spec-interface/define.yml
+++ b/rtemsspec/tests/spec-interface/define.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: null
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 definition:
   default: |
     \
diff --git a/rtemsspec/tests/spec-interface/domain-abc.yml b/rtemsspec/tests/spec-interface/domain-abc.yml
index 06123875..803a7395 100644
--- a/rtemsspec/tests/spec-interface/domain-abc.yml
+++ b/rtemsspec/tests/spec-interface/domain-abc.yml
@@ -1,6 +1,6 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 description: ABC
 enabled-by: true
 index-entries: []
diff --git a/rtemsspec/tests/spec-interface/domain-c.yml b/rtemsspec/tests/spec-interface/domain-c.yml
index 435993aa..1673728a 100644
--- a/rtemsspec/tests/spec-interface/domain-c.yml
+++ b/rtemsspec/tests/spec-interface/domain-c.yml
@@ -1,6 +1,6 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 description: C
 enabled-by: true
 index-entries: []
diff --git a/rtemsspec/tests/spec-interface/domain-command-line.yml b/rtemsspec/tests/spec-interface/domain-command-line.yml
index 87b173eb..892e359c 100644
--- a/rtemsspec/tests/spec-interface/domain-command-line.yml
+++ b/rtemsspec/tests/spec-interface/domain-command-line.yml
@@ -1,6 +1,6 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 description: Command Line
 enabled-by: true
 index-entries: []
diff --git a/rtemsspec/tests/spec-interface/enum.yml b/rtemsspec/tests/spec-interface/enum.yml
index 6b4de2c3..b55c8608 100644
--- a/rtemsspec/tests/spec-interface/enum.yml
+++ b/rtemsspec/tests/spec-interface/enum.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: Enum brief description.
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 definition-kind: typedef-only
 description: Enum description.
 enabled-by: true
diff --git a/rtemsspec/tests/spec-interface/enum2.yml b/rtemsspec/tests/spec-interface/enum2.yml
index 38796f7c..823ec0e4 100644
--- a/rtemsspec/tests/spec-interface/enum2.yml
+++ b/rtemsspec/tests/spec-interface/enum2.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: Enum A brief description.
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 definition-kind: enum-only
 description: null
 enabled-by: true
diff --git a/rtemsspec/tests/spec-interface/enum3.yml b/rtemsspec/tests/spec-interface/enum3.yml
index af17ce3b..b885d269 100644
--- a/rtemsspec/tests/spec-interface/enum3.yml
+++ b/rtemsspec/tests/spec-interface/enum3.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: Enum B brief description.
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 definition-kind: typedef-and-enum
 description: null
 enabled-by: true
diff --git a/rtemsspec/tests/spec-interface/enum4.yml b/rtemsspec/tests/spec-interface/enum4.yml
index 00d07e66..04331533 100644
--- a/rtemsspec/tests/spec-interface/enum4.yml
+++ b/rtemsspec/tests/spec-interface/enum4.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: Enum C brief description.
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 definition-kind: typedef-and-enum
 description: null
 enabled-by: true
diff --git a/rtemsspec/tests/spec-interface/enumerator-0.yml b/rtemsspec/tests/spec-interface/enumerator-0.yml
index b92ac2a0..421440f2 100644
--- a/rtemsspec/tests/spec-interface/enumerator-0.yml
+++ b/rtemsspec/tests/spec-interface/enumerator-0.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: Enumerator 0 brief description.
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 definition:
   default: null
   variants: []
diff --git a/rtemsspec/tests/spec-interface/enumerator-1.yml b/rtemsspec/tests/spec-interface/enumerator-1.yml
index 7548e1eb..e29b9d2d 100644
--- a/rtemsspec/tests/spec-interface/enumerator-1.yml
+++ b/rtemsspec/tests/spec-interface/enumerator-1.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: Enumerator 1 brief description.
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 definition:
   default: null
   variants: []
diff --git a/rtemsspec/tests/spec-interface/enumerator-2.yml b/rtemsspec/tests/spec-interface/enumerator-2.yml
index 5fff89d5..b312867b 100644
--- a/rtemsspec/tests/spec-interface/enumerator-2.yml
+++ b/rtemsspec/tests/spec-interface/enumerator-2.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: Enumerator 2 brief description.
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 definition:
   default: null
   variants: []
diff --git a/rtemsspec/tests/spec-interface/enumerator-a.yml b/rtemsspec/tests/spec-interface/enumerator-a.yml
index e7b2a79d..349ed826 100644
--- a/rtemsspec/tests/spec-interface/enumerator-a.yml
+++ b/rtemsspec/tests/spec-interface/enumerator-a.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: Enumerator A brief description.
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 definition:
   default: '17'
   variants: []
diff --git a/rtemsspec/tests/spec-interface/enumerator-b.yml b/rtemsspec/tests/spec-interface/enumerator-b.yml
index be47ee6e..424839fe 100644
--- a/rtemsspec/tests/spec-interface/enumerator-b.yml
+++ b/rtemsspec/tests/spec-interface/enumerator-b.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: Enumerator B brief description.
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 definition:
   default: ${enumerator-a:/name}
   variants: []
diff --git a/rtemsspec/tests/spec-interface/float_t.yml b/rtemsspec/tests/spec-interface/float_t.yml
index 24f009b5..5d395533 100644
--- a/rtemsspec/tests/spec-interface/float_t.yml
+++ b/rtemsspec/tests/spec-interface/float_t.yml
@@ -1,6 +1,6 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 enabled-by: true
 index-entries: []
 interface-type: typedef
diff --git a/rtemsspec/tests/spec-interface/forward-decl.yml b/rtemsspec/tests/spec-interface/forward-decl.yml
index 1bd10c25..e53e37f3 100644
--- a/rtemsspec/tests/spec-interface/forward-decl.yml
+++ b/rtemsspec/tests/spec-interface/forward-decl.yml
@@ -1,6 +1,6 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 enabled-by: true
 index-entries: []
 interface-type: forward-declaration
diff --git a/rtemsspec/tests/spec-interface/func.yml b/rtemsspec/tests/spec-interface/func.yml
index c60a9302..dd80f7f3 100644
--- a/rtemsspec/tests/spec-interface/func.yml
+++ b/rtemsspec/tests/spec-interface/func.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: Function brief description.
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 definition:
   default:
     attributes: null
diff --git a/rtemsspec/tests/spec-interface/func2.yml b/rtemsspec/tests/spec-interface/func2.yml
index f77ec49f..f54fcdfa 100644
--- a/rtemsspec/tests/spec-interface/func2.yml
+++ b/rtemsspec/tests/spec-interface/func2.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: Very long function brief description.
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 definition:
   default:
     attributes: __attribute__((__const__))
diff --git a/rtemsspec/tests/spec-interface/func3.yml b/rtemsspec/tests/spec-interface/func3.yml
index 97eeda46..cb21da34 100644
--- a/rtemsspec/tests/spec-interface/func3.yml
+++ b/rtemsspec/tests/spec-interface/func3.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: null
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 definition:
   default: null
   variants:
diff --git a/rtemsspec/tests/spec-interface/func4.yml b/rtemsspec/tests/spec-interface/func4.yml
index 3d6cafbf..70b68a7c 100644
--- a/rtemsspec/tests/spec-interface/func4.yml
+++ b/rtemsspec/tests/spec-interface/func4.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: Function brief description with very long return type.
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 definition:
   default:
     attributes: null
diff --git a/rtemsspec/tests/spec-interface/func5.yml b/rtemsspec/tests/spec-interface/func5.yml
index bc8f6efd..bcb8bf00 100644
--- a/rtemsspec/tests/spec-interface/func5.yml
+++ b/rtemsspec/tests/spec-interface/func5.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: null
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 definition:
   default:
     attributes: null
diff --git a/rtemsspec/tests/spec-interface/func6.yml b/rtemsspec/tests/spec-interface/func6.yml
index 27c64428..329ec708 100644
--- a/rtemsspec/tests/spec-interface/func6.yml
+++ b/rtemsspec/tests/spec-interface/func6.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: null
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 definition:
   default:
     attributes: null
diff --git a/rtemsspec/tests/spec-interface/ga.yml b/rtemsspec/tests/spec-interface/ga.yml
index 0a7784eb..8bf6b17e 100644
--- a/rtemsspec/tests/spec-interface/ga.yml
+++ b/rtemsspec/tests/spec-interface/ga.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: Group A brief description.
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 description: Group A description.
 enabled-by: true
 identifier: GroupA
diff --git a/rtemsspec/tests/spec-interface/gb.yml b/rtemsspec/tests/spec-interface/gb.yml
index 38660c2b..3d5499bc 100644
--- a/rtemsspec/tests/spec-interface/gb.yml
+++ b/rtemsspec/tests/spec-interface/gb.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: null
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 description: null
 enabled-by: true
 identifier: GroupB
diff --git a/rtemsspec/tests/spec-interface/gc.yml b/rtemsspec/tests/spec-interface/gc.yml
index 3957a7e6..3176e394 100644
--- a/rtemsspec/tests/spec-interface/gc.yml
+++ b/rtemsspec/tests/spec-interface/gc.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: Group C brief description.
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 description: Group C description.
 enabled-by: true
 identifier: GroupC
diff --git a/rtemsspec/tests/spec-interface/ge.yml b/rtemsspec/tests/spec-interface/ge.yml
index 7c944143..b7fea67d 100644
--- a/rtemsspec/tests/spec-interface/ge.yml
+++ b/rtemsspec/tests/spec-interface/ge.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: Group E brief description.
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 description: Group E description.
 enabled-by: true
 identifier: GroupE
diff --git a/rtemsspec/tests/spec-interface/gf.yml b/rtemsspec/tests/spec-interface/gf.yml
index 77ea9b5b..ff09beb4 100644
--- a/rtemsspec/tests/spec-interface/gf.yml
+++ b/rtemsspec/tests/spec-interface/gf.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: Group F brief description.
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 description: Group F description.
 enabled-by: true
 identifier: GroupF
diff --git a/rtemsspec/tests/spec-interface/h.yml b/rtemsspec/tests/spec-interface/h.yml
index ec273a6b..1b04500e 100644
--- a/rtemsspec/tests/spec-interface/h.yml
+++ b/rtemsspec/tests/spec-interface/h.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: This header file defines X.
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 enabled-by:
 - and:
   - RTEMS_SMP
diff --git a/rtemsspec/tests/spec-interface/h2.yml b/rtemsspec/tests/spec-interface/h2.yml
index 1310cc06..45cca8c3 100644
--- a/rtemsspec/tests/spec-interface/h2.yml
+++ b/rtemsspec/tests/spec-interface/h2.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: This header file defines X.
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 enabled-by: RTEMS_SMP
 index-entries: []
 interface-type: header-file
diff --git a/rtemsspec/tests/spec-interface/h3.yml b/rtemsspec/tests/spec-interface/h3.yml
index 42d388d5..06e75670 100644
--- a/rtemsspec/tests/spec-interface/h3.yml
+++ b/rtemsspec/tests/spec-interface/h3.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: This header file defines X.
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 enabled-by: true
 index-entries: []
 interface-type: header-file
diff --git a/rtemsspec/tests/spec-interface/h4.yml b/rtemsspec/tests/spec-interface/h4.yml
index 82128ad6..b49c6cd8 100644
--- a/rtemsspec/tests/spec-interface/h4.yml
+++ b/rtemsspec/tests/spec-interface/h4.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: This header file defines X.
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 enabled-by: true
 index-entries: []
 interface-type: header-file
diff --git a/rtemsspec/tests/spec-interface/irqamp-timestamp.yml b/rtemsspec/tests/spec-interface/irqamp-timestamp.yml
index 05d2ed58..f0b33873 100644
--- a/rtemsspec/tests/spec-interface/irqamp-timestamp.yml
+++ b/rtemsspec/tests/spec-interface/irqamp-timestamp.yml
@@ -3,7 +3,7 @@ brief: |
   This structure defines the ${.:/register-block-group} register block memory
   map.
 copyrights:
-- Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2021 embedded brains GmbH & Co. KG
 description: null
 enabled-by: true
 identifier: IrqampTimestamp
diff --git a/rtemsspec/tests/spec-interface/irqamp.yml b/rtemsspec/tests/spec-interface/irqamp.yml
index 2a7a8cfb..c6efd13c 100644
--- a/rtemsspec/tests/spec-interface/irqamp.yml
+++ b/rtemsspec/tests/spec-interface/irqamp.yml
@@ -3,7 +3,7 @@ brief: |
   This structure defines the ${.:/register-block-group} register block memory
   map.
 copyrights:
-- Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2021 embedded brains GmbH & Co. KG
 description: null
 enabled-by: true
 identifier: Irqamp
diff --git a/rtemsspec/tests/spec-interface/macro.yml b/rtemsspec/tests/spec-interface/macro.yml
index 449576c2..5b4c38a5 100644
--- a/rtemsspec/tests/spec-interface/macro.yml
+++ b/rtemsspec/tests/spec-interface/macro.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: Very long macro brief description.
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 definition:
   default:
     attributes: null
diff --git a/rtemsspec/tests/spec-interface/macro2.yml b/rtemsspec/tests/spec-interface/macro2.yml
index fdae338f..4d71e3ad 100644
--- a/rtemsspec/tests/spec-interface/macro2.yml
+++ b/rtemsspec/tests/spec-interface/macro2.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: Short macro brief description.
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 definition:
   default:
     attributes: null
diff --git a/rtemsspec/tests/spec-interface/macro3.yml b/rtemsspec/tests/spec-interface/macro3.yml
index be93887a..891071ac 100644
--- a/rtemsspec/tests/spec-interface/macro3.yml
+++ b/rtemsspec/tests/spec-interface/macro3.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: Macro without parameters.
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 definition:
   default:
     attributes: null
diff --git a/rtemsspec/tests/spec-interface/math.yml b/rtemsspec/tests/spec-interface/math.yml
index 3e8f2861..d436aec7 100644
--- a/rtemsspec/tests/spec-interface/math.yml
+++ b/rtemsspec/tests/spec-interface/math.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: This header file defines X.
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 enabled-by: true
 index-entries: []
 interface-type: header-file
diff --git a/rtemsspec/tests/spec-interface/option.yml b/rtemsspec/tests/spec-interface/option.yml
index 523bde33..da2e03fa 100644
--- a/rtemsspec/tests/spec-interface/option.yml
+++ b/rtemsspec/tests/spec-interface/option.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0
 appl-config-option-type: feature
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 default: default a
 description: description a
 enabled-by: true
diff --git a/rtemsspec/tests/spec-interface/register-block-no-size.yml b/rtemsspec/tests/spec-interface/register-block-no-size.yml
index 3c78e5b7..82bd9357 100644
--- a/rtemsspec/tests/spec-interface/register-block-no-size.yml
+++ b/rtemsspec/tests/spec-interface/register-block-no-size.yml
@@ -2,7 +2,7 @@ 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)
+- Copyright (C) 2022 embedded brains GmbH & Co. KG
 description: null
 enabled-by: true
 identifier: RBNS
diff --git a/rtemsspec/tests/spec-interface/s.yml b/rtemsspec/tests/spec-interface/s.yml
index 3460e29b..35f09a54 100644
--- a/rtemsspec/tests/spec-interface/s.yml
+++ b/rtemsspec/tests/spec-interface/s.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: null
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 definition:
 - default:
     brief: Brief union description.
diff --git a/rtemsspec/tests/spec-interface/s2.yml b/rtemsspec/tests/spec-interface/s2.yml
new file mode 100644
index 00000000..c7c857fc
--- /dev/null
+++ b/rtemsspec/tests/spec-interface/s2.yml
@@ -0,0 +1,30 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: null
+copyrights:
+- Copyright (C) 2023 embedded brains GmbH & Co. KG
+definition:
+- default:
+    brief: Brief member description.
+    definition: ${/c/if/uint32_t:/name} ${.:name}
+    description: Member description.
+    kind: member
+    name: member
+  variants: []
+definition-kind: typedef-only
+description: |
+  References: ${.:/name}
+enabled-by: true
+index-entries: []
+interface-type: struct
+links:
+- role: interface-placement
+  uid: h
+- role: interface-ingroup
+  uid: ga
+- role: constraint
+  uid: constraint/other
+- role: constraint
+  uid: constraint/type-opaque
+name: Struct2
+notes: Notes.
+type: interface
diff --git a/rtemsspec/tests/spec-interface/smp.yml b/rtemsspec/tests/spec-interface/smp.yml
index c522cb20..976a599b 100644
--- a/rtemsspec/tests/spec-interface/smp.yml
+++ b/rtemsspec/tests/spec-interface/smp.yml
@@ -1,6 +1,6 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 enabled-by: true
 index-entries: []
 interface-type: unspecified-define
diff --git a/rtemsspec/tests/spec-interface/stdint.yml b/rtemsspec/tests/spec-interface/stdint.yml
index 45165d90..2013ef18 100644
--- a/rtemsspec/tests/spec-interface/stdint.yml
+++ b/rtemsspec/tests/spec-interface/stdint.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: This header file defines X.
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 enabled-by: true
 index-entries: []
 interface-type: header-file
diff --git a/rtemsspec/tests/spec-interface/td.yml b/rtemsspec/tests/spec-interface/td.yml
index e4f5cb29..c1df8dc4 100644
--- a/rtemsspec/tests/spec-interface/td.yml
+++ b/rtemsspec/tests/spec-interface/td.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: Typedef Integer brief description.
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 definition:
   default: |
     ${uint32_t:/name} ${.:/name} /* ${other:/comment} */
diff --git a/rtemsspec/tests/spec-interface/td3.yml b/rtemsspec/tests/spec-interface/td3.yml
index b1ef1622..5ef221d2 100644
--- a/rtemsspec/tests/spec-interface/td3.yml
+++ b/rtemsspec/tests/spec-interface/td3.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: null
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 definition:
   default: null
   variants:
diff --git a/rtemsspec/tests/spec-interface/u.yml b/rtemsspec/tests/spec-interface/u.yml
index d6e7d8ce..94da3814 100644
--- a/rtemsspec/tests/spec-interface/u.yml
+++ b/rtemsspec/tests/spec-interface/u.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: null
 copyrights:
-- Copyright (C) 2022 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2022 embedded brains GmbH & Co. KG
 definition:
 - default:
     brief: Brief member 0 description.
diff --git a/rtemsspec/tests/spec-interface/uint32_t.yml b/rtemsspec/tests/spec-interface/uint32_t.yml
index 3fffa0cf..2570f87a 100644
--- a/rtemsspec/tests/spec-interface/uint32_t.yml
+++ b/rtemsspec/tests/spec-interface/uint32_t.yml
@@ -1,6 +1,6 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 enabled-by: true
 index-entries: []
 interface-type: typedef
diff --git a/rtemsspec/tests/spec-interface/var.yml b/rtemsspec/tests/spec-interface/var.yml
index dc4df652..fc2f71bd 100644
--- a/rtemsspec/tests/spec-interface/var.yml
+++ b/rtemsspec/tests/spec-interface/var.yml
@@ -1,7 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 brief: Variable brief description.
 copyrights:
-- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
 definition:
   default: |
     ${forward-decl:/name} *${.:/name}
diff --git a/rtemsspec/tests/spec-sphinx/s.yml b/rtemsspec/tests/spec-sphinx/s.yml
new file mode 100644
index 00000000..d8fcbe9f
--- /dev/null
+++ b/rtemsspec/tests/spec-sphinx/s.yml
@@ -0,0 +1,14 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: null
+copyrights:
+- Copyright (C) 2023 embedded brains GmbH & Co. KG
+definition: []
+definition-kind: struct-only
+description: null
+enabled-by: true
+index-entries: []
+interface-type: struct
+links: []
+name: s
+notes: null
+type: interface
diff --git a/rtemsspec/tests/test_content_sphinx.py b/rtemsspec/tests/test_content_sphinx.py
index 4858f796..ec8bd272 100644
--- a/rtemsspec/tests/test_content_sphinx.py
+++ b/rtemsspec/tests/test_content_sphinx.py
@@ -365,3 +365,4 @@ def test_substitute(tmpdir):
     assert mapper.substitute("${y:/name}") == "foobar"
     assert mapper.substitute("${a:/name}") == ":c:data:`a`"
     assert mapper.substitute("${f:/name}") == ":c:func:`f`"
+    assert mapper.substitute("${s:/name}") == "``struct s``"
diff --git a/rtemsspec/tests/test_interface.py b/rtemsspec/tests/test_interface.py
index f1131784..bee4f00a 100644
--- a/rtemsspec/tests/test_interface.py
+++ b/rtemsspec/tests/test_interface.py
@@ -63,7 +63,7 @@ def test_interface(tmpdir):
  */
 
 /*
- * Copyright (C) 2020, 2022 embedded brains GmbH (http://www.embedded-brains.de)
+ * Copyright (C) 2020, 2023 embedded brains GmbH & Co. KG
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -594,6 +594,34 @@ struct Struct {
   Enum some_member_4;
 };
 
+/* Generated from spec:/s2 */
+
+/**
+ * @ingroup GroupA
+ *
+ * References: Struct2
+ *
+ * @par Notes
+ * Notes.
+ *
+ * @par Constraints
+ * @parblock
+ * The following constraints apply to this structure:
+ *
+ * * Some constraint.
+ *
+ * * Members of the type shall not be accessed directly by the application.
+ * @endparblock
+ */
+typedef struct {
+  /**
+   * @brief Brief member description.
+   *
+   * Member description.
+   */
+  uint32_t member;
+} Struct2;
+
 /* Generated from spec:/td */
 
 /**
diff --git a/rtemsspec/tests/test_interfacedoc.py b/rtemsspec/tests/test_interfacedoc.py
index 7ed88ee6..d2698cb7 100644
--- a/rtemsspec/tests/test_interfacedoc.py
+++ b/rtemsspec/tests/test_interfacedoc.py
@@ -34,6 +34,11 @@ from rtemsspec.tests.util import create_item_cache_config_and_copy_spec
 
 
 def test_interfacedoc(tmpdir):
+    item_cache_config = create_item_cache_config_and_copy_spec(
+        tmpdir, "spec-interface", with_spec_types=True)
+    item_cache = ItemCache(item_cache_config)
+    augment_glossary_terms(item_cache["/glossary"], [])
+
     doc_config = {}
     doc_config["group"] = "/gb"
     introduction_rst = os.path.join(tmpdir, "introduction.rst")
@@ -48,17 +53,24 @@ def test_interfacedoc(tmpdir):
     directives_2_rst = os.path.join(tmpdir, "directives-2.rst")
     doc_config_2["directives-target"] = directives_2_rst
 
-    item_cache_config = create_item_cache_config_and_copy_spec(
-        tmpdir, "spec-interface", with_spec_types=True)
-    config = {"enabled": [], "groups": [doc_config, doc_config_2]}
-    item_cache = ItemCache(item_cache_config)
-    augment_glossary_terms(item_cache["/glossary"], [])
+    types_rst = os.path.join(tmpdir, "types.rst")
+    types_config = {
+        "domains": ["/domain-abc"],
+        "groups": [],
+        "target": types_rst
+    }
+
+    config = {
+        "enabled": [],
+        "groups": [doc_config, doc_config_2],
+        "types": types_config
+    }
     generate(config, item_cache)
 
     with open(introduction_rst, "r") as src:
         content = """.. SPDX-License-Identifier: CC-BY-SA-4.0
 
-.. Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+.. Copyright (C) 2020 embedded brains GmbH & Co. KG
 
 .. This file is part of the RTEMS quality process and was automatically
 .. generated.  If you find something that needs to be fixed or
@@ -110,7 +122,7 @@ The directives provided by the Group B are:
     with open(directives_rst, "r") as src:
         content = """.. SPDX-License-Identifier: CC-BY-SA-4.0
 
-.. Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+.. Copyright (C) 2020 embedded brains GmbH & Co. KG
 
 .. This file is part of the RTEMS quality process and was automatically
 .. generated.  If you find something that needs to be fixed or
@@ -223,7 +235,7 @@ VeryLongFunction description.
 ``2``
     is returned, in case B.
 
-:c:type:`Enum`
+:ref:`InterfaceEnum`
     is returned, in case C.
 
 Sometimes some value.  See :ref:`InterfaceFunction`.
@@ -358,7 +370,7 @@ Macro without parameters.
     with open(introduction_2_rst, "r") as src:
         content = """.. SPDX-License-Identifier: CC-BY-SA-4.0
 
-.. Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+.. Copyright (C) 2020 embedded brains GmbH & Co. KG
 
 .. This file is part of the RTEMS quality process and was automatically
 .. generated.  If you find something that needs to be fixed or
@@ -396,7 +408,7 @@ Group A description. The directives provided by the Group A are:
     with open(directives_2_rst, "r") as src:
         content = """.. SPDX-License-Identifier: CC-BY-SA-4.0
 
-.. Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+.. Copyright (C) 2020 embedded brains GmbH & Co. KG
 
 .. This file is part of the RTEMS quality process and was automatically
 .. generated.  If you find something that needs to be fixed or
@@ -466,10 +478,11 @@ Function brief description.
 .. rubric:: DESCRIPTION:
 
 Function description.  References to :term:`xs <x>`,
-:ref:`InterfaceVeryLongFunction`, :c:type:`Integer`, :c:type:`Enum`,
-:c:macro:`DEFINE`, :ref:`InterfaceVERYLONGMACRO`, Variable,
-:c:macro:`ENUMERATOR_0`, ``struct Struct``, :ref:`a`, interface, :ref:`GroupA`,
-and Group F.  Second parameter is ``Param1``. Mention :c:type:`US`.
+:ref:`InterfaceVeryLongFunction`, :ref:`InterfaceInteger`,
+:ref:`InterfaceEnum`, :c:macro:`DEFINE`, :ref:`InterfaceVERYLONGMACRO`,
+Variable, :c:macro:`ENUMERATOR_0`, ``struct Struct``, :ref:`a`, interface,
+:ref:`GroupA`, and Group F.  Second parameter is ``Param1``. Mention ``struct
+US``.
 
 .. code-block:
 
@@ -492,3 +505,186 @@ The following constraints apply to this directive:
 
     void VoidFunction( void );
 """
+
+    with open(types_rst, "r") as src:
+        content = """.. SPDX-License-Identifier: CC-BY-SA-4.0
+
+.. Copyright (C) 2020, 2023 embedded brains GmbH & Co. KG
+
+.. This file is part of the RTEMS quality process and was automatically
+.. generated.  If you find something that needs to be fixed or
+.. worded better please post a report or patch to an RTEMS mailing list
+.. or raise a bug report:
+..
+.. https://www.rtems.org/bugs.html
+..
+.. For information on updating and regenerating please refer to the How-To
+.. section in the Software Requirements Engineering chapter of the
+.. RTEMS Software Engineering manual.  The manual is provided as a part of
+.. a release.  For development sources please refer to the online
+.. documentation at:
+..
+.. https://docs.rtems.org
+
+.. index:: RTEMS Data Types
+.. index:: data types
+
+RTEMS Data Types
+****************
+
+.. _Introduction:
+
+Introduction
+============
+
+This chapter contains a complete list of the RTEMS primitive data types in
+alphabetical order.  This is intended to be an overview and the user is
+encouraged to look at the appropriate chapters in the manual for more
+information about the usage of the various data types.
+
+.. _ListOfDataTypes:
+
+List of Data Types
+==================
+
+The following is a complete list of the RTEMS primitive data types in
+alphabetical order:
+
+.. Generated from spec:/enum
+
+.. index:: Enum
+
+.. _InterfaceEnum:
+
+Enum
+----
+
+Enum brief description.
+
+.. rubric:: ENUMERATORS:
+
+ENUMERATOR_0
+    Enumerator 0 brief description.
+
+ENUMERATOR_1
+    Enumerator 1 brief description.
+
+ENUMERATOR_2
+    Enumerator 2 brief description.
+
+.. rubric:: DESCRIPTION:
+
+Enum description.
+
+.. Generated from spec:/enum2
+
+.. index:: EnumA
+
+.. _InterfaceEnumA:
+
+EnumA
+-----
+
+Enum A brief description.
+
+.. rubric:: ENUMERATORS:
+
+ENUMERATOR_A
+    Enumerator A brief description.
+
+.. Generated from spec:/enum3
+
+.. index:: EnumB
+
+.. _InterfaceEnumB:
+
+EnumB
+-----
+
+Enum B brief description.
+
+.. rubric:: ENUMERATORS:
+
+ENUMERATOR_B
+    Enumerator B brief description.
+
+.. Generated from spec:/td
+
+.. index:: Integer
+
+.. _InterfaceInteger:
+
+Integer
+-------
+
+Typedef Integer brief description.
+
+.. rubric:: DESCRIPTION:
+
+Typedef Integer description.
+
+.. Generated from spec:/td3
+
+.. index:: Integer3
+
+.. _InterfaceInteger3:
+
+Integer3
+--------
+
+.. Generated from spec:/s
+
+.. index:: Struct
+
+.. _InterfaceStruct:
+
+Struct
+------
+
+.. rubric:: MEMBERS:
+
+some_union
+    Brief union description. Union description.
+
+some_member_4
+    Brief member 4 description. Member 4 description.
+
+.. Generated from spec:/s2
+
+.. index:: Struct2
+
+.. _InterfaceStruct2:
+
+Struct2
+-------
+
+.. rubric:: MEMBERS:
+
+Members of the type shall not be accessed directly by the application.
+
+.. rubric:: DESCRIPTION:
+
+References: :ref:`InterfaceStruct2`
+
+.. rubric:: NOTES:
+
+Notes.
+
+.. Generated from spec:/u
+
+.. index:: Union
+
+.. _InterfaceUnion:
+
+Union
+-----
+
+.. rubric:: MEMBERS:
+
+m_0
+    Brief member 0 description.
+
+m_1
+    Brief member 1 description.
+"""
+        assert content == src.read()



More information about the vc mailing list