#!/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')
