-
Notifications
You must be signed in to change notification settings - Fork 0
/
interface.py
101 lines (92 loc) · 3.66 KB
/
interface.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# SPDX-License-Identifier: Apache-2.0 or CC0-1.0
import argparse
from mupq import mupq
from mupq import platforms
def parse_arguments():
parser = argparse.ArgumentParser(description="PQM4 Specific Settings")
parser.add_argument(
"-p",
"--platform",
help="The PQM4 platform",
choices=["stm32f4discovery", "nucleo-l476rg", "nucleo-l4r5zi", "cw308t-stm32f3", "cw308t-stm32f415", "mps2-an386"],
default="nucleo-l4r5zi",
)
parser.add_argument(
"-o",
"--opt",
help="Optimization flags",
choices=["speed", "size", "debug"],
default="speed",
)
parser.add_argument(
"-l", "--lto", help="Enable LTO flags", default=False, action="store_true"
)
parser.add_argument(
"--no-aio", help="Disable all-in-one compilation", default=False, action="store_true"
)
parser.add_argument("-u", "--uart", default="/dev/ttyACM0", help="Path to UART output")
parser.add_argument("-i", "--iterations", type=int, default=10, help="Number of iterations for benchmarks")
return parser.parse_known_args()
def get_platform(args):
platform = None
bin_type = 'bin'
if args.platform in ['stm32f4discovery', 'nucleo-l476rg']:
platform = platforms.StLink(args.uart)
elif args.platform == "nucleo-l4r5zi":
bin_type = 'hex'
platform = platforms.OpenOCD("st_nucleo_l4r5.cfg", args.uart)
elif args.platform in ["cw308t-stm32f3", "cw308t-stm32f415"]:
bin_type = 'hex'
platform = platforms.ChipWhisperer()
elif args.platform == 'mps2-an386':
bin_type = 'bin'
platform = platforms.Qemu('qemu-system-arm', 'mps2-an386')
else:
raise NotImplementedError("Unsupported Platform")
settings = M4Settings(args.platform, args.opt, args.lto, not args.no_aio, args.iterations, bin_type)
return platform, settings
class M4Settings(mupq.PlatformSettings):
#: Specify folders to include
scheme_folders = [ # mupq.PlatformSettings.scheme_folders + [
("pqm4", "crypto_kem", ""),
("pqm4", "crypto_sign", ""),
("mupq", "mupq/crypto_kem", ""),
("mupq", "mupq/crypto_sign", ""),
("pqclean", "mupq/pqclean/crypto_kem", "PQCLEAN"),
("pqclean", "mupq/pqclean/crypto_sign", "PQCLEAN"),
]
platform_memory = {
'stm32f4discovery': 128*1024,
'nucleo-l476rg': 128*1024,
'cw308t-stm32f3': 64*1024,
'cw308t-stm32f415': 192*1024,
'mps2-an386': 4096*1024,
'nucleo-l4r5zi': 640*1024
}
def __init__(self, platform, opt="speed", lto=False, aio=False, iterations=1, binary_type='bin'):
"""Initialize with a specific platform"""
import skiplist
self.skip_list = []
for impl in skiplist.skip_list:
if impl['estmemory'] > self.platform_memory[platform]:
impl = impl.copy()
del impl['estmemory']
self.skip_list.append(impl)
self.skip_list.append({'implementation': 'vec'})
self.binary_type = binary_type
optflags = {"speed": [], "size": ["OPT_SIZE=1"], "debug": ["DEBUG=1"]}
if opt not in optflags:
raise ValueError(f"Optimization flag should be in {list(optflags.keys())}")
super(M4Settings, self).__init__()
self.makeflags = [f"PLATFORM={platform}"]
self.makeflags += [f"MUPQ_ITERATIONS={iterations}"]
self.makeflags += optflags[opt]
self.iterations = iterations
if lto:
self.makeflags += ["LTO=1"]
else:
self.makeflags += ["LTO="]
if aio:
self.makeflags += ["AIO=1"]
else:
self.makeflags += ["AIO="]