diff --git a/utils/regtools/desc/XML.txt b/utils/regtools/desc/XML.txt
index d4dc73cc64..15164a43b9 100644
--- a/utils/regtools/desc/XML.txt
+++ b/utils/regtools/desc/XML.txt
@@ -61,12 +61,25 @@ The following properties are defined:
- "name" (mandatory,string): the mnemonic of the register.
- "sct" (optional,"yes" or "no"): STMP specific attribute to specify the existence
of the SCT variants of this register.
+As a shortcut, in the case the register has a single address, one can add one more
+property:
+- "addr" (optional,integer): base address of this instance of the register.
Example:
+The address shortcut has the following standard translation:
+
+
+
+is equivalent to:
+
+
+
+
+
Element: soc.dev.reg.addr
-------------------------
Each device can have one or more addresses associated with it. Each address
diff --git a/utils/regtools/lib/soc_desc.cpp b/utils/regtools/lib/soc_desc.cpp
index 413c30936f..4b9f51b9ae 100644
--- a/utils/regtools/lib/soc_desc.cpp
+++ b/utils/regtools/lib/soc_desc.cpp
@@ -102,8 +102,8 @@ bool validate_uint32_hook(const std::string& str, uint32_t& s)
{
unsigned long u;
if(!validate_unsigned_long_hook(str, u)) return false;
-#if ULONG_MAX > UINT32_MAX
- if(u > UINT32_MAX) return false;
+#if ULONG_MAX > 0xffffffff
+ if(u > 0xffffffff) return false;
#endif
s = u;
return true;
@@ -177,12 +177,23 @@ bool parse_reg_formula_elem(xmlNode *node, soc_reg_formula_t& formula)
return true;
}
+bool parse_add_trivial_addr(const std::string& str, soc_reg_t& reg)
+{
+ soc_reg_addr_t a;
+ a.name = reg.name;
+ if(!validate_uint32_hook(str, a.addr))
+ return false;
+ reg.addr.push_back(a);
+ return true;
+}
+
bool parse_reg_elem(xmlNode *node, soc_reg_t& reg)
{
std::vector< soc_reg_formula_t > formulas;
BEGIN_ATTR_MATCH(node->properties)
MATCH_TEXT_ATTR("name", reg.name)
SOFT_MATCH_SCT_ATTR("sct", reg.flags)
+ SOFT_MATCH_X_ATTR("addr", parse_add_trivial_addr, reg)
END_ATTR_MATCH()
BEGIN_NODE_MATCH(node->children)