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/] [mesh.h] - Blame information for rev 56

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 alirezamon
#ifndef MESH_H
2
        #define MESH_H
3
 
4
        #define  LOCAL          0
5 56 alirezamon
        #define  EAST       1
6
        #define  NORTH      2
7
        #define  WEST       3
8 48 alirezamon
        #define  SOUTH      4
9
 
10 56 alirezamon
        //ring line
11 48 alirezamon
        #define  FORWARD    1
12
        #define  BACKWARD   2
13
        #define router_id(x,y)  ((y * T1) +    x)
14 56 alirezamon
        #define endp_id(x,y,l)  ((y * T1) +    x) * T3 + l
15 48 alirezamon
 
16
 
17
 
18
        unsigned int nxw=0;
19
        unsigned int nyw=0;
20
        unsigned int maskx=0;
21
        unsigned int masky=0;
22
 
23
 
24
 
25
        void mesh_tori_addrencod_sep(unsigned int id, unsigned int *x, unsigned int *y, unsigned int *l){
26
                (*l)=id%T3; // id%NL
27
                (*x)=(id/T3)%T1;// (id/NL)%NX
28
                (*y)=(id/T3)/T1;// (id/NL)/NX
29
        }
30
 
31
 
32
        void mesh_tori_addr_sep(unsigned int code, unsigned int *x, unsigned int *y, unsigned int *l){
33
                (*x) = code &  maskx;
34
                code>>=nxw;
35
                (*y) = code &  masky;
36
                code>>=nyw;
37
                (*l) = code;
38
        }
39
 
40 56 alirezamon
        void ring_line_addr_sep(unsigned int code, unsigned int *x, unsigned int *l){
41
                (*x) = code &  maskx;
42
                code>>=nxw;
43
                (*l) = code;
44
        }
45 48 alirezamon
 
46
        unsigned int mesh_tori_addr_join(unsigned int x, unsigned int y, unsigned int l){
47
                unsigned int addrencode=0;
48
                addrencode =(T3==1)?   (y<<nxw | x) : (l<<(nxw+nyw)|  (y<<nxw) | x);
49
                return addrencode;
50
        }
51
 
52 56 alirezamon
    unsigned int ring_line_addr_join(unsigned int x, unsigned int l){
53
                unsigned int addrencode=0;
54
                addrencode =(T3==1)?   x : (l<<nxw) | x;
55
                return addrencode;
56
        }
57
 
58
 
59 48 alirezamon
        unsigned int mesh_tori_addrencode (unsigned int id){
60
                unsigned int y, x, l;
61
                mesh_tori_addrencod_sep(id,&x,&y,&l);
62
                return mesh_tori_addr_join(x,y,l);
63
        }
64
 
65 56 alirezamon
        unsigned int ring_line_addrencode (unsigned int id){
66
                unsigned int y , x, l;
67
                mesh_tori_addrencod_sep(id,&x,&y,&l);
68
                return ring_line_addr_join(x,l);
69
        }
70 48 alirezamon
 
71 56 alirezamon
 
72 48 alirezamon
        void fmesh_addrencod_sep(unsigned int id, unsigned int *x, unsigned int *y, unsigned int *p){
73
                unsigned int  l, diff,mul,addrencode;
74
                mul  = T1*T2*T3;
75
                if(id < mul) {
76
                        *y = ((id/T3) / T1 );
77
                        *x = ((id/T3) % T1 );
78
                        l = (id % T3);
79
                        *p = (l==0)? LOCAL : 4+l;
80
                }else{
81
                        diff = id -  mul ;
82
                        if( diff <  T1) { //top mesh edge
83
                                        *y = 0;
84
                                        *x = diff;
85
                                        *p = NORTH;
86
                        } else if  ( diff < 2* T1) { //bottom mesh edge
87
                                        *y = T2-1;
88
                                        *x = diff-T1;
89
                                        *p = SOUTH;
90
                        } else if  ( diff < (2* T1) + T2 ) { //left mesh edge
91
                                        *y = diff - (2* T1);
92
                                        *x = 0;
93
                                        *p = WEST;
94
                        } else { //right mesh edge
95
                                        *y = diff - (2* T1) -T2;
96
                                        *x = T1-1;
97
                                        *p = EAST;
98
                        }
99
                }
100
 
101
        }
