37 #ifndef C7120_FFTLIB_UTILITY_H_
38 #define C7120_FFTLIB_UTILITY_H_ 1
45 #include "../FFTLIB_types.h"
69 static inline void FFTLIB_CN_printUpdate(int32_t value,
const char *
string){
73 static inline void FFTLIB_CN_printUpdate(int64_t value,
const char *
string){
77 static inline void FFTLIB_CN_printUpdate(uint32_t value,
const char *
string){
81 static inline void FFTLIB_CN_printUpdate(uint64_t value,
const char *
string){
91 template <
typename accumulateType>
94 FFTLIB_CN_printUpdate(value,
"before dynamic range update");
106 FFTLIB_CN_printUpdate(value,
"after dynamic range update ");
118 FFTLIB_CN_printUpdate(value,
"before dynamic range update");
122 int64_t signValue = value & 0x8000000000000000;
123 int64_t magValue = value & 0x7FFFFFFFFFFFFFFF;
128 if(signValue == signMax){
130 if (magValue > magMax) {
134 }
else if (signValue < signMax) {
145 if(signValue == signMin){
147 if (magValue < magMin) {
150 }
else if (signValue > signMin) {
159 FFTLIB_CN_printUpdate(value,
"after dynamic range update ");
172 static inline void FFTLIB_UTIL_psat(int32_t x, int8_t minVal, int8_t maxVal, int8_t *y)
176 }
else if (x > maxVal) {
185 static inline void FFTLIB_UTIL_psat(int32_t x, uint8_t minVal, uint8_t maxVal, uint8_t *y)
189 }
else if (x > maxVal) {
198 static inline void FFTLIB_UTIL_psat(uint32_t x, uint8_t minVal, uint8_t maxVal, uint8_t *y)
202 }
else if (x > maxVal) {
211 static inline void FFTLIB_UTIL_psat(int64_t x, int16_t minVal, int16_t maxVal, int16_t *y)
215 }
else if (x > maxVal) {
224 static inline void FFTLIB_UTIL_psat(int64_t x, uint16_t minVal, uint16_t maxVal, uint16_t *y)
228 }
else if (x > maxVal) {
237 static inline void FFTLIB_UTIL_psat(uint64_t x, uint16_t minVal, uint16_t maxVal, uint16_t *y)
241 }
else if (x > maxVal) {
257 template <
typename dataType,
typename returnType>
258 static inline returnType FFTLIB_UTIL_shiftRoundAndPSAT(dataType inVal, uint8_t shift, returnType minVal, returnType maxVal){
263 FFTLIB_UTIL_psat(inVal, minVal, maxVal, &result);
271 temp = __shift_right(inVal, (shift - 1)) + 1;
272 temp = __shift_right(temp, 1);
273 FFTLIB_UTIL_psat(temp, minVal, maxVal, &result);
279 template int8_t FFTLIB_UTIL_shiftRoundAndPSAT<int32_t, int8_t> (int32_t inVal, uint8_t shift, int8_t minVal, int8_t maxVal);
280 template int16_t FFTLIB_UTIL_shiftRoundAndPSAT<int64_t, int16_t> (int64_t inVal, uint8_t shift, int16_t minVal, int16_t maxVal);
283 inline uint8_t FFTLIB_UTIL_shiftRoundAndPSAT<int32_t, uint8_t>(int32_t inVal, uint8_t shift, uint8_t minVal, uint8_t maxVal){
288 FFTLIB_UTIL_psat(inVal, minVal, maxVal, &result);
296 temp = __shift_right( inVal, (shift - 1) ) + 1;
297 temp = __shift_right(temp, 1);
298 FFTLIB_UTIL_psat(temp, minVal, maxVal, &result);
306 inline uint8_t FFTLIB_UTIL_shiftRoundAndPSAT<uint32_t, uint8_t>(uint32_t inVal, uint8_t shift, uint8_t minVal, uint8_t maxVal){
311 FFTLIB_UTIL_psat(inVal, minVal, maxVal, &result);
319 uint32_t shift32_t = (uint32_t) shift;
320 temp = (inVal >> (shift32_t - (uint32_t)1) ) + 1;
322 FFTLIB_UTIL_psat(temp, minVal, maxVal, &result);
329 inline uint16_t FFTLIB_UTIL_shiftRoundAndPSAT<int64_t, uint16_t>(int64_t inVal, uint8_t shift, uint16_t minVal, uint16_t maxVal){
334 FFTLIB_UTIL_psat(inVal, minVal, maxVal, &result);
342 temp = __shift_right( inVal, (shift - 1) ) + 1;
343 temp = __shift_right(temp, 1);
344 FFTLIB_UTIL_psat(temp, minVal, maxVal, &result);
351 inline uint16_t FFTLIB_UTIL_shiftRoundAndPSAT<uint64_t, uint16_t>(uint64_t inVal, uint8_t shift, uint16_t minVal, uint16_t maxVal){
356 FFTLIB_UTIL_psat(inVal, minVal, maxVal, &result);
359 uint32_t shift32_t = (uint32_t) shift;
360 temp = (inVal >> (shift32_t - (uint32_t)1) ) + 1;
362 FFTLIB_UTIL_psat(temp, minVal, maxVal, &result);
375 static inline void FFTLIB_UTIL_scaleShiftPsat(uint8_t scale, uint8_t shift, int32_t x, int8_t minVal, int8_t maxVal, int8_t *y)
378 int64_t scaledValue = xVal*scale;
381 xVal = __shift_right(scaledValue, (shift - 1)) + 1;
382 xVal = __shift_right(xVal, 1);
389 }
else if (xVal > maxVal) {
398 static inline void FFTLIB_UTIL_scaleShiftPsat(uint8_t scale, uint8_t shift, int32_t x, uint8_t minVal, uint8_t maxVal, uint8_t *y)
401 int64_t scaledValue = xVal*scale;
404 xVal = __shift_right(scaledValue, (shift - 1)) + 1;
405 xVal = __shift_right(xVal, 1);
412 }
else if (xVal > maxVal) {
421 static inline void FFTLIB_UTIL_scaleShiftPsat(uint8_t scale, uint8_t shift, uint32_t x, uint8_t minVal, uint8_t maxVal, uint8_t *y)
424 uint64_t scaledValue = xVal*scale;
426 uint32_t shift32_t = (uint32_t) shift;
429 xVal = (scaledValue >> (shift32_t - (uint32_t)1) ) + 1;
437 }
else if (xVal > maxVal) {
446 static inline void FFTLIB_UTIL_scaleShiftPsat(uint8_t scale, uint8_t shift, int64_t x, int16_t minVal, int16_t maxVal, int16_t *y)
449 int64_t scaledValue = xVal*scale;
452 xVal = __shift_right(scaledValue, (shift - 1)) + 1;
453 xVal = __shift_right(xVal, 1);
460 }
else if (xVal > maxVal) {
469 static inline void FFTLIB_UTIL_scaleShiftPsat(uint8_t scale, uint8_t shift, int64_t x, uint16_t minVal, uint16_t maxVal, uint16_t *y)
472 int64_t scaledValue = xVal*scale;
475 xVal = __shift_right(scaledValue, (shift - 1)) + 1;
476 xVal = __shift_right(xVal, 1);
483 }
else if (xVal > maxVal) {
492 static inline void FFTLIB_UTIL_scaleShiftPsat(uint8_t scale, uint8_t shift, uint64_t x, uint16_t minVal, uint16_t maxVal, uint16_t *y)
495 uint64_t scaledValue = xVal*scale;
497 uint32_t shift32_t = (uint32_t) shift;
500 xVal = (scaledValue >> (shift32_t - (uint32_t)1) ) + 1;
508 }
else if (xVal > maxVal) {
518 static inline void FFTLIB_UTIL_scaleShiftPsat(int8_t scale, uint8_t shift, int32_t x, int8_t minVal, int8_t maxVal, int8_t *y)
521 int64_t scaledValue = xVal*scale;
524 xVal = __shift_right(scaledValue, (shift - 1)) + 1;
525 xVal = __shift_right(xVal, 1);
532 }
else if (xVal > maxVal) {
541 static inline void FFTLIB_UTIL_scaleShiftPsat(int8_t scale, uint8_t shift, int32_t x, uint8_t minVal, uint8_t maxVal, uint8_t *y)
544 int64_t scaledValue = xVal*scale;
547 xVal = __shift_right(scaledValue, (shift - 1)) + 1;
548 xVal = __shift_right(xVal, 1);
555 }
else if (xVal > maxVal) {
564 static inline void FFTLIB_UTIL_scaleShiftPsat(int8_t scale, uint8_t shift, uint32_t x, uint8_t minVal, uint8_t maxVal, uint8_t *y)
567 int64_t scaledValue = xVal*scale;
579 tmp = __shift_right(scaledValue, (shift - 1)) + 1;
580 tmp = __shift_right(tmp, 1);
587 }
else if (tmp > maxVal) {
596 static inline void FFTLIB_UTIL_scaleShiftPsat(int8_t scale, uint8_t shift, int64_t x, int16_t minVal, int16_t maxVal, int16_t *y)
599 int64_t scaledValue = xVal*scale;
602 xVal = __shift_right(scaledValue, (shift - 1)) + 1;
603 xVal = __shift_right(xVal, 1);
610 }
else if (xVal > maxVal) {
619 static inline void FFTLIB_UTIL_scaleShiftPsat(int8_t scale, uint8_t shift, int64_t x, uint16_t minVal, uint16_t maxVal, uint16_t *y)
622 int64_t scaledValue = xVal*scale;
625 xVal = __shift_right(scaledValue, (shift - 1)) + 1;
626 xVal = __shift_right(xVal, 1);
633 }
else if (xVal > maxVal) {
642 static inline void FFTLIB_UTIL_scaleShiftPsat(int8_t scale, uint8_t shift, uint64_t x, uint16_t minVal, uint16_t maxVal, uint16_t *y)
645 int64_t scaledValue = xVal*scale;
658 tmp = __shift_right(scaledValue, (shift - 1)) + 1;
659 tmp = __shift_right(tmp, 1);
666 }
else if (tmp > maxVal) {
683 template <
typename dataType,
typename dataTypeS,
typename returnType>
684 static inline returnType FFTLIB_UTIL_scaleShiftRoundAndPSAT(dataType inVal, dataTypeS scale, uint8_t shift, returnType minVal, returnType maxVal){
693 FFTLIB_UTIL_scaleShiftPsat(scale, shift, inVal, minVal, maxVal, &result);
698 template int8_t FFTLIB_UTIL_scaleShiftRoundAndPSAT<int32_t, uint8_t, int8_t> (int32_t inVal, uint8_t scale, uint8_t shift, int8_t minVal, int8_t maxVal);
699 template int16_t FFTLIB_UTIL_scaleShiftRoundAndPSAT<int64_t, uint8_t, int16_t> (int64_t inVal, uint8_t scale, uint8_t shift, int16_t minVal, int16_t maxVal);
700 template int8_t FFTLIB_UTIL_scaleShiftRoundAndPSAT<int32_t, int8_t, int8_t> (int32_t inVal, int8_t scale, uint8_t shift, int8_t minVal, int8_t maxVal);
701 template int16_t FFTLIB_UTIL_scaleShiftRoundAndPSAT<int64_t, int8_t, int16_t> (int64_t inVal, int8_t scale, uint8_t shift, int16_t minVal, int16_t maxVal);
709 static inline void FFTLIB_UTIL_scale_shift_saturate_relu(int32_t x, uint8_t scale, uint8_t shift, int8_t *y)
712 int64_t scaledValue = xVal*scale;
718 xVal = __shift_right(scaledValue, (shift - 1)) + 1;
719 xVal = __shift_right(xVal, 1);
726 }
else if (xVal < 0) {
735 static inline void FFTLIB_UTIL_scale_shift_saturate_relu(int32_t x, uint8_t scale, uint8_t shift, uint8_t *y)
738 int64_t scaledValue = xVal*scale;
744 xVal = __shift_right(scaledValue, (shift - 1)) + 1;
745 xVal = __shift_right(xVal, 1);
752 }
else if (xVal < 0) {
761 static inline void FFTLIB_UTIL_scale_shift_saturate_relu(uint32_t x, uint8_t scale, uint8_t shift, uint8_t *y)
764 uint64_t scaledValue = xVal*scale;
766 uint32_t shift32_t = (uint32_t) shift;
769 xVal = (scaledValue >> (shift32_t - (uint32_t)1) ) + 1;
784 static inline void FFTLIB_UTIL_scale_shift_saturate_relu(int64_t x, uint8_t scale, uint8_t shift, int16_t *y)
787 int64_t scaledValue = xVal*scale;
790 xVal = __shift_right(scaledValue, (shift - 1)) + 1;
791 xVal = __shift_right(xVal, 1);
799 }
else if (xVal < 0x0000) {
808 static inline void FFTLIB_UTIL_scale_shift_saturate_relu(int64_t x, uint8_t scale, uint8_t shift, uint16_t *y)
811 int64_t scaledValue = xVal*scale;
814 xVal = __shift_right(scaledValue, (shift - 1)) + 1;
815 xVal = __shift_right(xVal, 1);
823 }
else if (xVal < 0x0000) {
832 static inline void FFTLIB_UTIL_scale_shift_saturate_relu(uint64_t x, uint8_t scale, uint8_t shift, uint16_t *y)
835 uint64_t scaledValue = xVal*scale;
837 uint32_t shift32_t = (uint32_t) shift;
840 xVal = (scaledValue >> (shift32_t - (uint32_t)1) ) + 1;
856 static inline void FFTLIB_UTIL_scale_shift_saturate_relu(int32_t x, int8_t scale, uint8_t shift, int8_t *y)
859 int64_t scaledValue = xVal*scale;
865 xVal = __shift_right(scaledValue, (shift - 1)) + 1;
866 xVal = __shift_right(xVal, 1);
873 }
else if (xVal < 0) {
882 static inline void FFTLIB_UTIL_scale_shift_saturate_relu(int32_t x, int8_t scale, uint8_t shift, uint8_t *y)
885 int64_t scaledValue = xVal*scale;
891 xVal = __shift_right(scaledValue, (shift - 1)) + 1;
892 xVal = __shift_right(xVal, 1);
899 }
else if (xVal < 0) {
908 static inline void FFTLIB_UTIL_scale_shift_saturate_relu(uint32_t x, int8_t scale, uint8_t shift, uint8_t *y)
911 int64_t scaledValue = xVal*scale;
923 tmp = __shift_right(scaledValue, (shift - 1)) + 1;
924 tmp = __shift_right(tmp, 1);
938 static inline void FFTLIB_UTIL_scale_shift_saturate_relu(int64_t x, int8_t scale, uint8_t shift, int16_t *y)
941 int64_t scaledValue = xVal*scale;
944 xVal = __shift_right(scaledValue, (shift - 1)) + 1;
945 xVal = __shift_right(xVal, 1);
953 }
else if (xVal < 0x0000) {
962 static inline void FFTLIB_UTIL_scale_shift_saturate_relu(int64_t x, int8_t scale, uint8_t shift, uint16_t *y)
965 int64_t scaledValue = xVal*scale;
968 xVal = __shift_right(scaledValue, (shift - 1)) + 1;
969 xVal = __shift_right(xVal, 1);
977 }
else if (xVal < 0x0000) {
986 static inline void FFTLIB_UTIL_scale_shift_saturate_relu(uint64_t x, int8_t scale, uint8_t shift, uint16_t *y)
989 int64_t scaledValue = xVal*scale;
1001 tmp = __shift_right(scaledValue, (shift - 1)) + 1;
1002 tmp = __shift_right(tmp, 1);
1023 template <
typename dataType,
typename dataTypeS,
typename returnType>
1024 static inline returnType FFTLIB_UTIL_scaleShiftRoundAndReLU(dataType inVal, dataTypeS scale, uint8_t shift){
1029 FFTLIB_UTIL_scale_shift_saturate_relu(inVal, scale, shift, &result);
1049 template int8_t FFTLIB_UTIL_scaleShiftRoundAndReLU<int32_t, uint8_t, int8_t> (int32_t inVal, uint8_t scale, uint8_t shift);
1050 template int16_t FFTLIB_UTIL_scaleShiftRoundAndReLU<int64_t, uint8_t, int16_t> (int64_t inVal, uint8_t scale, uint8_t shift);
1051 template int8_t FFTLIB_UTIL_scaleShiftRoundAndReLU<int32_t, int8_t, int8_t> (int32_t inVal, int8_t scale, uint8_t shift);
1052 template int16_t FFTLIB_UTIL_scaleShiftRoundAndReLU<int64_t, int8_t, int16_t> (int64_t inVal, int8_t scale, uint8_t shift);
1060 static inline int8_t FFTLIB_UTIL_scaleShiftSaturate(int32_t x, uint8_t scale, uint8_t shift)
1064 int64_t scaledValue = xVal*scale;
1067 xVal = __shift_right(scaledValue, (shift - 1)) + 1;
1068 xVal = __shift_right(xVal, 1);
1075 }
else if (xVal < -0x80) {
1078 retVal = (int8_t)xVal;
1083 static inline uint8_t FFTLIB_UTIL_scaleShiftSaturate(uint32_t x, uint8_t scale, uint8_t shift)
1087 uint64_t scaledValue = xVal*scale;
1089 uint32_t shift32_t = (uint32_t) shift;
1091 if (shift32_t > 0) {
1092 xVal = (scaledValue >> (shift32_t - (uint32_t)1) ) + 1;
1101 retVal = (uint8_t)xVal;
1106 static inline int16_t FFTLIB_UTIL_scaleShiftSaturate(int64_t x, uint8_t scale, uint8_t shift)
1110 int64_t scaledValue = xVal*scale;
1113 xVal = __shift_right(scaledValue, (shift - 1)) + 1;
1114 xVal = __shift_right(xVal, 1);
1119 if (xVal > 0x7FFF) {
1121 }
else if (xVal < -0x8000) {
1124 retVal = (int16_t)xVal;
1129 static inline uint16_t FFTLIB_UTIL_scaleShiftSaturate(uint64_t x, uint8_t scale, uint8_t shift)
1133 uint64_t scaledValue = xVal*scale;
1135 uint32_t shift32_t = (uint32_t) shift;
1137 if (shift32_t > 0) {
1138 xVal = (scaledValue >> (shift32_t - (uint32_t)1) ) + 1;
1144 if (xVal > 0xFFFF) {
1147 retVal = (uint16_t)xVal;
1179 static inline int8_t FFTLIB_UTIL_scaleShiftSaturate(int32_t x, int8_t scale, uint8_t shift)
1183 int64_t scaledValue = xVal*scale;
1186 xVal = __shift_right(scaledValue, (shift - 1)) + 1;
1187 xVal = __shift_right(xVal, 1);
1194 }
else if (xVal < -0x80) {
1197 retVal = (int8_t)xVal;
1202 static inline uint8_t FFTLIB_UTIL_scaleShiftSaturate(uint32_t x, int8_t scale, uint8_t shift)
1206 int64_t scaledValue = xVal*scale;
1218 tmp = __shift_right(scaledValue, (shift - 1)) + 1;
1219 tmp = __shift_right(tmp, 1);
1227 retVal = (uint8_t)tmp;
1232 static inline int16_t FFTLIB_UTIL_scaleShiftSaturate(int64_t x, int8_t scale, uint8_t shift)
1236 int64_t scaledValue = xVal*scale;
1239 xVal = __shift_right(scaledValue, (shift - 1)) + 1;
1240 xVal = __shift_right(xVal, 1);
1245 if (xVal > 0x7FFF) {
1247 }
else if (xVal < -0x8000) {
1250 retVal = (int16_t)xVal;
1255 static inline uint16_t FFTLIB_UTIL_scaleShiftSaturate(uint64_t x, int8_t scale, uint8_t shift)
1259 int64_t scaledValue = xVal*scale;
1271 tmp = __shift_right(scaledValue, (shift - 1)) + 1;
1272 tmp = __shift_right(tmp, 1);
1280 retVal = (uint16_t)tmp;
1291 template <
typename dataType,
typename dataTypeS,
typename returnType>
1292 inline returnType FFTLIB_UTIL_scaleShiftAndRound(dataType inVal, dataTypeS scale, uint8_t shift){
1295 result = FFTLIB_UTIL_scaleShiftSaturate(inVal, scale, shift);
1300 template int8_t FFTLIB_UTIL_scaleShiftAndRound<int32_t, uint8_t, int8_t> (int32_t inVal, uint8_t scale, uint8_t shift);
1301 template int16_t FFTLIB_UTIL_scaleShiftAndRound<int64_t, uint8_t, int16_t> (int64_t inVal, uint8_t scale, uint8_t shift);
1302 template int8_t FFTLIB_UTIL_scaleShiftAndRound<int32_t, int8_t, int8_t> (int32_t inVal, int8_t scale, uint8_t shift);
1303 template int16_t FFTLIB_UTIL_scaleShiftAndRound<int64_t, int8_t, int16_t> (int64_t inVal, int8_t scale, uint8_t shift);
1324 template <
typename accumulateType>
#define FFTLIB_DEBUGPRINTFN(N, fmt,...)
FFTLIB_enableDynamicRange_type_e
The enumeration of possible dynamic range enable settings.
@ FFTLIB_DYNAMIC_RANGE_DISABLE
Disable dynamic range computation.
@ FFTLIB_DYNAMIC_RANGE_ENABLE
Enable dynamic range computation.
FFTLIB_initDynamicRange_type_e
The enumeration of possible dynamic range reset options.
@ FFTLIB_DYNAMIC_RANGE_INIT
Reset dynamic range min/max at start of computation.
int64_t FFTLIB_CN_dynamicRangeMax
int64_t FFTLIB_CN_dynamicRangeMin
void FFTLIB_CN_initDynamicRange(FFTLIB_initDynamicRange_type initDynamicRange, accumulateType temp)
uint64_t FFTLIB_UTIL_mma_bist(void)