Start of public OpenTitan development history

Code contributors:
Alex Bradbury <asb@lowrisc.org>
Cindy Chen <chencindy@google.com>
Eunchan Kim <eunchan@google.com>
Gaurang Chitroda <gaurangg@google.com>
Mark Hayter <mark.hayter@gmail.com>
Michael Schaffner <msf@google.com>
Miguel Osorio <miguelosorio@google.com>
Nils Graf <nilsg@google.com>
Philipp Wagner <phw@lowrisc.org>
Pirmin Vogel <vogelpi@lowrisc.org>
Ram Babu Penugonda <rampenugonda@google.com>
Scott Johnson <scottdj@google.com>
Shail Kushwah <kushwahs@google.com>
Srikrishna Iyer <sriyer@google.com>
Steve Nelson <Steve.Nelson@wdc.com>
Tao Liu <taliu@google.com>
Timothy Chen <timothytim@google.com>
Tobias Wölfel <tobias.woelfel@mailbox.org>
Weicai Yang <weicai@google.com>
diff --git a/util/reggen/gen_cheader.py b/util/reggen/gen_cheader.py
new file mode 100644
index 0000000..3fd3417
--- /dev/null
+++ b/util/reggen/gen_cheader.py
@@ -0,0 +1,148 @@
+# Copyright lowRISC contributors.
+# Licensed under the Apache License, Version 2.0, see LICENSE for details.
+# SPDX-License-Identifier: Apache-2.0
+"""
+Generate C header from validated register json tree
+"""
+
+import io
+import logging as log
+import re
+import sys
+
+
+def genout(outfile, msg):
+    outfile.write(msg)
+
+
+def as_define(s):
+    s = s.upper()
+    r = ''
+    for i in range(0, len(s)):
+        r += s[i] if s[i].isalnum() else '_'
+    return r
+
+
+def clean_desc(s):
+    return s.splitlines()[0]
+
+
+def gen_cdefine_register(outstr, reg, comp, width, rnames):
+    rname = reg['name']
+    offset = reg['genoffset']
+
+    genout(outstr, '// ' + clean_desc(reg['desc']) + '\n')
+    defname = as_define(comp + '_' + rname)
+    genout(
+        outstr, '#define ' + defname + '(id) (' + as_define(comp) +
+        '##id##_BASE_ADDR + ' + hex(offset) + ')\n')
+
+    for field in reg['fields']:
+        fieldlsb = field['bitinfo'][2]
+        fname = field['name']
+        if fname == rname:
+            dname = defname
+        else:
+            dname = defname + '_' + as_define(fname)
+
+        if field['bitinfo'][1] == 1:
+            # single bit
+            genout(outstr, '#define ' + dname + ' ' + str(fieldlsb) + '\n')
+        else:
+            # multiple bits (unless it is the whole register)
+            if field['bitinfo'][1] != width:
+                mask = field['bitinfo'][0] >> fieldlsb
+                genout(outstr,
+                       '#define ' + dname + '_MASK ' + hex(mask) + '\n')
+                genout(
+                    outstr,
+                    '#define ' + dname + '_OFFSET ' + str(fieldlsb) + '\n')
+            if 'enum' in field:
+                for enum in field['enum']:
+                    ename = as_define(enum['name'])
+                    genout(
+                        outstr,
+                        '#define ' + defname + '_' + as_define(field['name'])
+                        + '_' + ename + ' ' + enum['value'] + '\n')
+    genout(outstr, '\n')
+    return
+
+
+def gen_cdefine_window(outstr, win, comp, regwidth, rnames):
+    wname = win['name']
+    offset = win['genoffset']
+
+    genout(outstr, '// Memory area: ' + clean_desc(win['desc']) + '\n')
+    defname = as_define(comp + '_' + wname)
+    genout(
+        outstr,
+        '#define ' + defname + '(base) ((base) + ' + hex(offset) + ')\n')
+    items = int(win['items'])
+    genout(outstr, '#define ' + defname + '_SIZE_WORDS ' + str(items) + '\n')
+    items = items * (regwidth // 8)
+    genout(outstr, '#define ' + defname + '_SIZE_BYTES ' + str(items) + '\n')
+
+    wid = win['genvalidbits']
+    if (wid != regwidth):
+        mask = (1 << wid) - 1
+        genout(outstr, '#define ' + defname + '_MASK ' + hex(mask) + '\n')
+
+
+# Must have called validate, so should have no errors
+
+
+def gen_cdefines(regs, outfile, src_lic, src_copy):
+    component = regs['name']
+    registers = regs['registers']
+    rnames = regs['genrnames']
+    outstr = io.StringIO()
+
+    if 'regwidth' in regs:
+        regwidth = int(regs['regwidth'], 0)
+    else:
+        regwidth = 32
+
+    for x in registers:
+        if 'reserved' in x:
+            continue
+
+        if 'skipto' in x:
+            continue
+
+        if 'sameaddr' in x:
+            for sareg in x['sameaddr']:
+                gen_cdefine_register(outstr, sareg, component, regwidth,
+                                     rnames)
+            continue
+
+        if 'window' in x:
+            gen_cdefine_window(outstr, x['window'], component, regwidth,
+                               rnames)
+            continue
+
+        if 'multireg' in x:
+            for reg in x['multireg']['genregs']:
+                gen_cdefine_register(outstr, reg, component, regwidth, rnames)
+            continue
+
+        gen_cdefine_register(outstr, x, component, regwidth, rnames)
+
+    generated = outstr.getvalue()
+    outstr.close()
+
+    genout(outfile, '// Generated register defines for ' + component + '\n\n')
+    if src_copy != '':
+        genout(outfile, '// Copyright information found in source file:\n')
+        genout(outfile, '// ' + src_copy + '\n\n')
+    if src_lic != None:
+        genout(outfile, '// Licensing information found in source file:\n')
+        for line in src_lic.splitlines():
+            genout(outfile, '// ' + line + '\n')
+        genout(outfile, '\n')
+    genout(outfile, '#ifndef _' + as_define(component) + '_REG_DEFS_\n')
+    genout(outfile, '#define _' + as_define(component) + '_REG_DEFS_\n\n')
+    genout(outfile, generated)
+    genout(outfile, '#endif  // _' + as_define(component) + '_REG_DEFS_\n')
+    genout(outfile, '// End generated register defines for ' + component)
+
+    return