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/] [perl_gui/] [lib/] [perl/] [topology.pl] - Blame information for rev 48

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 43 alirezamon
#!/usr/bin/perl -w
2
 
3 48 alirezamon
#this file contains NoC topology related sub-functions
4 43 alirezamon
 
5 48 alirezamon
use constant::boolean;
6 43 alirezamon
use strict;
7
use warnings;
8
 
9
use FindBin;
10
use lib $FindBin::Bin;
11
 
12
sub get_topology_info {
13
        my ($self) =@_;
14
        my $topology=$self->object_get_attribute('noc_param','TOPOLOGY');
15
        my $T1=$self->object_get_attribute('noc_param','T1');
16
        my $T2=$self->object_get_attribute('noc_param','T2');
17
        my $T3=$self->object_get_attribute('noc_param','T3');
18
        my $V = $self->object_get_attribute('noc_param','V');
19
        my $Fpay = $self->object_get_attribute('noc_param','Fpay');
20
 
21
        return get_topology_info_sub($topology, $T1, $T2, $T3,$V, $Fpay);
22
}
23
 
24
 
25
 
26
sub get_topology_info_sub {
27
 
28
        my ($topology, $T1, $T2, $T3,$V, $Fpay)=@_;
29
 
30
        my $NE; # number of end points
31
        my $NR; # number of routers
32
        my $RAw; # routers address width
33
        my $EAw; # Endpoints address width
34
 
35
 
36
        my $Fw = 2+$V+$Fpay;
37
        if($topology eq '"TREE"') {
38
                my $K =  $T1;
39
        my $L =  $T2;
40
        $NE = powi( $K,$L );
41
        $NR = sum_powi ( $K,$L );
42
        my $Kw=log2($K);
43
        my $LKw=$L*$Kw;
44
        my $Lw=log2($L);
45
        $RAw=$LKw + $Lw;
46 48 alirezamon
        $EAw = $LKw;
47 43 alirezamon
 
48
        }elsif($topology eq '"FATTREE"') {
49
                my $K =  $T1;
50
        my $L =  $T2;
51
                $NE = powi( $K,$L );
52 48 alirezamon
        $NR = $L * powi( $K , $L - 1 );
53 43 alirezamon
        my $Kw=log2($K);
54
        my $LKw=$L*$Kw;
55
        my $Lw=log2($L);
56
        $RAw=$LKw + $Lw;
57 48 alirezamon
        $EAw = $LKw;
58 43 alirezamon
 
59
        }elsif ($topology eq '"RING"' || $topology eq '"LINE"'){
60
                my $NX=$T1;
61
                my $NY=1;
62
                my $NL=$T3;
63
                $NE = $NX*$NY*$NL;
64
        $NR = $NX*$NY;
65
        my $Xw=log2($NX);
66
        my $Yw=log2($NY);
67
        my $Lw=log2($NL);
68
        $RAw = $Xw;
69
        $EAw = ($NL==1) ? $RAw : $RAw + $Lw;
70
 
71 48 alirezamon
        }elsif ($topology eq '"MESH"' || $topology eq '"TORUS"' ) {
72 43 alirezamon
                my $NX=$T1;
73
                my $NY=$T2;
74
                my $NL=$T3;
75
                $NE = $NX*$NY*$NL;
76
                $NR = $NX*$NY;
77
        my $Xw=log2($NX);
78
        my $Yw=log2($NY);
79
        my $Lw=log2($NL);
80
        $RAw = $Xw + $Yw;
81
        $EAw = ($NL==1) ? $RAw : $RAw + $Lw;
82 48 alirezamon
        }elsif ($topology eq '"FMESH"'){
83
                my $NX=$T1;
84
                my $NY=$T2;
85
                my $NL=$T3;
86
                $NE = $NX*$NY*$NL + 2*($NX + $NY);
87
                $NR = $NX*$NY;
88
        my $Xw=log2($NX);
89
        my $Yw=log2($NY);
90
        my $Lw=log2($NL);
91
        $RAw = $Xw + $Yw;
92
        $EAw = $RAw + log2(4+$NL);
93 43 alirezamon
 
94 48 alirezamon
        }elsif ($topology eq '"STAR"' ) {
95
                $NE= $T1;
96
                $NR= 1;
97
                $RAw=log2($NR);
98
                $EAw=log2($NE);
99
 
100
        }else{ #custom
101
                $NE= $T1;
102
                $NR= $T2;
103
                $RAw=log2($NR);
104
                $EAw=log2($NE);
105
        }
106 43 alirezamon
        return ($NE, $NR, $RAw, $EAw, $Fw);
107
}
108
 
