add emmc dummy class
[shakti-peripherals.git] / src / peripherals / plic / encoder.bsv
1 package encoder;
2
3 import Vector ::* ;
4 `define INPUT 1024
5 `define OUTPUT 10
6 interface Ifc_encoder#(numeric type irpins);
7 method Bit#(TLog#(irpins)) encode(Bit#(irpins) ip);
8 endinterface
9
10 module mkencoder(Ifc_encoder#(irpins))
11 provisos(Log#(irpins, irid),
12 Add#(a__, irpins, `INPUT),
13 Add#(b__, irid, `OUTPUT));
14 function Bit#(irid) fn_encoder(Bit#(irpins) irp);
15 Bit#(`INPUT) ip = zeroExtend(irp);
16 Bit#(`OUTPUT) result=0;
17 Vector#(TDiv#(`INPUT,2),Bit#(1)) ip1;
18 Vector#(TDiv#(`INPUT,4),Bit#(1)) ip2;
19 Vector#(TDiv#(`INPUT,8),Bit#(1)) ip3;
20 Vector#(TDiv#(`INPUT,16),Bit#(1)) ip4;
21 Vector#(TDiv#(`INPUT,32),Bit#(1)) ip5;
22 Vector#(TDiv#(`INPUT,64),Bit#(1)) ip6;
23 Vector#(TDiv#(`INPUT,128),Bit#(1)) ip7;
24 Vector#(TDiv#(`INPUT,256),Bit#(1)) ip8;
25 Vector#(TDiv#(`INPUT,512),Bit#(1)) ip9;
26 Vector#(TDiv#(`INPUT,2),Bit#(1)) pp1;
27 Vector#(TDiv#(`INPUT,4),Bit#(1)) pp2;
28 Vector#(TDiv#(`INPUT,8),Bit#(1)) pp3;
29 Vector#(TDiv#(`INPUT,16),Bit#(1)) pp4;
30 Vector#(TDiv#(`INPUT,32),Bit#(1)) pp5;
31 Vector#(TDiv#(`INPUT,64),Bit#(1)) pp6;
32 Vector#(TDiv#(`INPUT,128),Bit#(1)) pp7;
33 Vector#(TDiv#(`INPUT,256),Bit#(1)) pp8;
34 Vector#(TDiv#(`INPUT,512),Bit#(1)) pp9;
35 Bit#(1) ip10;
36 Bit#(1) pp10;
37
38 for(Integer i=0;i<`INPUT/2;i=i+1) begin
39 ip1[i]=ip[i*2+1] | ip[i*2];
40 end
41 for(Integer i=0;i<`INPUT/4;i=i+1) begin
42 ip2[i]=ip1[i*2+1] | ip1[i*2];
43 end
44 for(Integer i=0;i<`INPUT/8;i=i+1) begin
45 ip3[i]=ip2[i*2+1] | ip2[i*2];
46 end
47 for(Integer i=0;i<`INPUT/16;i=i+1) begin
48 ip4[i]=ip3[i*2+1] | ip3[i*2];
49 end
50 for(Integer i=0;i<`INPUT/32;i=i+1) begin
51 ip5[i]=ip4[i*2+1] | ip4[i*2];
52 end
53 for(Integer i=0;i<`INPUT/64;i=i+1) begin
54 ip6[i]=ip5[i*2+1] | ip5[i*2];
55 end
56 for(Integer i=0;i<`INPUT/128;i=i+1) begin
57 ip7[i]=ip6[i*2+1] | ip6[i*2];
58 end
59 for(Integer i=0;i<`INPUT/256;i=i+1) begin
60 ip8[i]=ip7[i*2+1] | ip7[i*2];
61 end
62 for(Integer i=0;i<`INPUT/512;i=i+1) begin
63 ip9[i]=ip8[i*2+1] | ip8[i*2];
64 end
65
66 for(Integer i=0;i<`INPUT/2;i=i+1) begin
67 pp1[i]=ip[i*2+1]==1?1:ip[i*2]==1?0:0;
68 end
69 for(Integer i=0;i<`INPUT/4;i=i+1) begin
70 pp2[i]=ip1[i*2+1]==1?1:ip1[i*2]==1?0:0;
71 end
72 for(Integer i=0;i<`INPUT/8;i=i+1) begin
73 pp3[i]=ip2[i*2+1]==1?1:ip2[i*2]==1?0:0;
74 end
75 for(Integer i=0;i<`INPUT/16;i=i+1) begin
76 pp4[i]=ip3[i*2+1]==1?1:ip3[i*2]==1?0:0;
77 end
78 for(Integer i=0;i<`INPUT/32;i=i+1) begin
79 pp5[i]=ip4[i*2+1]==1?1:ip4[i*2]==1?0:0;
80 end
81 for(Integer i=0;i<`INPUT/64;i=i+1) begin
82 pp6[i]=ip5[i*2+1]==1?1:ip5[i*2]==1?0:0;
83 end
84 for(Integer i=0;i<`INPUT/128;i=i+1) begin
85 pp7[i]=ip6[i*2+1]==1?1:ip6[i*2]==1?0:0;
86 end
87 for(Integer i=0;i<`INPUT/256;i=i+1) begin
88 pp8[i]=ip7[i*2+1]==1?1:ip7[i*2]==1?0:0;
89 end
90 for(Integer i=0;i<`INPUT/512;i=i+1) begin
91 pp9[i]=ip8[i*2+1]==1?1:ip8[i*2]==1?0:0;
92 end
93
94 pp10=ip9[1]==1?1:ip9[0]==1?0:0;
95 ip10=ip9[1] | ip9[0];
96
97 result[0] = pp10;
98 let op9 = pp9[result[1:0]];
99 result = {result[8:0],op9};
100 let op8 = pp8[result[2:0]];
101 result = {result[8:0],op8};
102 let op7 = pp7[result[3:0]];
103 result = {result[8:0],op7};
104 let op6 = pp6[result[4:0]];
105 result = {result[8:0],op6};
106 let op5 = pp5[result[5:0]];
107 result = {result[8:0],op5};
108 let op4 = pp4[result[6:0]];
109 result = {result[8:0],op4};
110 let op3 = pp3[result[7:0]];
111 result = {result[8:0],op3};
112 let op2 = pp2[result[8:0]];
113 result = {result[8:0],op2};
114 let op1 = pp1[result[9:0]];
115 result = {result[8:0],op1};
116 return truncate(result);
117 endfunction
118
119 method Bit#(irid) encode(Bit#(irpins) ip);
120 return fn_encoder(ip);
121 endmethod
122 endmodule
123
124 (*synthesize*)
125 module mkSencoder(Ifc_encoder#(512));
126 let ifc();
127 mkencoder inst(ifc);
128 return ifc();
129 endmodule
130
131 endpackage