+ reg have_instruction;
+ reg have_token;
+ reg have_data;
+ reg send_token;
+ reg send_data;
+ reg parse_instruction;
+ reg do_recycle;
+ reg [(`COUNT_BITS-1):0] kill_count;
+ reg [(`INSTRUCTION_WIDTH-1):0] instruction;
+
+ wire [(`INSTRUCTION_WIDTH-1):0] instr_d2;
+ wire [(`INSTRUCTION_WIDTH-1):0] instr_d0;
+
+ reg kill_r;
+ reg kill_a;
+ reg [(`COUNT_WIDTH-1):0] kill_d;
+
+ reg [(`INSTRUCTION_WIDTH-1):0] kinstruction;
+ reg instr_rx;
+ wire instr_ax;
+ reg ifull;
+
+ always @(posedge clk) begin
+ if (!ifull) begin
+ `onread(instr_r, instr_a)
+ ifull = 1;
+ kinstruction = instr_d;
+ end
+ end else begin
+ if (`instruction_is_kill(kinstruction)) begin
+ kill_d = `instruction_count(kinstruction);
+ `onwrite(kill_r, kill_a)
+ ifull = 0;
+ end
+ end else begin
+ `onwrite(instr_rx, instr_ax)
+ ifull = 0;
+ end
+ end
+ end
+ end
+
+ reg recycle_r;
+ wire recycle_r_;
+ assign recycle_r_ = recycle_r;
+ wire recycle_a;
+ wire [(`INSTRUCTION_WIDTH-1):0] recycle_inst;
+ assign recycle_inst = instruction;
+
+ wire instr_a2_;
+ reg instr_a2;
+ assign instr_a2_ = instr_a2;
+
+ funnel ifunnel(clk, instr_r0, instr_a0, instr_d0,
+ instr_rx, instr_ax, kinstruction,
+ recycle_r_, recycle_a, recycle_inst);
+
+ fifo4 ififo(clk, instr_r0, instr_a0, instr_d0,
+ instr_r2, instr_a2_, instr_d2);
+
+ always @(posedge clk) begin
+
+ if (do_recycle) begin
+ `onwrite(recycle_r, recycle_a)
+ do_recycle = 0;
+ have_instruction = 0;
+ parse_instruction = 0;
+ end
+
+ end else begin
+
+ if (!have_instruction && !parse_instruction) begin
+ `onread(instr_r2, instr_a2)
+ instruction = instr_d2;
+ parse_instruction = 1;
+ end
+ end
+
+ // 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 || have_instruction) && (kill_count > 0)) begin
+ kill_count = kill_count - 1;
+ have_instruction = 0;
+ parse_instruction = 0;
+ 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);
+ 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;
+ if (have_instruction &&
+ (have_token || `token_in_r) &&
+ (have_data || `data_in_r) &&
+ (send_data || !`data_out_a) &&
+ (send_token || !`token_out_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
+ end
+ if (send_token) begin
+ `onwrite(`token_out_r, `token_out_a)
+ send_token = 0;
+ end
+ 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
+ end
+ 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