109
 
110
sub fattree_addrencode {
111
        my ( $pos, $k, $l)=@_;
112
        my  $pow; my $ tmp;
113
        my $addrencode=0;
114
        my $kw=log2($k);
115
        $pow=1;
116
        for (my $i = 0; $i <$l; $i=$i+1 ) {
117
                $tmp=int($pos/$pow);
118
                $tmp=$tmp % $k;
119
                $tmp=$tmp<<($i)*$kw;
120
                $addrencode=$addrencode | $tmp;
121
                $pow=$pow * $k;
122
        }
123
         return $addrencode;
124
}
125
 
126
sub fattree_addrdecode{
127
        my ($addrencode, $k, $l)=@_;
128
        my $kw=0;
129
        my $mask=0;
130
        my $pow; my $tmp;
131
        my $pos=0;
132
        while((0x1<<$kw) < $k){
133
                $kw++;
134
                $mask<<=1;
135
                $mask|=0x1;
136
        }
137
        $pow=1;
138
        for (my $i = 0; $i <$l; $i=$i+1 ) {
139
                $tmp = $addrencode & $mask;
140
                #printf("tmp1=%u\n",tmp);
141
                $tmp=($tmp*$pow);
142
                $pos= $pos + $tmp;
143
                $pow=$pow * $k;
144
                $addrencode>>=$kw;
145
        }
146
        return $pos;
147
}
148
 
149 48 alirezamon
 
150
 
151
 
152
 
153
 
154
 
155
 
156
 
157 43 alirezamon
sub get_connected_router_id_to_endp{
158
        my ($self,$endp_id)=@_;
159
        my $topology=$self->object_get_attribute('noc_param','TOPOLOGY');
160
        my $T1=$self->object_get_attribute('noc_param','T1');
161
        my $T2=$self->object_get_attribute('noc_param','T2');
162
        my $T3=$self->object_get_attribute('noc_param','T3');
163
        if($topology eq '"FATTREE"' || $topology eq '"TREE"') {
164
                return int($endp_id/$T1);
165 48 alirezamon
        }elsif ($topology eq '"RING"' || $topology eq '"LINE"'  ||  $topology eq '"MESH"' || $topology eq '"TORUS"'){
166 43 alirezamon
                 return int($endp_id/$T3);
167 48 alirezamon
        }elsif ($topology eq '"STAR"' ) {
168
                 return 0;#there is only one routerin star topology
169
        }elsif ($topology eq '"FMESH"'){
170
                my $tmp = $T1*$T2*$T3;
171
                return int($endp_id/$T3) if($endp_id<$tmp);
172
                return $endp_id-$tmp if($endp_id<$tmp+$T1);
173
                return ($endp_id-$tmp-$T1)+ $T1*($T2-1) if($endp_id<$tmp+2*$T1);
174
                return ($endp_id-$tmp-2*$T1)*$T1 if($endp_id<$tmp+2*$T1+$T2);
175
                return ($endp_id-$tmp-2*$T1-$T2+1)*$T1-1;
176
 
177
        }else{#custom
178
                my @er_addr = $self->object_get_attribute('noc_connection','er_addr');
179
                return $er_addr[$endp_id];
180 43 alirezamon
        }
181
}
182
 
183
 
