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 54

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

powered by: WebSVN 2.1.0

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