summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Müller <marcus.mueller@ettus.com>2016-08-09 22:50:21 +0200
committerMarcus Müller <marcus.mueller@ettus.com>2016-08-09 22:54:43 +0200
commit9f8e36509959788c5333fc935a66a1311f05a4d5 (patch)
treed6922eed992ccde96646106cfe23a2946f07653f
parentfc1a6a88483120921936e415aba4d5d1a9b42d96 (diff)
digital:move GLFSR from 'int' to 'uint32'. Add SWIG interface
-rw-r--r--gr-digital/include/gnuradio/digital/glfsr.h22
-rw-r--r--gr-digital/include/gnuradio/digital/glfsr_source_b.h10
-rw-r--r--gr-digital/include/gnuradio/digital/glfsr_source_f.h10
-rw-r--r--gr-digital/lib/glfsr.cc19
-rw-r--r--gr-digital/lib/glfsr_source_b_impl.cc38
-rw-r--r--gr-digital/lib/glfsr_source_b_impl.h14
-rw-r--r--gr-digital/lib/glfsr_source_f_impl.cc38
-rw-r--r--gr-digital/lib/glfsr_source_f_impl.h18
-rw-r--r--gr-digital/swig/digital_swig.i2
9 files changed, 88 insertions, 83 deletions
diff --git a/gr-digital/include/gnuradio/digital/glfsr.h b/gr-digital/include/gnuradio/digital/glfsr.h
index 445904969e..449eeaa618 100644
--- a/gr-digital/include/gnuradio/digital/glfsr.h
+++ b/gr-digital/include/gnuradio/digital/glfsr.h
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2007,2012 Free Software Foundation, Inc.
+ * Copyright 2007,2012,2016 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -24,6 +24,7 @@
#define INCLUDED_DIGITAL_GLFSR_H
#include <gnuradio/digital/api.h>
+#include <boost/cstdint.hpp>
namespace gr {
namespace digital {
@@ -38,25 +39,18 @@ namespace gr {
class DIGITAL_API glfsr
{
private:
- int d_shift_register;
- int d_mask;
+ uint32_t d_shift_register;
+ uint32_t d_mask;
public:
- glfsr(int mask, int seed) { d_shift_register = seed; d_mask = mask; }
+ glfsr(uint32_t mask, uint32_t seed) { d_shift_register = seed; d_mask = mask; }
~glfsr();
- static int glfsr_mask(int degree);
+ static uint32_t glfsr_mask(unsigned int degree);
- unsigned char next_bit()
- {
- unsigned char bit = d_shift_register & 1;
- d_shift_register >>= 1;
- if(bit)
- d_shift_register ^= d_mask;
- return bit;
- }
+ uint8_t next_bit();
- int mask() const { return d_mask; }
+ uint32_t mask() const { return d_mask; }
};
} /* namespace digital */
diff --git a/gr-digital/include/gnuradio/digital/glfsr_source_b.h b/gr-digital/include/gnuradio/digital/glfsr_source_b.h
index 3491d73315..46ea38ebb5 100644
--- a/gr-digital/include/gnuradio/digital/glfsr_source_b.h
+++ b/gr-digital/include/gnuradio/digital/glfsr_source_b.h
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2007,2012 Free Software Foundation, Inc.
+ * Copyright 2007,2012,2016 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -50,11 +50,11 @@ namespace gr {
* register to feed back.
* \param seed Initial setting for values in shift register.
*/
- static sptr make(int degree, bool repeat=true,
- int mask=0, int seed=1);
+ static sptr make(unsigned int degree, bool repeat=true,
+ uint32_t mask=0x0, uint32_t seed=0x1);
- virtual unsigned int period() const = 0;
- virtual int mask() const = 0;
+ virtual uint32_t period() const = 0;
+ virtual uint32_t mask() const = 0;
};
} /* namespace digital */
diff --git a/gr-digital/include/gnuradio/digital/glfsr_source_f.h b/gr-digital/include/gnuradio/digital/glfsr_source_f.h
index 24c0713792..b86f83cd93 100644
--- a/gr-digital/include/gnuradio/digital/glfsr_source_f.h
+++ b/gr-digital/include/gnuradio/digital/glfsr_source_f.h
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2007,2012 Free Software Foundation, Inc.
+ * Copyright 2007,2012,2016 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -50,11 +50,11 @@ namespace gr {
* register to feed back.
* \param seed Initial setting for values in shift register.
*/
- static sptr make(int degree, bool repeat=true,
- int mask=0, int seed=1);
+ static sptr make(unsigned int degree, bool repeat=true,
+ uint32_t mask=0, uint32_t seed=1);
- virtual unsigned int period() const = 0;
- virtual int mask() const = 0;
+ virtual uint32_t period() const = 0;
+ virtual uint32_t mask() const = 0;
};
} /* namespace digital */
diff --git a/gr-digital/lib/glfsr.cc b/gr-digital/lib/glfsr.cc
index fa6c765570..5593bf8615 100644
--- a/gr-digital/lib/glfsr.cc
+++ b/gr-digital/lib/glfsr.cc
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2007,2012 Free Software Foundation, Inc.
+ * Copyright 2007,2012,2016 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -26,7 +26,7 @@
namespace gr {
namespace digital {
- static int s_polynomial_masks[] = {
+ static uint32_t s_polynomial_masks[] = {
0x00000000,
0x00000001, // x^1 + 1
0x00000003, // x^2 + x^1 + 1
@@ -59,19 +59,28 @@ namespace gr {
0x10000002, // x^29 + x^2 + 1
0x20000029, // x^30 + x^4 + x^1 + 1
0x40000004, // x^31 + x^3 + 1
- (int) 0x80000057 // x^32 + x^7 + x^5 + x^3 + x^2 + x^1 + 1
+ 0x80000057 // x^32 + x^7 + x^5 + x^3 + x^2 + x^1 + 1
};
glfsr::~glfsr()
{
}
- int glfsr::glfsr_mask(int degree)
+ uint32_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");
+ throw std::runtime_error("glfsr::glfsr_mask(): degree must be between 1 and 32 inclusive");
return s_polynomial_masks[degree];
}
+ uint8_t glfsr::next_bit()
+ {
+ unsigned char bit = d_shift_register & 0x1;
+ d_shift_register >>= 1;
+ if(bit)
+ d_shift_register ^= d_mask;
+ return bit;
+ }
+
} /* namespace digital */
} /* namespace gr */
diff --git a/gr-digital/lib/glfsr_source_b_impl.cc b/gr-digital/lib/glfsr_source_b_impl.cc
index 260bd45c24..6b1a14900f 100644
--- a/gr-digital/lib/glfsr_source_b_impl.cc
+++ b/gr-digital/lib/glfsr_source_b_impl.cc
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2007,2010,2012 Free Software Foundation, Inc.
+ * Copyright 2007,2010,2012,2016 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -32,25 +32,25 @@ namespace gr {
namespace digital {
glfsr_source_b::sptr
- glfsr_source_b::make(int degree, bool repeat, int mask, int seed)
+ glfsr_source_b::make(unsigned int degree, bool repeat, uint32_t mask, uint32_t seed)
{
return gnuradio::get_initial_sptr
- (new glfsr_source_b_impl(degree, repeat, mask, seed));
+ (new glfsr_source_b_impl(degree, repeat, mask, seed));
}
- glfsr_source_b_impl::glfsr_source_b_impl(int degree, bool repeat,
- int mask, int seed)
+ glfsr_source_b_impl::glfsr_source_b_impl(unsigned int degree, bool repeat,
+ uint32_t mask, uint32_t seed)
: sync_block("glfsr_source_b",
- io_signature::make(0, 0, 0),
- io_signature::make(1, 1, sizeof(unsigned char))),
- d_repeat(repeat), d_index(0)
+ io_signature::make(0, 0, 0),
+ io_signature::make(1, 1, sizeof(unsigned char))),
+ d_repeat(repeat), d_index(0),
+ d_length( ( ((uint32_t)1) << degree) - 1)
{
if(degree < 1 || degree > 32)
- throw std::runtime_error("glfsr_source_b_impl: degree must be between 1 and 32 inclusive");
- d_length = (unsigned int)((1ULL << degree)-1);
+ throw std::runtime_error("glfsr_source_b_impl: degree must be between 1 and 32 inclusive");
if(mask == 0)
- mask = glfsr::glfsr_mask(degree);
+ mask = glfsr::glfsr_mask(degree);
d_glfsr = new glfsr(mask, seed);
}
@@ -59,7 +59,7 @@ namespace gr {
delete d_glfsr;
}
- int
+ uint32_t
glfsr_source_b_impl::mask() const
{
return d_glfsr->mask();
@@ -67,19 +67,19 @@ namespace gr {
int
glfsr_source_b_impl::work(int noutput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items)
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
{
char *out = (char*)output_items[0];
if((d_index > d_length) && d_repeat == false)
- return -1; /* once through the sequence */
+ return WORK_DONE; /* once through the sequence */
int i;
for(i = 0; i < noutput_items; i++) {
- out[i] = d_glfsr->next_bit();
- d_index++;
- if(d_index > d_length && d_repeat == false)
- break;
+ out[i] = d_glfsr->next_bit();
+ d_index++;
+ if(d_index > d_length && d_repeat == false)
+ break;
}
return i;
diff --git a/gr-digital/lib/glfsr_source_b_impl.h b/gr-digital/lib/glfsr_source_b_impl.h
index a063eb7c0a..ff2b0586c2 100644
--- a/gr-digital/lib/glfsr_source_b_impl.h
+++ b/gr-digital/lib/glfsr_source_b_impl.h
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2007,2012 Free Software Foundation, Inc.
+ * Copyright 2007,2012,2016 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -35,20 +35,20 @@ namespace gr {
glfsr *d_glfsr;
bool d_repeat;
- unsigned int d_index;
- unsigned int d_length;
+ uint32_t d_index;
+ uint32_t d_length;
public:
- glfsr_source_b_impl(int degree, bool repeat=true,
- int mask=0, int seed=1);
+ glfsr_source_b_impl(unsigned int degree, bool repeat=true,
+ uint32_t mask=0, uint32_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);
- unsigned int period() const { return d_length; }
- int mask() const;
+ uint32_t period() const { return d_length; }
+ uint32_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 cb637df4ea..0dc24cb51a 100644
--- a/gr-digital/lib/glfsr_source_f_impl.cc
+++ b/gr-digital/lib/glfsr_source_f_impl.cc
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2007,2010,2012 Free Software Foundation, Inc.
+ * Copyright 2007,2010,2012,2016 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -33,25 +33,25 @@ namespace gr {
namespace digital {
glfsr_source_f::sptr
- glfsr_source_f::make(int degree, bool repeat, int mask, int seed)
+ glfsr_source_f::make(unsigned int degree, bool repeat, uint32_t mask, uint32_t seed)
{
return gnuradio::get_initial_sptr
- (new glfsr_source_f_impl(degree, repeat, mask, seed));
+ (new glfsr_source_f_impl(degree, repeat, mask, seed));
}
- glfsr_source_f_impl::glfsr_source_f_impl(int degree, bool repeat,
- int mask, int seed)
+ glfsr_source_f_impl::glfsr_source_f_impl(unsigned int degree, bool repeat,
+ uint32_t mask, uint32_t seed)
: sync_block("glfsr_source_f",
- io_signature::make(0, 0, 0),
- io_signature::make(1, 1, sizeof(float))),
- d_repeat(repeat), d_index(0)
+ io_signature::make(0, 0, 0),
+ io_signature::make(1, 1, sizeof(float))),
+ d_repeat(repeat), d_index(0),
+ d_length( ( ((uint32_t)1) << degree) - 1)
{
if(degree < 1 || degree > 32)
- throw std::runtime_error("glfsr_source_f_impl: degree must be between 1 and 32 inclusive");
- d_length = (unsigned int)((1ULL << degree)-1);
+ throw std::runtime_error("glfsr_source_f_impl: degree must be between 1 and 32 inclusive");
if(mask == 0)
- mask = glfsr::glfsr_mask(degree);
+ mask = glfsr::glfsr_mask(degree);
d_glfsr = new glfsr(mask, seed);
}
@@ -60,7 +60,7 @@ namespace gr {
delete d_glfsr;
}
- int
+ uint32_t
glfsr_source_f_impl::mask() const
{
return d_glfsr->mask();
@@ -68,19 +68,19 @@ namespace gr {
int
glfsr_source_f_impl::work(int noutput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items)
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
{
float *out = (float *) output_items[0];
if((d_index > d_length) && d_repeat == false)
- return -1; /* once through the sequence */
+ return WORK_DONE; /* once through the sequence */
int i;
for(i = 0; i < noutput_items; i++) {
- out[i] = (float)d_glfsr->next_bit()*2.0-1.0;
- d_index++;
- if(d_index > d_length && d_repeat == false)
- break;
+ out[i] = (float)d_glfsr->next_bit()*2.0-1.0;
+ d_index++;
+ if(d_index > d_length && d_repeat == false)
+ break;
}
return i;
diff --git a/gr-digital/lib/glfsr_source_f_impl.h b/gr-digital/lib/glfsr_source_f_impl.h
index 194e2ff3b9..b6ea966336 100644
--- a/gr-digital/lib/glfsr_source_f_impl.h
+++ b/gr-digital/lib/glfsr_source_f_impl.h
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2007,2012 Free Software Foundation, Inc.
+ * Copyright 2007,2012,2016 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -35,20 +35,20 @@ namespace gr {
glfsr *d_glfsr;
bool d_repeat;
- unsigned int d_index;
- unsigned int d_length;
+ uint32_t d_index;
+ uint32_t d_length;
public:
- glfsr_source_f_impl(int degree, bool repeat=true,
- int mask=0, int seed=1);
+ glfsr_source_f_impl(unsigned int degree, bool repeat=true,
+ uint32_t mask=0, uint32_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);
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
- unsigned int period() const { return d_length; }
- int mask() const;
+ uint32_t period() const { return d_length; }
+ uint32_t mask() const;
};
} /* namespace digital */
diff --git a/gr-digital/swig/digital_swig.i b/gr-digital/swig/digital_swig.i
index 8a38d65b82..37e2ff8991 100644
--- a/gr-digital/swig/digital_swig.i
+++ b/gr-digital/swig/digital_swig.i
@@ -37,6 +37,7 @@
%include <gnuradio/blocks/control_loop.h>
%{
+#include "gnuradio/digital/glfsr.h"
#include "gnuradio/digital/additive_scrambler_bb.h"
#include "gnuradio/digital/binary_slicer_fb.h"
#include "gnuradio/digital/burst_shaper_cc.h"
@@ -126,6 +127,7 @@
#include "gnuradio/digital/header_payload_demux.h"
%}
+%include "gnuradio/digital/glfsr.h"
%include "gnuradio/digital/additive_scrambler_bb.h"
%include "gnuradio/digital/binary_slicer_fb.h"
%include "gnuradio/digital/burst_shaper_cc.h"