%i "fa_inst.sfl"
submod_class fa_inst {
input a,b,ci ;
output sum,co ;
instrin do ;
instr_arg do(a,b,ci) ;
}
module alu {
input a<4>,b<4>,ci ;
output sum<4>,co ;
tmp ca,cb,cc,cd ;
tmp sa,sb,sc,sd ;
tmp tmp<4> ;
instrin add ;
instrin or ;
instrin and ;
instrin xor ;
fa_inst fa0,fa1,fa2,fa3 ;
instruct add par {
ca = fa0.do(a<0>,b<0>,ci).co ;
cb = fa1.do(a<1>,b<1>,ca).co ;
cc = fa2.do(a<2>,b<2>,cb).co ;
cd = fa3.do(a<3>,b<3>,cc).co ;
sa = fa0.do(a<0>,b<0>,ci).sum ;
sb = fa1.do(a<1>,b<1>,ca).sum ;
sc = fa2.do(a<2>,b<2>,cb).sum ;
sd = fa3.do(a<3>,b<3>,cc).sum ;
co = cd ;
sum = sd || sc || sb || sa ;
}
instruct or par {
co = 0b0 ;
sum = ( a<3> | b<3> ) || ( a<2> | b<2> )
|| ( a<1> | b<1> ) || (a<0> | b<0> ) ;
}
instruct and par {
sum = ( a<3> & b<3> ) || ( a<2> & b<2> )
|| ( a<1> & b<1> ) || (a<0> & b<0> ) ;
co = 0b0 ;
}
instruct xor par {
sum = ( a<3> @ b<3> ) || ( a<2> @ b<2> )
|| ( a<1> @ b<1> ) || (a<0> @ b<0> ) ;
co = 0b0 ;
}
}