commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] [gnuradio] 03/07: fixed a bug in pccc encoder/decoder,


From: git
Subject: [Commit-gnuradio] [gnuradio] 03/07: fixed a bug in pccc encoder/decoder, and added fsm files. Also added locks in the set_ methods
Date: Thu, 16 Oct 2014 16:14:04 +0000 (UTC)

This is an automated email from the git hooks/post-receive script.

jcorgan pushed a commit to branch master
in repository gnuradio.

commit 79d55f173046d87ae31f04ad1e6dbafe1c9ae5ca
Author: Achilleas Anastasopoulos <address@hidden>
Date:   Tue Oct 14 10:51:31 2014 -0400

    fixed a bug in pccc encoder/decoder, and added fsm files.
    Also added locks in the set_ methods
---
 gr-trellis/examples/grc/pccc.grc                   | 479 ++++++++++++---------
 gr-trellis/examples/grc/sccc.grc                   | 258 +++++------
 gr-trellis/examples/grc/turbo_equalization.grc     | 204 ++++-----
 gr-trellis/examples/python/CMakeLists.txt          |   4 +
 .../examples/python/fsm_files/awgn1o1_16rsc.fsm    |  40 ++
 .../examples/python/fsm_files/awgn1o1_4rsc.fsm     |  16 +
 .../examples/python/fsm_files/awgn1o2_16rsc.fsm    |  40 ++
 .../examples/python/fsm_files/awgn1o2_4rsc.fsm     |  14 +
 gr-trellis/include/gnuradio/trellis/encoder_XX.h.t |   8 +-
 gr-trellis/include/gnuradio/trellis/viterbi_X.h.t  |   2 +-
 gr-trellis/lib/core_algorithms.cc                  |   8 +-
 gr-trellis/lib/encoder_XX_impl.cc.t                |  19 +
 gr-trellis/lib/encoder_XX_impl.h.t                 |  12 +-
 gr-trellis/lib/metrics_X_impl.cc.t                 |   5 +
 gr-trellis/lib/pccc_decoder_combined_XX_impl.cc.t  |   2 +
 gr-trellis/lib/pccc_encoder_XX_impl.cc.t           |   2 +-
 gr-trellis/lib/permutation_impl.cc                 |   9 +
 gr-trellis/lib/permutation_impl.h                  |   2 +-
 gr-trellis/lib/sccc_decoder_combined_XX_impl.cc.t  |   2 +
 gr-trellis/lib/siso_combined_f_impl.cc             |  36 +-
 gr-trellis/lib/siso_combined_f_impl.h              |  10 +-
 gr-trellis/lib/siso_f_impl.cc                      |  23 +
 gr-trellis/lib/siso_f_impl.h                       |   6 +-
 gr-trellis/lib/viterbi_X_impl.cc.t                 |  17 +-
 gr-trellis/lib/viterbi_X_impl.h.t                  |   6 +-
 gr-trellis/lib/viterbi_combined_XX_impl.cc.t       |  35 ++
 gr-trellis/lib/viterbi_combined_XX_impl.h.t        |  10 +-
 gr-trellis/python/trellis/fsm_utils.py             |  16 +
 28 files changed, 824 insertions(+), 461 deletions(-)

diff --git a/gr-trellis/examples/grc/pccc.grc b/gr-trellis/examples/grc/pccc.grc
index 9d96603..e10c70a 100644
--- a/gr-trellis/examples/grc/pccc.grc
+++ b/gr-trellis/examples/grc/pccc.grc
@@ -69,7 +69,7 @@
     <key>variable</key>
     <param>
       <key>id</key>
-      <value>fsm2</value>
+      <value>prefix</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -77,7 +77,7 @@
     </param>
     <param>
       <key>value</key>
-      <value>trellis.fsm(prefix+"awgn1o2_4.fsm")</value>
+      <value>"@FSM_FILE_INSTALL_DIR@"</value>
     </param>
     <param>
       <key>alias</key>
@@ -85,7 +85,7 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(320, 149)</value>
+      <value>(320, 21)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -96,7 +96,7 @@
     <key>variable</key>
     <param>
       <key>id</key>
-      <value>fsm1</value>
+      <value>R</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -104,7 +104,7 @@
     </param>
     <param>
       <key>value</key>
-      <value>trellis.fsm(prefix+"awgn1o2_4.fsm")</value>
+      <value>100e3</value>
     </param>
     <param>
       <key>alias</key>
@@ -112,7 +112,7 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(320, 85)</value>
+      <value>(200, 101)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -123,7 +123,7 @@
     <key>variable</key>
     <param>
       <key>id</key>
-      <value>prefix</value>
+      <value>block</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -131,7 +131,7 @@
     </param>
     <param>
       <key>value</key>
-      <value>"@FSM_FILE_INSTALL_DIR@"</value>
+      <value>1000</value>
     </param>
     <param>
       <key>alias</key>
@@ -139,7 +139,7 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(320, 21)</value>
+      <value>(200, 37)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -150,7 +150,7 @@
     <key>variable</key>
     <param>
       <key>id</key>
-      <value>interleaver</value>
+      <value>dim</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -158,7 +158,7 @@
     </param>
     <param>
       <key>value</key>
-      <value>trellis.interleaver(block,666)</value>
+      <value>mod[0]</value>
     </param>
     <param>
       <key>alias</key>
@@ -166,7 +166,88 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(320, 213)</value>
+      <value>(688, 317)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+  </block>
+  <block>
+    <key>variable</key>
+    <param>
+      <key>id</key>
+      <value>constellation</value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>value</key>
+      <value>mod[1]</value>
+    </param>
+    <param>
+      <key>alias</key>
+      <value></value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(528, 317)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+  </block>
+  <block>
+    <key>variable</key>
+    <param>
+      <key>id</key>
+      <value>dim</value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>value</key>
+      <value>2</value>
+    </param>
+    <param>
+      <key>alias</key>
+      <value></value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(688, 189)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+  </block>
+  <block>
+    <key>variable</key>
+    <param>
+      <key>id</key>
+      <value>constellation</value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>value</key>
+      <value>-3,-3,-1,-3,1,-3,3,-3,   -3,-1,-1,-1,1,-1,3,-1,     
-3,1,-1,1,1,1,3,1,     -3,3,-1,3,1,3,3,3        </value>
+    </param>
+    <param>
+      <key>alias</key>
+      <value></value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(528, 189)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -204,7 +285,7 @@
     <key>variable</key>
     <param>
       <key>id</key>
-      <value>block</value>
+      <value>noisevar</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -212,7 +293,7 @@
     </param>
     <param>
       <key>value</key>
-      <value>1000</value>
+      <value>10**(-EsN0_dB/10.0)  * Es   /2.0</value>
     </param>
     <param>
       <key>alias</key>
@@ -220,7 +301,7 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(200, 37)</value>
+      <value>(1032, 149)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -231,7 +312,7 @@
     <key>variable</key>
     <param>
       <key>id</key>
-      <value>R</value>
+      <value>interleaver</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -239,7 +320,7 @@
     </param>
     <param>
       <key>value</key>
-      <value>10e3</value>
+      <value>trellis.interleaver(block,666)</value>
     </param>
     <param>
       <key>alias</key>
@@ -247,7 +328,7 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(200, 101)</value>
+      <value>(320, 213)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -258,7 +339,7 @@
     <key>variable</key>
     <param>
       <key>id</key>
-      <value>noisevar</value>
+      <value>fsm1</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -266,7 +347,7 @@
     </param>
     <param>
       <key>value</key>
-      <value>10**(-EsN0_dB/10.0)  * Es   /2.0</value>
+      <value>trellis.fsm(prefix+"awgn1o2_4rsc.fsm")</value>
     </param>
     <param>
       <key>alias</key>
@@ -274,7 +355,7 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(1032, 149)</value>
+      <value>(320, 85)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -285,7 +366,7 @@
     <key>variable</key>
     <param>
       <key>id</key>
