You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tvm.apache.org by mo...@apache.org on 2020/12/02 20:26:40 UTC

[tvm] branch main updated: [Backend][Verilator] regression tests (#7000)

This is an automated email from the ASF dual-hosted git repository.

moreau pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tvm.git


The following commit(s) were added to refs/heads/main by this push:
     new e212f96  [Backend][Verilator] regression tests (#7000)
e212f96 is described below

commit e212f96c6046373de5059e380bf88be8a69a3424
Author: Luis Vega <ve...@users.noreply.github.com>
AuthorDate: Wed Dec 2 12:26:23 2020 -0800

    [Backend][Verilator] regression tests (#7000)
    
    * add files
    
    * update tests
    
    * test this
    
    * test this case
    
    * update jenkins file
    
    * fix offload
    
    * update
    
    * update variables
    
    * rollback ci files
---
 tests/python/contrib/test_verilator/__init__.py    | 18 +++++
 .../contrib/test_verilator/infrastructure.py       | 83 ++++++++++++++++++++++
 .../test_verilator/test_verilator_codegen.py       | 67 +++++++++++++++++
 3 files changed, 168 insertions(+)

diff --git a/tests/python/contrib/test_verilator/__init__.py b/tests/python/contrib/test_verilator/__init__.py
new file mode 100644
index 0000000..4838dc3
--- /dev/null
+++ b/tests/python/contrib/test_verilator/__init__.py
@@ -0,0 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+""" Infrastructure and tests for Verilator codegen """
diff --git a/tests/python/contrib/test_verilator/infrastructure.py b/tests/python/contrib/test_verilator/infrastructure.py
new file mode 100644
index 0000000..1333f48
--- /dev/null
+++ b/tests/python/contrib/test_verilator/infrastructure.py
@@ -0,0 +1,83 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+"""Verilator utility functions"""
+
+import sys
+
+import tvm
+from tvm import relay
+import tvm.relay.testing
+from tvm import runtime
+from tvm.relay import transform
+
+
+def _register_verilator_op(op_name, supported=True):
+    """The helper function to indicate that a given operator can be supported by Verilator.
+
+    Paramters
+    ---------
+    op_name : Str
+        The name of operator that will be registered.
+
+    Returns
+    -------
+    f : callable
+        A function that returns if the operator is supported by DNNL.
+    """
+
+    @tvm.ir.register_op_attr(op_name, "target.verilator")
+    def _func_wrapper(expr):
+        return supported
+
+    return _func_wrapper
+
+
+def skip_test():
+    """Skip test if it requires the Verilator codegen and it's not present."""
+    if not tvm.get_global_func("relay.ext.verilator", True):
+        print("Skip test because Verilator codegen is not available.")
+        return True
+    if sys.platform == "win32":
+        print("Skip test on Windows for now")
+        return True
+    return False
+
+
+def offload(mod):
+    """Offload ops based on the registered ops"""
+
+    backend = "verilator"
+    mod = transform.AnnotateTarget([backend])(mod)
+    mod = transform.PartitionGraph()(mod)
+    return mod
+
+
+def compile_module(mod):
+    """Compile Relay module"""
+
+    with relay.build_config(opt_level=3):
+        exe = relay.vm.compile(mod, target="llvm", params=None)
+        code, lib = exe.save()
+        return runtime.vm.Executable.load_exec(code, lib)
+
+
+def run_module(exe, inputs):
+    """Run Relay module"""
+
+    ctx = tvm.cpu()
+    vm = runtime.vm.VirtualMachine(exe, ctx)
+    return vm.run(**inputs)
diff --git a/tests/python/contrib/test_verilator/test_verilator_codegen.py b/tests/python/contrib/test_verilator/test_verilator_codegen.py
new file mode 100644
index 0000000..664e254
--- /dev/null
+++ b/tests/python/contrib/test_verilator/test_verilator_codegen.py
@@ -0,0 +1,67 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+"""Verilator codegen tests"""
+
+import numpy as np
+
+import tvm
+from tvm import relay
+
+from test_verilator.infrastructure import (
+    _register_verilator_op,
+    skip_test,
+    compile_module,
+    run_module,
+    offload,
+)
+
+
+_register_verilator_op("add")
+
+
+def create_module_add(shape, dtype):
+    x = relay.var("x", shape=shape, dtype=dtype)
+    y = relay.var("y", shape=shape, dtype=dtype)
+    z = relay.add(x, y)
+    f = relay.Function([x, y], z)
+    mod = tvm.IRModule()
+    mod["main"] = f
+    return mod
+
+
+def run_check_add(exe, shape, dtype):
+    x_data = np.random.randint(5, size=shape, dtype=dtype)
+    y_data = np.random.randint(5, size=shape, dtype=dtype)
+    ref = x_data + y_data
+    inputs = {"x": x_data, "y": y_data}
+    out = run_module(exe, inputs)
+    tvm.testing.assert_allclose(out.asnumpy(), ref, rtol=1e-5, atol=1e-5)
+
+
+def test_add():
+    if skip_test():
+        return
+    dtype = "int32"
+    shape = (8, 4)
+    mod = create_module_add(shape, dtype)
+    mod = offload(mod)
+    exe = compile_module(mod)
+    run_check_add(exe, shape, dtype)
+
+
+if __name__ == "__main__":
+    test_add()