184 48 alirezamon
sub fmesh_addrencode{
185
        my($id,$T1,$T2,$T3)=@_;
186
        my  ($y, $x, $l,$p, $diff,$mul);
187
        $mul  = $T1*$T2*$T3;
188
 
189
        my  $LOCAL   =   0;
190
        my      $EAST    =   1;
191
        my      $NORTH   =   2;
192
        my      $WEST    =   3;
193
        my      $SOUTH   =   4;
194
 
195
        if($id < $mul) {
196
                $y = (($id/$T3) / $T1 );
197
                $x = (($id/$T3) % $T1 );
198
                $l = ( $id %$T3);
199
                $p = ($l==0)? $LOCAL : 4+$l;
200
        }else{
201
                $diff = $id -  $mul ;
202
                if( $diff <  $T1){ #top mesh edge
203
                        $y = 0;
204
                        $x = $diff;
205
                        $p = $NORTH;
206
                }
207
                elsif ( $diff < 2* $T1) { #bottom mesh edge 
208
                        $y = $T2-1;
209
                        $x = $diff-$T1;
210
                        $p = $SOUTH;
211
                }
212
                elsif ( $diff < (2* $T1)+$T2 ) { #left mesh edge 
213
                        $y = $diff - (2* $T1);
214
                        $x = 0;
215
                        $p = $WEST;
216
                }
217
                else {  #right mesh edge 
218
                        $y = $diff - (2* $T1) -$T2;
219
                        $x = $T1-1;
220
                        $p = $EAST;
221
                }
222
        }
223
        my $NXw=log2($T1);
224
        my $NYw=log2($T2);
225
    my $addrencode=0;
226
    $addrencode = ($p<<($NXw+$NYw)|  ($y << $NXw) | $x);
227
    return $addrencode;
228
}
229
 
230
sub fmesh_endp_addr_decoder {
231
        my ($code, $T1, $T2, $T3)=@_;
232
        my ($x, $y, $p) =mesh_tori_addr_sep ($code, $T1, $T2, $T3);
233
        my  $LOCAL   =   0;
234
        my      $EAST    =   1;
235
        my      $NORTH   =   2;
236
        my      $WEST    =   3;
237
        my      $SOUTH   =   4;
238
        return (($y*$T1)+$x)*$T3 if($p== $LOCAL);
239
        return (($y*$T1)+$x)*$T3+($p-$SOUTH) if($p > $SOUTH);
240
        return (($T1*$T2*$T3) + $x) if($p== $NORTH);
241
        return (($T1*$T2*$T3) + $T1 + $x) if($p== $SOUTH);
242
        return (($T1*$T2*$T3) + 2*$T1 + $y) if($p== $WEST );
243
        return (($T1*$T2*$T3) + 2*$T1 + $T2 + $y) if($p== $EAST );
244
        return 0; #should not reach here
245
}
246
 
247
 
248
 
249
 
250
 
251 43 alirezamon
sub get_router_num {
252
        my ($self,$x, $y)=@_;
253
        my $topology=$self->object_get_attribute('noc_param','TOPOLOGY');
254
        my $T1=$self->object_get_attribute('noc_param','T1');
255
        my $T2=$self->object_get_attribute('noc_param','T2');
256
        if($topology eq '"FATTREE"') {
257
                return fattree_addrdecode($x, $T1, $T2);
258 48 alirezamon
        }elsif ($topology eq '"RING"' || $topology eq '"LINE"' ||  $topology eq '"FMESH"'  ||  $topology eq '"MESH"' || $topology eq '"TORUS"'){
259 43 alirezamon
                 return ($y*$T1)+$x;
260 48 alirezamon
        }else{#custom
261
                #It is not used for custom & STAR topology 
262 43 alirezamon
        }
263
}
264
 
265
sub router_addr_encoder{
266
        my ($self, $id)=@_;
267
        my $topology=$self->object_get_attribute('noc_param','TOPOLOGY');
268
        my $T1=$self->object_get_attribute('noc_param','T1');
269
        my $T2=$self->object_get_attribute('noc_param','T2');
270
        my $T3=$self->object_get_attribute('noc_param','T3');
271
        if($topology eq '"FATTREE"' || $topology eq '"TREE"') {
272
                return fattree_addrencode($id, $T1, $T2);
273 48 alirezamon
        }elsif ($topology eq '"RING"' || $topology eq '"LINE"'  ||  $topology eq '"MESH"' || $topology eq '"FESH"' || $topology eq '"TORUS"'){
274 43 alirezamon
                return mesh_tori_addrencode($id,$T1, $T2,1);
275 48 alirezamon
        }else { #custom & STAR
276
                return $id;
277 43 alirezamon
        }
278
}
279
 