-      <value>constellation</value>
+      <value>fsm2</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -293,7 +374,7 @@
     </param>
     <param>
       <key>value</key>
-      <value>-3,-3,-1,-3,1,-3,3,-3,   -3,-1,-1,-1,1,-1,3,-1,     
-3,1,-1,1,1,1,3,1,     -3,3,-1,3,1,3,3,3        </value>
+      <value>trellis.fsm(prefix+"awgn1o1_4rsc.fsm")</value>
     </param>
     <param>
       <key>alias</key>
@@ -301,7 +382,7 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(528, 189)</value>
+      <value>(320, 149)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -312,7 +393,7 @@
     <key>variable</key>
     <param>
       <key>id</key>
-      <value>dim</value>
+      <value>mod</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -320,7 +401,7 @@
     </param>
     <param>
       <key>value</key>
-      <value>2</value>
+      <value>fu.psk2x3</value>
     </param>
     <param>
       <key>alias</key>
@@ -328,7 +409,7 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(688, 189)</value>
+      <value>(576, 253)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -524,65 +605,6 @@
     </param>
   </block>
   <block>
-    <key>variable_slider</key>
-    <param>
-      <key>id</key>
-      <value>EsN0_dB</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>label</key>
-      <value>EsN0 (dB)</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>2</value>
-    </param>
-    <param>
-      <key>min</key>
-      <value>-10</value>
-    </param>
-    <param>
-      <key>max</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>num_steps</key>
-      <value>1000</value>
-    </param>
-    <param>
-      <key>style</key>
-      <value>wx.SL_HORIZONTAL</value>
-    </param>
-    <param>
-      <key>converver</key>
-      <value>float_converter</value>
-    </param>
-    <param>
-      <key>grid_pos</key>
-      <value></value>
-    </param>
-    <param>
-      <key>notebook</key>
-      <value></value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(896, 129)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
     <key>virtual_sink</key>
     <param>
       <key>id</key>
@@ -652,10 +674,10 @@
     </param>
   </block>
   <block>
-    <key>analog_random_source_x</key>
+    <key>blocks_throttle</key>
     <param>
       <key>id</key>
-      <value>analog_random_source_x_0_0</value>
+      <value>blocks_throttle_0_0</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -666,19 +688,15 @@
       <value>byte</value>
     </param>
     <param>
-      <key>min</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>max</key>
-      <value>2</value>
+      <key>samples_per_second</key>
+      <value>R</value>
     </param>
     <param>
-      <key>num_samps</key>
-      <value>1007</value>
+      <key>vlen</key>
+      <value>1</value>
     </param>
     <param>
-      <key>repeat</key>
+      <key>ignoretag</key>
       <value>True</value>
     </param>
     <param>
@@ -699,7 +717,7 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(8, 471)</value>
+      <value>(208, 492)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -707,10 +725,10 @@
     </param>
   </block>
   <block>
-    <key>blocks_throttle</key>
+    <key>analog_noise_source_x</key>
     <param>
       <key>id</key>
-      <value>blocks_throttle_0_0</value>
+      <value>analog_noise_source_x_0</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -718,19 +736,19 @@
     </param>
     <param>
       <key>type</key>
-      <value>byte</value>
+      <value>float</value>
     </param>
     <param>
-      <key>samples_per_second</key>
-      <value>R</value>
+      <key>noise_type</key>
+      <value>analog.GR_GAUSSIAN</value>
     </param>
     <param>
-      <key>vlen</key>
-      <value>1</value>
+      <key>amp</key>
+      <value>noisevar**0.5</value>
     </param>
     <param>
-      <key>ignoretag</key>
-      <value>True</value>
+      <key>seed</key>
+      <value>-42</value>
     </param>
     <param>
       <key>alias</key>
@@ -750,7 +768,7 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(208, 492)</value>
+      <value>(656, 646)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -758,33 +776,25 @@
     </param>
   </block>
   <block>
-    <key>digital_chunks_to_symbols_xx</key>
+    <key>blocks_add_xx</key>
     <param>
       <key>id</key>
-      <value>digital_chunks_to_symbols_xx_0</value>
+      <value>blocks_add_xx_1</value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
-      <key>in_type</key>
-      <value>byte</value>
-    </param>
-    <param>
-      <key>out_type</key>
+      <key>type</key>
       <value>float</value>
     </param>
     <param>
-      <key>symbol_table</key>
-      <value>constellation</value>
-    </param>
-    <param>
-      <key>dimension</key>
+      <key>num_inputs</key>
       <value>2</value>
     </param>
     <param>
-      <key>num_ports</key>
+      <key>vlen</key>
       <value>1</value>
     </param>
     <param>
@@ -805,7 +815,7 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(632, 485)</value>
+      <value>(880, 552)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -813,10 +823,60 @@
     </param>
   </block>
   <block>
-    <key>analog_noise_source_x</key>
+    <key>virtual_sink</key>
     <param>
       <key>id</key>
-      <value>analog_noise_source_x_0</value>
+      <value>virtual_sink_0</value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>stream_id</key>
+      <value>observation</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(896, 676)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+  </block>
+  <block>
+    <key>import</key>
+    <param>
+      <key>id</key>
+      <value>import_0_0</value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>import</key>
+      <value>import gnuradio.trellis.fsm_utils as fu</value>
+    </param>
+    <param>
+      <key>alias</key>
+      <value></value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(48, 132)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+  </block>
+  <block>
+    <key>trellis_pccc_encoder_xx</key>
+    <param>
+      <key>id</key>
+      <value>trellis_pccc_encoder_xx_0</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -824,19 +884,31 @@
     </param>
     <param>
       <key>type</key>
-      <value>float</value>
+      <value>bb</value>
     </param>
     <param>
-      <key>noise_type</key>
-      <value>analog.GR_GAUSSIAN</value>
+      <key>o_fsm_args</key>
+      <value>fsm1</value>
     </param>
     <param>
-      <key>amp</key>
-      <value>noisevar**0.5</value>
+      <key>o_init_state</key>
+      <value>0</value>
     </param>
     <param>
-      <key>seed</key>
-      <value>-42</value>
+      <key>i_fsm_args</key>
+      <value>fsm2</value>
+    </param>
+    <param>
+      <key>i_init_state</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>interleaver_args</key>
+      <value>interleaver</value>
+    </param>
+    <param>
+      <key>bl</key>
+      <value>block</value>
     </param>
     <param>
       <key>alias</key>
@@ -856,7 +928,7 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(656, 646)</value>
+      <value>(400, 457)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -864,25 +936,33 @@
     </param>
   </block>
   <block>
-    <key>blocks_add_xx</key>
+    <key>digital_chunks_to_symbols_xx</key>
     <param>
       <key>id</key>
-      <value>blocks_add_xx_1</value>
+      <value>digital_chunks_to_symbols_xx_0</value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
-      <key>type</key>
+      <key>in_type</key>
+      <value>byte</value>
+    </param>
+    <param>
+      <key>out_type</key>
       <value>float</value>
     </param>
     <param>
-      <key>num_inputs</key>
-      <value>2</value>
+      <key>symbol_table</key>
+      <value>constellation</value>
     </param>
     <param>
-      <key>vlen</key>
+      <key>dimension</key>
+      <value>dim</value>
+    </param>
+    <param>
+      <key>num_ports</key>
       <value>1</value>
     </param>
     <param>
@@ -903,7 +983,7 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(880, 552)</value>
+      <value>(632, 485)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -911,22 +991,54 @@
     </param>
   </block>
   <block>
-    <key>virtual_sink</key>
+    <key>analog_random_source_x</key>
     <param>
       <key>id</key>
