reorganization of benkobox code to fix a few quirks
authoradam <adam@megacz.com>
Thu, 8 Feb 2007 03:48:53 +0000 (04:48 +0100)
committeradam <adam@megacz.com>
Thu, 8 Feb 2007 03:48:53 +0000 (04:48 +0100)
src/edu/berkeley/fleet/slipway/box.inc

index 7542246..19ca0c2 100644 (file)
@@ -1,10 +1,11 @@
   reg have_instruction;
-  reg have_token;
-  reg have_data;
-  reg send_token;
-  reg send_data;
+  reg need_to_read_token;
+  reg need_to_read_data;
+  reg need_to_send_token;
+  reg need_to_send_data;
   reg parse_instruction;
   reg do_recycle;
+  reg fire_ok;
   reg [(`COUNT_BITS-1):0]        kill_count;
   reg [(`INSTRUCTION_WIDTH-1):0] instruction;
 
         parse_instruction = 0;
       end
 
-    end else begin
+    end else if (fire_ok) begin
+      if (need_to_send_data) begin
+        `onwrite(`data_out_r, `data_out_a)
+          need_to_send_data = 0;
+        end
 
-      if (!have_instruction && !parse_instruction) begin
-        `onread(instr_r2, instr_a2)
-          instruction                 = instr_d2;
-          parse_instruction           = 1;
+      end else if (need_to_send_token) begin
+        `onwrite(`token_out_r, `token_out_a)
+          need_to_send_token = 0;
         end
+
+      end else begin
+         fire_ok = 0;
+         case (`instruction_count(instruction))
+                0: begin end
+                1: have_instruction = 0;
+          default: `instruction_count(instruction) = `instruction_count(instruction) - 1;
+         endcase
+         if (have_instruction && `instruction_bit_recycle(instruction)) begin
+           do_recycle = 1;
+         end else begin
+           parse_instruction = have_instruction;
+         end
+      end
+
+    end else if (!have_instruction && !parse_instruction) begin
+      `onread(instr_r2, instr_a2)
+        instruction                 = instr_d2;
+        parse_instruction           = 1;
       end
 
+    end else begin
       // FIXME: actually don't want to kill partway through an instruction
       `onread(kill_r, kill_a)
         kill_count = kill_count + kill_d;
       end
 
       if (parse_instruction) begin
-        have_token                  = !`instruction_bit_tokenin(instruction);
-        have_data                   = !`instruction_bit_datain(instruction);
-        `packet_dest(`data_out_d)  =  `instruction_bit_dest(instruction);
-        send_data                   = !`instruction_bit_dataout(instruction);
-        send_token                  = !`instruction_bit_tokenout(instruction);
+        need_to_read_token          = `instruction_bit_tokenin(instruction);
+        need_to_read_data           = `instruction_bit_datain(instruction);
+        `packet_dest(`data_out_d)   = `instruction_bit_dest(instruction);
+        `packet_dest(`token_out_d)  = `instruction_bit_dest(instruction);
+        need_to_send_data           = `instruction_bit_dataout(instruction);
+        need_to_send_token          = `instruction_bit_tokenout(instruction);
         have_instruction            = 1;
         parse_instruction           = 0;
       end
-/*
-      if (!`token_in_r && `token_in_a)  `token_in_a = 0;
-      if (!`data_in_r  && `data_in_a)   `data_in_a = 0;
-      if (`token_out_r && `token_out_a) `token_out_r = 0;
-      if (`data_out_r  && `data_out_a)  `data_out_r = 0;
+
+      // return to zero
+      if (!`token_in_r && `token_in_a)  `token_in_a  = 0;
+      if (!`data_in_r  && `data_in_a)   `data_in_a   = 0;
+
       if (have_instruction &&
-          (have_token  || `token_in_r) &&
-          (have_data   || `data_in_r) &&
-          (send_data   || !`data_out_a) &&
-          (send_token  || !`token_out_a) &&
+          (!need_to_read_token  || (`token_in_r   && !`token_in_a)) &&
+          (!need_to_read_data   || (`data_in_r    && !`data_in_a))
          ) begin
-        if (!have_token) begin
-          token_in_a = 1;
-          have_token = 1;
-        end
-        if (!have_data) begin
-          data_in_a = 1;
-          have_data = 1;
-        end
-        fire_ok = 1;
-      end
-
-      if (fire_ok) begin
-        if (send_data) begin
-          `onwrite(`data_out_r, `data_out_a)
-            send_data = 0;
-          end
+        if (need_to_read_token) begin
+          `token_in_a = 1;
+          need_to_read_token = 0;
         end
-        if (send_token) begin
-          `onwrite(`token_out_r, `token_out_a)
-            send_token = 0;
-          end
+        if (need_to_read_data) begin
+          `data_in_a = 1;
+          need_to_read_data = 0;
         end
-        if (!send_data && !send_token) begin
-          fire_ok = false;
-// die here
-        end
-      end
-*/
-      if (have_instruction && !have_token) begin
-        `onread(`token_in_r, `token_in_a)
-          have_token = 1;
-        end
-      end
-  
-      if (have_instruction && !have_data) begin
-        `onread(`data_in_r, `data_in_a)
-          if (`instruction_bit_latch(instruction)) begin
-            `packet_data(`data_out_d) = `data_in_d;
-          end
-          have_data = 1;
-        end
-      end
-
-      if (have_instruction && have_data && have_token) begin
-        // FIXME: add token send on diff port
-        if (!send_data || !send_token) begin
-          `onwrite(`data_out_r, `data_out_a)
-            send_data = 1;
-            send_token = 1;
-          end
+        if (`instruction_bit_latch(instruction)) begin
+          `packet_data(`data_out_d) = `data_in_d;
         end
+        fire_ok = 1;
       end
 
-      if (have_instruction && have_data && have_token && send_data && send_token) begin
-
-        case (`instruction_count(instruction))
-                0: begin end
-                1: have_instruction = 0;
-          default: `instruction_count(instruction) = `instruction_count(instruction) - 1;
-        endcase
-
-        if (have_instruction && `instruction_bit_recycle(instruction)) begin
-          do_recycle = 1;
-        end else begin
-          parse_instruction = have_instruction;
-        end
-
-      end
     end
   end