OpenCores
URL https://opencores.org/ocsvn/an-fpga-implementation-of-low-latency-noc-based-mpsoc/an-fpga-implementation-of-low-latency-noc-based-mpsoc/trunk

Subversion Repositories an-fpga-implementation-of-low-latency-noc-based-mpsoc

[/] [an-fpga-implementation-of-low-latency-noc-based-mpsoc/] [trunk/] [mpsoc/] [src_verilator/] [topology/] [fattree.h] - Blame information for rev 54

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 alirezamon
#ifndef FATTREE_H
2
        #define FATTREE_H
3
 
4
 
5
 
6
unsigned int    Lw;
7
unsigned int    Kw;
8
unsigned int    LKw;
9
unsigned int    RAw_FATTREE;
10
unsigned int    EAw_FATTREE;
11
unsigned int    NE_FATTREE;
12
unsigned int    NR_FATTREE;
13
unsigned int    DSTPw_FATTREE ;
14
unsigned int    MAX_P_FATTREE ;
15
 
16
 
17
unsigned int NPOS = powi( K, L-1);
18
unsigned int CHAN_PER_DIRECTION = (K * powi( L , L-1 )); //up or down
19
unsigned int CHAN_PER_LEVEL = 2*(K * powi( K , L-1 )); //up+down
20
 
21
 
22
 
23
 
24
 
25
 
26
 
27 54 alirezamon
inline void fatree_local_addr (unsigned int t1, unsigned int r1, unsigned int addr, unsigned int id){
28
        if (t1==1 ){
29
                router1[r1]->current_r_addr = addr;
30
                router1[r1]->current_r_id   = id;
31
        }
32
        else{
33
                router2[r1]->current_r_addr = addr;
34
                router2[r1]->current_r_id   = id;
35
        }
36
 
37 48 alirezamon
}
38
 
39
 
40
unsigned int fattree_addrencode( unsigned int pos, unsigned int k, unsigned int l){
41
        unsigned int pow,i,tmp=0;
42
        unsigned int addrencode=0;
43
        unsigned int kw=0;
44
        while((0x1<<kw) < k)kw++;
45
        pow=1;
46
        for (i = 0; i <l; i=i+1 ) {
47
                tmp=(pos/pow);
48
                tmp=tmp%k;
49
                tmp=tmp<<(i)*kw;
50
                addrencode=addrencode | tmp;
51
                pow=pow * k;
52
        }
53
         return addrencode;
54
}
55
 
56
 
57
unsigned int fattree_addrdecode(unsigned int addrencode , unsigned int k, unsigned int l){
58
        unsigned int kw=0;
59
        unsigned int mask=0;
60
        unsigned int pow,i,tmp;
61
        unsigned int pos=0;
62
        while((0x1<<kw) < k){
63
                kw++;
64
                mask<<=1;
65
                mask|=0x1;
66
        }
67
        pow=1;
68
        for (i = 0; i <l; i=i+1 ) {
69
                tmp = addrencode & mask;
70
                tmp=(tmp*pow);
71
                pos= pos + tmp;
72
                pow=pow * k;
73
                addrencode>>=kw;
74
        }
75
        return pos;
76
}
77
 
78
unsigned int endp_addr_encoder ( unsigned int id){
79
                        return fattree_addrencode(id, T1, T2);
80
}
81
 
82
unsigned int endp_addr_decoder (unsigned int code){
83
                return fattree_addrdecode(code, T1, T2);
84
}
85
 
86
 
