blob: 39e90e6d6ac48a6ec6ea8b9b0432eaa40e82fdd5 [file] [log] [blame]
# 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.
import pytest
import tvm.testing
from tvm.driver.tvmc import TVMCException
from tvm.driver.tvmc.target import target_from_cli, tokenize_target, parse_target
def test_target_from_cli__error_duplicate():
with pytest.raises(TVMCException):
_ = target_from_cli("llvm, llvm")
def test_target_invalid_more_than_two_tvm_targets():
with pytest.raises(TVMCException):
_ = target_from_cli("cuda, opencl, llvm")
def test_target_from_cli__error_target_not_found():
with pytest.raises(TVMCException):
_ = target_from_cli("invalidtarget")
def test_target_two_tvm_targets():
tvm_target, extra_targets = target_from_cli(
"opencl -device=mali, llvm -mtriple=aarch64-linux-gnu"
)
assert "opencl" in str(tvm_target)
assert "llvm" in str(tvm_target.host)
# No extra targets
assert 0 == len(extra_targets)
def test_tokenize_target_with_opts():
tokens = tokenize_target("foo -opt1=value1 --flag, bar -opt2=value2")
expected_tokens = ["foo", "-opt1=value1", "--flag", ",", "bar", "-opt2=value2"]
assert len(tokens) == len(expected_tokens)
assert tokens == expected_tokens
def test_tokenize_target_with_plus_sign():
tokens = tokenize_target("foo -opt1=+value1 --flag, bar -opt2=test,+v")
expected_tokens = ["foo", "-opt1=+value1", "--flag", ",", "bar", "-opt2=test,+v"]
assert len(tokens) == len(expected_tokens)
assert tokens == expected_tokens
def test_tokenize_target_with_commas():
tokens = tokenize_target("foo -opt1=v,a,l,u,e,1 --flag")
expected_tokens = ["foo", "-opt1=v,a,l,u,e,1", "--flag"]
assert len(tokens) == len(expected_tokens)
assert tokens == expected_tokens
def test_tokenize_target_with_commas_and_single_quotes():
tokens = tokenize_target("foo -opt1='v, a, l, u, e', bar")
expected_tokens = ["foo", "-opt1='v, a, l, u, e'", ",", "bar"]
assert len(tokens) == len(expected_tokens)
assert tokens == expected_tokens
def test_tokenize_target_with_commas_and_double_quotes():
tokens = tokenize_target('foo -opt1="v, a, l, u, e", bar')
expected_tokens = ["foo", '-opt1="v, a, l, u, e"', ",", "bar"]
assert len(tokens) == len(expected_tokens)
assert tokens == expected_tokens
def test_tokenize_target_with_dashes():
tokens = tokenize_target("foo-bar1 -opt-1=t-e-s-t, baz")
expected_tokens = ["foo-bar1", "-opt-1=t-e-s-t", ",", "baz"]
assert len(tokens) == len(expected_tokens)
assert tokens == expected_tokens
def test_parse_single_target_with_opts():
targets = parse_target("llvm -device=arm_cpu -mattr=+fp")
assert len(targets) == 1
assert "device" in targets[0]["opts"]
assert "mattr" in targets[0]["opts"]
def test_parse_multiple_target():
targets = parse_target("compute-library, llvm -device=arm_cpu")
assert len(targets) == 2
assert "compute-library" == targets[0]["name"]
assert "llvm" == targets[1]["name"]
def test_parse_hybrid_target():
"""Hybrid Target and external codegen"""
targets = parse_target("cmsis-nn -accelerator_config=ethos-u55-256, llvm -device=arm_cpu")
assert len(targets) == 2
assert "cmsis-nn" == targets[0]["name"]
assert not targets[0]["is_tvm_target"]
assert "llvm" == targets[1]["name"]
assert targets[1]["is_tvm_target"]
def test_parse_multiple_hybrid_target():
"""Hybrid Target and multiple external codegen"""
targets = parse_target("ethos-u,cmsis-nn,c")
assert len(targets) == 3
assert "ethos-u" == targets[0]["name"]
assert not targets[0]["is_tvm_target"]
assert "cmsis-nn" == targets[1]["name"]
assert not targets[1]["is_tvm_target"]
assert "c" == targets[2]["name"]
assert targets[2]["is_tvm_target"]
def test_parse_quotes_and_separators_on_options():
targets_no_quote = parse_target("foo -option1=+v1.0x,+value,+bar")
targets_single_quote = parse_target("foo -option1='+v1.0x,+value'")
targets_double_quote = parse_target('foo -option1="+v1.0x,+value"')
assert len(targets_no_quote) == 1
assert "+v1.0x,+value,+bar" == targets_no_quote[0]["opts"]["option1"]
assert len(targets_single_quote) == 1
assert "+v1.0x,+value" == targets_single_quote[0]["opts"]["option1"]
assert len(targets_double_quote) == 1
assert "+v1.0x,+value" == targets_double_quote[0]["opts"]["option1"]
def test_parse_multiple_target_with_opts_ethos_n78():
targets = parse_target("ethos-n -myopt=value, llvm -device=arm_cpu")
assert len(targets) == 2
assert "ethos-n" == targets[0]["name"]
assert "myopt" in targets[0]["opts"]
assert "value" == targets[0]["opts"]["myopt"]
assert "llvm" == targets[1]["name"]
if __name__ == "__main__":
tvm.testing.main()