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/] [Integration_test/] [synthetic_sim/] [src/] [src.pl] - Blame information for rev 56

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 54 alirezamon
#!/usr/bin/perl -w
2
 
3 56 alirezamon
use lib "../perl_lib";
4
 
5
use List::MoreUtils qw(uniq);
6 54 alirezamon
use Proc::Background;
7
use File::Path qw( rmtree );
8 56 alirezamon
use Cwd 'abs_path';
9 54 alirezamon
 
10
my $script_path = dirname(__FILE__);
11
my $dirname = "$script_path/..";
12
my $root = "$dirname/../..";
13
 
14
my $rtl_dir = "$ENV{PRONOC_WORK}/verify/rtl";
15
my $work    = "$ENV{PRONOC_WORK}/verify/work";
16
my $src_verilator = "$root/src_verilator";
17
my $src_c = "$root/src_c";
18
my $src = "$script_path";
19
my $report = "$dirname/report";
20
 
21 56 alirezamon
#require "$root/perl_gui/lib/perl/common.pl";
22 54 alirezamon
require "$root/perl_gui/lib/perl/topology.pl";
23
 
24
use strict;
25
use warnings;
26
 
27
my $pp;
28
        $pp= do "$src/deafult_noc_param";
29
        die "Error reading: $@" if $@;
30
 
31
        my $param = $pp->{'noc_param'};
32
        my %default_noc_param=%{$param};
33
        my @params=object_get_attribute_order($pp,'noc_param');
34
 
35
 
36
 
37
#read default param
38
 
39
 
40
sub recompile_synful {
41
 
42
#recmpile synful
43
my      $cmd ="cd $src_c/synfull/traffic-generator/src; make; wait;\n";
44
                #run command in terminal
45
                print "*******************compile synful******************\n$cmd\n";
46
                my $proc1 = Proc::Background->new($cmd);
47
                $proc1->alive;
48
                $proc1->wait;
49
                $proc1->die;
50
 
51
}
52
 
53
sub gen_noc_param_h{
54
        my $mpsoc=shift;
55
        my $param_h="\n\n//NoC parameters\n";
56
 
57
        my $topology = $mpsoc->object_get_attribute('noc_param','TOPOLOGY');
58
        $topology =~ s/"//g;
59
        $param_h.="\t#define  IS_${topology}\n";
60
 
61
        my ($NE, $NR, $RAw, $EAw, $Fw) = get_topology_info($mpsoc);
62
 
63
        my @params=$mpsoc->object_get_attribute_order('noc_param');
64
        my $custom_topology = $mpsoc->object_get_attribute('noc_param','CUSTOM_TOPOLOGY_NAME');
65
        foreach my $p (@params){
66
                my $val=$mpsoc->object_get_attribute('noc_param',$p);
67
                next if($p eq "CUSTOM_TOPOLOGY_NAME");
68
                $val=$custom_topology if($p eq "TOPOLOGY" && $val eq "\"CUSTOM\"");
69
                if($p eq "MCAST_ENDP_LIST" || $p eq "ESCAP_VC_MASK"){
70
                        $val="$NE".$val if($p eq 'MCAST_ENDP_LIST');
71
                        $val =~ s/\'/\\\'/g;
72
                        $val="\"$val\"";
73
                }
74
                $param_h=$param_h."\t#define $p\t$val\n";
75
 
76
                #print "$p:$val\n";
77
 
78
        }
79
 
80
 
81
        my $v=$mpsoc->object_get_attribute('noc_param',"V")-1;
82
        my $escape=$mpsoc->object_get_attribute('noc_param',"ESCAP_VC_MASK");
83
        if (! defined $escape){
84
                #add_text_to_string (\$param_h,"\tlocalparam [$v        :0] ESCAP_VC_MASK=1;\n");
85
                #add_text_to_string (\$pass_param,".ESCAP_VC_MASK(ESCAP_VC_MASK),\n"); 
86
        }
87
        #add_text_to_string (\$param_h," \tlocalparam  CVw=(C==0)? V : C * V;\n");
88
        #add_text_to_string (\$pass_param,".CVw(CVw)\n");
89
 
90
        #remove 'b and 'h
91
        #$param_h =~ s/\d\'b/ /g;
92
        #$param_h =~ s/\'h/ /g;
93
 
94
 
95
        return  $param_h;
96
}
97
 