280
sub endp_addr_encoder{
281
        my ($self, $id)=@_;
282
        my $topology=$self->object_get_attribute('noc_param','TOPOLOGY');
283
        my $T1=$self->object_get_attribute('noc_param','T1');
284
        my $T2=$self->object_get_attribute('noc_param','T2');
285
        my $T3=$self->object_get_attribute('noc_param','T3');
286
        if($topology eq '"FATTREE"' || $topology eq '"TREE"') {
287
                return fattree_addrencode($id, $T1, $T2);
288 48 alirezamon
        }elsif ($topology eq '"RING"' || $topology eq '"LINE"'  ||  $topology eq '"MESH"' || $topology eq '"TORUS"'){
289
                return mesh_tori_addrencode($id,$T1, $T2,$T3);
290
        }elsif ($topology eq '"FMESH"' ){
291
                return  fmesh_addrencode($id,$T1, $T2,$T3);
292
        }else{#CUSTOM & STAR
293
                return $id;
294 43 alirezamon
        }
295
}
296
 
297
sub endp_addr_decoder {
298
        my ($self,$code)=@_;
299
        my $topology=$self->object_get_attribute('noc_param','TOPOLOGY');
300
        my $T1=$self->object_get_attribute('noc_param','T1');
301
        my $T2=$self->object_get_attribute('noc_param','T2');
302
        my $T3=$self->object_get_attribute('noc_param','T3');
303
        if($topology eq '"FATTREE"' || $topology eq '"TREE"') {
304
                return fattree_addrdecode($code, $T1, $T2);
305
        }
306 48 alirezamon
        elsif ($topology eq '"RING"' || $topology eq '"LINE"'  ||  $topology eq '"MESH"' || $topology eq '"TORUS"'){
307 43 alirezamon
                my ($x, $y, $l) = mesh_tori_addr_sep($code,$T1, $T2,$T3);
308 44 alirezamon
                #print "my ($x, $y, $l) = mesh_tori_addr_sep($code,$T1, $T2,$T3);\n";
309 43 alirezamon
                return (($y*$T1)+$x)*$T3+$l;
310 48 alirezamon
        }elsif ($topology eq '"FMESH"' ){
311
                return fmesh_endp_addr_decoder($code,$T1, $T2,$T3);
312
        }else{#custom & STAR
313
                return $code;
314 43 alirezamon
        }
315
}
316
 
317
sub mask_gen{
318
        my $k=shift;
319
        my $kw=0;
320
        my $mask=0;
321
        while((0x1<<$kw) < $k){
322
                $kw++;
323
                $mask<<=1;
324
                $mask|=0x1;
325
        }
326
        return $mask;
327
}
328
 
329
 
330
sub mesh_tori_addr_sep {
331
        my ($code,$NX, $NY,$NL)=@_;
332
        my ($x, $y, $l);
333
        my $NXw=log2($NX);
334
        my $NYw=log2($NY);
335
        $x = $code &  mask_gen($NX);
336
        $code>>=$NXw;
337
        $y = $code &   mask_gen($NY);
338
        $code>>=$NYw;
339
        $l = $code;
340 44 alirezamon
        return ($x, $y, $l);
341 43 alirezamon
}
342
 
343
sub mesh_tori_addrencode{
344
        my ($id,$T1, $T2,$T3)=@_;
345
        my ($x,$y,$l)=mesh_tori_addrencod_sep($id,$T1,$T2,$T3);
346
    return mesh_tori_addr_join($x,$y,$l,$T1, $T2,$T3);
347
}
348
 
349
sub  mesh_tori_addrencod_sep{
350
        my ($id,$T1,$T2,$T3)=@_;
351
        my ($x,$y,$l);
352
        $l=$id % $T3; # id%NL
353
        my $R= int($id / $T3);
354
        $x= $R % $T1;# (id/NL)%NX
355
        $y=int($R / $T1);# (id/NL)/NX
356
        return ($x,$y,$l);
357
}
358
 
