%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() ;
}
}
}
}