/************************************************ * SRIP用32ビット加算器 * * 以下のファイルを参考に作成 * * $PARTHENON/sfl_lib.src/sfl/cpa32.sfl * * $PARTHENON/sfl_lib.src/sfl/cpa16.sfl * * $PARTHENON/sfl_lib.src/sfl/cpa4.sfl * * $PAERHENON/sfl_lib.src/int_h/cpa16.h * * $PAERHENON/sfl_lib.src/int_h/cpa4.h * ************************************************/ module adder32 { submod_type adder16 { input cin ; input in1<16> ; input in2<16> ; output out<16> ; output gout ; output pout ; instrin do ; } input in1<32> ; input in2<32> ; output out<32> ; tmp cry<2> ; instrin add ; adder16 adder1 ; adder16 adder0 ; instr_arg adder1.do(cin,in1,in2) ; instr_arg adder0.do(cin,in1,in2) ; instruct add par { cry = adder0.gout || 0b0 ; out = adder1.do(cry<1>,in1<31:16>,in2<31:16>).out || adder0.do(cry<0>,in1<15:00>,in2<15:00>).out ; } } module adder16 { submod_type adder4 { input cin ; input in1<4> ; input in2<4> ; output out<4> ; output gout ; output pout ; instrin do ; } input cin ; input in1<16> ; input in2<16> ; output out<16> ; output gout ; output pout ; tmp cry<4> ; instrin do ; adder4 adder43 ; adder4 adder42 ; adder4 adder41 ; adder4 adder40 ; instr_arg adder43.do(cin,in1,in2) ; instr_arg adder42.do(cin,in1,in2) ; instr_arg adder41.do(cin,in1,in2) ; instr_arg adder40.do(cin,in1,in2) ; instruct do par { cry = ((cin&adder40.pout&adder41.pout&adder42.pout) | (adder40.gout&adder41.pout&adder42.pout) | (adder41.gout&adder42.pout) | adder42.gout) || ((cin&adder40.pout&adder41.pout) | (adder40.gout&adder41.pout) | adder41.gout) || ((cin&adder40.pout) | adder40.gout) || cin ; out = adder43.do(cry<3>,in1<15:12>,in2<15:12>).out || adder42.do(cry<2>,in1 <11:8>,in2 <11:8>).out || adder41.do(cry<1>,in1 <7:4>,in2 <7:4>).out || adder40.do(cry<0>,in1 <3:0>,in2 <3:0>).out ; gout = (adder40.gout&adder41.pout&adder42.pout&adder43.pout) | (adder41.gout&adder42.pout&adder43.pout) | (adder42.gout&adder43.pout) | adder43.gout ; pout = adder40.pout&adder41.pout&adder42.pout&adder43.pout ; } } module adder4 { input cin ; input in1<4> ; input in2<4> ; output out<4> ; output gout ; output pout ; tmp g<4> ; tmp p<4> ; tmp cry<4> ; instrin do ; instruct do par { g = (in1<3> & in2<3>) || (in1<2> & in2<2>) || (in1<1> & in2<1>) || (in1<0> & in2<0>) ; p = (in1<3> | in2<3>) || (in1<2> | in2<2>) || (in1<1> | in2<1>) || (in1<0> | in2<0>) ; cry = ((cin&p<0>&p<1>&p<2>) | (g<0>&p<1>&p<2>) | (g<1>&p<2>) | g<2>) || ((cin&p<0>&p<1>) | (g<0>&p<1>) | g<1>) || ((cin&p<0>) | g<0>) || cin ; out = in1 @ in2 @ cry ; gout = (g<0>&p<1>&p<2>&p<3>) | (g<1>&p<2>&p<3>) | (g<2>&p<3>) | g<3> ; pout = p<0>&p<1>&p<2>&p<3> ; } }