102
 
103
 
104
        unsigned int fmesh_addrencode(unsigned int id){
105
        //input integer in,nx,nxw,nl,nyw,ny;
106
                unsigned int  y, x, p, addrencode;
107
                fmesh_addrencod_sep(id, &x, &y, &p);
108
                addrencode = ( p<<(nxw+nyw) | (y<<nxw) | x);
109
                return addrencode;
110
        }
111
 
112
 
113
        unsigned int fmesh_endp_addr_decoder (unsigned int code){
114
                unsigned int x, y, p;
115
                mesh_tori_addr_sep(code,&x,&y,&p);
116
                if(p== LOCAL)   return ((y*T1)+x)*T3;
117
                if(p > SOUTH)   return ((y*T1)+x)*T3+(p-SOUTH);
118
                if(p== NORTH)   return ((T1*T2*T3) + x);
119
                if(p== SOUTH)   return ((T1*T2*T3) + T1 + x);
120
                if(p== WEST )   return ((T1*T2*T3) + 2*T1 + y);
121
                if(p== EAST )   return ((T1*T2*T3) + 2*T1 + T2 + y);
122
                return 0;//should not reach here
123
        }
124
 
125
 
126
 
127
 
128
 
129
 
130
        unsigned int mesh_tori_endp_addr_decoder (unsigned int code){
131
                unsigned int x, y, l;
132
                mesh_tori_addr_sep(code,&x,&y,&l);
133
                //if(code==0x1a) printf("code=%x,x=%u,y=%u,l=%u\n",code,x,y,l);
134
                return ((y*T1)+x)*T3+l;
135
        }
136
 
137 56 alirezamon
        unsigned int ring_line_endp_addr_decoder (unsigned int code){
138
                unsigned int x, l;
139
                ring_line_addr_sep(code,&x,&l);
140
                //if(code==0x1a) printf("code=%x,x=%u,y=%u,l=%u\n",code,x,y,l);
141
                return x*T3+l;
142
        }
143 48 alirezamon
 
144 56 alirezamon
 
145
 
146
 
147 48 alirezamon
        unsigned int endp_addr_encoder ( unsigned int id){
148 56 alirezamon
                        #if defined (IS_MESH) || defined (IS_TORUS)
149 48 alirezamon
                                return mesh_tori_addrencode(id);
150 56 alirezamon
                        #elif  defined (IS_LINE) || defined (IS_RING )
151
                                return ring_line_addrencode(id);
152
                        #else
153
                                return fmesh_addrencode(id);
154 48 alirezamon
                        #endif
155
        }
156
 
157
 
158
        unsigned int endp_addr_decoder (unsigned int code){
159 56 alirezamon
                #if defined (IS_MESH) || defined (IS_TORUS)
160 48 alirezamon
                        return mesh_tori_endp_addr_decoder (code);
161 56 alirezamon
                #elif defined (IS_LINE) || defined (IS_RING )
162
                        return ring_line_endp_addr_decoder (code);
163 48 alirezamon
                #endif
164
                return fmesh_endp_addr_decoder (code);
165
        }
166
 
167
 
168 54 alirezamon
void topology_connect_r2r (int n){
169
        conect_r2r(1,r2r_cnt_all[n].r1,r2r_cnt_all[n].p1,1,r2r_cnt_all[n].r2,r2r_cnt_all[n].p2);
170
}
171 48 alirezamon
 
172 54 alirezamon
void topology_connect_r2e (int n){
173
        connect_r2e(1,r2e_cnt_all[n].r1,r2e_cnt_all[n].p1,n);
174
}
175 48 alirezamon
 
176
 
177 54 alirezamon
 
178
 
179
 
180
 
181
 
182
 
183
 
