diff options
Diffstat (limited to 'gr-trellis/lib/encoder_XX_impl.cc.t')
-rw-r--r-- | gr-trellis/lib/encoder_XX_impl.cc.t | 80 |
1 files changed, 58 insertions, 22 deletions
diff --git a/gr-trellis/lib/encoder_XX_impl.cc.t b/gr-trellis/lib/encoder_XX_impl.cc.t index 4b11e3c06d..3a004a2f94 100644 --- a/gr-trellis/lib/encoder_XX_impl.cc.t +++ b/gr-trellis/lib/encoder_XX_impl.cc.t @@ -37,18 +37,45 @@ namespace gr { @BASE_NAME@::make(const fsm &FSM, int ST) { return gnuradio::get_initial_sptr - (new @IMPL_NAME@(FSM,ST)); + (new @IMPL_NAME@(FSM,ST,0,false)); } - @IMPL_NAME@::@IMPL_NAME@(const fsm &FSM, int ST) + @BASE_NAME@::sptr + @BASE_NAME@::make(const fsm &FSM, int ST, int K) + { + return gnuradio::get_initial_sptr + (new @IMPL_NAME@(FSM,ST,K,true)); + } + + @IMPL_NAME@::@IMPL_NAME@(const fsm &FSM, int ST, int K, bool B) : sync_block("@BASE_NAME@", - io_signature::make(1, -1, sizeof(@I_TYPE@)), - io_signature::make(1, -1, sizeof(@O_TYPE@))), + io_signature::make(1, 1, sizeof(@I_TYPE@)), + io_signature::make(1, 1, sizeof(@O_TYPE@))), d_FSM(FSM), - d_ST(ST) + d_ST(ST), + d_K(K), + d_B(B) { } + void @IMPL_NAME@::set_FSM(const fsm &FSM) + { + gr::thread::scoped_lock guard(d_setlock); + d_FSM = FSM; + } + + void @IMPL_NAME@::set_ST(int ST) + { + gr::thread::scoped_lock guard(d_setlock); + d_ST = ST; + } + + void @IMPL_NAME@::set_K(int K) + { + gr::thread::scoped_lock guard(d_setlock); + d_K = K; + } + @IMPL_NAME@::~@IMPL_NAME@() { } @@ -58,25 +85,34 @@ 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; - int nstreams = input_items.size(); - for(int m=0;m<nstreams;m++) { - const @I_TYPE@ *in = (const @I_TYPE@*)input_items[m]; - @O_TYPE@ *out = (@O_TYPE@ *) output_items[m]; - ST_tmp = d_ST; - - // per stream processing - for(int i = 0; i < noutput_items; i++) { - out[i] = (@O_TYPE@)d_FSM.OS()[ST_tmp*d_FSM.I()+in[i]]; // direction of time? - ST_tmp = (int)d_FSM.NS()[ST_tmp*d_FSM.I()+in[i]]; - } - // end per stream processing - } - d_ST = ST_tmp; - - return noutput_items; - } + if (d_B){ // blockwise operation + int nblocks = noutput_items /d_K; + 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++) { + ST_tmp = d_ST; + for(int i = 0; i < d_K; i++) { + out[n*d_K+i] = (@O_TYPE@)d_FSM.OS()[ST_tmp*d_FSM.I()+in[n*d_K+i]]; + ST_tmp = (int)d_FSM.NS()[ST_tmp*d_FSM.I()+in[n*d_K+i]]; + } + } + return nblocks*d_K; + } // end blockwise operation + else{ // streaming operation + const @I_TYPE@ *in = (const @I_TYPE@*)input_items[0]; + @O_TYPE@ *out = (@O_TYPE@ *) output_items[0]; + ST_tmp = d_ST; + for(int i = 0; i < noutput_items; i++) { + out[i] = (@O_TYPE@)d_FSM.OS()[ST_tmp*d_FSM.I()+in[i]]; + ST_tmp = (int)d_FSM.NS()[ST_tmp*d_FSM.I()+in[i]]; + } + d_ST = ST_tmp; + return noutput_items; + } // end streaming operation + } } /* namespace trellis */ } /* namespace gr */ |