This is an automated email from the ASF dual-hosted git repository.
areusch 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 f6a4044 [microTVM] Refactor `platform` used as board name in microTVM
(#8940)
f6a4044 is described below
commit f6a404447406f91ddf6195ac044dc1f0b0e867e7
Author: Mehrdad Hessar <[email protected]>
AuthorDate: Thu Sep 9 22:09:20 2021 +0200
[microTVM] Refactor `platform` used as board name in microTVM (#8940)
---
.../template_project/microtvm_api_server.py | 14 +++++
apps/microtvm/reference-vm/README.md | 6 +-
.../reference-vm/arduino/base-box/base_box_test.sh | 14 ++---
apps/microtvm/reference-vm/base-box-tool.py | 57 +++++++++---------
.../reference-vm/zephyr/base-box/base_box_test.sh | 14 ++---
.../zephyr/template_project/microtvm_api_server.py | 52 ++++++++++++++++-
tests/micro/arduino/README.md | 4 +-
tests/micro/arduino/conftest.py | 53 +++++++++--------
.../micro/arduino/test_arduino_error_detection.py | 8 +--
tests/micro/arduino/test_arduino_rpc_server.py | 43 +++++++-------
tests/micro/arduino/test_arduino_workflow.py | 10 ++--
tests/micro/zephyr/README.md | 6 +-
tests/micro/zephyr/conftest.py | 60 +++++++++++--------
tests/micro/zephyr/test_zephyr.py | 68 ++++++++--------------
tests/micro/zephyr/test_zephyr_aot.py | 24 ++++----
tests/scripts/task_python_microtvm.sh | 8 +--
tutorials/micro/micro_reference_vm.py | 4 +-
17 files changed, 252 insertions(+), 193 deletions(-)
diff --git a/apps/microtvm/arduino/template_project/microtvm_api_server.py
b/apps/microtvm/arduino/template_project/microtvm_api_server.py
index 38fc73c..3d25d0b 100644
--- a/apps/microtvm/arduino/template_project/microtvm_api_server.py
+++ b/apps/microtvm/arduino/template_project/microtvm_api_server.py
@@ -57,6 +57,7 @@ BOARD_PROPERTIES = {
"package": "arduino",
"architecture": "sam",
"board": "arduino_due_x_dbg",
+ "model": "sam3x8e",
},
# Due to the way the Feather S2 bootloader works, compilation
# behaves fine but uploads cannot be done automatically
@@ -64,27 +65,32 @@ BOARD_PROPERTIES = {
"package": "esp32",
"architecture": "esp32",
"board": "feathers2",
+ "model": "esp32",
},
"metrom4": {
"package": "adafruit",
"architecture": "samd",
"board": "adafruit_metro_m4",
+ "model": "atsamd51",
},
# Spresense only works as of its v2.3.0 sdk
"spresense": {
"package": "SPRESENSE",
"architecture": "spresense",
"board": "spresense",
+ "model": "cxd5602gg",
},
"nano33ble": {
"package": "arduino",
"architecture": "mbed_nano",
"board": "nano33ble",
+ "model": "nrf52840",
},
"pybadge": {
"package": "adafruit",
"architecture": "samd",
"board": "adafruit_pybadge_m4",
+ "model": "atsamd51",
},
# The Teensy boards are listed here for completeness, but they
# won't work until https://github.com/arduino/arduino-cli/issues/700
@@ -93,16 +99,19 @@ BOARD_PROPERTIES = {
"package": "teensy",
"architecture": "avr",
"board": "teensy40",
+ "model": "imxrt1060",
},
"teensy41": {
"package": "teensy",
"architecture": "avr",
"board": "teensy41",
+ "model": "imxrt1060",
},
"wioterminal": {
"package": "Seeeduino",
"architecture": "samd",
"board": "seeed_wio_terminal",
+ "model": "atsamd51",
},
}
@@ -114,6 +123,11 @@ PROJECT_OPTIONS = [
choices=list(BOARD_PROPERTIES),
help="Name of the Arduino board to build for",
),
+ server.ProjectOption(
+ "arduino_model",
+ choices=[board["model"] for _, board in BOARD_PROPERTIES.items()],
+ help="Name of the model for each Arduino board.",
+ ),
server.ProjectOption("arduino_cli_cmd", help="Path to the arduino-cli
tool."),
server.ProjectOption("port", help="Port to use for connecting to
hardware"),
server.ProjectOption(
diff --git a/apps/microtvm/reference-vm/README.md
b/apps/microtvm/reference-vm/README.md
index 9303c0a..a2302ef 100644
--- a/apps/microtvm/reference-vm/README.md
+++ b/apps/microtvm/reference-vm/README.md
@@ -78,14 +78,14 @@ $ ./base-box-tool.py --provider virtualbox build zephyr
B. Run tests:
```bash
- $ ./base-box-tool.py [--provider=PROVIDER] test
--microtvm-platform=MICROTVM_PLATFORM [--test-device-serial=SERIAL] PLATFORM
+ $ ./base-box-tool.py [--provider=PROVIDER] test
--microtvm-board=MICROTVM_BOARD [--test-device-serial=SERIAL] PLATFORM
```
- where MICROTVM_PLATFORM is one of the options listed in the
+ where MICROTVM_BOARD is one of the options listed in the
PLATFORM/base-box/test-config.json file.
For example:
```base
- $ ./base-box-tool.py --provider virtualbox test
--microtvm-platform=stm32f746xx_disco zephyr
+ $ ./base-box-tool.py --provider virtualbox test
--microtvm-board=stm32f746xx_disco zephyr
```
This command does the following for the specified provider:
diff --git a/apps/microtvm/reference-vm/arduino/base-box/base_box_test.sh
b/apps/microtvm/reference-vm/arduino/base-box/base_box_test.sh
index 3d8597f..5c3d96d 100755
--- a/apps/microtvm/reference-vm/arduino/base-box/base_box_test.sh
+++ b/apps/microtvm/reference-vm/arduino/base-box/base_box_test.sh
@@ -16,7 +16,7 @@
# specific language governing permissions and limitations
# under the License.
#
-# Usage: base_box_test.sh <MICROTVM_PLATFORM>
+# Usage: base_box_test.sh <ARDUINO_BOARD>
# Execute microTVM Arduino tests.
#
@@ -24,17 +24,17 @@ set -e
set -x
if [ "$#" -lt 1 ]; then
- echo "Usage: base_box_test.sh <MICROTVM_PLATFORM>"
+ echo "Usage: base_box_test.sh <ARDUINO_BOARD>"
exit -1
fi
-microtvm_platform=$1
+board=$1
-pytest tests/micro/arduino/test_arduino_workflow.py
--microtvm-platforms=${microtvm_platform}
+pytest tests/micro/arduino/test_arduino_workflow.py --arduino-board=${board}
-if [ $microtvm_platform == "nano33ble" ]; then
+if [ $board == "nano33ble" ]; then
# https://github.com/apache/tvm/issues/8730
- echo "NOTE: skipped test_arduino_rpc_server.py on $microtvm_platform --
known failure"
+ echo "NOTE: skipped test_arduino_rpc_server.py on $board -- known failure"
else
- pytest tests/micro/arduino/test_arduino_rpc_server.py
--microtvm-platforms=${microtvm_platform}
+ pytest tests/micro/arduino/test_arduino_rpc_server.py
--arduino-board=${board}
fi
diff --git a/apps/microtvm/reference-vm/base-box-tool.py
b/apps/microtvm/reference-vm/base-box-tool.py
index f328854..1682f5e 100755
--- a/apps/microtvm/reference-vm/base-box-tool.py
+++ b/apps/microtvm/reference-vm/base-box-tool.py
@@ -28,7 +28,6 @@ import shutil
import subprocess
import sys
-
_LOG = logging.getLogger(__name__)
@@ -48,10 +47,19 @@ ALL_PLATFORMS = (
"zephyr",
)
-# List of identifying strings for microTVM platforms for testing.
-# Must match PLATFORMS as defined in tvm/tests/micro/[platform]/conftest.py
-# TODO add a way to declare supported platforms to ProjectAPI
-ALL_MICROTVM_PLATFORMS = {
+# Extra scripts required to execute on provisioning
+# in [platform]/base-box/base_box_provision.sh
+EXTRA_SCRIPTS = {
+ "arduino": (),
+ "zephyr": ("docker/install/ubuntu_init_zephyr_project.sh",),
+}
+
+PACKER_FILE_NAME = "packer.json"
+
+
+# List of identifying strings for microTVM boards for testing.
+# TODO add a way to declare supported boards to ProjectAPI
+ALL_MICROTVM_BOARDS = {
"arduino": (
"due",
"feathers2",
@@ -64,22 +72,13 @@ ALL_MICROTVM_PLATFORMS = {
"wioterminal",
),
"zephyr": (
- "stm32f746xx_nucleo",
+ "nucleo_f746zg",
"stm32f746xx_disco",
- "nrf5340dk",
+ "nrf5340dk_nrf5340_cpuapp",
"mps2_an521",
),
}
-# Extra scripts required to execute on provisioning
-# in [platform]/base-box/base_box_provision.sh
-EXTRA_SCRIPTS = {
- "arduino": (),
- "zephyr": ("docker/install/ubuntu_init_zephyr_project.sh",),
-}
-
-PACKER_FILE_NAME = "packer.json"
-
def parse_virtualbox_devices():
output = subprocess.check_output(["VBoxManage", "list", "usbhost"],
encoding="utf-8")
@@ -362,7 +361,7 @@ def do_run_release_test(release_test_dir, platform,
provider_name, test_config,
+ _quote_cmd(
[
f"apps/microtvm/reference-vm/{platform}/base-box/base_box_test.sh",
- test_config["microtvm_platform"],
+ test_config["microtvm_board"],
]
)
)
@@ -376,22 +375,22 @@ def test_command(args):
with open(test_config_file) as f:
test_config = json.load(f)
- # select microTVM test platform
- microtvm_test_platform = test_config[args.microtvm_platform]
+ # select microTVM test config
+ microtvm_test_config = test_config[args.microtvm_board]
for key, expected_type in REQUIRED_TEST_CONFIG_KEYS.items():
- assert key in microtvm_test_platform and isinstance(
- microtvm_test_platform[key], expected_type
+ assert key in microtvm_test_config and isinstance(
+ microtvm_test_config[key], expected_type
), f"Expected key {key} of type {expected_type} in
{test_config_file}: {test_config!r}"
- microtvm_test_platform["vid_hex"] =
microtvm_test_platform["vid_hex"].lower()
- microtvm_test_platform["pid_hex"] =
microtvm_test_platform["pid_hex"].lower()
- microtvm_test_platform["microtvm_platform"] = args.microtvm_platform
+ microtvm_test_config["vid_hex"] =
microtvm_test_config["vid_hex"].lower()
+ microtvm_test_config["pid_hex"] =
microtvm_test_config["pid_hex"].lower()
+ microtvm_test_config["microtvm_board"] = args.microtvm_board
providers = args.provider
provider_passed = {p: False for p in providers}
- release_test_dir = os.path.join(THIS_DIR, "release-test")
+ release_test_dir = os.path.join(THIS_DIR, f"release-test-{args.platform}")
if args.skip_build:
assert len(providers) == 1, "--skip-build was given, but >1 provider
specified"
@@ -406,7 +405,7 @@ def test_command(args):
release_test_dir,
args.platform,
provider_name,
- microtvm_test_platform,
+ microtvm_test_config,
args.test_device_serial,
)
provider_passed[provider_name] = True
@@ -511,10 +510,10 @@ def parse_args():
platform_specific_parser =
parser_test_platform_subparsers.add_parser(platform)
platform_specific_parser.set_defaults(platform=platform)
platform_specific_parser.add_argument(
- "--microtvm-platform",
- choices=ALL_MICROTVM_PLATFORMS[platform],
+ "--microtvm-board",
+ choices=ALL_MICROTVM_BOARDS[platform],
required=True,
- help="MicroTVM platfrom used for testing.",
+ help="MicroTVM board used for testing.",
)
# Options for release subcommand
diff --git a/apps/microtvm/reference-vm/zephyr/base-box/base_box_test.sh
b/apps/microtvm/reference-vm/zephyr/base-box/base_box_test.sh
index 8eba63e..2a023b5 100755
--- a/apps/microtvm/reference-vm/zephyr/base-box/base_box_test.sh
+++ b/apps/microtvm/reference-vm/zephyr/base-box/base_box_test.sh
@@ -16,7 +16,7 @@
# specific language governing permissions and limitations
# under the License.
#
-# Usage: base_box_test.sh <MICROTVM_PLATFORM>
+# Usage: base_box_test.sh <ZEPHYR_BOARD>
# Execute microTVM Zephyr tests.
#
@@ -24,16 +24,16 @@ set -e
set -x
if [ "$#" -lt 1 ]; then
- echo "Usage: base_box_test.sh <MICROTVM_PLATFORM>"
+ echo "Usage: base_box_test.sh <ZEPHYR_BOARD>"
exit -1
fi
-microtvm_platform=$1
+board=$1
-pytest tests/micro/zephyr/test_zephyr.py
--microtvm-platforms=${microtvm_platform}
+pytest tests/micro/zephyr/test_zephyr.py --zephyr-board=${board}
-if [ $microtvm_platform == "stm32f746xx" ]; then
- echo "NOTE: skipped test_zephyr_aot.py on $microtvm_platform -- known
failure"
+if [ $board == "stm32f746xx" ]; then
+ echo "NOTE: skipped test_zephyr_aot.py on $board -- known failure"
else
- pytest tests/micro/zephyr/test_zephyr_aot.py
--microtvm-platforms=${microtvm_platform}
+ pytest tests/micro/zephyr/test_zephyr_aot.py --zephyr-board=${board}
fi
diff --git a/apps/microtvm/zephyr/template_project/microtvm_api_server.py
b/apps/microtvm/zephyr/template_project/microtvm_api_server.py
index 3fdf962..08ba1a1 100644
--- a/apps/microtvm/zephyr/template_project/microtvm_api_server.py
+++ b/apps/microtvm/zephyr/template_project/microtvm_api_server.py
@@ -57,6 +57,47 @@ MODEL_LIBRARY_FORMAT_RELPATH = "model.tar"
IS_TEMPLATE = not (API_SERVER_DIR / MODEL_LIBRARY_FORMAT_RELPATH).exists()
+# Data structure to hold the information microtvm_api_server.py needs
+# to communicate with each of these boards.
+BOARD_PROPERTIES = {
+ "qemu_x86": {
+ "board": "qemu_x86",
+ "model": "host",
+ },
+ "qemu_riscv32": {
+ "board": "qemu_riscv32",
+ "model": "host",
+ },
+ "qemu_riscv64": {
+ "board": "qemu_riscv64",
+ "model": "host",
+ },
+ "mps2_an521": {
+ "board": "mps2_an521",
+ "model": "mps2_an521",
+ },
+ "nrf5340dk_nrf5340_cpuapp": {
+ "board": "nrf5340dk_nrf5340_cpuapp",
+ "model": "nrf5340dk",
+ },
+ "stm32f746xx_disco": {
+ "board": "stm32f746xx_disco",
+ "model": "stm32f746xx",
+ },
+ "nucleo_f746zg": {
+ "board": "nucleo_f746zg",
+ "model": "stm32f746xx",
+ },
+ "nucleo_l4r5zi": {
+ "board": "nucleo_l4r5zi",
+ "model": "stm32l4r5zi",
+ },
+ "qemu_cortex_r5": {
+ "board": "qemu_cortex_r5",
+ "model": "zynq_mp_r5",
+ },
+}
+
def check_call(cmd_args, *args, **kwargs):
cwd_str = "" if "cwd" not in kwargs else f" (in cwd: {kwargs['cwd']})"
@@ -243,7 +284,16 @@ PROJECT_OPTIONS = [
),
),
server.ProjectOption("zephyr_base", help="Path to the zephyr base
directory."),
- server.ProjectOption("zephyr_board", help="Name of the Zephyr board to
build for."),
+ server.ProjectOption(
+ "zephyr_board",
+ choices=list(BOARD_PROPERTIES),
+ help="Name of the Zephyr board to build for.",
+ ),
+ server.ProjectOption(
+ "zephyr_model",
+ choices=[board["model"] for _, board in BOARD_PROPERTIES.items()],
+ help="Name of the model for each Zephyr board.",
+ ),
]
diff --git a/tests/micro/arduino/README.md b/tests/micro/arduino/README.md
index 78e63ca..0b039ba 100644
--- a/tests/micro/arduino/README.md
+++ b/tests/micro/arduino/README.md
@@ -22,14 +22,14 @@ all of the appropriate TVM dependencies installed. You can
run the test with:
```
$ cd tvm/tests/micro/arduino
-$ pytest --microtvm-platforms spresense
+$ pytest --arduino-board=spresense
```
Most of these tests require a supported Arduino board to be connected.
If you don't want to run these tests, you can pass the flag
`--test-build-only` to only test project generation and compilation.
-To see the list of supported values for `----microtvm-platforms`, run:
+To see the list of supported values for `--arduino-board`, run:
```
$ pytest --help
```
diff --git a/tests/micro/arduino/conftest.py b/tests/micro/arduino/conftest.py
index 38870b6..bb9c69b 100644
--- a/tests/micro/arduino/conftest.py
+++ b/tests/micro/arduino/conftest.py
@@ -20,22 +20,9 @@ import pathlib
import pytest
import tvm.target.target
+from tvm.micro import project
from tvm import micro, relay
-# The models that should pass this configuration. Maps a short, identifying
platform string to
-# (model, zephyr_board).
-PLATFORMS = {
- "due": ("sam3x8e", "due"),
- "feathers2": ("esp32", "feathers2"),
- "metrom4": ("atsamd51", "metrom4"),
- "nano33ble": ("nrf52840", "nano33ble"),
- "pybadge": ("atsamd51", "pybadge"),
- "spresense": ("cxd5602gg", "spresense"),
- "teensy40": ("imxrt1060", "teensy40"),
- "teensy41": ("imxrt1060", "teensy41"),
- "wioterminal": ("atsamd51", "wioterminal"),
-}
-
TEMPLATE_PROJECT_DIR = (
pathlib.Path(__file__).parent
/ ".."
@@ -48,13 +35,30 @@ TEMPLATE_PROJECT_DIR = (
).resolve()
+def arduino_boards() -> dict:
+ """Returns a dict mapping board to target model"""
+ template = project.TemplateProject.from_directory(TEMPLATE_PROJECT_DIR)
+ project_options = template.info()["project_options"]
+ for option in project_options:
+ if option["name"] == "arduino_board":
+ boards = option["choices"]
+ if option["name"] == "arduino_model":
+ models = option["choices"]
+
+ arduino_boards = {boards[i]: models[i] for i in range(len(boards))}
+ return arduino_boards
+
+
+ARDUINO_BOARDS = arduino_boards()
+
+
def pytest_addoption(parser):
parser.addoption(
- "--microtvm-platforms",
+ "--arduino-board",
nargs="+",
required=True,
- choices=PLATFORMS.keys(),
- help="Target platforms for microTVM tests.",
+ choices=ARDUINO_BOARDS.keys(),
+ help="Arduino board for tests.",
)
parser.addoption(
"--arduino-cli-cmd",
@@ -92,8 +96,8 @@ def pytest_collection_modifyitems(config, items):
# (to take advantage of multiple cores / external memory / etc.), so all tests
# are parameterized by board
def pytest_generate_tests(metafunc):
- platforms = metafunc.config.getoption("microtvm_platforms")
- metafunc.parametrize("platform", platforms, scope="session")
+ board = metafunc.config.getoption("arduino_board")
+ metafunc.parametrize("board", board, scope="session")
@pytest.fixture(scope="session")
@@ -106,12 +110,11 @@ def tvm_debug(request):
return request.config.getoption("--tvm-debug")
-def make_workspace_dir(test_name, platform):
- _, arduino_board = PLATFORMS[platform]
+def make_workspace_dir(test_name, board):
filepath = pathlib.Path(__file__)
board_workspace = (
filepath.parent
- / f"workspace_{test_name}_{arduino_board}"
+ / f"workspace_{test_name}_{board}"
/ datetime.datetime.now().strftime("%Y-%m-%dT%H-%M-%S")
)
@@ -125,9 +128,9 @@ def make_workspace_dir(test_name, platform):
return t
-def make_kws_project(platform, arduino_cli_cmd, tvm_debug, workspace_dir):
+def make_kws_project(board, arduino_cli_cmd, tvm_debug, workspace_dir):
this_dir = pathlib.Path(__file__).parent
- model, arduino_board = PLATFORMS[platform]
+ model = ARDUINO_BOARDS[board]
build_config = {"debug": tvm_debug}
with open(this_dir.parent / "testdata" / "kws" / "yes_no.tflite", "rb") as
f:
@@ -156,7 +159,7 @@ def make_kws_project(platform, arduino_cli_cmd, tvm_debug,
workspace_dir):
mod,
workspace_dir / "project",
{
- "arduino_board": arduino_board,
+ "arduino_board": board,
"arduino_cli_cmd": arduino_cli_cmd,
"project_type": "example_project",
"verbose": bool(build_config.get("debug")),
diff --git a/tests/micro/arduino/test_arduino_error_detection.py
b/tests/micro/arduino/test_arduino_error_detection.py
index 1789fff..64e2c14 100644
--- a/tests/micro/arduino/test_arduino_error_detection.py
+++ b/tests/micro/arduino/test_arduino_error_detection.py
@@ -27,13 +27,13 @@ from tvm.micro.project_api.server import ServerError
# A new project and workspace dir is created for EVERY test
@pytest.fixture
-def workspace_dir(request, platform):
- return conftest.make_workspace_dir("arduino_error_detection", platform)
+def workspace_dir(request, board):
+ return conftest.make_workspace_dir("arduino_error_detection", board)
@pytest.fixture
-def project(platform, arduino_cli_cmd, tvm_debug, workspace_dir):
- return conftest.make_kws_project(platform, arduino_cli_cmd, tvm_debug,
workspace_dir)
+def project(board, arduino_cli_cmd, tvm_debug, workspace_dir):
+ return conftest.make_kws_project(board, arduino_cli_cmd, tvm_debug,
workspace_dir)
def test_blank_project_compiles(workspace_dir, project):
diff --git a/tests/micro/arduino/test_arduino_rpc_server.py
b/tests/micro/arduino/test_arduino_rpc_server.py
index 57ebbc6..f157214 100644
--- a/tests/micro/arduino/test_arduino_rpc_server.py
+++ b/tests/micro/arduino/test_arduino_rpc_server.py
@@ -36,11 +36,10 @@ from tvm.relay.testing import byoc
import conftest
-
# # A new project and workspace dir is created for EVERY test
@pytest.fixture
-def workspace_dir(platform):
- return conftest.make_workspace_dir("arduino_rpc_server", platform)
+def workspace_dir(board):
+ return conftest.make_workspace_dir("arduino_rpc_server", board)
def _make_session(model, arduino_board, arduino_cli_cmd, workspace_dir, mod,
build_config):
@@ -83,10 +82,10 @@ def _make_add_sess(model, arduino_board, arduino_cli_cmd,
workspace_dir, build_c
# The same test code can be executed on both the QEMU simulation and on real
hardware.
@tvm.testing.requires_micro
@pytest.mark.requires_hardware
-def test_compile_runtime(platform, arduino_cli_cmd, tvm_debug, workspace_dir):
+def test_compile_runtime(board, arduino_cli_cmd, tvm_debug, workspace_dir):
"""Test compiling the on-device runtime."""
- model, arduino_board = conftest.PLATFORMS[platform]
+ model = conftest.ARDUINO_BOARDS[board]
build_config = {"debug": tvm_debug}
# NOTE: run test in a nested function so cPython will delete arrays before
closing the session.
@@ -102,16 +101,16 @@ def test_compile_runtime(platform, arduino_cli_cmd,
tvm_debug, workspace_dir):
system_lib.get_function("add")(A_data, B_data, C_data)
assert (C_data.numpy() == np.array([6, 7])).all()
- with _make_add_sess(model, arduino_board, arduino_cli_cmd, workspace_dir,
build_config) as sess:
+ with _make_add_sess(model, board, arduino_cli_cmd, workspace_dir,
build_config) as sess:
test_basic_add(sess)
@tvm.testing.requires_micro
@pytest.mark.requires_hardware
-def test_platform_timer(platform, arduino_cli_cmd, tvm_debug, workspace_dir):
+def test_platform_timer(board, arduino_cli_cmd, tvm_debug, workspace_dir):
"""Test compiling the on-device runtime."""
- model, arduino_board = conftest.PLATFORMS[platform]
+ model = conftest.ARDUINO_BOARDS[board]
build_config = {"debug": tvm_debug}
# NOTE: run test in a nested function so cPython will delete arrays before
closing the session.
@@ -132,15 +131,15 @@ def test_platform_timer(platform, arduino_cli_cmd,
tvm_debug, workspace_dir):
assert result.mean > 0
assert len(result.results) == 3
- with _make_add_sess(model, arduino_board, arduino_cli_cmd, workspace_dir,
build_config) as sess:
+ with _make_add_sess(model, board, arduino_cli_cmd, workspace_dir,
build_config) as sess:
test_basic_add(sess)
@tvm.testing.requires_micro
@pytest.mark.requires_hardware
-def test_relay(platform, arduino_cli_cmd, tvm_debug, workspace_dir):
+def test_relay(board, arduino_cli_cmd, tvm_debug, workspace_dir):
"""Testing a simple relay graph"""
- model, arduino_board = conftest.PLATFORMS[platform]
+ model = conftest.ARDUINO_BOARDS[board]
build_config = {"debug": tvm_debug}
shape = (10,)
@@ -156,9 +155,7 @@ def test_relay(platform, arduino_cli_cmd, tvm_debug,
workspace_dir):
with tvm.transform.PassContext(opt_level=3,
config={"tir.disable_vectorize": True}):
mod = tvm.relay.build(func, target=target)
- with _make_session(
- model, arduino_board, arduino_cli_cmd, workspace_dir, mod, build_config
- ) as session:
+ with _make_session(model, board, arduino_cli_cmd, workspace_dir, mod,
build_config) as session:
graph_mod = tvm.micro.create_local_graph_executor(
mod.get_graph_json(), session.get_system_lib(), session.device
)
@@ -172,9 +169,9 @@ def test_relay(platform, arduino_cli_cmd, tvm_debug,
workspace_dir):
@tvm.testing.requires_micro
@pytest.mark.requires_hardware
-def test_onnx(platform, arduino_cli_cmd, tvm_debug, workspace_dir):
+def test_onnx(board, arduino_cli_cmd, tvm_debug, workspace_dir):
"""Testing a simple ONNX model."""
- model, arduino_board = conftest.PLATFORMS[platform]
+ model = conftest.ARDUINO_BOARDS[board]
build_config = {"debug": tvm_debug}
# Load test images.
@@ -200,7 +197,7 @@ def test_onnx(platform, arduino_cli_cmd, tvm_debug,
workspace_dir):
graph = lowered.get_graph_json()
with _make_session(
- model, arduino_board, arduino_cli_cmd, workspace_dir, lowered,
build_config
+ model, board, arduino_cli_cmd, workspace_dir, lowered, build_config
) as session:
graph_mod = tvm.micro.create_local_graph_executor(
graph, session.get_system_lib(), session.device
@@ -260,9 +257,9 @@ def check_result(
@tvm.testing.requires_micro
@pytest.mark.requires_hardware
-def test_byoc_microtvm(platform, arduino_cli_cmd, tvm_debug, workspace_dir):
+def test_byoc_microtvm(board, arduino_cli_cmd, tvm_debug, workspace_dir):
"""This is a simple test case to check BYOC capabilities of microTVM"""
- model, arduino_board = conftest.PLATFORMS[platform]
+ model = conftest.ARDUINO_BOARDS[board]
build_config = {"debug": tvm_debug}
x = relay.var("x", shape=(10, 10))
@@ -317,7 +314,7 @@ def test_byoc_microtvm(platform, arduino_cli_cmd,
tvm_debug, workspace_dir):
),
model=model,
build_config=build_config,
- arduino_board=arduino_board,
+ arduino_board=board,
arduino_cli_cmd=arduino_cli_cmd,
workspace_dir=workspace_dir,
)
@@ -344,9 +341,9 @@ def _make_add_sess_with_shape(
)
@tvm.testing.requires_micro
@pytest.mark.requires_hardware
-def test_rpc_large_array(platform, arduino_cli_cmd, tvm_debug, workspace_dir,
shape):
+def test_rpc_large_array(board, arduino_cli_cmd, tvm_debug, workspace_dir,
shape):
"""Test large RPC array transfer."""
- model, arduino_board = conftest.PLATFORMS[platform]
+ model = conftest.ARDUINO_BOARDS[board]
build_config = {"debug": tvm_debug}
# NOTE: run test in a nested function so cPython will delete arrays before
closing the session.
@@ -359,7 +356,7 @@ def test_rpc_large_array(platform, arduino_cli_cmd,
tvm_debug, workspace_dir, sh
assert (C_data.numpy() == np.zeros(shape)).all()
with _make_add_sess_with_shape(
- model, arduino_board, arduino_cli_cmd, workspace_dir, shape,
build_config
+ model, board, arduino_cli_cmd, workspace_dir, shape, build_config
) as sess:
test_tensors(sess)
diff --git a/tests/micro/arduino/test_arduino_workflow.py
b/tests/micro/arduino/test_arduino_workflow.py
index cd97aa3..fe6ea8f 100644
--- a/tests/micro/arduino/test_arduino_workflow.py
+++ b/tests/micro/arduino/test_arduino_workflow.py
@@ -29,7 +29,7 @@ import conftest
This unit test simulates a simple user workflow, where we:
1. Generate a base sketch using a simple audio model
2. Modify the .ino file, much like a user would
-3. Compile the sketch for the target platform
+3. Compile the sketch for the target board
-- If physical hardware is present --
4. Upload the sketch to a connected board
5. Open a serial connection to the board
@@ -40,8 +40,8 @@ This unit test simulates a simple user workflow, where we:
# Since these tests are sequential, we'll use the same project/workspace
# directory for all tests in this file
@pytest.fixture(scope="module")
-def workspace_dir(request, platform):
- return conftest.make_workspace_dir("arduino_workflow", platform)
+def workspace_dir(request, board):
+ return conftest.make_workspace_dir("arduino_workflow", board)
@pytest.fixture(scope="module")
@@ -51,8 +51,8 @@ def project_dir(workspace_dir):
# We MUST pass workspace_dir, not project_dir, or the workspace will be
dereferenced too soon
@pytest.fixture(scope="module")
-def project(platform, arduino_cli_cmd, tvm_debug, workspace_dir):
- return conftest.make_kws_project(platform, arduino_cli_cmd, tvm_debug,
workspace_dir)
+def project(board, arduino_cli_cmd, tvm_debug, workspace_dir):
+ return conftest.make_kws_project(board, arduino_cli_cmd, tvm_debug,
workspace_dir)
def _get_directory_elements(directory):
diff --git a/tests/micro/zephyr/README.md b/tests/micro/zephyr/README.md
index 9769cae..09376e4 100644
--- a/tests/micro/zephyr/README.md
+++ b/tests/micro/zephyr/README.md
@@ -32,11 +32,11 @@ device) using:
```
$ cd tvm/tests/micro/zephyr
-$ pytest test_zephyr.py --microtvm-platforms=host # For QEMU emulation
-$ pytest test_zephyr.py --microtvm-platforms=nrf5340dk # For nRF5340DK
+$ pytest test_zephyr.py --zephyr-board=qemu_x86 # For QEMU emulation
+$ pytest test_zephyr.py --zephyr-board=nrf5340dk_nrf5340_cpuapp # For
nRF5340DK
```
-To see the list of supported values for `--microtvm-platforms`, run:
+To see the list of supported values for `--zephyr-board`, run:
```
$ pytest test_zephyr.py --help
```
diff --git a/tests/micro/zephyr/conftest.py b/tests/micro/zephyr/conftest.py
index cfdb208..f7b3b3e 100644
--- a/tests/micro/zephyr/conftest.py
+++ b/tests/micro/zephyr/conftest.py
@@ -20,33 +20,44 @@ import pathlib
import pytest
+from tvm.micro import project
import tvm.contrib.utils
import tvm.target.target
-# The models that should pass this configuration. Maps a short, identifying
platform string to
-# (model, zephyr_board).
-PLATFORMS = {
- "qemu_x86": ("host", "qemu_x86"),
- "qemu_riscv32": ("host", "qemu_riscv32"),
- "qemu_riscv64": ("host", "qemu_riscv64"),
- "mps2_an521": ("mps2_an521", "mps2_an521"),
- "nrf5340dk": ("nrf5340dk", "nrf5340dk_nrf5340_cpuapp"),
- "stm32f746xx_disco": ("stm32f746xx", "stm32f746g_disco"),
- "stm32f746xx_nucleo": ("stm32f746xx", "nucleo_f746zg"),
- "stm32l4r5zi_nucleo": ("stm32l4r5zi", "nucleo_l4r5zi"),
- "zynq_mp_r5": ("zynq_mp_r5", "qemu_cortex_r5"),
-}
+TEMPLATE_PROJECT_DIR = (
+ pathlib.Path(__file__).parent
+ / ".."
+ / ".."
+ / ".."
+ / "apps"
+ / "microtvm"
+ / "zephyr"
+ / "template_project"
+).resolve()
+
+
+def zephyr_boards() -> dict:
+ """Returns a dict mapping board to target model"""
+ template = project.TemplateProject.from_directory(TEMPLATE_PROJECT_DIR)
+ project_options = template.info()["project_options"]
+ for option in project_options:
+ if option["name"] == "zephyr_board":
+ boards = option["choices"]
+ if option["name"] == "zephyr_model":
+ models = option["choices"]
+
+ arduino_boards = {boards[i]: models[i] for i in range(len(boards))}
+ return arduino_boards
+
+
+ZEPHYR_BOARDS = zephyr_boards()
def pytest_addoption(parser):
parser.addoption(
- "--microtvm-platforms",
- default="qemu_x86",
- choices=PLATFORMS.keys(),
- help=(
- "Specify a comma-separated list of test models (i.e. as passed to
tvm.target.micro()) "
- "for microTVM tests."
- ),
+ "--zephyr-board",
+ choices=ZEPHYR_BOARDS.keys(),
+ help=("Zephyr board for test."),
)
parser.addoption(
"--west-cmd", default="west", help="Path to `west` command for
flashing device."
@@ -60,8 +71,8 @@ def pytest_addoption(parser):
def pytest_generate_tests(metafunc):
- if "platform" in metafunc.fixturenames:
- metafunc.parametrize("platform",
metafunc.config.getoption("microtvm_platforms").split(","))
+ if "board" in metafunc.fixturenames:
+ metafunc.parametrize("board",
[metafunc.config.getoption("zephyr_board")])
@pytest.fixture
@@ -75,13 +86,12 @@ def tvm_debug(request):
@pytest.fixture
-def temp_dir(platform):
- _, zephyr_board = PLATFORMS[platform]
+def temp_dir(board):
parent_dir = pathlib.Path(os.path.dirname(__file__))
filename = os.path.splitext(os.path.basename(__file__))[0]
board_workspace = (
parent_dir
- / f"workspace_{filename}_{zephyr_board}"
+ / f"workspace_{filename}_{board}"
/ datetime.datetime.now().strftime("%Y-%m-%dT%H-%M-%S")
)
board_workspace_base = str(board_workspace)
diff --git a/tests/micro/zephyr/test_zephyr.py
b/tests/micro/zephyr/test_zephyr.py
index 6085318..c12b6e3 100644
--- a/tests/micro/zephyr/test_zephyr.py
+++ b/tests/micro/zephyr/test_zephyr.py
@@ -42,8 +42,6 @@ import conftest
_LOG = logging.getLogger(__name__)
-PLATFORMS = conftest.PLATFORMS
-
def _make_sess_from_op(
temp_dir, model, zephyr_board, west_cmd, op_name, sched, arg_bufs,
build_config
@@ -56,21 +54,9 @@ def _make_sess_from_op(
return _make_session(temp_dir, zephyr_board, west_cmd, mod, build_config)
-TEMPLATE_PROJECT_DIR = (
- pathlib.Path(__file__).parent
- / ".."
- / ".."
- / ".."
- / "apps"
- / "microtvm"
- / "zephyr"
- / "template_project"
-).resolve()
-
-
def _make_session(temp_dir, zephyr_board, west_cmd, mod, build_config):
project = tvm.micro.generate_project(
- str(TEMPLATE_PROJECT_DIR),
+ str(conftest.TEMPLATE_PROJECT_DIR),
mod,
temp_dir / "project",
{
@@ -97,10 +83,10 @@ def _make_add_sess(temp_dir, model, zephyr_board, west_cmd,
build_config, dtype=
# The same test code can be executed on both the QEMU simulation and on real
hardware.
@tvm.testing.requires_micro
-def test_add_uint(temp_dir, platform, west_cmd, tvm_debug):
+def test_add_uint(temp_dir, board, west_cmd, tvm_debug):
"""Test compiling the on-device runtime."""
- model, zephyr_board = PLATFORMS[platform]
+ model = conftest.ZEPHYR_BOARDS[board]
build_config = {"debug": tvm_debug}
# NOTE: run test in a nested function so cPython will delete arrays before
closing the session.
@@ -116,12 +102,12 @@ def test_add_uint(temp_dir, platform, west_cmd,
tvm_debug):
system_lib.get_function("add")(A_data, B_data, C_data)
assert (C_data.numpy() == np.array([6, 7])).all()
- with _make_add_sess(temp_dir, model, zephyr_board, west_cmd, build_config)
as sess:
+ with _make_add_sess(temp_dir, model, board, west_cmd, build_config) as
sess:
test_basic_add(sess)
def has_fpu(zephyr_board):
- sys.path.insert(0, str(TEMPLATE_PROJECT_DIR))
+ sys.path.insert(0, str(conftest.TEMPLATE_PROJECT_DIR))
try:
import microtvm_api_server
finally:
@@ -132,11 +118,11 @@ def has_fpu(zephyr_board):
# The same test code can be executed on both the QEMU simulation and on real
hardware.
@tvm.testing.requires_micro
-def test_add_float(temp_dir, platform, west_cmd, tvm_debug):
+def test_add_float(temp_dir, board, west_cmd, tvm_debug):
"""Test compiling the on-device runtime."""
- model, zephyr_board = PLATFORMS[platform]
- if not has_fpu(zephyr_board):
- pytest.skip(f"FPU not enabled for {platform}")
+ model = conftest.ZEPHYR_BOARDS[board]
+ if not has_fpu(board):
+ pytest.skip(f"FPU not enabled for {board}")
build_config = {"debug": tvm_debug}
@@ -153,17 +139,15 @@ def test_add_float(temp_dir, platform, west_cmd,
tvm_debug):
system_lib.get_function("add")(A_data, B_data, C_data)
assert (C_data.numpy() == np.array([7, 8])).all()
- with _make_add_sess(
- temp_dir, model, zephyr_board, west_cmd, build_config, dtype="float32"
- ) as sess:
+ with _make_add_sess(temp_dir, model, board, west_cmd, build_config,
dtype="float32") as sess:
test_basic_add(sess)
@tvm.testing.requires_micro
-def test_platform_timer(temp_dir, platform, west_cmd, tvm_debug):
+def test_platform_timer(temp_dir, board, west_cmd, tvm_debug):
"""Test compiling the on-device runtime."""
- model, zephyr_board = PLATFORMS[platform]
+ model = conftest.ZEPHYR_BOARDS[board]
build_config = {"debug": tvm_debug}
# NOTE: run test in a nested function so cPython will delete arrays before
closing the session.
@@ -184,14 +168,14 @@ def test_platform_timer(temp_dir, platform, west_cmd,
tvm_debug):
assert result.mean > 0
assert len(result.results) == 3
- with _make_add_sess(temp_dir, model, zephyr_board, west_cmd, build_config)
as sess:
+ with _make_add_sess(temp_dir, model, board, west_cmd, build_config) as
sess:
test_basic_add(sess)
@tvm.testing.requires_micro
-def test_relay(temp_dir, platform, west_cmd, tvm_debug):
+def test_relay(temp_dir, board, west_cmd, tvm_debug):
"""Testing a simple relay graph"""
- model, zephyr_board = PLATFORMS[platform]
+ model = conftest.ZEPHYR_BOARDS[board]
build_config = {"debug": tvm_debug}
shape = (10,)
dtype = "int8"
@@ -207,7 +191,7 @@ def test_relay(temp_dir, platform, west_cmd, tvm_debug):
with tvm.transform.PassContext(opt_level=3,
config={"tir.disable_vectorize": True}):
mod = tvm.relay.build(ir_mod, target=target)
- with _make_session(temp_dir, zephyr_board, west_cmd, mod, build_config) as
session:
+ with _make_session(temp_dir, board, west_cmd, mod, build_config) as
session:
graph_mod = tvm.micro.create_local_graph_executor(
mod.get_graph_json(), session.get_system_lib(), session.device
)
@@ -220,9 +204,9 @@ def test_relay(temp_dir, platform, west_cmd, tvm_debug):
@tvm.testing.requires_micro
-def test_onnx(temp_dir, platform, west_cmd, tvm_debug):
+def test_onnx(temp_dir, board, west_cmd, tvm_debug):
"""Testing a simple ONNX model."""
- model, zephyr_board = PLATFORMS[platform]
+ model = conftest.ZEPHYR_BOARDS[board]
build_config = {"debug": tvm_debug}
this_dir = pathlib.Path(os.path.dirname(__file__))
@@ -250,7 +234,7 @@ def test_onnx(temp_dir, platform, west_cmd, tvm_debug):
lowered = relay.build(relay_mod, target, params=params)
graph = lowered.get_graph_json()
- with _make_session(temp_dir, zephyr_board, west_cmd, lowered,
build_config) as session:
+ with _make_session(temp_dir, board, west_cmd, lowered, build_config) as
session:
graph_mod = tvm.micro.create_local_graph_executor(
graph, session.get_system_lib(), session.device
)
@@ -297,9 +281,9 @@ def check_result(
@tvm.testing.requires_micro
-def test_byoc_microtvm(temp_dir, platform, west_cmd, tvm_debug):
+def test_byoc_microtvm(temp_dir, board, west_cmd, tvm_debug):
"""This is a simple test case to check BYOC capabilities of microTVM"""
- model, zephyr_board = PLATFORMS[platform]
+ model = conftest.ZEPHYR_BOARDS[board]
build_config = {"debug": tvm_debug}
x = relay.var("x", shape=(10, 10))
w0 = relay.var("w0", shape=(10, 10))
@@ -353,7 +337,7 @@ def test_byoc_microtvm(temp_dir, platform, west_cmd,
tvm_debug):
axis=0,
),
model=model,
- zephyr_board=zephyr_board,
+ zephyr_board=board,
west_cmd=west_cmd,
build_config=build_config,
)
@@ -377,9 +361,9 @@ def _make_add_sess_with_shape(temp_dir, model,
zephyr_board, west_cmd, shape, bu
],
)
@tvm.testing.requires_micro
-def test_rpc_large_array(temp_dir, platform, west_cmd, tvm_debug, shape):
+def test_rpc_large_array(temp_dir, board, west_cmd, tvm_debug, shape):
"""Test large RPC array transfer."""
- model, zephyr_board = PLATFORMS[platform]
+ model = conftest.ZEPHYR_BOARDS[board]
build_config = {"debug": tvm_debug}
# NOTE: run test in a nested function so cPython will delete arrays before
closing the session.
@@ -391,9 +375,7 @@ def test_rpc_large_array(temp_dir, platform, west_cmd,
tvm_debug, shape):
C_data = tvm.nd.array(np.zeros(shape, dtype="int8"),
device=sess.device)
assert (C_data.numpy() == np.zeros(shape)).all()
- with _make_add_sess_with_shape(
- temp_dir, model, zephyr_board, west_cmd, shape, build_config
- ) as sess:
+ with _make_add_sess_with_shape(temp_dir, model, board, west_cmd, shape,
build_config) as sess:
test_tensors(sess)
diff --git a/tests/micro/zephyr/test_zephyr_aot.py
b/tests/micro/zephyr/test_zephyr_aot.py
index 37aa0f7..1499d1e 100644
--- a/tests/micro/zephyr/test_zephyr_aot.py
+++ b/tests/micro/zephyr/test_zephyr_aot.py
@@ -42,8 +42,6 @@ import conftest
_LOG = logging.getLogger(__name__)
-PLATFORMS = conftest.PLATFORMS
-
def _build_project(temp_dir, zephyr_board, west_cmd, mod, build_config,
extra_files_tar=None):
template_project_dir = (
@@ -135,13 +133,19 @@ def _get_message(fd, expr: str, timeout_sec: int):
@tvm.testing.requires_micro
-def test_tflite(temp_dir, platform, west_cmd, tvm_debug):
+def test_tflite(temp_dir, board, west_cmd, tvm_debug):
"""Testing a TFLite model."""
- if platform not in ["qemu_x86", "mps2_an521", "nrf5340dk",
"stm32l4r5zi_nucleo", "zynq_mp_r5"]:
+ if board not in [
+ "qemu_x86",
+ "mps2_an521",
+ "nrf5340dk_nrf5340_cpuapp",
+ "stm32l4r5zi_nucleo",
+ "zynq_mp_r5",
+ ]:
pytest.skip(msg="Model does not fit.")
- model, zephyr_board = PLATFORMS[platform]
+ model = conftest.ZEPHYR_BOARDS[board]
input_shape = (1, 32, 32, 3)
output_shape = (1, 10)
build_config = {"debug": tvm_debug}
@@ -195,7 +199,7 @@ def test_tflite(temp_dir, platform, west_cmd, tvm_debug):
project, _ = _build_project(
temp_dir,
- zephyr_board,
+ board,
west_cmd,
lowered,
build_config,
@@ -218,12 +222,12 @@ def test_tflite(temp_dir, platform, west_cmd, tvm_debug):
@tvm.testing.requires_micro
-def test_qemu_make_fail(temp_dir, platform, west_cmd, tvm_debug):
+def test_qemu_make_fail(temp_dir, board, west_cmd, tvm_debug):
"""Testing QEMU make fail."""
- if platform not in ["qemu_x86", "mps2_an521"]:
+ if board not in ["qemu_x86", "mps2_an521"]:
pytest.skip(msg="Only for QEMU targets.")
- model, zephyr_board = PLATFORMS[platform]
+ model = conftest.ZEPHYR_BOARDS[board]
build_config = {"debug": tvm_debug}
shape = (10,)
dtype = "float32"
@@ -254,7 +258,7 @@ def test_qemu_make_fail(temp_dir, platform, west_cmd,
tvm_debug):
project, project_dir = _build_project(
temp_dir,
- zephyr_board,
+ board,
west_cmd,
lowered,
build_config,
diff --git a/tests/scripts/task_python_microtvm.sh
b/tests/scripts/task_python_microtvm.sh
index ff1b50e..4bee8d5 100755
--- a/tests/scripts/task_python_microtvm.sh
+++ b/tests/scripts/task_python_microtvm.sh
@@ -23,11 +23,11 @@ set -x # NOTE(areusch): Adding to diagnose flaky timeouts
source tests/scripts/setup-pytest-env.sh
make cython3
-run_pytest ctypes python-microtvm-zephyr tests/micro/zephyr
--microtvm-platforms=qemu_x86
+run_pytest ctypes python-microtvm-zephyr tests/micro/zephyr
--zephyr-board=qemu_x86
# Temporarily removing mps2_an512 from CI due to issue 8728:
# https://github.com/apache/tvm/issues/8728
-# run_pytest ctypes python-microtvm-zephyr tests/micro/zephyr
--microtvm-platforms=mps2_an521
+# run_pytest ctypes python-microtvm-zephyr tests/micro/zephyr
--zephyr-board=mps2_an521
run_pytest ctypes python-microtvm-arduino
apps/microtvm/arduino/template_project/tests
-run_pytest ctypes python-microtvm-arduino-nano33ble tests/micro/arduino
--test-build-only --microtvm-platforms=nano33ble
-run_pytest ctypes python-microtvm-arduino-due tests/micro/arduino
--test-build-only --microtvm-platforms=due
+run_pytest ctypes python-microtvm-arduino-nano33ble tests/micro/arduino
--test-build-only --arduino-board=nano33ble
+run_pytest ctypes python-microtvm-arduino-due tests/micro/arduino
--test-build-only --arduino-board=due
diff --git a/tutorials/micro/micro_reference_vm.py
b/tutorials/micro/micro_reference_vm.py
index e2b75ea..848d13a 100644
--- a/tutorials/micro/micro_reference_vm.py
+++ b/tutorials/micro/micro_reference_vm.py
@@ -143,7 +143,7 @@ Once the VM has been provisioned, tests can executed using
``poetry``:
.. code-block:: bash
$ cd apps/microtvm/reference-vm/zephyr
- $ poetry run python3 ../../../../tests/micro/qemu/test_zephyr.py
--microtvm-platforms=stm32f746xx
+ $ poetry run python3 ../../../../tests/micro/qemu/test_zephyr.py
--zephyr-board=stm32f746xx
If you do not have physical hardware attached, but wish to run the tests using
the
local QEMU emulator running within the VM, run the following commands instead:
@@ -152,7 +152,7 @@ local QEMU emulator running within the VM, run the
following commands instead:
$ cd /Users/yourusername/path/to/tvm
$ cd apps/microtvm/reference-vm/zephyr/
- $ poetry run pytest ../../../../tests/micro/qemu/test_zephyr.py
--microtvm-platforms=host
+ $ poetry run pytest ../../../../tests/micro/qemu/test_zephyr.py
--zephyr-board=qemu_x86