98
 
99
sub gen_sim_parameter_h {
100
        my ($param_h,$includ_h,$ne,$nr,$router_p,$fifow)=@_;
101
 
102
        $param_h =~ s/\d\'b/ /g;
103
        my $text=  "
104
#ifndef     INCLUDE_PARAM
105
        #define   INCLUDE_PARAM \n \n
106
 
107
        $param_h
108
 
109
        #define NE  $ne
110
        #define NR  $nr
111
        #define ROUTER_P_NUM $router_p
112
 
113
        extern Vtraffic         *traffic[NE];
114
        extern Vpck_inj     *pck_inj[NE];
115
        extern int reset,clk;
116
 
117
        //simulation parameter
118
        #define MAX_RATIO   1000
119
        #define AVG_LATENCY_METRIC \"HEAD_2_TAIL\"
120
        #define TIMSTMP_FIFO_NUM   $fifow
121
 
122
        $includ_h
123
\n \n \#endif" ;
124
        return $text;
125
}
126
 
127
 
128
sub extract_and_update_noc_sim_statistic {
129
        my ($stdout)=@_;
130
        my $avg_latency =capture_number_after("average packet latency =",$stdout);
131
        my $avg_flit_latency =capture_number_after("average flit latency =",$stdout);
132
        my $sd_latency =capture_number_after("standard_dev =",$stdout);
133
        my $avg_thput =capture_number_after("Avg throughput is:",$stdout);
134
        my $total_time =capture_number_after("simulation clock cycles:",$stdout);
135
        my $latency_perhop = capture_number_after("average latency per hop =",$stdout);
136
        my %packet_rsvd_per_core = capture_cores_data("total number of received packets:",$stdout);
137
        my %worst_rsvd_delay_per_core = capture_cores_data('worst-case-delay of received packets \(clks\):',$stdout);
138
        my %packet_sent_per_core = capture_cores_data("total number of sent packets:",$stdout);
139
        my %worst_sent_delay_per_core = capture_cores_data('worst-case-delay of sent packets \(clks\):',$stdout);
140
 
141
 
142
}
143
 
144
sub get_model_parameter {
145
        my $model =shift;
146
        my $o;
147
        $o= do $model;
148
        my %new_param=%{$o};
149
    die "Error reading: $@" if $@;
150
        my %temp;
151
        foreach my $p (@params){
152
                $temp{$p} = $default_noc_param{$p};
153
        }
154
        foreach my $p (sort keys %new_param){
155
                $temp{$p} = $new_param{$p};
156
        }
157
        return %temp;
158
}
159
 
160
sub gen_noc_localparam_v {
161
        my ($m,$ref) = @_;
162
        my %model = %{$ref};
163
        my %temp;
164
 
165
 
166
        foreach my $p (@params){
167
                $temp{$p} = $default_noc_param{$p};
168
        $m->{noc_param}{$p}=$default_noc_param{$p};
169
        }
170
        foreach my $p (sort keys %model){
171
                $temp{$p} = $model{$p};
172
                $m->{noc_param}{$p}=$model{$p};
173
        }
174
 
175
        object_add_attribute_order($m,'noc_param',@params);
176
 
177
        my $param_v="`ifdef NOC_LOCAL_PARAM \n";
178
        foreach my $p (@params){
179
                $param_v.="localparam $p = $temp{$p};\n";
180
        }
181
        $param_v.="`endif\n";
182
 
183
        my ($nr,$ne,$router_p,$ref_tops,$includ_h) = get_noc_verilator_top_modules_info($m);
184
        my %tops = %{$ref_tops};
185
        $tops{Vtraffic} = "--top-module traffic_gen_top";
186
        $tops{Vpck_inj} = "--top-module packet_injector_verilator";
187
 
188
 
189
 
190
 
191
        my $param_h=gen_noc_param_h($m);
192
        $includ_h = gen_sim_parameter_h($param_h,$includ_h,$ne,$nr,$router_p,'16');
193
 
194
        return ($param_v,$includ_h,\%tops);
195
 
196
}
197
 
