[util] Add version requirement for Xilinx Vivado

This commit adds a minimum version requirement for Xilinx Vivado
(currently set to 2020.1). We do not yet enforce a specific Vivado
version but maybe will do that soon. At the moment, having a specified
version allows us to more easily keep the documentation up to date.

Signed-off-by: Pirmin Vogel <vogelpi@lowrisc.org>
diff --git a/util/check_tool_requirements.py b/util/check_tool_requirements.py
index 5c1d386..f706625 100755
--- a/util/check_tool_requirements.py
+++ b/util/check_tool_requirements.py
@@ -223,6 +223,21 @@
         return '.'.join(m.group(1, 2, 3))
 
 
+class VivadoToolReq(ToolReq):
+    tool_cmd = ['vivado', '-version']
+    version_regex = re.compile(r'Vivado v(.*)\s')
+
+    def to_semver(self, version, from_req):
+        # Regular Vivado releases just have a major and minor version.
+        # In this case, we set the patch level to 0.
+        m = re.fullmatch(r'([0-9]+)\.([0-9]+)(?:\.([0-9]+))?', version)
+        if m is None:
+            raise ValueError("{} has invalid version string format."
+                             .format(version))
+
+        return '.'.join((m.group(1), m.group(2), m.group(3) or '0'))
+
+
 class VcsToolReq(ToolReq):
     tool_cmd = ['vcs', '-full64', '-ID']
     tool_env = {'VCS_ARCH_OVERRIDE': 'linux'}
@@ -308,7 +323,8 @@
         'edalize': PyModuleToolReq,
         'vcs': VcsToolReq,
         'verible': VeribleToolReq,
-        'verilator': VerilatorToolReq
+        'verilator': VerilatorToolReq,
+        'vivado': VivadoToolReq,
     }
     cls = classes.get(tool, ToolReq)