X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ships%2FRotator.ship;h=74cb3f1cb1d0c2c03d19394d18c56685cabf9608;hb=45976f3a79fa5d572b907ac716350b75d15e978a;hp=e12cddc0d29039c7cb20d42676cc5f695381f936;hpb=7f4958fbb5eb13487bbfaf8411765fe997ae2ae7;p=fleet.git diff --git a/ships/Rotator.ship b/ships/Rotator.ship index e12cddc..74cb3f1 100644 --- a/ships/Rotator.ship +++ b/ships/Rotator.ship @@ -11,7 +11,7 @@ out: out The Rotator performs bitwise rotations of words. When a value is present at both {\tt in} and {\tt inAmount}, both values are consumed, -the value {\tt in} is rotated {\it towards the most significant bit} +the value {\tt in} is rotated {\it towards the least significant bit} by {\tt inAmount} bits and emitted at {\tt out}. The output is undefined if {\tt inAmount} is greater than or equal to @@ -26,16 +26,20 @@ public void service() { long data = box_in.removeDataForShip(); long mask = ~((-1L) << getInterpreter().getWordWidth()); data = data & mask; - box_out.addDataFromShip(((data << amount) | (data >> (getInterpreter().getWordWidth()-amount))) & mask); + long res = ((data >> amount) | (data << (getInterpreter().getWordWidth()-amount))) & mask; + box_out.addDataFromShip(res, (res & (1L << (getInterpreter().getWordWidth()-1)))!=0); } } == FPGA ============================================================== - reg [(`DATAWIDTH-1):0] out_d; + reg [(`WORDWIDTH):0] out_d; assign out_d_ = out_d; + reg full; + initial full = 0; + reg [5:0] shamt; initial shamt = 0; @@ -43,23 +47,24 @@ public void service() { assign shamt_eq = (shamt[5:0] == (inAmount_d[5:0])); always @(posedge clk) begin - if (!rst) begin + if (rst) begin `reset + full <= 0; end else begin - if (!in_r && in_a && !inAmount_r) in_a <= 0; - if (!inAmount_r && inAmount_a) inAmount_a <= 0; - if (out_r && out_a) out_r <= 0; - if (in_r && !in_a && inAmount_r && !inAmount_a && !out_r && !out_a) begin - in_a <= 1; - out_d <= in_d; - shamt <= 0; - end else if (in_a && inAmount_r && !inAmount_a && !out_r && !out_a) begin - if (!shamt_eq) begin - out_d <= { out_d[`DATAWIDTH-2:0], out_d[`DATAWIDTH-1] }; - shamt <= shamt+1; + `cleanup + if (`in_full && `inAmount_full && `out_empty) begin + if (!full) begin + out_d <= { 1'b0, in_d }; + shamt <= 0; + full <= 1; + end else if (!shamt_eq) begin + out_d <= { out_d[0], out_d[0], out_d[`WORDWIDTH-1:1] }; + shamt <= shamt+1; end else begin - inAmount_a <= 1; - out_r <= 1; + `drain_in + `drain_inAmount + `fill_out + full <= 0; end end end @@ -70,17 +75,43 @@ public void service() { // expected output #expect 2 +#expect 0 +#expect -0x1000000000 +#expect 1 #expect 44627559471 +#expect 0 // ships required in order to run this code #ship debug : Debug #ship rotator : Rotator -rotator.in: set word= 1; deliver; set word= 21615257152; deliver; -rotator.inAmount: set word= 1; deliver; set word= 20; deliver; -rotator.out: set ilc=*; collect, send to debug.in; -debug.in: set ilc=*; recv, deliver; +debug.in: set ilc=*; recv, deliver; + +rotator.in: + set word=1; + deliver; + set word=1; + deliver; + set word=21615257152; + deliver; +rotator.inAmount: + set word=36; + deliver; + set word=1; + deliver; + set word=17; + deliver; +rotator.out: + set olc=3; + head; + collect, send to debug.in; + set flags a=c, b=b; + [!a] set word=0; + [a] set word=1; + send to debug.in; + tail; + == Contributors =========================================================