3 == Ports ===========================================================
7 constant REPEAT_C1_V1: 0
8 constant REPEAT_C1_V2: 1
9 constant REPEAT_C2_V1: 2
10 constant REPEAT_C2_V2: 3
11 constant PASS_C1_V1: 4
12 constant PASS_C1_V2: 5
13 constant PASS_C2_V1: 6
14 constant PASS_C2_V2: 7
15 constant DROP_C1_V1: 8
16 constant DROP_C1_V2: 9
17 constant DROP_C2_V1: 10
18 constant DROP_C2_V2: 11
22 == Fleeterpreter ====================================================
25 boolean op_count = false;
26 boolean op_repeat = false;
27 boolean op_pass = false;
28 boolean op_drop = false;
29 boolean op_c1 = false;
30 boolean op_c2 = false;
31 boolean op_v1 = false;
32 boolean op_v2 = false;
40 public void service() {
46 box_inOp.removeDataForShip();
47 if (op_count) box_in2.removeDataForShip();
48 else if (op_repeat && op_v1) box_in1.removeDataForShip();
49 else if (op_repeat && op_v2) box_in2.removeDataForShip();
51 } else if (box_out.readyForDataFromShip()) {
53 box_out.addDataFromShip(temp, (temp - box_in2.peekDataForShip()) < 0);
54 temp = temp - box_in2.peekDataForShip();
55 } else if (op_v1 && box_in1.dataReadyForShip()) {
56 if (op_drop) { box_in1.removeDataForShip(); temp--; }
57 else { box_out.addDataFromShip(op_pass ? box_in1.removeDataForShip() : box_in1.peekDataForShip(), temp<=0); temp--; }
58 } else if (op_v2 && box_in2.dataReadyForShip()) {
59 if (op_drop) { box_in2.removeDataForShip(); temp--; }
60 else { box_out.addDataFromShip(op_pass ? box_in2.removeDataForShip() : box_in2.peekDataForShip(), temp<=0); temp--; }
65 } else if (box_inOp.dataReadyForShip()) {
66 long op = box_inOp.peekDataForShip();
67 op_count = (op & 15)==12;
68 op_repeat = ((op>>2) & 3)==0;
69 op_pass = ((op>>2) & 3)==1;
70 op_drop = ((op>>2) & 3)==2;
71 op_c1 = (op_repeat || op_pass || op_drop) && !(((op>>1)&1)!=0);
72 op_c2 = (op_repeat || op_pass || op_drop) && (((op>>1)&1)!=0);
73 op_v1 = (op_repeat || op_pass || op_drop) && !(((op>>0)&1)!=0);
74 op_v2 = (op_repeat || op_pass || op_drop) && (((op>>0)&1)!=0);
76 if (op_count && (!box_in1.dataReadyForShip() || !box_in2.dataReadyForShip())) return;
77 if (op_c1 && !box_in1.dataReadyForShip()) return;
78 if (op_c2 && !box_in2.dataReadyForShip()) return;
82 if (op_count) temp = box_in1.removeDataForShip() - box_in2.peekDataForShip();
83 if (op_c1) temp = box_in1.removeDataForShip()-1;
84 if (op_c2) temp = box_in2.removeDataForShip()-1;
88 == FleetSim ==============================================================
90 == FPGA ==============================================================
92 wire [3:0] inOp_d_trunc;
93 assign inOp_d_trunc = inOp_d[3:0];
95 reg [`WORDWIDTH-1:0] temp;
96 initial temp = {`WORDWIDTH{1'b1}};
101 wire op_count; assign op_count = inOp_d_trunc==12;
102 wire op_repeat; assign op_repeat = inOp_d[3:2]==0;
103 wire op_pass; assign op_pass = inOp_d[3:2]==1;
104 wire op_drop; assign op_drop = inOp_d[3:2]==2;
105 wire op_c1; assign op_c1 = (op_repeat || op_pass || op_drop) && !inOp_d[1];
106 wire op_c2; assign op_c2 = (op_repeat || op_pass || op_drop) && inOp_d[1];
107 wire op_v1; assign op_v1 = (op_repeat || op_pass || op_drop) && !inOp_d[0];
108 wire op_v2; assign op_v2 = (op_repeat || op_pass || op_drop) && inOp_d[0];
110 wire [`WORDWIDTH-1:0] pre_out;
111 assign pre_out = op_v1 ? in1_d : op_v2 ? in2_d : temp;
112 assign out_d_ = { c_flag, pre_out };
114 // FIXME: REPEAT with a count of zero will not work properly
116 wire [`WORDWIDTH-1:0] temp_minus_in2;
117 assign temp_minus_in2 = (temp - in2_d);
119 always @(posedge clk) begin
127 if (`inOp_empty) full <= 0;
128 if (out_draining && `out_empty) begin
129 if (op_count) temp <= temp_minus_in2;
130 else temp <= temp - 1;
131 if (op_pass && op_v1) `drain_in1
132 if (op_pass && op_v2) `drain_in2
134 end else if (`inOp_full) begin
136 if (op_count && `in1_full && `in2_full) begin
137 temp <= in1_d[`WORDWIDTH-1:0] - in2_d[`WORDWIDTH-1:0];
140 end else if (op_c1 && `in1_full) begin
141 temp <= in1_d[`WORDWIDTH-1:0]-1;
144 end else if (op_c2 && `in2_full) begin
145 temp <= in2_d[`WORDWIDTH-1:0]-1;
149 end else if (temp[`WORDWIDTH-1]) begin
154 end else if (op_repeat && op_v1) begin
156 end else if (op_repeat && op_v2) begin
159 end else if (`out_empty) begin
163 c_flag <= temp_minus_in2[`WORDWIDTH-1];
164 end else if (op_v1 && `in1_full) begin
165 if (op_drop) begin `drain_in1 temp <= temp-1; end
166 else begin `fill_out out_draining <= 1; end
168 end else if (op_v2 && `in2_full) begin
169 if (op_drop) begin `drain_in2 temp <= temp-1; end
170 else begin `fill_out out_draining <= 1; end
178 == Test =================================================================
180 #ship counter : Counter
235 collect, send to debug.in;
238 [a] send to debug.in;
242 == Contributors =========================================================
243 Adam Megacz <megacz@cs.berkeley.edu>