359
sub mesh_tori_addr_join {
360
        my ($x, $y, $l,$T1, $T2,$T3)=@_;
361
        my $NXw=log2($T1);
362
        my $NYw=log2($T2);
363
    my $addrencode=0;
364
    $addrencode =($T3==1)?   ($y << $NXw | $x) : ($l<<($NXw+$NYw)|  ($y << $NXw) | $x);
365
    return $addrencode;
366
}
367
 
368
 
369
 
370
 
371
 
372
sub get_noc_verilator_top_modules_info {
373
        my ($self) =@_;
374
 
375
        my $topology=$self->object_get_attribute('noc_param','TOPOLOGY');
376
        my $T1=$self->object_get_attribute('noc_param','T1');
377
        my $T2=$self->object_get_attribute('noc_param','T2');
378
        my $T3=$self->object_get_attribute('noc_param','T3');
379
 
380
        my %tops;
381
        my %nr_p; # number of routers have $p port num
382
        my $router_p; #number of routers with different port number in topology 
383
 
384 48 alirezamon
        my ($ne, $nr, $RAw, $EAw)=get_topology_info($self);
385
 
386
        my $custom_include="";
387 43 alirezamon
        if($topology eq '"FATTREE"') {
388
                my $K =  $T1;
389
        my $L =  $T2;
390
        my $p2 = 2*$K;
391
        $router_p=2;
392
        my $NRL= $ne/$K; #number of router in  each layer
393
        $nr_p{1}=$NRL;
394
        $nr_p{2}=$nr-$NRL;
395
        $nr_p{p1}=$K;
396
        $nr_p{p2}=2*$K;
397
 
398
        %tops = (
399 48 alirezamon
                        #"Vrouter1" => "router_top_v_p${K}.v", 
400
                        #"Vrouter2" => "router_top_v_p${p2}.v", 
401
                        "Vrouter1" => "--top-module  router_top_v  -GP=${K}  ",
402
                        "Vrouter2" => "--top-module  router_top_v  -GP=${p2} ",
403
               # "Vnoc" => " --top-module noc_connection ",
404 43 alirezamon
 
405
        );
406
        }elsif ($topology eq '"TREE"'){
407
        my $K =  $T1;
408
        my $L =  $T2;
409
        my $p2 = $K+1;
410
        $router_p=2;# number of router with different port number                        
411
        $nr_p{1}=1;
412
        $nr_p{2}=$nr-1;
413
        $nr_p{p1}=$K;
414
        $nr_p{p2}=$K+1;
415
 
416
        %tops = (
417 48 alirezamon
                        #"Vrouter1" => "router_top_v_p${K}.v", 
418
                        #"Vrouter2" => "router_top_v_p${p2}.v",
419
                        "Vrouter1" => "--top-module  router_top_v  -GP=${K}  ",
420
                        "Vrouter2" => "--top-module  router_top_v  -GP=${p2} ",
421
               # "Vnoc" => " --top-module noc_connection ",             
422 43 alirezamon
        );
423
 
424
        }elsif ($topology eq '"RING"' || $topology eq '"LINE"'){
425
 
426
                $router_p=1;
427
                $nr_p{1}=$nr;
428
                my $ports= 3+$T3-1;
429
                $nr_p{p1}=$ports;
430
                %tops = (
431 48 alirezamon
                        #"Vrouter1" => "router_top_v_p${ports}.v", 
432
               "Vrouter1" => "--top-module  router_top_v  -GP=${ports}  ",
433
                  # "Vnoc" => " --top-module noc_connection ",
434 43 alirezamon
 
435
        );
436
 
437
 
438 48 alirezamon
        }elsif ($topology eq '"MESH"' || $topology eq '"TORUS"' || $topology eq '"FMESH"') {
439 43 alirezamon
 
440
        $router_p=1;
441
        $nr_p{1}=$nr;
442
        my $ports= 5+$T3-1;
443
                $nr_p{p1}=$ports;
444
        %tops = (
445 48 alirezamon
                #"Vrouter1" => "router_top_v_p${ports}.v",
446
                "Vrouter1" => "--top-module  router_top_v  -GP=${ports}  ",
447
              #  "Vnoc" => " --top-module noc_connection",
448 43 alirezamon
 
449
        );
450 48 alirezamon
    }elsif ($topology eq '"STAR"') {
451
         $router_p=1;# number of router with different port number
452
         my $ports= $T1;
453
         $nr_p{1}=1;
454
          %tops = (
455
                #"Vrouter1" => "router_top_v_p${ports}.v",
456
                "Vrouter1" => "--top-module  router_top_v  -GP=${ports}  ",
457
              #  "Vnoc" => " --top-module noc_connection",
458
 
459
        );
460 43 alirezamon
 
461 48 alirezamon
        }else {#custom
462
 
463
                my $dir =get_project_dir()."/mpsoc/rtl/src_topolgy";
464
                my $file="$dir/param.obj";
465
                my %param;
466
                if(-f $file){
467
                        my ($pp,$r,$err) = regen_object($file );
468
                if ($r){
469
                        print "**Error: cannot open $file file: $err\n";
470
                    return;
471
                 }
472
 
473
                        %param=%{$pp};
474
                }else {
475
                        print "**Error: cannot find $file \n";
476
                        return;
477
                }
478
 
479
            my $topology_name=$self->object_get_attribute('noc_param','CUSTOM_TOPOLOGY_NAME');
480
                my $ref=$param{$topology_name}{'ROUTER_Ps'};
481
                print $ref;
482
                my %router_ps= %{$ref};
483
                my $i=1;
484
                #%tops = ("Vnoc" => " --top-module noc_connection");
485
 
486
                #should sort neumeric. The router with smaller port number should comes first
487
 
488
                foreach my $p (sort { $a <=> $b } keys  %router_ps){
489
                        $nr_p{$i}=$router_ps{$p};
490
            $nr_p{"p$i"}=$p;
491
            #$tops{"Vrouter$i"}= "router_top_v_p${p}.v", 
492
            $tops{"Vrouter$i"}= "--top-module  router_top_v  -GP=${p}  ",
493
                        $i++;
494
 
495
                }
496
                $router_p=$i-1;
497
                ${topology_name} =~ s/\"+//g;
498
                $custom_include="#include \"${topology_name}_noc.h\"\n";
499
        }#else
500 43 alirezamon
 
501 48 alirezamon
 
502
 
503 43 alirezamon
        my $includ_h="\n";
504
        for (my $p=1; $p<=$router_p ; $p++){
505
                 $includ_h=$includ_h."#include \"Vrouter$p.h\" \n";
506
        }
507 48 alirezamon
        my $rns_num = $router_p+1;
508
        $includ_h.="int router_NRs[$rns_num];\n";
509 43 alirezamon
        for (my $p=1; $p<=$router_p ; $p++){
510
                 $includ_h=$includ_h."#define NR${p} $nr_p{$p}\n";
511 48 alirezamon
                 my $pnum= $nr_p{"p$p"};
512
                 $includ_h=$includ_h."Vrouter${p}               *router${p}[ $nr_p{$p} ];   // Instantiation of router with $pnum  port number\n";
513
 
514 43 alirezamon
        }
515
 
516 48 alirezamon
 
517
        my $st1='';
518
        my $st2='';
519
        my $st3='';
520
        my $st4='';
521
        my $st5='';
522
        my $st6='';
523
 
524
        my $i=1;
525
        my $j=0;
526
        my $accum=0;
527 43 alirezamon
        for (my $p=1; $p<=$router_p ; $p++){
528
                $includ_h=$includ_h."
529
 
530
 
531
 
532
";
533 48 alirezamon
#if             ROUTER_P_NUM >$j
534
 
535
#endif
536
 
537
$st2=$st2."
538
    router_NRs[$p] =$nr_p{$p};
539
        for(i=0;i<NR${i};i++)   router${i}[i]   = new Vrouter${i};
540
";
541
 
542
$st3=$st3."
543
        for(i=0;i<NR${i};i++){
544
                router${i}[i]->reset= reset;
545
                router${i}[i]->clk= clk ;
546 43 alirezamon
        }
547 48 alirezamon
";
548
 
549
$st4=$st4."
550
        for(i=0;i<NR${i};i++) router${i}[i]->eval();
551
";
552
 
553
 
554
$st5=$st5."
555
        for(i=0;i<NR${i};i++) router${i}[i]->final();
556
";
557
 
558
 
559
$st6=$st6."
560
        if (i<NR${i}){ router${i}[i]->eval(); return;}
561
        i-=     NR${i};
562
";
563
        $i++;
564
        $j++;
565
        $accum=$accum+$nr_p{$p};
566
 
567
}
568
 
569
 
570 43 alirezamon
$includ_h=$includ_h."
571
 
572 48 alirezamon
 
573 43 alirezamon
void Vrouter_new(){
574
        int i=0;
575 48 alirezamon
        $st2
576 43 alirezamon
}
577
 
578 48 alirezamon
$custom_include
579
 
580 43 alirezamon
void inline connect_routers_reset_clk(){
581
        int i;
582 48 alirezamon
        $st3
583 43 alirezamon
}
584
 
585
 
586
void inline routers_eval(){
587
        int i=0;
588 48 alirezamon
        $st4
589 43 alirezamon
}
590
 
591
void inline routers_final(){
592
        int i;
593 48 alirezamon
        $st5
594
}
595
 
596
void inline single_router_eval(int i){
597
        $st6
598
}
599
 
600
 
601
 
602 43 alirezamon
";
603 48 alirezamon
 
604
#$includ_h.=" void connect_all_nodes(){\n";
605
 
606
#my $dot_file=get_dot_file_text($self,'topology');
607
#print "$dot_file\n";
608
#my @lines =split ("\n",$dot_file);
609
#foreach my $l (@lines) {
610
#    if ( $l =~  m{#*\"\s*R(\d+)\"\s*:\s*\"[pP](\d+)\"\s*->\s*\"R(\d+)\"\s*:\s*\"[pP](\d+)\"} ) {
611
#               my ($R1, $P1, $R2,$P2) = ($1, $2,$3,$4);
612
#               $includ_h.=connect_sim_nodes ($self,$topology,$R1, $P1, $R2, $P2);
613
#               
614
#   
615
#       }
616
#       if ( $l =~  m{#*\"\s*R(\d+)\"\s*:\s*\"[pP](\d+)\"\s*->\s*\"[Tt](\d+)\"} ) {
617
#               my ($R1, $P1, $T) = ($1, $2,$3);
618
#               $includ_h.=connect_sim_nodes($self,$topology,$R1, $P1, $T);
619
#               
620
#   
621
#       }
622
#       if ( $l =~  m{#*\s*\"[Tt](\d+)\"\s*->\s*\"R(\d+)\"\s*:\s*\"[pP](\d+)\"} ) {
623
#               my ($T, $R1, $P1) = ($1, $2,$3);
624
#               $includ_h.=connect_sim_nodes($self,$topology,$R1, $P1, $T);
625
#       }
626
#} 
627
#$includ_h.="\n}\n";
628
 
629 43 alirezamon
         return ($nr,$ne,$router_p,\%tops,$includ_h);
630
}
631
 