184
void topology_connect_all_nodes_old (void){
185
 
186 48 alirezamon
 
187
        unsigned int  x,y,l;
188 56 alirezamon
        #if defined (IS_LINE) || defined (IS_RING )
189
                        #define R2R_CHANELS_MESH_TORI   2
190
                        for  (x=0;   x<T1; x=x+1) {
191
 
192 54 alirezamon
                                router1[x]->current_r_addr = x;
193
                                router1[x]->current_r_id   = x;
194 56 alirezamon
                                if(x    <   T1-1){// not_last_node
195 48 alirezamon
                                        //assign  router_chan_in[x][FORWARD] = router_chan_out [(x+1)][BACKWARD];
196
                                        conect_r2r(1,x,FORWARD,1,(x+1),BACKWARD);
197
 
198
                                } else { //last_node
199
 
200
                                        #if defined (IS_LINE) // : line_last_x
201
                                                //assign  router_chan_in[x][FORWARD]= {SMARTFLIT_CHANEL_w{1'b0}};
202 56 alirezamon
                                                connect_r2gnd(1,x,FORWARD);
203 48 alirezamon
                                        #else // : ring_last_x
204
                                                //assign router_chan_in[x][FORWARD]= router_chan_out [0][BACKWARD];
205
                                                conect_r2r(1,x,FORWARD,1,0,BACKWARD);
206
                                        #endif
207
                                }
208 56 alirezamon
 
209 48 alirezamon
                                if(x>0){// :not_first_x
210
                                        //assign router_chan_in[x][BACKWARD]= router_chan_out [(x-1)][FORWARD];
211
                                        conect_r2r(1,x,BACKWARD,1,(x-1),FORWARD);
212
 
213
                                }else {// :first_x
214
                                        #if defined (IS_LINE) // : line_first_x
215
                                                //assign  router_chan_in[x][BACKWARD]={SMARTFLIT_CHANEL_w{1'b0}};                                       
216
                                                connect_r2gnd(1,x,BACKWARD);
217
                                        #else // : ring_first_x
218
                                                //assign  router_chan_in[x][BACKWARD]= router_chan_out [(NX-1)][FORWARD];                                                                                       
219
                                                conect_r2r(1,x,BACKWARD,1,(T1-1),FORWARD);
220
                                        #endif
221 56 alirezamon
                                }
222
 
223 48 alirezamon
                                // connect other local ports
224
                                for  (l=0;   l<T3; l=l+1) {// :locals
225 56 alirezamon
                                        unsigned int ENDPID = endp_id(x,0,l);
226
                                        unsigned int LOCALP = (l==0) ? l : l + R2R_CHANELS_MESH_TORI; // first local port is connected to router port 0. The rest are connected at the }
227 48 alirezamon
                                        //assign router_chan_in[x][LOCALP]= chan_in_all [ENDPID];
228
                                        //assign chan_out_all [ENDPID] = router_chan_out[x][LOCALP];
229
                                        connect_r2e(1,x,LOCALP,ENDPID);
230 56 alirezamon
                                        er_addr [ENDPID] = x;
231
 
232
                                }// locals
233
                        }//x
234 48 alirezamon
 
235
                #else // :mesh_torus
236 56 alirezamon
                        #define R2R_CHANELS_MESH_TORI   4
237 48 alirezamon
                        for (y=0;    y<T2;    y=y+1) {//: y_loop
238
                                for (x=0;    x<T1; x=x+1) {// :x_loop
239 56 alirezamon
                                unsigned int R_ADDR = (y<<nxw) + x;
240 48 alirezamon
                                unsigned int ROUTER_NUM = (y * T1) +    x;
241
                                //assign current_r_addr [ROUTER_NUM] = R_ADDR[RAw-1 :0];
242 56 alirezamon
                router1[ROUTER_NUM]->current_r_addr = R_ADDR;
243 54 alirezamon
                router1[ROUTER_NUM]->current_r_id   = ROUTER_NUM;
244 56 alirezamon
 
245 48 alirezamon
                                if(x    <    T1-1) {//: not_last_x
246
                                        //assign router_chan_in[`router_id(x,y)][EAST]= router_chan_out [`router_id(x+1,y)][WEST];
247
                                        conect_r2r(1,router_id(x,y),EAST,1,router_id(x+1,y),WEST);
248
 
249
                                }else {// :last_x
250
                                        #if defined (IS_MESH) // :last_x_mesh
251
                                                //      assign router_chan_in[`router_id(x,y)][EAST] = {SMARTFLIT_CHANEL_w{1'b0}};                                      
252
                                                connect_r2gnd(1,router_id(x,y),EAST);
253
                                        #elif defined (IS_TORUS) // : last_x_torus
254
                                                //assign router_chan_in[`router_id(x,y)][EAST] = router_chan_out [`router_id(0,y)][WEST];
255
                                                conect_r2r(1,router_id(x,y),EAST,1,router_id(0,y),WEST);
256
                                        #elif defined (IS_FMESH) //:last_x_fmesh
257
                                                //connect to endp
258
                                                unsigned int  EAST_ID = T1*T2*T3 + 2*T1 + T2 + y;
259
                                                connect_r2e(1,router_id(x,y),EAST,EAST_ID);
260
                                                er_addr [EAST_ID] = R_ADDR;
261
                                        #endif//topology
262
                                }
263 56 alirezamon
 
264
 
265 48 alirezamon
                                if(y>0) {// : not_first_y
266
                                        //assign router_chan_in[`router_id(x,y)][NORTH] =  router_chan_out [`router_id(x,(y-1))][SOUTH];                                        
267
                                        conect_r2r(1,router_id(x,y),NORTH,1,router_id(x,(y-1)),SOUTH);
268
                                }else {// :first_y
269
                                        #if defined (IS_MESH) // : first_y_mesh
270
                                                //assign router_chan_in[`router_id(x,y)][NORTH] =  {SMARTFLIT_CHANEL_w{1'b0}};                                                                                          
271 56 alirezamon
                                                connect_r2gnd(1,router_id(x,y),NORTH);
272 48 alirezamon
                                        #elif defined (IS_TORUS)// :first_y_torus
273
                                                //assign router_chan_in[`router_id(x,y)][NORTH] =  router_chan_out [`router_id(x,(T2-1))][SOUTH];
274
                                                conect_r2r(1,router_id(x,y),NORTH,1,router_id(x,(T2-1)),SOUTH);
275
                                        #elif defined (IS_FMESH) // :first_y_fmesh
276
                                                unsigned int NORTH_ID = T1*T2*T3 + x;
277
                                                connect_r2e(1,router_id(x,y),NORTH,NORTH_ID);
278
                                                er_addr [NORTH_ID] = R_ADDR;
279
                                        #endif//topology
280
                                }//y>0
281 56 alirezamon
 
282
 
283 48 alirezamon
                                if(x>0){// :not_first_x
284
                                        //assign    router_chan_in[`router_id(x,y)][WEST] =  router_chan_out [`router_id((x-1),y)][EAST];                                       
285
                                        conect_r2r(1,router_id(x,y),WEST,1,router_id((x-1),y),EAST);
286
                                }else {// :first_x
287 56 alirezamon
 
288 48 alirezamon
                                        #if defined (IS_MESH) // :first_x_mesh
289
                                                //assign    router_chan_in[`router_id(x,y)][WEST] =   {SMARTFLIT_CHANEL_w{1'b0}};
290
                                                connect_r2gnd(1,router_id(x,y),WEST);
291 56 alirezamon
 
292 48 alirezamon
                                        #elif defined (IS_TORUS) // :first_x_torus
293
                                                //assign    router_chan_in[`router_id(x,y)][WEST] =   router_chan_out [`router_id((NX-1),y)][EAST] ;                                            
294
                                                conect_r2r(1,router_id(x,y),WEST,1,router_id((T1-1),y),EAST);
295
                                        #elif defined (IS_FMESH) // :first_x_fmesh
296
                                                unsigned int WEST_ID = T1*T2*T3 + 2*T1 + y;
297
                                                connect_r2e(1,router_id(x,y),WEST,WEST_ID);
298
                                                er_addr [WEST_ID] = R_ADDR;
299
                                        #endif//topology
300 56 alirezamon
                                }
301
 
302 48 alirezamon
                                if(y    <    T2-1) {// : firsty
303
                                        //assign  router_chan_in[`router_id(x,y)][SOUTH] =    router_chan_out [`router_id(x,(y+1))][NORTH];                                     
304
                                        conect_r2r(1,router_id(x,y),SOUTH,1,router_id(x,(y+1)),NORTH);
305
                                }else     {// : lasty
306 56 alirezamon
 
307 48 alirezamon
                                        #if defined (IS_MESH) // :ly_mesh
308 56 alirezamon
 
309 48 alirezamon
                                                //assign  router_chan_in[`router_id(x,y)][SOUTH]=  {SMARTFLIT_CHANEL_w{1'b0}};
310
                                                connect_r2gnd(1,router_id(x,y),SOUTH);
311 56 alirezamon
 
312 48 alirezamon
                                        #elif defined (IS_TORUS) // :ly_torus
313
                                                //assign  router_chan_in[`router_id(x,y)][SOUTH]=    router_chan_out [`router_id(x,0)][NORTH];
314
                                                conect_r2r(1,router_id(x,y),SOUTH,1,router_id(x,0),NORTH);
315
                                        #elif defined (IS_FMESH)  // :ly_Fmesh
316
                                                unsigned int SOUTH_ID = T1*T2*T3 + T1 + x;
317
                                                connect_r2e(1,router_id(x,y),SOUTH,SOUTH_ID);
318
                                                er_addr [SOUTH_ID] = R_ADDR;
319
                                        #endif//topology
320 56 alirezamon
                                }
321
 
322
 
323 48 alirezamon
                                // endpoint(s) connection
324
                                // connect other local ports
325
                                for  (l=0;   l<T3; l=l+1) {// :locals
326 56 alirezamon
                                        unsigned int ENDPID = endp_id(x,y,l);
327
                                        unsigned int LOCALP = (l==0) ? l : l + R2R_CHANELS_MESH_TORI; // first local port is connected to router port 0. The rest are connected at the }
328
 
329 48 alirezamon
                                        //assign router_chan_in [`router_id(x,y)][LOCALP] =    chan_in_all [ENDPID];
330
                                        //assign chan_out_all [ENDPID] = router_chan_out [`router_id(x,y)][LOCALP];     
331
                                        //assign er_addr [ENDPID] = R_ADDR;             
332 56 alirezamon
                    connect_r2e(1,router_id(x,y),LOCALP,ENDPID);
333
                                        er_addr [ENDPID] = R_ADDR;
334
                                }// locals
335
 
336 48 alirezamon
                        }//y
337
                }//x
338 56 alirezamon
        #endif
339
 
340 48 alirezamon
 
341
}
342
 
