diff options
author | Elof Wecksell <elof@wecksell.se> | 2021-01-12 10:35:31 +0100 |
---|---|---|
committer | Martin Braun <martin@gnuradio.org> | 2021-01-29 03:31:03 -0800 |
commit | b16924381c90e07d5d8cf5bc236c7dc48a0fd677 (patch) | |
tree | e5fe0c4005af6c6f0a6178139439a478de0abacf /gr-digital/lib | |
parent | 761b327c761e0596f72cbe9f63e510f1b36c4b47 (diff) |
gr-digital: improved performance and capability of scramblers to 64-bit registers. Use __builtin_parity or volk popcnt. qa was also enhanced to detect errors.
Signed-off-by: Elof Wecksell <elof@wecksell.se>
Co-authored-by: Martin Braun <martin@gnuradio.org>
Diffstat (limited to 'gr-digital/lib')
-rw-r--r-- | gr-digital/lib/additive_scrambler_bb_impl.cc | 37 | ||||
-rw-r--r-- | gr-digital/lib/additive_scrambler_bb_impl.h | 32 | ||||
-rw-r--r-- | gr-digital/lib/descrambler_bb_impl.cc | 4 | ||||
-rw-r--r-- | gr-digital/lib/descrambler_bb_impl.h | 4 | ||||
-rw-r--r-- | gr-digital/lib/glfsr.cc | 9 | ||||
-rw-r--r-- | gr-digital/lib/glfsr_source_b_impl.cc | 16 | ||||
-rw-r--r-- | gr-digital/lib/glfsr_source_b_impl.h | 14 | ||||
-rw-r--r-- | gr-digital/lib/glfsr_source_f_impl.cc | 15 | ||||
-rw-r--r-- | gr-digital/lib/glfsr_source_f_impl.h | 14 | ||||
-rw-r--r-- | gr-digital/lib/scrambler_bb_impl.cc | 4 | ||||
-rw-r--r-- | gr-digital/lib/scrambler_bb_impl.h | 4 |
11 files changed, 75 insertions, 78 deletions
diff --git a/gr-digital/lib/additive_scrambler_bb_impl.cc b/gr-digital/lib/additive_scrambler_bb_impl.cc index a701700b72..17932022fa 100644 --- a/gr-digital/lib/additive_scrambler_bb_impl.cc +++ b/gr-digital/lib/additive_scrambler_bb_impl.cc @@ -18,22 +18,22 @@ namespace gr { namespace digital { -additive_scrambler_bb::sptr additive_scrambler_bb::make(int mask, - int seed, - int len, - int count, - int bits_per_byte, +additive_scrambler_bb::sptr additive_scrambler_bb::make(uint64_t mask, + uint64_t seed, + uint8_t len, + int64_t count, + uint8_t bits_per_byte, const std::string& reset_tag_key) { return gnuradio::make_block_sptr<additive_scrambler_bb_impl>( mask, seed, len, count, bits_per_byte, reset_tag_key); } -additive_scrambler_bb_impl::additive_scrambler_bb_impl(int mask, - int seed, - int len, - int count, - int bits_per_byte, +additive_scrambler_bb_impl::additive_scrambler_bb_impl(uint64_t mask, + uint64_t seed, + uint8_t len, + int64_t count, + uint8_t bits_per_byte, const std::string& reset_tag_key) : sync_block("additive_scrambler_bb", io_signature::make(1, 1, sizeof(unsigned char)), @@ -56,25 +56,26 @@ additive_scrambler_bb_impl::additive_scrambler_bb_impl(int mask, additive_scrambler_bb_impl::~additive_scrambler_bb_impl() {} -int additive_scrambler_bb_impl::mask() const { return d_lfsr.mask(); } +uint64_t additive_scrambler_bb_impl::mask() const { return d_lfsr.mask(); } -int additive_scrambler_bb_impl::seed() const { return d_seed; } +uint64_t additive_scrambler_bb_impl::seed() const { return d_seed; } -int additive_scrambler_bb_impl::len() const { return d_len; } +uint8_t additive_scrambler_bb_impl::len() const { return d_len; } -int additive_scrambler_bb_impl::count() const { return d_count; } +int64_t additive_scrambler_bb_impl::count() const { return d_count; } -int additive_scrambler_bb_impl::_get_next_reset_index(int noutput_items, - int last_reset_index /* = -1 */) +int64_t +additive_scrambler_bb_impl::_get_next_reset_index(int64_t noutput_items, + int64_t last_reset_index /* = -1 */) { - int reset_index = + int64_t reset_index = noutput_items; // This is a value that gets never reached in the for loop if (d_count == -1) { std::vector<gr::tag_t> tags; get_tags_in_range( tags, 0, nitems_read(0), nitems_read(0) + noutput_items, d_reset_tag_key); for (unsigned i = 0; i < tags.size(); i++) { - int reset_pos = tags[i].offset - nitems_read(0); + int64_t reset_pos = tags[i].offset - nitems_read(0); if (reset_pos < reset_index && reset_pos > last_reset_index) { reset_index = reset_pos; } diff --git a/gr-digital/lib/additive_scrambler_bb_impl.h b/gr-digital/lib/additive_scrambler_bb_impl.h index bce86dcf80..42626ac163 100644 --- a/gr-digital/lib/additive_scrambler_bb_impl.h +++ b/gr-digital/lib/additive_scrambler_bb_impl.h @@ -21,29 +21,29 @@ class additive_scrambler_bb_impl : public additive_scrambler_bb { private: digital::lfsr d_lfsr; - int d_count; //!< Reset the LFSR after this many bytes (not bits) - int d_bytes; //!< Count the processed bytes - int d_len; - int d_seed; - int d_bits_per_byte; + int64_t d_count; //!< Reset the LFSR after this many bytes (not bits) + uint64_t d_bytes; //!< Count the processed bytes + uint8_t d_len; + uint64_t d_seed; + uint8_t d_bits_per_byte; pmt::pmt_t d_reset_tag_key; //!< Reset the LFSR when this tag is received - int _get_next_reset_index(int noutput_items, int last_reset_index = -1); + int64_t _get_next_reset_index(int64_t noutput_items, int64_t last_reset_index = -1); public: - additive_scrambler_bb_impl(int mask, - int seed, - int len, - int count = 0, - int bits_per_byte = 1, + additive_scrambler_bb_impl(uint64_t mask, + uint64_t seed, + uint8_t len, + int64_t count = 0, + uint8_t bits_per_byte = 1, const std::string& reset_tag_key = ""); ~additive_scrambler_bb_impl() override; - int mask() const override; - int seed() const override; - int len() const override; - int count() const override; - int bits_per_byte() override { return d_bits_per_byte; }; + uint64_t mask() const override; + uint64_t seed() const override; + uint8_t len() const override; + int64_t count() const override; + uint8_t bits_per_byte() override { return d_bits_per_byte; }; int work(int noutput_items, gr_vector_const_void_star& input_items, diff --git a/gr-digital/lib/descrambler_bb_impl.cc b/gr-digital/lib/descrambler_bb_impl.cc index b0d875f6a2..2f59703187 100644 --- a/gr-digital/lib/descrambler_bb_impl.cc +++ b/gr-digital/lib/descrambler_bb_impl.cc @@ -18,12 +18,12 @@ namespace gr { namespace digital { -descrambler_bb::sptr descrambler_bb::make(int mask, int seed, int len) +descrambler_bb::sptr descrambler_bb::make(uint64_t mask, uint64_t seed, uint8_t len) { return gnuradio::make_block_sptr<descrambler_bb_impl>(mask, seed, len); } -descrambler_bb_impl::descrambler_bb_impl(int mask, int seed, int len) +descrambler_bb_impl::descrambler_bb_impl(uint64_t mask, uint64_t seed, uint8_t len) : sync_block("descrambler_bb", io_signature::make(1, 1, sizeof(unsigned char)), io_signature::make(1, 1, sizeof(unsigned char))), diff --git a/gr-digital/lib/descrambler_bb_impl.h b/gr-digital/lib/descrambler_bb_impl.h index 41d8d9c3c8..3c198bc93c 100644 --- a/gr-digital/lib/descrambler_bb_impl.h +++ b/gr-digital/lib/descrambler_bb_impl.h @@ -23,8 +23,8 @@ private: digital::lfsr d_lfsr; public: - descrambler_bb_impl(int mask, int seed, int len); - ~descrambler_bb_impl() override; + descrambler_bb_impl(uint64_t mask, uint64_t seed, uint8_t len); + ~descrambler_bb_impl(); int work(int noutput_items, gr_vector_const_void_star& input_items, diff --git a/gr-digital/lib/glfsr.cc b/gr-digital/lib/glfsr.cc index 01a9faa0f9..e63906c440 100644 --- a/gr-digital/lib/glfsr.cc +++ b/gr-digital/lib/glfsr.cc @@ -14,7 +14,7 @@ namespace gr { namespace digital { -static uint32_t s_polynomial_masks[] = { +static uint64_t s_polynomial_masks[] = { 0x00000000, 0x00000001, // x^1 + 1 0x00000003, // x^2 + x^1 + 1 @@ -52,11 +52,10 @@ static uint32_t s_polynomial_masks[] = { glfsr::~glfsr() {} -uint32_t glfsr::glfsr_mask(unsigned int degree) +uint64_t glfsr::glfsr_mask(unsigned int degree) { - if (degree < 1 || degree > 32) - throw std::runtime_error( - "glfsr::glfsr_mask(): degree must be between 1 and 32 inclusive"); + if (degree < 1 || degree > 64) + throw std::runtime_error("glfsr::glfsr_mask(): must be 1 <= degree <= 64"); return s_polynomial_masks[degree]; } diff --git a/gr-digital/lib/glfsr_source_b_impl.cc b/gr-digital/lib/glfsr_source_b_impl.cc index 13ee0393da..79570099d9 100644 --- a/gr-digital/lib/glfsr_source_b_impl.cc +++ b/gr-digital/lib/glfsr_source_b_impl.cc @@ -1,4 +1,3 @@ -/* -*- c++ -*- */ /* * Copyright 2007,2010,2012,2016 Free Software Foundation, Inc. * @@ -20,31 +19,30 @@ namespace gr { namespace digital { glfsr_source_b::sptr -glfsr_source_b::make(unsigned int degree, bool repeat, uint32_t mask, uint32_t seed) +glfsr_source_b::make(unsigned int degree, bool repeat, uint64_t mask, uint64_t seed) { return gnuradio::make_block_sptr<glfsr_source_b_impl>(degree, repeat, mask, seed); } glfsr_source_b_impl::glfsr_source_b_impl(unsigned int degree, bool repeat, - uint32_t mask, - uint32_t seed) + uint64_t mask, + uint64_t seed) : sync_block("glfsr_source_b", io_signature::make(0, 0, 0), io_signature::make(1, 1, sizeof(unsigned char))), d_glfsr(mask ? mask : glfsr::glfsr_mask(degree), seed), d_repeat(repeat), d_index(0), - d_length((((uint32_t)1) << degree) - 1) + d_length((1ULL << degree) - 1) { - if (degree < 1 || degree > 32) - throw std::runtime_error( - "glfsr_source_b_impl: degree must be between 1 and 32 inclusive"); + if (degree < 1 || degree > 64) + throw std::runtime_error("glfsr_source_b_impl: must be 1 <= degree <= 64"); } glfsr_source_b_impl::~glfsr_source_b_impl() {} -uint32_t glfsr_source_b_impl::mask() const { return d_glfsr.mask(); } +uint64_t glfsr_source_b_impl::mask() const { return d_glfsr.mask(); } int glfsr_source_b_impl::work(int noutput_items, gr_vector_const_void_star& input_items, diff --git a/gr-digital/lib/glfsr_source_b_impl.h b/gr-digital/lib/glfsr_source_b_impl.h index 108f3b8c8f..8dfc9af8b3 100644 --- a/gr-digital/lib/glfsr_source_b_impl.h +++ b/gr-digital/lib/glfsr_source_b_impl.h @@ -23,22 +23,22 @@ private: glfsr d_glfsr; bool d_repeat; - uint32_t d_index; - uint32_t d_length; + uint64_t d_index; + uint64_t d_length; public: glfsr_source_b_impl(unsigned int degree, bool repeat = true, - uint32_t mask = 0, - uint32_t seed = 0x1); - ~glfsr_source_b_impl() override; + uint64_t mask = 0, + uint64_t seed = 0x1); + ~glfsr_source_b_impl(); int work(int noutput_items, gr_vector_const_void_star& input_items, gr_vector_void_star& output_items) override; - uint32_t period() const override { return d_length; } - uint32_t mask() const override; + uint64_t period() const { return d_length; } + uint64_t mask() const; }; } /* namespace digital */ diff --git a/gr-digital/lib/glfsr_source_f_impl.cc b/gr-digital/lib/glfsr_source_f_impl.cc index 41559b570e..359e9dbff8 100644 --- a/gr-digital/lib/glfsr_source_f_impl.cc +++ b/gr-digital/lib/glfsr_source_f_impl.cc @@ -21,31 +21,30 @@ namespace gr { namespace digital { glfsr_source_f::sptr -glfsr_source_f::make(unsigned int degree, bool repeat, uint32_t mask, uint32_t seed) +glfsr_source_f::make(unsigned int degree, bool repeat, uint64_t mask, uint64_t seed) { return gnuradio::make_block_sptr<glfsr_source_f_impl>(degree, repeat, mask, seed); } glfsr_source_f_impl::glfsr_source_f_impl(unsigned int degree, bool repeat, - uint32_t mask, - uint32_t seed) + uint64_t mask, + uint64_t seed) : sync_block("glfsr_source_f", io_signature::make(0, 0, 0), io_signature::make(1, 1, sizeof(float))), d_glfsr(mask ? mask : glfsr::glfsr_mask(degree), seed), d_repeat(repeat), d_index(0), - d_length((((uint32_t)1) << degree) - 1) + d_length((1ULL << degree) - 1) { - if (degree < 1 || degree > 32) - throw std::runtime_error( - "glfsr_source_f_impl: degree must be between 1 and 32 inclusive"); + if (degree < 1 || degree > 64) + throw std::runtime_error("glfsr_source_f_impl: must be 1 <= degree <= 64"); } glfsr_source_f_impl::~glfsr_source_f_impl() {} -uint32_t glfsr_source_f_impl::mask() const { return d_glfsr.mask(); } +uint64_t glfsr_source_f_impl::mask() const { return d_glfsr.mask(); } int glfsr_source_f_impl::work(int noutput_items, gr_vector_const_void_star& input_items, diff --git a/gr-digital/lib/glfsr_source_f_impl.h b/gr-digital/lib/glfsr_source_f_impl.h index 8de9e89039..703222364e 100644 --- a/gr-digital/lib/glfsr_source_f_impl.h +++ b/gr-digital/lib/glfsr_source_f_impl.h @@ -23,22 +23,22 @@ private: glfsr d_glfsr; bool d_repeat; - uint32_t d_index; - uint32_t d_length; + uint64_t d_index; + uint64_t d_length; public: glfsr_source_f_impl(unsigned int degree, bool repeat = true, - uint32_t mask = 0, - uint32_t seed = 0x1); - ~glfsr_source_f_impl() override; + uint64_t mask = 0, + uint64_t seed = 0x1); + ~glfsr_source_f_impl(); int work(int noutput_items, gr_vector_const_void_star& input_items, gr_vector_void_star& output_items) override; - uint32_t period() const override { return d_length; } - uint32_t mask() const override; + uint64_t period() const { return d_length; } + uint64_t mask() const; }; } /* namespace digital */ diff --git a/gr-digital/lib/scrambler_bb_impl.cc b/gr-digital/lib/scrambler_bb_impl.cc index 765a08aa57..e04b0d69c2 100644 --- a/gr-digital/lib/scrambler_bb_impl.cc +++ b/gr-digital/lib/scrambler_bb_impl.cc @@ -18,12 +18,12 @@ namespace gr { namespace digital { -scrambler_bb::sptr scrambler_bb::make(int mask, int seed, int len) +scrambler_bb::sptr scrambler_bb::make(uint64_t mask, uint64_t seed, uint8_t len) { return gnuradio::make_block_sptr<scrambler_bb_impl>(mask, seed, len); } -scrambler_bb_impl::scrambler_bb_impl(int mask, int seed, int len) +scrambler_bb_impl::scrambler_bb_impl(uint64_t mask, uint64_t seed, uint8_t len) : sync_block("scrambler_bb", io_signature::make(1, 1, sizeof(unsigned char)), io_signature::make(1, 1, sizeof(unsigned char))), diff --git a/gr-digital/lib/scrambler_bb_impl.h b/gr-digital/lib/scrambler_bb_impl.h index 2198d2a11b..aa4ff94357 100644 --- a/gr-digital/lib/scrambler_bb_impl.h +++ b/gr-digital/lib/scrambler_bb_impl.h @@ -24,8 +24,8 @@ private: digital::lfsr d_lfsr; public: - scrambler_bb_impl(int mask, int seed, int len); - ~scrambler_bb_impl() override; + scrambler_bb_impl(uint64_t mask, uint64_t seed, uint8_t len); + ~scrambler_bb_impl(); int work(int noutput_items, gr_vector_const_void_star& input_items, |