632 48 alirezamon
sub connect_sim_nodes{
633
        my ($self,$topology,$R1, $P1, $R2, $P2)=@_;
634
        if(defined $P2){ #R2R
635
                if($topology eq '"FATTREE"' || $topology eq '"TREE"'){
636
 
637
                }else{
638
                        return connect_r2r(1,$R1, $P1,1, $R2, $P2);
639
 
640
                }
641
        }else {
642
                my $T=$R2;
643
                if($topology eq '"FATTREE"' || $topology eq '"TREE"'){
644
 
645
                }else{
646
                        return connect_r2t(1,$R1, $P1, $T);
647
 
648
                }
649
 
650
        }
651
 
652
 
653
}
654 43 alirezamon
 
655 48 alirezamon
sub connect_r2r{
656
        my ($vrouter1_num,$r1,$p1,$vrouter2_num,$r2,$p2)=@_;
657
return "
658
        memcpy(&router${vrouter1_num}[$r1]->chan_in[$p1], router${vrouter2_num}[$r2]->chan_out[$p2] , sizeof( router${vrouter1_num}[$r1]->chan_in[$p1] ) );
659
        memcpy(&router${vrouter2_num}[$r2]->chan_in[$p2], router${vrouter1_num}[$r1]->chan_out[$p1] , sizeof( router${vrouter1_num}[$r1]->chan_in[$p1] ) );
660
        ";
661
}
662
 