87
void topology_init (void){
88
        unsigned int pos,level,port;
89
 
90
        Lw= Log2(L);
91
        Kw=Log2(K);
92
        LKw=L*Kw;
93
        RAw_FATTREE =  LKw + Lw;
94
        EAw_FATTREE  = LKw;
95
        NE_FATTREE = powi( K,L );
96
        NR_FATTREE = L * powi( K , L - 1 );  // total number of routers  
97
        DSTPw_FATTREE = K+1;
98
        MAX_P_FATTREE = 2*K;
99
        #define NRL (NE/K) //number of router in  each layer     
100
 
101
    unsigned int num = 0;
102
        //connect all down input chanels
103
        for (level = 0; level<L-1; level=level+1) {// : level_c
104
        /* verilator lint_off WIDTH */
105
                unsigned int  LEAVE_L = L-1-level;
106
        /* verilator lint_on WIDTH */
107
                //input chanel are numbered interleavely, the interleaev dep}s on level
108
                unsigned int ROUTERS_PER_NEIGHBORHOOD = powi(K,L-1-(level));
109
                unsigned int ROUTERS_PER_BRANCH = powi(K,L-1-(level+1));
110
                unsigned int LEVEL_OFFSET = ROUTERS_PER_NEIGHBORHOOD*K;
111
                for ( pos = 0; pos < NPOS; pos=pos+1 ) {// : pos_c
112
                    unsigned int ADRRENCODED=fattree_addrencode(pos,K,L);
113
                    unsigned int NEIGHBORHOOD = (pos/ROUTERS_PER_NEIGHBORHOOD);
114
                    unsigned int NEIGHBORHOOD_POS = pos % ROUTERS_PER_NEIGHBORHOOD;
115
                    for ( port = 0; port < K; port=port+1 ) {// : port_c
116
                        unsigned int LINK =
117
                            ((level+1)*CHAN_PER_LEVEL - CHAN_PER_DIRECTION)  //which levellevel
118
                            +NEIGHBORHOOD* LEVEL_OFFSET   //region in level
119
                            +port*ROUTERS_PER_BRANCH*K //sub region in region
120
                            +(NEIGHBORHOOD_POS)%ROUTERS_PER_BRANCH*K //router in subregion
121
                            +(NEIGHBORHOOD_POS)/ROUTERS_PER_BRANCH; //port on router
122
 
123
 
124
                        unsigned int L2= (LINK+CHAN_PER_DIRECTION)/CHAN_PER_LEVEL;
125
                        unsigned int POS2 = ((LINK+CHAN_PER_DIRECTION) % CHAN_PER_LEVEL)/K;
126
                        unsigned int PORT2= (((LINK+CHAN_PER_DIRECTION) % CHAN_PER_LEVEL)  %K)+K;
127
                        unsigned int ID1 =NRL*level+pos;
128
                        unsigned int ID2 =NRL*L2 + POS2;
129
                        unsigned int POS_ADR_CODE2= fattree_addrencode(POS2,K,L);
130
                        unsigned int POS_ADR_CODE1= fattree_addrencode(pos,K,L);
131
 
132
 
133
 
134
 
135
                       //fattree_connect(Ti(ID1),Ri(ID1),port,Ti(ID2),Ri(ID2),PORT2);
136 54 alirezamon
                        r2r_cnt_all[num] =(r2r_cnt_table_t){.id1=ID1, .t1=Ti(ID1), .r1=Ri(ID1), .p1=port, .id2=ID2, .t2=Ti(ID2), .r2=Ri(ID2), .p2=PORT2 };
137 48 alirezamon
                        unsigned int current_layer_addr = LEAVE_L;
138
                        unsigned int current_pos_addr   = ADRRENCODED;
139
                                unsigned int addr = (current_layer_addr << LKw)| current_pos_addr;
140
 
141
//printf( "[%u] = t1=%u, r1=%u, p1=%u, t2=%u, r2=%u, p2=%u \n",  num, r2r_cnt_all[num].t1, r2r_cnt_all[num].r1, r2r_cnt_all[num].p1, r2r_cnt_all[num].t2, r2r_cnt_all[num].r2, r2r_cnt_all[num].p2 );
142
                                 //assign current_r_addr [ID1] = {current_layer_addr [ID1],current_pos_addr[ID1]};
143 54 alirezamon
                                fatree_local_addr(Ti(ID1),Ri(ID1),  addr, ID1);
144 48 alirezamon
 
145 54 alirezamon
 
146 48 alirezamon
                                if(level==L-2){// 
147
                                        current_layer_addr  =0;
148
                                current_pos_addr = POS_ADR_CODE2;
149
                                        addr = (current_layer_addr << LKw)| current_pos_addr;
150
                                 //assign current_r_addr [ID2] = {current_layer_addr [ID2],current_pos_addr[ID2]};
151 54 alirezamon
                                        fatree_local_addr(Ti(ID2),Ri(ID2),  addr, ID2);
152 48 alirezamon
                                }//if
153
                     num++;
154
                     }
155
                }
156
        }
157 54 alirezamon
 
158
        R2R_TABLE_SIZ=num;
159
 
160 48 alirezamon
        for ( pos = 0; pos <  NE; pos=pos+1 ) {// : }points
161
                unsigned int RID= NRL*(L-1)+(pos/K);
162
                unsigned int RPORT = pos%K;
163
                //connected router encoded address
164
                unsigned int  CURRENTPOS=   fattree_addrencode(pos/K,K,L);
165
 
166
 
167
                //assign router_chan_out [RID][RPORT] =    chan_in_all [pos];                     
168
                //assign chan_out_all [pos] = router_chan_in [RID][RPORT]; 
169
                //assign er_addr [pos] = CURRENTPOS [RAw-1 : 0];
170
 
171
                r2e_cnt_all[pos].r1=Ri(RID);
172
                r2e_cnt_all[pos].p1=RPORT;
173
                er_addr [pos] = CURRENTPOS;
174
 
175
                //printf( "[%u] =r1=%u,p1=%u\n",pos,r2e_cnt_all[pos].r1,r2e_cnt_all[pos].p1);
176
 
177
                //connect_r2e(2,Ri(RID),RPORT,pos);     
178
   }
179
}
180
 