198
 
199
sub copy_src_files{
200
 
201
        if(defined $ENV{PRONOC_WORK}){
202
                rmtree("$rtl_dir");
203
                unless (-d "$rtl_dir"){
204
                        print "make a working directory inside $rtl_dir\n";
205
                        mkdir("$rtl_dir", 0700);
206
 
207
                }
208
        }else{
209
                        print  "Please set PRONOC_WORK variable first!";
210
                        exit;
211
        }
212
 
213
        dircopy("$root/rtl/src_noc"    , "$rtl_dir/src_noc"    ) or die("$!\n") unless (-d "$rtl_dir/src_noc"    );
214
    dircopy("$root/rtl/src_topolgy", "$rtl_dir/src_topolgy") or die("$!\n") unless (-d "$rtl_dir/src_topolgy");
215
 
216
    unlink "$rtl_dir/src_noc/noc_localparam.v";
217
    for my $file (glob "$root/rtl/*.v") {
218
                 copy $file, "$rtl_dir" or die $! ;
219
        }
220
 
221
 
222
 
223
}
224
 
225
 
226
 
227
 
228
sub gen_file_list{
229
        my $path=shift;
230
        my $f="+incdir+$rtl_dir/
231
+incdir+$rtl_dir/src_noc/
232
+incdir+$path
233
";
234
 
235
        my @files = File::Find::Rule->file()
236
                          ->name( '*.v','*.V','*.sv' )
237
                          ->in( "$rtl_dir" );
238
 
239
        #make sure source files have key word 'module' 
240
        my @sources;
241
        foreach my $p (@files){
242
                push (@sources,$p)      if(check_file_has_string($p,'endpackage'));
243
        }
244
        foreach my $p (@files){
245
                push (@sources,$p)      if(check_file_has_string($p,'module'));
246
        }
247
        my $files = join ("\n",@sources);
248
        $f.=$files;
249
 
250
 
251
        open(FILE,  ">$path/file_list.f") || die "Can not open: $!";
252
        print FILE $f;
253
        close FILE;
254
}
255
 
256
sub gen_verilator_sh{
257
        my ($ref,$file)=@_;
258
        my %tops = %{$ref};
259
        my $make_lib="";
260
    my $jobs=0;
261
        my $cmd= '#!/bin/bash
262
        SCRPT_FULL_PATH=$(realpath ${BASH_SOURCE[0]})
263
        SCRPT_DIR_PATH=$(dirname $SCRPT_FULL_PATH)
264
 
265
        cmn="-O3  -CFLAGS -O3"
266
        currentver=$(verilator --version | head -n1 | cut -d" " -f2)
267
        requiredver="4.0.0"
268
        if [ "$(printf \'%s\n\' "$requiredver" "$currentver" | sort -V | head -n1)" = "$requiredver" ]; then
269
        echo "Verilator vesrion Greater than or equal to ${requiredver}, compile with -Wno-TIMESCALEMOD flag"
270
                cmn=" $cmn -Wno-TIMESCALEMOD";
271
        else
272
        echo "Verilator vesrion is Less than ${requiredver}"
273
        fi
274
';
275
 
276
        foreach my $top (sort keys %tops) {
277
                $cmd.= "verilator  -f \$SCRPT_DIR_PATH/file_list.f --cc $tops{$top}  --prefix \"$top\" \$cmn & \n";
278
        }
279
        $cmd.="wait\n";
280
        foreach my $top (sort keys %tops) {
281
 
282
                $cmd.="
283
        if ! [ -f \$SCRPT_DIR_PATH/obj_dir/$top.cpp ]; then
284
                echo  \"Failed to generate: \$SCRPT_DIR_PATH/obj_dir/$top.cpp \"
285
                exit 1
286
        fi\n";
287
                $make_lib.="make lib$jobs &\n";
288
                $jobs++;
289
        }
290
 
291
 
292
        $cmd.="
293
cd \$SCRPT_DIR_PATH/obj_dir/
294
$make_lib
295
wait
296
 
297
make sim
298
";
299
        save_file("$file",$cmd);
300
 
301
}
302
 
