ship: Rotator == Ports =========================================================== in: in in: inAmount out: out == TeX ============================================================== 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 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 the number of bits in a word. == Fleeterpreter ==================================================== public void service() { if (box_inAmount.dataReadyForShip() && box_in.dataReadyForShip() && box_out.readyForDataFromShip()) { long amount = box_inAmount.removeDataForShip(); long data = box_in.removeDataForShip(); long mask = ~((-1L) << getInterpreter().getWordWidth()); data = data & mask; long res = ((data >> amount) | (data << (getInterpreter().getWordWidth()-amount))) & mask; box_out.addDataFromShip(res, (res & (1L << (getInterpreter().getWordWidth()-1)))!=0); } } == FPGA ============================================================== reg [(`WORDWIDTH):0] out_d; assign out_d_ = out_d; reg full; initial full = 0; reg [5:0] shamt; initial shamt = 0; wire shamt_eq; assign shamt_eq = (shamt[5:0] == (inAmount_d[5:0])); always @(posedge clk) begin if (rst) begin `reset full <= 0; end else begin `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 `drain_in `drain_inAmount `fill_out full <= 0; end end end end == Test ============================================================== // 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 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 ========================================================= Amir Kamil Adam Megacz