1#!/usr/bin/env python3
2# -*- coding: utf-8 -*-
3
4import logging
5
6from datetime import datetime
7from enum import Enum
8
9from matrix_runner import main, matrix_axis, matrix_action, matrix_command, matrix_filter, \
10    FileReport, JUnitReport
11
12
13@matrix_axis("device", "d", "Device(s) to be considered.")
14class DeviceAxis(Enum):
15    CM0 = ('Cortex-M0', 'CM0')
16    CM0plus = ('Cortex-M0plus', 'CM0plus')
17    CM3 = ('Cortex-M3', 'CM3')
18    CM4 = ('Cortex-M4', 'CM4')
19    CM4FP = ('Cortex-M4FP', 'CM4FP')
20    CM7 = ('Cortex-M7', 'CM7')
21    CM7SP = ('Cortex-M7SP', 'CM7SP')
22    CM7DP = ('Cortex-M7DP', 'CM7DP')
23    CM23 = ('Cortex-M23', 'CM23')
24    CM23S = ('Cortex-M23S', 'CM23S')
25    CM23NS = ('Cortex-M23NS', 'CM23NS')
26    CM33 = ('Cortex-M33', 'CM33')
27    CM33S = ('Cortex-M33S', 'CM33S')
28    CM33NS = ('Cortex-M33NS', 'CM33NS')
29    CM35P = ('Cortex-M35P', 'CM35P')
30    CM35PS = ('Cortex-M35PS', 'CM35PS')
31    CM35PNS = ('Cortex-M35PNS', 'CM35PNS')
32    CM52 = ('Cortex-M52', 'CM52')
33    CM52S = ('Cortex-M52S', 'CM52S')
34    CM52NS = ('Cortex-M52NS', 'CM52NS')
35    CM55 = ('Cortex-M55', 'CM55')
36    CM55S = ('Cortex-M55S', 'CM55S')
37    CM55NS = ('Cortex-M55NS', 'CM55NS')
38    CM85 = ('Cortex-M85', 'CM85')
39    CM85S = ('Cortex-M85S', 'CM85S')
40    CM85NS = ('Cortex-M85NS', 'CM85NS')
41    CA5 = ('Cortex-A5', 'CA5')
42    CA7 = ('Cortex-A7', 'CA7')
43    CA9 = ('Cortex-A9', 'CA9')
44    CA5NEON = ('Cortex-A5neon', 'CA5neon')
45    CA7NEON = ('Cortex-A7neon', 'CA7neon')
46    CA9NEON = ('Cortex-A9neon', 'CA9neon')
47
48
49@matrix_axis("compiler", "c", "Compiler(s) to be considered.")
50class CompilerAxis(Enum):
51    AC6 = ('AC6')
52    GCC = ('GCC')
53    IAR = ('IAR')
54    CLANG = ('Clang')
55
56
57@matrix_axis("optimize", "o", "Optimization level(s) to be considered.")
58class OptimizationAxis(Enum):
59    NONE = ('none')
60    BALANCED = ('balanced')
61    SPEED = ('speed')
62    SIZE = ('size')
63
64
65def timestamp():
66    return datetime.now().strftime('%Y%m%d%H%M%S')
67
68
69@matrix_action
70def lit(config, results):
71    """Run tests for the selected configurations using llvm's lit."""
72    yield run_lit(config.compiler[0], config.device[1], config.optimize[0])
73    results[0].test_report.write(f"lit-{config.compiler[0]}-{config.optimize[0]}-{config.device[1]}-{timestamp()}.xunit")
74
75
76def timestamp():
77    return datetime.now().strftime('%Y%m%d%H%M%S')
78
79
80@matrix_command(exit_code=[0, 1], test_report=FileReport(f"lit.xml") | JUnitReport())
81def run_lit(toolchain, device, optimize):
82    return ["lit", "--xunit-xml-output", f"lit.xml", "-D", f"toolchain={toolchain}", "-D", f"device={device}", "-D", f"optimize={optimize}", "src" ]
83
84
85@matrix_filter
86def filter_iar(config):
87    return config.compiler == CompilerAxis.IAR
88
89
90@matrix_filter
91def filter_gcc_cm52(config):
92    device = config.device.match('CM52*')
93    compiler = config.compiler == CompilerAxis.GCC
94    return device and compiler
95
96
97if __name__ == "__main__":
98    main()
99