/******************************************
* (C)Copyright by N.T.T 1993(unpublished) *
* All rights are reserved.                *
******************************************/
module sft_32 {
    input       left_right ;
    input       sign ;
    input       amt<5> ;
    input       in<32> ;
    output      out<32> ;
    sel_v       pad ;
    sel_v       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 ;
}