303
sub get_model_names {
304
        my ($mref,$inref) = @_;
305
        my @models = @{$mref};
306
        my ($paralel_run,$MIN,$MAX,$STEP,$model_dir)=@{$inref};
307
        my $full_path;
308
        $full_path = "$model_dir" if (-d "$model_dir");
309
        $full_path = "$dirname/$model_dir" if (-d "$dirname/$model_dir");
310
        if (!defined  $full_path){
311
                 die "Error the model directory  $model_dir or $dirname/$model_dir is not found\n";
312
        }
313
        my @m;
314
        if(scalar @models == 0){
315
                @m = glob("$full_path/*");
316
                return @m;
317
        }
318
        foreach my $p (@models) {
319
                push (@m,"$full_path/$p");
320
        }
321
        return @m;
322
}
323
 
324
 
325 56 alirezamon
sub check_models_are_exsited {
326
        my ($mref, $inref) = @_;
327
        my @models = get_model_names(@_);
328
        foreach my $m (@models){
329
                unless (-f $m ){
330
                        die "Error: no such file $m";
331
                }
332
        }
333
}
334
 
335
 
336 54 alirezamon
sub gen_models {
337
        my ($mref, $inref) = @_;
338
        my @models = get_model_names(@_);
339
 
340
 
341
    mkdir("$work", 0700);
342
        foreach my $m (@models){
343
                print "$m\n";
344 56 alirezamon
                unless (-f $m ){
345
                        die "Error: no such file $m";
346
                }
347 54 alirezamon
                #make noc localparam
348
                my $o;
349
                $o= do $m;
350
        die "Error reading: $@" if $@;
351
                my $param = $o->{'noc_param'};
352
                my ($fname,$fpath,$fsuffix) = fileparse("$m",qr"\..[^.]*$");
353
 
354
 
355
                my $name = $fname;
356
                my $make =$o->{'makefile'};
357
 
358
 
359
                my      ($param_v,$include_h,$tops)=   gen_noc_localparam_v( $o,$param);
360
 
361
                mkdir("$work/$name", 0700);
362
                rmtree("$work/$name/obj_dir");
363
        mkdir("$work/$name/obj_dir", 0700);
364
                save_file("$work/$name/noc_localparam.v",$param_v);
365
 
366
                #generate file list             
367
                gen_file_list("$work/$name");
368
                gen_verilator_sh($tops,"$work/$name/verilator.sh");
369
 
370
 
371
 
372
                #copy C files
373
                my @files = File::Find::Rule->file()
374
                          ->name( '*.h' )
375
                          ->in( "$src_verilator" );
376
                foreach my $p (@files){
377
                        copy $p, "$work/$name/obj_dir/";
378
                }
379
                copy "$src_verilator/simulator.cpp", "$work/$name/obj_dir/testbench.cpp";
380
 
381
                #copy nettrace & synful
382
            dircopy("$src_c/netrace-1.0","$work/$name/obj_dir/netrace-1.0");
383
            dircopy("$src_c/synfull","$work/$name/obj_dir/synful");
384
 
385
 
386
 
387
 
388
                #generate make file
389
                gen_verilator_makefile($tops,"$work/$name/obj_dir/Makefile");
390
                #generate param.h file
391
 
392
 
393
                save_file("$work/$name/obj_dir/parameter.h",$include_h);
394
 
395
 
396
        }
397
 
398
}
399
 
