/************************************************ * SRIP用32ビットシフトモジュール * * 以下のファイルを参考に作成 * * $PARTHENON/sfl_lib.src/sfl/sft32.sfl * * $PARTHENON/sfl_lib.src/sfl/sft_32.sfl * * $PARTHENON/sfl_lib.src/int_h/sft_32.h * ************************************************/ module sft32 { submod_type sft_32 { input left_right ; input sign ; input amt<5> ; input in<32> ; output out<32> ; instrin do ; } input a<32> ; input b<5> ; output out<32> ; instrin sll ; instrin srl ; instrin sra ; sft_32 sft32 ; instr_arg sft32.do(left_right,sign,amt,in) ; instruct sll out = sft32.do(0b1,0b0,b,a).out ; instruct srl out = sft32.do(0b0,0b0,b,a).out ; instruct sra out = sft32.do(0b0,0b1,b,a).out ; } module sft_32 { input left_right ; input sign ; input amt<5> ; input in<32> ; output out<32> ; tmp pad ; tmp tmp4<32>, tmp3<32>, tmp2<32>, tmp1<32> ; instrin do ; instrself sftl16, sftr16, pass16 ; instrself sftl8 , sftr8 , pass8 ; instrself sftl4 , sftr4 , pass4 ; instrself sftl2 , sftr2 , pass2 ; instrself sftl1 , sftr1 , pass1 ; instruct do par { pad = in<31> & sign ; any { left_right : par { any { amt<4> : sftl16() ; else : pass16() ; } any { amt<3> : sftl8() ; else : pass8() ; } any { amt<2> : sftl4() ; else : pass4() ; } any { amt<1> : sftl2() ; else : pass2() ; } any { amt<0> : sftl1() ; else : pass1() ; } } else : par { any { amt<4> : sftr16() ; else : pass16() ; } any { amt<3> : sftr8() ; else : pass8() ; } any { amt<2> : sftr4() ; else : pass4() ; } any { amt<1> : sftr2() ; else : pass2() ; } any { amt<0> : sftr1() ; else : pass1() ; } } } } instruct sftl16 out = tmp4<15:0> || 0b0000000000000000 ; instruct sftr16 out = pad || pad || pad || pad || pad || pad || pad || pad || pad || pad || pad || pad || pad || pad || pad || pad || tmp4<31:16> ; instruct pass16 out = tmp4 ; instruct sftl8 tmp4 = tmp3<23:0> || 0b00000000 ; instruct sftr8 tmp4 = pad || pad || pad || pad || pad || pad || pad || pad || tmp3<31:8> ; instruct pass8 tmp4 = tmp3 ; instruct sftl4 tmp3 = tmp2<27:0> || 0b0000 ; instruct sftr4 tmp3 = pad || pad || pad || pad || tmp2<31:4> ; instruct pass4 tmp3 = tmp2 ; instruct sftl2 tmp2 = tmp1<29:0> || 0b00 ; instruct sftr2 tmp2 = pad || pad || tmp1<31:2> ; instruct pass2 tmp2 = tmp1 ; instruct sftl1 tmp1 = in<30:0> || 0b0 ; instruct sftr1 tmp1 = pad || in<31:1> ; instruct pass1 tmp1 = in ; }