fpu_test_gen.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import numpy as np
  2. import os
  3. import sys
  4. def reverse_endian(data):
  5. result = bytearray()
  6. for i in range(len(data), 0, -1):
  7. result.append(data[i - 1])
  8. return bytes(result)
  9. def generate_numbers(cases, dtype=np.float16):
  10. if dtype == np.float16:
  11. dsize = 2
  12. elif dtype == np.float32:
  13. dsize = 4
  14. else:
  15. raise ValueError(f"Unknown dtype {dtype}")
  16. x = np.frombuffer(os.urandom(cases * dsize), dtype=dtype)
  17. y = np.frombuffer(os.urandom(cases * dsize), dtype=dtype)
  18. return x, y, dsize
  19. def generate_fp_vector(cases, filename, dtype=np.float16, big_endian=False, comp_file=None):
  20. x, y, dsize = generate_numbers(cases, dtype)
  21. np.seterr(all='ignore')
  22. sum = x + y
  23. mul = x * y
  24. with open(filename, 'w') as f:
  25. for i in range(cases):
  26. t = lambda v: reverse_endian(v) if big_endian else v
  27. f.write(' '.join([
  28. t(x.tobytes()[i * dsize:i * dsize + dsize]).hex(),
  29. t(y.tobytes()[i * dsize:i * dsize + dsize]).hex(),
  30. t(sum.tobytes()[i * dsize:i * dsize + dsize]).hex(),
  31. t(mul.tobytes()[i * dsize:i * dsize + dsize]).hex(),
  32. ]) + '\n')
  33. if comp_file is not None:
  34. gt = x > y
  35. lt = x < y
  36. ge = x >= y
  37. le = x <= y
  38. eq = x == y
  39. with open(comp_file, 'w') as f:
  40. for i in range(cases):
  41. f.write(''.join([
  42. '1' if gt[i] else '0',
  43. '1' if lt[i] else '0',
  44. '1' if ge[i] else '0',
  45. '1' if le[i] else '0',
  46. '1' if eq[i] else '0'
  47. ]) + f' // {x[i]:10.3e} {y[i]:10.3e}\n')
  48. if __name__ == '__main__':
  49. generate = 50
  50. if len(sys.argv) == 2 and sys.argv[1].isdigit():
  51. generate = int(sys.argv[1])
  52. else:
  53. print(f"Usage: {sys.argv[0]} [number of generated tests]")
  54. generate_fp_vector(generate, 'fp16_test.hex', dtype=np.float16, big_endian=True)
  55. generate_fp_vector(generate, 'fp32_test.hex', dtype=np.float32, big_endian=True, comp_file='fp32_test_comp.hex')