400
 
401
 
402
 
403
 
404
 
405
sub compile_models{
406
        my($self,$inref,$mref)=@_;
407
    my ($paralel_run,$MIN,$MAX,$STEP) = @{$inref};
408
 
409
 
410
        my @models = get_model_names($mref,$inref);
411
 
412
        #generate compile command
413
        my $i=0;
414
        my $cmd;
415
        foreach my $m (@models){
416
                my ($fname,$fpath,$fsuffix) = fileparse("$m",qr"\..[^.]*$");
417
                $cmd.=" cd $work/$fname;  bash verilator.sh >  $work/$fname/out.log 2>&1  &\n";
418
                $i++;
419
                $cmd.="wait\n" if(($i % $paralel_run)==0) ;
420
        }
421
        $cmd.="wait\n" if(($i % $paralel_run)!=0) ;
422
        #run command in terminal
423
        print "*******************compile models******************\n$cmd\n";
424
        my $proc1 = Proc::Background->new($cmd);
425
        $proc1->alive;
426
        $proc1->wait;
427
        $proc1->die;
428
 
429
}
430
sub check_compilation_log {
431
        my ($name,$ref,$inref) = @_;
432
    my @log_report_match =@{$ref};
433
        my ($paralel_run,$MIN,$MAX,$STEP) = @{$inref};
434
        my $logfile     = "$work/$name/out.log";
435
 
436
        my @found;
437
        foreach my $m (@log_report_match){
438
                open my $INPUT, '<', $logfile;
439
                push(@found , grep ( /$m/, <$INPUT>)) ;
440
                close($INPUT);
441
        }
442
 
443
        foreach my $line (@found) {
444
              append_text_to_file($report,"\t $line\n");
445
    }
446
}
447
 
448
 
449
 
450
 
451
 
452
sub check_compilation {
453
        my ($self,$ref1,$inref,$mref)=@_;
454
 
455
        my @models = get_model_names($mref,$inref);
456
 
457
        foreach my $m (@models){
458
                my ($name,$fpath,$fsuffix) = fileparse("$m",qr"\..[^.]*$");
459
                append_text_to_file($report,"****************************$name : Compile *******************************:\n");
460
                #check if testbench is generated successfully   
461
                if(-f "$work/$name/obj_dir/testbench"){
462
                        append_text_to_file($report,"\t model is generated successfully.\n");
463
                        check_compilation_log($name,$ref1,$inref);
464
 
465
                }else{
466
                        append_text_to_file($report,"\t model generation is FAILED.\n");
467
                        check_compilation_log($name,$ref1,$inref);
468
                }
469
 
470
        }
471
}
472
 
473
 
474
sub run_all_models {
475
        my ($self,$inref,$mref) =@_;
476
    my ($paralel_run,$MIN,$MAX,$STEP) = @{$inref};
477
        my @models = get_model_names($mref,$inref);
478
    foreach my $m (@models){
479
                run_traffic ($self,$m,'random',$inref);
480
        }
481
        foreach my $m (@models){
482
                run_traffic ($self,$m,'transposed 1',$inref);
483
        }
484
}
485
 
486
 
487
 
