Skip to content

Commit

Permalink
Merge pull request #169 from tum-ei-eda/feature-canmvk230-target
Browse files Browse the repository at this point in the history
Feature canmvk230 target
  • Loading branch information
PhilippvK authored Jul 22, 2024
2 parents 3bb3b08 + ce1b623 commit 070b613
Show file tree
Hide file tree
Showing 5 changed files with 406 additions and 0 deletions.
2 changes: 2 additions & 0 deletions mlonmcu/target/_target.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
AraRtlTarget,
CV32E40PTarget,
VicunaTarget,
CanMvK230SSHTarget,
)
from .arm import Corstone300Target
from .host_x86 import HostX86Target
Expand Down Expand Up @@ -59,3 +60,4 @@ def get_targets():
register_target("ara_rtl", AraRtlTarget)
register_target("cv32e40p", CV32E40PTarget)
register_target("vicuna", VicunaTarget)
register_target("canmv_k230_ssh", CanMvK230SSHTarget)
1 change: 1 addition & 0 deletions mlonmcu/target/riscv/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from .ara_rtl import AraRtlTarget
from .cv32e40p import CV32E40PTarget
from .vicuna import VicunaTarget
from .canmv_k230_ssh import CanMvK230SSHTarget

Check failure on line 12 in mlonmcu/target/riscv/__init__.py

View workflow job for this annotation

GitHub Actions / Flake8

mlonmcu/target/riscv/__init__.py#L12

'.canmv_k230_ssh.CanMvK230SSHTarget' imported but unused (F401)

__all__ = [
"EtissPulpinoTarget",
Expand Down
116 changes: 116 additions & 0 deletions mlonmcu/target/riscv/canmv_k230_ssh.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
#
# Copyright (c) 2022 TUM Department of Electrical and Computer Engineering.
#
# This file is part of MLonMCU.
# See https://github.com/tum-ei-eda/mlonmcu.git for further info.
#
# Licensed 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.
#
"""MLonMCU Spike Target definitions"""

import os
import time
# from pathlib import Path

from mlonmcu.logging import get_logger
from mlonmcu.setup.utils import execute

Check failure on line 26 in mlonmcu/target/riscv/canmv_k230_ssh.py

View workflow job for this annotation

GitHub Actions / Flake8

mlonmcu/target/riscv/canmv_k230_ssh.py#L26

'mlonmcu.setup.utils.execute' imported but unused (F401)
from mlonmcu.target.common import cli
from mlonmcu.target.metrics import Metrics
from mlonmcu.target.ssh_target import SSHTarget
from mlonmcu.target.bench import add_bench_metrics
from .riscv_vext_target import RVVTarget

logger = get_logger()


class CanMvK230SSHTarget(SSHTarget, RVVTarget):
"""TODO."""

FEATURES = SSHTarget.FEATURES | RVVTarget.FEATURES

DEFAULTS = {
**SSHTarget.DEFAULTS,
**RVVTarget.DEFAULTS,
"xlen": 64,
"vlen": 128,
}
REQUIRED = SSHTarget.REQUIRED | RVVTarget.REQUIRED

def __init__(self, name="canmv_k230_ssh", features=None, config=None):
super().__init__(name, features=features, config=config)

def exec(self, program, *args, cwd=os.getcwd(), handle_exit=None, **kwargs):
"""Use target to execute a executable with given arguments"""

if self.enable_vext:
assert self.vlen == 128, "CanMV K230 only supports VLEN=128"

if self.timeout_sec > 0:
raise NotImplementedError

output = self.exec_via_ssh(program, *args, **kwargs)
if handle_exit:
exit_code = handle_exit(0, out=output)
print("exit_code", exit_code)
assert exit_code == 0
return output

def parse_stdout(self, out, metrics, exit_code=0):
add_bench_metrics(out, metrics, exit_code != 0, target_name=self.name)

def get_metrics(self, elf, directory, *args, handle_exit=None):
out = ""

def _handle_exit(code, out=None):
print("_handle_exit (k230)", code)
assert out is not None
temp = self.parse_exit(out)
# TODO: before or after?
if temp is None:
temp = code
if handle_exit is not None:
temp = handle_exit(temp, out=out)
return temp

start_time = time.time()
if self.print_outputs:
out = self.exec(elf, *args, cwd=directory, live=True, handle_exit=_handle_exit)
else:
out = self.exec(
elf, *args, cwd=directory, live=False, print_func=lambda *args, **kwargs: None, handle_exit=_handle_exit
)
# TODO: do something with out?
end_time = time.time()
diff = end_time - start_time
# size instead of readelf?

# TODO: get exit code
exit_code = 0
metrics = Metrics()
self.parse_stdout(out, metrics, exit_code=exit_code)

if metrics.has("Simulated Instructions"):
sim_insns = metrics.get("Simulated Instructions")
if diff > 0:
metrics.add("MIPS", (sim_insns / diff) / 1e6, True)

return metrics, out, []

def get_platform_defs(self, platform):
ret = {}
ret.update(RVVTarget.get_platform_defs(self, platform))
return ret


if __name__ == "__main__":
cli(target=CanMvK230SSHTarget)
3 changes: 3 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,6 @@ psutil
# Sessions
tqdm
filelock

# SSH
paramiko # TODO: make optional
Loading

0 comments on commit 070b613

Please sign in to comment.