181
 
182
 
183 54 alirezamon
void topology_connect_r2r (int n){
184
        fattree_connect(r2r_cnt_all[n]);
185
}
186 48 alirezamon
 
187 54 alirezamon
void topology_connect_r2e (int n){
188
        connect_r2e(2,r2e_cnt_all[n].r1,r2e_cnt_all[n].p1,n);
189
}
190 48 alirezamon
 
191
 
192
 
193 54 alirezamon
/*
194 48 alirezamon
void topology_connect_all_nodes (void){
195
 
196
        unsigned int pos,level,port;
197
        unsigned int num = 0;
198
 
199
        for (level = 0; level<L-1; level=level+1) {// : level_c
200
                for ( pos = 0; pos < NPOS; pos=pos+1 ) {// : pos_c
201
                   for ( port = 0; port < K; port=port+1 ) {// : port_c
202
 
203
                        fattree_connect(r2r_cnt_all[num]);
204
                        num++;
205
 
206
                     }
207
                }
208
        }
209
 
210
 
211
        for ( pos = 0; pos <  NE; pos=pos+1 ) {// : }points
212
 
213
 
214
                connect_r2e(2,r2e_cnt_all[pos].r1,r2e_cnt_all[pos].p1,pos);
215
 
216
 
217
         }
218
 
219
}
220 54 alirezamon
*/
221 48 alirezamon
 
222
 
223
unsigned int get_mah_distance ( unsigned int id1, unsigned int id2){
224
 
225
        unsigned int k =T1;
226
        unsigned int l =T2;
227
 
228
        unsigned int pow,tmp1,tmp2;
229
        unsigned int distance=0;
230
        pow=1;
231
        for (unsigned int i = 0; i <l; i=i+1 ) {
232
                tmp1=(id1/pow);
233
                tmp2=(id2/pow);
234
                tmp1=tmp1 % k;
235
                tmp2=tmp2 % k;
236
                pow=pow * k;
237
                if(tmp1!=tmp2) distance= (i+1)*2-1 ; //distance obtained based on the highest level index which differ
238
 
239
        }
240
         return distance;
241
}
242
 
243
 
244
 
245
 
246
 
247
#endif

powered by: WebSVN 2.1.0

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