Skip to content

Commit

Permalink
[Backend][Verilator] regression tests (#7000)
Browse files Browse the repository at this point in the history
* add files

* update tests

* test this

* test this case

* update jenkins file

* fix offload

* update

* update variables

* rollback ci files
  • Loading branch information
vegaluisjose authored Dec 2, 2020
1 parent 636739a commit e212f96
Show file tree
Hide file tree
Showing 3 changed files with 168 additions and 0 deletions.
18 changes: 18 additions & 0 deletions tests/python/contrib/test_verilator/__init__.py
Original file line number Diff line number Diff line change
@@ -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 """
83 changes: 83 additions & 0 deletions tests/python/contrib/test_verilator/infrastructure.py
Original file line number Diff line number Diff line change
@@ -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)
67 changes: 67 additions & 0 deletions tests/python/contrib/test_verilator/test_verilator_codegen.py
Original file line number Diff line number Diff line change
@@ -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()

0 comments on commit e212f96

Please sign in to comment.