blob: 501fddeae62fb975e4d3d3cf252c409a943b3c1f [file] [log] [blame]
# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0
import py
import os
from sim.sim import OTBNSim
from sim.stats import ExecutionStats
from sim.elf import load_elf
import testutil
def _run_sim_for_stats(asm_file: str, tmpdir: str) -> ExecutionStats:
""" Run the OTBN simulator, collect statistics, and return them. """
assert os.path.exists(asm_file)
elf_file = testutil.asm_and_link_one_file(asm_file, tmpdir)
sim = OTBNSim()
load_elf(sim, elf_file)
sim.state.start(0)
sim.run(verbose=False, collect_stats=True)
return sim.stats
def test_general_and_loop(tmpdir: py.path.local) -> None:
""" Test the collection of general statistics as well as loop stats. """
asm_file = os.path.join(os.path.dirname(__file__),
'simple', 'loops', 'loops.s')
stats = _run_sim_for_stats(asm_file, str(tmpdir))
# General statistics
assert stats.stall_count == 2
assert stats.insn_count == 28
assert stats.insn_histo == {'addi': 22, 'loop': 4, 'loopi': 1, 'ecall': 1}
assert stats.func_calls == []
# Loop statistics.
exp = [
# Outer LOOPI
{'iterations': 4, 'loop_addr': 8, 'loop_len': 4},
# Inner LOOP
{'iterations': 3, 'loop_addr': 16, 'loop_len': 1},
{'iterations': 3, 'loop_addr': 16, 'loop_len': 1},
{'iterations': 3, 'loop_addr': 16, 'loop_len': 1},
{'iterations': 3, 'loop_addr': 16, 'loop_len': 1}
]
assert stats.loops == exp
def test_func_call_direct(tmpdir: py.path.local) -> None:
""" Test the collection of statistics related to loops. """
asm_file = os.path.join(os.path.dirname(__file__),
'simple', 'subroutines', 'direct-call.s')
stats = _run_sim_for_stats(asm_file, str(tmpdir))
exp = [{'call_site': 4, 'callee_func': 12, 'caller_func': 0}]
assert stats.func_calls == exp
def test_func_call_indirect(tmpdir: py.path.local) -> None:
""" Test the collection of statistics related to loops. """
asm_file = os.path.join(os.path.dirname(__file__),
'simple', 'subroutines', 'indirect-call.s')
stats = _run_sim_for_stats(asm_file, str(tmpdir))
exp = [{'call_site': 8, 'callee_func': 16, 'caller_func': 0}]
assert stats.func_calls == exp