From 8f6be2790220af5b4628de7daee3be4b494e3b3e Mon Sep 17 00:00:00 2001
From: Achilleas Anastasopoulos
Date: Wed, 31 Aug 2011 19:35:58 -0400
Subject: Added SCCC encoder/decoder grc blocksi and examples. Also moved all
 grc blocks related to trellis inside the gr-trellis/grc directory

---
 gr-trellis/src/lib/trellis_permutation.cc | 18 +++++++++---------
 gr-trellis/src/lib/trellis_permutation.h  |  8 ++++----
 gr-trellis/src/lib/trellis_permutation.i  |  8 ++++----
 3 files changed, 17 insertions(+), 17 deletions(-)

(limited to 'gr-trellis/src')

diff --git a/gr-trellis/src/lib/trellis_permutation.cc b/gr-trellis/src/lib/trellis_permutation.cc
index a32390742..416fc58ec 100644
--- a/gr-trellis/src/lib/trellis_permutation.cc
+++ b/gr-trellis/src/lib/trellis_permutation.cc
@@ -30,19 +30,19 @@
 #include <string.h>
 
 trellis_permutation_sptr 
-trellis_make_permutation (int K, const std::vector<int> &TABLE, int SYMS_PER_BLOCK, size_t NBYTES_INOUT)
+trellis_make_permutation (int K, const std::vector<int> &TABLE, int SYMS_PER_BLOCK, size_t BYTES_PER_SYMBOL)
 {
-  return gnuradio::get_initial_sptr(new trellis_permutation (K,TABLE,SYMS_PER_BLOCK,NBYTES_INOUT));
+  return gnuradio::get_initial_sptr(new trellis_permutation (K,TABLE,SYMS_PER_BLOCK,BYTES_PER_SYMBOL));
 }
 
-trellis_permutation::trellis_permutation (int K, const std::vector<int> &TABLE, int SYMS_PER_BLOCK, size_t NBYTES_INOUT)
+trellis_permutation::trellis_permutation (int K, const std::vector<int> &TABLE, int SYMS_PER_BLOCK, size_t BYTES_PER_SYMBOL)
   : gr_sync_block ("permutation",
-		   gr_make_io_signature (1, -1, NBYTES_INOUT),
-		   gr_make_io_signature (1, -1, NBYTES_INOUT)),
+		   gr_make_io_signature (1, -1, BYTES_PER_SYMBOL),
+		   gr_make_io_signature (1, -1, BYTES_PER_SYMBOL)),
     d_K (K),
     d_TABLE (TABLE),
     d_SYMS_PER_BLOCK (SYMS_PER_BLOCK),
-    d_NBYTES_INOUT (NBYTES_INOUT)
+    d_BYTES_PER_SYMBOL (BYTES_PER_SYMBOL)
 {
     set_output_multiple (d_K*SYMS_PER_BLOCK);
     //std::cout << d_K << "\n";
@@ -72,9 +72,9 @@ trellis_permutation::work (int noutput_items,
       int j0 = i%d_K;
       // new position of block within packet (in blocks)
       int k0 = d_TABLE[j0];
-      memcpy(&(out[i*d_SYMS_PER_BLOCK*d_NBYTES_INOUT]), 
-             &(in[(i0+k0)*d_SYMS_PER_BLOCK*d_NBYTES_INOUT]), 
-             d_NBYTES_INOUT*d_SYMS_PER_BLOCK);
+      memcpy(&(out[i*d_SYMS_PER_BLOCK*d_BYTES_PER_SYMBOL]), 
+             &(in[(i0+k0)*d_SYMS_PER_BLOCK*d_BYTES_PER_SYMBOL]), 
+             d_BYTES_PER_SYMBOL*d_SYMS_PER_BLOCK);
     }
     // end per stream processing
   }
diff --git a/gr-trellis/src/lib/trellis_permutation.h b/gr-trellis/src/lib/trellis_permutation.h
index 5505caf89..a5c858a8b 100644
--- a/gr-trellis/src/lib/trellis_permutation.h
+++ b/gr-trellis/src/lib/trellis_permutation.h
@@ -30,7 +30,7 @@
 class trellis_permutation;
 typedef boost::shared_ptr<trellis_permutation> trellis_permutation_sptr;
 
-trellis_permutation_sptr trellis_make_permutation (int K, const std::vector<int> &TABLE, int SYMS_PER_BLOCK, size_t NBYTES_INOUT);
+trellis_permutation_sptr trellis_make_permutation (int K, const std::vector<int> &TABLE, int SYMS_PER_BLOCK, size_t BYTES_PER_SYMBOL);
 
 /*!
  * \brief Permutation.
@@ -39,18 +39,18 @@ trellis_permutation_sptr trellis_make_permutation (int K, const std::vector<int>
 class trellis_permutation : public gr_sync_block
 {
 private:
-  friend trellis_permutation_sptr trellis_make_permutation (int K, const std::vector<int> &TABLE, int SYMS_PER_BLOCK, size_t NBYTES_INOUT);
+  friend trellis_permutation_sptr trellis_make_permutation (int K, const std::vector<int> &TABLE, int SYMS_PER_BLOCK, size_t BYTES_PER_SYMBOL);
   int d_K;
   std::vector<int> d_TABLE;
   int d_SYMS_PER_BLOCK;
-  size_t d_NBYTES_INOUT;
+  size_t d_BYTES_PER_SYMBOL;
   trellis_permutation (int K, const std::vector<int> &TABLE, int SYMS_PER_BLOCK, size_t NBYTES); 
 
 public:
   int K () const { return d_K; }
   const std::vector<int> & TABLE () const { return d_TABLE; }
   int SYMS_PER_BLOCK () const { return d_SYMS_PER_BLOCK; }
-  size_t NBYTES_INOUT () const { return d_NBYTES_INOUT; }
+  size_t BYTES_PER_SYMBOL () const { return d_BYTES_PER_SYMBOL; }
 
   int work (int noutput_items,
 	    gr_vector_const_void_star &input_items,
diff --git a/gr-trellis/src/lib/trellis_permutation.i b/gr-trellis/src/lib/trellis_permutation.i
index 834a36986..1433a6584 100644
--- a/gr-trellis/src/lib/trellis_permutation.i
+++ b/gr-trellis/src/lib/trellis_permutation.i
@@ -22,7 +22,7 @@
 
 GR_SWIG_BLOCK_MAGIC(trellis,permutation);
 
-trellis_permutation_sptr trellis_make_permutation (int K, const std::vector<int> &TABLE, int SYMS_PER_BLOCK, size_t NBYTES_INOUT);
+trellis_permutation_sptr trellis_make_permutation (int K, const std::vector<int> &TABLE, int SYMS_PER_BLOCK, size_t BYTES_PER_SYMBOL);
 
 class trellis_permutation : public gr_sync_block
 {
@@ -30,12 +30,12 @@ private:
   int d_K;
   std::vector<int> d_TABLE;
   int d_SYMS_PER_BLOCK;
-  size_t d_NBYTES_INOUT;
-  trellis_permutation (int K, const std::vector<int> &TABLE, int SYMS_PER_BLOCK, size_t NBYTES_INOUT); 
+  size_t d_BYTES_PER_SYMBOL;
+  trellis_permutation (int K, const std::vector<int> &TABLE, int SYMS_PER_BLOCK, size_t BYTES_PER_SYMBOL); 
 
 public:
   int K () const { return d_K; }
   const std::vector<int> & TABLE () const { return d_TABLE; }
   int SYMS_PER_BLOCK () const { return d_SYMS_PER_BLOCK; }
-  size_t NBYTES_INOUT () const { return d_NBYTES_INOUT; }
+  size_t BYTES_PER_SYMBOL () const { return d_BYTES_PER_SYMBOL; }
 };
-- 
cgit 


From ceb1aae53c56e64cb7f3ad7c1ae42a6d68d909ef Mon Sep 17 00:00:00 2001
From: Achilleas Anastasopoulos
Date: Wed, 31 Aug 2011 23:01:56 -0400
Subject: Added pccc combined turbo decoder and corresponding GRC block

---
 gr-trellis/src/lib/Makefile.am                     |  23 +-
 gr-trellis/src/lib/Makefile.gen                    |  18 ++
 gr-trellis/src/lib/core_algorithms.cc              | 246 +++++++++++++++++++--
 gr-trellis/src/lib/core_algorithms.h               |  36 ++-
 gr-trellis/src/lib/generate_trellis.py             |   6 +-
 .../src/lib/trellis_pccc_decoder_combined_XX.cc.t  | 147 ++++++++++++
 .../src/lib/trellis_pccc_decoder_combined_XX.h.t   | 124 +++++++++++
 .../src/lib/trellis_pccc_decoder_combined_XX.i.t   |  73 ++++++
 .../src/lib/trellis_pccc_decoder_combined_cb.cc    | 147 ++++++++++++
 .../src/lib/trellis_pccc_decoder_combined_cb.h     | 124 +++++++++++
 .../src/lib/trellis_pccc_decoder_combined_cb.i     |  73 ++++++
 .../src/lib/trellis_pccc_decoder_combined_ci.cc    | 147 ++++++++++++
 .../src/lib/trellis_pccc_decoder_combined_ci.h     | 124 +++++++++++
 .../src/lib/trellis_pccc_decoder_combined_ci.i     |  73 ++++++
 .../src/lib/trellis_pccc_decoder_combined_cs.cc    | 147 ++++++++++++
 .../src/lib/trellis_pccc_decoder_combined_cs.h     | 124 +++++++++++
 .../src/lib/trellis_pccc_decoder_combined_cs.i     |  73 ++++++
 .../src/lib/trellis_pccc_decoder_combined_fb.cc    | 147 ++++++++++++
 .../src/lib/trellis_pccc_decoder_combined_fb.h     | 124 +++++++++++
 .../src/lib/trellis_pccc_decoder_combined_fb.i     |  73 ++++++
 .../src/lib/trellis_pccc_decoder_combined_fi.cc    | 147 ++++++++++++
 .../src/lib/trellis_pccc_decoder_combined_fi.h     | 124 +++++++++++
 .../src/lib/trellis_pccc_decoder_combined_fi.i     |  73 ++++++
 .../src/lib/trellis_pccc_decoder_combined_fs.cc    | 147 ++++++++++++
 .../src/lib/trellis_pccc_decoder_combined_fs.h     | 124 +++++++++++
 .../src/lib/trellis_pccc_decoder_combined_fs.i     |  73 ++++++
 26 files changed, 2689 insertions(+), 48 deletions(-)
 create mode 100644 gr-trellis/src/lib/trellis_pccc_decoder_combined_XX.cc.t
 create mode 100644 gr-trellis/src/lib/trellis_pccc_decoder_combined_XX.h.t
 create mode 100644 gr-trellis/src/lib/trellis_pccc_decoder_combined_XX.i.t
 create mode 100644 gr-trellis/src/lib/trellis_pccc_decoder_combined_cb.cc
 create mode 100644 gr-trellis/src/lib/trellis_pccc_decoder_combined_cb.h
 create mode 100644 gr-trellis/src/lib/trellis_pccc_decoder_combined_cb.i
 create mode 100644 gr-trellis/src/lib/trellis_pccc_decoder_combined_ci.cc
 create mode 100644 gr-trellis/src/lib/trellis_pccc_decoder_combined_ci.h
 create mode 100644 gr-trellis/src/lib/trellis_pccc_decoder_combined_ci.i
 create mode 100644 gr-trellis/src/lib/trellis_pccc_decoder_combined_cs.cc
 create mode 100644 gr-trellis/src/lib/trellis_pccc_decoder_combined_cs.h
 create mode 100644 gr-trellis/src/lib/trellis_pccc_decoder_combined_cs.i
 create mode 100644 gr-trellis/src/lib/trellis_pccc_decoder_combined_fb.cc
 create mode 100644 gr-trellis/src/lib/trellis_pccc_decoder_combined_fb.h
 create mode 100644 gr-trellis/src/lib/trellis_pccc_decoder_combined_fb.i
 create mode 100644 gr-trellis/src/lib/trellis_pccc_decoder_combined_fi.cc
 create mode 100644 gr-trellis/src/lib/trellis_pccc_decoder_combined_fi.h
 create mode 100644 gr-trellis/src/lib/trellis_pccc_decoder_combined_fi.i
 create mode 100644 gr-trellis/src/lib/trellis_pccc_decoder_combined_fs.cc
 create mode 100644 gr-trellis/src/lib/trellis_pccc_decoder_combined_fs.h
 create mode 100644 gr-trellis/src/lib/trellis_pccc_decoder_combined_fs.i

(limited to 'gr-trellis/src')

diff --git a/gr-trellis/src/lib/Makefile.am b/gr-trellis/src/lib/Makefile.am
index ae7f21f56..8f703c92a 100644
--- a/gr-trellis/src/lib/Makefile.am
+++ b/gr-trellis/src/lib/Makefile.am
@@ -40,12 +40,12 @@ core_generator = 				\
 	trellis_encoder_XX.cc.t			\
 	trellis_encoder_XX.h.t			\
 	trellis_encoder_XX.i.t			\
-	trellis_sccc_encoder_XX.cc.t			\
-	trellis_sccc_encoder_XX.h.t			\
-	trellis_sccc_encoder_XX.i.t			\
-	trellis_pccc_encoder_XX.cc.t			\
-	trellis_pccc_encoder_XX.h.t			\
-	trellis_pccc_encoder_XX.i.t			\
+	trellis_sccc_encoder_XX.cc.t		\
+	trellis_sccc_encoder_XX.h.t		\
+	trellis_sccc_encoder_XX.i.t		\
+	trellis_pccc_encoder_XX.cc.t		\
+	trellis_pccc_encoder_XX.h.t		\
+	trellis_pccc_encoder_XX.i.t		\
 	trellis_metrics_X.cc.t			\
 	trellis_metrics_X.h.t			\
 	trellis_metrics_X.i.t			\
@@ -53,14 +53,17 @@ core_generator = 				\
 	trellis_viterbi_combined_XX.h.t		\
 	trellis_viterbi_combined_XX.i.t		\
 	trellis_sccc_decoder_combined_XX.cc.t	\
-	trellis_sccc_decoder_combined_XX.h.t		\
-	trellis_sccc_decoder_combined_XX.i.t		\
-	trellis_sccc_decoder_X.cc.t	\
+	trellis_sccc_decoder_combined_XX.h.t	\
+	trellis_sccc_decoder_combined_XX.i.t	\
+	trellis_sccc_decoder_X.cc.t		\
 	trellis_sccc_decoder_X.h.t		\
 	trellis_sccc_decoder_X.i.t		\
-	trellis_pccc_decoder_X.cc.t	\
+	trellis_pccc_decoder_X.cc.t		\
 	trellis_pccc_decoder_X.h.t		\
 	trellis_pccc_decoder_X.i.t		\
+	trellis_pccc_decoder_combined_XX.cc.t	\
+	trellis_pccc_decoder_combined_XX.h.t	\
+	trellis_pccc_decoder_combined_XX.i.t	\
 	trellis_viterbi_X.cc.t			\
 	trellis_viterbi_X.h.t			\
 	trellis_viterbi_X.i.t
diff --git a/gr-trellis/src/lib/Makefile.gen b/gr-trellis/src/lib/Makefile.gen
index 534a7466e..b9b9afb1f 100644
--- a/gr-trellis/src/lib/Makefile.gen
+++ b/gr-trellis/src/lib/Makefile.gen
@@ -13,6 +13,12 @@ GENERATED_H = \
 	trellis_metrics_i.h \
 	trellis_metrics_s.h \
 	trellis_pccc_decoder_b.h \
+	trellis_pccc_decoder_combined_cb.h \
+	trellis_pccc_decoder_combined_ci.h \
+	trellis_pccc_decoder_combined_cs.h \
+	trellis_pccc_decoder_combined_fb.h \
+	trellis_pccc_decoder_combined_fi.h \
+	trellis_pccc_decoder_combined_fs.h \
 	trellis_pccc_decoder_i.h \
 	trellis_pccc_decoder_s.h \
 	trellis_pccc_encoder_bb.h \
@@ -64,6 +70,12 @@ GENERATED_I = \
 	trellis_metrics_i.i \
 	trellis_metrics_s.i \
 	trellis_pccc_decoder_b.i \
+	trellis_pccc_decoder_combined_cb.i \
+	trellis_pccc_decoder_combined_ci.i \
+	trellis_pccc_decoder_combined_cs.i \
+	trellis_pccc_decoder_combined_fb.i \
+	trellis_pccc_decoder_combined_fi.i \
+	trellis_pccc_decoder_combined_fs.i \
 	trellis_pccc_decoder_i.i \
 	trellis_pccc_decoder_s.i \
 	trellis_pccc_encoder_bb.i \
@@ -115,6 +127,12 @@ GENERATED_CC = \
 	trellis_metrics_i.cc \
 	trellis_metrics_s.cc \
 	trellis_pccc_decoder_b.cc \
+	trellis_pccc_decoder_combined_cb.cc \
+	trellis_pccc_decoder_combined_ci.cc \
+	trellis_pccc_decoder_combined_cs.cc \
+	trellis_pccc_decoder_combined_fb.cc \
+	trellis_pccc_decoder_combined_fi.cc \
+	trellis_pccc_decoder_combined_fs.cc \
 	trellis_pccc_decoder_i.cc \
 	trellis_pccc_decoder_s.cc \
 	trellis_pccc_encoder_bb.cc \
diff --git a/gr-trellis/src/lib/core_algorithms.cc b/gr-trellis/src/lib/core_algorithms.cc
index 91ac8fbdf..54193c818 100644
--- a/gr-trellis/src/lib/core_algorithms.cc
+++ b/gr-trellis/src/lib/core_algorithms.cc
@@ -784,7 +784,7 @@ template<class Ti, class To>
 void sccc_decoder_combined(
       const fsm &FSMo, int STo0, int SToK,
       const fsm &FSMi, int STi0, int STiK,
-      const interleaver &INTERLEAVER, int blocklength, int repetitions,
+      const interleaver &INTERLEAVER, int blocklength, int iterations,
       float (*p2mymin)(float,float),
       int D, const std::vector<Ti> &TABLE,
       trellis_metric_type_t METRIC_TYPE,
@@ -810,7 +810,7 @@ for(int k=0;k<blocklength;k++) {
   iprioro[k*FSMi.O()] *= scaling;
 }
 
-for(int rep=0;rep<repetitions;rep++) {
+for(int rep=0;rep<iterations;rep++) {
   // run inner SISO
   siso_algorithm(FSMi.I(),FSMi.S(),FSMi.O(),
              FSMi.NS(), FSMi.OS(), FSMi.PS(), FSMi.PI(),
@@ -832,7 +832,7 @@ for(int rep=0;rep<repetitions;rep++) {
 
   // run outer SISO
 
-  if(rep<repetitions-1) { // do not produce posti
+  if(rep<iterations-1) { // do not produce posti
     siso_algorithm(FSMo.I(),FSMo.S(),FSMo.O(),
              FSMo.NS(), FSMo.OS(), FSMo.PS(), FSMo.PI(),
              blocklength,
@@ -897,7 +897,7 @@ template
 void sccc_decoder_combined<float,unsigned char>(
       const fsm &FSMo, int STo0, int SToK,
       const fsm &FSMi, int STi0, int STiK,
-      const interleaver &INTERLEAVER, int blocklength, int repetitions,
+      const interleaver &INTERLEAVER, int blocklength, int iterations,
       float (*p2mymin)(float,float),
       int D, const std::vector<float> &TABLE,
       trellis_metric_type_t METRIC_TYPE,
@@ -909,7 +909,7 @@ template
 void sccc_decoder_combined<float,short>(
       const fsm &FSMo, int STo0, int SToK,
       const fsm &FSMi, int STi0, int STiK,
-      const interleaver &INTERLEAVER, int blocklength, int repetitions,
+      const interleaver &INTERLEAVER, int blocklength, int iterations,
       float (*p2mymin)(float,float),
       int D, const std::vector<float> &TABLE,
       trellis_metric_type_t METRIC_TYPE,
@@ -921,7 +921,7 @@ template
 void sccc_decoder_combined<float,int>(
       const fsm &FSMo, int STo0, int SToK,
       const fsm &FSMi, int STi0, int STiK,
-      const interleaver &INTERLEAVER, int blocklength, int repetitions,
+      const interleaver &INTERLEAVER, int blocklength, int iterations,
       float (*p2mymin)(float,float),
       int D, const std::vector<float> &TABLE,
       trellis_metric_type_t METRIC_TYPE,
@@ -933,7 +933,7 @@ template
 void sccc_decoder_combined<gr_complex,unsigned char>(
       const fsm &FSMo, int STo0, int SToK,
       const fsm &FSMi, int STi0, int STiK,
-      const interleaver &INTERLEAVER, int blocklength, int repetitions,
+      const interleaver &INTERLEAVER, int blocklength, int iterations,
       float (*p2mymin)(float,float),
       int D, const std::vector<gr_complex> &TABLE,
       trellis_metric_type_t METRIC_TYPE,
@@ -945,7 +945,7 @@ template
 void sccc_decoder_combined<gr_complex,short>(
       const fsm &FSMo, int STo0, int SToK,
       const fsm &FSMi, int STi0, int STiK,
-      const interleaver &INTERLEAVER, int blocklength, int repetitions,
+      const interleaver &INTERLEAVER, int blocklength, int iterations,
       float (*p2mymin)(float,float),
       int D, const std::vector<gr_complex> &TABLE,
       trellis_metric_type_t METRIC_TYPE,
@@ -957,7 +957,7 @@ template
 void sccc_decoder_combined<gr_complex,int>(
       const fsm &FSMo, int STo0, int SToK,
       const fsm &FSMi, int STi0, int STiK,
-      const interleaver &INTERLEAVER, int blocklength, int repetitions,
+      const interleaver &INTERLEAVER, int blocklength, int iterations,
       float (*p2mymin)(float,float),
       int D, const std::vector<gr_complex> &TABLE,
       trellis_metric_type_t METRIC_TYPE,
@@ -973,7 +973,7 @@ template<class T>
 void sccc_decoder(
       const fsm &FSMo, int STo0, int SToK,
       const fsm &FSMi, int STi0, int STiK,
-      const interleaver &INTERLEAVER, int blocklength, int repetitions,
+      const interleaver &INTERLEAVER, int blocklength, int iterations,
       float (*p2mymin)(float,float),
       const float *iprioro, T *data
 )
@@ -988,7 +988,7 @@ void sccc_decoder(
   std::vector<float> oposti(blocklength*FSMo.I());
   std::vector<float> oposto(blocklength*FSMo.O());
 
-  for(int rep=0;rep<repetitions;rep++) {
+  for(int rep=0;rep<iterations;rep++) {
     // run inner SISO
     siso_algorithm(FSMi.I(),FSMi.S(),FSMi.O(),
              FSMi.NS(), FSMi.OS(), FSMi.PS(), FSMi.PI(),
@@ -1010,7 +1010,7 @@ void sccc_decoder(
 
     // run outer SISO
 
-    if(rep<repetitions-1) { // do not produce posti
+    if(rep<iterations-1) { // do not produce posti
       siso_algorithm(FSMo.I(),FSMo.S(),FSMo.O(),
              FSMo.NS(), FSMo.OS(), FSMo.PS(), FSMo.PI(),
              blocklength,
@@ -1050,7 +1050,7 @@ void sccc_decoder(
       */
     }
 