-      <value>virtual_sink_0</value>
+      <value>analog_random_source_x_0_0</value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
-      <key>stream_id</key>
-      <value>observation</value>
+      <key>type</key>
+      <value>byte</value>
+    </param>
+    <param>
+      <key>min</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>max</key>
+      <value>2</value>
+    </param>
+    <param>
+      <key>num_samps</key>
+      <value>block</value>
+    </param>
+    <param>
+      <key>repeat</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>alias</key>
+      <value></value>
+    </param>
+    <param>
+      <key>affinity</key>
+      <value></value>
+    </param>
+    <param>
+      <key>minoutbuf</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>maxoutbuf</key>
+      <value>0</value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(896, 676)</value>
+      <value>(8, 471)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -934,62 +1046,58 @@
     </param>
   </block>
   <block>
-    <key>trellis_pccc_encoder_xx</key>
+    <key>variable_slider</key>
     <param>
       <key>id</key>
-      <value>trellis_pccc_encoder_xx_0</value>
+      <value>EsN0_dB</value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
-      <key>type</key>
-      <value>bb</value>
+      <key>label</key>
+      <value>EsN0 (dB)</value>
     </param>
     <param>
-      <key>o_fsm_args</key>
-      <value>fsm1</value>
+      <key>value</key>
+      <value>2</value>
     </param>
     <param>
-      <key>o_init_state</key>
-      <value>0</value>
+      <key>min</key>
+      <value>-10</value>
     </param>
     <param>
-      <key>i_fsm_args</key>
-      <value>fsm2</value>
+      <key>max</key>
+      <value>20</value>
     </param>
     <param>
-      <key>i_init_state</key>
-      <value>0</value>
+      <key>num_steps</key>
+      <value>1000</value>
     </param>
     <param>
-      <key>interleaver_args</key>
-      <value>interleaver</value>
+      <key>style</key>
+      <value>wx.SL_HORIZONTAL</value>
     </param>
     <param>
-      <key>bl</key>
-      <value>block</value>
+      <key>converver</key>
+      <value>float_converter</value>
     </param>
     <param>
-      <key>alias</key>
+      <key>grid_pos</key>
       <value></value>
     </param>
     <param>
-      <key>affinity</key>
+      <key>notebook</key>
       <value></value>
     </param>
     <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
+      <key>alias</key>
+      <value></value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(400, 457)</value>
+      <value>(896, 129)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -1052,7 +1160,7 @@
     </param>
     <param>
       <key>dim</key>
-      <value>2</value>
+      <value>dim</value>
     </param>
     <param>
       <key>table</key>
@@ -1064,11 +1172,11 @@
     </param>
     <param>
       <key>siso_type</key>
-      <value>trellis.TRELLIS_SUM_PRODUCT</value>
+      <value>trellis.TRELLIS_MIN_SUM</value>
     </param>
     <param>
       <key>scaling</key>
-      <value>1.0/noisevar</value>
+      <value>0.5/noisevar</value>
     </param>
     <param>
       <key>alias</key>
@@ -1095,33 +1203,6 @@
       <value>0</value>
     </param>
   </block>
-  <block>
-    <key>import</key>
-    <param>
-      <key>id</key>
-      <value>import_0_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>import</key>
-      <value>import gnuradio.trellis.fsm_utils as fu</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(48, 132)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
   <connection>
     <source_block_id>digital_chunks_to_symbols_xx_0</source_block_id>
     <sink_block_id>blocks_add_xx_1</sink_block_id>
diff --git a/gr-trellis/examples/grc/sccc.grc b/gr-trellis/examples/grc/sccc.grc
index 0bcaa6c..f31f3ce 100644
--- a/gr-trellis/examples/grc/sccc.grc
+++ b/gr-trellis/examples/grc/sccc.grc
@@ -69,33 +69,6 @@
     <key>variable</key>
     <param>
       <key>id</key>
-      <value>mod</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>fu.psk2x3</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(632, 101)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>variable</key>
-    <param>
-      <key>id</key>
       <value>prefix</value>
     </param>
     <param>
@@ -123,7 +96,7 @@
     <key>variable</key>
     <param>
       <key>id</key>
-      <value>R</value>
+      <value>mod</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -131,7 +104,7 @@
     </param>
     <param>
       <key>value</key>
-      <value>10e3</value>
+      <value>fu.psk2x3</value>
     </param>
     <param>
       <key>alias</key>
@@ -139,7 +112,7 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(224, 93)</value>
+      <value>(632, 101)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -363,6 +336,33 @@
     </param>
   </block>
   <block>
+    <key>variable</key>
+    <param>
+      <key>id</key>
+      <value>R</value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>value</key>
+      <value>100e3</value>
+    </param>
+    <param>
+      <key>alias</key>
+      <value></value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(224, 93)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+  </block>
+  <block>
     <key>import</key>
     <param>
       <key>id</key>
@@ -855,105 +855,6 @@
     </param>
   </block>
   <block>
-    <key>trellis_sccc_decoder_combined_xx</key>
-    <param>
-      <key>id</key>
-      <value>trellis_sccc_decoder_combined_xx_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>type</key>
-      <value>f</value>
-    </param>
-    <param>
-      <key>out_type</key>
-      <value>b</value>
-    </param>
-    <param>
-      <key>o_fsm_args</key>
-      <value>fsm_o</value>
-    </param>
-    <param>
-      <key>o_init_state</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>o_final_state</key>
-      <value>-1</value>
-    </param>
-    <param>
-      <key>i_fsm_args</key>
-      <value>fsm_i</value>
-    </param>
-    <param>
-      <key>i_init_state</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>i_final_state</key>
-      <value>-1</value>
-    </param>
-    <param>
-      <key>interleaver</key>
-      <value>interleaver</value>
-    </param>
-    <param>
-      <key>block_size</key>
-      <value>block</value>
-    </param>
-    <param>
-      <key>iterations</key>
-      <value>5</value>
-    </param>
-    <param>
-      <key>dim</key>
-      <value>dim</value>
-    </param>
-    <param>
-      <key>table</key>
-      <value>constellation</value>
-    </param>
-    <param>
-      <key>metric_type</key>
-      <value>digital.TRELLIS_EUCLIDEAN</value>
-    </param>
-    <param>
-      <key>siso_type</key>
-      <value>trellis.TRELLIS_SUM_PRODUCT</value>
-    </param>
-    <param>
-      <key>scaling</key>
-      <value>1.0/noisevar</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(400, 745)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
     <key>analog_noise_source_x</key>
     <param>
       <key>id</key>
@@ -1176,6 +1077,105 @@
       <value>0</value>
     </param>
   </block>
+  <block>
+    <key>trellis_sccc_decoder_combined_xx</key>
+    <param>
+      <key>id</key>
+      <value>trellis_sccc_decoder_combined_xx_0</value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>type</key>
+      <value>f</value>
+    </param>
+    <param>
+      <key>out_type</key>
+      <value>b</value>
+    </param>
+    <param>
+      <key>o_fsm_args</key>
+      <value>fsm_o</value>
+    </param>
+    <param>
+      <key>o_init_state</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>o_final_state</key>
+      <value>-1</value>
+    </param>
+    <param>
+      <key>i_fsm_args</key>
+      <value>fsm_i</value>
+    </param>
+    <param>
+      <key>i_init_state</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>i_final_state</key>
+      <value>-1</value>
+    </param>
+    <param>
+      <key>interleaver</key>
+      <value>interleaver</value>
+    </param>
+    <param>
+      <key>block_size</key>
+      <value>block</value>
+    </param>
+    <param>
+      <key>iterations</key>
+      <value>5</value>
+    </param>
+    <param>
+      <key>dim</key>
+      <value>dim</value>
+    </param>
+    <param>
+      <key>table</key>
+      <value>constellation</value>
+    </param>
+    <param>
+      <key>metric_type</key>
+      <value>digital.TRELLIS_EUCLIDEAN</value>
+    </param>
+    <param>
+      <key>siso_type</key>
+      <value>trellis.TRELLIS_MIN_SUM</value>
+    </param>
+    <param>
+      <key>scaling</key>
+      <value>1.0/noisevar</value>
+    </param>
+    <param>
+      <key>alias</key>
+      <value></value>
+    </param>
+    <param>
+      <key>affinity</key>
+      <value></value>
+    </param>
+    <param>
+      <key>minoutbuf</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>maxoutbuf</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(400, 745)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+  </block>
   <connection>
     <source_block_id>analog_noise_source_x_0</source_block_id>
     <sink_block_id>blocks_add_xx_1</sink_block_id>