488
sub run_traffic {
489
        my ($self,$model,$traffic,$inref)=@_;
490
     my ($paralel_run,$MIN,$MAX,$STEP) = @{$inref};
491
        my ($name,$fpath,$fsuffix) = fileparse("$model",qr"\..[^.]*$");
492
 
493
        my %param = get_model_parameter($model);
494
        my $min_pck = $param{'MIN_PCK_SIZE'};
495
 
496
    append_text_to_file($report,"****************************$name      : $traffic traffic *******************************:\n");
497
        unless (-f "$work/$name/obj_dir/testbench"){
498
                append_text_to_file($report,"\t failed. Simulation model is not avaialable\n");
499
                return;
500
        }
501
 
502
 
503
 
504
        my $file_name="${traffic}_results";
505
    $file_name =~ s/\s+//g;
506
 
507
        mkdir("$work/$name/$file_name/", 0700);
508
 
509
        my $i=0;
510
        my $cmd;
511
 
512
 
513
        for (my $inject=$MIN; $inject<=$MAX; $inject+=$STEP){
514
                $cmd.="$work/$name/obj_dir/testbench -t \"$traffic\"   -m \"R,$min_pck,10\"  -n  20000  -c      10000   -i $inject -p \"100,0,0,0,0\" >  $work/$name/$file_name/sim$inject 2>&1  &\n";
515
                $i++;
516
                $cmd.="wait\n" if(($i % $paralel_run)==0) ;
517
        }
518
        $cmd.="wait\n" if(($i % $paralel_run)!=0) ;
519
        #run command in terminal
520
        print "*******************run models******************\n$cmd\n";
521
        my $proc1 = Proc::Background->new($cmd);
522
        $proc1->alive;
523
        $proc1->wait;
524
        $proc1->die;
525
 
526
        check_sim_results($self,$name,$traffic,$inref);
527
 
528
}
529
 
530
 
531
sub extract_result {
532
        my ($self,$file,$filed)=@_;
533
 
534
        my @r = unix_grep($file,$filed);
535
    my $string = $r[0];
536
    $string =~ s/[^0-9.]+//g;
537
        return $string;
538
 
539
}
540
 
541
sub get_zero_load_and_saturation{
542
        my ($self,$name,$traffic,$path)=@_;
543
        my %results;
544
        my $ref = $self->{'name'}{"$name"}{'traffic'}{$traffic}{"packet_latency"};
545
        return if !defined $ref;
546
        %results = %{$ref};
547
 
548
        my $zero_latency=9999999;
549
    my $saturat_inject=100;
550
    my $zero_inject;
551
    my $saturat_latency='-';
552
 
553
        my $txt = "#name:$name\n";
554
 
555
        foreach my $inj (sort {$a <=> $b} keys %results){
556
                $txt.="$inj $results{$inj}\n";
557
                if ($zero_latency > $results{$inj}) {
558
                        $zero_latency = $results{$inj};
559
                        $zero_inject  = $inj;
560
                }
561
        }
562
        # assum saturation happens when the latency is 5 times of zero load
563
        foreach my $inj (sort {$a <=> $b} keys %results){
564
                if($results{$inj} >= 5 * $zero_latency ) {
565
                        if($saturat_inject > $inj){
566
                                $saturat_inject =$inj;
567
                                $saturat_latency=$results{$inj};
568
                        }
569
                }
570
        }
571
        $txt.="\n";
572
        save_file("$path/packet_latency.sv",$txt);
573
 
574
 
575
        return ($zero_inject,$zero_latency, $saturat_inject,$saturat_latency);
576
}
577
 
578
 
579
 
580
 
