%i "add8.sfl"
%i "dec4.sfl"

submod_class add8 {
     input   a<8>,b<8>,ci ;
     output  s<8>,co ;
     instrin do ;
     instr_arg do(a,b,ci) ;
}

submod_class dec4 {
     input  in<4> ;
     output out<4> ;
     instrin do ;
     instr_arg do(in) ;
}

module m8 {
     input     a<8> ;
     input     b<8> ;
     output    x<16> ;
     instrin   start ;
     instrself oput,kill ;
     reg A<8> ;
     reg B<8> ;
     reg Q<8> ;
     reg E ;
     reg shift ;
     reg C<4> ;
     reg t ;
     add8 add8 ;
     dec4 dec4 ;

     stage_name multi_stg {
          task multi_tsk() ;
     }

/*
     instruct oput x = A || Q ;
*/
     x = A || Q ;

     instruct start generate multi_stg.multi_tsk() ;

     stage multi_stg {
          state_name T0 ;
          state_name T1 ;
          state_name T2 ;
          state_name T3_1 ;
          state_name T3_2 ;
          first_state T0 ;
          any {
               kill : finish ;
          }
          state T0 goto T1 ;
          state T1 par {
               A := 0b00000000 ;
               B := a ;
               Q := b ;
               E := 0b0 ;
               C := 0b1000 ;
               goto T2 ;
          }
          state T2 par {
               C := dec4.do( C ).out ;
               any {
                    Q<0> : par {
                         A := add8.do( A,B,0b0 ).s ;
                         E := add8.do( A,B,0b0 ).co ;
                    }
               }
               goto T3_1 ;
          }
          state T3_1 par {
               shift := A<0> ;
               t := /|C<3:0> ;
               goto T3_2 ;
          }
          state T3_2 par {
               A := E || A<7:1> ;
               Q := shift || Q<7:1> ;
               E := 0b0 ;
               alt {
                    t == 0b1 : goto T2 ;
                    t == 0b0 : kill() ;
               }
          }
     }    
}