#!/usr/bin/env python3 import os uarchdate = { 'a53':20121030, 'a72':20160101, # XXX: announced in 2015.02 but supposedly not shipped until 2016 'a76':20180601, 'a77':20190527, 'a78':20200526, 'a510':20210525, 'a520':20230529, 'a710':20210525, 'a715':20220628, 'a720':20230529, 'a725':20240529, 'airmont':20150401, # XXX: not sure about exact date 'broadwell':20141027, 'core2':20060726, 'firestorm':20201110, 'ares':20190220, # neoverse n1 'goldencove':20211104, 'goldmont':20160418, 'goldmontplus':20171211, 'haswell':20130604, 'redwoodcove':20231214, 'skylake':20150805, 'tigerlake':20200902, 'x1':20200526, 'x2':20210525, 'x3':20220628, 'x4':20230529, 'x925':20240529, 'zen2':20190707, 'zen3':20201105, 'zen4':20220927, } uarchname = { 'a53':'ARM Cortex-A53 (2012)', 'a72':'ARM Cortex-A72 (2016)', 'a76':'ARM Cortex-A76 (2018)', 'airmont':'Intel Airmont (2015)', 'ares':'ARM Neoverse N1 (2019)', 'broadwell':'Intel Broadwell (2014)', 'core2':'Intel Core 2 (2006)', 'firestorm':'Apple Firestorm (2020)', 'goldencove':'Intel Golden Cove (2021)', 'goldmont':'Intel Goldmont (2016)', 'goldmontplus':'Intel Goldmont Plus (2017)', 'haswell':'Intel Haswell (2013)', 'redwoodcove':'Intel Redwood Cove (2023)', 'skylake':'Intel Skylake (2015)', 'tigerlake':'Intel Tiger Lake (2020)', 'zen2':'AMD Zen 2 (2019)', 'zen3':'AMD Zen 3 (2020)', 'zen4':'AMD Zen 4 (2022)', } kems = 'sntrup653','sntrup761','sntrup857','sntrup953','sntrup1013','sntrup1277' def sortkey(m): uarch = ''.join(m.split('-')[:1]) return uarchdate[uarch] machines = sorted(os.listdir('benchmarks'),key=sortkey,reverse=True) def doit(m): uarch = uarchname[''.join(m.split('-')[:1])] benchmarksdir = 'benchmarks' keypair = {} enc = {} dec = {} with open(f'{benchmarksdir}/{m}') as f: for line in f: line = line.split() if len(line) < 4: continue for kem in kems: if line[:2] == [f'kem_{kem}_keypair','selected']: keypair[kem] = int(line[3]) if line[:2] == [f'kem_{kem}_enc','selected']: enc[kem] = int(line[3]) if line[:2] == [f'kem_{kem}_dec','selected']: dec[kem] = int(line[3]) C = '' D = '' for kem in kems: out.write(f'| {uarch} | {kem} | {C}{keypair[kem]}{D} | {C}{enc[kem]}{D} | {C}{dec[kem]}{D}\n') uarch = '' with open('doc/speed.md.tmp','w') as out: with open('autogen/md-speed-top') as f: out.write(f.read()) out.write('\n\n') out.write('| μarch | KEM | keypair | enc | dec |\n') out.write('| :---- | :--- | ------: | ---: | ---: |\n') for m in machines: doit(m) out.write('\n\n') with open('autogen/md-speed-bot') as f: out.write(f.read()) with open('doc/speed.md') as f: x = f.read() with open('doc/speed.md.tmp') as f: y = f.read() if x != y: os.rename('doc/speed.md.tmp','doc/speed.md') else: os.remove('doc/speed.md.tmp')