summaryrefslogtreecommitdiff
path: root/gr-digital/lib
diff options
context:
space:
mode:
authorElof Wecksell <elof@wecksell.se>2021-01-12 10:35:31 +0100
committerMartin Braun <martin@gnuradio.org>2021-01-29 03:31:03 -0800
commitb16924381c90e07d5d8cf5bc236c7dc48a0fd677 (patch)
treee5fe0c4005af6c6f0a6178139439a478de0abacf /gr-digital/lib
parent761b327c761e0596f72cbe9f63e510f1b36c4b47 (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.cc37
-rw-r--r--gr-digital/lib/additive_scrambler_bb_impl.h32
-rw-r--r--gr-digital/lib/descrambler_bb_impl.cc4
-rw-r--r--gr-digital/lib/descrambler_bb_impl.h4
-rw-r--r--gr-digital/lib/glfsr.cc9
-rw-r--r--gr-digital/lib/glfsr_source_b_impl.cc16
-rw-r--r--gr-digital/lib/glfsr_source_b_impl.h14
-rw-r--r--gr-digital/lib/glfsr_source_f_impl.cc15
-rw-r--r--gr-digital/lib/glfsr_source_f_impl.h14
-rw-r--r--gr-digital/lib/scrambler_bb_impl.cc4
-rw-r--r--gr-digital/lib/scrambler_bb_impl.h4
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,