summaryrefslogtreecommitdiff
path: root/gr-trellis/lib
diff options
context:
space:
mode:
authorAchilleas Anastasopoulos <anastas@umich.edu>2014-10-14 10:51:31 -0400
committerAchilleas Anastasopoulos <anastas@umich.edu>2014-10-15 19:01:05 -0400
commit79d55f173046d87ae31f04ad1e6dbafe1c9ae5ca (patch)
treec3efe8e25da8d13b99bb5cdf8b4234ef8cf54d07 /gr-trellis/lib
parentbe8e888f80934a884287f0ec9eb62dd0d2b7f5e5 (diff)
fixed a bug in pccc encoder/decoder, and added fsm files.
Also added locks in the set_ methods
Diffstat (limited to 'gr-trellis/lib')
-rw-r--r--gr-trellis/lib/core_algorithms.cc8
-rw-r--r--gr-trellis/lib/encoder_XX_impl.cc.t19
-rw-r--r--gr-trellis/lib/encoder_XX_impl.h.t12
-rw-r--r--gr-trellis/lib/metrics_X_impl.cc.t5
-rw-r--r--gr-trellis/lib/pccc_decoder_combined_XX_impl.cc.t2
-rw-r--r--gr-trellis/lib/pccc_encoder_XX_impl.cc.t2
-rw-r--r--gr-trellis/lib/permutation_impl.cc9
-rw-r--r--gr-trellis/lib/permutation_impl.h2
-rw-r--r--gr-trellis/lib/sccc_decoder_combined_XX_impl.cc.t2
-rw-r--r--gr-trellis/lib/siso_combined_f_impl.cc36
-rw-r--r--gr-trellis/lib/siso_combined_f_impl.h10
-rw-r--r--gr-trellis/lib/siso_f_impl.cc23
-rw-r--r--gr-trellis/lib/siso_f_impl.h6
-rw-r--r--gr-trellis/lib/viterbi_X_impl.cc.t17
-rw-r--r--gr-trellis/lib/viterbi_X_impl.h.t6
-rw-r--r--gr-trellis/lib/viterbi_combined_XX_impl.cc.t35
-rw-r--r--gr-trellis/lib/viterbi_combined_XX_impl.h.t10
17 files changed, 174 insertions, 30 deletions
diff --git a/gr-trellis/lib/core_algorithms.cc b/gr-trellis/lib/core_algorithms.cc
index eb32b65de7..b26ee331f2 100644
--- a/gr-trellis/lib/core_algorithms.cc
+++ b/gr-trellis/lib/core_algorithms.cc
@@ -1216,17 +1216,17 @@ namespace gr {
for(int k=0;k<blocklength;k++) {
//std::cout << k << std::endl;
for(int i=0;i<FSM1.O();i++) {
- float x=cprioro[k*FSM1.O()*FSM2.O()+i*FSM1.O()+0];
+ float x=cprioro[k*O+i*FSM2.O()+0];
for(int j=1;j<FSM2.O();j++)
- x = (*p2mymin)(x,cprioro[k*FSM1.O()*FSM2.O()+i*FSM1.O()+j]);
+ x = (*p2mymin)(x,cprioro[k*O+i*FSM2.O()+j]);
prioro1[k*FSM1.O()+i]=x;
//std::cout << prioro1[k*FSM1.O()+i] << ", ";
}
//std::cout << std::endl;
for(int i=0;i<FSM2.O();i++) {
- float x=cprioro[k*FSM1.O()*FSM2.O()+0*FSM1.O()+i];
+ float x=cprioro[k*O+0*FSM2.O()+i];
for(int j=1;j<FSM1.O();j++)
- x = (*p2mymin)(x,cprioro[k*FSM1.O()*FSM2.O()+j*FSM1.O()+i]);
+ x = (*p2mymin)(x,cprioro[k*O+j*FSM2.O()+i]);
prioro2[k*FSM2.O()+i]=x;
}
}
diff --git a/gr-trellis/lib/encoder_XX_impl.cc.t b/gr-trellis/lib/encoder_XX_impl.cc.t
index f2e19929ca..3a004a2f94 100644
--- a/gr-trellis/lib/encoder_XX_impl.cc.t
+++ b/gr-trellis/lib/encoder_XX_impl.cc.t
@@ -58,6 +58,24 @@ namespace gr {
{
}
+ void @IMPL_NAME@::set_FSM(const fsm &FSM)
+ {
+ gr::thread::scoped_lock guard(d_setlock);
+ d_FSM = FSM;
+ }
+
+ void @IMPL_NAME@::set_ST(int ST)
+ {
+ gr::thread::scoped_lock guard(d_setlock);
+ d_ST = ST;
+ }
+
+ void @IMPL_NAME@::set_K(int K)
+ {
+ gr::thread::scoped_lock guard(d_setlock);
+ d_K = K;
+ }
+
@IMPL_NAME@::~@IMPL_NAME@()
{
}
@@ -67,6 +85,7 @@ namespace gr {
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items)
{
+ gr::thread::scoped_lock guard(d_setlock);
int ST_tmp = 0;
if (d_B){ // blockwise operation
diff --git a/gr-trellis/lib/encoder_XX_impl.h.t b/gr-trellis/lib/encoder_XX_impl.h.t
index 69f853d9fe..2b0ff31f4d 100644
--- a/gr-trellis/lib/encoder_XX_impl.h.t
+++ b/gr-trellis/lib/encoder_XX_impl.h.t
@@ -43,12 +43,12 @@ namespace gr {
@IMPL_NAME@(const fsm &FSM, int ST, int K, bool B);
~@IMPL_NAME@();
- fsm FSM() { return d_FSM;; }
- int ST() { return d_ST; }
- int K() { return d_K; }
- void set_FSM(fsm &FSM) { d_FSM = FSM; }
- void set_ST(int ST) { d_ST = ST; }
- void set_K(int K) { d_K = K; }
+ fsm FSM() const { return d_FSM;; }
+ int ST() const { return d_ST; }
+ int K() const { return d_K; }
+ void set_FSM(const fsm &FSM);
+ void set_ST(int ST);
+ void set_K(int K);
int work(int noutput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items);
diff --git a/gr-trellis/lib/metrics_X_impl.cc.t b/gr-trellis/lib/metrics_X_impl.cc.t
index 2b811de16f..5e74e4b2fc 100644
--- a/gr-trellis/lib/metrics_X_impl.cc.t
+++ b/gr-trellis/lib/metrics_X_impl.cc.t
@@ -56,6 +56,7 @@ namespace gr {
void @IMPL_NAME@::set_O(int O)
{
+ gr::thread::scoped_lock guard(d_setlock);
d_O = O;
set_relative_rate (1.0 * d_O / ((double) d_D));
set_output_multiple ((int)d_O);
@@ -63,6 +64,7 @@ namespace gr {
void @IMPL_NAME@::set_D(int D)
{
+ gr::thread::scoped_lock guard(d_setlock);
d_D = D;
set_relative_rate (1.0 * d_O / ((double) d_D));
}
@@ -70,12 +72,14 @@ namespace gr {
void
@IMPL_NAME@::set_TYPE(digital::trellis_metric_type_t type)
{
+ gr::thread::scoped_lock guard(d_setlock);
d_TYPE = type;
}
void
@IMPL_NAME@::set_TABLE(const std::vector<@I_TYPE@> &table)
{
+ gr::thread::scoped_lock guard(d_setlock);
d_TABLE = table;
}
@@ -99,6 +103,7 @@ namespace gr {
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items)
{
+ gr::thread::scoped_lock guard(d_setlock);
int nstreams = input_items.size();
for(int m = 0; m < nstreams; m++) {
diff --git a/gr-trellis/lib/pccc_decoder_combined_XX_impl.cc.t b/gr-trellis/lib/pccc_decoder_combined_XX_impl.cc.t
index 15ea3ceecb..5b3cdeeb62 100644
--- a/gr-trellis/lib/pccc_decoder_combined_XX_impl.cc.t
+++ b/gr-trellis/lib/pccc_decoder_combined_XX_impl.cc.t
@@ -90,6 +90,7 @@ namespace gr {
void
@IMPL_NAME@::set_scaling(float scaling)
{
+ gr::thread::scoped_lock guard(d_setlock);
d_scaling = scaling;
}
@@ -109,6 +110,7 @@ namespace gr {
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items)
{
+ gr::thread::scoped_lock guard(d_setlock);
int nblocks = noutput_items / d_blocklength;
float (*p2min)(float, float) = NULL;
diff --git a/gr-trellis/lib/pccc_encoder_XX_impl.cc.t b/gr-trellis/lib/pccc_encoder_XX_impl.cc.t
index 119bff6ddb..8fd143ca9d 100644
--- a/gr-trellis/lib/pccc_encoder_XX_impl.cc.t
+++ b/gr-trellis/lib/pccc_encoder_XX_impl.cc.t
@@ -81,7 +81,7 @@ namespace gr {
ST1_tmp = (int) d_FSM1.NS()[ST1_tmp*d_FSM1.I()+in[i]];
int o2 = d_FSM2.OS()[ST2_tmp*d_FSM2.I()+in[k]];
ST2_tmp = (int) d_FSM2.NS()[ST2_tmp*d_FSM2.I()+in[k]];
- out[i] = (@O_TYPE@) (o1*d_FSM1.O() + o2);
+ out[i] = (@O_TYPE@) (o1*d_FSM2.O() + o2);
}
}
return noutput_items;
diff --git a/gr-trellis/lib/permutation_impl.cc b/gr-trellis/lib/permutation_impl.cc
index 0d9d3593bf..2fe0ea8cb8 100644
--- a/gr-trellis/lib/permutation_impl.cc
+++ b/gr-trellis/lib/permutation_impl.cc
@@ -55,12 +55,20 @@ namespace gr {
void permutation_impl::set_K(int K)
{
+ gr::thread::scoped_lock guard(d_setlock);
d_K=K;
set_output_multiple(d_K*d_SYMS_PER_BLOCK);
}
+ void permutation_impl::set_TABLE (const std::vector<int> &table)
+ {
+ gr::thread::scoped_lock guard(d_setlock);
+ d_TABLE = table;
+ }
+
void permutation_impl::set_SYMS_PER_BLOCK(int spb)
{
+ gr::thread::scoped_lock guard(d_setlock);
d_SYMS_PER_BLOCK=spb;
set_output_multiple(d_K*d_SYMS_PER_BLOCK);
}
@@ -74,6 +82,7 @@ namespace gr {
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items)
{
+ gr::thread::scoped_lock guard(d_setlock);
int nstreams = input_items.size();
for(int m=0;m<nstreams;m++) {
diff --git a/gr-trellis/lib/permutation_impl.h b/gr-trellis/lib/permutation_impl.h
index 5c74fba8fd..e013e52a20 100644
--- a/gr-trellis/lib/permutation_impl.h
+++ b/gr-trellis/lib/permutation_impl.h
@@ -48,7 +48,7 @@ namespace gr {
size_t BYTES_PER_SYMBOL() const { return d_BYTES_PER_SYMBOL; }
void set_K(int K) ;
- void set_TABLE (const std::vector<int> &table) {d_TABLE = table; }
+ void set_TABLE (const std::vector<int> &table);
void set_SYMS_PER_BLOCK(int spb) ;
int work(int noutput_items,
diff --git a/gr-trellis/lib/sccc_decoder_combined_XX_impl.cc.t b/gr-trellis/lib/sccc_decoder_combined_XX_impl.cc.t
index 4acc560175..f66b1f37e7 100644
--- a/gr-trellis/lib/sccc_decoder_combined_XX_impl.cc.t
+++ b/gr-trellis/lib/sccc_decoder_combined_XX_impl.cc.t
@@ -89,6 +89,7 @@ namespace gr {
void
@IMPL_NAME@::set_scaling(float scaling)
{
+ gr::thread::scoped_lock guard(d_setlock);
d_scaling = scaling;
}
@@ -108,6 +109,7 @@ namespace gr {
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items)
{
+ gr::thread::scoped_lock guard(d_setlock);
int nblocks = noutput_items / d_blocklength;
float (*p2min)(float, float) = NULL;
diff --git a/gr-trellis/lib/siso_combined_f_impl.cc b/gr-trellis/lib/siso_combined_f_impl.cc
index f9e8e28a9c..3b89684bf0 100644
--- a/gr-trellis/lib/siso_combined_f_impl.cc
+++ b/gr-trellis/lib/siso_combined_f_impl.cc
@@ -96,35 +96,68 @@ namespace gr {
void siso_combined_f_impl::set_FSM(const fsm &FSM)
{
+ gr::thread::scoped_lock guard(d_setlock);
d_FSM=FSM;
recalculate();
}
void siso_combined_f_impl::set_K(int K)
{
+ gr::thread::scoped_lock guard(d_setlock);
d_K=K;
recalculate();
}
void siso_combined_f_impl::set_POSTI(bool POSTI)
{
+ gr::thread::scoped_lock guard(d_setlock);
d_POSTI = POSTI;
recalculate();
}
void siso_combined_f_impl::set_POSTO(bool POSTO)
{
+ gr::thread::scoped_lock guard(d_setlock);
d_POSTO = POSTO;
recalculate();
}
void siso_combined_f_impl::set_D(int D)
{
+ gr::thread::scoped_lock guard(d_setlock);
d_D=D;
recalculate();
}
-
+ void siso_combined_f_impl::set_S0(int S0)
+ {
+ gr::thread::scoped_lock guard(d_setlock);
+ d_S0 = S0;
+ }
+
+ void siso_combined_f_impl::set_SK(int SK)
+ {
+ gr::thread::scoped_lock guard(d_setlock);
+ d_SK = SK;
+ }
+
+ void siso_combined_f_impl::set_SISO_TYPE(trellis::siso_type_t type)
+ {
+ gr::thread::scoped_lock guard(d_setlock);
+ d_SISO_TYPE = type;
+ }
+
+ void siso_combined_f_impl::set_TABLE(const std::vector<float> &table)
+ {
+ gr::thread::scoped_lock guard(d_setlock);
+ d_TABLE = table;
+ }
+
+ void siso_combined_f_impl::set_TYPE(digital::trellis_metric_type_t type)
+ {
+ gr::thread::scoped_lock guard(d_setlock);
+ d_TYPE = type;
+ }
siso_combined_f_impl::~siso_combined_f_impl()
{
@@ -163,6 +196,7 @@ namespace gr {
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items)
{
+ gr::thread::scoped_lock guard(d_setlock);
int nstreams = output_items.size();
//printf("general_work:Streams: %d\n",nstreams);
diff --git a/gr-trellis/lib/siso_combined_f_impl.h b/gr-trellis/lib/siso_combined_f_impl.h
index 9457637259..93e9aa87d2 100644
--- a/gr-trellis/lib/siso_combined_f_impl.h
+++ b/gr-trellis/lib/siso_combined_f_impl.h
@@ -67,14 +67,14 @@ namespace gr {
void set_FSM(const fsm &FSM);
void set_K(int K);
- void set_S0(int S0){ d_S0 = S0; }
- void set_SK(int SK){ d_SK = SK; }
+ void set_S0(int S0);
+ void set_SK(int SK);
void set_POSTI(bool POSTI);
void set_POSTO(bool POSTO);
- void set_SISO_TYPE(trellis::siso_type_t type) { d_SISO_TYPE = type; }
+ void set_SISO_TYPE(trellis::siso_type_t type);
void set_D(int D);
- void set_TABLE(const std::vector<float> &table){ d_TABLE = table; }
- void set_TYPE(digital::trellis_metric_type_t type){ d_TYPE = type; }
+ void set_TABLE(const std::vector<float> &table);
+ void set_TYPE(digital::trellis_metric_type_t type);
void forecast(int noutput_items,
gr_vector_int &ninput_items_required);
diff --git a/gr-trellis/lib/siso_f_impl.cc b/gr-trellis/lib/siso_f_impl.cc
index a1c7ab3320..2af5a21710 100644
--- a/gr-trellis/lib/siso_f_impl.cc
+++ b/gr-trellis/lib/siso_f_impl.cc
@@ -91,28 +91,50 @@ namespace gr {
void siso_f_impl::set_FSM(const fsm &FSM)
{
+ gr::thread::scoped_lock guard(d_setlock);
d_FSM=FSM;
recalculate();
}
void siso_f_impl::set_K(int K)
{
+ gr::thread::scoped_lock guard(d_setlock);
d_K=K;
recalculate();
}
void siso_f_impl::set_POSTI(bool POSTI)
{
+ gr::thread::scoped_lock guard(d_setlock);
d_POSTI = POSTI;
recalculate();
}
void siso_f_impl::set_POSTO(bool POSTO)
{
+ gr::thread::scoped_lock guard(d_setlock);
d_POSTO = POSTO;
recalculate();
}
+ void siso_f_impl::set_S0(int S0)
+ {
+ gr::thread::scoped_lock guard(d_setlock);
+ d_S0 = S0;
+ }
+
+ void siso_f_impl::set_SK(int SK)
+ {
+ gr::thread::scoped_lock guard(d_setlock);
+ d_SK = SK;
+ }
+
+ void siso_f_impl::set_SISO_TYPE(trellis::siso_type_t type)
+ {
+ gr::thread::scoped_lock guard(d_setlock);
+ d_SISO_TYPE = type;
+ }
+
siso_f_impl::~siso_f_impl()
{
}
@@ -148,6 +170,7 @@ namespace gr {
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items)
{
+ gr::thread::scoped_lock guard(d_setlock);
int nstreams = output_items.size();
//printf("general_work:Streams: %d\n",nstreams);
int multiple;
diff --git a/gr-trellis/lib/siso_f_impl.h b/gr-trellis/lib/siso_f_impl.h
index c8c9e1ae41..f92616bf0a 100644
--- a/gr-trellis/lib/siso_f_impl.h
+++ b/gr-trellis/lib/siso_f_impl.h
@@ -63,11 +63,11 @@ namespace gr {
void set_FSM(const fsm &FSM);
void set_K(int K);
- void set_S0(int S0){ d_S0 = S0; }
- void set_SK(int SK){ d_SK = SK; }
+ void set_S0(int S0);
+ void set_SK(int SK);
void set_POSTI(bool POSTI);
void set_POSTO(bool POSTO);
- void set_SISO_TYPE(trellis::siso_type_t type) { d_SISO_TYPE = type; }
+ void set_SISO_TYPE(trellis::siso_type_t type);
void forecast(int noutput_items,
gr_vector_int &ninput_items_required);
diff --git a/gr-trellis/lib/viterbi_X_impl.cc.t b/gr-trellis/lib/viterbi_X_impl.cc.t
index bd5bdd8413..1d4864596e 100644
--- a/gr-trellis/lib/viterbi_X_impl.cc.t
+++ b/gr-trellis/lib/viterbi_X_impl.cc.t
@@ -55,18 +55,32 @@ namespace gr {
set_output_multiple(d_K);
}
- void @IMPL_NAME@::set_FSM(fsm &FSM)
+ void @IMPL_NAME@::set_FSM(const fsm &FSM)
{
+ gr::thread::scoped_lock guard(d_setlock);
d_FSM = FSM;
set_relative_rate(1.0 / ((double)d_FSM.O()));
}
void @IMPL_NAME@::set_K(int K)
{
+ gr::thread::scoped_lock guard(d_setlock);
d_K = K;
set_output_multiple(d_K);
}
+ void @IMPL_NAME@::set_S0(int S0)
+ {
+ gr::thread::scoped_lock guard(d_setlock);
+ d_S0 = S0;
+ }
+
+ void @IMPL_NAME@::set_SK(int SK)
+ {
+ gr::thread::scoped_lock guard(d_setlock);
+ d_SK = SK;
+ }
+
@IMPL_NAME@::~@IMPL_NAME@()
{
}
@@ -88,6 +102,7 @@ namespace gr {
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items)
{
+ gr::thread::scoped_lock guard(d_setlock);
int nstreams = input_items.size();
int nblocks = noutput_items / d_K;
diff --git a/gr-trellis/lib/viterbi_X_impl.h.t b/gr-trellis/lib/viterbi_X_impl.h.t
index 44934a5e22..1479ad5a3f 100644
--- a/gr-trellis/lib/viterbi_X_impl.h.t
+++ b/gr-trellis/lib/viterbi_X_impl.h.t
@@ -49,10 +49,10 @@ namespace gr {
int S0() const { return d_S0; }
int SK() const { return d_SK; }
- void set_FSM(fsm &FSM);
+ void set_FSM(const fsm &FSM);
void set_K(int K);
- void set_S0(int S0) { d_S0 = S0; }
- void set_SK(int SK) { d_SK = SK; }
+ void set_S0(int S0);
+ void set_SK(int SK);
//std::vector<int> trace () const { return d_trace; }
void forecast(int noutput_items,
diff --git a/gr-trellis/lib/viterbi_combined_XX_impl.cc.t b/gr-trellis/lib/viterbi_combined_XX_impl.cc.t
index 91bb4e6c34..722708bcd2 100644
--- a/gr-trellis/lib/viterbi_combined_XX_impl.cc.t
+++ b/gr-trellis/lib/viterbi_combined_XX_impl.cc.t
@@ -63,6 +63,7 @@ namespace gr {
void
@IMPL_NAME@::set_K(int K)
{
+ gr::thread::scoped_lock guard(d_setlock);
d_K = K;
set_output_multiple(d_K);
}
@@ -70,9 +71,42 @@ namespace gr {
void
@IMPL_NAME@::set_D(int D)
{
+ gr::thread::scoped_lock guard(d_setlock);
d_D = D;
set_relative_rate(1.0 / ((double)d_D));
}
+
+ void @IMPL_NAME@::set_FSM(const fsm &FSM)
+ {
+ gr::thread::scoped_lock guard(d_setlock);
+ d_FSM = FSM;
+ }
+
+ void @IMPL_NAME@::set_S0(int S0)
+ {
+ gr::thread::scoped_lock guard(d_setlock);
+ d_S0 = S0;
+ }
+
+ void @IMPL_NAME@::set_SK(int SK)
+ {
+ gr::thread::scoped_lock guard(d_setlock);
+ d_SK = SK;
+ }
+
+ void
+ @IMPL_NAME@::set_TYPE(digital::trellis_metric_type_t type)
+ {
+ gr::thread::scoped_lock guard(d_setlock);
+ d_TYPE = type;
+ }
+
+ void
+ @IMPL_NAME@::set_TABLE(const std::vector<@I_TYPE@> &table)
+ {
+ gr::thread::scoped_lock guard(d_setlock);
+ d_TABLE = table;
+ }
@IMPL_NAME@::~@IMPL_NAME@()
{
@@ -95,6 +129,7 @@ namespace gr {
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items)
{
+ gr::thread::scoped_lock guard(d_setlock);
int nstreams = input_items.size();
int nblocks = noutput_items / d_K;
diff --git a/gr-trellis/lib/viterbi_combined_XX_impl.h.t b/gr-trellis/lib/viterbi_combined_XX_impl.h.t
index 7098d8b329..788e609895 100644
--- a/gr-trellis/lib/viterbi_combined_XX_impl.h.t
+++ b/gr-trellis/lib/viterbi_combined_XX_impl.h.t
@@ -58,13 +58,13 @@ namespace gr {
digital::trellis_metric_type_t TYPE() const { return d_TYPE; }
//std::vector<int> trace() const { return d_trace; }
- void set_FSM(const fsm &FSM){ d_FSM = FSM; }
+ void set_FSM(const fsm &FSM);
void set_K(int K);
- void set_S0(int S0){ d_S0 = S0; }
- void set_SK(int SK){ d_SK = SK; }
+ void set_S0(int S0);
+ void set_SK(int SK);
void set_D(int D);
- void set_TABLE(const std::vector<@I_TYPE@> &table) { d_TABLE = table; }
- void set_TYPE(digital::trellis_metric_type_t type) { d_TYPE = type; }
+ void set_TABLE(const std::vector<@I_TYPE@> &table);
+ void set_TYPE(digital::trellis_metric_type_t type);
void forecast(int noutput_items,
gr_vector_int &ninput_items_required);