-  } // end repetitions
+  } // end iterations
 
   // generate hard decisions
   for(int k=0;k<blocklength;k++) {
@@ -1075,7 +1075,7 @@ template
 void sccc_decoder<unsigned char>(
       const fsm &FSMo, int STo0, int SToK,
       const fsm &FSMi, int STi0, int STiK,
-      const interleaver &INTERLEAVER, int blocklength, int repetitions,
+      const interleaver &INTERLEAVER, int blocklength, int iterations,
       float (*p2mymin)(float,float),
       const float *iprioro, unsigned char *data
 );
@@ -1084,7 +1084,7 @@ template
 void sccc_decoder<short>(
       const fsm &FSMo, int STo0, int SToK,
       const fsm &FSMi, int STi0, int STiK,
-      const interleaver &INTERLEAVER, int blocklength, int repetitions,
+      const interleaver &INTERLEAVER, int blocklength, int iterations,
       float (*p2mymin)(float,float),
       const float *iprioro, short *data
 );
@@ -1093,7 +1093,7 @@ template
 void sccc_decoder<int>(
       const fsm &FSMo, int STo0, int SToK,
       const fsm &FSMi, int STi0, int STiK,
-      const interleaver &INTERLEAVER, int blocklength, int repetitions,
+      const interleaver &INTERLEAVER, int blocklength, int iterations,
       float (*p2mymin)(float,float),
       const float *iprioro, int *data
 );
@@ -1105,7 +1105,7 @@ template<class T>
 void pccc_decoder(
       const fsm &FSM1, int ST10, int ST1K,
       const fsm &FSM2, int ST20, int ST2K,
-      const interleaver &INTERLEAVER, int blocklength, int repetitions,
+      const interleaver &INTERLEAVER, int blocklength, int iterations,
       float (*p2mymin)(float,float),
       const float *cprioro, T *data
 )
@@ -1140,7 +1140,7 @@ void pccc_decoder(
     }
   }
 
