summaryrefslogtreecommitdiff
path: root/tb/verilator.hpp
blob: d1d78ff6a31c614fb05c5e8db28204f3da2c897b (plain)
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
#ifndef TALLER_VERILATOR_HPP
#define TALLER_VERILATOR_HPP

#include <cstdint>

namespace taller
{
	union fp16_bits
	{
		std::uint16_t u16;
		_Float16      fp16;
	};

	static inline std::uint16_t fp_add(std::uint16_t a, std::uint16_t b) noexcept
	{
		fp16_bits a_bits, b_bits, q_bits;
		a_bits.u16 = a;
		b_bits.u16 = b;

		q_bits.fp16 = a_bits.fp16 + b_bits.fp16;
		return q_bits.u16;
	}

	static inline std::uint16_t fp_mul(std::uint16_t a, std::uint16_t b) noexcept
	{
		fp16_bits a_bits, b_bits, q_bits;
		a_bits.u16 = a;
		b_bits.u16 = b;

		q_bits.fp16 = a_bits.fp16 * b_bits.fp16;
		return q_bits.u16;
	}

	static inline std::uint16_t fp_inv(std::uint16_t a) noexcept
	{
		fp16_bits a_bits, q_bits;
		a_bits.u16 = a;

		q_bits.fp16 = 1 / a_bits.fp16;
		return q_bits.u16;
	}
}

#endif