blob: 6c8b89ff284b5a6e220d940fa06d0d56549a21c6 [file] [log] [blame]
Szabolcs Nagyd8114c32019-07-18 12:00:07 +01001#!/usr/bin/python
2
3# ULP error plot tool.
4#
5# Copyright (c) 2019, Arm Limited.
6# SPDX-License-Identifier: MIT
7
8import numpy as np
9import matplotlib.pyplot as plt
10import sys
11import re
12
13# example usage:
14# build/bin/ulp -e .0001 log 0.5 2.0 2345678 | math/tools/plot.py
15
16def fhex(s):
17 return float.fromhex(s)
18
19def parse(f):
20 xs = []
Szabolcs Nagy0a51e642019-10-14 11:37:10 +010021 gs = []
Szabolcs Nagyd8114c32019-07-18 12:00:07 +010022 ys = []
23 es = []
24 # Has to match the format used in ulp.c
Szabolcs Nagy0a51e642019-10-14 11:37:10 +010025 r = re.compile(r'[^ (]+\(([^ )]*)\) got ([^ ]+) want ([^ ]+) [^ ]+ ulp err ([^ ]+)')
Szabolcs Nagyd8114c32019-07-18 12:00:07 +010026 for line in f:
27 m = r.match(line)
28 if m:
29 x = fhex(m.group(1))
Szabolcs Nagy0a51e642019-10-14 11:37:10 +010030 g = fhex(m.group(2))
31 y = fhex(m.group(3))
32 e = float(m.group(4))
Szabolcs Nagyd8114c32019-07-18 12:00:07 +010033 xs.append(x)
Szabolcs Nagy0a51e642019-10-14 11:37:10 +010034 gs.append(g)
Szabolcs Nagyd8114c32019-07-18 12:00:07 +010035 ys.append(y)
36 es.append(e)
37 elif line.startswith('PASS') or line.startswith('FAIL'):
38 # Print the summary line
39 print(line)
Szabolcs Nagy0a51e642019-10-14 11:37:10 +010040 return xs, gs, ys, es
Szabolcs Nagyd8114c32019-07-18 12:00:07 +010041
Szabolcs Nagy0a51e642019-10-14 11:37:10 +010042def plot(xs, gs, ys, es):
Szabolcs Nagyd8114c32019-07-18 12:00:07 +010043 if len(xs) < 2:
44 print('not enough samples')
45 return
46 a = min(xs)
47 b = max(xs)
48 fig, (ax0,ax1) = plt.subplots(nrows=2)
Szabolcs Nagy0a51e642019-10-14 11:37:10 +010049 es = np.abs(es) # ignore the sign
Szabolcs Nagyd8114c32019-07-18 12:00:07 +010050 emax = max(es)
51 ax0.text(a+(b-a)*0.7, emax*0.8, '%s\n%g'%(emax.hex(),emax))
Szabolcs Nagy0a51e642019-10-14 11:37:10 +010052 ax0.plot(xs,es,'r.')
Szabolcs Nagyd8114c32019-07-18 12:00:07 +010053 ax0.grid()
Szabolcs Nagy0a51e642019-10-14 11:37:10 +010054 ax1.plot(xs,ys,'r.',label='want')
55 ax1.plot(xs,gs,'b.',label='got')
Szabolcs Nagyd8114c32019-07-18 12:00:07 +010056 ax1.grid()
Szabolcs Nagy0a51e642019-10-14 11:37:10 +010057 ax1.legend()
Szabolcs Nagyd8114c32019-07-18 12:00:07 +010058 plt.show()
59
Szabolcs Nagy0a51e642019-10-14 11:37:10 +010060xs, gs, ys, es = parse(sys.stdin)
61plot(xs, gs, ys, es)