-  for(int rep=0;rep<repetitions;rep++) {
+  for(int rep=0;rep<iterations;rep++) {
     // run  SISO 1
     siso_algorithm(FSM1.I(),FSM1.S(),FSM1.O(),
              FSM1.NS(), FSM1.OS(), FSM1.PS(), FSM1.PI(),
@@ -1185,7 +1185,7 @@ void pccc_decoder(
       memcpy(&(priori1[ki*FSM1.I()]),&(posti2[k*FSM2.I()]),FSM1.I()*sizeof(float));
     }
 
-  } // end repetitions
+  } // end iterations
 
   // generate hard decisions
   for(int k=0;k<blocklength;k++) {
@@ -1204,8 +1204,6 @@ void pccc_decoder(
   }
   //std::cout << std::endl;
 
-
-
 }
 
 //----------------
@@ -1214,7 +1212,7 @@ template
 void pccc_decoder<unsigned char>(
       const fsm &FSM1, int ST10, int ST1K,
       const fsm &FSM2, int ST20, int ST2K,
-      const interleaver &INTERLEAVER, int blocklength, int repetitions,
+      const interleaver &INTERLEAVER, int blocklength, int iterations,
       float (*p2mymin)(float,float),
       const float *cprioro, unsigned char *data
 );
@@ -1223,7 +1221,7 @@ template
 void pccc_decoder<short>(
       const fsm &FSM1, int ST10, int ST1K,
       const fsm &FSM2, int ST20, int ST2K,
-      const interleaver &INTERLEAVER, int blocklength, int repetitions,
+      const interleaver &INTERLEAVER, int blocklength, int iterations,
       float (*p2mymin)(float,float),
       const float *cprioro, short *data
 );
@@ -1232,8 +1230,208 @@ template
 void pccc_decoder<int>(
       const fsm &FSM1, int ST10, int ST1K,
       const fsm &FSM2, int ST20, int ST2K,
-      const interleaver &INTERLEAVER, int blocklength, int repetitions,
+      const interleaver &INTERLEAVER, int blocklength, int iterations,
       float (*p2mymin)(float,float),
       const float *cprioro, int *data
 );
 
+
+
+//----------------
+
+
+template<class Ti, class To>
+void pccc_decoder_combined(
+      const fsm &FSM1, int ST10, int ST1K,
+      const fsm &FSM2, int ST20, int ST2K,
+      const interleaver &INTERLEAVER, int blocklength, int iterations,
+      float (*p2mymin)(float,float),
+      int D, const std::vector<Ti> &TABLE,
+      trellis_metric_type_t METRIC_TYPE,
+      float scaling,
+      const Ti *observations, To *data
+)
+{
+
+  //allocate space for cprioro
+  std::vector<float> cprioro(blocklength*FSM1.O()*FSM2.O(),0.0);
+
+  //allocate space for priori, prioro and posti of FSM1
+  std::vector<float> priori1(blocklength*FSM1.I(),0.0);
+  std::vector<float> prioro1(blocklength*FSM1.O());
+  std::vector<float> posti1(blocklength*FSM1.I());
+
+  //allocate space for priori, prioro and posti of FSM2
+  std::vector<float> priori2(blocklength*FSM2.I(),0.0);
+  std::vector<float> prioro2(blocklength*FSM2.O());
+  std::vector<float> posti2(blocklength*FSM2.I());
+
+  // turn observations to neg-log-priors for cprioiro
+  int O=FSM1.O()*FSM2.O();
+  for(int k=0;k<blocklength;k++) {
+    calc_metric(O, D, TABLE, &(observations[k*D]), &(cprioro[k*O]),METRIC_TYPE);
+    cprioro[k*O] *= scaling;
+  }
+ 
+  //generate prioro1,2 (metrics are not updated per iteration: this is not the best you can do...)
+  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];
+      for(int j=1;j<FSM2.O();j++)
+        x = (*p2mymin)(x,cprioro[k*FSM1.O()*FSM2.O()+i*FSM1.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];
+      for(int j=1;j<FSM1.O();j++)
+        x = (*p2mymin)(x,cprioro[k*FSM1.O()*FSM2.O()+j*FSM1.O()+i]);
+      prioro2[k*FSM2.O()+i]=x;
+    }
+  }
+
+  for(int rep=0;rep<iterations;rep++) {
+    // run  SISO 1
+    siso_algorithm(FSM1.I(),FSM1.S(),FSM1.O(),
+             FSM1.NS(), FSM1.OS(), FSM1.PS(), FSM1.PI(),
+             blocklength,
+             ST10,ST1K,
+             true, false,
+             p2mymin,
+             &(priori1[0]),  &(prioro1[0]), &(posti1[0])
+    );
+   
+    //for(int k=0;k<blocklength;k++){
+      //for(int i=0;i<FSM1.I();i++)
+        //std::cout << posti1[k*FSM1.I()+i] << ", ";
+      //std::cout << std::endl;
+    //}
+
+    //interleave soft info 1 -> 2
+    for(int k=0;k<blocklength;k++) {
+      int ki = INTERLEAVER.INTER()[k];
+      //for(int i=0;i<FSMi.I();i++) {
+        //oprioro[k*FSMi.I()+i]=iposti[ki*FSMi.I()+i];
+      //}
+      memcpy(&(priori2[k*FSM2.I()]),&(posti1[ki*FSM1.I()]),FSM1.I()*sizeof(float));
+    } 
+
+    // run SISO 2
+    siso_algorithm(FSM2.I(),FSM2.S(),FSM2.O(),
+           FSM2.NS(), FSM2.OS(), FSM2.PS(), FSM2.PI(),
+           blocklength,
+           ST20,ST2K,
+           true, false,
+           p2mymin,
+           &(priori2[0]),  &(prioro2[0]), &(posti2[0])
+    );
+
+    //interleave soft info 2 --> 1
+    for(int k=0;k<blocklength;k++) {
+      int ki = INTERLEAVER.INTER()[k];
+      //for(int i=0;i<FSMi.I();i++) {
+        //ipriori[ki*FSMi.I()+i]=oposto[k*FSMi.I()+i];
+      //}
+      memcpy(&(priori1[ki*FSM1.I()]),&(posti2[k*FSM2.I()]),FSM1.I()*sizeof(float));
+    }
+
+  } // end iterations
+
+  // generate hard decisions
+  for(int k=0;k<blocklength;k++) {
+    for(int i=0;i<FSM1.I();i++)
+      posti1[k*FSM1.I()+i]  = (*p2mymin)(priori1[k*FSM1.I()+i],posti1[k*FSM1.I()+i]);
+    float min=INF;
+    int mini=0;
+    for(int i=0;i<FSM1.I();i++) {
+      if(posti1[k*FSM1.I()+i]<min) {
+        min=posti1[k*FSM1.I()+i];
+        mini=i;
+      }
+    }
+    data[k]=(To)mini;
+    //std::cout << data[k] << ", "<< std::endl;
+  }
+  //std::cout << std::endl;
+
+}
+
+
+template
+void pccc_decoder_combined(
+      const fsm &FSM1, int ST10, int ST1K,
+      const fsm &FSM2, int ST20, int ST2K,
+      const interleaver &INTERLEAVER, int blocklength, int iterations,
+      float (*p2mymin)(float,float),
+      int D, const std::vector<float> &TABLE,
+      trellis_metric_type_t METRIC_TYPE,
+      float scaling,
+      const float *observations, unsigned char *data
+);
+
+
+template
+void pccc_decoder_combined(
+      const fsm &FSM1, int ST10, int ST1K,
+      const fsm &FSM2, int ST20, int ST2K,
+      const interleaver &INTERLEAVER, int blocklength, int iterations,
+      float (*p2mymin)(float,float),
+      int D, const std::vector<float> &TABLE,
+      trellis_metric_type_t METRIC_TYPE,
+      float scaling,
+      const float *observations, short *data
+);
+
+
+template
+void pccc_decoder_combined(
+      const fsm &FSM1, int ST10, int ST1K,
+      const fsm &FSM2, int ST20, int ST2K,
+      const interleaver &INTERLEAVER, int blocklength, int iterations,
+      float (*p2mymin)(float,float),
+      int D, const std::vector<float> &TABLE,
+      trellis_metric_type_t METRIC_TYPE,
+      float scaling,
+      const float *observations, int *data
+);
+
+
+template
+void pccc_decoder_combined(
+      const fsm &FSM1, int ST10, int ST1K,
+      const fsm &FSM2, int ST20, int ST2K,
+      const interleaver &INTERLEAVER, int blocklength, int iterations,
+      float (*p2mymin)(float,float),
+      int D, const std::vector<gr_complex> &TABLE,
+      trellis_metric_type_t METRIC_TYPE,
+      float scaling,
+      const gr_complex *observations, unsigned char *data
+);
+
+
+template
+void pccc_decoder_combined(
+      const fsm &FSM1, int ST10, int ST1K,
+      const fsm &FSM2, int ST20, int ST2K,
+      const interleaver &INTERLEAVER, int blocklength, int iterations,
+      float (*p2mymin)(float,float),
+      int D, const std::vector<gr_complex> &TABLE,
+      trellis_metric_type_t METRIC_TYPE,
+      float scaling,
+      const gr_complex *observations, short *data
+);
+
+
+template
+void pccc_decoder_combined(
+      const fsm &FSM1, int ST10, int ST1K,
+      const fsm &FSM2, int ST20, int ST2K,
+      const interleaver &INTERLEAVER, int blocklength, int iterations,
+      float (*p2mymin)(float,float),
+      int D, const std::vector<gr_complex> &TABLE,
+      trellis_metric_type_t METRIC_TYPE,
+      float scaling,
+      const gr_complex *observations, int *data
+);
diff --git a/gr-trellis/src/lib/core_algorithms.h b/gr-trellis/src/lib/core_algorithms.h
index fdb5f398e..0ce4f3f4e 100644
--- a/gr-trellis/src/lib/core_algorithms.h
+++ b/gr-trellis/src/lib/core_algorithms.h
@@ -91,11 +91,21 @@ void siso_algorithm_combined(int I, int S, int O,
 );
 
 
