regtool: add support to generate reg const as Rust (.rs)

Add -R and --rust option in regtool.py to generate Rust file.

Add regs-rust target in hw/Makefile to generate reg constant Rust
file for ALL ips. If a TOCK_ROOT variable is specified, e.g.
"TOCK_ROOT=~/ti50/third_party/tock/tock make -C hw regs-rust",
the Rust files will also be copied to
$(TOCK_ROOT)/chips/lowrisc/src/reg_constants folder.

BUG=none
TEST=regtool.py -R -o uart_regs.rs uart.hjson
     make -C hw regs-rust
     TOCK_ROOT=~/ti50/third_party/tock/tock make -C hw regs-rust

Signed-off-by: Chia-Chi Teng <ccteng@google.com>

Change-Id: I5f668d51e1f42e6541a41f3e565848230d6c07b6
diff --git a/util/regtool.py b/util/regtool.py
index aa264c5..8b7ee7f 100755
--- a/util/regtool.py
+++ b/util/regtool.py
@@ -12,7 +12,7 @@
 from pathlib import PurePath
 
 from reggen import (gen_cheader, gen_dv, gen_fpv, gen_html,
-                    gen_json, gen_rtl, gen_selfdoc, version)
+                    gen_json, gen_rtl, gen_rust, gen_selfdoc, version)
 from reggen.ip_block import IpBlock
 
 DESC = """regtool, generate register info from Hjson source"""
@@ -46,6 +46,10 @@
                         '-D',
                         action='store_true',
                         help='Output C defines header')
+    parser.add_argument('--rust',
+                        '-R',
+                        action='store_true',
+                        help='Output Rust constants')
     parser.add_argument('--doc',
                         action='store_true',
                         help='Output source file documentation (gfm)')
@@ -117,7 +121,8 @@
     arg_to_format = [('j', ('json', None)), ('c', ('compact', None)),
                      ('d', ('html', None)), ('doc', ('doc', None)),
                      ('r', ('rtl', 'rtl')), ('s', ('dv', 'dv')),
-                     ('f', ('fpv', 'fpv/vip')), ('cdefines', ('cdh', None))]
+                     ('f', ('fpv', 'fpv/vip')), ('cdefines', ('cdh', None)),
+                     ('rust', ('rs', None))]
     format = None
     dirspec = None
     for arg_name, spec in arg_to_format:
@@ -225,6 +230,8 @@
                 return gen_html.gen_html(obj, outfile)
             elif format == 'cdh':
                 return gen_cheader.gen_cdefines(obj, outfile, src_lic, src_copy)
+            elif format == 'rs':
+                return gen_rust.gen_rust(obj, outfile, src_lic, src_copy)
             else:
                 return gen_json.gen_json(obj, outfile, format)