diff --git a/gr-trellis/examples/grc/turbo_equalization.grc 
b/gr-trellis/examples/grc/turbo_equalization.grc
index b2c3b20..c83c59d 100644
--- a/gr-trellis/examples/grc/turbo_equalization.grc
+++ b/gr-trellis/examples/grc/turbo_equalization.grc
@@ -3,18 +3,54 @@
 <flow_graph>
   <timestamp>Wed Oct  1 11:04:18 2014</timestamp>
   <block>
-    <key>variable</key>
+    <key>options</key>
     <param>
       <key>id</key>
-      <value>fsm_i</value>
+      <value>turbo_equalization</value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
-      <key>value</key>
-      <value>trellis.fsm(len(modulation[1]),len(channel))</value>
+      <key>title</key>
+      <value>Hard/Soft/Turbo Equalization</value>
+    </param>
+    <param>
+      <key>author</key>
+      <value>AA</value>
+    </param>
+    <param>
+      <key>description</key>
+      <value>gnuradio flow graph</value>
+    </param>
+    <param>
+      <key>window_size</key>
+      <value>2048, 3048</value>
+    </param>
+    <param>
+      <key>generate_options</key>
+      <value>wx_gui</value>
+    </param>
+    <param>
+      <key>category</key>
+      <value>Custom</value>
+    </param>
+    <param>
+      <key>run_options</key>
+      <value>prompt</value>
+    </param>
+    <param>
+      <key>run</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>max_nouts</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>realtime_scheduling</key>
+      <value></value>
     </param>
     <param>
       <key>alias</key>
@@ -22,7 +58,7 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(320, 293)</value>
+      <value>(10, 10)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -33,7 +69,7 @@
     <key>variable</key>
     <param>
       <key>id</key>
-      <value>prefix</value>
+      <value>fsm_o</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -41,7 +77,7 @@
     </param>
     <param>
       <key>value</key>
-      <value>"@FSM_FILE_INSTALL_DIR@"</value>
+      <value>trellis.fsm(prefix+"/awgn1o2_4.fsm")</value>
     </param>
     <param>
       <key>alias</key>
@@ -49,7 +85,7 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(768, 21)</value>
+      <value>(344, 21)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -60,7 +96,7 @@
     <key>variable</key>
     <param>
       <key>id</key>
-      <value>tot_mod</value>
+      <value>block_b</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -68,7 +104,7 @@
     </param>
     <param>
       <key>value</key>
-      <value>fu.make_isi_lookup(modulation,channel,False)</value>
+      <value>bpsym*1000</value>
     </param>
     <param>
       <key>alias</key>
@@ -76,7 +112,7 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(320, 381)</value>
+      <value>(216, 21)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -87,7 +123,7 @@
     <key>variable</key>
     <param>
       <key>id</key>
-      <value>R</value>
+      <value>interleaver</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -95,7 +131,7 @@
     </param>
     <param>
       <key>value</key>
-      <value>100e3</value>
+      <value>trellis.interleaver(block_b/bpsym,666)</value>
     </param>
     <param>
       <key>alias</key>
@@ -103,7 +139,7 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(216, 109)</value>
+      <value>(528, 117)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -114,7 +150,7 @@
     <key>variable</key>
     <param>
       <key>id</key>
-      <value>modulation</value>
+      <value>Es</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -122,7 +158,7 @@
     </param>
     <param>
       <key>value</key>
-      <value>fu.pam4</value>
+      <value>numpy.mean((numpy.square(numpy.abs(tot_mod[1]))))</value>
     </param>
     <param>
       <key>alias</key>
@@ -130,7 +166,7 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(320, 117)</value>
+      <value>(776, 181)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -141,7 +177,7 @@
     <key>variable</key>
     <param>
       <key>id</key>
-      <value>channel</value>
+      <value>noisevar</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -149,7 +185,7 @@
     </param>
     <param>
       <key>value</key>
-      <value>fu.c_channel</value>
+      <value>10**(-EsN0_dB/10.0)  * Es   /2.0</value>
     </param>
     <param>
       <key>alias</key>
@@ -157,7 +193,7 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(320, 205)</value>
+      <value>(1080, 181)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -195,7 +231,7 @@
     <key>variable</key>
     <param>
       <key>id</key>
-      <value>noisevar</value>
+      <value>channel</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -203,7 +239,7 @@
     </param>
     <param>
       <key>value</key>
-      <value>10**(-EsN0_dB/10.0)  * Es   /2.0</value>
+      <value>fu.c_channel</value>
     </param>
     <param>
       <key>alias</key>
@@ -211,7 +247,7 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(1080, 181)</value>
+      <value>(320, 205)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -222,7 +258,7 @@
     <key>variable</key>
     <param>
       <key>id</key>
-      <value>Es</value>
+      <value>modulation</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -230,7 +266,7 @@
     </param>
     <param>
       <key>value</key>
-      <value>numpy.mean((numpy.square(numpy.abs(tot_mod[1]))))</value>
+      <value>fu.pam4</value>
     </param>
     <param>
       <key>alias</key>
@@ -238,7 +274,7 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(776, 181)</value>
+      <value>(320, 117)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -249,7 +285,7 @@
     <key>variable</key>
     <param>
       <key>id</key>
-      <value>interleaver</value>
+      <value>R</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -257,7 +293,7 @@
     </param>
     <param>
       <key>value</key>
-      <value>trellis.interleaver(block_b/bpsym,666)</value>
+      <value>100e3</value>
     </param>
     <param>
       <key>alias</key>
@@ -265,7 +301,7 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(528, 117)</value>
+      <value>(216, 109)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -276,7 +312,7 @@
     <key>variable</key>
     <param>
       <key>id</key>
-      <value>fsm_o</value>
+      <value>tot_mod</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -284,7 +320,7 @@
     </param>
     <param>
       <key>value</key>
-      <value>trellis.fsm(prefix+"/awgn1o2_4.fsm")</value>
+      <value>fu.make_isi_lookup(modulation,channel,False)</value>
     </param>
     <param>
       <key>alias</key>
@@ -292,7 +328,7 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(328, 29)</value>
+      <value>(320, 381)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -303,7 +339,7 @@
     <key>variable</key>
     <param>
       <key>id</key>
-      <value>block_b</value>
+      <value>prefix</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -311,7 +347,7 @@
     </param>
     <param>
       <key>value</key>
-      <value>bpsym*1000</value>
+      <value>"@FSM_FILE_INSTALL_DIR@"</value>
     </param>
     <param>
       <key>alias</key>
@@ -319,7 +355,34 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(216, 21)</value>
+      <value>(768, 21)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+  </block>
+  <block>
+    <key>variable</key>
+    <param>
+      <key>id</key>
+      <value>fsm_i</value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>value</key>
+      <value>trellis.fsm(len(modulation[1]),len(channel))</value>
+    </param>
+    <param>
+      <key>alias</key>
+      <value></value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(320, 293)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -880,6 +943,14 @@
       <value>0</value>
     </param>
     <param>
+      <key>blockwise</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>blocklength</key>
+      <value>0</value>
+    </param>
+    <param>
       <key>alias</key>
       <value></value>
     </param>
@@ -2334,69 +2405,6 @@
     </param>
   </block>
   <block>