663
sub connect_r2t{
664
my ($vrouter1_num,$r1, $p1, $T)=@_;
665
return "
666
        memcpy(&router${vrouter1_num}[$r1]->chan_in[$p1], traffic[$T]->chan_out , sizeof( traffic[$T]->chan_in ) );
667
        memcpy(&traffic[$T]->chan_in, router${vrouter1_num}[$r1]->chan_out[$p1] , sizeof( traffic[$T]->chan_in ) );
668
        ";
669
}
670
 
671
 
672 43 alirezamon
sub gen_tiles_physical_addrsses_header_file{
673
        my ($self,$file)=@_;
674
        my $topology=$self->object_get_attribute('noc_param','TOPOLOGY');
675
        my $txt = "#ifndef PHY_ADDR_H
676
        #define PHY_ADDR_H\n\n";
677
 
678
        #add phy addresses
679 48 alirezamon
        my ($NE, $NR, $RAw, $EAw,$Fw)=get_topology_info($self);
680 43 alirezamon
        for (my $id=0; $id<$NE; $id++){
681
                my $phy= endp_addr_encoder($self,$id);
682
                my $hex = sprintf("0x%x", $phy);
683
                $txt=$txt."\t#define PHY_ADDR_ENDP_$id  $hex\n";
684
 
685
        }
686
 
687
 
688
        $txt=$txt."#endif\n";
689
        save_file($file,$txt);
690
}
691
 
