Marina/MarinaTest.java: a few hacks to get the silicon working
[fleet.git] / ships / CarrySaveAdder.ship
index dc67fab..03722c6 100644 (file)
@@ -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<<i))!=0L;
+    boolean b_ = (b&(1L<<i))!=0L;
+    boolean c_ = (c&(1L<<i))!=0L;
+    if ( (a_ && b_) || (b_ && c_) || (a_ && c_) )
+      ret |= (1L << i);
+  }
+  return ret;
+}
 public void service() {
-  if (box_in.dataReadyForShip() && box_out.readyForDataFromShip()) {
+  if (!box_out.readyForDataFromShip()) return;
+  if (state!=3 && !box_in.dataReadyForShip()) return;
+  switch(state) {
+    case 0: out = box_in.removeDataForShip(); break;
+    case 1: temp = box_in.removeDataForShip(); break;
+    case 2:
+      long in = box_in.removeDataForShip();
+      long mm = maj(temp, out, in);
+      box_out.addDataFromShip(mm << 1, ((mm >> (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