mirror of
https://github.com/DrasLorus/CORDIC_Abs_APFX.git
synced 2024-11-15 01:23:16 +01:00
47 lines
No EOL
1.3 KiB
C++
47 lines
No EOL
1.3 KiB
C++
#ifndef _HLS_ABS_HPP_
|
|
#define _HLS_ABS_HPP_
|
|
|
|
#include <ap_int.h>
|
|
|
|
template <bool balanced>
|
|
struct hls_abs {
|
|
template <int _Tsize>
|
|
static ap_uint<_Tsize> abs(ap_int<_Tsize> value);
|
|
|
|
template <int _Tsize>
|
|
static ap_uint<_Tsize> abs(ap_uint<_Tsize> value) {
|
|
return value;
|
|
}
|
|
};
|
|
|
|
template <>
|
|
struct hls_abs<true> {
|
|
template <int _Tsize>
|
|
static ap_uint<_Tsize> abs(ap_int<_Tsize> value) {
|
|
const ap_uint<_Tsize - 1> u_value = value.range(_Tsize - 2, 0);
|
|
const bool sign_value = value.bit(_Tsize - 1);
|
|
|
|
const ap_uint<_Tsize> a_value = sign_value
|
|
? ap_uint<_Tsize>((~u_value) + 1U)
|
|
: ap_uint<_Tsize>(u_value);
|
|
|
|
return a_value;
|
|
}
|
|
};
|
|
|
|
template <>
|
|
struct hls_abs<false> {
|
|
template <int _Tsize>
|
|
static ap_uint<_Tsize + 1> abs(ap_int<_Tsize> value) {
|
|
const ap_uint<_Tsize - 1> u_value = value.range(_Tsize - 2, 0);
|
|
const bool sign_value = value.bit(_Tsize - 1);
|
|
|
|
const ap_uint<_Tsize + 1> a_value = sign_value
|
|
? ap_uint<_Tsize + 1>((~u_value) + true)
|
|
: ap_uint<_Tsize + 1>(u_value);
|
|
|
|
return a_value;
|
|
}
|
|
};
|
|
|
|
#endif |