OpenCores
URL https://opencores.org/ocsvn/cryptosorter/cryptosorter/trunk

Subversion Repositories cryptosorter

[/] [cryptosorter/] [trunk/] [memocodeDesignContest2008/] [ctrl/] [Four2OneMerger.bsv] - Blame information for rev 6

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 kfleming
import Memocode08Types ::*;
2
import StmtFSM         ::*;
3
import GetPut          ::*;
4
import Vector          ::*;
5
import FIFO            ::*;
6
 
7
interface Four2One;
8
   interface Vector#(4, Put#(Bit#(RecordWidth))) in;
9
   interface Get#(Bit#(RecordWidth)) out;
10
endinterface
11
 
12
 
13
`define Debug421 False
14
 
15
module mkFour2One (Four2One);
16
 
17
   Vector#(4, FIFO#(Bit#(RecordWidth))) top_fifos <- replicateM(mkFIFO());
18
   Vector#(2, FIFO#(Bit#(RecordWidth))) mid_fifos <- replicateM(mkFIFO());
19
 
20
   Vector#(2, Reg#(Bit#(2))) l1_cnts <- replicateM(mkReg(~0));
21
   Vector#(2, Reg#(Bit#(2))) l2_cnts <- replicateM(mkReg(2));
22
 
23
   for(Bit#(2) i = 0; i < 2; i = i+1)
24
      rule l1_cmp (True);
25
 
26
         let b0 = (l1_cnts[i])[0:0]==1'b1;
27
         let b1 = (l1_cnts[i])[1:1]==1'b1;
28
 
29
         let in0 = top_fifos[(2*i)+0];
30
         let in1 = top_fifos[(2*i)+1];
31
         let out = mid_fifos[i];
32
 
33
         let nv = ~0;
34
 
35
         if(b0&&!b1)
36
            begin
37
               in0.deq();
38
               out.enq(in0.first());
39
               if(`Debug421) $display("%d l1_zero", i);
40
            end
41
         else if(!b0&&b1)
42
            begin
43
               in1.deq();
44
               out.enq(in1.first());
45
               if(`Debug421) $display("%d l1_one", i);
46
            end
47
         else
48
            begin
49
               if (in0.first > in1.first())
50
                  begin
51
                     in0.deq();
52
                     out.enq(in0.first());
53
                     nv = 2;
54
                     if(`Debug421) $display("%d l1_zero (cmp)", i);
55
                  end
56
               else
57
                  begin
58
                     in1.deq();
59
                     out.enq(in1.first());
60
                     nv = 1;
61
                     if(`Debug421) $display("%d l1_one (cmp)", i);
62
                  end
63
            end
64
 
65
         l1_cnts[i] <= nv;
66
         if(`Debug421) $display("%d l1_cmp nv: %x", i, nv);
67
 
68
      endrule
69
 
70
 
71
   interface in = map(fifoToPut, top_fifos);
72
   interface Get out;
73
      method ActionValue#(Bit#(RecordWidth)) get();
74
 
75
         let b0 = (l2_cnts[0]) != 0;
76
         let b1 = (l2_cnts[1]) != 0;
77
 
78
         let in0 = mid_fifos[0];
79
         let in1 = mid_fifos[1];
80
 
81
         let sum = l2_cnts[0] + l2_cnts[1];
82
 
83
         let rv = in1;
84
 
85
         let nv0 = l2_cnts[0];
86
         let nv1 = l2_cnts[1];
87
 
88
 
89
         if(b0&&!b1)
90
            begin
91
               in0.deq();
92
               if(sum != 1)
93
                  nv0 = nv0-1;
94
               else
95
                  begin
96
                     nv0 = 2;
97
                     nv1 = 2;
98
                  end
99
               rv = in0;
100
               if(`Debug421) $display("l2_zero");
101
            end
102
         else if(!b0&&b1)
103
            begin
104
               in1.deq();
105
               if(sum != 1)
106
                  nv1 = nv1-1;
107
               else
108
                  begin
109
                     nv0 = 2;
110
                     nv1 = 2;
111
                  end
112
               rv = in1;
113
               if(`Debug421) $display("l2_one");
114
            end
115
         else
116
            begin
117
               if (in0.first > in1.first())
118
                  begin
119
                     in0.deq();
120
                     nv0 = nv0-1;
121
                     rv = in0;
122
                     if(`Debug421) $display("l2_zero (cmp)");
123
                  end
124
               else
125
                  begin
126
                     in1.deq();
127
                     nv1 = nv1-1;
128
                     rv = in1;
129
                     if(`Debug421) $display("l2_one (cmp)");
130
                  end
131
            end
132
         if(`Debug421) $display("l2_cmp, nv0: %d, nv1: %d, sum: %d",
133
                                nv0, nv1, sum);
134
         l2_cnts[0] <= nv0;
135
         l2_cnts[1] <= nv1;
136
         return rv.first();
137
      endmethod
138
   endinterface
139
 
140
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.