581
sub check_sim_results{
582
        my ($self,$name,$traffic,$inref)=@_;
583
    my ($paralel_run,$MIN,$MAX,$STEP) = @{$inref};
584
    my $file_name="${traffic}_results";
585
    $file_name =~ s/\s+//g;
586
        my $results_path = "$work/$name/$file_name";
587
 
588
        #my @results = glob("$results_path/*");
589
        #check for error
590
 
591
        for (my $inject=$MIN; $inject<=$MAX; $inject+=$STEP){
592
                my $file = "$results_path/sim$inject";
593
 
594
                my @errors = unix_grep("$file","ERROR:");
595
                if (scalar @errors  ){
596
                        append_text_to_file($report,"\t Error in running simulation: @errors \n");
597
                        $self->{'name'}{"$name"}{'traffic'}{$traffic}{'overal_result'}="Failed";
598
                        $self->{'name'}{"$name"}{'traffic'}{$traffic}{'message'}="@errors";
599
                        return;
600
                }
601
                my @r = unix_grep($file,"\ttotal,");
602
        my $string = $r[0];
603
                my @fileds=split(',',$string);
604
                my $val=$fileds[11];
605
                $val =~ s/[^0-9.]+//g;
606
        #       my $val = extract_result($self,$file,"average packet latency");         
607
                if(length $val ==0){
608
                        $self->{'name'}{"$name"}{'traffic'}{$traffic}{'overal_result'}="Failed";
609
                        $self->{'name'}{"$name"}{'traffic'}{$traffic}{'message'}="The average packet latency is undefined for $inject";
610
                        return;
611
                }
612
                $self->{'name'}{"$name"}{'traffic'}{$traffic}{"packet_latency"}{$inject}="$val";
613
 
614
        }
615
        my  ($z,$zl, $s,$sl) = get_zero_load_and_saturation ($self,$name,$traffic,$results_path);
616
        print "($z,$zl, $s,$sl)\n";
617
 
618
        #save results in a text file 
619
 
620
 
621
 
622
        append_text_to_file($report,"\t Passed:   zero load ($z,$zl) saturation ($s,$sl)\n");
623
    $self->{'name'}{"$name"}{'traffic'}{$traffic}{'overal_result'}="passed";
624
}
625
 
626 56 alirezamon
 
627
sub object_get_attribute_order{
628
        my ($self,$attribute)=@_;
629
        return unless(defined $self->{parameters_order}{$attribute});
630
        my @order=@{$self->{parameters_order}{$attribute}};
631
        return uniq(@order)
632
}
633
 
634
sub save_file {
635
        my  ($file_path,$text)=@_;
636
        open my $fd, ">$file_path" or die "could not open $file_path: $!";
637
        print $fd $text;
638
        close $fd;
639
}
640
 
641
sub object_add_attribute_order{
642
        my ($self,$attribute,@param)=@_;
643
        my $r = $self->{'parameters_order'}{$attribute};
644
        my @a;
645
        @a = @{$r} if(defined $r);
646
        push (@a,@param);
647
        @a=uniq(@a);
648
        $self->{'parameters_order'}{$attribute} =\@a;
649
}
650
 
651
sub append_text_to_file {
652
        my  ($file_path,$text)=@_;
653
        open(my $fd, ">>$file_path") or die "could not open $file_path: $!";
654
        print $fd $text;
655
        close $fd;
656
}
657
 
658
sub object_add_attribute{
659
        my ($self,$attribute1,$attribute2,$value)=@_;
660
        if(!defined $attribute2){$self->{$attribute1}=$value;}
661
        else {$self->{$attribute1}{$attribute2}=$value;}
662
 
663
}
664
 
665
 
666
 
667
sub object_get_attribute{
668
        my ($self,$attribute1,$attribute2)=@_;
669
        if(!defined $attribute2) {return $self->{$attribute1};}
670
        return $self->{$attribute1}{$attribute2};
671
}
672
 
673
sub powi{ # x^y
674
        my ($x,$y)=@_; # compute x to the y
675
        my $r=1;
676
        for (my $i = 0; $i < $y; ++$i ) {
677
        $r *= $x;
678
        }
679
  return $r;
680
}
681
 
682
sub sum_powi{ # x^(y-1) + x^(y-2) + ...+ 1;
683
        my ($x,$y)=@_; # compute x to the y
684
        my $r = 0;
685
    for (my $i = 0; $i < $y; $i++){
686
        $r += powi( $x, $i );
687
    }
688
        return $r;
689
}
690
 
691
sub log2{
692
        my $num=shift;
693
        my $log=($num <=1) ? 1: 0;
694
        while( (1<< $log)  < $num) {
695
                                $log++;
696
        }
697
        return  $log;
698
}
699
 
700
 
