implement crappy multiplier
[fleet.git] / ships / Mul.ship
1 ship: Mul
2
3 == Ports ===========================================================
4 data  in:   in1
5 data  in:   in2
6 data  in:   in3
7
8 data  out:  out1
9 data  out:  out2
10 data  out:  out3
11 data  out:  bits
12
13 == Constants ========================================================
14 == TeX ==============================================================
15
16 == Fleeterpreter ====================================================
17 int count = 74;
18 Bitfifo.BitStorage bits = new Bitfifo.BitStorage(74);
19 public void service() {
20   if (box_in1.dataReadyForShip() &&
21       box_in2.dataReadyForShip() &&
22       box_in3.dataReadyForShip() &&
23       bits.hasSpace(1) &&
24       box_out1.readyForDataFromShip() &&
25       box_out2.readyForDataFromShip() &&
26       box_out3.readyForDataFromShip()) {
27       long v1 = box_in1.removeDataForShip();
28       long v2 = box_in2.removeDataForShip();
29       long v3 = box_in3.removeDataForShip();
30       long o1, o2, o3;
31       if (count % 2 == 0) {
32         o1 = v1;
33         o2 = v2 >>> 1;
34         o3 = ((v2 & 0x1L) == 0) ? 0 : v1;
35       } else {
36         o1 = ((v1 & v2) | (v2 & v3) | (v1 & v3))/* << 1*/;
37         o2 = (v1 ^ v2 ^ v3) >> 1;
38         o3 = 0;
39         bits.add((v1 ^ v2 ^ v3) & 0x1L, 1);
40         System.out.println("size is now " + bits.size());
41       }
42       box_out1.addDataFromShip(o1);
43       box_out2.addDataFromShip(o2);
44       box_out3.addDataFromShip(o3);
45       count--;
46       // This should be removed
47       if (count == 0) {
48         for (int i = 0; i < 37; i++) {
49           v1 = o1;
50           v2 = o2;
51           v3 = o3;
52           o1 = ((v1 & v2) | (v2 & v3) | (v1 & v3))/* << 1*/;
53           o2 = (v1 ^ v2 ^ v3) >> 1;
54           o3 = 0;
55           bits.add((v1 ^ v2 ^ v3) & 0x1L, 1);
56           System.out.println("size is now " + bits.size());
57         }
58         count = 74;
59       }
60   }
61   if (box_bits.readyForDataFromShip() &&
62       bits.size() >= 37) {
63       box_bits.addDataFromShip(bits.get(37));
64   }
65 }
66
67 == FleetSim ==============================================================
68
69 == FPGA ==============================================================
70
71   reg                    have_a;
72   reg [(`DATAWIDTH-1):0] a;
73   reg                    have_b;
74   reg [(`DATAWIDTH-1):0] b;
75   reg                    have_c;
76   reg [(`DATAWIDTH-1):0] c;
77   reg                    have_out1;
78   reg                    have_out2;
79
80   always @(posedge clk) begin
81     if (have_out1) begin
82       `onwrite(out1_r, out1_a) have_out1 <= 0; end
83
84     end else if (have_out2) begin
85       `onwrite(out2_r, out2_a) have_out2 <= 0; end
86
87     end else if (!have_out1 && !have_out2) begin
88       if (!have_a) begin
89         `onread(in1_r, in1_a) have_a <= 1; a <= in1_d; end
90         end
91       if (!have_b) begin
92         `onread(in2_r, in2_a) have_b <= 1; b <= in2_d; end
93         end
94       if (!have_c) begin
95         `onread(in3_r, in3_a) have_c <= 1; c <= in3_d; end
96         end
97   
98       if (have_a && have_b && have_c) begin
99         out1_d    <= { { ((a & b) | (b & c) | (a & c)) } , 1'b0 };
100         out2_d    <= a ^ b ^ c;
101         have_a    <= 0;
102         have_b    <= 0;
103         have_c    <= 0;
104         have_out1 <= 1;
105         have_out2 <= 1;
106       end
107     end
108   end
109
110
111
112
113 == Contributors =========================================================
114 Adam Megacz <megacz@cs.berkeley.edu>