+template<class T>
+void sccc_decoder(
+      const fsm &FSMo, int STo0, int SToK,
+      const fsm &FSMi, int STi0, int STiK,
+      const interleaver &INTERLEAVER, int blocklength, int iterations,
+      float (*p2mymin)(float,float),
+      const float *iprioro, T *data
+);
+ 
+
 template<class Ti, class To>
 void sccc_decoder_combined(
       const fsm &FSMo, int STo0, int SToK,
       const fsm &FSMi, int STi0, int STiK,
-      const interleaver &INTERLEAVER, int blocklength, int repetitions,
+      const interleaver &INTERLEAVER, int blocklength, int iterations,
       float (*p2mymin)(float,float),
       int D, const std::vector<Ti> &TABLE,
       trellis_metric_type_t METRIC_TYPE,
@@ -103,26 +113,28 @@ void sccc_decoder_combined(
       const Ti *observations, To *data
 );
 
-
 template<class T>
-void sccc_decoder(
-      const fsm &FSMo, int STo0, int SToK,
-      const fsm &FSMi, int STi0, int STiK,
-      const interleaver &INTERLEAVER, int blocklength, int repetitions,
+void pccc_decoder(
+      const fsm &FSM1, int ST10, int ST1K,
+      const fsm &FSM2, int ST20, int ST2K,
+      const interleaver &INTERLEAVER, int blocklength, int iterations,
       float (*p2mymin)(float,float),
-      const float *iprioro, T *data
+      const float *cprioro, T *data
 );
 
-
-template<class T>
-void pccc_decoder(
+template<class Ti, class To>
+void pccc_decoder_combined(
       const fsm &FSM1, int ST10, int ST1K,
       const fsm &FSM2, int ST20, int ST2K,
-      const interleaver &INTERLEAVER, int blocklength, int repetitions,
+      const interleaver &INTERLEAVER, int blocklength, int iterations,
       float (*p2mymin)(float,float),
-      const float *cprioro, T *data
+      int D, const std::vector<Ti> &TABLE,
+      trellis_metric_type_t METRIC_TYPE,
+      float scaling,
+      const Ti *observations, To *data
 );
 
 
 
+
 #endif
diff --git a/gr-trellis/src/lib/generate_trellis.py b/gr-trellis/src/lib/generate_trellis.py
index 9f845f74a..31bc44aac 100644
--- a/gr-trellis/src/lib/generate_trellis.py
+++ b/gr-trellis/src/lib/generate_trellis.py
@@ -33,9 +33,10 @@ other_roots = [
     'trellis_metrics_X',
     'trellis_viterbi_X',
     'trellis_viterbi_combined_XX',
-    'trellis_sccc_decoder_combined_XX',
     'trellis_sccc_decoder_X',
+    'trellis_sccc_decoder_combined_XX',
     'trellis_pccc_decoder_X',
+    'trellis_pccc_decoder_combined_XX',
     ]
 
 other_signatures = (
@@ -45,9 +46,10 @@ other_signatures = (
     ['s','i','f','c'],
     ['b','s','i'],
     ['sb','ss','si','ib','is','ii','fb','fs','fi','cb','cs','ci'],
-    ['fb','fs','fi','cb','cs','ci'],
     ['b','s','i'],
+    ['fb','fs','fi','cb','cs','ci'],
     ['b','s','i'],
+    ['fb','fs','fi','cb','cs','ci'],
     )
 
 
diff --git a/gr-trellis/src/lib/trellis_pccc_decoder_combined_XX.cc.t b/gr-trellis/src/lib/trellis_pccc_decoder_combined_XX.cc.t
new file mode 100644
index 000000000..48f68f1fe
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_pccc_decoder_combined_XX.cc.t
@@ -0,0 +1,147 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2010 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+// @WARNING@
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <@NAME@.h>
+#include <gr_io_signature.h>
+#include <assert.h>
+#include <iostream>
+#include "core_algorithms.h"
+
+  
+static const float INF = 1.0e9;
+
+@SPTR_NAME@ 
+trellis_make_@BASE_NAME@ (
+  const fsm &FSMo, int STo0, int SToK,
+  const fsm &FSMi, int STi0, int STiK,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE,
+  int D,
+  const std::vector<@I_TYPE@> &TABLE,
+  trellis_metric_type_t METRIC_TYPE,
+  float scaling
+)
+{
+  return gnuradio::get_initial_sptr (new @NAME@ (
+    FSMo, STo0, SToK,
+    FSMi, STi0, STiK,
+    INTERLEAVER,
+    blocklength,
+    repetitions,
+    SISO_TYPE,
+    D,
+    TABLE,METRIC_TYPE,
+    scaling
+    ));
+}
+
+@NAME@::@NAME@ (
+  const fsm &FSMo, int STo0, int SToK,
+  const fsm &FSMi, int STi0, int STiK,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE,
+  int D,
+  const std::vector<@I_TYPE@> &TABLE,
+  trellis_metric_type_t METRIC_TYPE,
+  float scaling
+)
+  : gr_block ("@BASE_NAME@",
+			  gr_make_io_signature (1, 1, sizeof (@I_TYPE@)),
+			  gr_make_io_signature (1, 1, sizeof (@O_TYPE@))),  
+  d_FSMo (FSMo), d_STo0 (STo0), d_SToK (SToK),
+  d_FSMi (FSMi), d_STi0 (STi0), d_STiK (STiK),
+  d_INTERLEAVER (INTERLEAVER),
+  d_blocklength (blocklength),
+  d_repetitions (repetitions),
+  d_SISO_TYPE (SISO_TYPE),
+  d_D (D),
+  d_TABLE (TABLE),
+  d_METRIC_TYPE (METRIC_TYPE),
+  d_scaling (scaling)
+{
+    assert(d_FSMo.I() == d_FSMi.I());
+    set_relative_rate (1.0 / ((double) d_D));
+    set_output_multiple (d_blocklength);
+}
+
+void @NAME@::set_scaling(float scaling)
+{
+  d_scaling = scaling;
+}
+
+
+void
+@NAME@::forecast (int noutput_items, gr_vector_int &ninput_items_required)
+{
+  assert (noutput_items % d_blocklength == 0);
+  int input_required =  d_D * noutput_items ;
+  ninput_items_required[0] = input_required;
+}
+
+
+
+//===========================================================
+
+int
+@NAME@::general_work (int noutput_items,
+                        gr_vector_int &ninput_items,
+                        gr_vector_const_void_star &input_items,
+                        gr_vector_void_star &output_items)
+{
+  assert (noutput_items % d_blocklength == 0);
+  int nblocks = noutput_items / d_blocklength;
+
+  float (*p2min)(float, float) = NULL;
+  if(d_SISO_TYPE == TRELLIS_MIN_SUM)
+    p2min = &min;
+  else if(d_SISO_TYPE == TRELLIS_SUM_PRODUCT)
+    p2min = &min_star;
+
+
+  const @I_TYPE@ *in = (const @I_TYPE@ *) input_items[0];
+  @O_TYPE@ *out = (@O_TYPE@ *) output_items[0];
+  for (int n=0;n<nblocks;n++) {
+    pccc_decoder_combined(
+      d_FSMo, d_STo0, d_SToK,
+      d_FSMi, d_STi0, d_STiK,
+      d_INTERLEAVER, d_blocklength, d_repetitions,
+      p2min, 
+      d_D,d_TABLE, 
+      d_METRIC_TYPE, 
+      d_scaling,
+      &(in[n*d_blocklength*d_D]),&(out[n*d_blocklength])
+    );
+  }
+
+  consume_each (d_D * noutput_items );
+  return noutput_items;
+}
diff --git a/gr-trellis/src/lib/trellis_pccc_decoder_combined_XX.h.t b/gr-trellis/src/lib/trellis_pccc_decoder_combined_XX.h.t
new file mode 100644
index 000000000..dd9979af9
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_pccc_decoder_combined_XX.h.t
@@ -0,0 +1,124 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+// @WARNING@
+
+#ifndef @GUARD_NAME@
+#define @GUARD_NAME@
+
+#include "fsm.h"
+#include "interleaver.h"
+#include <gr_block.h>
+#include <vector>
+#include "calc_metric.h"
+#include "siso_type.h"
+
+class @NAME@;
+typedef boost::shared_ptr<@NAME@> @SPTR_NAME@;
+
+@SPTR_NAME@ trellis_make_@BASE_NAME@ (
+  const fsm &FSMo, int STo0, int SToK,
+  const fsm &FSMi, int STi0, int STiK,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE, // perform "min-sum" or "sum-product" combining 
+  int D,
+  const std::vector<@I_TYPE@> &TABLE,
+  trellis_metric_type_t METRIC_TYPE,
+  float scaling
+);
+
+
+/*!
+ *  \ingroup coding_blk
+ */
+class @NAME@ : public gr_block
+{
+  fsm d_FSMo;
+  fsm d_FSMi;
+  int d_STo0;
+  int d_SToK;
+  int d_STi0;
+  int d_STiK;
+  interleaver d_INTERLEAVER;
+  int d_blocklength;
+  int d_repetitions;
+  trellis_siso_type_t d_SISO_TYPE;
+  int d_D;
+  std::vector<@I_TYPE@> d_TABLE;
+  trellis_metric_type_t d_METRIC_TYPE;
+  float d_scaling;
+  std::vector<float> d_buffer;
+
+  friend @SPTR_NAME@ trellis_make_@BASE_NAME@ (
+    const fsm &FSMo, int STo0, int SToK,
+    const fsm &FSMi, int STi0, int STiK,
+    const interleaver &INTERLEAVER,
+    int blocklength,
+    int repetitions,
+    trellis_siso_type_t SISO_TYPE,
+    int D,
+    const std::vector<@I_TYPE@> &TABLE,
+    trellis_metric_type_t METRIC_TYPE,
+    float scaling
+  );
+
+  @NAME@ (
+    const fsm &FSMo, int STo0, int SToK,
+    const fsm &FSMi, int STi0, int STiK,
+    const interleaver &INTERLEAVER,
+    int blocklength,
+    int repetitions,
+    trellis_siso_type_t SISO_TYPE, 
+    int D,
+    const std::vector<@I_TYPE@> &TABLE,
+    trellis_metric_type_t METRIC_TYPE,
+    float scaling
+  );
+
+public:
+  fsm FSM1 () const { return d_FSMo; }
+  fsm FSM2 () const { return d_FSMi; }
+  int ST10 () const { return d_STo0; }
+  int ST1K () const { return d_SToK; }
+  int ST20 () const { return d_STi0; }
+  int ST2K () const { return d_STiK; }
+  interleaver INTERLEAVER () const { return d_INTERLEAVER; }
+  int blocklength () const { return d_blocklength; }
+  int repetitions () const { return d_repetitions; }
+  int D () const { return d_D; }
+  std::vector<@I_TYPE@> TABLE () const { return d_TABLE; }
+  trellis_metric_type_t METRIC_TYPE () const { return d_METRIC_TYPE; }
+  trellis_siso_type_t SISO_TYPE () const { return d_SISO_TYPE; }
+  float scaling () const { return d_scaling; }
+  void set_scaling (float scaling);
+
+  void forecast (int noutput_items,
+                 gr_vector_int &ninput_items_required);
+  int general_work (int noutput_items,
+                    gr_vector_int &ninput_items,
+                    gr_vector_const_void_star &input_items,
+                    gr_vector_void_star &output_items);
+};
+
+#endif
diff --git a/gr-trellis/src/lib/trellis_pccc_decoder_combined_XX.i.t b/gr-trellis/src/lib/trellis_pccc_decoder_combined_XX.i.t
new file mode 100644
index 000000000..d841f67b4
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_pccc_decoder_combined_XX.i.t
@@ -0,0 +1,73 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+// @WARNING@
+
+GR_SWIG_BLOCK_MAGIC(trellis,@BASE_NAME@);
+
+@SPTR_NAME@ trellis_make_@BASE_NAME@ (
+  const fsm &FSMo, int STo0, int SToK,
+  const fsm &FSMi, int STi0, int STiK,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE,
+  int D,
+  const std::vector<@I_TYPE@> &TABLE,
+  trellis_metric_type_t METRIC_TYPE,
+  float scaling
+);
+
+
+class @NAME@ : public gr_block
+{
+private:
+  @NAME@ (
+    const fsm &FSMo, int STo0, int SToK,
+    const fsm &FSMi, int STi0, int STiK,
+    const interleaver &INTERLEAVER,
+    int blocklength,
+    int repetitions,
+    trellis_siso_type_t SISO_TYPE,
+    int D,
+    const std::vector<@I_TYPE@> &TABLE,
+    trellis_metric_type_t METRIC_TYPE,
+    float scaling
+  );
+
+public:
+  fsm FSM1 () const { return d_FSMo; }
+  fsm FSM2 () const { return d_FSMi; }
+  int ST10 () const { return d_STo0; }
+  int ST1K () const { return d_SToK; }
+  int ST20 () const { return d_STi0; }
+  int ST2K () const { return d_STiK; }
+  interleaver INTERLEAVER () const { return d_INTERLEAVER; }
+  int blocklength () const { return d_blocklength; }
+  int repetitions () const { return d_repetitions; }
+  int D () const { return d_D; }
+  std::vector<@I_TYPE@> TABLE () const { return d_TABLE; }
+  trellis_metric_type_t METRIC_TYPE () const { return d_METRIC_TYPE; }
+  trellis_siso_type_t SISO_TYPE () const { return d_SISO_TYPE; }
+  float scaling() const { return d_scaling; }
+  void set_scaling (float scaling);
+};
diff --git a/gr-trellis/src/lib/trellis_pccc_decoder_combined_cb.cc b/gr-trellis/src/lib/trellis_pccc_decoder_combined_cb.cc
new file mode 100644
index 000000000..d797ce410
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_pccc_decoder_combined_cb.cc
@@ -0,0 +1,147 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2010 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+// WARNING: this file is machine generated.  Edits will be over written
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <trellis_pccc_decoder_combined_cb.h>
+#include <gr_io_signature.h>
+#include <assert.h>
+#include <iostream>
+#include "core_algorithms.h"
+
+  
+static const float INF = 1.0e9;
+
+trellis_pccc_decoder_combined_cb_sptr 
+trellis_make_pccc_decoder_combined_cb (
+  const fsm &FSMo, int STo0, int SToK,
+  const fsm &FSMi, int STi0, int STiK,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE,
+  int D,
+  const std::vector<gr_complex> &TABLE,
+  trellis_metric_type_t METRIC_TYPE,
+  float scaling
+)
+{
+  return gnuradio::get_initial_sptr (new trellis_pccc_decoder_combined_cb (
+    FSMo, STo0, SToK,
+    FSMi, STi0, STiK,
+    INTERLEAVER,
+    blocklength,
+    repetitions,
+    SISO_TYPE,
+    D,
+    TABLE,METRIC_TYPE,
+    scaling
+    ));
+}
+
+trellis_pccc_decoder_combined_cb::trellis_pccc_decoder_combined_cb (
+  const fsm &FSMo, int STo0, int SToK,
+  const fsm &FSMi, int STi0, int STiK,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE,
+  int D,
+  const std::vector<gr_complex> &TABLE,
+  trellis_metric_type_t METRIC_TYPE,
+  float scaling
+)
+  : gr_block ("pccc_decoder_combined_cb",
+			  gr_make_io_signature (1, 1, sizeof (gr_complex)),
+			  gr_make_io_signature (1, 1, sizeof (unsigned char))),  
+  d_FSMo (FSMo), d_STo0 (STo0), d_SToK (SToK),
+  d_FSMi (FSMi), d_STi0 (STi0), d_STiK (STiK),
+  d_INTERLEAVER (INTERLEAVER),
+  d_blocklength (blocklength),
+  d_repetitions (repetitions),
+  d_SISO_TYPE (SISO_TYPE),
+  d_D (D),
+  d_TABLE (TABLE),
+  d_METRIC_TYPE (METRIC_TYPE),
+  d_scaling (scaling)
+{
+    assert(d_FSMo.I() == d_FSMi.I());
+    set_relative_rate (1.0 / ((double) d_D));
+    set_output_multiple (d_blocklength);
+}
+
+void trellis_pccc_decoder_combined_cb::set_scaling(float scaling)
+{
+  d_scaling = scaling;
+}
+
+
+void
+trellis_pccc_decoder_combined_cb::forecast (int noutput_items, gr_vector_int &ninput_items_required)
+{
+  assert (noutput_items % d_blocklength == 0);
+  int input_required =  d_D * noutput_items ;
+  ninput_items_required[0] = input_required;
+}
+
+
+
+//===========================================================
+
+int
+trellis_pccc_decoder_combined_cb::general_work (int noutput_items,
+                        gr_vector_int &ninput_items,
+                        gr_vector_const_void_star &input_items,
+                        gr_vector_void_star &output_items)
+{
+  assert (noutput_items % d_blocklength == 0);
+  int nblocks = noutput_items / d_blocklength;
+
+  float (*p2min)(float, float) = NULL;
+  if(d_SISO_TYPE == TRELLIS_MIN_SUM)
+    p2min = &min;
+  else if(d_SISO_TYPE == TRELLIS_SUM_PRODUCT)
+    p2min = &min_star;
+
+
+  const gr_complex *in = (const gr_complex *) input_items[0];
+  unsigned char *out = (unsigned char *) output_items[0];
+  for (int n=0;n<nblocks;n++) {
+    pccc_decoder_combined(
+      d_FSMo, d_STo0, d_SToK,
+      d_FSMi, d_STi0, d_STiK,
+      d_INTERLEAVER, d_blocklength, d_repetitions,
+      p2min, 
+      d_D,d_TABLE, 
+      d_METRIC_TYPE, 
+      d_scaling,
+      &(in[n*d_blocklength*d_D]),&(out[n*d_blocklength])
+    );
+  }
+
+  consume_each (d_D * noutput_items );
+  return noutput_items;
+}
diff --git a/gr-trellis/src/lib/trellis_pccc_decoder_combined_cb.h b/gr-trellis/src/lib/trellis_pccc_decoder_combined_cb.h
new file mode 100644
index 000000000..46d65242e
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_pccc_decoder_combined_cb.h
@@ -0,0 +1,124 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+// WARNING: this file is machine generated.  Edits will be over written
+
+#ifndef INCLUDED_TRELLIS_PCCC_DECODER_COMBINED_CB_H
+#define INCLUDED_TRELLIS_PCCC_DECODER_COMBINED_CB_H
+
+#include "fsm.h"
+#include "interleaver.h"
+#include <gr_block.h>
+#include <vector>
+#include "calc_metric.h"
+#include "siso_type.h"
+
+class trellis_pccc_decoder_combined_cb;
+typedef boost::shared_ptr<trellis_pccc_decoder_combined_cb> trellis_pccc_decoder_combined_cb_sptr;
+
+trellis_pccc_decoder_combined_cb_sptr trellis_make_pccc_decoder_combined_cb (
+  const fsm &FSMo, int STo0, int SToK,
+  const fsm &FSMi, int STi0, int STiK,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE, // perform "min-sum" or "sum-product" combining 
+  int D,
+  const std::vector<gr_complex> &TABLE,
+  trellis_metric_type_t METRIC_TYPE,
+  float scaling
+);
+
+
+/*!
+ *  \ingroup coding_blk
+ */
+class trellis_pccc_decoder_combined_cb : public gr_block
+{
+  fsm d_FSMo;
+  fsm d_FSMi;
+  int d_STo0;
+  int d_SToK;
+  int d_STi0;
+  int d_STiK;
+  interleaver d_INTERLEAVER;
+  int d_blocklength;
+  int d_repetitions;
+  trellis_siso_type_t d_SISO_TYPE;
+  int d_D;
+  std::vector<gr_complex> d_TABLE;
+  trellis_metric_type_t d_METRIC_TYPE;
+  float d_scaling;
+  std::vector<float> d_buffer;
+
+  friend trellis_pccc_decoder_combined_cb_sptr trellis_make_pccc_decoder_combined_cb (
+    const fsm &FSMo, int STo0, int SToK,
+    const fsm &FSMi, int STi0, int STiK,
+    const interleaver &INTERLEAVER,
+    int blocklength,
+    int repetitions,
+    trellis_siso_type_t SISO_TYPE,
+    int D,
+    const std::vector<gr_complex> &TABLE,
+    trellis_metric_type_t METRIC_TYPE,
+    float scaling
+  );
+
+  trellis_pccc_decoder_combined_cb (
+    const fsm &FSMo, int STo0, int SToK,
+    const fsm &FSMi, int STi0, int STiK,
+    const interleaver &INTERLEAVER,
+    int blocklength,
+    int repetitions,
+    trellis_siso_type_t SISO_TYPE, 
+    int D,
+    const std::vector<gr_complex> &TABLE,
+    trellis_metric_type_t METRIC_TYPE,
+    float scaling
+  );
+
+public:
+  fsm FSM1 () const { return d_FSMo; }
+  fsm FSM2 () const { return d_FSMi; }
+  int ST10 () const { return d_STo0; }
+  int ST1K () const { return d_SToK; }
+  int ST20 () const { return d_STi0; }
+  int ST2K () const { return d_STiK; }
+  interleaver INTERLEAVER () const { return d_INTERLEAVER; }
+  int blocklength () const { return d_blocklength; }
+  int repetitions () const { return d_repetitions; }
+  int D () const { return d_D; }
+  std::vector<gr_complex> TABLE () const { return d_TABLE; }
+  trellis_metric_type_t METRIC_TYPE () const { return d_METRIC_TYPE; }
+  trellis_siso_type_t SISO_TYPE () const { return d_SISO_TYPE; }
+  float scaling () const { return d_scaling; }
+  void set_scaling (float scaling);
+
+  void forecast (int noutput_items,
+                 gr_vector_int &ninput_items_required);
+  int general_work (int noutput_items,
+                    gr_vector_int &ninput_items,
+                    gr_vector_const_void_star &input_items,
+                    gr_vector_void_star &output_items);
+};
+
+#endif
diff --git a/gr-trellis/src/lib/trellis_pccc_decoder_combined_cb.i b/gr-trellis/src/lib/trellis_pccc_decoder_combined_cb.i
new file mode 100644
index 000000000..9ae829c55
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_pccc_decoder_combined_cb.i
@@ -0,0 +1,73 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+// WARNING: this file is machine generated.  Edits will be over written
+
+GR_SWIG_BLOCK_MAGIC(trellis,pccc_decoder_combined_cb);
+
+trellis_pccc_decoder_combined_cb_sptr trellis_make_pccc_decoder_combined_cb (
+  const fsm &FSMo, int STo0, int SToK,
+  const fsm &FSMi, int STi0, int STiK,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE,
+  int D,
+  const std::vector<gr_complex> &TABLE,
+  trellis_metric_type_t METRIC_TYPE,
+  float scaling
+);
+
+
+class trellis_pccc_decoder_combined_cb : public gr_block
+{
+private:
+  trellis_pccc_decoder_combined_cb (
+    const fsm &FSMo, int STo0, int SToK,
+    const fsm &FSMi, int STi0, int STiK,
+    const interleaver &INTERLEAVER,
+    int blocklength,
+    int repetitions,
+    trellis_siso_type_t SISO_TYPE,
+    int D,
+    const std::vector<gr_complex> &TABLE,
+    trellis_metric_type_t METRIC_TYPE,
+    float scaling
+  );
+
+public:
+  fsm FSM1 () const { return d_FSMo; }
+  fsm FSM2 () const { return d_FSMi; }
+  int ST10 () const { return d_STo0; }
+  int ST1K () const { return d_SToK; }
+  int ST20 () const { return d_STi0; }
+  int ST2K () const { return d_STiK; }
+  interleaver INTERLEAVER () const { return d_INTERLEAVER; }
+  int blocklength () const { return d_blocklength; }
+  int repetitions () const { return d_repetitions; }
+  int D () const { return d_D; }
+  std::vector<gr_complex> TABLE () const { return d_TABLE; }
+  trellis_metric_type_t METRIC_TYPE () const { return d_METRIC_TYPE; }
+  trellis_siso_type_t SISO_TYPE () const { return d_SISO_TYPE; }
+  float scaling() const { return d_scaling; }
+  void set_scaling (float scaling);
+};
diff --git a/gr-trellis/src/lib/trellis_pccc_decoder_combined_ci.cc b/gr-trellis/src/lib/trellis_pccc_decoder_combined_ci.cc
new file mode 100644
index 000000000..19201947e
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_pccc_decoder_combined_ci.cc
@@ -0,0 +1,147 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2010 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+// WARNING: this file is machine generated.  Edits will be over written
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <trellis_pccc_decoder_combined_ci.h>
+#include <gr_io_signature.h>
+#include <assert.h>
+#include <iostream>
+#include "core_algorithms.h"
+
+  
+static const float INF = 1.0e9;
+
+trellis_pccc_decoder_combined_ci_sptr 
+trellis_make_pccc_decoder_combined_ci (
+  const fsm &FSMo, int STo0, int SToK,
+  const fsm &FSMi, int STi0, int STiK,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE,
+  int D,
+  const std::vector<gr_complex> &TABLE,
+  trellis_metric_type_t METRIC_TYPE,
+  float scaling
+)
+{
+  return gnuradio::get_initial_sptr (new trellis_pccc_decoder_combined_ci (
+    FSMo, STo0, SToK,
+    FSMi, STi0, STiK,
+    INTERLEAVER,
+    blocklength,
+    repetitions,
+    SISO_TYPE,
+    D,
+    TABLE,METRIC_TYPE,
+    scaling
+    ));
+}
+
+trellis_pccc_decoder_combined_ci::trellis_pccc_decoder_combined_ci (
+  const fsm &FSMo, int STo0, int SToK,
+  const fsm &FSMi, int STi0, int STiK,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE,
+  int D,
+  const std::vector<gr_complex> &TABLE,
+  trellis_metric_type_t METRIC_TYPE,
+  float scaling
+)
+  : gr_block ("pccc_decoder_combined_ci",
+			  gr_make_io_signature (1, 1, sizeof (gr_complex)),
+			  gr_make_io_signature (1, 1, sizeof (int))),  
+  d_FSMo (FSMo), d_STo0 (STo0), d_SToK (SToK),
+  d_FSMi (FSMi), d_STi0 (STi0), d_STiK (STiK),
+  d_INTERLEAVER (INTERLEAVER),
+  d_blocklength (blocklength),
+  d_repetitions (repetitions),
+  d_SISO_TYPE (SISO_TYPE),
+  d_D (D),
+  d_TABLE (TABLE),
+  d_METRIC_TYPE (METRIC_TYPE),
+  d_scaling (scaling)
+{
+    assert(d_FSMo.I() == d_FSMi.I());
+    set_relative_rate (1.0 / ((double) d_D));
+    set_output_multiple (d_blocklength);
+}
+
+void trellis_pccc_decoder_combined_ci::set_scaling(float scaling)
+{
+  d_scaling = scaling;
+}
+
+
+void
+trellis_pccc_decoder_combined_ci::forecast (int noutput_items, gr_vector_int &ninput_items_required)
+{
+  assert (noutput_items % d_blocklength == 0);
+  int input_required =  d_D * noutput_items ;
+  ninput_items_required[0] = input_required;
+}
+
+
+
+//===========================================================
+
+int
+trellis_pccc_decoder_combined_ci::general_work (int noutput_items,
+                        gr_vector_int &ninput_items,
+                        gr_vector_const_void_star &input_items,
+                        gr_vector_void_star &output_items)
+{
+  assert (noutput_items % d_blocklength == 0);
+  int nblocks = noutput_items / d_blocklength;
+
+  float (*p2min)(float, float) = NULL;
+  if(d_SISO_TYPE == TRELLIS_MIN_SUM)
+    p2min = &min;
+  else if(d_SISO_TYPE == TRELLIS_SUM_PRODUCT)
+    p2min = &min_star;
+
+
+  const gr_complex *in = (const gr_complex *) input_items[0];
+  int *out = (int *) output_items[0];
+  for (int n=0;n<nblocks;n++) {
+    pccc_decoder_combined(
+      d_FSMo, d_STo0, d_SToK,
+      d_FSMi, d_STi0, d_STiK,
+      d_INTERLEAVER, d_blocklength, d_repetitions,
+      p2min, 
+      d_D,d_TABLE, 
+      d_METRIC_TYPE, 
+      d_scaling,
+      &(in[n*d_blocklength*d_D]),&(out[n*d_blocklength])
+    );
+  }
+
+  consume_each (d_D * noutput_items );
+  return noutput_items;
+}
diff --git a/gr-trellis/src/lib/trellis_pccc_decoder_combined_ci.h b/gr-trellis/src/lib/trellis_pccc_decoder_combined_ci.h
new file mode 100644
index 000000000..32668c34d
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_pccc_decoder_combined_ci.h
@@ -0,0 +1,124 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+// WARNING: this file is machine generated.  Edits will be over written
+
+#ifndef INCLUDED_TRELLIS_PCCC_DECODER_COMBINED_CI_H
+#define INCLUDED_TRELLIS_PCCC_DECODER_COMBINED_CI_H
+
+#include "fsm.h"
+#include "interleaver.h"
+#include <gr_block.h>
+#include <vector>
+#include "calc_metric.h"
+#include "siso_type.h"
+
+class trellis_pccc_decoder_combined_ci;
+typedef boost::shared_ptr<trellis_pccc_decoder_combined_ci> trellis_pccc_decoder_combined_ci_sptr;
+
+trellis_pccc_decoder_combined_ci_sptr trellis_make_pccc_decoder_combined_ci (
+  const fsm &FSMo, int STo0, int SToK,
+  const fsm &FSMi, int STi0, int STiK,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE, // perform "min-sum" or "sum-product" combining 
+  int D,
+  const std::vector<gr_complex> &TABLE,
+  trellis_metric_type_t METRIC_TYPE,
+  float scaling
+);
+
+
+/*!
+ *  \ingroup coding_blk
+ */
+class trellis_pccc_decoder_combined_ci : public gr_block
+{
+  fsm d_FSMo;
+  fsm d_FSMi;
+  int d_STo0;
+  int d_SToK;
+  int d_STi0;
+  int d_STiK;
+  interleaver d_INTERLEAVER;
+  int d_blocklength;
+  int d_repetitions;
+  trellis_siso_type_t d_SISO_TYPE;
+  int d_D;
+  std::vector<gr_complex> d_TABLE;
+  trellis_metric_type_t d_METRIC_TYPE;
+  float d_scaling;
+  std::vector<float> d_buffer;
+
+  friend trellis_pccc_decoder_combined_ci_sptr trellis_make_pccc_decoder_combined_ci (
+    const fsm &FSMo, int STo0, int SToK,
+    const fsm &FSMi, int STi0, int STiK,
+    const interleaver &INTERLEAVER,
+    int blocklength,
+    int repetitions,
+    trellis_siso_type_t SISO_TYPE,
+    int D,
+    const std::vector<gr_complex> &TABLE,
+    trellis_metric_type_t METRIC_TYPE,
+    float scaling
+  );
+
+  trellis_pccc_decoder_combined_ci (
+    const fsm &FSMo, int STo0, int SToK,
+    const fsm &FSMi, int STi0, int STiK,
+    const interleaver &INTERLEAVER,
+    int blocklength,
+    int repetitions,
+    trellis_siso_type_t SISO_TYPE, 
+    int D,
+    const std::vector<gr_complex> &TABLE,
+    trellis_metric_type_t METRIC_TYPE,
+    float scaling
+  );
+
+public:
+  fsm FSM1 () const { return d_FSMo; }
+  fsm FSM2 () const { return d_FSMi; }
+  int ST10 () const { return d_STo0; }
+  int ST1K () const { return d_SToK; }
+  int ST20 () const { return d_STi0; }
+  int ST2K () const { return d_STiK; }
+  interleaver INTERLEAVER () const { return d_INTERLEAVER; }
+  int blocklength () const { return d_blocklength; }
+  int repetitions () const { return d_repetitions; }
+  int D () const { return d_D; }
+  std::vector<gr_complex> TABLE () const { return d_TABLE; }
+  trellis_metric_type_t METRIC_TYPE () const { return d_METRIC_TYPE; }
+  trellis_siso_type_t SISO_TYPE () const { return d_SISO_TYPE; }
+  float scaling () const { return d_scaling; }
+  void set_scaling (float scaling);
+
+  void forecast (int noutput_items,
+                 gr_vector_int &ninput_items_required);
+  int general_work (int noutput_items,
+                    gr_vector_int &ninput_items,
+                    gr_vector_const_void_star &input_items,
+                    gr_vector_void_star &output_items);
+};
+
+#endif
diff --git a/gr-trellis/src/lib/trellis_pccc_decoder_combined_ci.i b/gr-trellis/src/lib/trellis_pccc_decoder_combined_ci.i
new file mode 100644
index 000000000..5644d6992
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_pccc_decoder_combined_ci.i
@@ -0,0 +1,73 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+// WARNING: this file is machine generated.  Edits will be over written
+
+GR_SWIG_BLOCK_MAGIC(trellis,pccc_decoder_combined_ci);
+
+trellis_pccc_decoder_combined_ci_sptr trellis_make_pccc_decoder_combined_ci (
+  const fsm &FSMo, int STo0, int SToK,
+  const fsm &FSMi, int STi0, int STiK,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE,
+  int D,
+  const std::vector<gr_complex> &TABLE,
+  trellis_metric_type_t METRIC_TYPE,
+  float scaling
+);
+
+
+class trellis_pccc_decoder_combined_ci : public gr_block
+{
+private:
+  trellis_pccc_decoder_combined_ci (
+    const fsm &FSMo, int STo0, int SToK,
+    const fsm &FSMi, int STi0, int STiK,
+    const interleaver &INTERLEAVER,
+    int blocklength,
+    int repetitions,
+    trellis_siso_type_t SISO_TYPE,
+    int D,
+    const std::vector<gr_complex> &TABLE,
+    trellis_metric_type_t METRIC_TYPE,
+    float scaling
+  );
+
+public:
+  fsm FSM1 () const { return d_FSMo; }
+  fsm FSM2 () const { return d_FSMi; }
+  int ST10 () const { return d_STo0; }
+  int ST1K () const { return d_SToK; }
+  int ST20 () const { return d_STi0; }
+  int ST2K () const { return d_STiK; }
+  interleaver INTERLEAVER () const { return d_INTERLEAVER; }
+  int blocklength () const { return d_blocklength; }
+  int repetitions () const { return d_repetitions; }
+  int D () const { return d_D; }
+  std::vector<gr_complex> TABLE () const { return d_TABLE; }
+  trellis_metric_type_t METRIC_TYPE () const { return d_METRIC_TYPE; }
+  trellis_siso_type_t SISO_TYPE () const { return d_SISO_TYPE; }
+  float scaling() const { return d_scaling; }
+  void set_scaling (float scaling);
+};
diff --git a/gr-trellis/src/lib/trellis_pccc_decoder_combined_cs.cc b/gr-trellis/src/lib/trellis_pccc_decoder_combined_cs.cc
new file mode 100644
index 000000000..0ab818bfd
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_pccc_decoder_combined_cs.cc
@@ -0,0 +1,147 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2010 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+// WARNING: this file is machine generated.  Edits will be over written
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <trellis_pccc_decoder_combined_cs.h>
+#include <gr_io_signature.h>
+#include <assert.h>
+#include <iostream>
+#include "core_algorithms.h"
+
+  
+static const float INF = 1.0e9;
+
+trellis_pccc_decoder_combined_cs_sptr 
+trellis_make_pccc_decoder_combined_cs (
+  const fsm &FSMo, int STo0, int SToK,
+  const fsm &FSMi, int STi0, int STiK,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE,
+  int D,
+  const std::vector<gr_complex> &TABLE,
+  trellis_metric_type_t METRIC_TYPE,
+  float scaling
+)
+{
+  return gnuradio::get_initial_sptr (new trellis_pccc_decoder_combined_cs (
+    FSMo, STo0, SToK,
+    FSMi, STi0, STiK,
+    INTERLEAVER,
+    blocklength,
+    repetitions,
+    SISO_TYPE,
+    D,
+    TABLE,METRIC_TYPE,
+    scaling
+    ));
+}
+
+trellis_pccc_decoder_combined_cs::trellis_pccc_decoder_combined_cs (
+  const fsm &FSMo, int STo0, int SToK,
+  const fsm &FSMi, int STi0, int STiK,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE,
+  int D,
+  const std::vector<gr_complex> &TABLE,
+  trellis_metric_type_t METRIC_TYPE,
+  float scaling
+)
+  : gr_block ("pccc_decoder_combined_cs",
+			  gr_make_io_signature (1, 1, sizeof (gr_complex)),
+			  gr_make_io_signature (1, 1, sizeof (short))),  
+  d_FSMo (FSMo), d_STo0 (STo0), d_SToK (SToK),
+  d_FSMi (FSMi), d_STi0 (STi0), d_STiK (STiK),
+  d_INTERLEAVER (INTERLEAVER),
+  d_blocklength (blocklength),
+  d_repetitions (repetitions),
+  d_SISO_TYPE (SISO_TYPE),
+  d_D (D),
+  d_TABLE (TABLE),
+  d_METRIC_TYPE (METRIC_TYPE),
+  d_scaling (scaling)
+{
+    assert(d_FSMo.I() == d_FSMi.I());
+    set_relative_rate (1.0 / ((double) d_D));
+    set_output_multiple (d_blocklength);
+}
+
+void trellis_pccc_decoder_combined_cs::set_scaling(float scaling)
+{
+  d_scaling = scaling;
+}
+
+
+void
+trellis_pccc_decoder_combined_cs::forecast (int noutput_items, gr_vector_int &ninput_items_required)
+{
+  assert (noutput_items % d_blocklength == 0);
+  int input_required =  d_D * noutput_items ;
+  ninput_items_required[0] = input_required;
+}
+
+
+
+//===========================================================
+
+int
+trellis_pccc_decoder_combined_cs::general_work (int noutput_items,
+                        gr_vector_int &ninput_items,
+                        gr_vector_const_void_star &input_items,
+                        gr_vector_void_star &output_items)
+{
+  assert (noutput_items % d_blocklength == 0);
+  int nblocks = noutput_items / d_blocklength;
+
+  float (*p2min)(float, float) = NULL;
+  if(d_SISO_TYPE == TRELLIS_MIN_SUM)
+    p2min = &min;
+  else if(d_SISO_TYPE == TRELLIS_SUM_PRODUCT)
+    p2min = &min_star;
+
+
+  const gr_complex *in = (const gr_complex *) input_items[0];
+  short *out = (short *) output_items[0];
+  for (int n=0;n<nblocks;n++) {
+    pccc_decoder_combined(
+      d_FSMo, d_STo0, d_SToK,
+      d_FSMi, d_STi0, d_STiK,
+      d_INTERLEAVER, d_blocklength, d_repetitions,
+      p2min, 
+      d_D,d_TABLE, 
+      d_METRIC_TYPE, 
+      d_scaling,
+      &(in[n*d_blocklength*d_D]),&(out[n*d_blocklength])
+    );
+  }
+
+  consume_each (d_D * noutput_items );
+  return noutput_items;
+}
diff --git a/gr-trellis/src/lib/trellis_pccc_decoder_combined_cs.h b/gr-trellis/src/lib/trellis_pccc_decoder_combined_cs.h
new file mode 100644
index 000000000..3c4f138aa
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_pccc_decoder_combined_cs.h
@@ -0,0 +1,124 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+// WARNING: this file is machine generated.  Edits will be over written
+
+#ifndef INCLUDED_TRELLIS_PCCC_DECODER_COMBINED_CS_H
+#define INCLUDED_TRELLIS_PCCC_DECODER_COMBINED_CS_H
+
+#include "fsm.h"
+#include "interleaver.h"
+#include <gr_block.h>
+#include <vector>
+#include "calc_metric.h"
+#include "siso_type.h"
+
+class trellis_pccc_decoder_combined_cs;
+typedef boost::shared_ptr<trellis_pccc_decoder_combined_cs> trellis_pccc_decoder_combined_cs_sptr;
+
+trellis_pccc_decoder_combined_cs_sptr trellis_make_pccc_decoder_combined_cs (
+  const fsm &FSMo, int STo0, int SToK,
+  const fsm &FSMi, int STi0, int STiK,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE, // perform "min-sum" or "sum-product" combining 
+  int D,
+  const std::vector<gr_complex> &TABLE,
+  trellis_metric_type_t METRIC_TYPE,
+  float scaling
+);
+
+
+/*!
+ *  \ingroup coding_blk
+ */
+class trellis_pccc_decoder_combined_cs : public gr_block
+{
+  fsm d_FSMo;
+  fsm d_FSMi;
+  int d_STo0;
+  int d_SToK;
+  int d_STi0;
+  int d_STiK;
+  interleaver d_INTERLEAVER;
+  int d_blocklength;
+  int d_repetitions;
+  trellis_siso_type_t d_SISO_TYPE;
+  int d_D;
+  std::vector<gr_complex> d_TABLE;
+  trellis_metric_type_t d_METRIC_TYPE;
+  float d_scaling;
+  std::vector<float> d_buffer;
+
+  friend trellis_pccc_decoder_combined_cs_sptr trellis_make_pccc_decoder_combined_cs (
+    const fsm &FSMo, int STo0, int SToK,
+    const fsm &FSMi, int STi0, int STiK,
+    const interleaver &INTERLEAVER,
+    int blocklength,
+    int repetitions,
+    trellis_siso_type_t SISO_TYPE,
+    int D,
+    const std::vector<gr_complex> &TABLE,
+    trellis_metric_type_t METRIC_TYPE,
+    float scaling
+  );
+
+  trellis_pccc_decoder_combined_cs (
+    const fsm &FSMo, int STo0, int SToK,
+    const fsm &FSMi, int STi0, int STiK,
+    const interleaver &INTERLEAVER,
+    int blocklength,
+    int repetitions,
+    trellis_siso_type_t SISO_TYPE, 
+    int D,
+    const std::vector<gr_complex> &TABLE,
+    trellis_metric_type_t METRIC_TYPE,
+    float scaling
+  );
+
+public:
+  fsm FSM1 () const { return d_FSMo; }
+  fsm FSM2 () const { return d_FSMi; }
+  int ST10 () const { return d_STo0; }
+  int ST1K () const { return d_SToK; }
+  int ST20 () const { return d_STi0; }
+  int ST2K () const { return d_STiK; }
+  interleaver INTERLEAVER () const { return d_INTERLEAVER; }
+  int blocklength () const { return d_blocklength; }
+  int repetitions () const { return d_repetitions; }
+  int D () const { return d_D; }
+  std::vector<gr_complex> TABLE () const { return d_TABLE; }
+  trellis_metric_type_t METRIC_TYPE () const { return d_METRIC_TYPE; }
+  trellis_siso_type_t SISO_TYPE () const { return d_SISO_TYPE; }
+  float scaling () const { return d_scaling; }
+  void set_scaling (float scaling);
+
+  void forecast (int noutput_items,
+                 gr_vector_int &ninput_items_required);
+  int general_work (int noutput_items,
+                    gr_vector_int &ninput_items,
+                    gr_vector_const_void_star &input_items,
+                    gr_vector_void_star &output_items);
+};
+
+#endif
diff --git a/gr-trellis/src/lib/trellis_pccc_decoder_combined_cs.i b/gr-trellis/src/lib/trellis_pccc_decoder_combined_cs.i
new file mode 100644
index 000000000..7614a81fc
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_pccc_decoder_combined_cs.i
@@ -0,0 +1,73 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+// WARNING: this file is machine generated.  Edits will be over written
+
+GR_SWIG_BLOCK_MAGIC(trellis,pccc_decoder_combined_cs);
+
+trellis_pccc_decoder_combined_cs_sptr trellis_make_pccc_decoder_combined_cs (
+  const fsm &FSMo, int STo0, int SToK,
+  const fsm &FSMi, int STi0, int STiK,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE,
+  int D,
+  const std::vector<gr_complex> &TABLE,
+  trellis_metric_type_t METRIC_TYPE,
+  float scaling
+);
+
+
+class trellis_pccc_decoder_combined_cs : public gr_block
+{
+private:
+  trellis_pccc_decoder_combined_cs (
+    const fsm &FSMo, int STo0, int SToK,
+    const fsm &FSMi, int STi0, int STiK,
+    const interleaver &INTERLEAVER,
+    int blocklength,
+    int repetitions,
+    trellis_siso_type_t SISO_TYPE,
+    int D,
+    const std::vector<gr_complex> &TABLE,
+    trellis_metric_type_t METRIC_TYPE,
+    float scaling
+  );
+
+public:
+  fsm FSM1 () const { return d_FSMo; }
+  fsm FSM2 () const { return d_FSMi; }
+  int ST10 () const { return d_STo0; }
+  int ST1K () const { return d_SToK; }
+  int ST20 () const { return d_STi0; }
+  int ST2K () const { return d_STiK; }
+  interleaver INTERLEAVER () const { return d_INTERLEAVER; }
+  int blocklength () const { return d_blocklength; }
+  int repetitions () const { return d_repetitions; }
+  int D () const { return d_D; }
+  std::vector<gr_complex> TABLE () const { return d_TABLE; }
+  trellis_metric_type_t METRIC_TYPE () const { return d_METRIC_TYPE; }
+  trellis_siso_type_t SISO_TYPE () const { return d_SISO_TYPE; }
+  float scaling() const { return d_scaling; }
+  void set_scaling (float scaling);
+};
diff --git a/gr-trellis/src/lib/trellis_pccc_decoder_combined_fb.cc b/gr-trellis/src/lib/trellis_pccc_decoder_combined_fb.cc
new file mode 100644
index 000000000..0122dd7e9
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_pccc_decoder_combined_fb.cc
@@ -0,0 +1,147 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2010 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+// WARNING: this file is machine generated.  Edits will be over written
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <trellis_pccc_decoder_combined_fb.h>
+#include <gr_io_signature.h>
+#include <assert.h>
+#include <iostream>
+#include "core_algorithms.h"
+
+  
+static const float INF = 1.0e9;
+
+trellis_pccc_decoder_combined_fb_sptr 
+trellis_make_pccc_decoder_combined_fb (
+  const fsm &FSMo, int STo0, int SToK,
+  const fsm &FSMi, int STi0, int STiK,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE,
+  int D,
+  const std::vector<float> &TABLE,
+  trellis_metric_type_t METRIC_TYPE,
+  float scaling
+)
+{
+  return gnuradio::get_initial_sptr (new trellis_pccc_decoder_combined_fb (
+    FSMo, STo0, SToK,
+    FSMi, STi0, STiK,
+    INTERLEAVER,
+    blocklength,
+    repetitions,
+    SISO_TYPE,
+    D,
+    TABLE,METRIC_TYPE,
+    scaling
+    ));
+}
+
+trellis_pccc_decoder_combined_fb::trellis_pccc_decoder_combined_fb (
+  const fsm &FSMo, int STo0, int SToK,
+  const fsm &FSMi, int STi0, int STiK,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE,
+  int D,
+  const std::vector<float> &TABLE,
+  trellis_metric_type_t METRIC_TYPE,
+  float scaling
+)
+  : gr_block ("pccc_decoder_combined_fb",
+			  gr_make_io_signature (1, 1, sizeof (float)),
+			  gr_make_io_signature (1, 1, sizeof (unsigned char))),  
+  d_FSMo (FSMo), d_STo0 (STo0), d_SToK (SToK),
+  d_FSMi (FSMi), d_STi0 (STi0), d_STiK (STiK),
+  d_INTERLEAVER (INTERLEAVER),
+  d_blocklength (blocklength),
+  d_repetitions (repetitions),
+  d_SISO_TYPE (SISO_TYPE),
+  d_D (D),
+  d_TABLE (TABLE),
+  d_METRIC_TYPE (METRIC_TYPE),
+  d_scaling (scaling)
+{
+    assert(d_FSMo.I() == d_FSMi.I());
+    set_relative_rate (1.0 / ((double) d_D));
+    set_output_multiple (d_blocklength);
+}
+
+void trellis_pccc_decoder_combined_fb::set_scaling(float scaling)
+{
+  d_scaling = scaling;
+}
+
+
+void
+trellis_pccc_decoder_combined_fb::forecast (int noutput_items, gr_vector_int &ninput_items_required)
+{
+  assert (noutput_items % d_blocklength == 0);
+  int input_required =  d_D * noutput_items ;
+  ninput_items_required[0] = input_required;
+}
+
+
+
+//===========================================================
+
+int
+trellis_pccc_decoder_combined_fb::general_work (int noutput_items,
+                        gr_vector_int &ninput_items,
+                        gr_vector_const_void_star &input_items,
+                        gr_vector_void_star &output_items)
+{
+  assert (noutput_items % d_blocklength == 0);
+  int nblocks = noutput_items / d_blocklength;
+
+  float (*p2min)(float, float) = NULL;
+  if(d_SISO_TYPE == TRELLIS_MIN_SUM)
+    p2min = &min;
+  else if(d_SISO_TYPE == TRELLIS_SUM_PRODUCT)
+    p2min = &min_star;
+
+
+  const float *in = (const float *) input_items[0];
+  unsigned char *out = (unsigned char *) output_items[0];
+  for (int n=0;n<nblocks;n++) {
+    pccc_decoder_combined(
+      d_FSMo, d_STo0, d_SToK,
+      d_FSMi, d_STi0, d_STiK,
+      d_INTERLEAVER, d_blocklength, d_repetitions,
+      p2min, 
+      d_D,d_TABLE, 
+      d_METRIC_TYPE, 
+      d_scaling,
+      &(in[n*d_blocklength*d_D]),&(out[n*d_blocklength])
+    );
+  }
+
+  consume_each (d_D * noutput_items );
+  return noutput_items;
+}
diff --git a/gr-trellis/src/lib/trellis_pccc_decoder_combined_fb.h b/gr-trellis/src/lib/trellis_pccc_decoder_combined_fb.h
new file mode 100644
index 000000000..0ed90b8b3
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_pccc_decoder_combined_fb.h
@@ -0,0 +1,124 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+// WARNING: this file is machine generated.  Edits will be over written
+
+#ifndef INCLUDED_TRELLIS_PCCC_DECODER_COMBINED_FB_H
+#define INCLUDED_TRELLIS_PCCC_DECODER_COMBINED_FB_H
+
+#include "fsm.h"
+#include "interleaver.h"
+#include <gr_block.h>
+#include <vector>
+#include "calc_metric.h"
+#include "siso_type.h"
+
+class trellis_pccc_decoder_combined_fb;
+typedef boost::shared_ptr<trellis_pccc_decoder_combined_fb> trellis_pccc_decoder_combined_fb_sptr;
+
+trellis_pccc_decoder_combined_fb_sptr trellis_make_pccc_decoder_combined_fb (
+  const fsm &FSMo, int STo0, int SToK,
+  const fsm &FSMi, int STi0, int STiK,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE, // perform "min-sum" or "sum-product" combining 
+  int D,
+  const std::vector<float> &TABLE,
+  trellis_metric_type_t METRIC_TYPE,
+  float scaling
+);
+
+
+/*!
+ *  \ingroup coding_blk
+ */
+class trellis_pccc_decoder_combined_fb : public gr_block
+{
+  fsm d_FSMo;
+  fsm d_FSMi;
+  int d_STo0;
+  int d_SToK;
+  int d_STi0;
+  int d_STiK;
+  interleaver d_INTERLEAVER;
+  int d_blocklength;
+  int d_repetitions;
+  trellis_siso_type_t d_SISO_TYPE;
+  int d_D;
+  std::vector<float> d_TABLE;
+  trellis_metric_type_t d_METRIC_TYPE;
+  float d_scaling;
+  std::vector<float> d_buffer;
+
+  friend trellis_pccc_decoder_combined_fb_sptr trellis_make_pccc_decoder_combined_fb (
+    const fsm &FSMo, int STo0, int SToK,
+    const fsm &FSMi, int STi0, int STiK,
+    const interleaver &INTERLEAVER,
+    int blocklength,
+    int repetitions,
+    trellis_siso_type_t SISO_TYPE,
+    int D,
+    const std::vector<float> &TABLE,
+    trellis_metric_type_t METRIC_TYPE,
+    float scaling
+  );
+
+  trellis_pccc_decoder_combined_fb (
+    const fsm &FSMo, int STo0, int SToK,
+    const fsm &FSMi, int STi0, int STiK,
+    const interleaver &INTERLEAVER,
+    int blocklength,
+    int repetitions,
+    trellis_siso_type_t SISO_TYPE, 
+    int D,
+    const std::vector<float> &TABLE,
+    trellis_metric_type_t METRIC_TYPE,
+    float scaling
+  );
+
+public:
+  fsm FSM1 () const { return d_FSMo; }
+  fsm FSM2 () const { return d_FSMi; }
+  int ST10 () const { return d_STo0; }
+  int ST1K () const { return d_SToK; }
+  int ST20 () const { return d_STi0; }
+  int ST2K () const { return d_STiK; }
+  interleaver INTERLEAVER () const { return d_INTERLEAVER; }
+  int blocklength () const { return d_blocklength; }
+  int repetitions () const { return d_repetitions; }
+  int D () const { return d_D; }
+  std::vector<float> TABLE () const { return d_TABLE; }
+  trellis_metric_type_t METRIC_TYPE () const { return d_METRIC_TYPE; }
+  trellis_siso_type_t SISO_TYPE () const { return d_SISO_TYPE; }
+  float scaling () const { return d_scaling; }
+  void set_scaling (float scaling);
+
+  void forecast (int noutput_items,
+                 gr_vector_int &ninput_items_required);
+  int general_work (int noutput_items,
+                    gr_vector_int &ninput_items,
+                    gr_vector_const_void_star &input_items,
+                    gr_vector_void_star &output_items);
+};
+
+#endif
diff --git a/gr-trellis/src/lib/trellis_pccc_decoder_combined_fb.i b/gr-trellis/src/lib/trellis_pccc_decoder_combined_fb.i
new file mode 100644
index 000000000..41e1a2f4f
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_pccc_decoder_combined_fb.i
@@ -0,0 +1,73 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+// WARNING: this file is machine generated.  Edits will be over written
+
+GR_SWIG_BLOCK_MAGIC(trellis,pccc_decoder_combined_fb);
+
+trellis_pccc_decoder_combined_fb_sptr trellis_make_pccc_decoder_combined_fb (
+  const fsm &FSMo, int STo0, int SToK,
+  const fsm &FSMi, int STi0, int STiK,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE,
+  int D,
+  const std::vector<float> &TABLE,
+  trellis_metric_type_t METRIC_TYPE,
+  float scaling
+);
+
+
+class trellis_pccc_decoder_combined_fb : public gr_block
+{
+private:
+  trellis_pccc_decoder_combined_fb (
+    const fsm &FSMo, int STo0, int SToK,
+    const fsm &FSMi, int STi0, int STiK,
+    const interleaver &INTERLEAVER,
+    int blocklength,
+    int repetitions,
+    trellis_siso_type_t SISO_TYPE,
+    int D,
+    const std::vector<float> &TABLE,
+    trellis_metric_type_t METRIC_TYPE,
+    float scaling
+  );
+
+public:
+  fsm FSM1 () const { return d_FSMo; }
+  fsm FSM2 () const { return d_FSMi; }
+  int ST10 () const { return d_STo0; }
+  int ST1K () const { return d_SToK; }
+  int ST20 () const { return d_STi0; }
+  int ST2K () const { return d_STiK; }
+  interleaver INTERLEAVER () const { return d_INTERLEAVER; }
+  int blocklength () const { return d_blocklength; }
+  int repetitions () const { return d_repetitions; }
+  int D () const { return d_D; }
+  std::vector<float> TABLE () const { return d_TABLE; }
+  trellis_metric_type_t METRIC_TYPE () const { return d_METRIC_TYPE; }
+  trellis_siso_type_t SISO_TYPE () const { return d_SISO_TYPE; }
+  float scaling() const { return d_scaling; }
+  void set_scaling (float scaling);
+};
diff --git a/gr-trellis/src/lib/trellis_pccc_decoder_combined_fi.cc b/gr-trellis/src/lib/trellis_pccc_decoder_combined_fi.cc
new file mode 100644
index 000000000..e87487087
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_pccc_decoder_combined_fi.cc
@@ -0,0 +1,147 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2010 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+// WARNING: this file is machine generated.  Edits will be over written
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <trellis_pccc_decoder_combined_fi.h>
+#include <gr_io_signature.h>
+#include <assert.h>
+#include <iostream>
+#include "core_algorithms.h"
+
+  
+static const float INF = 1.0e9;
+
+trellis_pccc_decoder_combined_fi_sptr 
+trellis_make_pccc_decoder_combined_fi (
+  const fsm &FSMo, int STo0, int SToK,
+  const fsm &FSMi, int STi0, int STiK,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE,
+  int D,
+  const std::vector<float> &TABLE,
+  trellis_metric_type_t METRIC_TYPE,
+  float scaling
+)
+{
+  return gnuradio::get_initial_sptr (new trellis_pccc_decoder_combined_fi (
+    FSMo, STo0, SToK,
+    FSMi, STi0, STiK,
+    INTERLEAVER,
+    blocklength,
+    repetitions,
+    SISO_TYPE,
+    D,
+    TABLE,METRIC_TYPE,
+    scaling
+    ));
+}
+
+trellis_pccc_decoder_combined_fi::trellis_pccc_decoder_combined_fi (
+  const fsm &FSMo, int STo0, int SToK,
+  const fsm &FSMi, int STi0, int STiK,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE,
+  int D,
+  const std::vector<float> &TABLE,
+  trellis_metric_type_t METRIC_TYPE,
+  float scaling
+)
+  : gr_block ("pccc_decoder_combined_fi",
+			  gr_make_io_signature (1, 1, sizeof (float)),
+			  gr_make_io_signature (1, 1, sizeof (int))),  
+  d_FSMo (FSMo), d_STo0 (STo0), d_SToK (SToK),
+  d_FSMi (FSMi), d_STi0 (STi0), d_STiK (STiK),
+  d_INTERLEAVER (INTERLEAVER),
+  d_blocklength (blocklength),
+  d_repetitions (repetitions),
+  d_SISO_TYPE (SISO_TYPE),
+  d_D (D),
+  d_TABLE (TABLE),
+  d_METRIC_TYPE (METRIC_TYPE),
+  d_scaling (scaling)
+{
+    assert(d_FSMo.I() == d_FSMi.I());
+    set_relative_rate (1.0 / ((double) d_D));
+    set_output_multiple (d_blocklength);
+}
+
+void trellis_pccc_decoder_combined_fi::set_scaling(float scaling)
+{
+  d_scaling = scaling;
+}
+
+
+void
+trellis_pccc_decoder_combined_fi::forecast (int noutput_items, gr_vector_int &ninput_items_required)
+{
+  assert (noutput_items % d_blocklength == 0);
+  int input_required =  d_D * noutput_items ;
+  ninput_items_required[0] = input_required;
+}
+
+
+
+//===========================================================
+
+int
+trellis_pccc_decoder_combined_fi::general_work (int noutput_items,
+                        gr_vector_int &ninput_items,
+                        gr_vector_const_void_star &input_items,
+                        gr_vector_void_star &output_items)
+{
+  assert (noutput_items % d_blocklength == 0);
+  int nblocks = noutput_items / d_blocklength;
+
+  float (*p2min)(float, float) = NULL;
+  if(d_SISO_TYPE == TRELLIS_MIN_SUM)
+    p2min = &min;
+  else if(d_SISO_TYPE == TRELLIS_SUM_PRODUCT)
+    p2min = &min_star;
+
+
+  const float *in = (const float *) input_items[0];
+  int *out = (int *) output_items[0];
+  for (int n=0;n<nblocks;n++) {
+    pccc_decoder_combined(
+      d_FSMo, d_STo0, d_SToK,
+      d_FSMi, d_STi0, d_STiK,
+      d_INTERLEAVER, d_blocklength, d_repetitions,
+      p2min, 
+      d_D,d_TABLE, 
+      d_METRIC_TYPE, 
+      d_scaling,
+      &(in[n*d_blocklength*d_D]),&(out[n*d_blocklength])
+    );
+  }
+
+  consume_each (d_D * noutput_items );
+  return noutput_items;
+}
diff --git a/gr-trellis/src/lib/trellis_pccc_decoder_combined_fi.h b/gr-trellis/src/lib/trellis_pccc_decoder_combined_fi.h
new file mode 100644
index 000000000..a96adaa08
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_pccc_decoder_combined_fi.h
@@ -0,0 +1,124 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+// WARNING: this file is machine generated.  Edits will be over written
+
+#ifndef INCLUDED_TRELLIS_PCCC_DECODER_COMBINED_FI_H
+#define INCLUDED_TRELLIS_PCCC_DECODER_COMBINED_FI_H
+
+#include "fsm.h"
+#include "interleaver.h"
+#include <gr_block.h>
+#include <vector>
+#include "calc_metric.h"
+#include "siso_type.h"
+
+class trellis_pccc_decoder_combined_fi;
+typedef boost::shared_ptr<trellis_pccc_decoder_combined_fi> trellis_pccc_decoder_combined_fi_sptr;
+
+trellis_pccc_decoder_combined_fi_sptr trellis_make_pccc_decoder_combined_fi (
+  const fsm &FSMo, int STo0, int SToK,
+  const fsm &FSMi, int STi0, int STiK,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE, // perform "min-sum" or "sum-product" combining 
+  int D,
+  const std::vector<float> &TABLE,
+  trellis_metric_type_t METRIC_TYPE,
+  float scaling
+);
+
+
+/*!
+ *  \ingroup coding_blk
+ */
+class trellis_pccc_decoder_combined_fi : public gr_block
+{
+  fsm d_FSMo;
+  fsm d_FSMi;
+  int d_STo0;
+  int d_SToK;
+  int d_STi0;
+  int d_STiK;
+  interleaver d_INTERLEAVER;
+  int d_blocklength;
+  int d_repetitions;
+  trellis_siso_type_t d_SISO_TYPE;
+  int d_D;
+  std::vector<float> d_TABLE;
+  trellis_metric_type_t d_METRIC_TYPE;
+  float d_scaling;
+  std::vector<float> d_buffer;
+
+  friend trellis_pccc_decoder_combined_fi_sptr trellis_make_pccc_decoder_combined_fi (
+    const fsm &FSMo, int STo0, int SToK,
+    const fsm &FSMi, int STi0, int STiK,
+    const interleaver &INTERLEAVER,
+    int blocklength,
+    int repetitions,
+    trellis_siso_type_t SISO_TYPE,
+    int D,
+    const std::vector<float> &TABLE,
+    trellis_metric_type_t METRIC_TYPE,
+    float scaling
+  );
+
+  trellis_pccc_decoder_combined_fi (
+    const fsm &FSMo, int STo0, int SToK,
+    const fsm &FSMi, int STi0, int STiK,
+    const interleaver &INTERLEAVER,
+    int blocklength,
+    int repetitions,
+    trellis_siso_type_t SISO_TYPE, 
+    int D,
+    const std::vector<float> &TABLE,
+    trellis_metric_type_t METRIC_TYPE,
+    float scaling
+  );
+
+public:
+  fsm FSM1 () const { return d_FSMo; }
+  fsm FSM2 () const { return d_FSMi; }
+  int ST10 () const { return d_STo0; }
+  int ST1K () const { return d_SToK; }
+  int ST20 () const { return d_STi0; }
+  int ST2K () const { return d_STiK; }
+  interleaver INTERLEAVER () const { return d_INTERLEAVER; }
+  int blocklength () const { return d_blocklength; }
+  int repetitions () const { return d_repetitions; }
+  int D () const { return d_D; }
+  std::vector<float> TABLE () const { return d_TABLE; }
+  trellis_metric_type_t METRIC_TYPE () const { return d_METRIC_TYPE; }
+  trellis_siso_type_t SISO_TYPE () const { return d_SISO_TYPE; }
+  float scaling () const { return d_scaling; }
+  void set_scaling (float scaling);
+
+  void forecast (int noutput_items,
+                 gr_vector_int &ninput_items_required);
+  int general_work (int noutput_items,
+                    gr_vector_int &ninput_items,
+                    gr_vector_const_void_star &input_items,
+                    gr_vector_void_star &output_items);
+};
+
+#endif
diff --git a/gr-trellis/src/lib/trellis_pccc_decoder_combined_fi.i b/gr-trellis/src/lib/trellis_pccc_decoder_combined_fi.i
new file mode 100644
index 000000000..202609ace
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_pccc_decoder_combined_fi.i
@@ -0,0 +1,73 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+// WARNING: this file is machine generated.  Edits will be over written
+
+GR_SWIG_BLOCK_MAGIC(trellis,pccc_decoder_combined_fi);
+
+trellis_pccc_decoder_combined_fi_sptr trellis_make_pccc_decoder_combined_fi (
+  const fsm &FSMo, int STo0, int SToK,
+  const fsm &FSMi, int STi0, int STiK,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE,
+  int D,
+  const std::vector<float> &TABLE,
+  trellis_metric_type_t METRIC_TYPE,
+  float scaling
+);
+
+
+class trellis_pccc_decoder_combined_fi : public gr_block
+{
+private:
+  trellis_pccc_decoder_combined_fi (
+    const fsm &FSMo, int STo0, int SToK,
+    const fsm &FSMi, int STi0, int STiK,
+    const interleaver &INTERLEAVER,
+    int blocklength,
+    int repetitions,
+    trellis_siso_type_t SISO_TYPE,
+    int D,
+    const std::vector<float> &TABLE,
+    trellis_metric_type_t METRIC_TYPE,
+    float scaling
+  );
+
+public:
+  fsm FSM1 () const { return d_FSMo; }
+  fsm FSM2 () const { return d_FSMi; }
+  int ST10 () const { return d_STo0; }
+  int ST1K () const { return d_SToK; }
+  int ST20 () const { return d_STi0; }
+  int ST2K () const { return d_STiK; }
+  interleaver INTERLEAVER () const { return d_INTERLEAVER; }
+  int blocklength () const { return d_blocklength; }
+  int repetitions () const { return d_repetitions; }
+  int D () const { return d_D; }
+  std::vector<float> TABLE () const { return d_TABLE; }
+  trellis_metric_type_t METRIC_TYPE () const { return d_METRIC_TYPE; }
+  trellis_siso_type_t SISO_TYPE () const { return d_SISO_TYPE; }
+  float scaling() const { return d_scaling; }
+  void set_scaling (float scaling);
+};
diff --git a/gr-trellis/src/lib/trellis_pccc_decoder_combined_fs.cc b/gr-trellis/src/lib/trellis_pccc_decoder_combined_fs.cc
new file mode 100644
index 000000000..bb822c699
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_pccc_decoder_combined_fs.cc
@@ -0,0 +1,147 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2010 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+// WARNING: this file is machine generated.  Edits will be over written
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <trellis_pccc_decoder_combined_fs.h>
+#include <gr_io_signature.h>
+#include <assert.h>
+#include <iostream>
+#include "core_algorithms.h"
+
+  
+static const float INF = 1.0e9;
+
+trellis_pccc_decoder_combined_fs_sptr 
+trellis_make_pccc_decoder_combined_fs (
+  const fsm &FSMo, int STo0, int SToK,
+  const fsm &FSMi, int STi0, int STiK,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE,
+  int D,
+  const std::vector<float> &TABLE,
+  trellis_metric_type_t METRIC_TYPE,
+  float scaling
+)
+{
+  return gnuradio::get_initial_sptr (new trellis_pccc_decoder_combined_fs (
+    FSMo, STo0, SToK,
+    FSMi, STi0, STiK,
+    INTERLEAVER,
+    blocklength,
+    repetitions,
+    SISO_TYPE,
+    D,
+    TABLE,METRIC_TYPE,
+    scaling
+    ));
+}
+
+trellis_pccc_decoder_combined_fs::trellis_pccc_decoder_combined_fs (
+  const fsm &FSMo, int STo0, int SToK,
+  const fsm &FSMi, int STi0, int STiK,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE,
+  int D,
+  const std::vector<float> &TABLE,
+  trellis_metric_type_t METRIC_TYPE,
+  float scaling
+)
+  : gr_block ("pccc_decoder_combined_fs",
+			  gr_make_io_signature (1, 1, sizeof (float)),
+			  gr_make_io_signature (1, 1, sizeof (short))),  
+  d_FSMo (FSMo), d_STo0 (STo0), d_SToK (SToK),
+  d_FSMi (FSMi), d_STi0 (STi0), d_STiK (STiK),
+  d_INTERLEAVER (INTERLEAVER),
+  d_blocklength (blocklength),
+  d_repetitions (repetitions),
+  d_SISO_TYPE (SISO_TYPE),
+  d_D (D),
+  d_TABLE (TABLE),
+  d_METRIC_TYPE (METRIC_TYPE),
+  d_scaling (scaling)
+{
+    assert(d_FSMo.I() == d_FSMi.I());
+    set_relative_rate (1.0 / ((double) d_D));
+    set_output_multiple (d_blocklength);
+}
+
+void trellis_pccc_decoder_combined_fs::set_scaling(float scaling)
+{
+  d_scaling = scaling;
+}
+
+
+void
+trellis_pccc_decoder_combined_fs::forecast (int noutput_items, gr_vector_int &ninput_items_required)
+{
+  assert (noutput_items % d_blocklength == 0);
+  int input_required =  d_D * noutput_items ;
+  ninput_items_required[0] = input_required;
+}
+
+
+
+//===========================================================
+
+int
+trellis_pccc_decoder_combined_fs::general_work (int noutput_items,
+                        gr_vector_int &ninput_items,
+                        gr_vector_const_void_star &input_items,
+                        gr_vector_void_star &output_items)
+{
+  assert (noutput_items % d_blocklength == 0);
+  int nblocks = noutput_items / d_blocklength;
+
+  float (*p2min)(float, float) = NULL;
+  if(d_SISO_TYPE == TRELLIS_MIN_SUM)
+    p2min = &min;
+  else if(d_SISO_TYPE == TRELLIS_SUM_PRODUCT)
+    p2min = &min_star;
+
+
+  const float *in = (const float *) input_items[0];
+  short *out = (short *) output_items[0];
+  for (int n=0;n<nblocks;n++) {
+    pccc_decoder_combined(
+      d_FSMo, d_STo0, d_SToK,
+      d_FSMi, d_STi0, d_STiK,
+      d_INTERLEAVER, d_blocklength, d_repetitions,
+      p2min, 
+      d_D,d_TABLE, 
+      d_METRIC_TYPE, 
+      d_scaling,
+      &(in[n*d_blocklength*d_D]),&(out[n*d_blocklength])
+    );
+  }
+
+  consume_each (d_D * noutput_items );
+  return noutput_items;
+}
diff --git a/gr-trellis/src/lib/trellis_pccc_decoder_combined_fs.h b/gr-trellis/src/lib/trellis_pccc_decoder_combined_fs.h
new file mode 100644
index 000000000..9df827488
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_pccc_decoder_combined_fs.h
@@ -0,0 +1,124 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+// WARNING: this file is machine generated.  Edits will be over written
+
+#ifndef INCLUDED_TRELLIS_PCCC_DECODER_COMBINED_FS_H
+#define INCLUDED_TRELLIS_PCCC_DECODER_COMBINED_FS_H
+
+#include "fsm.h"
+#include "interleaver.h"
+#include <gr_block.h>
+#include <vector>
+#include "calc_metric.h"
+#include "siso_type.h"
+
+class trellis_pccc_decoder_combined_fs;
+typedef boost::shared_ptr<trellis_pccc_decoder_combined_fs> trellis_pccc_decoder_combined_fs_sptr;
+
+trellis_pccc_decoder_combined_fs_sptr trellis_make_pccc_decoder_combined_fs (
+  const fsm &FSMo, int STo0, int SToK,
+  const fsm &FSMi, int STi0, int STiK,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE, // perform "min-sum" or "sum-product" combining 
+  int D,
+  const std::vector<float> &TABLE,
+  trellis_metric_type_t METRIC_TYPE,
+  float scaling
+);
+
+
+/*!
+ *  \ingroup coding_blk
+ */
+class trellis_pccc_decoder_combined_fs : public gr_block
+{
+  fsm d_FSMo;
+  fsm d_FSMi;
+  int d_STo0;
+  int d_SToK;
+  int d_STi0;
+  int d_STiK;
+  interleaver d_INTERLEAVER;
+  int d_blocklength;
+  int d_repetitions;
+  trellis_siso_type_t d_SISO_TYPE;
+  int d_D;
+  std::vector<float> d_TABLE;
+  trellis_metric_type_t d_METRIC_TYPE;
+  float d_scaling;
+  std::vector<float> d_buffer;
+
+  friend trellis_pccc_decoder_combined_fs_sptr trellis_make_pccc_decoder_combined_fs (
+    const fsm &FSMo, int STo0, int SToK,
+    const fsm &FSMi, int STi0, int STiK,
+    const interleaver &INTERLEAVER,
+    int blocklength,
+    int repetitions,
+    trellis_siso_type_t SISO_TYPE,
+    int D,
+    const std::vector<float> &TABLE,
+    trellis_metric_type_t METRIC_TYPE,
+    float scaling
+  );
+
+  trellis_pccc_decoder_combined_fs (
+    const fsm &FSMo, int STo0, int SToK,
+    const fsm &FSMi, int STi0, int STiK,
+    const interleaver &INTERLEAVER,
+    int blocklength,
+    int repetitions,
+    trellis_siso_type_t SISO_TYPE, 
+    int D,
+    const std::vector<float> &TABLE,
+    trellis_metric_type_t METRIC_TYPE,
+    float scaling
+  );
+
+public:
+  fsm FSM1 () const { return d_FSMo; }
+  fsm FSM2 () const { return d_FSMi; }
+  int ST10 () const { return d_STo0; }
+  int ST1K () const { return d_SToK; }
+  int ST20 () const { return d_STi0; }
+  int ST2K () const { return d_STiK; }
+  interleaver INTERLEAVER () const { return d_INTERLEAVER; }
+  int blocklength () const { return d_blocklength; }
+  int repetitions () const { return d_repetitions; }
+  int D () const { return d_D; }
+  std::vector<float> TABLE () const { return d_TABLE; }
+  trellis_metric_type_t METRIC_TYPE () const { return d_METRIC_TYPE; }
+  trellis_siso_type_t SISO_TYPE () const { return d_SISO_TYPE; }
+  float scaling () const { return d_scaling; }
+  void set_scaling (float scaling);
+
+  void forecast (int noutput_items,
+                 gr_vector_int &ninput_items_required);
+  int general_work (int noutput_items,
+                    gr_vector_int &ninput_items,
+                    gr_vector_const_void_star &input_items,
+                    gr_vector_void_star &output_items);
+};
+
+#endif
diff --git a/gr-trellis/src/lib/trellis_pccc_decoder_combined_fs.i b/gr-trellis/src/lib/trellis_pccc_decoder_combined_fs.i
new file mode 100644
index 000000000..b8bbf09d6
--- /dev/null
+++ b/gr-trellis/src/lib/trellis_pccc_decoder_combined_fs.i
@@ -0,0 +1,73 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+// WARNING: this file is machine generated.  Edits will be over written
+
+GR_SWIG_BLOCK_MAGIC(trellis,pccc_decoder_combined_fs);
+
+trellis_pccc_decoder_combined_fs_sptr trellis_make_pccc_decoder_combined_fs (
+  const fsm &FSMo, int STo0, int SToK,
+  const fsm &FSMi, int STi0, int STiK,
+  const interleaver &INTERLEAVER,
+  int blocklength,
+  int repetitions,
+  trellis_siso_type_t SISO_TYPE,
+  int D,
+  const std::vector<float> &TABLE,
+  trellis_metric_type_t METRIC_TYPE,
+  float scaling
+);
+
+
+class trellis_pccc_decoder_combined_fs : public gr_block
+{
+private:
+  trellis_pccc_decoder_combined_fs (
+    const fsm &FSMo, int STo0, int SToK,
+    const fsm &FSMi, int STi0, int STiK,
+    const interleaver &INTERLEAVER,
+    int blocklength,
+    int repetitions,
+    trellis_siso_type_t SISO_TYPE,
+    int D,
+    const std::vector<float> &TABLE,
+    trellis_metric_type_t METRIC_TYPE,
+    float scaling
+  );
+
+public:
+  fsm FSM1 () const { return d_FSMo; }
+  fsm FSM2 () const { return d_FSMi; }
+  int ST10 () const { return d_STo0; }
+  int ST1K () const { return d_SToK; }
+  int ST20 () const { return d_STi0; }
+  int ST2K () const { return d_STiK; }
+  interleaver INTERLEAVER () const { return d_INTERLEAVER; }
+  int blocklength () const { return d_blocklength; }
+  int repetitions () const { return d_repetitions; }
+  int D () const { return d_D; }
+  std::vector<float> TABLE () const { return d_TABLE; }
+  trellis_metric_type_t METRIC_TYPE () const { return d_METRIC_TYPE; }
+  trellis_siso_type_t SISO_TYPE () const { return d_SISO_TYPE; }
+  float scaling() const { return d_scaling; }
+  void set_scaling (float scaling);
+};
-- 
cgit