701
sub remove_not_hex {
702
        my $s=shift;
703
        $s =~ s/[^0-9a-fA-F]//g;
704
        return $s;
705
}
706
 
707
sub remove_not_number {
708
        my $s=shift;
709
        $s =~ s/[^0-9]//g;
710
        return $s;
711
 
712
}
713
 
714
sub check_file_has_string {
715
    my ($file,$string)=@_;
716
    my $r;
717
    open(FILE,$file);
718
    if (grep{/$string/} <FILE>){
719
       $r= 1; #print "word  found\n";
720
    }else{
721
       $r= 0; #print "word not found\n";
722
    }
723
    close FILE;
724
    return $r;
725
}
726
 
727
 
728
sub gen_verilator_makefile{
729
        my ($top_ref,$target_dir) =@_;
730
        my %tops = %{$top_ref};
731
        my $p='';
732
        my $q='';
733
        my $h='';
734
        my $l;
735
        my $lib_num=0;
736
        my $all_lib="";
737
        foreach my $top (sort keys %tops) {
738
                $p = "$p ${top}__ALL.a ";
739
                $q = $q."lib$lib_num:\n\t\$(MAKE) -f ${top}.mk\n";
740
                $h = "$h ${top}.h ";
741
                $l = $top;
742
                $all_lib=$all_lib." lib$lib_num";
743
                $lib_num++;
744
        }
745
 
746
        my $make= "
747
 
748
default: sim
749
 
750
 
751
 
752
include $l.mk
753
 
754
lib: $all_lib
755
 
756
$q
757
 
758
 
759
#######################################################################
760
# Compile flags
761
 
762
CPPFLAGS += -DVL_DEBUG=1
763
ifeq (\$(CFG_WITH_CCWARN),yes)  # Local... Else don't burden users
764
CPPFLAGS += -DVL_THREADED=1
765
CPPFLAGS += -W -Werror -Wall
766
endif
767
 
768
SLIB =
769
HLIB =
770
ifneq (\$(wildcard synful/synful.a),)
771
SLIB += synful/synful.a
772
HLIB += synful/synful.h
773
endif
774
 
775
#######################################################################
776
# Linking final exe -- presumes have a sim_main.cpp
777
 
778
 
779
sim:    testbench.o \$(VK_GLOBAL_OBJS) $p \$(SLIB)
780
        \$(LINK) \$(LDFLAGS) -g \$^ \$(LOADLIBES) \$(LDLIBS) -o testbench \$(LIBS) -Wall -O3 -lpthread 2>&1 | c++filt
781
 
782
testbench.o: testbench.cpp $h  \$(HLIB)
783
 
784
clean:
785
        rm *.o *.a testbench
786
";
787
 
788
save_file ($target_dir,$make);
789
 
790
}
791
 
792
 
793
sub get_project_dir{ #mpsoc directory address
794
        my $dir = Cwd::getcwd();
795
        my @p=  split('/perl_gui',$dir);
796
        @p=     split('/Integration_test',$p[0]);
797
    my $d         = abs_path("$p[0]/../");
798
 
799
        return $d;
800
}
801
 
802
#return lines containig pattern in a givn file
803
sub unix_grep {
804
        my ($file,$pattern)=@_;
805
    open(FILE,$file);
806
    my @arr = <FILE>;
807
    my @lines = grep /$pattern/, @arr;
808
        return @lines;
809
}
810
 
811
 
812
sub regen_object {
813
        my $path=shift;
814
        $path = get_full_path_addr($path);
815
        my $pp= eval { do $path };
816
        my $r= ($@ || !defined $pp);
817
        return ($pp,$r,$@);
818
}
819
 
820
sub get_full_path_addr{
821
        my $file=shift;
822
        my $dir = Cwd::getcwd();
823
        my $full_path = "$dir/$file";
824
        return $full_path  if -f ($full_path );
825
        return $file;
826
}

powered by: WebSVN 2.1.0

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