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
|