diff options
author | Martin Braun <martin.braun@ettus.com> | 2020-03-02 15:25:13 -0800 |
---|---|---|
committer | atrnati <54334261+atrnati@users.noreply.github.com> | 2020-03-03 08:51:32 -0600 |
commit | 876d4150aa3da531ddd687b48afada6e43f79146 (patch) | |
tree | fd72a71419f4cd800d4e500cfcaded4dfc8dc367 /host/lib/convert | |
parent | 1393553d623bdf4ba40d5435c9719b6ce990d9ac (diff) | |
download | uhd-876d4150aa3da531ddd687b48afada6e43f79146.tar.gz uhd-876d4150aa3da531ddd687b48afada6e43f79146.tar.bz2 uhd-876d4150aa3da531ddd687b48afada6e43f79146.zip |
uhd: Apply clang-format against all .cpp and .hpp files in host/
Note: template_lvbitx.{cpp,hpp} need to be excluded from the list of
files that clang-format gets applied against.
Diffstat (limited to 'host/lib/convert')
-rw-r--r-- | host/lib/convert/convert_common.hpp | 292 | ||||
-rw-r--r-- | host/lib/convert/convert_fc32_item32.cpp | 116 | ||||
-rw-r--r-- | host/lib/convert/convert_impl.cpp | 131 | ||||
-rw-r--r-- | host/lib/convert/convert_item32.cpp | 26 | ||||
-rw-r--r-- | host/lib/convert/convert_pack_sc12.cpp | 151 | ||||
-rw-r--r-- | host/lib/convert/convert_pack_sc12.hpp | 64 | ||||
-rw-r--r-- | host/lib/convert/convert_unpack_sc12.cpp | 147 | ||||
-rw-r--r-- | host/lib/convert/convert_unpack_sc12.hpp | 80 | ||||
-rw-r--r-- | host/lib/convert/convert_with_neon.cpp | 122 | ||||
-rw-r--r-- | host/lib/convert/convert_with_tables.cpp | 3 | ||||
-rw-r--r-- | host/lib/convert/ssse3_pack_sc12.cpp | 180 | ||||
-rw-r--r-- | host/lib/convert/ssse3_unpack_sc12.cpp | 136 |
12 files changed, 785 insertions, 663 deletions
diff --git a/host/lib/convert/convert_common.hpp b/host/lib/convert/convert_common.hpp index 0de344b75..6ee9a651a 100644 --- a/host/lib/convert/convert_common.hpp +++ b/host/lib/convert/convert_common.hpp @@ -13,24 +13,31 @@ #include <stdint.h> #include <complex> -#define _DECLARE_CONVERTER(name, in_form, num_in, out_form, num_out, prio) \ - struct name : public uhd::convert::converter{ \ - static sptr make(void){return sptr(new name());} \ - double scale_factor; \ - void set_scalar(const double s){scale_factor = s;} \ +#define _DECLARE_CONVERTER(name, in_form, num_in, out_form, num_out, prio) \ + struct name : public uhd::convert::converter \ + { \ + static sptr make(void) \ + { \ + return sptr(new name()); \ + } \ + double scale_factor; \ + void set_scalar(const double s) \ + { \ + scale_factor = s; \ + } \ void operator()(const input_type&, const output_type&, const size_t); \ - }; \ - UHD_STATIC_BLOCK(__register_##name##_##prio){ \ - uhd::convert::id_type id; \ - id.input_format = #in_form; \ - id.num_inputs = num_in; \ - id.output_format = #out_form; \ - id.num_outputs = num_out; \ - uhd::convert::register_converter(id, &name::make, prio); \ - } \ - void name::operator()( \ - const input_type &inputs, const output_type &outputs, const size_t nsamps \ - ) + }; \ + UHD_STATIC_BLOCK(__register_##name##_##prio) \ + { \ + uhd::convert::id_type id; \ + id.input_format = #in_form; \ + id.num_inputs = num_in; \ + id.output_format = #out_form; \ + id.num_outputs = num_out; \ + uhd::convert::register_converter(id, &name::make, prio); \ + } \ + void name::operator()( \ + const input_type& inputs, const output_type& outputs, const size_t nsamps) /*! Convenience macro to declare a single-function converter * @@ -41,76 +48,83 @@ * which runs the conversion. Available parameters in this function block * are: * - `inputs`: Vector of pointers to the input data. Size of the vector == `num_in` - * - `outputs`: Vector of pointers to where the output data goes. Size of the vector == `num_out` + * - `outputs`: Vector of pointers to where the output data goes. Size of the vector == + * `num_out` * - `nsamps`: Number of items per input buffer to convert * - `scale_factor`: Scaling factor for float conversions */ -#define DECLARE_CONVERTER(in_form, num_in, out_form, num_out, prio) \ - _DECLARE_CONVERTER(__convert_##in_form##_##num_in##_##out_form##_##num_out##_##prio, in_form, num_in, out_form, num_out, prio) +#define DECLARE_CONVERTER(in_form, num_in, out_form, num_out, prio) \ + _DECLARE_CONVERTER(__convert_##in_form##_##num_in##_##out_form##_##num_out##_##prio, \ + in_form, \ + num_in, \ + out_form, \ + num_out, \ + prio) /*********************************************************************** * Setup priorities **********************************************************************/ static const int PRIORITY_GENERAL = 0; -static const int PRIORITY_EMPTY = -1; +static const int PRIORITY_EMPTY = -1; #ifdef __ARM_NEON__ static const int PRIORITY_SIMD = 2; -static const int PRIORITY_TABLE = 1; //tables require large cache, so they are slower on arm +static const int PRIORITY_TABLE = + 1; // tables require large cache, so they are slower on arm #else // We used to have ORC, too, so SIMD is 3 -static const int PRIORITY_SIMD = 3; +static const int PRIORITY_SIMD = 3; static const int PRIORITY_TABLE = 1; #endif /*********************************************************************** * Typedefs **********************************************************************/ -typedef std::complex<double> fc64_t; -typedef std::complex<float> fc32_t; +typedef std::complex<double> fc64_t; +typedef std::complex<float> fc32_t; typedef std::complex<int32_t> sc32_t; typedef std::complex<int16_t> sc16_t; -typedef std::complex<int8_t> sc8_t; -typedef double f64_t; -typedef float f32_t; -typedef int32_t s32_t; -typedef int16_t s16_t; -typedef int8_t s8_t; -typedef uint8_t u8_t; +typedef std::complex<int8_t> sc8_t; +typedef double f64_t; +typedef float f32_t; +typedef int32_t s32_t; +typedef int16_t s16_t; +typedef int8_t s8_t; +typedef uint8_t u8_t; -typedef uint32_t item32_t; +typedef uint32_t item32_t; typedef item32_t (*xtox_t)(item32_t); /*********************************************************************** * Convert xx to items32 sc16 buffer **********************************************************************/ -template <typename T> UHD_INLINE item32_t xx_to_item32_sc16_x1( - const std::complex<T> &num, const double scale_factor -){ - uint16_t real = int16_t(num.real()*float(scale_factor)); - uint16_t imag = int16_t(num.imag()*float(scale_factor)); +template <typename T> +UHD_INLINE item32_t xx_to_item32_sc16_x1( + const std::complex<T>& num, const double scale_factor) +{ + uint16_t real = int16_t(num.real() * float(scale_factor)); + uint16_t imag = int16_t(num.imag() * float(scale_factor)); return (item32_t(real) << 16) | (item32_t(imag) << 0); } -template <> UHD_INLINE item32_t xx_to_item32_sc16_x1( - const sc16_t &num, const double -){ +template <> +UHD_INLINE item32_t xx_to_item32_sc16_x1(const sc16_t& num, const double) +{ uint16_t real = int16_t(num.real()); uint16_t imag = int16_t(num.imag()); return (item32_t(real) << 16) | (item32_t(imag) << 0); } template <xtox_t to_wire, typename T> -UHD_INLINE void xx_to_item32_sc16( - const std::complex<T> *input, - item32_t *output, +UHD_INLINE void xx_to_item32_sc16(const std::complex<T>* input, + item32_t* output, const size_t nsamps, - const double scale_factor -){ - for (size_t i = 0; i < nsamps; i++){ + const double scale_factor) +{ + for (size_t i = 0; i < nsamps; i++) { const item32_t item = xx_to_item32_sc16_x1(input[i], scale_factor); - output[i] = to_wire(item); + output[i] = to_wire(item); } } @@ -137,33 +151,29 @@ UHD_FORCE_INLINE void xx_to_chdr_sc16(const std::complex<T>* input, /*********************************************************************** * Convert items32 sc16 buffer to xx **********************************************************************/ -template <typename T> UHD_INLINE std::complex<T> item32_sc16_x1_to_xx( - const item32_t item, const double scale_factor -){ - return std::complex<T>( - T(int16_t(item >> 16)*float(scale_factor)), - T(int16_t(item >> 0)*float(scale_factor)) - ); +template <typename T> +UHD_INLINE std::complex<T> item32_sc16_x1_to_xx( + const item32_t item, const double scale_factor) +{ + return std::complex<T>(T(int16_t(item >> 16) * float(scale_factor)), + T(int16_t(item >> 0) * float(scale_factor))); } -template <> UHD_INLINE sc16_t item32_sc16_x1_to_xx( - const item32_t item, const double -){ - return sc16_t( - int16_t(item >> 16), int16_t(item >> 0) - ); +template <> +UHD_INLINE sc16_t item32_sc16_x1_to_xx(const item32_t item, const double) +{ + return sc16_t(int16_t(item >> 16), int16_t(item >> 0)); } template <xtox_t to_host, typename T> -UHD_INLINE void item32_sc16_to_xx( - const item32_t *input, - std::complex<T> *output, +UHD_INLINE void item32_sc16_to_xx(const item32_t* input, + std::complex<T>* output, const size_t nsamps, - const double scale_factor -){ - for (size_t i = 0; i < nsamps; i++){ + const double scale_factor) +{ + for (size_t i = 0; i < nsamps; i++) { const item32_t item_i = to_host(input[i]); - output[i] = item32_sc16_x1_to_xx<T>(item_i, scale_factor); + output[i] = item32_sc16_x1_to_xx<T>(item_i, scale_factor); } } @@ -189,60 +199,56 @@ UHD_FORCE_INLINE void chdr_sc16_to_xx(const sc16_t* input, /*********************************************************************** * Convert xx to items32 sc8 buffer **********************************************************************/ -template <typename T> UHD_INLINE item32_t xx_to_item32_sc8_x1( - const std::complex<T> &in0, const std::complex<T> &in1, const double scale_factor -){ - uint8_t real1 = int8_t(in0.real()*float(scale_factor)); - uint8_t imag1 = int8_t(in0.imag()*float(scale_factor)); - uint8_t real0 = int8_t(in1.real()*float(scale_factor)); - uint8_t imag0 = int8_t(in1.imag()*float(scale_factor)); - return - (item32_t(real0) << 8) | (item32_t(imag0) << 0) | - (item32_t(real1) << 24) | (item32_t(imag1) << 16) - ; +template <typename T> +UHD_INLINE item32_t xx_to_item32_sc8_x1( + const std::complex<T>& in0, const std::complex<T>& in1, const double scale_factor) +{ + uint8_t real1 = int8_t(in0.real() * float(scale_factor)); + uint8_t imag1 = int8_t(in0.imag() * float(scale_factor)); + uint8_t real0 = int8_t(in1.real() * float(scale_factor)); + uint8_t imag0 = int8_t(in1.imag() * float(scale_factor)); + return (item32_t(real0) << 8) | (item32_t(imag0) << 0) | (item32_t(real1) << 24) + | (item32_t(imag1) << 16); } -template <> UHD_INLINE item32_t xx_to_item32_sc8_x1( - const sc16_t &in0, const sc16_t &in1, const double -){ +template <> +UHD_INLINE item32_t xx_to_item32_sc8_x1( + const sc16_t& in0, const sc16_t& in1, const double) +{ uint8_t real1 = int8_t(in0.real()); uint8_t imag1 = int8_t(in0.imag()); uint8_t real0 = int8_t(in1.real()); uint8_t imag0 = int8_t(in1.imag()); - return - (item32_t(real0) << 8) | (item32_t(imag0) << 0) | - (item32_t(real1) << 24) | (item32_t(imag1) << 16) - ; + return (item32_t(real0) << 8) | (item32_t(imag0) << 0) | (item32_t(real1) << 24) + | (item32_t(imag1) << 16); } -template <> UHD_INLINE item32_t xx_to_item32_sc8_x1( - const sc8_t &in0, const sc8_t &in1, const double -){ +template <> +UHD_INLINE item32_t xx_to_item32_sc8_x1(const sc8_t& in0, const sc8_t& in1, const double) +{ uint8_t real1 = int8_t(in0.real()); uint8_t imag1 = int8_t(in0.imag()); uint8_t real0 = int8_t(in1.real()); uint8_t imag0 = int8_t(in1.imag()); - return - (item32_t(real0) << 8) | (item32_t(imag0) << 0) | - (item32_t(real1) << 24) | (item32_t(imag1) << 16) - ; + return (item32_t(real0) << 8) | (item32_t(imag0) << 0) | (item32_t(real1) << 24) + | (item32_t(imag1) << 16); } template <xtox_t to_wire, typename T> -UHD_INLINE void xx_to_item32_sc8( - const std::complex<T> *input, - item32_t *output, +UHD_INLINE void xx_to_item32_sc8(const std::complex<T>* input, + item32_t* output, const size_t nsamps, - const double scale_factor -){ - const size_t num_pairs = nsamps/2; - for (size_t i = 0, j = 0; i < num_pairs; i++, j+=2){ - const item32_t item = xx_to_item32_sc8_x1(input[j], input[j+1], scale_factor); - output[i] = to_wire(item); + const double scale_factor) +{ + const size_t num_pairs = nsamps / 2; + for (size_t i = 0, j = 0; i < num_pairs; i++, j += 2) { + const item32_t item = xx_to_item32_sc8_x1(input[j], input[j + 1], scale_factor); + output[i] = to_wire(item); } - if (nsamps != num_pairs*2){ - const item32_t item = xx_to_item32_sc8_x1(input[nsamps-1], std::complex<T>(0), scale_factor); + if (nsamps != num_pairs * 2) { + const item32_t item = + xx_to_item32_sc8_x1(input[nsamps - 1], std::complex<T>(0), scale_factor); output[num_pairs] = to_wire(item); } } @@ -250,71 +256,59 @@ UHD_INLINE void xx_to_item32_sc8( /*********************************************************************** * Convert items32 sc8 buffer to xx **********************************************************************/ -template <typename T> UHD_INLINE void item32_sc8_x1_to_xx( - const item32_t item, std::complex<T> &out0, std::complex<T> &out1, const double scale_factor -){ - out1 = std::complex<T>( - T(int8_t(item >> 8)*float(scale_factor)), - T(int8_t(item >> 0)*float(scale_factor)) - ); - out0 = std::complex<T>( - T(int8_t(item >> 24)*float(scale_factor)), - T(int8_t(item >> 16)*float(scale_factor)) - ); +template <typename T> +UHD_INLINE void item32_sc8_x1_to_xx(const item32_t item, + std::complex<T>& out0, + std::complex<T>& out1, + const double scale_factor) +{ + out1 = std::complex<T>(T(int8_t(item >> 8) * float(scale_factor)), + T(int8_t(item >> 0) * float(scale_factor))); + out0 = std::complex<T>(T(int8_t(item >> 24) * float(scale_factor)), + T(int8_t(item >> 16) * float(scale_factor))); } -template <> UHD_INLINE void item32_sc8_x1_to_xx( - const item32_t item, sc16_t &out0, sc16_t &out1, const double -){ - out1 = sc16_t( - int16_t(int8_t(item >> 8)), - int16_t(int8_t(item >> 0)) - ); - out0 = sc16_t( - int16_t(int8_t(item >> 24)), - int16_t(int8_t(item >> 16)) - ); +template <> +UHD_INLINE void item32_sc8_x1_to_xx( + const item32_t item, sc16_t& out0, sc16_t& out1, const double) +{ + out1 = sc16_t(int16_t(int8_t(item >> 8)), int16_t(int8_t(item >> 0))); + out0 = sc16_t(int16_t(int8_t(item >> 24)), int16_t(int8_t(item >> 16))); } -template <> UHD_INLINE void item32_sc8_x1_to_xx( - const item32_t item, sc8_t &out0, sc8_t &out1, const double -){ - out1 = sc8_t( - int8_t(int8_t(item >> 8)), - int8_t(int8_t(item >> 0)) - ); - out0 = sc8_t( - int8_t(int8_t(item >> 24)), - int8_t(int8_t(item >> 16)) - ); +template <> +UHD_INLINE void item32_sc8_x1_to_xx( + const item32_t item, sc8_t& out0, sc8_t& out1, const double) +{ + out1 = sc8_t(int8_t(int8_t(item >> 8)), int8_t(int8_t(item >> 0))); + out0 = sc8_t(int8_t(int8_t(item >> 24)), int8_t(int8_t(item >> 16))); } template <xtox_t to_host, typename T> -UHD_INLINE void item32_sc8_to_xx( - const item32_t *input, - std::complex<T> *output, +UHD_INLINE void item32_sc8_to_xx(const item32_t* input, + std::complex<T>* output, const size_t nsamps, - const double scale_factor -){ - input = reinterpret_cast<const item32_t *>(size_t(input) & ~0x3); + const double scale_factor) +{ + input = reinterpret_cast<const item32_t*>(size_t(input) & ~0x3); std::complex<T> dummy; size_t num_samps = nsamps; - if ((size_t(input) & 0x3) != 0){ + if ((size_t(input) & 0x3) != 0) { const item32_t item0 = to_host(*input++); item32_sc8_x1_to_xx(item0, dummy, *output++, scale_factor); num_samps--; } - const size_t num_pairs = num_samps/2; - for (size_t i = 0, j = 0; i < num_pairs; i++, j+=2){ + const size_t num_pairs = num_samps / 2; + for (size_t i = 0, j = 0; i < num_pairs; i++, j += 2) { const item32_t item_i = to_host(input[i]); - item32_sc8_x1_to_xx(item_i, output[j], output[j+1], scale_factor); + item32_sc8_x1_to_xx(item_i, output[j], output[j + 1], scale_factor); } - if (num_samps != num_pairs*2){ + if (num_samps != num_pairs * 2) { const item32_t item_n = to_host(input[num_pairs]); - item32_sc8_x1_to_xx(item_n, output[num_samps-1], dummy, scale_factor); + item32_sc8_x1_to_xx(item_n, output[num_samps - 1], dummy, scale_factor); } } diff --git a/host/lib/convert/convert_fc32_item32.cpp b/host/lib/convert/convert_fc32_item32.cpp index b119fd877..713f565f5 100644 --- a/host/lib/convert/convert_fc32_item32.cpp +++ b/host/lib/convert/convert_fc32_item32.cpp @@ -18,9 +18,9 @@ typedef uint32_t (*to32_type)(uint32_t); template <typename type, to32_type tohost> struct convert_fc32_item32_1_to_star_1 : public converter { - convert_fc32_item32_1_to_star_1(void):_scalar(0.0) + convert_fc32_item32_1_to_star_1(void) : _scalar(0.0) { - //NOP + // NOP } void set_scalar(const double scalar) @@ -28,19 +28,20 @@ struct convert_fc32_item32_1_to_star_1 : public converter _scalar = scalar; } - void operator()(const input_type &inputs, const output_type &outputs, const size_t nsamps) + void operator()( + const input_type& inputs, const output_type& outputs, const size_t nsamps) { - const item32_t *input = reinterpret_cast<const item32_t *>(inputs[0]); - std::complex<type> *output = reinterpret_cast<std::complex<type> *>(outputs[0]); + const item32_t* input = reinterpret_cast<const item32_t*>(inputs[0]); + std::complex<type>* output = reinterpret_cast<std::complex<type>*>(outputs[0]); size_t i = 0; - for (size_t o = 0; o < nsamps; o++) - { - const item32_t i32 = tohost(input[i++]); - const item32_t q32 = tohost(input[i++]); - const float *i_f32p = reinterpret_cast<const float *>(&i32); - const float *q_f32p = reinterpret_cast<const float *>(&q32); - output[o] = std::complex<type>(type((*i_f32p)*_scalar), type((*q_f32p)*_scalar)); + for (size_t o = 0; o < nsamps; o++) { + const item32_t i32 = tohost(input[i++]); + const item32_t q32 = tohost(input[i++]); + const float* i_f32p = reinterpret_cast<const float*>(&i32); + const float* q_f32p = reinterpret_cast<const float*>(&q32); + output[o] = + std::complex<type>(type((*i_f32p) * _scalar), type((*q_f32p) * _scalar)); } } @@ -50,9 +51,9 @@ struct convert_fc32_item32_1_to_star_1 : public converter template <typename type, to32_type towire> struct convert_star_1_to_fc32_item32_1 : public converter { - convert_star_1_to_fc32_item32_1(void):_scalar(0.0) + convert_star_1_to_fc32_item32_1(void) : _scalar(0.0) { - //NOP + // NOP } void set_scalar(const double scalar) @@ -60,45 +61,66 @@ struct convert_star_1_to_fc32_item32_1 : public converter _scalar = scalar; } - void operator()(const input_type &inputs, const output_type &outputs, const size_t nsamps) + void operator()( + const input_type& inputs, const output_type& outputs, const size_t nsamps) { - const std::complex<type> *input = reinterpret_cast<const std::complex<type> *>(inputs[0]); - item32_t *output = reinterpret_cast<item32_t *>(outputs[0]); + const std::complex<type>* input = + reinterpret_cast<const std::complex<type>*>(inputs[0]); + item32_t* output = reinterpret_cast<item32_t*>(outputs[0]); size_t o = 0; - for (size_t i = 0; i < nsamps; i++) - { - const float i_f32 = type(input[i].real()*_scalar); - const float q_f32 = type(input[i].imag()*_scalar); - const item32_t *i32p = reinterpret_cast<const item32_t *>(&i_f32); - const item32_t *q32p = reinterpret_cast<const item32_t *>(&q_f32); - output[o++] = towire(*i32p); - output[o++] = towire(*q32p); + for (size_t i = 0; i < nsamps; i++) { + const float i_f32 = type(input[i].real() * _scalar); + const float q_f32 = type(input[i].imag() * _scalar); + const item32_t* i32p = reinterpret_cast<const item32_t*>(&i_f32); + const item32_t* q32p = reinterpret_cast<const item32_t*>(&q_f32); + output[o++] = towire(*i32p); + output[o++] = towire(*q32p); } } double _scalar; }; -#define __make_registrations(itype, otype, fcn, type, conv) \ -static converter::sptr make_convert_ ## itype ## _1_ ## otype ## _1(void) \ -{ \ - return converter::sptr(new fcn<type, conv>()); \ -} \ -UHD_STATIC_BLOCK(register_convert_ ## itype ## _1_ ## otype ## _1) \ -{ \ - uhd::convert::id_type id; \ - id.num_inputs = 1; id.num_outputs = 1; \ - id.input_format = #itype; id.output_format = #otype; \ - uhd::convert::register_converter(id, &make_convert_ ## itype ## _1_ ## otype ## _1, PRIORITY_GENERAL); \ -} - -__make_registrations(fc32_item32_le, fc32, convert_fc32_item32_1_to_star_1, float, uhd::wtohx) -__make_registrations(fc32_item32_be, fc32, convert_fc32_item32_1_to_star_1, float, uhd::ntohx) -__make_registrations(fc32_item32_le, fc64, convert_fc32_item32_1_to_star_1, double, uhd::wtohx) -__make_registrations(fc32_item32_be, fc64, convert_fc32_item32_1_to_star_1, double, uhd::ntohx) - -__make_registrations(fc32, fc32_item32_le, convert_star_1_to_fc32_item32_1, float, uhd::wtohx) -__make_registrations(fc32, fc32_item32_be, convert_star_1_to_fc32_item32_1, float, uhd::ntohx) -__make_registrations(fc64, fc32_item32_le, convert_star_1_to_fc32_item32_1, double, uhd::wtohx) -__make_registrations(fc64, fc32_item32_be, convert_star_1_to_fc32_item32_1, double, uhd::ntohx) +#define __make_registrations(itype, otype, fcn, type, conv) \ + static converter::sptr make_convert_##itype##_1_##otype##_1(void) \ + { \ + return converter::sptr(new fcn<type, conv>()); \ + } \ + UHD_STATIC_BLOCK(register_convert_##itype##_1_##otype##_1) \ + { \ + uhd::convert::id_type id; \ + id.num_inputs = 1; \ + id.num_outputs = 1; \ + id.input_format = #itype; \ + id.output_format = #otype; \ + uhd::convert::register_converter( \ + id, &make_convert_##itype##_1_##otype##_1, PRIORITY_GENERAL); \ + } + +__make_registrations( + fc32_item32_le, fc32, convert_fc32_item32_1_to_star_1, float, uhd::wtohx) + __make_registrations( + fc32_item32_be, fc32, convert_fc32_item32_1_to_star_1, float, uhd::ntohx) + __make_registrations( + fc32_item32_le, fc64, convert_fc32_item32_1_to_star_1, double, uhd::wtohx) + __make_registrations( + fc32_item32_be, fc64, convert_fc32_item32_1_to_star_1, double, uhd::ntohx) + + __make_registrations(fc32, + fc32_item32_le, + convert_star_1_to_fc32_item32_1, + float, + uhd::wtohx) __make_registrations(fc32, + fc32_item32_be, + convert_star_1_to_fc32_item32_1, + float, + uhd::ntohx) __make_registrations(fc64, + fc32_item32_le, + convert_star_1_to_fc32_item32_1, + double, + uhd::wtohx) __make_registrations(fc64, + fc32_item32_be, + convert_star_1_to_fc32_item32_1, + double, + uhd::ntohx) diff --git a/host/lib/convert/convert_impl.cpp b/host/lib/convert/convert_impl.cpp index 6385965f0..228f15552 100644 --- a/host/lib/convert/convert_impl.cpp +++ b/host/lib/convert/convert_impl.cpp @@ -6,91 +6,84 @@ // #include <uhd/convert.hpp> +#include <uhd/exception.hpp> +#include <uhd/types/dict.hpp> #include <uhd/utils/log.hpp> #include <uhd/utils/static.hpp> -#include <uhd/types/dict.hpp> -#include <uhd/exception.hpp> #include <stdint.h> #include <boost/format.hpp> #include <complex> using namespace uhd; -convert::converter::~converter(void){ +convert::converter::~converter(void) +{ /* NOP */ } -bool convert::operator==(const convert::id_type &lhs, const convert::id_type &rhs){ - return true - and (lhs.input_format == rhs.input_format) - and (lhs.num_inputs == rhs.num_inputs) - and (lhs.output_format == rhs.output_format) - and (lhs.num_outputs == rhs.num_outputs) - ; +bool convert::operator==(const convert::id_type& lhs, const convert::id_type& rhs) +{ + return true and (lhs.input_format == rhs.input_format) + and (lhs.num_inputs == rhs.num_inputs) + and (lhs.output_format == rhs.output_format) + and (lhs.num_outputs == rhs.num_outputs); } -std::string convert::id_type::to_pp_string(void) const{ - return str(boost::format( - "conversion ID\n" - " Input format: %s\n" - " Num inputs: %d\n" - " Output format: %s\n" - " Num outputs: %d\n" - ) - % this->input_format - % this->num_inputs - % this->output_format - % this->num_outputs - ); +std::string convert::id_type::to_pp_string(void) const +{ + return str(boost::format("conversion ID\n" + " Input format: %s\n" + " Num inputs: %d\n" + " Output format: %s\n" + " Num outputs: %d\n") + % this->input_format % this->num_inputs % this->output_format + % this->num_outputs); } -std::string convert::id_type::to_string(void) const{ - return str(boost::format("%s (%d) -> %s (%d)") - % this->input_format - % this->num_inputs - % this->output_format - % this->num_outputs - ); +std::string convert::id_type::to_string(void) const +{ + return str(boost::format("%s (%d) -> %s (%d)") % this->input_format % this->num_inputs + % this->output_format % this->num_outputs); } /*********************************************************************** * Setup the table registry **********************************************************************/ -typedef uhd::dict<convert::id_type, uhd::dict<convert::priority_type, convert::function_type> > fcn_table_type; +typedef uhd::dict<convert::id_type, + uhd::dict<convert::priority_type, convert::function_type>> + fcn_table_type; UHD_SINGLETON_FCN(fcn_table_type, get_table); /*********************************************************************** * The registry functions **********************************************************************/ void uhd::convert::register_converter( - const id_type &id, - const function_type &fcn, - const priority_type prio -){ + const id_type& id, const function_type& fcn, const priority_type prio) +{ get_table()[id][prio] = fcn; //----------------------------------------------------------------// - //UHD_LOG_TRACE("CONVERT", boost::format("register_converter: %s prio: %s") % id.to_string() % prio) + // UHD_LOG_TRACE("CONVERT", boost::format("register_converter: %s prio: %s") % + // id.to_string() % prio) //----------------------------------------------------------------// } /*********************************************************************** * The converter functions **********************************************************************/ -convert::function_type convert::get_converter( - const id_type &id, - const priority_type prio -){ - if (not get_table().has_key(id)) throw uhd::key_error( - "Cannot find a conversion routine for " + id.to_pp_string()); - - //find a matching priority +convert::function_type convert::get_converter(const id_type& id, const priority_type prio) +{ + if (not get_table().has_key(id)) + throw uhd::key_error("Cannot find a conversion routine for " + id.to_pp_string()); + + // find a matching priority priority_type best_prio = -1; - for(priority_type prio_i: get_table()[id].keys()){ + for (priority_type prio_i : get_table()[id].keys()) { if (prio_i == prio) { //----------------------------------------------------------------// - UHD_LOGGER_DEBUG("CONVERT") << "get_converter: For converter ID: " << id.to_pp_string() - << " Using prio: " << prio; + UHD_LOGGER_DEBUG("CONVERT") + << "get_converter: For converter ID: " << id.to_pp_string() + << " Using prio: " << prio; ; //----------------------------------------------------------------// return get_table()[id][prio]; @@ -98,16 +91,18 @@ convert::function_type convert::get_converter( best_prio = std::max(best_prio, prio_i); } - //wanted a specific prio, didnt find - if (prio != -1) throw uhd::key_error( - "Cannot find a conversion routine [with prio] for " + id.to_pp_string()); + // wanted a specific prio, didnt find + if (prio != -1) + throw uhd::key_error( + "Cannot find a conversion routine [with prio] for " + id.to_pp_string()); //----------------------------------------------------------------// - UHD_LOGGER_DEBUG("CONVERT") << "get_converter: For converter ID: " << id.to_pp_string() - << " Using prio: " << best_prio; + UHD_LOGGER_DEBUG("CONVERT") + << "get_converter: For converter ID: " << id.to_pp_string() + << " Using prio: " << best_prio; //----------------------------------------------------------------// - //otherwise, return best prio + // otherwise, return best prio return get_table()[id][best_prio]; } @@ -117,29 +112,31 @@ convert::function_type convert::get_converter( typedef uhd::dict<std::string, size_t> item_size_type; UHD_SINGLETON_FCN(item_size_type, get_item_size_table); -void convert::register_bytes_per_item( - const std::string &format, const size_t size -){ +void convert::register_bytes_per_item(const std::string& format, const size_t size) +{ get_item_size_table()[format] = size; } -size_t convert::get_bytes_per_item(const std::string &format){ - if (get_item_size_table().has_key(format)) return get_item_size_table()[format]; +size_t convert::get_bytes_per_item(const std::string& format) +{ + if (get_item_size_table().has_key(format)) + return get_item_size_table()[format]; - //OK. I am sorry about this. - //We didnt find a match, so lets find a match for the first term. - //This is partially a hack because of the way I append strings. - //But as long as life is kind, we can keep this. + // OK. I am sorry about this. + // We didnt find a match, so lets find a match for the first term. + // This is partially a hack because of the way I append strings. + // But as long as life is kind, we can keep this. const size_t pos = format.find("_"); - if (pos != std::string::npos){ + if (pos != std::string::npos) { return get_bytes_per_item(format.substr(0, pos)); } throw uhd::key_error("[convert] Cannot find an item size for: `" + format + "'"); } -UHD_STATIC_BLOCK(convert_register_item_sizes){ - //register standard complex types +UHD_STATIC_BLOCK(convert_register_item_sizes) +{ + // register standard complex types convert::register_bytes_per_item("fc64", sizeof(std::complex<double>)); convert::register_bytes_per_item("fc32", sizeof(std::complex<float>)); convert::register_bytes_per_item("sc64", sizeof(std::complex<int64_t>)); @@ -147,7 +144,7 @@ UHD_STATIC_BLOCK(convert_register_item_sizes){ convert::register_bytes_per_item("sc16", sizeof(std::complex<int16_t>)); convert::register_bytes_per_item("sc8", sizeof(std::complex<int8_t>)); - //register standard real types + // register standard real types convert::register_bytes_per_item("f64", sizeof(double)); convert::register_bytes_per_item("f32", sizeof(float)); convert::register_bytes_per_item("s64", sizeof(int64_t)); @@ -156,6 +153,6 @@ UHD_STATIC_BLOCK(convert_register_item_sizes){ convert::register_bytes_per_item("s8", sizeof(int8_t)); convert::register_bytes_per_item("u8", sizeof(uint8_t)); - //register VITA types + // register VITA types convert::register_bytes_per_item("item32", sizeof(int32_t)); } diff --git a/host/lib/convert/convert_item32.cpp b/host/lib/convert/convert_item32.cpp index 142a842bb..5d8361079 100644 --- a/host/lib/convert/convert_item32.cpp +++ b/host/lib/convert/convert_item32.cpp @@ -8,23 +8,25 @@ #include "convert_common.hpp" #include <uhd/utils/byteswap.hpp> -#define __DECLARE_ITEM32_CONVERTER(cpu_type, wire_type, xe, htoxx, xxtoh) \ - DECLARE_CONVERTER(cpu_type, 1, wire_type ## _item32_ ## xe, 1, PRIORITY_GENERAL){ \ - const cpu_type ## _t *input = reinterpret_cast<const cpu_type ## _t *>(inputs[0]); \ - item32_t *output = reinterpret_cast<item32_t *>(outputs[0]); \ - xx_to_item32_ ## wire_type<htoxx>(input, output, nsamps, scale_factor); \ - } \ - DECLARE_CONVERTER(wire_type ## _item32_ ## xe, 1, cpu_type, 1, PRIORITY_GENERAL){ \ - const item32_t *input = reinterpret_cast<const item32_t *>(inputs[0]); \ - cpu_type ## _t *output = reinterpret_cast<cpu_type ## _t *>(outputs[0]); \ - item32_ ## wire_type ## _to_xx<xxtoh>(input, output, nsamps, scale_factor); \ +#define __DECLARE_ITEM32_CONVERTER(cpu_type, wire_type, xe, htoxx, xxtoh) \ + DECLARE_CONVERTER(cpu_type, 1, wire_type##_item32_##xe, 1, PRIORITY_GENERAL) \ + { \ + const cpu_type##_t* input = reinterpret_cast<const cpu_type##_t*>(inputs[0]); \ + item32_t* output = reinterpret_cast<item32_t*>(outputs[0]); \ + xx_to_item32_##wire_type<htoxx>(input, output, nsamps, scale_factor); \ + } \ + DECLARE_CONVERTER(wire_type##_item32_##xe, 1, cpu_type, 1, PRIORITY_GENERAL) \ + { \ + const item32_t* input = reinterpret_cast<const item32_t*>(inputs[0]); \ + cpu_type##_t* output = reinterpret_cast<cpu_type##_t*>(outputs[0]); \ + item32_##wire_type##_to_xx<xxtoh>(input, output, nsamps, scale_factor); \ } -#define _DECLARE_ITEM32_CONVERTER(cpu_type, wire_type) \ +#define _DECLARE_ITEM32_CONVERTER(cpu_type, wire_type) \ __DECLARE_ITEM32_CONVERTER(cpu_type, wire_type, be, uhd::htonx, uhd::ntohx) \ __DECLARE_ITEM32_CONVERTER(cpu_type, wire_type, le, uhd::htowx, uhd::wtohx) -#define DECLARE_ITEM32_CONVERTER(cpu_type) \ +#define DECLARE_ITEM32_CONVERTER(cpu_type) \ _DECLARE_ITEM32_CONVERTER(cpu_type, sc8) \ _DECLARE_ITEM32_CONVERTER(cpu_type, sc16) diff --git a/host/lib/convert/convert_pack_sc12.cpp b/host/lib/convert/convert_pack_sc12.cpp index 97a4af206..ee28e00cd 100644 --- a/host/lib/convert/convert_pack_sc12.cpp +++ b/host/lib/convert/convert_pack_sc12.cpp @@ -12,9 +12,9 @@ using namespace uhd::convert; template <typename type, towire32_type towire> struct convert_star_1_to_sc12_item32_1 : public converter { - convert_star_1_to_sc12_item32_1(void):_scalar(0.0) + convert_star_1_to_sc12_item32_1(void) : _scalar(0.0) { - //NOP + // NOP } void set_scalar(const double scalar) @@ -22,74 +22,99 @@ struct convert_star_1_to_sc12_item32_1 : public converter _scalar = scalar; } - void operator()(const input_type &inputs, const output_type &outputs, const size_t nsamps) + void operator()( + const input_type& inputs, const output_type& outputs, const size_t nsamps) { - const std::complex<type> *input = reinterpret_cast<const std::complex<type> *>(inputs[0]); + const std::complex<type>* input = + reinterpret_cast<const std::complex<type>*>(inputs[0]); /* - * Effectively outputs will point to a managed_buffer instance. These buffers are 32 bit aligned. - * For a detailed description see comments in 'convert_unpack_sc12.cpp'. + * Effectively outputs will point to a managed_buffer instance. These buffers are + * 32 bit aligned. For a detailed description see comments in + * 'convert_unpack_sc12.cpp'. */ const size_t head_samps = size_t(outputs[0]) & 0x3; int enable; size_t rewind = 0; - switch(head_samps) - { - case 0: break; - case 1: rewind = 9; break; - case 2: rewind = 6; break; - case 3: rewind = 3; break; + switch (head_samps) { + case 0: + break; + case 1: + rewind = 9; + break; + case 2: + rewind = 6; + break; + case 3: + rewind = 3; + break; } - item32_sc12_3x *output = reinterpret_cast<item32_sc12_3x *>(size_t(outputs[0]) - rewind); + item32_sc12_3x* output = + reinterpret_cast<item32_sc12_3x*>(size_t(outputs[0]) - rewind); - //helper variables + // helper variables size_t i = 0, o = 0; - //handle the head case - switch (head_samps) - { - case 0: - break; //no head - case 1: - enable = CONVERT12_LINE2; - convert_star_4_to_sc12_item32_3<type, towire>(0, 0, 0, input[0], enable, output[o++], _scalar); - break; - case 2: - enable = CONVERT12_LINE2 | CONVERT12_LINE1; - convert_star_4_to_sc12_item32_3<type, towire>(0, 0, input[0], input[1], enable, output[o++], _scalar); - break; - case 3: - enable = CONVERT12_LINE2 | CONVERT12_LINE1 | CONVERT12_LINE0; - convert_star_4_to_sc12_item32_3<type, towire>(0, input[0], input[1], input[2], enable, output[o++], _scalar); - break; + // handle the head case + switch (head_samps) { + case 0: + break; // no head + case 1: + enable = CONVERT12_LINE2; + convert_star_4_to_sc12_item32_3<type, towire>( + 0, 0, 0, input[0], enable, output[o++], _scalar); + break; + case 2: + enable = CONVERT12_LINE2 | CONVERT12_LINE1; + convert_star_4_to_sc12_item32_3<type, towire>( + 0, 0, input[0], input[1], enable, output[o++], _scalar); + break; + case 3: + enable = CONVERT12_LINE2 | CONVERT12_LINE1 | CONVERT12_LINE0; + convert_star_4_to_sc12_item32_3<type, towire>( + 0, input[0], input[1], input[2], enable, output[o++], _scalar); + break; } i += head_samps; - //convert the body - while (i+3 < nsamps) - { - convert_star_4_to_sc12_item32_3<type, towire>(input[i+0], input[i+1], input[i+2], input[i+3], CONVERT12_LINE_ALL, output[o], _scalar); - o++; i += 4; + // convert the body + while (i + 3 < nsamps) { + convert_star_4_to_sc12_item32_3<type, towire>(input[i + 0], + input[i + 1], + input[i + 2], + input[i + 3], + CONVERT12_LINE_ALL, + output[o], + _scalar); + o++; + i += 4; } - //handle the tail case + // handle the tail case const size_t tail_samps = nsamps - i; - switch (tail_samps) - { - case 0: - break; //no tail - case 1: - enable = CONVERT12_LINE0; - convert_star_4_to_sc12_item32_3<type, towire>(input[i+0], 0, 0, 0, enable, output[o], _scalar); - break; - case 2: - enable = CONVERT12_LINE0 | CONVERT12_LINE1; - convert_star_4_to_sc12_item32_3<type, towire>(input[i+0], input[i+1], 0, 0, enable, output[o], _scalar); - break; - case 3: - enable = CONVERT12_LINE0 | CONVERT12_LINE1 | CONVERT12_LINE2; - convert_star_4_to_sc12_item32_3<type, towire>(input[i+0], input[i+1], input[i+2], 0, enable, output[o], _scalar); - break; + switch (tail_samps) { + case 0: + break; // no tail + case 1: + enable = CONVERT12_LINE0; + convert_star_4_to_sc12_item32_3<type, towire>( + input[i + 0], 0, 0, 0, enable, output[o], _scalar); + break; + case 2: + enable = CONVERT12_LINE0 | CONVERT12_LINE1; + convert_star_4_to_sc12_item32_3<type, towire>( + input[i + 0], input[i + 1], 0, 0, enable, output[o], _scalar); + break; + case 3: + enable = CONVERT12_LINE0 | CONVERT12_LINE1 | CONVERT12_LINE2; + convert_star_4_to_sc12_item32_3<type, towire>(input[i + 0], + input[i + 1], + input[i + 2], + 0, + enable, + output[o], + _scalar); + break; } } @@ -118,21 +143,25 @@ static converter::sptr make_convert_sc16_1_to_sc12_item32_be_1(void) UHD_STATIC_BLOCK(register_convert_pack_sc12) { - //uhd::convert::register_bytes_per_item("sc12", 3/*bytes*/); //registered in unpack + // uhd::convert::register_bytes_per_item("sc12", 3/*bytes*/); //registered in unpack uhd::convert::id_type id; - id.num_inputs = 1; + id.num_inputs = 1; id.num_outputs = 1; - id.input_format = "fc32"; + id.input_format = "fc32"; id.output_format = "sc12_item32_le"; - uhd::convert::register_converter(id, &make_convert_fc32_1_to_sc12_item32_le_1, PRIORITY_GENERAL); + uhd::convert::register_converter( + id, &make_convert_fc32_1_to_sc12_item32_le_1, PRIORITY_GENERAL); id.output_format = "sc12_item32_be"; - uhd::convert::register_converter(id, &make_convert_fc32_1_to_sc12_item32_be_1, PRIORITY_GENERAL); + uhd::convert::register_converter( + id, &make_convert_fc32_1_to_sc12_item32_be_1, PRIORITY_GENERAL); - id.input_format = "sc16"; + id.input_format = "sc16"; id.output_format = "sc12_item32_le"; - uhd::convert::register_converter(id, &make_convert_sc16_1_to_sc12_item32_le_1, PRIORITY_GENERAL); + uhd::convert::register_converter( + id, &make_convert_sc16_1_to_sc12_item32_le_1, PRIORITY_GENERAL); id.output_format = "sc12_item32_be"; - uhd::convert::register_converter(id, &make_convert_sc16_1_to_sc12_item32_be_1, PRIORITY_GENERAL); + uhd::convert::register_converter( + id, &make_convert_sc16_1_to_sc12_item32_be_1, PRIORITY_GENERAL); } diff --git a/host/lib/convert/convert_pack_sc12.hpp b/host/lib/convert/convert_pack_sc12.hpp index 053236e6f..08ec98b10 100644 --- a/host/lib/convert/convert_pack_sc12.hpp +++ b/host/lib/convert/convert_pack_sc12.hpp @@ -5,9 +5,9 @@ // SPDX-License-Identifier: GPL-3.0-or-later // -#include <type_traits> -#include <uhd/utils/byteswap.hpp> #include "convert_common.hpp" +#include <uhd/utils/byteswap.hpp> +#include <type_traits> using namespace uhd::convert; @@ -26,9 +26,9 @@ struct item32_sc12_3x }; enum item32_sc12_3x_enable { - CONVERT12_LINE0 = 0x01, - CONVERT12_LINE1 = 0x02, - CONVERT12_LINE2 = 0x04, + CONVERT12_LINE0 = 0x01, + CONVERT12_LINE1 = 0x02, + CONVERT12_LINE2 = 0x04, CONVERT12_LINE_ALL = 0x07, }; @@ -48,10 +48,10 @@ enum item32_sc12_3x_enable { * 31 0 */ template <towire32_type towire> -void pack(item32_sc12_3x &output, int enable, const int32_t iq[8]) +void pack(item32_sc12_3x& output, int enable, const int32_t iq[8]) { if (enable & CONVERT12_LINE0) - output.line0 = towire(iq[0] << 20 | iq[1] << 8 | iq[2] >> 4); + output.line0 = towire(iq[0] << 20 | iq[1] << 8 | iq[2] >> 4); if (enable & CONVERT12_LINE1) output.line1 = towire(iq[2] << 28 | iq[3] << 16 | iq[4] << 4 | iq[5] >> 8); if (enable & CONVERT12_LINE2) @@ -59,46 +59,40 @@ void pack(item32_sc12_3x &output, int enable, const int32_t iq[8]) } template <typename type, towire32_type towire> -void convert_star_4_to_sc12_item32_3 -( - const std::complex<type> &in0, - const std::complex<type> &in1, - const std::complex<type> &in2, - const std::complex<type> &in3, +void convert_star_4_to_sc12_item32_3(const std::complex<type>& in0, + const std::complex<type>& in1, + const std::complex<type>& in2, + const std::complex<type>& in3, const int enable, - item32_sc12_3x &output, + item32_sc12_3x& output, const double scalar, - typename std::enable_if<std::is_floating_point<type>::value>::type* = NULL -) + typename std::enable_if<std::is_floating_point<type>::value>::type* = NULL) { - int32_t iq[8] { - int32_t(in0.real()*scalar) & 0xfff, - int32_t(in0.imag()*scalar) & 0xfff, - int32_t(in1.real()*scalar) & 0xfff, - int32_t(in1.imag()*scalar) & 0xfff, + int32_t iq[8]{ + int32_t(in0.real() * scalar) & 0xfff, + int32_t(in0.imag() * scalar) & 0xfff, + int32_t(in1.real() * scalar) & 0xfff, + int32_t(in1.imag() * scalar) & 0xfff, - int32_t(in2.real()*scalar) & 0xfff, - int32_t(in2.imag()*scalar) & 0xfff, - int32_t(in3.real()*scalar) & 0xfff, - int32_t(in3.imag()*scalar) & 0xfff, + int32_t(in2.real() * scalar) & 0xfff, + int32_t(in2.imag() * scalar) & 0xfff, + int32_t(in3.real() * scalar) & 0xfff, + int32_t(in3.imag() * scalar) & 0xfff, }; pack<towire>(output, enable, iq); } template <typename type, towire32_type towire> -void convert_star_4_to_sc12_item32_3 -( - const std::complex<type> &in0, - const std::complex<type> &in1, - const std::complex<type> &in2, - const std::complex<type> &in3, +void convert_star_4_to_sc12_item32_3(const std::complex<type>& in0, + const std::complex<type>& in1, + const std::complex<type>& in2, + const std::complex<type>& in3, const int enable, - item32_sc12_3x &output, + item32_sc12_3x& output, const double, - typename std::enable_if<std::is_same<type, short>::value>::type* = NULL -) + typename std::enable_if<std::is_same<type, short>::value>::type* = NULL) { - int32_t iq[8] { + int32_t iq[8]{ int32_t(in0.real() >> 4) & 0xfff, int32_t(in0.imag() >> 4) & 0xfff, int32_t(in1.real() >> 4) & 0xfff, diff --git a/host/lib/convert/convert_unpack_sc12.cpp b/host/lib/convert/convert_unpack_sc12.cpp index 9f0a14a77..9ec43a5c3 100644 --- a/host/lib/convert/convert_unpack_sc12.cpp +++ b/host/lib/convert/convert_unpack_sc12.cpp @@ -12,25 +12,27 @@ using namespace uhd::convert; template <typename type, tohost32_type tohost> struct convert_sc12_item32_1_to_star_1 : public converter { - convert_sc12_item32_1_to_star_1(void):_scalar(0.0) + convert_sc12_item32_1_to_star_1(void) : _scalar(0.0) { - //NOP + // NOP } void set_scalar(const double scalar) { const int unpack_growth = 16; - _scalar = scalar/unpack_growth; + _scalar = scalar / unpack_growth; } /* - * This converter takes in 24 bits complex samples, 12 bits I and 12 bits Q, and converts them to type 'std::complex<type>'. - * 'type' is usually 'float'. - * For the converter to work correctly the used managed_buffer which holds all samples of one packet has to be 32 bits aligned. - * We assume 32 bits to be one line. This said the converter must be aware where it is supposed to start within 3 lines. + * This converter takes in 24 bits complex samples, 12 bits I and 12 bits Q, and + * converts them to type 'std::complex<type>'. 'type' is usually 'float'. For the + * converter to work correctly the used managed_buffer which holds all samples of one + * packet has to be 32 bits aligned. We assume 32 bits to be one line. This said the + * converter must be aware where it is supposed to start within 3 lines. * */ - void operator()(const input_type &inputs, const output_type &outputs, const size_t nsamps) + void operator()( + const input_type& inputs, const output_type& outputs, const size_t nsamps) { /* * Looking at the line structure above we can identify 4 cases. @@ -39,67 +41,102 @@ struct convert_sc12_item32_1_to_star_1 : public converter * Then the number of bytes the converter has to rewind are calculated. */ const size_t head_samps = size_t(inputs[0]) & 0x3; - size_t rewind = 0; - switch(head_samps) - { - case 0: break; - case 1: rewind = 9; break; - case 2: rewind = 6; break; - case 3: rewind = 3; break; + size_t rewind = 0; + switch (head_samps) { + case 0: + break; + case 1: + rewind = 9; + break; + case 2: + rewind = 6; + break; + case 3: + rewind = 3; + break; } /* * The pointer *input now points to the head of a 3 line block. */ - const item32_sc12_3x *input = reinterpret_cast<const item32_sc12_3x *>(size_t(inputs[0]) - rewind); - std::complex<type> *output = reinterpret_cast<std::complex<type> *>(outputs[0]); + const item32_sc12_3x* input = + reinterpret_cast<const item32_sc12_3x*>(size_t(inputs[0]) - rewind); + std::complex<type>* output = reinterpret_cast<std::complex<type>*>(outputs[0]); - //helper variables + // helper variables std::complex<type> dummy0, dummy1, dummy2; size_t i = 0, o = 0; /* * handle the head case * head_samps holds the number of samples left in a block. - * The 3 line converter is called for the whole block and already processed samples are dumped. - * We don't run into the risk of a SIGSEGV because input will always point to valid memory within a managed_buffer. - * Furthermore the bytes in a buffer remain unchanged after they have been copied into it. + * The 3 line converter is called for the whole block and already processed + * samples are dumped. We don't run into the risk of a SIGSEGV because input will + * always point to valid memory within a managed_buffer. Furthermore the bytes in + * a buffer remain unchanged after they have been copied into it. */ - switch (head_samps) - { - case 0: break; //no head - case 1: convert_sc12_item32_3_to_star_4<type, tohost>(input[i++], dummy0, dummy1, dummy2, output[0], _scalar); break; - case 2: convert_sc12_item32_3_to_star_4<type, tohost>(input[i++], dummy0, dummy1, output[0], output[1], _scalar); break; - case 3: convert_sc12_item32_3_to_star_4<type, tohost>(input[i++], dummy0, output[0], output[1], output[2], _scalar); break; + switch (head_samps) { + case 0: + break; // no head + case 1: + convert_sc12_item32_3_to_star_4<type, tohost>( + input[i++], dummy0, dummy1, dummy2, output[0], _scalar); + break; + case 2: + convert_sc12_item32_3_to_star_4<type, tohost>( + input[i++], dummy0, dummy1, output[0], output[1], _scalar); + break; + case 3: + convert_sc12_item32_3_to_star_4<type, tohost>( + input[i++], dummy0, output[0], output[1], output[2], _scalar); + break; } o += head_samps; - //convert the body - while (o+3 < nsamps) - { - convert_sc12_item32_3_to_star_4<type, tohost>(input[i], output[o+0], output[o+1], output[o+2], output[o+3], _scalar); - i++; o += 4; + // convert the body + while (o + 3 < nsamps) { + convert_sc12_item32_3_to_star_4<type, tohost>(input[i], + output[o + 0], + output[o + 1], + output[o + 2], + output[o + 3], + _scalar); + i++; + o += 4; } /* * handle the tail case * The converter can be called with any number of samples to be converted. * This can end up in only a part of a block to be converted in one call. - * We never have to worry about SIGSEGVs here as long as we end in the middle of a managed_buffer. - * If we are at the end of managed_buffer there are 2 precautions to prevent SIGSEGVs. - * Firstly only a read operation is performed. - * Secondly managed_buffers allocate a fixed size memory which is always larger than the actually used size. - * e.g. The current sample maximum is 2000 samples in a packet over USB. - * With sc12 samples a packet consists of 6000kb but managed_buffers allocate 16kb each. - * Thus we don't run into problems here either. + * We never have to worry about SIGSEGVs here as long as we end in the middle of a + * managed_buffer. If we are at the end of managed_buffer there are 2 precautions + * to prevent SIGSEGVs. Firstly only a read operation is performed. Secondly + * managed_buffers allocate a fixed size memory which is always larger than the + * actually used size. e.g. The current sample maximum is 2000 samples in a packet + * over USB. With sc12 samples a packet consists of 6000kb but managed_buffers + * allocate 16kb each. Thus we don't run into problems here either. */ const size_t tail_samps = nsamps - o; - switch (tail_samps) - { - case 0: break; //no tail - case 1: convert_sc12_item32_3_to_star_4<type, tohost>(input[i], output[o+0], dummy0, dummy1, dummy2, _scalar); break; - case 2: convert_sc12_item32_3_to_star_4<type, tohost>(input[i], output[o+0], output[o+1], dummy1, dummy2, _scalar); break; - case 3: convert_sc12_item32_3_to_star_4<type, tohost>(input[i], output[o+0], output[o+1], output[o+2], dummy2, _scalar); break; + switch (tail_samps) { + case 0: + break; // no tail + case 1: + convert_sc12_item32_3_to_star_4<type, tohost>( + input[i], output[o + 0], dummy0, dummy1, dummy2, _scalar); + break; + case 2: + convert_sc12_item32_3_to_star_4<type, tohost>( + input[i], output[o + 0], output[o + 1], dummy1, dummy2, _scalar); + break; + case 3: + convert_sc12_item32_3_to_star_4<type, tohost>(input[i], + output[o + 0], + output[o + 1], + output[o + 2], + dummy2, + _scalar); + break; } } @@ -128,20 +165,24 @@ static converter::sptr make_convert_sc12_item32_be_1_to_sc16_1(void) UHD_STATIC_BLOCK(register_convert_unpack_sc12) { - uhd::convert::register_bytes_per_item("sc12", 3/*bytes*/); + uhd::convert::register_bytes_per_item("sc12", 3 /*bytes*/); uhd::convert::id_type id; - id.num_inputs = 1; + id.num_inputs = 1; id.num_outputs = 1; id.output_format = "fc32"; - id.input_format = "sc12_item32_le"; - uhd::convert::register_converter(id, &make_convert_sc12_item32_le_1_to_fc32_1, PRIORITY_GENERAL); + id.input_format = "sc12_item32_le"; + uhd::convert::register_converter( + id, &make_convert_sc12_item32_le_1_to_fc32_1, PRIORITY_GENERAL); id.input_format = "sc12_item32_be"; - uhd::convert::register_converter(id, &make_convert_sc12_item32_be_1_to_fc32_1, PRIORITY_GENERAL); + uhd::convert::register_converter( + id, &make_convert_sc12_item32_be_1_to_fc32_1, PRIORITY_GENERAL); id.output_format = "sc16"; - id.input_format = "sc12_item32_le"; - uhd::convert::register_converter(id, &make_convert_sc12_item32_le_1_to_sc16_1, PRIORITY_GENERAL); + id.input_format = "sc12_item32_le"; + uhd::convert::register_converter( + id, &make_convert_sc12_item32_le_1_to_sc16_1, PRIORITY_GENERAL); id.input_format = "sc12_item32_be"; - uhd::convert::register_converter(id, &make_convert_sc12_item32_be_1_to_sc16_1, PRIORITY_GENERAL); + uhd::convert::register_converter( + id, &make_convert_sc12_item32_be_1_to_sc16_1, PRIORITY_GENERAL); } diff --git a/host/lib/convert/convert_unpack_sc12.hpp b/host/lib/convert/convert_unpack_sc12.hpp index e612b035d..26e5f5d79 100644 --- a/host/lib/convert/convert_unpack_sc12.hpp +++ b/host/lib/convert/convert_unpack_sc12.hpp @@ -5,9 +5,9 @@ // SPDX-License-Identifier: GPL-3.0-or-later // -#include <type_traits> -#include <uhd/utils/byteswap.hpp> #include "convert_common.hpp" +#include <uhd/utils/byteswap.hpp> +#include <type_traits> using namespace uhd::convert; @@ -37,38 +37,35 @@ struct item32_sc12_3x * The numbers mark the position of one complex sample. */ template <typename type, tohost32_type tohost> -void convert_sc12_item32_3_to_star_4 -( - const item32_sc12_3x &input, - std::complex<type> &out0, - std::complex<type> &out1, - std::complex<type> &out2, - std::complex<type> &out3, +void convert_sc12_item32_3_to_star_4(const item32_sc12_3x& input, + std::complex<type>& out0, + std::complex<type>& out1, + std::complex<type>& out2, + std::complex<type>& out3, const double scalar, - typename std::enable_if<std::is_floating_point<type>::value>::type* = NULL -) + typename std::enable_if<std::is_floating_point<type>::value>::type* = NULL) { - //step 0: extract the lines from the input buffer - const item32_t line0 = tohost(input.line0); - const item32_t line1 = tohost(input.line1); - const item32_t line2 = tohost(input.line2); + // step 0: extract the lines from the input buffer + const item32_t line0 = tohost(input.line0); + const item32_t line1 = tohost(input.line1); + const item32_t line2 = tohost(input.line2); const uint64_t line01 = (uint64_t(line0) << 32) | line1; const uint64_t line12 = (uint64_t(line1) << 32) | line2; - //step 1: shift out and mask off the individual numbers - const type i0 = type(int16_t((line0 >> 16) & 0xfff0)*scalar); - const type q0 = type(int16_t((line0 >> 4) & 0xfff0)*scalar); + // step 1: shift out and mask off the individual numbers + const type i0 = type(int16_t((line0 >> 16) & 0xfff0) * scalar); + const type q0 = type(int16_t((line0 >> 4) & 0xfff0) * scalar); - const type i1 = type(int16_t((line01 >> 24) & 0xfff0)*scalar); - const type q1 = type(int16_t((line1 >> 12) & 0xfff0)*scalar); + const type i1 = type(int16_t((line01 >> 24) & 0xfff0) * scalar); + const type q1 = type(int16_t((line1 >> 12) & 0xfff0) * scalar); - const type i2 = type(int16_t((line1 >> 0) & 0xfff0)*scalar); - const type q2 = type(int16_t((line12 >> 20) & 0xfff0)*scalar); + const type i2 = type(int16_t((line1 >> 0) & 0xfff0) * scalar); + const type q2 = type(int16_t((line12 >> 20) & 0xfff0) * scalar); - const type i3 = type(int16_t((line2 >> 8) & 0xfff0)*scalar); - const type q3 = type(int16_t((line2 << 4) & 0xfff0)*scalar); + const type i3 = type(int16_t((line2 >> 8) & 0xfff0) * scalar); + const type q3 = type(int16_t((line2 << 4) & 0xfff0) * scalar); - //step 2: load the outputs + // step 2: load the outputs out0 = std::complex<type>(i0, q0); out1 = std::complex<type>(i1, q1); out2 = std::complex<type>(i2, q2); @@ -76,27 +73,24 @@ void convert_sc12_item32_3_to_star_4 } template <typename type, tohost32_type tohost> -void convert_sc12_item32_3_to_star_4 -( - const item32_sc12_3x &input, - std::complex<type> &out0, - std::complex<type> &out1, - std::complex<type> &out2, - std::complex<type> &out3, +void convert_sc12_item32_3_to_star_4(const item32_sc12_3x& input, + std::complex<type>& out0, + std::complex<type>& out1, + std::complex<type>& out2, + std::complex<type>& out3, const double, - typename std::enable_if<std::is_integral<type>::value>::type* = NULL -) + typename std::enable_if<std::is_integral<type>::value>::type* = NULL) { - //step 0: extract the lines from the input buffer - const item32_t line0 = tohost(input.line0); - const item32_t line1 = tohost(input.line1); - const item32_t line2 = tohost(input.line2); + // step 0: extract the lines from the input buffer + const item32_t line0 = tohost(input.line0); + const item32_t line1 = tohost(input.line1); + const item32_t line2 = tohost(input.line2); const uint64_t line01 = (uint64_t(line0) << 32) | line1; const uint64_t line12 = (uint64_t(line1) << 32) | line2; - //step 1: extract and load the outputs - out0 = std::complex<type>(line0 >> 16 & 0xfff0, line0 >> 4 & 0xfff0); - out1 = std::complex<type>(line01 >> 24 & 0xfff0, line1 >> 12 & 0xfff0); - out2 = std::complex<type>(line1 >> 0 & 0xfff0, line12 >> 20 & 0xfff0); - out3 = std::complex<type>(line2 >> 8 & 0xfff0, line2 << 4 & 0xfff0); + // step 1: extract and load the outputs + out0 = std::complex<type>(line0 >> 16 & 0xfff0, line0 >> 4 & 0xfff0); + out1 = std::complex<type>(line01 >> 24 & 0xfff0, line1 >> 12 & 0xfff0); + out2 = std::complex<type>(line1 >> 0 & 0xfff0, line12 >> 20 & 0xfff0); + out3 = std::complex<type>(line2 >> 8 & 0xfff0, line2 << 4 & 0xfff0); } diff --git a/host/lib/convert/convert_with_neon.cpp b/host/lib/convert/convert_with_neon.cpp index 8a3bd29d5..9aec68bab 100644 --- a/host/lib/convert/convert_with_neon.cpp +++ b/host/lib/convert/convert_with_neon.cpp @@ -10,119 +10,123 @@ #include <arm_neon.h> extern "C" { -void neon_item32_sc16_swap_16n(void *, void *, int iter); +void neon_item32_sc16_swap_16n(void*, void*, int iter); } static const int SIMD_WIDTH = 16; using namespace uhd::convert; -DECLARE_CONVERTER(fc32, 1, sc16_item32_le, 1, PRIORITY_SIMD){ - const fc32_t *input = reinterpret_cast<const fc32_t *>(inputs[0]); - item32_t *output = reinterpret_cast<item32_t *>(outputs[0]); +DECLARE_CONVERTER(fc32, 1, sc16_item32_le, 1, PRIORITY_SIMD) +{ + const fc32_t* input = reinterpret_cast<const fc32_t*>(inputs[0]); + item32_t* output = reinterpret_cast<item32_t*>(outputs[0]); size_t i; float32x4_t Q0 = vdupq_n_f32(float(scale_factor)); - for (i=0; i < (nsamps & ~0x0f); i+=8) { - float32x4_t Q1 = vld1q_f32(reinterpret_cast<const float *>(&input[i])); - float32x4_t Q4 = vld1q_f32(reinterpret_cast<const float *>(&input[i+2])); - float32x4_t Q7 = vld1q_f32(reinterpret_cast<const float *>(&input[i+4])); - float32x4_t Q10 = vld1q_f32(reinterpret_cast<const float *>(&input[i+6])); + for (i = 0; i < (nsamps & ~0x0f); i += 8) { + float32x4_t Q1 = vld1q_f32(reinterpret_cast<const float*>(&input[i])); + float32x4_t Q4 = vld1q_f32(reinterpret_cast<const float*>(&input[i + 2])); + float32x4_t Q7 = vld1q_f32(reinterpret_cast<const float*>(&input[i + 4])); + float32x4_t Q10 = vld1q_f32(reinterpret_cast<const float*>(&input[i + 6])); float32x4_t Q2 = vmulq_f32(Q1, Q0); - int32x4_t Q3 = vcvtq_s32_f32(Q2); - int16x4_t D8 = vmovn_s32(Q3); - int16x4_t D9 = vrev32_s16(D8); - vst1_s16((reinterpret_cast<int16_t *>(&output[i])), D9); + int32x4_t Q3 = vcvtq_s32_f32(Q2); + int16x4_t D8 = vmovn_s32(Q3); + int16x4_t D9 = vrev32_s16(D8); + vst1_s16((reinterpret_cast<int16_t*>(&output[i])), D9); float32x4_t Q5 = vmulq_f32(Q4, Q0); - int32x4_t Q6 = vcvtq_s32_f32(Q5); - int16x4_t D10 = vmovn_s32(Q6); - int16x4_t D11 = vrev32_s16(D10); - vst1_s16((reinterpret_cast<int16_t *>(&output[i+2])), D11); + int32x4_t Q6 = vcvtq_s32_f32(Q5); + int16x4_t D10 = vmovn_s32(Q6); + int16x4_t D11 = vrev32_s16(D10); + vst1_s16((reinterpret_cast<int16_t*>(&output[i + 2])), D11); float32x4_t Q8 = vmulq_f32(Q7, Q0); - int32x4_t Q9 = vcvtq_s32_f32(Q8); - int16x4_t D12 = vmovn_s32(Q9); - int16x4_t D13 = vrev32_s16(D12); - vst1_s16((reinterpret_cast<int16_t *>(&output[i+4])), D13); + int32x4_t Q9 = vcvtq_s32_f32(Q8); + int16x4_t D12 = vmovn_s32(Q9); + int16x4_t D13 = vrev32_s16(D12); + vst1_s16((reinterpret_cast<int16_t*>(&output[i + 4])), D13); float32x4_t Q11 = vmulq_f32(Q10, Q0); - int32x4_t Q13 = vcvtq_s32_f32(Q11); - int16x4_t D14 = vmovn_s32(Q13); - int16x4_t D15 = vrev32_s16(D14); - vst1_s16((reinterpret_cast<int16_t *>(&output[i+6])), D15); + int32x4_t Q13 = vcvtq_s32_f32(Q11); + int16x4_t D14 = vmovn_s32(Q13); + int16x4_t D15 = vrev32_s16(D14); + vst1_s16((reinterpret_cast<int16_t*>(&output[i + 6])), D15); } - xx_to_item32_sc16<uhd::htowx>(input+i, output+i, nsamps-i, scale_factor); + xx_to_item32_sc16<uhd::htowx>(input + i, output + i, nsamps - i, scale_factor); } -DECLARE_CONVERTER(sc16_item32_le, 1, fc32, 1, PRIORITY_SIMD){ - const item32_t *input = reinterpret_cast<const item32_t *>(inputs[0]); - fc32_t *output = reinterpret_cast<fc32_t *>(outputs[0]); +DECLARE_CONVERTER(sc16_item32_le, 1, fc32, 1, PRIORITY_SIMD) +{ + const item32_t* input = reinterpret_cast<const item32_t*>(inputs[0]); + fc32_t* output = reinterpret_cast<fc32_t*>(outputs[0]); size_t i; float32x4_t Q1 = vdupq_n_f32(float(scale_factor)); - for (i=0; i < (nsamps & ~0xf); i+=8) { - int16x4_t D0 = vld1_s16(reinterpret_cast<const int16_t *>(&input[i])); - int16x4_t D2 = vld1_s16(reinterpret_cast<const int16_t *>(&input[i+2])); - int16x4_t D4 = vld1_s16(reinterpret_cast<const int16_t *>(&input[i+4])); - int16x4_t D6 = vld1_s16(reinterpret_cast<const int16_t *>(&input[i+6])); - - int16x4_t D1 = vrev32_s16(D0); - int32x4_t Q2 = vmovl_s16(D1); + for (i = 0; i < (nsamps & ~0xf); i += 8) { + int16x4_t D0 = vld1_s16(reinterpret_cast<const int16_t*>(&input[i])); + int16x4_t D2 = vld1_s16(reinterpret_cast<const int16_t*>(&input[i + 2])); + int16x4_t D4 = vld1_s16(reinterpret_cast<const int16_t*>(&input[i + 4])); + int16x4_t D6 = vld1_s16(reinterpret_cast<const int16_t*>(&input[i + 6])); + + int16x4_t D1 = vrev32_s16(D0); + int32x4_t Q2 = vmovl_s16(D1); float32x4_t Q3 = vcvtq_f32_s32(Q2); float32x4_t Q4 = vmulq_f32(Q3, Q1); - vst1q_f32((reinterpret_cast<float *>(&output[i])), Q4); + vst1q_f32((reinterpret_cast<float*>(&output[i])), Q4); - int16x4_t D3 = vrev32_s16(D2); - int32x4_t Q5 = vmovl_s16(D3); + int16x4_t D3 = vrev32_s16(D2); + int32x4_t Q5 = vmovl_s16(D3); float32x4_t Q6 = vcvtq_f32_s32(Q5); float32x4_t Q7 = vmulq_f32(Q6, Q1); - vst1q_f32((reinterpret_cast<float *>(&output[i+2])), Q7); + vst1q_f32((reinterpret_cast<float*>(&output[i + 2])), Q7); - int16x4_t D5 = vrev32_s16(D4); - int32x4_t Q8 = vmovl_s16(D5); - float32x4_t Q9 = vcvtq_f32_s32(Q8); + int16x4_t D5 = vrev32_s16(D4); + int32x4_t Q8 = vmovl_s16(D5); + float32x4_t Q9 = vcvtq_f32_s32(Q8); float32x4_t Q10 = vmulq_f32(Q9, Q1); - vst1q_f32((reinterpret_cast<float *>(&output[i+4])), Q10); + vst1q_f32((reinterpret_cast<float*>(&output[i + 4])), Q10); - int16x4_t D7 = vrev32_s16(D6); - int32x4_t Q11 = vmovl_s16(D7); + int16x4_t D7 = vrev32_s16(D6); + int32x4_t Q11 = vmovl_s16(D7); float32x4_t Q12 = vcvtq_f32_s32(Q11); float32x4_t Q13 = vmulq_f32(Q12, Q1); - vst1q_f32((reinterpret_cast<float *>(&output[i+6])), Q13); + vst1q_f32((reinterpret_cast<float*>(&output[i + 6])), Q13); } - item32_sc16_to_xx<uhd::htowx>(input+i, output+i, nsamps-i, scale_factor); + item32_sc16_to_xx<uhd::htowx>(input + i, output + i, nsamps - i, scale_factor); } -DECLARE_CONVERTER(sc16, 1, sc16_item32_le, 1, PRIORITY_SIMD){ - const sc16_t *input = reinterpret_cast<const sc16_t *>(inputs[0]); - item32_t *output = reinterpret_cast<item32_t *>(outputs[0]); +DECLARE_CONVERTER(sc16, 1, sc16_item32_le, 1, PRIORITY_SIMD) +{ + const sc16_t* input = reinterpret_cast<const sc16_t*>(inputs[0]); + item32_t* output = reinterpret_cast<item32_t*>(outputs[0]); size_t i = nsamps / SIMD_WIDTH; if (i) - neon_item32_sc16_swap_16n((void *) input, (void *) output, i); + neon_item32_sc16_swap_16n((void*)input, (void*)output, i); i *= SIMD_WIDTH; - xx_to_item32_sc16<uhd::htowx>(input+i, output+i, nsamps-i, scale_factor); + xx_to_item32_sc16<uhd::htowx>(input + i, output + i, nsamps - i, scale_factor); } -DECLARE_CONVERTER(sc16_item32_le, 1, sc16, 1, PRIORITY_SIMD){ - const item32_t *input = reinterpret_cast<const item32_t *>(inputs[0]); - sc16_t *output = reinterpret_cast<sc16_t *>(outputs[0]); +DECLARE_CONVERTER(sc16_item32_le, 1, sc16, 1, PRIORITY_SIMD) +{ + const item32_t* input = reinterpret_cast<const item32_t*>(inputs[0]); + sc16_t* output = reinterpret_cast<sc16_t*>(outputs[0]); size_t i = nsamps / SIMD_WIDTH; if (i) - neon_item32_sc16_swap_16n((void *) input, (void *) output, i); + neon_item32_sc16_swap_16n((void*)input, (void*)output, i); i *= SIMD_WIDTH; - item32_sc16_to_xx<uhd::wtohx>(input+i, output+i, nsamps-i, scale_factor); + item32_sc16_to_xx<uhd::wtohx>(input + i, output + i, nsamps - i, scale_factor); } diff --git a/host/lib/convert/convert_with_tables.cpp b/host/lib/convert/convert_with_tables.cpp index 5c9248052..86637171a 100644 --- a/host/lib/convert/convert_with_tables.cpp +++ b/host/lib/convert/convert_with_tables.cpp @@ -20,7 +20,8 @@ typedef uint16_t (*tohost16_type)(uint16_t); * Implementation for sc16 to sc8 lookup table * - Lookup the real and imaginary parts individually **********************************************************************/ -template <bool swap> class convert_sc16_1_to_sc8_item32_1 : public converter +template <bool swap> +class convert_sc16_1_to_sc8_item32_1 : public converter { public: convert_sc16_1_to_sc8_item32_1(void) : _table(sc16_table_len) {} diff --git a/host/lib/convert/ssse3_pack_sc12.cpp b/host/lib/convert/ssse3_pack_sc12.cpp index e71c2288b..4ba14db3b 100644 --- a/host/lib/convert/ssse3_pack_sc12.cpp +++ b/host/lib/convert/ssse3_pack_sc12.cpp @@ -5,8 +5,8 @@ // SPDX-License-Identifier: GPL-3.0-or-later // -#include <tmmintrin.h> #include "convert_pack_sc12.hpp" +#include <tmmintrin.h> /* * Shuffle Orderings - Single 128-bit SSE register @@ -44,24 +44,21 @@ * ----------------------- * 31 0 */ -#define SC12_SHIFT_MASK 0xfff0fff0, 0xfff0fff0, 0x0fff0fff, 0x0fff0fff -#define SC12_PACK_SHUFFLE1 13,12,9,8,5,4,1,0,15,14,11,10,7,6,3,2 -#define SC12_PACK_SHUFFLE2 9,8,0,11,10,2,13,12,4,15,14,6,0,0,0,0 -#define SC12_PACK_SHUFFLE3 8,1,8,8,3,8,8,5,8,8,7,8,8,8,8,8 +#define SC12_SHIFT_MASK 0xfff0fff0, 0xfff0fff0, 0x0fff0fff, 0x0fff0fff +#define SC12_PACK_SHUFFLE1 13, 12, 9, 8, 5, 4, 1, 0, 15, 14, 11, 10, 7, 6, 3, 2 +#define SC12_PACK_SHUFFLE2 9, 8, 0, 11, 10, 2, 13, 12, 4, 15, 14, 6, 0, 0, 0, 0 +#define SC12_PACK_SHUFFLE3 8, 1, 8, 8, 3, 8, 8, 5, 8, 8, 7, 8, 8, 8, 8, 8 template <typename type> -inline void convert_star_4_to_sc12_item32_3 -( - const std::complex<type> *in, - item32_sc12_3x &output, +inline void convert_star_4_to_sc12_item32_3(const std::complex<type>* in, + item32_sc12_3x& output, const double scalar, - typename std::enable_if<std::is_same<type, float>::value>::type* = NULL -) + typename std::enable_if<std::is_same<type, float>::value>::type* = NULL) { __m128 m0, m1, m2; m0 = _mm_set1_ps(scalar); - m1 = _mm_loadu_ps((const float *) &in[0]); - m2 = _mm_loadu_ps((const float *) &in[2]); + m1 = _mm_loadu_ps((const float*)&in[0]); + m2 = _mm_loadu_ps((const float*)&in[2]); m1 = _mm_mul_ps(m1, m0); m2 = _mm_mul_ps(m2, m0); m0 = _mm_shuffle_ps(m1, m2, _MM_SHUFFLE(2, 0, 2, 0)); @@ -84,17 +81,14 @@ inline void convert_star_4_to_sc12_item32_3 m6 = _mm_or_si128(m6, m7); m6 = _mm_shuffle_epi32(m6, _MM_SHUFFLE(0, 1, 2, 3)); - _mm_storeu_si128((__m128i*) &output, m6); + _mm_storeu_si128((__m128i*)&output, m6); } template <typename type> -static void convert_star_4_to_sc12_item32_3 -( - const std::complex<type> *in, - item32_sc12_3x &output, +static void convert_star_4_to_sc12_item32_3(const std::complex<type>* in, + item32_sc12_3x& output, const double, - typename std::enable_if<std::is_same<type, short>::value>::type* = NULL -) + typename std::enable_if<std::is_same<type, short>::value>::type* = NULL) { __m128i m0, m1, m2, m3, m4, m5; m0 = _mm_set_epi32(SC12_SHIFT_MASK); @@ -102,7 +96,7 @@ static void convert_star_4_to_sc12_item32_3 m2 = _mm_set_epi8(SC12_PACK_SHUFFLE2); m3 = _mm_set_epi8(SC12_PACK_SHUFFLE3); - m4 = _mm_loadu_si128((__m128i*) in); + m4 = _mm_loadu_si128((__m128i*)in); m4 = _mm_shuffle_epi8(m4, m1); m5 = _mm_srli_epi16(m4, 4); m4 = _mm_shuffle_epi32(m4, _MM_SHUFFLE(0, 0, 3, 2)); @@ -115,57 +109,66 @@ static void convert_star_4_to_sc12_item32_3 m3 = _mm_or_si128(m4, m5); m3 = _mm_shuffle_epi32(m3, _MM_SHUFFLE(0, 1, 2, 3)); - _mm_storeu_si128((__m128i*) &output, m3); + _mm_storeu_si128((__m128i*)&output, m3); } template <typename type, towire32_type towire> struct convert_star_1_to_sc12_item32_2 : public converter { - convert_star_1_to_sc12_item32_2(void):_scalar(0.0) - { - } + convert_star_1_to_sc12_item32_2(void) : _scalar(0.0) {} void set_scalar(const double scalar) { _scalar = scalar; } - void operator()(const input_type &inputs, const output_type &outputs, const size_t nsamps) + void operator()( + const input_type& inputs, const output_type& outputs, const size_t nsamps) { - const std::complex<type> *input = reinterpret_cast<const std::complex<type> *>(inputs[0]); + const std::complex<type>* input = + reinterpret_cast<const std::complex<type>*>(inputs[0]); const size_t head_samps = size_t(outputs[0]) & 0x3; int enable; size_t rewind = 0; - switch(head_samps) - { - case 0: break; - case 1: rewind = 9; break; - case 2: rewind = 6; break; - case 3: rewind = 3; break; + switch (head_samps) { + case 0: + break; + case 1: + rewind = 9; + break; + case 2: + rewind = 6; + break; + case 3: + rewind = 3; + break; } - item32_sc12_3x *output = reinterpret_cast<item32_sc12_3x *>(size_t(outputs[0]) - rewind); + item32_sc12_3x* output = + reinterpret_cast<item32_sc12_3x*>(size_t(outputs[0]) - rewind); - //helper variables + // helper variables size_t i = 0, o = 0; - //handle the head case - switch (head_samps) - { - case 0: - break; //no head - case 1: - enable = CONVERT12_LINE2; - convert_star_4_to_sc12_item32_3<type, towire>(0, 0, 0, input[0], enable, output[o++], _scalar); - break; - case 2: - enable = CONVERT12_LINE2 | CONVERT12_LINE1; - convert_star_4_to_sc12_item32_3<type, towire>(0, 0, input[0], input[1], enable, output[o++], _scalar); - break; - case 3: - enable = CONVERT12_LINE2 | CONVERT12_LINE1 | CONVERT12_LINE0; - convert_star_4_to_sc12_item32_3<type, towire>(0, input[0], input[1], input[2], enable, output[o++], _scalar); - break; + // handle the head case + switch (head_samps) { + case 0: + break; // no head + case 1: + enable = CONVERT12_LINE2; + convert_star_4_to_sc12_item32_3<type, towire>( + 0, 0, 0, input[0], enable, output[o++], _scalar); + break; + case 2: + enable = CONVERT12_LINE2 | CONVERT12_LINE1; + convert_star_4_to_sc12_item32_3<type, towire>( + 0, 0, input[0], input[1], enable, output[o++], _scalar); + break; + case 3: + enable = CONVERT12_LINE2 | CONVERT12_LINE1 | CONVERT12_LINE0; + convert_star_4_to_sc12_item32_3<type, towire>( + 0, input[0], input[1], input[2], enable, output[o++], _scalar); + break; } i += head_samps; @@ -174,34 +177,47 @@ struct convert_star_1_to_sc12_item32_2 : public converter // subsequent samples to be converted (writes will simply happen // twice). So set the conversion loop to force a tail case on the // final 4 or fewer samples. - while (i+4 < nsamps) - { + while (i + 4 < nsamps) { convert_star_4_to_sc12_item32_3<type>(&input[i], output[o], _scalar); - o++; i += 4; + o++; + i += 4; } - //handle the tail case + // handle the tail case const size_t tail_samps = nsamps - i; - switch (tail_samps) - { - case 0: - break; //no tail - case 1: - enable = CONVERT12_LINE0; - convert_star_4_to_sc12_item32_3<type, towire>(input[i+0], 0, 0, 0, enable, output[o], _scalar); - break; - case 2: - enable = CONVERT12_LINE0 | CONVERT12_LINE1; - convert_star_4_to_sc12_item32_3<type, towire>(input[i+0], input[i+1], 0, 0, enable, output[o], _scalar); - break; - case 3: - enable = CONVERT12_LINE0 | CONVERT12_LINE1 | CONVERT12_LINE2; - convert_star_4_to_sc12_item32_3<type, towire>(input[i+0], input[i+1], input[i+2], 0, enable, output[o], _scalar); - break; - case 4: - enable = CONVERT12_LINE_ALL; - convert_star_4_to_sc12_item32_3<type, towire>(input[i+0], input[i+1], input[i+2], input[i+3], enable, output[o], _scalar); - break; + switch (tail_samps) { + case 0: + break; // no tail + case 1: + enable = CONVERT12_LINE0; + convert_star_4_to_sc12_item32_3<type, towire>( + input[i + 0], 0, 0, 0, enable, output[o], _scalar); + break; + case 2: + enable = CONVERT12_LINE0 | CONVERT12_LINE1; + convert_star_4_to_sc12_item32_3<type, towire>( + input[i + 0], input[i + 1], 0, 0, enable, output[o], _scalar); + break; + case 3: + enable = CONVERT12_LINE0 | CONVERT12_LINE1 | CONVERT12_LINE2; + convert_star_4_to_sc12_item32_3<type, towire>(input[i + 0], + input[i + 1], + input[i + 2], + 0, + enable, + output[o], + _scalar); + break; + case 4: + enable = CONVERT12_LINE_ALL; + convert_star_4_to_sc12_item32_3<type, towire>(input[i + 0], + input[i + 1], + input[i + 2], + input[i + 3], + enable, + output[o], + _scalar); + break; } } @@ -221,14 +237,16 @@ static converter::sptr make_convert_sc16_1_to_sc12_item32_le_1(void) UHD_STATIC_BLOCK(register_sse_pack_sc12) { uhd::convert::id_type id; - id.num_inputs = 1; + id.num_inputs = 1; id.num_outputs = 1; - id.input_format = "fc32"; + id.input_format = "fc32"; id.output_format = "sc12_item32_le"; - uhd::convert::register_converter(id, &make_convert_fc32_1_to_sc12_item32_le_1, PRIORITY_SIMD); + uhd::convert::register_converter( + id, &make_convert_fc32_1_to_sc12_item32_le_1, PRIORITY_SIMD); - id.input_format = "sc16"; + id.input_format = "sc16"; id.output_format = "sc12_item32_le"; - uhd::convert::register_converter(id, &make_convert_sc16_1_to_sc12_item32_le_1, PRIORITY_SIMD); + uhd::convert::register_converter( + id, &make_convert_sc16_1_to_sc12_item32_le_1, PRIORITY_SIMD); } diff --git a/host/lib/convert/ssse3_unpack_sc12.cpp b/host/lib/convert/ssse3_unpack_sc12.cpp index a6e147142..5494e0fd7 100644 --- a/host/lib/convert/ssse3_unpack_sc12.cpp +++ b/host/lib/convert/ssse3_unpack_sc12.cpp @@ -59,23 +59,20 @@ using namespace uhd::convert; * | 127 0 | * */ -#define SC12_SHIFT_MASK 0x0fff0fff, 0x0fff0fff, 0xfff0fff0, 0xfff0fff0 -#define SC12_PACK_SHUFFLE1 5,4,8,7,11,10,14,13,6,5,9,8,12,11,15,14 -#define SC12_PACK_SHUFFLE2 15,14,7,6,13,12,5,4,11,10,3,2,9,8,1,0 +#define SC12_SHIFT_MASK 0x0fff0fff, 0x0fff0fff, 0xfff0fff0, 0xfff0fff0 +#define SC12_PACK_SHUFFLE1 5, 4, 8, 7, 11, 10, 14, 13, 6, 5, 9, 8, 12, 11, 15, 14 +#define SC12_PACK_SHUFFLE2 15, 14, 7, 6, 13, 12, 5, 4, 11, 10, 3, 2, 9, 8, 1, 0 template <typename type, tohost32_type tohost> -inline void convert_sc12_item32_3_to_star_4 -( - const item32_sc12_3x &input, - std::complex<type> *out, +inline void convert_sc12_item32_3_to_star_4(const item32_sc12_3x& input, + std::complex<type>* out, double scalar, - typename std::enable_if<std::is_same<type, float>::value>::type* = NULL -) + typename std::enable_if<std::is_same<type, float>::value>::type* = NULL) { __m128i m0, m1, m2, m3, m4; m0 = _mm_set_epi32(SC12_SHIFT_MASK); m1 = _mm_set_epi8(SC12_PACK_SHUFFLE1); - m2 = _mm_loadu_si128((__m128i*) &input); + m2 = _mm_loadu_si128((__m128i*)&input); m2 = _mm_shuffle_epi32(m2, _MM_SHUFFLE(0, 1, 2, 3)); m3 = _mm_shuffle_epi8(m2, m1); m3 = _mm_and_si128(m3, m0); @@ -88,7 +85,7 @@ inline void convert_sc12_item32_3_to_star_4 m4 = _mm_unpackhi_epi32(m1, m2); __m128 m5, m6, m7; - m5 = _mm_set_ps1(scalar/(1 << 16)); + m5 = _mm_set_ps1(scalar / (1 << 16)); m6 = _mm_cvtepi32_ps(m3); m7 = _mm_cvtepi32_ps(m4); m6 = _mm_mul_ps(m6, m5); @@ -99,20 +96,17 @@ inline void convert_sc12_item32_3_to_star_4 } template <typename type, tohost32_type tohost> -inline void convert_sc12_item32_3_to_star_4 -( - const item32_sc12_3x &input, - std::complex<type> *out, +inline void convert_sc12_item32_3_to_star_4(const item32_sc12_3x& input, + std::complex<type>* out, double, - typename std::enable_if<std::is_same<type, short>::value>::type* = NULL -) + typename std::enable_if<std::is_same<type, short>::value>::type* = NULL) { __m128i m0, m1, m2, m3; m0 = _mm_set_epi32(SC12_SHIFT_MASK); m1 = _mm_set_epi8(SC12_PACK_SHUFFLE1); m2 = _mm_set_epi8(SC12_PACK_SHUFFLE2); - m3 = _mm_loadu_si128((__m128i*) &input); + m3 = _mm_loadu_si128((__m128i*)&input); m3 = _mm_shuffle_epi32(m3, _MM_SHUFFLE(0, 1, 2, 3)); m3 = _mm_shuffle_epi8(m3, m1); m3 = _mm_and_si128(m3, m0); @@ -122,62 +116,92 @@ inline void convert_sc12_item32_3_to_star_4 m0 = _mm_unpackhi_epi64(m1, m0); m1 = _mm_shuffle_epi8(m0, m2); - _mm_storeu_si128((__m128i*) out, m1); + _mm_storeu_si128((__m128i*)out, m1); } template <typename type, tohost32_type tohost> struct convert_sc12_item32_1_to_star_2 : public converter { - convert_sc12_item32_1_to_star_2(void):_scalar(0.0) + convert_sc12_item32_1_to_star_2(void) : _scalar(0.0) { - //NOP + // NOP } void set_scalar(const double scalar) { const int unpack_growth = 16; - _scalar = scalar/unpack_growth; + _scalar = scalar / unpack_growth; } - void operator()(const input_type &inputs, const output_type &outputs, const size_t nsamps) + void operator()( + const input_type& inputs, const output_type& outputs, const size_t nsamps) { const size_t head_samps = size_t(inputs[0]) & 0x3; - size_t rewind = 0; - switch(head_samps) - { - case 0: break; - case 1: rewind = 9; break; - case 2: rewind = 6; break; - case 3: rewind = 3; break; + size_t rewind = 0; + switch (head_samps) { + case 0: + break; + case 1: + rewind = 9; + break; + case 2: + rewind = 6; + break; + case 3: + rewind = 3; + break; } - const item32_sc12_3x *input = reinterpret_cast<const item32_sc12_3x *>(size_t(inputs[0]) - rewind); - std::complex<type> *output = reinterpret_cast<std::complex<type> *>(outputs[0]); + const item32_sc12_3x* input = + reinterpret_cast<const item32_sc12_3x*>(size_t(inputs[0]) - rewind); + std::complex<type>* output = reinterpret_cast<std::complex<type>*>(outputs[0]); std::complex<type> dummy; size_t i = 0, o = 0; - switch (head_samps) - { - case 0: break; //no head - case 1: convert_sc12_item32_3_to_star_4<type, tohost>(input[i++], dummy, dummy, dummy, output[0], _scalar); break; - case 2: convert_sc12_item32_3_to_star_4<type, tohost>(input[i++], dummy, dummy, output[0], output[1], _scalar); break; - case 3: convert_sc12_item32_3_to_star_4<type, tohost>(input[i++], dummy, output[0], output[1], output[2], _scalar); break; + switch (head_samps) { + case 0: + break; // no head + case 1: + convert_sc12_item32_3_to_star_4<type, tohost>( + input[i++], dummy, dummy, dummy, output[0], _scalar); + break; + case 2: + convert_sc12_item32_3_to_star_4<type, tohost>( + input[i++], dummy, dummy, output[0], output[1], _scalar); + break; + case 3: + convert_sc12_item32_3_to_star_4<type, tohost>( + input[i++], dummy, output[0], output[1], output[2], _scalar); + break; } o += head_samps; - //convert the body - while (o+3 < nsamps) - { - convert_sc12_item32_3_to_star_4<type, tohost>(input[i], &output[o], _scalar); - i += 1; o += 4; + // convert the body + while (o + 3 < nsamps) { + convert_sc12_item32_3_to_star_4<type, tohost>(input[i], &output[o], _scalar); + i += 1; + o += 4; } const size_t tail_samps = nsamps - o; - switch (tail_samps) - { - case 0: break; //no tail - case 1: convert_sc12_item32_3_to_star_4<type, tohost>(input[i], output[o+0], dummy, dummy, dummy, _scalar); break; - case 2: convert_sc12_item32_3_to_star_4<type, tohost>(input[i], output[o+0], output[o+1], dummy, dummy, _scalar); break; - case 3: convert_sc12_item32_3_to_star_4<type, tohost>(input[i], output[o+0], output[o+1], output[o+2], dummy, _scalar); break; + switch (tail_samps) { + case 0: + break; // no tail + case 1: + convert_sc12_item32_3_to_star_4<type, tohost>( + input[i], output[o + 0], dummy, dummy, dummy, _scalar); + break; + case 2: + convert_sc12_item32_3_to_star_4<type, tohost>( + input[i], output[o + 0], output[o + 1], dummy, dummy, _scalar); + break; + case 3: + convert_sc12_item32_3_to_star_4<type, tohost>(input[i], + output[o + 0], + output[o + 1], + output[o + 2], + dummy, + _scalar); + break; } } @@ -197,13 +221,15 @@ static converter::sptr make_convert_sc12_item32_le_1_to_sc16_1(void) UHD_STATIC_BLOCK(register_sse_unpack_sc12) { uhd::convert::id_type id; - id.num_inputs = 1; - id.num_outputs = 1; + id.num_inputs = 1; + id.num_outputs = 1; id.output_format = "fc32"; - id.input_format = "sc12_item32_le"; - uhd::convert::register_converter(id, &make_convert_sc12_item32_le_1_to_fc32_1, PRIORITY_SIMD); + id.input_format = "sc12_item32_le"; + uhd::convert::register_converter( + id, &make_convert_sc12_item32_le_1_to_fc32_1, PRIORITY_SIMD); id.output_format = "sc16"; - id.input_format = "sc12_item32_le"; - uhd::convert::register_converter(id, &make_convert_sc12_item32_le_1_to_sc16_1, PRIORITY_SIMD); + id.input_format = "sc12_item32_le"; + uhd::convert::register_converter( + id, &make_convert_sc12_item32_le_1_to_sc16_1, PRIORITY_SIMD); } |