X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ships%2FCarrySaveAdder.ship;h=03722c6c6e915629e509c953f82a8b64bbd1cfaa;hb=b90e778aed3a3e0943adc8c122215314bfe5c62f;hp=dc67fab6ef6baae8b77f78fc9572b24751bdf6f2;hpb=caa93dc7618f95e403b52ea834fa1f136d26e43d;p=fleet.git diff --git a/ships/CarrySaveAdder.ship b/ships/CarrySaveAdder.ship index dc67fab..03722c6 100644 --- a/ships/CarrySaveAdder.ship +++ b/ships/CarrySaveAdder.ship @@ -14,36 +14,67 @@ values, provided sequentially at {\tt in}, and produces. == Fleeterpreter ==================================================== +int state = 0; +long temp; +long out; +public void reset() { + super.reset(); + state = 0; + temp = 0; + out = 0; +} +private long maj(long a, long b, long c) { + long ret = 0; + for(int i=0; i<64; i++) { + boolean a_ = (a&(1L<> (getFleet().getWordWidth()-1)) & 1L)!=0); + temp = (temp ^ out) ^ in; + break; + case 3: box_out.addDataFromShip(temp, false); break; } + state = (state+1) % 4; } == FPGA ============================================================== - reg [(`DATAWIDTH-1):0] temp; - reg [(`DATAWIDTH):0] out_d; + reg [(`WORDWIDTH-1):0] temp; + reg [(`WORDWIDTH):0] out_d; reg [1:0] state; initial state = 0; assign out_d_ = out_d; - wire [(`DATAWIDTH-1):0] majority; - wire [(`DATAWIDTH-1):0] xors; + wire [(`WORDWIDTH-1):0] majority; + wire [(`WORDWIDTH-1):0] xors; genvar i; generate - for(i=0; i<`DATAWIDTH; i=i+1) begin : OUT + for(i=0; i<`WORDWIDTH; i=i+1) begin : OUT assign majority[i] = (temp[i] & out_d[i]) | (in_d[i] & out_d[i]) | (temp[i] & in_d[i]); assign xors[i] = temp[i] ^ out_d[i] ^ in_d[i]; end endgenerate always @(posedge clk) begin - if (!rst) begin + if (rst) begin `reset state <= 0; end else begin - `flush `cleanup if (`out_empty && state==3) begin out_d <= { 1'b0, temp }; @@ -55,7 +86,7 @@ public void service() { end else if (state == 1) begin temp <= in_d; end else if (state == 2) begin - out_d <= { majority[`DATAWIDTH-1:0], 1'b0 }; + out_d <= { majority[`WORDWIDTH-1:0], 1'b0 }; temp <= xors; `fill_out end