343 54 alirezamon
#define fill_r2r_cnt(T1,R1,P1,T2,R2,P2) (r2r_cnt_table_t){.id1=R1,.t1=T1,.r1=R1,.p1=P1,.id2=R2,.t2=T2,.r2=R2,.p2=P2}
344 48 alirezamon
 
345
void topology_init(void){
346
        nxw=Log2(T1);
347
        nyw=Log2(T2);
348
    maskx = (0x1<<nxw)-1;
349
    masky = (0x1<<nyw)-1;
350 54 alirezamon
    unsigned int num=0;
351
    unsigned int  x,y,l;
352
    #if defined (IS_LINE) || defined (IS_RING )
353
        #define R2R_CHANELS_MESH_TORI   2
354
        for  (x=0;   x<T1; x=x+1) {
355
 
356
                router1[x]->current_r_addr = x;
357
                router1[x]->current_r_id   = x;
358
                if(x    <   T1-1){// not_last_node
359
                        //assign  router_chan_in[x][FORWARD] = router_chan_out [(x+1)][BACKWARD];
360
                        //conect_r2r(1,x,FORWARD,1,(x+1),BACKWARD);
361
                        r2r_cnt_all[num]=fill_r2r_cnt(1,x,FORWARD,1,(x+1),BACKWARD);
362
                        num++;
363
                } else { //last_node
364
                                        #if defined (IS_LINE) // : line_last_x
365
                                //assign  router_chan_in[x][FORWARD]= {SMARTFLIT_CHANEL_w{1'b0}};
366
                                        connect_r2gnd(1,x,FORWARD);
367
                                #else // : ring_last_x
368
                                //assign router_chan_in[x][FORWARD]= router_chan_out [0][BACKWARD];
369
                                        //conect_r2r(1,x,FORWARD,1,0,BACKWARD);
370
                                        r2r_cnt_all[num]=fill_r2r_cnt(1,x,FORWARD,1,0,BACKWARD);
371
                                        num++;
372
                                #endif
373
                        }
374
 
375
                                if(x>0){// :not_first_x
376
                                        //assign router_chan_in[x][BACKWARD]= router_chan_out [(x-1)][FORWARD];
377
                                        //conect_r2r(1,x,BACKWARD,1,(x-1),FORWARD);
378
                                        r2r_cnt_all[num]=fill_r2r_cnt(1,x,BACKWARD,1,(x-1),FORWARD);
379
                                        num++;
380
                                }else {// :first_x
381
                                        #if defined (IS_LINE) // : line_first_x
382
                                                //assign  router_chan_in[x][BACKWARD]={SMARTFLIT_CHANEL_w{1'b0}};
383
                                                connect_r2gnd(1,x,BACKWARD);
384
                                        #else // : ring_first_x
385
                                                //assign  router_chan_in[x][BACKWARD]= router_chan_out [(NX-1)][FORWARD];
386
                                                //conect_r2r(1,x,BACKWARD,1,(T1-1),FORWARD);
387
                                                r2r_cnt_all[num]=fill_r2r_cnt(1,x,BACKWARD,1,(T1-1),FORWARD);
388
                                                num++;
389
                                        #endif
390
                                }
391
 
392
                                // connect other local ports
393
                                for  (l=0;   l<T3; l=l+1) {// :locals
394
                                        unsigned int ENDPID = endp_id(x,0,l);
395
                                        unsigned int LOCALP = (l==0) ? l : l + R2R_CHANELS_MESH_TORI; // first local port is connected to router port 0. The rest are connected at the }
396
                                        //assign router_chan_in[x][LOCALP]= chan_in_all [ENDPID];
397
                                        //assign chan_out_all [ENDPID] = router_chan_out[x][LOCALP];
398
                                        //connect_r2e(1,x,LOCALP,ENDPID);
399
                                        r2e_cnt_all[ENDPID].r1=x;
400
                                        r2e_cnt_all[ENDPID].p1=LOCALP;
401
                                        er_addr [ENDPID] = x;
402
 
403
                                }// locals
404
                        }//x
405
 
406
                #else // :mesh_torus
407
                        #define R2R_CHANELS_MESH_TORI   4
408
                        for (y=0;    y<T2;    y=y+1) {//: y_loop
409
                                for (x=0;    x<T1; x=x+1) {// :x_loop
410
                                unsigned int R_ADDR = (y<<nxw) + x;
411
                                unsigned int ROUTER_NUM = (y * T1) +    x;
412
                                //assign current_r_addr [ROUTER_NUM] = R_ADDR[RAw-1 :0];
413
                        router1[ROUTER_NUM]->current_r_addr = R_ADDR;
414
                        router1[ROUTER_NUM]->current_r_id   = ROUTER_NUM;
415
 
416
                                if(x    <    T1-1) {//: not_last_x
417
                                        //assign router_chan_in[`router_id(x,y)][EAST]= router_chan_out [`router_id(x+1,y)][WEST];
418
                                        //conect_r2r(1,router_id(x,y),EAST,1,router_id(x+1,y),WEST);
419
                                        r2r_cnt_all[num]=fill_r2r_cnt(1,router_id(x,y),EAST,1,router_id(x+1,y),WEST);
420
                                        num++;
421
 
422
                                }else {// :last_x
423
                                        #if defined (IS_MESH) // :last_x_mesh
424
                                                //      assign router_chan_in[`router_id(x,y)][EAST] = {SMARTFLIT_CHANEL_w{1'b0}};
425
                                                connect_r2gnd(1,router_id(x,y),EAST);
426
                                        #elif defined (IS_TORUS) // : last_x_torus
427
                                                //assign router_chan_in[`router_id(x,y)][EAST] = router_chan_out [`router_id(0,y)][WEST];
428
                                                //conect_r2r(1,router_id(x,y),EAST,1,router_id(0,y),WEST);
429
                                                r2r_cnt_all[num]=fill_r2r_cnt(1,router_id(x,y),EAST,1,router_id(0,y),WEST);
430
                                                num++;
431
                                        #elif defined (IS_FMESH) //:last_x_fmesh
432
                                                //connect to endp
433
                                                unsigned int  EAST_ID = T1*T2*T3 + 2*T1 + T2 + y;
434
                                                //connect_r2e(1,router_id(x,y),EAST,EAST_ID);
435
                                                r2e_cnt_all[EAST_ID].r1=router_id(x,y);
436
                                                r2e_cnt_all[EAST_ID].p1=EAST;
437
                                                er_addr [EAST_ID] = R_ADDR;
438
                                        #endif//topology
439
                                }
440
 
441
 
442
                                if(y>0) {// : not_first_y
443
                                        //assign router_chan_in[`router_id(x,y)][NORTH] =  router_chan_out [`router_id(x,(y-1))][SOUTH];
444
                                        //conect_r2r(1,router_id(x,y),NORTH,1,router_id(x,(y-1)),SOUTH);
445
                                        r2r_cnt_all[num]=fill_r2r_cnt(1,router_id(x,y),NORTH,1,router_id(x,(y-1)),SOUTH);
446
                                        num++;
447
                                }else {// :first_y
448
                                        #if defined (IS_MESH) // : first_y_mesh
449
                                                //assign router_chan_in[`router_id(x,y)][NORTH] =  {SMARTFLIT_CHANEL_w{1'b0}};
450
                                                connect_r2gnd(1,router_id(x,y),NORTH);
451
                                        #elif defined (IS_TORUS)// :first_y_torus
452
                                                //assign router_chan_in[`router_id(x,y)][NORTH] =  router_chan_out [`router_id(x,(T2-1))][SOUTH];
453
                                                //conect_r2r(1,router_id(x,y),NORTH,1,router_id(x,(T2-1)),SOUTH);
454
                                                r2r_cnt_all[num]=fill_r2r_cnt(1,router_id(x,y),NORTH,1,router_id(x,(T2-1)),SOUTH);
455
                                                num++;
456
                                        #elif defined (IS_FMESH) // :first_y_fmesh
457
                                                unsigned int NORTH_ID = T1*T2*T3 + x;
458
                                                //connect_r2e(1,router_id(x,y),NORTH,NORTH_ID);
459
                                                r2e_cnt_all[NORTH_ID].r1=router_id(x,y);
460
                                                r2e_cnt_all[NORTH_ID].p1=NORTH;
461
                                                er_addr [NORTH_ID] = R_ADDR;
462
                                        #endif//topology
463
                                }//y>0
464
 
465
 
466
                                if(x>0){// :not_first_x
467
                                        //assign    router_chan_in[`router_id(x,y)][WEST] =  router_chan_out [`router_id((x-1),y)][EAST];
468
                                        //conect_r2r(1,router_id(x,y),WEST,1,router_id((x-1),y),EAST);
469
                                        r2r_cnt_all[num]=fill_r2r_cnt(1,router_id(x,y),WEST,1,router_id((x-1),y),EAST);
470
                                        num++;
471
 
472
                                }else {// :first_x
473
 
474
                                        #if defined (IS_MESH) // :first_x_mesh
475
                                                //assign    router_chan_in[`router_id(x,y)][WEST] =   {SMARTFLIT_CHANEL_w{1'b0}};
476
                                                connect_r2gnd(1,router_id(x,y),WEST);
477
 
478
                                        #elif defined (IS_TORUS) // :first_x_torus
479
                                                //assign    router_chan_in[`router_id(x,y)][WEST] =   router_chan_out [`router_id((NX-1),y)][EAST] ;
480
                                                //conect_r2r(1,router_id(x,y),WEST,1,router_id((T1-1),y),EAST);
481
                                                r2r_cnt_all[num]=fill_r2r_cnt(1,router_id(x,y),WEST,1,router_id((T1-1),y),EAST);
482
                                                num++;
483
                                        #elif defined (IS_FMESH) // :first_x_fmesh
484
                                                unsigned int WEST_ID = T1*T2*T3 + 2*T1 + y;
485
                                                //connect_r2e(1,router_id(x,y),WEST,WEST_ID);
486
                                                r2e_cnt_all[WEST_ID].r1=router_id(x,y);
487
                                                r2e_cnt_all[WEST_ID].p1=WEST;
488
                                                er_addr [WEST_ID] = R_ADDR;
489
                                        #endif//topology
490
                                }
491
 
492
                                if(y    <    T2-1) {// : firsty
493
                                        //assign  router_chan_in[`router_id(x,y)][SOUTH] =    router_chan_out [`router_id(x,(y+1))][NORTH];
494
                                //      conect_r2r(1,router_id(x,y),SOUTH,1,router_id(x,(y+1)),NORTH);
495
                                        r2r_cnt_all[num]=fill_r2r_cnt(1,router_id(x,y),SOUTH,1,router_id(x,(y+1)),NORTH);
496
                                        num++;
497
                                }else     {// : lasty
498
 
499
                                        #if defined (IS_MESH) // :ly_mesh
500
 
501
                                                //assign  router_chan_in[`router_id(x,y)][SOUTH]=  {SMARTFLIT_CHANEL_w{1'b0}};
502
                                                connect_r2gnd(1,router_id(x,y),SOUTH);
503
 
504
                                        #elif defined (IS_TORUS) // :ly_torus
505
                                                //assign  router_chan_in[`router_id(x,y)][SOUTH]=    router_chan_out [`router_id(x,0)][NORTH];
506
                                        //      conect_r2r(1,router_id(x,y),SOUTH,1,router_id(x,0),NORTH);
507
                                                r2r_cnt_all[num]=fill_r2r_cnt(1,router_id(x,y),SOUTH,1,router_id(x,0),NORTH);
508
                                                num++;
509
                                        #elif defined (IS_FMESH)  // :ly_Fmesh
510
                                                unsigned int SOUTH_ID = T1*T2*T3 + T1 + x;
511
                                                //connect_r2e(1,router_id(x,y),SOUTH,SOUTH_ID);
512
                                                r2e_cnt_all[SOUTH_ID].r1=router_id(x,y);
513
                                                r2e_cnt_all[SOUTH_ID].p1=SOUTH;
514
                                                er_addr [SOUTH_ID] = R_ADDR;
515
                                        #endif//topology
516
                                }
517
 
518
 
519
                                // endpoint(s) connection
520
                                // connect other local ports
521
                                for  (l=0;   l<T3; l=l+1) {// :locals
522
                                        unsigned int ENDPID = endp_id(x,y,l);
523
                                        unsigned int LOCALP = (l==0) ? l : l + R2R_CHANELS_MESH_TORI; // first local port is connected to router port 0. The rest are connected at the }
524
 
525
                                        //assign router_chan_in [`router_id(x,y)][LOCALP] =    chan_in_all [ENDPID];
526
                                        //assign chan_out_all [ENDPID] = router_chan_out [`router_id(x,y)][LOCALP];
527
                                        //assign er_addr [ENDPID] = R_ADDR;
528
                       // connect_r2e(1,router_id(x,y),LOCALP,ENDPID);
529
                        r2e_cnt_all[ENDPID].r1=router_id(x,y);
530
                        r2e_cnt_all[ENDPID].p1=LOCALP;
531
                                        er_addr [ENDPID] = R_ADDR;
532
                                }// locals
533
 
534
                        }//y
535
                }//x
536
        #endif
537
 
538
        R2R_TABLE_SIZ=num;
539
 
540 48 alirezamon
}
541
 
542
 
543
unsigned int get_mah_distance ( unsigned int id1, unsigned int id2){
544
        #if defined (IS_FMESH)
545
                unsigned int x1,y1,p1,x2,y2,p2;
546
                fmesh_addrencod_sep        ( id1, &x1, &y1, &p1);
547
                fmesh_addrencod_sep        ( id2, &x2, &y2, &p2);
548
    #else
549
                unsigned int x1,y1,l1,x2,y2,l2;
550
                mesh_tori_addrencod_sep(id1, &x1, &y1, &l1);
551
                mesh_tori_addrencod_sep(id2, &x2, &y2, &l2);
552
        #endif
553
 
554
        unsigned int x_diff = (x1 > x2) ? (x1 - x2) : (x2 - x1);
555
        unsigned int y_diff = (y1 > y2) ? (y1 - y2) : (y2 - y1);
556
        return x_diff + y_diff;
557
}
558
 
559
 
560
#endif

powered by: WebSVN 2.1.0

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