summaryrefslogtreecommitdiff
path: root/gr-trellis/lib/encoder_XX_impl.cc.t
diff options
context:
space:
mode:
Diffstat (limited to 'gr-trellis/lib/encoder_XX_impl.cc.t')
-rw-r--r--gr-trellis/lib/encoder_XX_impl.cc.t80
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 */