692
 
693 48 alirezamon
sub get_endpoints_mah_distance {
694
        my ($self,$endp1,$endp2)=@_;
695
 
696
        my $router1=get_connected_router_id_to_endp($self,$endp1);
697
        my $router2=get_connected_router_id_to_endp($self,$endp2);
698
 
699
        my $topology=$self->object_get_attribute('noc_param','TOPOLOGY');
700
        if($topology eq '"FATTREE"' || $topology eq '"TREE"') {
701
                return fattree_mah_distance($self, $router1,$router2);
702
        }elsif ($topology eq '"RING"' || $topology eq '"LINE"'  ||  $topology eq '"MESH"' || $topology eq '"TORUS"' || $topology eq '"FMESH"' ){
703
                return mesh_tori_mah_distance($self, $router1,$router2);
704
        }elsif ($topology eq '"STAR"'){
705
                return 1;
706
        }else { #custom
707
                return undef;
708
        }
709
 
710
}
711 43 alirezamon
 
712 48 alirezamon
sub mesh_tori_mah_distance {
713
        my ($self, $router1,$router2)=@_;
714
        my $T1=$self->object_get_attribute('noc_param','T1');
715
        my $T2=$self->object_get_attribute('noc_param','T2');
716
        my ($x1,$y1,$l1) = mesh_tori_addrencod_sep ($router1,$T1,$T2,1);
717
        my ($x2,$y2,$l2) = mesh_tori_addrencod_sep ($router2,$T1,$T2,1);
718
        my $x_diff = ($x1 > $x2) ? ($x1 - $x2) : ($x2 - $x1);
719
        my $y_diff = ($y1 > $y2) ? ($y1 - $y2) : ($y2 - $y1);
720
        my $mah_distance = $x_diff + $y_diff;
721
        return $mah_distance;
722
}
723
 
724
sub fattree_mah_distance {
725
        my ($self, $router1,$router2)=@_;
726
        my $k =$self->object_get_attribute('noc_param','T1');
727
        my $l =$self->object_get_attribute('noc_param','T2');
728
 
729
        my  $pow;
730
        my $tmp1;
731
        my $tmp2;
732
        my $distance=0;
733
        $pow=1;
734
        for (my $i = 0; $i <$l; $i=$i+1 ) {
735
                $tmp1=int($router1/$pow);
736
                $tmp2=int($router2/$pow);
737
                $tmp1=$tmp1 % $k;
738
                $tmp2=$tmp2 % $k;
739
                $pow=$pow * $k;
740
                $distance= ($i+1)*2-1 if($tmp1!=$tmp2); # distance obtained based on the highest level index which differ 
741
 
742
        }
743
         return $distance;
744
}
745
 
746 43 alirezamon
1

powered by: WebSVN 2.1.0

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