-    <key>options</key>
-    <param>
-      <key>id</key>
-      <value>turbo_equalization</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>title</key>
-      <value>Hard/Soft/Turbo Equalization</value>
-    </param>
-    <param>
-      <key>author</key>
-      <value>AA</value>
-    </param>
-    <param>
-      <key>description</key>
-      <value>gnuradio flow graph</value>
-    </param>
-    <param>
-      <key>window_size</key>
-      <value>2048, 3048</value>
-    </param>
-    <param>
-      <key>generate_options</key>
-      <value>wx_gui</value>
-    </param>
-    <param>
-      <key>category</key>
-      <value>Custom</value>
-    </param>
-    <param>
-      <key>run_options</key>
-      <value>prompt</value>
-    </param>
-    <param>
-      <key>run</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>max_nouts</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>realtime_scheduling</key>
-      <value></value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(10, 10)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
     <key>blocks_unpack_k_bits_bb</key>
     <param>
       <key>id</key>
diff --git a/gr-trellis/examples/python/CMakeLists.txt 
b/gr-trellis/examples/python/CMakeLists.txt
index 0e27a95..8a05525 100644
--- a/gr-trellis/examples/python/CMakeLists.txt
+++ b/gr-trellis/examples/python/CMakeLists.txt
@@ -35,9 +35,13 @@ install(
 
 install(
     FILES
+    fsm_files/awgn1o1_16rsc.fsm
+    fsm_files/awgn1o1_4rsc.fsm
     fsm_files/awgn1o2_128.fsm
     fsm_files/awgn1o2_16.fsm
+    fsm_files/awgn1o2_16rsc.fsm
     fsm_files/awgn1o2_4.fsm
+    fsm_files/awgn1o2_4rsc.fsm
     fsm_files/awgn1o2_8.fsm
     fsm_files/awgn2o3_16.fsm
     fsm_files/awgn2o3_16ungerboecka.fsm
diff --git a/gr-trellis/examples/python/fsm_files/awgn1o1_16rsc.fsm 
b/gr-trellis/examples/python/fsm_files/awgn1o1_16rsc.fsm
new file mode 100644
index 0000000..f82d605
--- /dev/null
+++ b/gr-trellis/examples/python/fsm_files/awgn1o1_16rsc.fsm
@@ -0,0 +1,40 @@
+2 16 2
+
+0      8
+8      0
+1      9
+9      1
+2      10
+10     2
+3      11
+11     3
+12     4
+4      12
+13     5
+5      13
+14     6
+6      14
+15     7
+7      15
+
+
+0      1
+0      1
+1      0
+1      0
+1      0
+1      0
+0      1
+0      1
+1      0
+1      0
+0      1
+0      1
+0      1
+0      1
+1      0
+1      0
+
+Recursive Systematic Codes(RSC)
+GM1o2_16rsc=[1, 1+D+D^4/1+D^2+D^3+D^4] = [1, 27/31] (in decimal);
+
diff --git a/gr-trellis/examples/python/fsm_files/awgn1o1_4rsc.fsm 
b/gr-trellis/examples/python/fsm_files/awgn1o1_4rsc.fsm
new file mode 100644
index 0000000..d5e7fe3
--- /dev/null
+++ b/gr-trellis/examples/python/fsm_files/awgn1o1_4rsc.fsm
@@ -0,0 +1,16 @@
+2 4 2
+
+0 2
+2 0
+1 3
+3 1
+
+0 1
+0 1
+1 0
+1 0
+
+
+Recursive Systematic Codes(RSC)
+GM1o2_4rsc=[1, 1+D+D^2/1+D^2] = [1, 7/5] (in decimal);
+without the systematic bit
diff --git a/gr-trellis/examples/python/fsm_files/awgn1o2_16rsc.fsm 
b/gr-trellis/examples/python/fsm_files/awgn1o2_16rsc.fsm
new file mode 100644
index 0000000..ccf1f1d
--- /dev/null
+++ b/gr-trellis/examples/python/fsm_files/awgn1o2_16rsc.fsm
@@ -0,0 +1,40 @@
+2 16 4
+
+0      8
+8      0
+1      9
+9      1
+2      10
+10     2
+3      11
+11     3
+12     4
+4      12
+13     5
+5      13
+14     6
+6      14
+15     7
+7      15
+
+
+0      3
+0      3
+1      2
+1      2
+1      2
+1      2
+0      3
+0      3
+1      2
+1      2
+0      3
+0      3
+0      3
+0      3
+1      2
+1      2
+
+Recursive Systematic Codes(RSC)
+GM1o2_16rsc=[1, 1+D+D^4/1+D^2+D^3+D^4] = [1, 27/31] (in decimal);
+
diff --git a/gr-trellis/examples/python/fsm_files/awgn1o2_4rsc.fsm 
b/gr-trellis/examples/python/fsm_files/awgn1o2_4rsc.fsm
new file mode 100644
index 0000000..adb500a
--- /dev/null
+++ b/gr-trellis/examples/python/fsm_files/awgn1o2_4rsc.fsm
@@ -0,0 +1,14 @@
+2 4 4
+
+0 2
+2 0
+1 3
+3 1
+
+0 3
+0 3
+1 2
+1 2
+
+Recursive Systematic Codes(RSC)
+GM1o2_4rsc=[1, 1+D+D^2/1+D^2] = [1, 7/5] (in decimal);
diff --git a/gr-trellis/include/gnuradio/trellis/encoder_XX.h.t 
b/gr-trellis/include/gnuradio/trellis/encoder_XX.h.t
index f767510..affd62f 100644
--- a/gr-trellis/include/gnuradio/trellis/encoder_XX.h.t
+++ b/gr-trellis/include/gnuradio/trellis/encoder_XX.h.t
@@ -46,10 +46,10 @@ namespace gr {
 
       static sptr make(const fsm &FSM, int ST, int K);
 
-      virtual fsm FSM() = 0;
-      virtual int ST() = 0;
-      virtual int K() = 0;
-      virtual void set_FSM(fsm &FSM) =0;
+      virtual fsm FSM() const = 0;
+      virtual int ST() const = 0;
+      virtual int K() const = 0;
+      virtual void set_FSM(const fsm &FSM) =0;
       virtual void set_ST(int ST) =0;
       virtual void set_K(int K) =0;
     };
diff --git a/gr-trellis/include/gnuradio/trellis/viterbi_X.h.t 
b/gr-trellis/include/gnuradio/trellis/viterbi_X.h.t
index 6101227..252ffb7 100644
--- a/gr-trellis/include/gnuradio/trellis/viterbi_X.h.t
+++ b/gr-trellis/include/gnuradio/trellis/viterbi_X.h.t
@@ -50,7 +50,7 @@ namespace gr {
       virtual int S0()  const = 0;
       virtual int SK()  const = 0;
 
-      virtual void set_FSM(fsm &FSM) =0;
+      virtual void set_FSM(const fsm &FSM) =0;
       virtual void set_K(int K) =0;
       virtual void set_S0(int S0) =0;
       virtual void set_SK(int SK) =0;
diff --git a/gr-trellis/lib/core_algorithms.cc 
b/gr-trellis/lib/core_algorithms.cc
index eb32b65..b26ee33 100644
--- a/gr-trellis/lib/core_algorithms.cc
+++ b/gr-trellis/lib/core_algorithms.cc
@@ -1216,17 +1216,17 @@ namespace gr {
       for(int k=0;k<blocklength;k++) {
        //std::cout << k << std::endl;
        for(int i=0;i<FSM1.O();i++) {
-         float x=cprioro[k*FSM1.O()*FSM2.O()+i*FSM1.O()+0];
+         float x=cprioro[k*O+i*FSM2.O()+0];
          for(int j=1;j<FSM2.O();j++)
-           x = (*p2mymin)(x,cprioro[k*FSM1.O()*FSM2.O()+i*FSM1.O()+j]);
+           x = (*p2mymin)(x,cprioro[k*O+i*FSM2.O()+j]);
          prioro1[k*FSM1.O()+i]=x;
          //std::cout <<  prioro1[k*FSM1.O()+i] << ", ";
        }
        //std::cout << std::endl;
        for(int i=0;i<FSM2.O();i++) {
-         float x=cprioro[k*FSM1.O()*FSM2.O()+0*FSM1.O()+i];
+         float x=cprioro[k*O+0*FSM2.O()+i];
          for(int j=1;j<FSM1.O();j++)
-           x = (*p2mymin)(x,cprioro[k*FSM1.O()*FSM2.O()+j*FSM1.O()+i]);
+           x = (*p2mymin)(x,cprioro[k*O+j*FSM2.O()+i]);
          prioro2[k*FSM2.O()+i]=x;
        }
       }
diff --git a/gr-trellis/lib/encoder_XX_impl.cc.t 
b/gr-trellis/lib/encoder_XX_impl.cc.t
index f2e1992..3a004a2 100644
--- a/gr-trellis/lib/encoder_XX_impl.cc.t
+++ b/gr-trellis/lib/encoder_XX_impl.cc.t
@@ -58,6 +58,24 @@ namespace gr {
     {
     }
 
+    void @IMPL_NAME@::set_FSM(const fsm &FSM) 
+    { 
+      gr::thread::scoped_lock guard(d_setlock);
+      d_FSM = FSM; 
+    }
+
+    void @IMPL_NAME@::set_ST(int ST) 
+    { 
+      gr::thread::scoped_lock guard(d_setlock);
+      d_ST = ST; 
+    }
+
+    void @IMPL_NAME@::set_K(int K) 
+    { 
+      gr::thread::scoped_lock guard(d_setlock);
+      d_K = K; 
+    }
+
     @IMPL_NAME@::address@hidden@()
     {
     }
@@ -67,6 +85,7 @@ namespace gr {
                      gr_vector_const_void_star &input_items,
                      gr_vector_void_star &output_items)
     {
+      gr::thread::scoped_lock guard(d_setlock);
       int ST_tmp = 0;
 
       if (d_B){ // blockwise operation
diff --git a/gr-trellis/lib/encoder_XX_impl.h.t 
b/gr-trellis/lib/encoder_XX_impl.h.t
index 69f853d..2b0ff31 100644
--- a/gr-trellis/lib/encoder_XX_impl.h.t
+++ b/gr-trellis/lib/encoder_XX_impl.h.t
@@ -43,12 +43,12 @@ namespace gr {
       @IMPL_NAME@(const fsm &FSM, int ST, int K, bool B);
       address@hidden@();
 
-      fsm FSM() { return d_FSM;; }
-      int ST() {  return d_ST; }
-      int K() {  return d_K; }
-      void set_FSM(fsm &FSM) { d_FSM = FSM; }
-      void set_ST(int ST) { d_ST = ST; }
-      void set_K(int K) { d_K = K; }
+      fsm FSM() const { return d_FSM;; }
+      int ST() const {  return d_ST; }
+      int K() const {  return d_K; }
+      void set_FSM(const fsm &FSM);
+      void set_ST(int ST);
+      void set_K(int K);
       int work(int noutput_items,
               gr_vector_const_void_star &input_items,
               gr_vector_void_star &output_items);
diff --git a/gr-trellis/lib/metrics_X_impl.cc.t 
b/gr-trellis/lib/metrics_X_impl.cc.t
index 2b811de..5e74e4b 100644
--- a/gr-trellis/lib/metrics_X_impl.cc.t
+++ b/gr-trellis/lib/metrics_X_impl.cc.t
@@ -56,6 +56,7 @@ namespace gr {
 
     void @IMPL_NAME@::set_O(int O)
     { 
+      gr::thread::scoped_lock guard(d_setlock);
       d_O = O; 
       set_relative_rate (1.0 * d_O / ((double) d_D));
       set_output_multiple ((int)d_O);
@@ -63,6 +64,7 @@ namespace gr {
 
     void @IMPL_NAME@::set_D(int D)
     { 
+      gr::thread::scoped_lock guard(d_setlock);
       d_D = D; 
       set_relative_rate (1.0 * d_O / ((double) d_D));
     }
@@ -70,12 +72,14 @@ namespace gr {
     void
     @IMPL_NAME@::set_TYPE(digital::trellis_metric_type_t type)
     {
+      gr::thread::scoped_lock guard(d_setlock);
       d_TYPE = type;
     }
 
     void
     @IMPL_NAME@::set_TABLE(const std::vector<@I_TYPE@> &table)
     {
+      gr::thread::scoped_lock guard(d_setlock);
       d_TABLE = table;
     }
 
@@ -99,6 +103,7 @@ namespace gr {
                              gr_vector_const_void_star &input_items,
                              gr_vector_void_star &output_items)
     {
+      gr::thread::scoped_lock guard(d_setlock);
       int nstreams = input_items.size();
 
       for(int m = 0; m < nstreams; m++) {
diff --git a/gr-trellis/lib/pccc_decoder_combined_XX_impl.cc.t 
b/gr-trellis/lib/pccc_decoder_combined_XX_impl.cc.t
index 15ea3ce..5b3cdee 100644
--- a/gr-trellis/lib/pccc_decoder_combined_XX_impl.cc.t
+++ b/gr-trellis/lib/pccc_decoder_combined_XX_impl.cc.t
@@ -90,6 +90,7 @@ namespace gr {
     void
     @IMPL_NAME@::set_scaling(float scaling)
     {
+      gr::thread::scoped_lock guard(d_setlock);
       d_scaling = scaling;
     }
 
@@ -109,6 +110,7 @@ namespace gr {
                              gr_vector_const_void_star &input_items,
                              gr_vector_void_star &output_items)
     {
+      gr::thread::scoped_lock guard(d_setlock);
       int nblocks = noutput_items / d_blocklength;
 
       float (*p2min)(float, float) = NULL;
diff --git a/gr-trellis/lib/pccc_encoder_XX_impl.cc.t 
b/gr-trellis/lib/pccc_encoder_XX_impl.cc.t
index 119bff6..8fd143c 100644
--- a/gr-trellis/lib/pccc_encoder_XX_impl.cc.t
+++ b/gr-trellis/lib/pccc_encoder_XX_impl.cc.t
@@ -81,7 +81,7 @@ namespace gr {
          ST1_tmp = (int) d_FSM1.NS()[ST1_tmp*d_FSM1.I()+in[i]];
          int o2 = d_FSM2.OS()[ST2_tmp*d_FSM2.I()+in[k]];
          ST2_tmp = (int) d_FSM2.NS()[ST2_tmp*d_FSM2.I()+in[k]];
-         out[i] = (@O_TYPE@) (o1*d_FSM1.O() + o2);
+         out[i] = (@O_TYPE@) (o1*d_FSM2.O() + o2);
        }
       }
       return noutput_items;
diff --git a/gr-trellis/lib/permutation_impl.cc 
b/gr-trellis/lib/permutation_impl.cc
index 0d9d359..2fe0ea8 100644
--- a/gr-trellis/lib/permutation_impl.cc
+++ b/gr-trellis/lib/permutation_impl.cc
@@ -55,12 +55,20 @@ namespace gr {
 
     void permutation_impl::set_K(int K)
     {
+      gr::thread::scoped_lock guard(d_setlock);
       d_K=K;
       set_output_multiple(d_K*d_SYMS_PER_BLOCK);
     }
 
+    void permutation_impl::set_TABLE (const std::vector<int> &table) 
+    {
+      gr::thread::scoped_lock guard(d_setlock);
+      d_TABLE = table; 
+    }
+
     void permutation_impl::set_SYMS_PER_BLOCK(int spb)
     {
+      gr::thread::scoped_lock guard(d_setlock);
       d_SYMS_PER_BLOCK=spb;
       set_output_multiple(d_K*d_SYMS_PER_BLOCK);
     }
@@ -74,6 +82,7 @@ namespace gr {
                           gr_vector_const_void_star &input_items,
                           gr_vector_void_star &output_items)
     {
+      gr::thread::scoped_lock guard(d_setlock);
       int nstreams = input_items.size();
 
       for(int m=0;m<nstreams;m++) {
diff --git a/gr-trellis/lib/permutation_impl.h 
b/gr-trellis/lib/permutation_impl.h
index 5c74fba..e013e52 100644
--- a/gr-trellis/lib/permutation_impl.h
+++ b/gr-trellis/lib/permutation_impl.h
@@ -48,7 +48,7 @@ namespace gr {
       size_t BYTES_PER_SYMBOL() const { return d_BYTES_PER_SYMBOL; }
 
       void set_K(int K) ;
-      void set_TABLE (const std::vector<int> &table) {d_TABLE = table; }
+      void set_TABLE (const std::vector<int> &table);
       void set_SYMS_PER_BLOCK(int spb) ;
 
       int work(int noutput_items,
diff --git a/gr-trellis/lib/sccc_decoder_combined_XX_impl.cc.t 
b/gr-trellis/lib/sccc_decoder_combined_XX_impl.cc.t
index 4acc560..f66b1f3 100644
--- a/gr-trellis/lib/sccc_decoder_combined_XX_impl.cc.t
+++ b/gr-trellis/lib/sccc_decoder_combined_XX_impl.cc.t
@@ -89,6 +89,7 @@ namespace gr {
     void
     @IMPL_NAME@::set_scaling(float scaling)
     {
+      gr::thread::scoped_lock guard(d_setlock);
       d_scaling = scaling;
     }
 
@@ -108,6 +109,7 @@ namespace gr {
                              gr_vector_const_void_star &input_items,
                              gr_vector_void_star &output_items)
     {
+      gr::thread::scoped_lock guard(d_setlock);
       int nblocks = noutput_items / d_blocklength;
       float (*p2min)(float, float) = NULL;
 
diff --git a/gr-trellis/lib/siso_combined_f_impl.cc 
b/gr-trellis/lib/siso_combined_f_impl.cc
index f9e8e28..3b89684 100644
--- a/gr-trellis/lib/siso_combined_f_impl.cc
+++ b/gr-trellis/lib/siso_combined_f_impl.cc
@@ -96,35 +96,68 @@ namespace gr {
 
     void siso_combined_f_impl::set_FSM(const fsm &FSM)
     {
+      gr::thread::scoped_lock guard(d_setlock); 
       d_FSM=FSM;
       recalculate();
     }
 
     void siso_combined_f_impl::set_K(int K)
     {
+      gr::thread::scoped_lock guard(d_setlock); 
       d_K=K;
       recalculate();
     }
 
     void siso_combined_f_impl::set_POSTI(bool POSTI)
     {
+      gr::thread::scoped_lock guard(d_setlock); 
       d_POSTI = POSTI;
       recalculate();
     }
 
     void siso_combined_f_impl::set_POSTO(bool POSTO)
     {
+      gr::thread::scoped_lock guard(d_setlock); 
       d_POSTO = POSTO;
       recalculate();
     }
 
     void siso_combined_f_impl::set_D(int D)
     {
+      gr::thread::scoped_lock guard(d_setlock); 
       d_D=D;
       recalculate();
     }
 
-    
+    void siso_combined_f_impl::set_S0(int S0)
+    { 
+      gr::thread::scoped_lock guard(d_setlock); 
+      d_S0 = S0; 
+    }
+
+    void siso_combined_f_impl::set_SK(int SK)
+    { 
+      gr::thread::scoped_lock guard(d_setlock); 
+      d_SK = SK; 
+    }
+
+    void siso_combined_f_impl::set_SISO_TYPE(trellis::siso_type_t type) 
+    { 
+      gr::thread::scoped_lock guard(d_setlock); 
+      d_SISO_TYPE = type; 
+    }
+
+    void siso_combined_f_impl::set_TABLE(const std::vector<float> &table)
+    { 
+      gr::thread::scoped_lock guard(d_setlock); 
+      d_TABLE = table; 
+    }
+
+    void siso_combined_f_impl::set_TYPE(digital::trellis_metric_type_t type)
+    { 
+      gr::thread::scoped_lock guard(d_setlock); 
+      d_TYPE = type; 
+    }
 
     siso_combined_f_impl::~siso_combined_f_impl()
     {
@@ -163,6 +196,7 @@ namespace gr {
                                       gr_vector_const_void_star &input_items,
                                       gr_vector_void_star &output_items)
     {
+      gr::thread::scoped_lock guard(d_setlock); 
       int nstreams = output_items.size();
       //printf("general_work:Streams:  %d\n",nstreams);
 
diff --git a/gr-trellis/lib/siso_combined_f_impl.h 
b/gr-trellis/lib/siso_combined_f_impl.h
index 9457637..93e9aa8 100644
--- a/gr-trellis/lib/siso_combined_f_impl.h
+++ b/gr-trellis/lib/siso_combined_f_impl.h
@@ -67,14 +67,14 @@ namespace gr {
 
       void set_FSM(const fsm &FSM);
       void set_K(int K);
-      void set_S0(int S0){ d_S0 = S0; }
-      void set_SK(int SK){ d_SK = SK; }
+      void set_S0(int S0);
+      void set_SK(int SK);
       void set_POSTI(bool POSTI);
       void set_POSTO(bool POSTO);
-      void set_SISO_TYPE(trellis::siso_type_t type) { d_SISO_TYPE = type; }
+      void set_SISO_TYPE(trellis::siso_type_t type);
       void set_D(int D);
-      void set_TABLE(const std::vector<float> &table){ d_TABLE = table; }
-      void set_TYPE(digital::trellis_metric_type_t type){ d_TYPE = type; }
+      void set_TABLE(const std::vector<float> &table);
+      void set_TYPE(digital::trellis_metric_type_t type);
 
       void forecast(int noutput_items,
                    gr_vector_int &ninput_items_required);
diff --git a/gr-trellis/lib/siso_f_impl.cc b/gr-trellis/lib/siso_f_impl.cc
index a1c7ab3..2af5a21 100644
--- a/gr-trellis/lib/siso_f_impl.cc
+++ b/gr-trellis/lib/siso_f_impl.cc
@@ -91,28 +91,50 @@ namespace gr {
 
     void siso_f_impl::set_FSM(const fsm &FSM)
     {
+      gr::thread::scoped_lock guard(d_setlock);
       d_FSM=FSM;
       recalculate();
     }
 
     void siso_f_impl::set_K(int K)
     {
+      gr::thread::scoped_lock guard(d_setlock);
       d_K=K;
       recalculate();
     }
 
     void siso_f_impl::set_POSTI(bool POSTI)
     { 
+      gr::thread::scoped_lock guard(d_setlock);
       d_POSTI = POSTI; 
       recalculate();
     }
 
     void siso_f_impl::set_POSTO(bool POSTO)
     { 
+      gr::thread::scoped_lock guard(d_setlock);
       d_POSTO = POSTO; 
       recalculate();
     }
 
+    void siso_f_impl::set_S0(int S0)
+    { 
+      gr::thread::scoped_lock guard(d_setlock);
+      d_S0 = S0; 
+    }
+
+    void siso_f_impl::set_SK(int SK)
+    { 
+      gr::thread::scoped_lock guard(d_setlock);
+      d_SK = SK; 
+    }
+
+    void siso_f_impl::set_SISO_TYPE(trellis::siso_type_t type) 
+    { 
+      gr::thread::scoped_lock guard(d_setlock);
+      d_SISO_TYPE = type; 
+    }
+
     siso_f_impl::~siso_f_impl()
     {
     }
@@ -148,6 +170,7 @@ namespace gr {
                              gr_vector_const_void_star &input_items,
                              gr_vector_void_star &output_items)
     {
+      gr::thread::scoped_lock guard(d_setlock);
       int nstreams = output_items.size();
       //printf("general_work:Streams:  %d\n",nstreams);
       int multiple;
diff --git a/gr-trellis/lib/siso_f_impl.h b/gr-trellis/lib/siso_f_impl.h
index c8c9e1a..f92616b 100644
--- a/gr-trellis/lib/siso_f_impl.h
+++ b/gr-trellis/lib/siso_f_impl.h
@@ -63,11 +63,11 @@ namespace gr {
 
       void set_FSM(const fsm &FSM);
       void set_K(int K);
-      void set_S0(int S0){ d_S0 = S0; }
-      void set_SK(int SK){ d_SK = SK; }
+      void set_S0(int S0);
+      void set_SK(int SK);
       void set_POSTI(bool POSTI);
       void set_POSTO(bool POSTO);
-      void set_SISO_TYPE(trellis::siso_type_t type) { d_SISO_TYPE = type; }
+      void set_SISO_TYPE(trellis::siso_type_t type);
 
       void forecast(int noutput_items,
                    gr_vector_int &ninput_items_required);
diff --git a/gr-trellis/lib/viterbi_X_impl.cc.t 
b/gr-trellis/lib/viterbi_X_impl.cc.t
index bd5bdd8..1d48645 100644
--- a/gr-trellis/lib/viterbi_X_impl.cc.t
+++ b/gr-trellis/lib/viterbi_X_impl.cc.t
@@ -55,18 +55,32 @@ namespace gr {
       set_output_multiple(d_K);
     }
 
-    void @IMPL_NAME@::set_FSM(fsm &FSM) 
+    void @IMPL_NAME@::set_FSM(const fsm &FSM) 
     { 
+      gr::thread::scoped_lock guard(d_setlock); 
       d_FSM = FSM; 
       set_relative_rate(1.0 / ((double)d_FSM.O()));
     }
 
     void @IMPL_NAME@::set_K(int K) 
     { 
+      gr::thread::scoped_lock guard(d_setlock); 
       d_K = K; 
       set_output_multiple(d_K);
     }
 
+    void @IMPL_NAME@::set_S0(int S0) 
+    { 
+      gr::thread::scoped_lock guard(d_setlock); 
+      d_S0 = S0; 
+    }
+
+    void @IMPL_NAME@::set_SK(int SK) 
+    { 
+      gr::thread::scoped_lock guard(d_setlock); 
+      d_SK = SK; 
+    }
+
     @IMPL_NAME@::address@hidden@()
     {
     }
@@ -88,6 +102,7 @@ namespace gr {
                              gr_vector_const_void_star &input_items,
                              gr_vector_void_star &output_items)
     {
+      gr::thread::scoped_lock guard(d_setlock);
       int nstreams = input_items.size();
       int nblocks = noutput_items / d_K;
 
diff --git a/gr-trellis/lib/viterbi_X_impl.h.t 
b/gr-trellis/lib/viterbi_X_impl.h.t
index 44934a5..1479ad5 100644
--- a/gr-trellis/lib/viterbi_X_impl.h.t
+++ b/gr-trellis/lib/viterbi_X_impl.h.t
@@ -49,10 +49,10 @@ namespace gr {
       int S0()  const { return d_S0; }
       int SK()  const { return d_SK; }
 
-      void set_FSM(fsm &FSM);
+      void set_FSM(const fsm &FSM);
       void set_K(int K);
-      void set_S0(int S0) { d_S0 = S0; }
-      void set_SK(int SK) { d_SK = SK; }
+      void set_S0(int S0);
+      void set_SK(int SK);
       //std::vector<int> trace () const { return d_trace; }
 
       void forecast(int noutput_items,
diff --git a/gr-trellis/lib/viterbi_combined_XX_impl.cc.t 
b/gr-trellis/lib/viterbi_combined_XX_impl.cc.t
index 91bb4e6..722708b 100644
--- a/gr-trellis/lib/viterbi_combined_XX_impl.cc.t
+++ b/gr-trellis/lib/viterbi_combined_XX_impl.cc.t
@@ -63,6 +63,7 @@ namespace gr {
     void
     @IMPL_NAME@::set_K(int K)
     {
+      gr::thread::scoped_lock guard(d_setlock);
       d_K = K;
       set_output_multiple(d_K);
     }
@@ -70,9 +71,42 @@ namespace gr {
     void
     @IMPL_NAME@::set_D(int D)
     {
+      gr::thread::scoped_lock guard(d_setlock);
       d_D = D;
       set_relative_rate(1.0 / ((double)d_D));
     }
+   
+    void @IMPL_NAME@::set_FSM(const fsm &FSM)
+    {
+      gr::thread::scoped_lock guard(d_setlock);
+      d_FSM = FSM;
+    }
+
+    void @IMPL_NAME@::set_S0(int S0)
+    {
+      gr::thread::scoped_lock guard(d_setlock);
+      d_S0 = S0;
+    }
+
+    void @IMPL_NAME@::set_SK(int SK)
+    {
+      gr::thread::scoped_lock guard(d_setlock);
+      d_SK = SK;
+    }
+
+    void
+    @IMPL_NAME@::set_TYPE(digital::trellis_metric_type_t type)
+    {
+      gr::thread::scoped_lock guard(d_setlock);
+      d_TYPE = type;
+    }
+
+    void
+    @IMPL_NAME@::set_TABLE(const std::vector<@I_TYPE@> &table)
+    {
+      gr::thread::scoped_lock guard(d_setlock);
+      d_TABLE = table;
+    }
 
     @IMPL_NAME@::address@hidden@()
     {
@@ -95,6 +129,7 @@ namespace gr {
                              gr_vector_const_void_star &input_items,
                              gr_vector_void_star &output_items)
     {
+      gr::thread::scoped_lock guard(d_setlock);
       int nstreams = input_items.size();
       int nblocks = noutput_items / d_K;
 
diff --git a/gr-trellis/lib/viterbi_combined_XX_impl.h.t 
b/gr-trellis/lib/viterbi_combined_XX_impl.h.t
index 7098d8b..788e609 100644
--- a/gr-trellis/lib/viterbi_combined_XX_impl.h.t
+++ b/gr-trellis/lib/viterbi_combined_XX_impl.h.t
@@ -58,13 +58,13 @@ namespace gr {
       digital::trellis_metric_type_t TYPE() const { return d_TYPE; }
       //std::vector<int> trace() const { return d_trace; }
 
-      void set_FSM(const fsm &FSM){ d_FSM = FSM; }
+      void set_FSM(const fsm &FSM);
       void set_K(int K);
-      void set_S0(int S0){ d_S0 = S0; }
-      void set_SK(int SK){ d_SK = SK; }
+      void set_S0(int S0);
+      void set_SK(int SK);
       void set_D(int D);
-      void set_TABLE(const std::vector<@I_TYPE@> &table) { d_TABLE = table; }
-      void set_TYPE(digital::trellis_metric_type_t type) { d_TYPE = type; }
+      void set_TABLE(const std::vector<@I_TYPE@> &table);
+      void set_TYPE(digital::trellis_metric_type_t type);
 
       void forecast(int noutput_items,
                    gr_vector_int &ninput_items_required);
diff --git a/gr-trellis/python/trellis/fsm_utils.py 
b/gr-trellis/python/trellis/fsm_utils.py
index 7ec88cb..72aa1d3 100755
--- a/gr-trellis/python/trellis/fsm_utils.py
+++ b/gr-trellis/python/trellis/fsm_utils.py
@@ -201,6 +201,22 @@ psk2x3 = (3,[-1,-1,-1, \
              1,1,-1, \
              1,1,1])
 
+psk2x4 = (4,[-1,-1,-1,-1, \
+             -1,-1,-1,1,  \
+             -1,-1,1,-1,  \
+             -1,-1,1,1,   \
+             -1,1,-1,-1,  \
+             -1,1,-1,1,   \
+             -1,1,1,-1,   \
+             -1,1,1,1,    \
+             1,-1,-1,-1,  \
+             1,-1,-1,1,   \
+             1,-1,1,-1,   \
+             1,-1,1,1,    \
+             1,1,-1,-1,   \
+             1,1,-1,1,    \
+             1,1,1,-1,    \
+             1,1,1,1])
 
 orth2 = (2,[1, 0, \
             0, 1])



reply via email to

[Prev in Thread] Current Thread [Next in Thread]