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/] [emulator.pl] - Blame information for rev 55

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

Line No. Rev Author Line
1 25 alirezamon
#! /usr/bin/perl -w
2 48 alirezamon
use constant::boolean;
3 25 alirezamon
use strict;
4
use warnings;
5 43 alirezamon
 
6
use FindBin;
7
use lib $FindBin::Bin;
8
 
9 25 alirezamon
use GD::Graph::Data;
10
use emulator;
11 48 alirezamon
 
12 25 alirezamon
use GD::Graph::colour qw/:colours/;
13
 
14
use File::Basename;
15
use File::Path qw/make_path/;
16 28 alirezamon
use File::Copy;
17
use File::Find::Rule;
18 25 alirezamon
 
19
require "widget.pl";
20
require "emulate_ram_gen.pl";
21
require "mpsoc_gen.pl";
22
require "mpsoc_verilog_gen.pl";
23
require "readme_gen.pl";
24 38 alirezamon
require "graph.pl";
25 43 alirezamon
require "topology.pl";
26 25 alirezamon
 
27
use List::MoreUtils qw(uniq);
28
 
29
 
30 28 alirezamon
# hardware parameters taken from noc_emulator.v
31
use constant PCK_CNTw =>30;  # packet counter width in bits (results in maximum of 2^30 = 1  G packets)
32
use constant PCK_SIZw =>14;  # packet size width in bits (results in maximum packet size of 2^14 = 16 K flit)
33 43 alirezamon
use constant MAX_EAw    =>8;   # maximum  destination address width
34 28 alirezamon
use constant MAXCw    =>4;   # 16 message classes  
35
use constant RATIOw   =>7;   # log2(100)
36 38 alirezamon
use constant RAM_Aw   =>7;
37
use constant RAM_RESERVED_ADDR_NUM=>8;
38
use constant MAX_PATTERN => ((2**RAM_Aw)-(RAM_RESERVED_ADDR_NUM));
39
use constant RAM_SIZE => (2**RAM_Aw);
40 25 alirezamon
 
41 28 alirezamon
 
42
#use constant MAX_PCK_NUM => (2**PCK_CNTw)-1;
43
use constant MAX_PCK_NUM => (2**PCK_CNTw)-1;
44
use constant MAX_PCK_SIZ => (2**PCK_SIZw)-1;
45 38 alirezamon
use constant MAX_SIM_CLKs=> 1000000000; # simulation end at if clock counter reach this number 
46 25 alirezamon
 
47 38 alirezamon
 
48
use constant MAX_RATIO => 1000;# 0->0 1->0.1 ...  1000->100
49 25 alirezamon
 
50 48 alirezamon
use constant EMULATION_TOP => "/mpsoc/rtl/src_emulate/emulator_top.v";
51 28 alirezamon
 
52 48 alirezamon
 
53 43 alirezamon
sub get_MAX_PCK_NUM(){MAX_PCK_NUM}
54
sub get_MAX_SIM_CLKs(){MAX_SIM_CLKs}
55
sub get_MAX_PCK_SIZ(){MAX_PCK_SIZ}
56 28 alirezamon
 
57 25 alirezamon
sub check_inserted_ratios {
58
                my $str=shift;
59
                my @ratios;
60
 
61 48 alirezamon
            my @chunks=split(/\s*,\s*/,$str);
62 25 alirezamon
            foreach my $p (@chunks){
63
                        if($p !~ /^[0-9.:,]+$/){ message_dialog ("$p has invalid character(S)" ); return undef; }
64
                        my @range=split(':',$p);
65
                        my $size= scalar @range;
66
                        if($size==1){ # its a number
67 54 alirezamon
                                if ( $range[0] <= 0 || $range[0] >100  ) { message_dialog ("Injection ratio $range[0] is out of bounds: 1<=ratio=<100" ); return undef; }
68 25 alirezamon
                                push(@ratios,$range[0]);
69
                        }elsif($size ==3){# its a range
70
                                my($min,$max,$step)=@range;
71 54 alirezamon
                                if ( $min <= 0 || $min >100  ) { message_dialog ("Injection ratio $min in  $p is out of bounds: 1<=ratio=<100" ); return undef; }
72
                                if ( $max <= 0 || $max >100  ) { message_dialog ("Injection ratio $max in  $p is out of bounds: 1<=ratio=<100" ); return undef; }
73 25 alirezamon
                                for (my $i=$min; $i<=$max; $i=$i+$step){
74
                                                push(@ratios,$i);
75
                                }
76
 
77
                        }else{
78 54 alirezamon
                                 message_dialog ("Injection ratio $p has an invalid format. The correct format for range is \[min\]:\[max\]:\[step\]" );
79
                                 return undef;
80 38 alirezamon
                        }
81 25 alirezamon
 
82
                }#foreach
83
                my @r=uniq(sort {$a<=>$b} @ratios);
84
                return \@r;
85
 
86
}
87
 
88
 
89
sub get_injection_ratios{
90
                my ($emulate,$atrebute1,$atrebute2)=@_;
91 48 alirezamon
                my $box =def_hbox(FALSE, 0);
92 25 alirezamon
                my $init=$emulate->object_get_attribute($atrebute1,$atrebute2);
93
                my $entry=gen_entry($init);
94
                my $button=def_image_button("icons/right.png",'Check');
95
                $button->signal_connect("clicked" => sub {
96
                        my $text= $entry->get_text();
97
                        my $r=check_inserted_ratios($text);
98
                        if(defined      $r){
99
                                my $all=  join (',',@$r);
100
                                message_dialog ("$all" );
101
                        }
102
 
103
 
104
                });
105
                $entry->signal_connect ("changed" => sub {
106
                        my $text= $entry->get_text();
107
                        $emulate->object_add_attribute($atrebute1,$atrebute2,$text);
108
 
109
                });
110
                $box->pack_start( $entry, 1,1, 0);
111
                $box->pack_start( $button, 0, 1, 3);
112
                return  $box;
113
}
114
 
115
 
116
 
117
sub get_noc_configuration{
118 38 alirezamon
        my ($emulate,$mode,$sample,$set_win) =@_;
119
        if($mode eq "simulate") {get_simulator_noc_configuration(@_); return;}
120
        get_emulator_noc_configuration(@_);
121
}
122
 
123
sub get_sof_file_full_addr{
124
        my ($emulate,$sample)=@_;
125
        my $open_in     = $emulate->object_get_attribute($sample,"sof_path");
126
        my $board       = $emulate->object_get_attribute($sample,"FPGA_board");
127
        my $file        = $emulate->object_get_attribute($sample,"sof_file");
128
        return undef if(!defined ${open_in} || !defined ${board} || !defined $file );
129
        my $sof = "${open_in}/${board}/$file";
130
        #print "\n$sof\n";
131
        return $sof;
132
}
133
 
134
 
135
sub get_emulator_noc_configuration{
136
        my ($emulate,$mode,$sample,$set_win) =@_;
137 28 alirezamon
        my $table=def_table(10,2,FALSE);
138
        my $row=0;
139 25 alirezamon
 
140 43 alirezamon
        my $traffics="tornado,transposed 1,transposed 2,bit reverse,bit complement,random,shuffle,bit rotation,neighbor"; #TODO hot spot for emulator
141 38 alirezamon
 
142
        #search path    
143 32 alirezamon
        my $dir = Cwd::getcwd();
144 38 alirezamon
        my $open_in       = abs_path("$ENV{PRONOC_WORK}/emulate/sof");
145 48 alirezamon
        attach_widget_to_table ($table,$row,gen_label_in_left("Search Path:"),gen_button_message ("Select the Path where the verilator simulation files are located. Different NoC verilated models can be generated using Generate NoC configuration tab.","icons/help.png"),
146 38 alirezamon
        get_dir_in_object ($emulate,$sample,"sof_path",undef,'ref_set_win',1,$open_in)); $row++;
147
        $open_in        = $emulate->object_get_attribute($sample,"sof_path");
148
 
149
 
150
 
151
        #select the board
152
        my($label,$param,$default,$content,$type,$info);
153
        my @dirs = grep {-d} glob("$open_in/*");
154
        my $fpgas;
155
        foreach my $dir (@dirs) {
156
                my ($name,$path,$suffix) = fileparse("$dir",qr"\..[^.]*$");
157
                $default=$name;
158
                $fpgas= (defined $fpgas)? "$fpgas,$name" : "$name";
159
        }
160
 
161
        attach_widget_to_table ($table,$row,gen_label_in_left("Select FPGA board:"),gen_button_message ("Select the FPGA board. You can add your own FPGA board by adding its configuration file to mpsoc/boards directory","icons/help.png"),
162
        gen_combobox_object ($emulate,$sample, "FPGA_board", $fpgas, undef,'ref_set_win',1)); $row++;
163
 
164
 
165
        #select the sram object file
166
        my $board       = $emulate->object_get_attribute($sample,"FPGA_board");
167
        my @files;
168
        @files = glob "${open_in}/${board}/*" if(defined $board);
169
        my $sof_files="";
170
        foreach my $file (@files){
171
                my ($name,$path,$suffix) = fileparse("$file",qr"\..[^.]*$");
172
                $sof_files="$sof_files,$name" if($suffix eq '.sof');
173
        }
174
        attach_widget_to_table ($table,$row,gen_label_in_left("Sram Object File:"),gen_button_message ("Select the verilator simulation file. Different NoC simulators can be generated using Generate NoC configuration tab.","icons/help.png"),
175
        gen_combobox_object ($emulate,$sample, "sof_file", $sof_files, undef,undef,undef)); $row++;
176 28 alirezamon
 
177 32 alirezamon
 
178 38 alirezamon
 
179
        #attach_widget_to_table ($table,$row,gen_label_in_left("SoF file:"),gen_button_message ("Select the SRAM Object File (sof) for this NoC configration.","icons/help.png"), get_file_name_object ($emulate,$sample,"sof_file",'sof',$open_in)); $row++;
180
 
181 25 alirezamon
 
182 32 alirezamon
   my @emulateinfo = (
183 38 alirezamon
        { label=>'Configuration name:', param_name=>'line_name', type=>'Entry', default_val=>$sample, content=>undef, info=>"NoC configration name. This name will be shown in load-latency graph for this configuration", param_parent=>$sample, ref_delay=> undef},
184 28 alirezamon
 
185 38 alirezamon
        { label=>"Traffic name", param_name=>'traffic', type=>'Combo-box', default_val=>'random', content=>$traffics, info=>"Select traffic pattern", param_parent=>$sample, ref_delay=>undef},
186 28 alirezamon
 
187 38 alirezamon
{ label=>"Packet size in flit:", param_name=>'PCK_SIZE', type=>'Spin-button', default_val=>4, content=>"2,".MAX_PCK_SIZ.",1", info=>undef, param_parent=>$sample, ref_delay=>undef},
188 28 alirezamon
 
189 38 alirezamon
        { label=>"Packet number limit per node:", param_name=>'PCK_NUM_LIMIT', type=>'Spin-button', default_val=>1000000, content=>"2,".MAX_PCK_NUM.",1", info=>"Each node stops sending packets when it reaches packet number limit  or simulation clock number limit", param_parent=>$sample, ref_delay=>undef},
190 28 alirezamon
 
191 38 alirezamon
{ label=>"Emulation clocks limit:", param_name=>'SIM_CLOCK_LIMIT', type=>'Spin-button', default_val=>MAX_SIM_CLKs, content=>"2,".MAX_SIM_CLKs.",1", info=>"Each node stops sending packets when it reaches packet number limit  or simulation clock number limit", param_parent=>$sample, ref_delay=>undef},
192 28 alirezamon
 
193
 
194 32 alirezamon
);
195 28 alirezamon
 
196
 
197
 
198 32 alirezamon
        my @siminfo = (
199 38 alirezamon
        { label=>'Configuration name:', param_name=>'line_name', type=>'Entry', default_val=>$sample, content=>undef, info=>"NoC configration name. This name will be shown in load-latency graph for this configuration", param_parent=>$sample, ref_delay=> undef, new_status=>undef},
200 28 alirezamon
 
201 38 alirezamon
        { label=>"Traffic name", param_name=>'traffic', type=>'Combo-box', default_val=>'random', content=>$traffics, info=>"Select traffic pattern", param_parent=>$sample, ref_delay=>1, new_status=>'ref_set_win'},
202 32 alirezamon
 
203 38 alirezamon
        { label=>"Packet size in flit:", param_name=>'PCK_SIZE', type=>'Spin-button', default_val=>4, content=>"2,".MAX_PCK_SIZ.",1", info=>undef, param_parent=>$sample, ref_delay=>undef},
204 32 alirezamon
 
205 38 alirezamon
        { label=>"Total packet number limit:", param_name=>'PCK_NUM_LIMIT', type=>'Spin-button', default_val=>200000, content=>"2,".MAX_PCK_NUM.",1", info=>"Simulation will stop when total numbr of sent packets by all nodes reaches packet number limit  or total simulation clock reach its limit", param_parent=>$sample, ref_delay=>undef, new_status=>undef},
206 32 alirezamon
 
207 38 alirezamon
        { label=>"Simulator clocks limit:", param_name=>'SIM_CLOCK_LIMIT', type=>'Spin-button', default_val=>100000, content=>"2,".MAX_SIM_CLKs.",1", info=>"Each node stops sending packets when it reaches packet number limit  or simulation clock number limit", param_parent=>$sample, ref_delay=>undef,  new_status=>undef},
208 32 alirezamon
        );
209
 
210 38 alirezamon
 
211
my $hot_num=$emulate->object_get_attribute($sample,"HOTSPOT_NUM");
212
$hot_num=1 if(!defined $hot_num);
213
my $max= ($hot_num>0)? 100/$hot_num: 20;
214
 
215 32 alirezamon
my @hotspot_info=(
216
        { label=>'Hot Spot num:', param_name=>'HOTSPOT_NUM', type=>'Spin-button', default_val=>1,
217
          content=>"1,5,1", info=>"Number of hot spot nodes in the network",
218 38 alirezamon
          param_parent=>$sample, ref_delay=> 1, new_status=>'ref_set_win'},
219 32 alirezamon
        { label=>'Hot Spot traffic percentage:', param_name=>'HOTSPOT_PERCENTAGE', type=>'Spin-button', default_val=>1,
220 38 alirezamon
          content=>"1, $max,1", info=>"If it is set as n then each node sends n % of its traffic to each hotspot node",
221
          param_parent=>$sample, ref_delay=> undef, new_status=>undef},
222
 
223
        { label=>'Hot Spot nodes send enable:', param_name=>'HOTSPOT_SEND', type=>'Combo-box', default_val=>1,
224
          content=>"0,1", info=>"If it is set as 0 then hot spot nodes only recieves packet from other nodes and do not send packets to others",
225
          param_parent=>$sample, ref_delay=> undef, new_status=>undef},
226
 
227 32 alirezamon
 
228
        );
229
 
230 38 alirezamon
 
231 32 alirezamon
        my @info= ($mode eq "simulate")? @siminfo : @emulateinfo;
232
 
233 43 alirezamon
        my $coltmp=0;
234 32 alirezamon
        foreach my $d ( @info) {
235 43 alirezamon
                ($row,$coltmp)=add_param_widget ($emulate, $d->{label}, $d->{param_name}, $d->{default_val}, $d->{type}, $d->{content}, $d->{info}, $table,$row,undef,1, $d->{param_parent}, $d->{ref_delay}, $d->{new_status});
236 32 alirezamon
        }
237 38 alirezamon
        my $traffic=$emulate->object_get_attribute($sample,"traffic");
238 32 alirezamon
 
239
        if ($traffic eq 'hot spot'){
240
                foreach my $d ( @hotspot_info) {
241 43 alirezamon
                        ($row,$coltmp)=add_param_widget  ($emulate, $d->{label}, $d->{param_name}, $d->{default_val}, $d->{type}, $d->{content}, $d->{info}, $table,$row,1, $d->{param_parent}, $d->{ref_delay}, $d->{new_status});
242 32 alirezamon
                }
243 38 alirezamon
                my $num=$emulate->object_get_attribute($sample,"HOTSPOT_NUM");
244 32 alirezamon
                for (my $i=0;$i<$num;$i++){
245
                        my $m=$i+1;
246 43 alirezamon
                        ($row,$coltmp)=add_param_widget  ($emulate, "Hotspot $m tile num:", "HOTSPOT_CORE_$m", 0, 'Spin-button', "0,256,1",
247
                         "Defne the tile number which is  hotspt. All other nodes will send [Hot Spot traffic percentage] of their traffic to this node ", $table,$row,undef,1,$sample);
248 38 alirezamon
 
249 32 alirezamon
                }
250
 
251
        }
252 54 alirezamon
        my $l= "Injection ratios in flits/clk/Endpoint (%).
253
E.g. Injection ratio 10% means each endpoint inject one flit every 10 cycles.
254
You can define individual ratios seprating by comma (\',\') or define a range of injection ratios with \$min:\$max:\$step format.
255
As an example defining 2,3,4:10:2 will result in (2,3,4,6,8,10) injection ratios.
256
" ;
257 38 alirezamon
        my $u=get_injection_ratios ($emulate,$sample,"ratios");
258 25 alirezamon
 
259 38 alirezamon
        attach_widget_to_table ($table,$row,gen_label_in_left("Injection ratios:"),gen_button_message ($l,"icons/help.png") , $u); $row++;
260 28 alirezamon
 
261 48 alirezamon
        my $scrolled_win = add_widget_to_scrolled_win($table);
262 25 alirezamon
 
263
        my $ok = def_image_button('icons/select.png','OK');
264 28 alirezamon
        my $mtable = def_table(10, 1, TRUE);
265
 
266
        $mtable->attach_defaults($scrolled_win,0,1,0,9);
267
        $mtable-> attach ($ok , 0, 1,  9, 10,'expand','shrink',2,2);
268 25 alirezamon
 
269 48 alirezamon
        add_widget_to_scrolled_win ($mtable,$set_win);
270 32 alirezamon
        $set_win->show_all();
271 28 alirezamon
 
272 32 alirezamon
        $set_win ->signal_connect (destroy => sub{
273
 
274
                $emulate->object_add_attribute("active_setting",undef,undef);
275
        });
276 28 alirezamon
 
277 25 alirezamon
 
278
 
279
        $ok->signal_connect("clicked"=> sub{
280
                #check if sof file has been selected
281 38 alirezamon
                my $s=get_sof_file_full_addr($emulate,$sample);
282 25 alirezamon
                #check if injection ratios are valid
283 38 alirezamon
                my $r=$emulate->object_get_attribute($sample,"ratios");
284 25 alirezamon
                if(defined $s && defined $r) {
285 48 alirezamon
                                $set_win->hide;
286
                                $emulate->object_add_attribute("active_setting",undef,undef);
287 25 alirezamon
                                set_gui_status($emulate,"ref",1);
288
                } else {
289
 
290
                        if(!defined $s){
291 32 alirezamon
                                my $m=($mode eq 'simulate') ? "Please select NoC verilated file" : "Please select sof file!";
292
                                message_dialog($m);
293 25 alirezamon
                        } else {
294 32 alirezamon
                                 message_dialog("Please define valid injection ratio(s)!");
295 25 alirezamon
                        }
296
                }
297
        });
298 28 alirezamon
 
299 32 alirezamon
 
300 25 alirezamon
}
301
 
302
 
303
 
304
#####################
305
#               gen_widgets_column
306
###################      
307
 
308
sub gen_emulation_column {
309 48 alirezamon
        my ($emulate,$mode, $row_num,$info,$set_win,@charts)=@_;
310 25 alirezamon
        my $table=def_table($row_num,10,FALSE);
311 48 alirezamon
        if(!defined $set_win){
312
                $set_win=def_popwin_size(40,80,"NoC configuration setting",'percent');
313
                $set_win->signal_connect (delete_event => sub {$emulate->object_add_attribute("active_setting",undef,undef); $set_win->hide_on_delete });
314
 
315
        } else{
316
                my @childs = $set_win->get_children;
317
                foreach my $c (@childs){ $c->destroy;}
318
        }
319 38 alirezamon
        my $scrolled_win = gen_scr_win_with_adjst ($emulate,"emulation_column");
320 48 alirezamon
        add_widget_to_scrolled_win($table,$scrolled_win);
321 25 alirezamon
        my $row=0;
322 32 alirezamon
 
323 25 alirezamon
        #title  
324 32 alirezamon
        my $title_l =($mode eq "simulate" ) ? "NoC Simulator" : "NoC Emulator";
325
        my $title=gen_label_in_center($title_l);
326 38 alirezamon
        $table->attach ($title , 0, 10,  $row, $row+1,'expand','shrink',2,2); $row++;
327 48 alirezamon
        add_Hsep_to_table($table,0,10,$row);$row++;
328 32 alirezamon
 
329 48 alirezamon
 
330 25 alirezamon
 
331 48 alirezamon
 
332
        my %order;
333
        $order{'+/-'}=0;
334
        $order{'Setting'}=1;
335
        $order{'Run'}=2;
336
        $order{'Name'}=3;
337
        $order{'Color'}=4;
338
        $order{'Clear'}=5;
339
        $order{'Traffic'}=6;
340
        $order{'Done'}=7;
341
 
342
        foreach my $t (sort keys %order){
343
                $table->attach (gen_label_in_center($t), $order{$t}, $order{$t}+1, $row, $row+1,'expand','shrink',2,2);
344 25 alirezamon
        }
345
 
346
        my $traffics="Random,Transposed 1,Transposed 2,Tornado";
347
 
348 48 alirezamon
 
349 25 alirezamon
        $row++;
350 48 alirezamon
 
351 38 alirezamon
 
352 25 alirezamon
 
353 38 alirezamon
        #my $i=0;
354 32 alirezamon
        my $active=$emulate->object_get_attribute("active_setting",undef);
355 38 alirezamon
        my @samples;
356
        @samples =$emulate->object_get_attribute_order("samples");
357
 
358 48 alirezamon
 
359
 
360 38 alirezamon
        foreach my $ss (@samples){
361
 
362 48 alirezamon
 
363 38 alirezamon
                my $sample=$ss;
364
                #my $sample="sample$i";
365
                #my $n=$i;
366
 
367 25 alirezamon
                my $name=$emulate->object_get_attribute($sample,"line_name");
368
                my $l;
369 38 alirezamon
                my $s=($mode eq "simulate" ) ? 1 : get_sof_file_full_addr($emulate,$sample);
370 32 alirezamon
                #check if injection ratios are valid
371 38 alirezamon
                my $r=$emulate->object_get_attribute($sample,"ratios");
372
                if(defined $s  && defined $name){
373 44 alirezamon
 
374 43 alirezamon
                         $l=def_image_button('icons/diagram.png',$name);
375
                         $l-> signal_connect("clicked" => sub{
376 54 alirezamon
 
377
                                __PACKAGE__->mk_accessors(qw{noc_param});
378
                                my $temp = __PACKAGE__->new();
379
 
380
 
381
 
382 43 alirezamon
                                my $st = ($mode eq "simulate" )?  check_sim_sample($emulate,$sample,$info)   : check_sample($emulate,$sample,$info);
383
                                return if $st==0;
384
                                my ($topology, $T1, $T2, $T3, $V, $Fpay) = get_sample_emulation_param($emulate,$sample);
385 54 alirezamon
                                my $ref=$emulate->object_get_attribute($sample,"noc_info");
386
                                if (defined $ref){
387
                                        my %noc_info= %$ref;
388
                                        foreach my $p (sort keys %noc_info){
389
                                                $temp->object_add_attribute('noc_param',$p,$noc_info{$p});
390
                                        }
391
                                }
392
 
393
                        show_topology_diagram ($temp);
394 43 alirezamon
                 });
395 44 alirezamon
 
396
                 my $traffic = def_button("Pattern");
397
                 $traffic-> signal_connect("clicked" => sub{
398
                        my $st = ($mode eq "simulate" )?  check_sim_sample($emulate,$sample,$info)   : check_sample($emulate,$sample,$info);
399
                                return if $st==0;
400
                                my ($topology, $T1, $T2, $T3, $V, $Fpay) = get_sample_emulation_param($emulate,$sample);
401
                                $emulate->object_add_attribute('noc_param','T1',$T1);
402
                                $emulate->object_add_attribute('noc_param','T2',$T2);
403
                                $emulate->object_add_attribute('noc_param','T3',$T3);
404
                                $emulate->object_add_attribute('noc_param','TOPOLOGY',$topology);
405 48 alirezamon
                                my $pattern="";
406
                                my $traffictype=$emulate->object_get_attribute($sample,"TRAFFIC_TYPE");
407
                                $pattern=get_synthetic_traffic_pattern($emulate, $sample) if($traffictype eq "Synthetic");
408
                                $pattern=" Custom traffic based on input file. " if($traffictype eq "Task-graph");
409
 
410 44 alirezamon
                                my $window = def_popwin_size(40,40,"Traffic pattern",'percent');
411 48 alirezamon
                                my ($outbox,$tview)= create_txview();
412
                                show_info($tview,"$pattern");
413 44 alirezamon
                                $window->add ($outbox);
414
                                $window->show_all();
415
 
416
                 });
417
 
418
 
419 48 alirezamon
                 $table->attach ($l, $order{'Name'}, $order{'Name'}+1, $row, $row+1,'expand','shrink',2,2);
420
                 $table->attach ($traffic, $order{'Traffic'}, $order{'Traffic'}+1, $row, $row+1,'expand','shrink',2,2);
421
 
422 43 alirezamon
 
423 25 alirezamon
                } else {
424 32 alirezamon
                        $l=gen_label_in_left("Define NoC configuration");
425 44 alirezamon
                        $l->set_markup("<span  foreground= 'red' ><b>Define NoC configuration</b></span>");
426 48 alirezamon
                        $table->attach ($l, $order{'Name'}, $order{'Name'}+1, $row, $row+1,'expand','shrink',2,2);
427 25 alirezamon
                }
428 48 alirezamon
 
429 32 alirezamon
 
430 38 alirezamon
                #remove 
431
                my $remove=def_image_button("icons/cancel.png");
432 48 alirezamon
                $table->attach ($remove,$order{'+/-'},$order{'+/-'}+1, $row, $row+1,'expand','shrink',2,2);
433 38 alirezamon
                $remove->signal_connect("clicked"=> sub{
434
                        $emulate->object_delete_attribute_order("samples",$sample);
435
                        set_gui_status($emulate,"ref",2);
436
                });
437
 
438
                #setting
439
                my $set=def_image_button("icons/setting.png");
440 48 alirezamon
                $table->attach ($set, $order{'Setting'}, $order{'Setting'}+1, $row, $row+1,'expand','shrink',2,2);
441 38 alirezamon
 
442 32 alirezamon
 
443
                if(defined $active){#The setting windows ask for refershing so open it again
444 38 alirezamon
                        get_noc_configuration($emulate,$mode,$sample,$set_win) if       ($active eq $sample);
445 32 alirezamon
                }
446
 
447
 
448
 
449 25 alirezamon
                $set->signal_connect("clicked"=> sub{
450 38 alirezamon
                        $emulate->object_add_attribute("active_setting",undef,$sample);
451
                        get_noc_configuration($emulate,$mode,$sample,$set_win);
452 25 alirezamon
                });
453
 
454
 
455
 
456
                my $color_num=$emulate->object_get_attribute($sample,"color");
457
                if(!defined $color_num){
458 38 alirezamon
                        $color_num = (scalar @samples) +1;
459 25 alirezamon
                        $emulate->object_add_attribute($sample,"color",$color_num);
460
                }
461 48 alirezamon
                my $color=def_colored_button("   ",$color_num);
462
                $table->attach ($color, $order{'Color'}, $order{'Color'}+1, $row, $row+1,'fill','fill',2,2);
463 25 alirezamon
 
464
                $color->signal_connect("clicked"=> sub{
465
                        get_color_window($emulate,$sample,"color");
466
                });
467
 
468
                #clear line
469
                my $clear = def_image_button('icons/clear.png');
470
                $clear->signal_connect("clicked"=> sub{
471 38 alirezamon
                        foreach my $chart (@charts){
472
                                $emulate->object_add_attribute ($sample,"$chart->{result_name}",undef);
473
 
474
                                #print "\$emulate->object_add_attribute ($sample,$chart->{result_name}_result,undef);";
475
 
476
                        }
477 25 alirezamon
                        set_gui_status($emulate,"ref",2);
478
                });
479 48 alirezamon
                $table->attach ($clear, $order{'Clear'}, $order{'Clear'}+1, $row, $row+1,'expand','shrink',2,2);
480 25 alirezamon
                #run/pause
481 38 alirezamon
                my $run = def_image_button('icons/run.png',undef);
482 48 alirezamon
                $table->attach ($run, $order{'Run'}, $order{'Run'}+1, $row, $row+1,'expand','shrink',2,2);
483 25 alirezamon
                $run->signal_connect("clicked"=> sub{
484
                        $emulate->object_add_attribute ($sample,"status","run");
485
                        #start the emulator if it is not running        
486
                        my $status= $emulate->object_get_attribute('status',undef);
487
                        if($status ne 'run'){
488
 
489 32 alirezamon
                                run_emulator($emulate,$info) if($mode eq 'emulate');
490
                                run_simulator($emulate,$info) if($mode eq 'simulate');
491 25 alirezamon
                                set_gui_status($emulate,"ref",2);
492
                        }
493
 
494
                });
495
 
496 48 alirezamon
                my $image = gen_noc_status_image($emulate,$sample);
497
                $table->attach ($image, $order{'Done'},$order{'Done'}+1, $row, $row+1,'expand','shrink',2,2);
498
 
499 25 alirezamon
                $row++;
500
 
501
        }
502 38 alirezamon
        # add new simulation
503 25 alirezamon
 
504 48 alirezamon
        my $add=def_image_button("icons/plus.png",' A_dd ',FALSE,1);
505
        $table->attach ($add, $order{'+/-'},$order{'+/-'}+2, $row, $row+1,'expand','shrink',2,2);
506
 
507
 
508
 
509 38 alirezamon
        $add->signal_connect("clicked"=> sub{
510
                my $n=$emulate->object_get_attribute("id",undef);
511
                $n=0 if (!defined $n);
512
                my $sample="sample$n";
513
                $n++;
514
                $emulate->object_add_attribute("id",undef,$n);
515
                $emulate->object_add_attribute("active_setting",undef,$sample);
516
                #get_noc_configuration($emulate,$mode,$sample,$set_win);
517
                $emulate->object_add_attribute_order("samples",$sample);
518
                set_gui_status($emulate,"ref",1);
519
 
520
        });
521 48 alirezamon
 
522 38 alirezamon
 
523
 
524 32 alirezamon
        return ($scrolled_win,$set_win);
525 25 alirezamon
}
526
 
527
 
528
 
529
##########
530 38 alirezamon
# check_sample
531 25 alirezamon
##########
532
 
533
sub check_sample{
534 38 alirezamon
        my ($emulate,$sample,$info)=@_;
535 25 alirezamon
        my $status=1;
536 38 alirezamon
        my $sof=get_sof_file_full_addr($emulate,$sample);
537 36 alirezamon
 
538
 
539
 
540 25 alirezamon
        # ckeck if sample have sof file
541
        if(!defined $sof){
542 38 alirezamon
                #add_info($info, "Error: SoF file has not set for $sample!\n");
543
                add_colored_info($info, "Error: SoF file has not set for $sample!\n",'red');
544
                $emulate->object_add_attribute ($sample,"status","failed");
545 25 alirezamon
                $status=0;
546
        } else {
547
                # ckeck if sof file has info file 
548
                my ($name,$path,$suffix) = fileparse("$sof",qr"\..[^.]*$");
549 36 alirezamon
                my $sof_info= "$path$name.inf";
550 38 alirezamon
 
551
        #       print "\n $sof \t $sof_info\n";
552
 
553 25 alirezamon
                if(!(-f $sof_info)){
554 43 alirezamon
                        add_colored_info($info, "Error: Could not find $name.inf file in $path. An information file is required for each sof file containig the device name and  NoC configuration. Press F3 for more help.\n",'red');
555 38 alirezamon
                        $emulate->object_add_attribute ($sample,"status","failed");
556 25 alirezamon
                        $status=0;
557
                }else { #add info
558 28 alirezamon
                        my $pp= do $sof_info ;
559
 
560
                        my $p=$pp->{'noc_param'};
561
 
562 25 alirezamon
                        $status=0 if $@;
563 48 alirezamon
                        message_dialog("Error reading: $@",'error') if $@;
564 25 alirezamon
                        if ($status==1){
565 38 alirezamon
                                $emulate->object_add_attribute ($sample,"noc_info",$p) ;
566
 
567 25 alirezamon
 
568 38 alirezamon
                        }
569 25 alirezamon
                }
570
        }
571
 
572
        return $status;
573
}
574
 
575
 
576
 
577
 
578
 
579
 
580
 
581
 
582
 
583
#############
584
#  images
585
##########
586
sub get_status_gif{
587
                my $emulate=shift;
588
                my $status= $emulate->object_get_attribute('status',undef);
589
                if($status eq 'ideal'){
590
                        return show_gif ("icons/ProNoC.png");
591
                } elsif ($status eq 'run') {
592
                        my($width,$hight)=max_win_size();
593
                        my $image=($width>=1600)? "icons/hamster_l.gif":
594
                                  ($width>=1200)? "icons/hamster_m.gif": "icons/hamster_s.gif";
595
 
596
                        return show_gif ($image);
597 48 alirezamon
                } elsif ($status eq 'programmer_failed') {
598 25 alirezamon
                        return show_gif ("icons/Error.png");
599
                }
600
 
601
}
602
 
603
 
604
 
605
 
606
sub gen_noc_status_image {
607 38 alirezamon
        my ($emulate,$sample)=@_;
608
        my   $status= $emulate->object_get_attribute ($sample,"status");
609 48 alirezamon
        $status='' if(!defined  $status);
610 25 alirezamon
        my $image;
611 48 alirezamon
        my $box = def_hbox(TRUE,1);
612
        $image = new_image_from_file ("icons/load.gif") if($status eq "run");
613 34 alirezamon
        $image = def_icon("icons/button_ok.png") if($status eq "done");
614 43 alirezamon
        $image = def_icon("icons/warning.png") if($status eq "failed");
615 48 alirezamon
 
616
        if (defined $image) {
617
                $box->pack_start (add_frame_to_image($image), FALSE, FALSE, 0);
618 25 alirezamon
        }
619 48 alirezamon
        return $box;
620 25 alirezamon
 
621
}
622
 
623
 
624
############
625
#       run_emulator
626
###########
627
 
628
sub run_emulator {
629
        my ($emulate,$info)=@_;
630 38 alirezamon
        #my $graph_name="latency_ratio";
631 25 alirezamon
        #return if(!check_samples($emulate,$info));
632
        $emulate->object_add_attribute('status',undef,'run');
633
        set_gui_status($emulate,"ref",1);
634 38 alirezamon
        show_colored_info($info, "start emulation\n",'blue');
635 25 alirezamon
 
636 38 alirezamon
#       #search for available usb blaster
637
#       my $cmd = "jtagconfig";
638
#       my ($stdout,$exit)=run_cmd_in_back_ground_get_stdout("$cmd");
639
#       my @matches= ($stdout =~ /USB-Blaster.*/g);
640
#       my $usb_blaster=$matches[0];
641
#       if (!defined $usb_blaster){
642
#               add_info($info, "jtagconfig could not find any USB blaster cable: $stdout \n");
643 48 alirezamon
#               $emulate->object_add_attribute('status',undef,'programmer_failed');
644 38 alirezamon
#               set_gui_status($emulate,"ref",2);
645
#               #/***/
646
#               return; 
647
#       }else{
648
#               add_info($info, "find $usb_blaster\n");
649
#       }
650
        my @samples =$emulate->object_get_attribute_order("samples");
651
        foreach my $sample (@samples){
652
                my $status=$emulate->object_get_attribute ($sample,"status");
653 25 alirezamon
                next if($status ne "run");
654 38 alirezamon
                next if(!check_sample($emulate,$sample,$info));
655
                my $r= $emulate->object_get_attribute($sample,"ratios");
656 25 alirezamon
                my @ratios=@{check_inserted_ratios($r)};
657
                #$emulate->object_add_attribute ("sample$i","status","run");                    
658 38 alirezamon
                my $sof=get_sof_file_full_addr($emulate,$sample);
659
                add_info($info, "Programe FPGA device using $sof.sof\n");
660
                my ($name,$path,$suffix) = fileparse("$sof",qr"\..[^.]*$");
661 48 alirezamon
                my $programmer="$path/program_device.sh";
662 38 alirezamon
                my $jtag_intfc="$path/jtag_intfc.sh";
663 48 alirezamon
                if((-f $programmer)==0){
664
                        add_colored_info ($info, " Error: file  \"$programmer\"  dose not exist. \n",'red');
665
                        $emulate->object_add_attribute('status',undef,'programmer_failed');
666 38 alirezamon
                        $emulate->object_add_attribute ($sample,"status","failed");
667
                        set_gui_status($emulate,"ref",2);
668
                        last;
669
                }
670
                if((-f $jtag_intfc)==0){
671
                        add_colored_info ($info, " Error: file  \"$jtag_intfc\"  dose not exist. \n",'red');
672 48 alirezamon
                        $emulate->object_add_attribute('status',undef,'programmer_failed');
673 38 alirezamon
                        $emulate->object_add_attribute ($sample,"status","failed");
674
                        set_gui_status($emulate,"ref",2);
675
                        last;
676
                }
677 48 alirezamon
                my $cmd =  "bash $programmer $sof.sof";
678 36 alirezamon
 
679 38 alirezamon
 
680
                #my $Quartus_bin=  $ENV{QUARTUS_BIN};
681 25 alirezamon
 
682
 
683 38 alirezamon
                #my $cmd = "$Quartus_bin/quartus_pgm -c \"$usb_blaster\" -m jtag -o \"p;$sof\"";
684 28 alirezamon
 
685 25 alirezamon
                #my $output = `$cmd 2>&1 1>/dev/null`;           # either with backticks
686 28 alirezamon
 
687
                #/***/
688 25 alirezamon
                my ($stdout,$exit)=run_cmd_in_back_ground_get_stdout("$cmd");
689
                if($exit){#programming FPGA board has failed
690 48 alirezamon
                        $emulate->object_add_attribute('status',undef,'programmer_failed');
691 38 alirezamon
                        add_colored_info($info, "$stdout\n",'red');
692
                        $emulate->object_add_attribute ($sample,"status","failed");
693 25 alirezamon
                        set_gui_status($emulate,"ref",2);
694
                        next;
695 28 alirezamon
                }
696
                #print "$stdout\n";
697
 
698 38 alirezamon
                # load noc configuration 
699 28 alirezamon
                foreach  my $ratio_in (@ratios){
700 25 alirezamon
 
701 28 alirezamon
                        add_info($info, "Configure packet generators for  injection ratio of $ratio_in \% \n");
702 38 alirezamon
                        if(!programe_pck_gens($emulate,$sample,$ratio_in,$info,$jtag_intfc)){
703
                                add_colored_info($info, "Error in programe_pck_gens function\n",'red');
704
                                next;
705
                        }
706 28 alirezamon
 
707 38 alirezamon
 
708
                        my $r=read_pack_gen($emulate,$sample,$info,$jtag_intfc,$ratio_in);
709
                            next if (!defined $r);
710
 
711
 
712
 
713 28 alirezamon
                        set_gui_status($emulate,"ref",2);
714 25 alirezamon
 
715
                }
716 38 alirezamon
                $emulate->object_add_attribute ($sample,"status","done");
717 25 alirezamon
 
718
        }
719
 
720 38 alirezamon
        add_colored_info($info, "End emulation!\n",'blue');
721 25 alirezamon
        $emulate->object_add_attribute('status',undef,'ideal');
722
        set_gui_status($emulate,"ref",1);
723
}
724
 
725
 
726
 
727
 
728
 
729
 
730 38 alirezamon
##############
731
#        process_notebook_gen
732
##############
733 25 alirezamon
 
734
 
735
sub process_notebook_gen{
736 48 alirezamon
                my ($emulate,$info,$mode,$set_win,@charts)=@_;
737
                my $notebook = gen_notebook();
738 25 alirezamon
                $notebook->set_tab_pos ('left');
739
                $notebook->set_scrollable(TRUE);
740 48 alirezamon
                #$notebook->can_focus(FALSE);
741 32 alirezamon
 
742 48 alirezamon
                my $page1;
743
                ($page1,$set_win)=gen_emulation_column($emulate, $mode,10,$info,$set_win,@charts);
744
                $notebook->append_page ($page1,gen_label_with_mnemonic ("  _Run emulator  ")) if($mode eq "emulate");
745
                $notebook->append_page ($page1,gen_label_with_mnemonic ("  _Run simulator ")) if($mode eq "simulate");
746 25 alirezamon
 
747
 
748 32 alirezamon
                my $page2=get_noc_setting_gui ($emulate,$info,$mode);
749 38 alirezamon
                my $tt=($mode eq "emulate")? "  _Generate NoC \nEmulation Model" : "  _Generate NoC \nSimulation Model" ;
750 48 alirezamon
                $notebook->append_page ($page2,gen_label_with_mnemonic ($tt));
751 25 alirezamon
 
752
 
753 48 alirezamon
 
754 55 alirezamon
                my $scrolled_win = add_widget_to_scrolled_win($notebook,gen_scr_win_with_adjst($emulate,"process_sc_win"));
755 25 alirezamon
                $scrolled_win->show_all;
756
                my $page_num=$emulate->object_get_attribute ("process_notebook","currentpage");
757
                $notebook->set_current_page ($page_num) if(defined $page_num);
758
                $notebook->signal_connect( 'switch-page'=> sub{
759
                        $emulate->object_add_attribute ("process_notebook","currentpage",$_[2]);        #save the new pagenumber
760
 
761
                });
762
 
763 32 alirezamon
                return ($scrolled_win,$set_win);
764 25 alirezamon
 
765
}
766
 
767
 
768
sub get_noc_setting_gui {
769 32 alirezamon
        my ($emulate,$info_text,$mode)=@_;
770 28 alirezamon
        my $table=def_table(20,10,FALSE);#      my ($row,$col,$homogeneous)=@_;
771 38 alirezamon
 
772 48 alirezamon
 
773 38 alirezamon
        my $scrolled_win = gen_scr_win_with_adjst ($emulate,"noc_setting_gui");
774 48 alirezamon
        add_widget_to_scrolled_win($table,$scrolled_win);
775
        my $row=noc_config ($emulate,$table,$info_text);
776 25 alirezamon
 
777 28 alirezamon
        my($label,$param,$default,$content,$type,$info);
778 48 alirezamon
        my @dirs = grep {-d} glob("../boards/Altera/*");
779 28 alirezamon
        my $fpgas;
780
        foreach my $dir (@dirs) {
781
                my ($name,$path,$suffix) = fileparse("$dir",qr"\..[^.]*$");
782
                $default=$name;
783 38 alirezamon
                $fpgas= (defined $fpgas)? "$fpgas,$name" : "$name";
784 28 alirezamon
        }
785
 
786 38 alirezamon
        my @fpgainfo;
787
        if($mode eq "emulate"){
788
                @fpgainfo = (
789
                { label=>'Pck. injector FIFO Width:', param_name=>'TIMSTMP_FIFO_NUM', type=>'Spin-button', default_val=>16, content=>"2,128,2", info=>"Packet injectors' timestamp FIFO width. In case a packet cannot be injected according to the desired injection ratio, the current system time is saved in a FIFO and then at injection time it will be read and attached to the packet. The larger FIFO width results in more accurate latency calculation at the cost of higher area overhead." , param_parent=>'fpga_param', ref_delay=> undef},
790
                { label=>'Save as:', param_name=>'SAVE_NAME', type=>"Entry", default_val=>'emulate1', content=>undef, info=>undef, param_parent=>'fpga_param', ref_delay=>undef},
791
                { label=>"Project directory", param_name=>"SOF_DIR", type=>"DIR_path", default_val=>"$ENV{'PRONOC_WORK'}/emulate", content=>undef, info=>"Define the working directory for generating .sof file", param_parent=>'fpga_param',ref_delay=>undef },
792
                );
793
 
794
        }
795
        else {
796
                @fpgainfo = (
797
                { label=>'Pck. injector FIFO Width:', param_name=>'TIMSTMP_FIFO_NUM', type=>'Spin-button', default_val=>16, content=>"2,128,2", info=>"Packet injectors' timestamp FIFO width. In case a packet cannot be injected according to the desired injection ratio, the current system time is saved in a FIFO and then at injection time it will be read and attached to the packet. The larger FIFO width results in more accurate latency calculation." , param_parent=>'fpga_param', ref_delay=> undef},
798
                { label=>'Save as:', param_name=>'SAVE_NAME', type=>"Entry", default_val=>'simulate1', content=>undef, info=>undef, param_parent=>'sim_param', ref_delay=>undef},
799
                { label=>"Project directory", param_name=>"BIN_DIR", type=>"DIR_path", default_val=>"$ENV{'PRONOC_WORK'}/simulate", content=>undef, info=>"Define the working directory for generating simulation executable binarry file", param_parent=>'sim_param',ref_delay=>undef },
800 48 alirezamon
 
801 38 alirezamon
                );
802
        }
803 25 alirezamon
 
804 43 alirezamon
        my $coltmp=0;
805
        foreach my $d (@fpgainfo) {
806
                ($row,$coltmp)=add_param_widget  ($emulate, $d->{label}, $d->{param_name}, $d->{default_val}, $d->{type}, $d->{content}, $d->{info}, $table,$row,undef,1, $d->{param_parent}, $d->{ref_delay});
807 38 alirezamon
        }
808 48 alirezamon
 
809
        my $maintable=def_table(20,10,FALSE);#  my ($row,$col,$homogeneous)=@_;
810 38 alirezamon
 
811 43 alirezamon
        my $generate = def_image_button('icons/gen.png','Gener_ate',FALSE,1);
812
        my $diagram  = def_image_button('icons/diagram.png','Diagram');
813 48 alirezamon
        my $import   = def_image_button('icons/import.png','I_mport',FALSE,1);
814
        set_tip($import ,"Import NoC configuration from file");
815
 
816
        $maintable->attach_defaults ($scrolled_win, 0,10, 0, 9);
817
        $maintable->attach_defaults (gen_Hsep(), 0,10, 8, 9);
818
        $maintable->attach ($generate, 0,2, 9, 10,'expand','shrink',2,2);
819
        $maintable->attach ($diagram, 2,4, 9, 10,'expand','shrink',2,2);
820
        $maintable->attach ($import, 4,6, 9, 10,'expand','shrink',2,2);
821
 
822
 
823 43 alirezamon
    $diagram-> signal_connect("clicked" => sub{
824
        show_topology_diagram ($emulate);
825
    });
826 38 alirezamon
    $generate->signal_connect ('clicked'=> sub{
827
                generate_sof_file($emulate,$info_text) if($mode eq "emulate");
828
                generate_sim_bin_file($emulate,$info_text) if($mode eq "simulate");
829 43 alirezamon
 
830 38 alirezamon
        });
831 48 alirezamon
 
832
        $import-> signal_connect("clicked" => sub{
833
                import_noc_info_file($emulate,$mode);
834
        });
835
 
836
        $scrolled_win->show_all;
837
        return $maintable;
838 38 alirezamon
}
839 28 alirezamon
 
840 48 alirezamon
sub import_noc_info_file{
841
        my ($self,$mode)=@_;
842
        my $file;
843
        my $dialog = gen_file_dialog(undef,'inf');
844
 
845
        my $open_in       = ($mode ne "emulate" ) ? abs_path("$ENV{'PRONOC_WORK'}/simulate") : abs_path("$ENV{'PRONOC_WORK'}/emulate");
846
        $dialog->set_current_folder ($open_in);
847
        if ( "ok" eq $dialog->run ) {
848
                my $status=1;
849
                $file = $dialog->get_filename;
850
                my $pp= do $file ;
851
                my $p=$pp->{'noc_param'};
852
                $status=0 if $@;
853
                message_dialog("Error reading: $@") if $@;
854
                if ($status==1){
855
                        $self->object_add_attribute ("noc_param",undef,$p);
856
                        my ($name,$path,$suffix) = fileparse("$file",qr"\..[^.]*$");
857
                        my $attr1 = ($mode ne "emulate" ) ? 'sim_param' : 'fpga_param';
858
                        $self->object_add_attribute ($attr1,'SAVE_NAME',$name);
859
 
860
                        set_gui_status($self,"ref",1);
861
                }
862
        }
863
        $dialog->destroy;
864
}
865
 
866 38 alirezamon
##########
867
#       generate_sof_file
868
##########
869 32 alirezamon
 
870
 
871 38 alirezamon
sub generate_sof_file {
872 43 alirezamon
        my ($self,$info)=@_;
873 38 alirezamon
        my $name=$self->object_get_attribute ('fpga_param',"SAVE_NAME");
874
        my $target_dir  = "$ENV{'PRONOC_WORK'}/emulate/$name";
875
        my $top         = "$target_dir/src_verilog/${name}_top.v";
876
 
877
        if (!defined $name){
878
                message_dialog("Please define the Save as filed!");
879
                return;
880
        }
881 32 alirezamon
 
882 38 alirezamon
        #copy all noc source codes
883 48 alirezamon
        my @files = (
884
'/mpsoc/rtl/src_emulate/rtl/',
885
'/mpsoc/rtl/src_peripheral/jtag/jtag_wb/',
886
'/mpsoc/rtl/src_peripheral/ram/',
887
'/mpsoc/rtl/main_comp.v',
888
'/mpsoc/rtl/arbiter.v',
889 54 alirezamon
'/mpsoc/rtl/pronoc_def.v',
890 48 alirezamon
'/mpsoc/rtl/src_topolgy/',
891
'/mpsoc/rtl/src_noc/');
892
 
893 38 alirezamon
        my $dir = Cwd::getcwd();
894
        my $project_dir   = abs_path("$dir/../../");
895
        my ($stdout,$exit)=run_cmd_in_back_ground_get_stdout("mkdir -p $target_dir/src_verilog" );
896
        copy_file_and_folders(\@files,$project_dir,"$target_dir/src_verilog/lib/");
897 32 alirezamon
 
898
 
899 38 alirezamon
        #generate parameters for emulator_top.v file
900 48 alirezamon
        gen_noc_localparam_v_file($self,"$target_dir/src_verilog/lib/src_noc/");
901
 
902 38 alirezamon
        open(FILE,  ">$top") || die "Can not open: $!";
903
        print FILE create_emulate_top($self,$name,$top);
904
        close(FILE) || die "Error closing file: $!";
905
        select_compiler($self,$name,$top,$target_dir,\&save_the_sof_file);
906
 
907
return;
908 28 alirezamon
}
909
 
910 38 alirezamon
sub create_emulate_top{
911
        my ($self,$name,$top)=@_;
912
        my $top_v= get_license_header("$top");
913 32 alirezamon
 
914 38 alirezamon
$top_v  ="$top_v
915 32 alirezamon
 
916 38 alirezamon
`timescale       1ns/1ps
917 32 alirezamon
 
918 38 alirezamon
module ${name}_top(
919
        output done_led,
920
        output noc_reset_led,
921
        output jtag_reset_led,
922
        input  reset,
923
        input  clk
924
);
925 32 alirezamon
 
926 25 alirezamon
 
927 38 alirezamon
        localparam
928
                STATISTIC_VJTAG_INDEX=124,
929
                PATTERN_VJTAG_INDEX=125,
930
                COUNTER_VJTAG_INDEX=126,
931
                DONE_RESET_VJTAG_INDEX=127;
932
 
933 25 alirezamon
 
934 48 alirezamon
 
935 38 alirezamon
 
936
        wire  reset_noc, reset_injector, reset_noc_sync, reset_injector_sync, done;
937
        wire jtag_reset_injector, jtag_reset_noc;
938
        wire start_o;
939
        wire done_time_limit;
940
 
941
        assign done_led = done | done_time_limit;
942
        assign noc_reset_led= reset_noc;
943
        assign jtag_reset_led   = reset_injector;
944 25 alirezamon
 
945 38 alirezamon
 
946 25 alirezamon
 
947 38 alirezamon
        //  two reset sources which can be controled using jtag. One for reseting NoC another packet injectors
948
        jtag_source_probe #(
949
                .VJTAG_INDEX(DONE_RESET_VJTAG_INDEX),
950
                .Dw(2)  //source/probe width in bits
951
        )the_reset(
952
                .probe({done_time_limit,done}),
953
                .source({jtag_reset_injector,jtag_reset_noc})
954
        );
955 25 alirezamon
 
956
 
957 38 alirezamon
        assign  reset_noc               =       (jtag_reset_noc | reset);
958
        assign  reset_injector          =       (jtag_reset_injector | reset);
959 25 alirezamon
 
960 38 alirezamon
        altera_reset_synchronizer noc_rst_sync
961
        (
962
                .reset_in(reset_noc),
963
                .clk(clk),
964
                .reset_out(reset_noc_sync)
965
        );
966 25 alirezamon
 
967
 
968 38 alirezamon
        altera_reset_synchronizer inject_rst_sync
969
        (
970
                .reset_in(reset_injector),
971
                .clk(clk),
972
                .reset_out(reset_injector_sync)
973
        );
974
 
975
        //noc emulator
976
 
977
        noc_emulator #(
978 48 alirezamon
                .STATISTIC_VJTAG_INDEX(STATISTIC_VJTAG_INDEX),
979
                .PATTERN_VJTAG_INDEX(PATTERN_VJTAG_INDEX)
980 38 alirezamon
        )
981
        noc_emulate_top
982
        (
983
                .reset(reset_noc_sync),
984
                .jtag_ctrl_reset(reset_injector_sync),
985
                .clk(clk),
986
                .start_o(start_o),
987
                .done(done)
988
        );
989
 
990
 
991
 
992
        //clock counter
993
 
994
        function integer log2;
995
      input integer number; begin
996
         log2=(number <=1) ? 1: 0;
997
         while(2**log2<number) begin
998
            log2=log2+1;
999
         end
1000
      end
1001
    endfunction // log2
1002
 
1003
        localparam   MAX_SIM_CLKs  = 1_000_000_000;
1004
        localparam   CLK_CNTw = log2(MAX_SIM_CLKs+1);
1005
 
1006
        reg     [CLK_CNTw-1             :   0] clk_counter;
1007
        wire    [CLK_CNTw-1             :   0] clk_limit;
1008
        reg start;
1009
        always @(posedge clk or posedge reset_injector_sync) begin
1010
                if(reset_injector_sync)begin
1011
                        clk_counter <= {CLK_CNTw{1'b0}};
1012
                        start<=1'b0;
1013
                end else begin
1014
                        if(start_o) start<=1'b1;
1015
                        if(done==1'b0 && start ) clk_counter<=clk_counter +1'b1;
1016
                end
1017
        end
1018
 
1019
        jtag_source_probe #(
1020
                .VJTAG_INDEX(COUNTER_VJTAG_INDEX),
1021
                .Dw(CLK_CNTw)   //source/probe width in bits
1022
        )the_clk_counter(
1023
                .probe(clk_counter),
1024
                .source(clk_limit)
1025
        );
1026
 
1027
        assign done_time_limit = (clk_counter >= clk_limit);
1028
endmodule
1029
";
1030
        return $top_v;
1031
}
1032 25 alirezamon
 
1033 38 alirezamon
sub save_the_sof_file{
1034 28 alirezamon
 
1035 38 alirezamon
        my $self=shift;
1036
        my $name=$self->object_get_attribute ('fpga_param',"SAVE_NAME");
1037
        my $sofdir="$ENV{PRONOC_WORK}/emulate/sof";
1038
        my $fpga_board=$self->object_get_attribute('compile','board');
1039
        my $target_dir  = "$ENV{'PRONOC_WORK'}/emulate/$name";
1040 28 alirezamon
 
1041 38 alirezamon
        mkpath("$sofdir/$fpga_board/",1,01777);
1042
        open(FILE,  ">$sofdir/$fpga_board/$name.inf") || die "Can not open: $!";
1043
        print FILE perl_file_header("$name.inf");
1044
        my %pp;
1045
        $pp{'noc_param'}= $self->{'noc_param'};
1046
        $pp{'fpga_param'}= $self->{'fpga_param'};
1047
        print FILE Data::Dumper->Dump([\%pp],["emulate_info"]);
1048
        close(FILE) || die "Error closing file: $!";
1049 28 alirezamon
 
1050
 
1051 38 alirezamon
        #find  $dir_name -name \*.sof -exec cp '{}' $sofdir/$fpga_board/$save_name.sof" 
1052
        my @files = File::Find::Rule->file()
1053
                 ->name( '*.sof' )
1054
                 ->in( "$target_dir" );
1055
        copy($files[0],"$sofdir/$fpga_board/$name.sof") or do {
1056
                my $err= "Error copy($files[0] , $sofdir/$fpga_board/$name.sof";
1057
                print "$err\n";
1058 48 alirezamon
                message_dialog($err,'error');
1059 38 alirezamon
                return;
1060
        };
1061
        #copy the board's programming and jtag interface files
1062
 
1063
        my $board_name=$self->object_get_attribute('compile','board');
1064
        #copy board jtag_intfc.sh file 
1065 48 alirezamon
        copy("../boards/Altera/$board_name/jtag_intfc.sh","$sofdir/$fpga_board/jtag_intfc.sh");
1066 38 alirezamon
        #print "../boards/$board_name/jtag_intfc.sh","$sofdir/$fpga_board/jtag_intfc.sh\n";
1067
        #add argument run to jtag_interface file 
1068
        my $runarg='
1069 28 alirezamon
 
1070 38 alirezamon
if [ $# -ne 0 ]
1071
  then
1072
    $JTAG_INTFC $1
1073
fi
1074
';
1075
        append_text_to_file ("$sofdir/$fpga_board/jtag_intfc.sh",$runarg );
1076
 
1077
 
1078
 
1079 28 alirezamon
 
1080 38 alirezamon
        #copy board program_device.sh file 
1081 48 alirezamon
        copy("../boards/Altera/$board_name/program_device.sh","$sofdir/$fpga_board/program_device.sh");
1082 38 alirezamon
 
1083
 
1084 28 alirezamon
 
1085 38 alirezamon
        message_dialog("sof file has been generated successfully");
1086
}
1087 28 alirezamon
 
1088
 
1089 25 alirezamon
 
1090
##########
1091
#       save_emulation
1092
##########
1093
sub save_emulation {
1094
        my ($emulate)=@_;
1095
        # read emulation name
1096
        my $name=$emulate->object_get_attribute ("emulate_name",undef);
1097
        my $s= (!defined $name)? 0 : (length($name)==0)? 0 :1;
1098
        if ($s == 0){
1099
                message_dialog("Please set emulation name!");
1100
                return 0;
1101
        }
1102
        # Write object file
1103
        open(FILE,  ">lib/emulate/$name.EML") || die "Can not open: $!";
1104
        print FILE perl_file_header("$name.EML");
1105 38 alirezamon
        print FILE Data::Dumper->Dump([\%$emulate],["emulate"]);
1106 25 alirezamon
        close(FILE) || die "Error closing file: $!";
1107
        message_dialog("Emulation saved as lib/emulate/$name.EML!");
1108
        return 1;
1109
}
1110
 
1111
#############
1112
#       load_emulation
1113
############
1114
 
1115
sub load_emulation {
1116
        my ($emulate,$info)=@_;
1117
        my $file;
1118 48 alirezamon
        my $dialog =  gen_file_dialog (undef, 'EML');
1119 25 alirezamon
        my $dir = Cwd::getcwd();
1120 48 alirezamon
        $dialog->set_current_folder ("$dir/lib/emulate");
1121 25 alirezamon
 
1122
        if ( "ok" eq $dialog->run ) {
1123
                $file = $dialog->get_filename;
1124
                my ($name,$path,$suffix) = fileparse("$file",qr"\..[^.]*$");
1125
                if($suffix eq '.EML'){
1126 43 alirezamon
 
1127
                        my ($pp,$r,$err) = regen_object($file);
1128
                        if ($r ){
1129
                                add_colored_info($info,"**Error reading  $file file: $err\n",'red');
1130 25 alirezamon
                                 $dialog->destroy;
1131
                                return;
1132
                        }
1133
 
1134
                        clone_obj($emulate,$pp);
1135
                        #message_dialog("done!");                               
1136
                }
1137
     }
1138
     $dialog->destroy;
1139
}
1140
 
1141 38 alirezamon
 
1142
 
1143
sub update_result {
1144
        my ($self,$sample,$name,$x,$y,$z)=@_;
1145
        my $ref=$self->object_get_attribute ($sample,$name);
1146
        my %results;
1147
        %results= %{$ref} if(defined $ref);
1148
        if(!defined $z) {$results{$x}=$y;}
1149
        else {$results{$x}{$y}=$z;}
1150
        $self->object_add_attribute ($sample,$name,\%results);
1151
}
1152
 
1153
 
1154
 
1155 48 alirezamon
 
1156 43 alirezamon
sub gen_sim_parameter_h {
1157
        my ($param_h,$includ_h,$ne,$nr,$router_p,$fifow)=@_;
1158
 
1159
        $param_h =~ s/\d\'b/ /g;
1160
        my $text=  "
1161
#ifndef     INCLUDE_PARAM
1162
        #define   INCLUDE_PARAM \n \n
1163 38 alirezamon
 
1164 43 alirezamon
        $param_h
1165
 
1166
        #define NE  $ne
1167
        #define NR  $nr
1168
        #define ROUTER_P_NUM $router_p
1169 48 alirezamon
 
1170
        extern Vtraffic         *traffic[NE];
1171
        extern Vpck_inj     *pck_inj[NE];
1172
        extern int reset,clk;
1173 43 alirezamon
 
1174
        //simulation parameter
1175
        #define MAX_RATIO   ".MAX_RATIO."
1176
        #define AVG_LATENCY_METRIC \"HEAD_2_TAIL\"
1177
        #define TIMSTMP_FIFO_NUM   $fifow
1178
 
1179
        $includ_h
1180
\n \n \#endif" ;
1181
        return $text;
1182
}
1183 38 alirezamon
 
1184 48 alirezamon
sub gen_noc_sim_param {
1185
        my $simulate=shift;
1186 43 alirezamon
        my $fifow=$simulate->object_get_attribute('fpga_param','TIMSTMP_FIFO_NUM');
1187
 
1188 48 alirezamon
        $fifow= '16' if (!defined $fifow);
1189
 
1190
        return "
1191 43 alirezamon
        //simulation parameter
1192 48 alirezamon
        //localparam MAX_RATIO = ".MAX_RATIO.";
1193 43 alirezamon
        localparam MAX_PCK_NUM = ".MAX_SIM_CLKs.";
1194
        localparam MAX_PCK_SIZ = ".MAX_PCK_SIZ.";
1195
        localparam MAX_SIM_CLKs=  ".MAX_SIM_CLKs.";
1196
        localparam TIMSTMP_FIFO_NUM = $fifow;
1197 48 alirezamon
        ";
1198
 
1199
}
1200
 
1201
 
1202
sub gen_noc_localparam_v_file {
1203
        my ($self,$dst_path,$sample)=@_;
1204
        # generate NoC parameter file
1205
        my ($noc_param,$pass_param)=gen_noc_param_v($self,$sample);
1206
        my $header=autogen_warning().get_license_header("noc_localparam.v");
1207
        open(FILE,  ">${dst_path}/noc_localparam.v") || die "Can not open: $!";
1208
        my $sim =gen_noc_sim_param($self);
1209
        print FILE  "$header
1210
 
1211
        \`ifdef   NOC_LOCAL_PARAM \n \n
1212
        $noc_param
1213
 
1214
        $sim
1215
 
1216
\n \n \`endif";
1217 43 alirezamon
        close FILE;
1218
}
1219
 
1220
 
1221 25 alirezamon
############
1222
#    main
1223
############
1224
sub emulator_main{
1225 38 alirezamon
 
1226 25 alirezamon
        add_color_to_gd();
1227
        my $emulate= emulator->emulator_new();
1228
        set_gui_status($emulate,"ideal",0);
1229 38 alirezamon
        $emulate->object_add_attribute('compile','compilers',"QuartusII");
1230 48 alirezamon
        my $left_table = def_table (25, 6, FALSE);
1231
        my $right_table =def_table (25, 6, FALSE);
1232
        my $main_table = def_table (25, 12, FALSE);
1233
        my ($infobox,$info)= create_txview();
1234 43 alirezamon
 
1235 48 alirezamon
 
1236 38 alirezamon
 
1237
        my @pages =(
1238
                {page_name=>" Avg. throughput/latency", page_num=>0},
1239
                {page_name=>" Injected Packet ", page_num=>1},
1240
                {page_name=>" Worst-Case Delay ",page_num=>2},
1241 48 alirezamon
                {page_name=>" Execution Time ",page_num=>3},
1242 38 alirezamon
        );
1243 25 alirezamon
 
1244 38 alirezamon
        my @charts = (
1245 42 alirezamon
                { type=>"2D_line", page_num=>0, graph_name=> "Latency", result_name => "latency_result", X_Title=> 'Desired Avg. Injected Load Per Router (flits/clock (%))', Y_Title=>'Avg. Latency (clock)', Z_Title=>undef, Y_Max=>100},
1246 38 alirezamon
                { type=>"2D_line", page_num=>0, graph_name=> "Throughput", result_name => "throughput_result", X_Title=> 'Desired Avg. Injected Load Per Router (flits/clock (%))', Y_Title=>'Avg. Throughput (flits/clock (%))', Z_Title=>undef},
1247
                { type=>"3D_bar",  page_num=>1, graph_name=> "Received", result_name => "packet_rsvd_result", X_Title=>'Core ID' , Y_Title=>'Received Packets Per Router', Z_Title=>undef},
1248
                { type=>"3D_bar",  page_num=>1, graph_name=> "Sent", result_name => "packet_sent_result", X_Title=>'Core ID' , Y_Title=>'Sent Packets Per Router', Z_Title=>undef},
1249
                { type=>"3D_bar",  page_num=>2, graph_name=> "Received", result_name => "worst_delay_rsvd_result",X_Title=>'Core ID' , Y_Title=>'Worst-Case Delay (clk)', Z_Title=>undef},
1250
                { type=>"2D_line", page_num=>3, graph_name=> "-", result_name => "exe_time_result",X_Title=>'Desired Avg. Injected Load Per Router (flits/clock (%))' , Y_Title=>'Total Emulation Time (clk)', Z_Title=>undef},
1251
        );
1252
 
1253 48 alirezamon
        my ($conf_box,$set_win)=process_notebook_gen($emulate,$info,"emulate", undef,@charts);
1254
        my $chart   =gen_multiple_charts ($emulate,\@pages,\@charts,.4);
1255 25 alirezamon
 
1256
        $main_table->set_row_spacings (4);
1257
        $main_table->set_col_spacings (1);
1258 38 alirezamon
 
1259 25 alirezamon
        my $generate = def_image_button('icons/forward.png','Run all');
1260
        my $open = def_image_button('icons/browse.png','Load');
1261 43 alirezamon
        my $diagram  = def_image_button('icons/diagram.png','Diagram');
1262 38 alirezamon
 
1263
        my ($entrybox,$entry) = def_h_labeled_entry('Save as:',undef);
1264 25 alirezamon
 
1265
        $entry->signal_connect( 'changed'=> sub{
1266
                my $name=$entry->get_text();
1267
                $emulate->object_add_attribute ("emulate_name",undef,$name);
1268
        });
1269
        my $save = def_image_button('icons/save.png','Save');
1270
        $entrybox->pack_end($save,   FALSE, FALSE,0);
1271 38 alirezamon
 
1272
        my $image = get_status_gif($emulate);
1273
        my $v1=gen_vpaned($conf_box,.45,$image);
1274
        my $v2=gen_vpaned($infobox,.2,$chart);
1275
        my $h1=gen_hpaned($v1,.4,$v2);
1276 25 alirezamon
 
1277
        #$table->attach_defaults ($event_box, $col, $col+1, $row, $row+1);
1278 38 alirezamon
        $main_table->attach_defaults ($h1  , 0, 12, 0,24);
1279 43 alirezamon
        $main_table->attach ($open,0, 2, 24,25,'expand','shrink',2,2);
1280
#       $main_table->attach ($diagram, 2, 4, 24,25,'expand','shrink',2,2);
1281
        $main_table->attach ($entrybox,4, 7, 24,25,'expand','shrink',2,2);
1282
        $main_table->attach ($generate, 7, 9, 24,25,'expand','shrink',2,2);
1283 32 alirezamon
 
1284 25 alirezamon
        #check soc status every 0.5 second. referesh device table if there is any changes 
1285 38 alirezamon
        Glib::Timeout->add (100, sub{
1286 25 alirezamon
                my ($state,$timeout)= get_gui_status($emulate);
1287
 
1288
                if ($timeout>0){
1289
                        $timeout--;
1290
                        set_gui_status($emulate,$state,$timeout);
1291 38 alirezamon
                        return TRUE;
1292 25 alirezamon
                }
1293 38 alirezamon
                if($state eq "ideal"){
1294
                        return TRUE;
1295
 
1296
                }
1297
 
1298 48 alirezamon
 
1299 38 alirezamon
                #refresh GUI
1300
                my $name=$emulate->object_get_attribute ("emulate_name",undef);
1301
                $entry->set_text($name) if(defined $name);
1302
                $conf_box->destroy();
1303
                $chart->destroy();
1304
                $image->destroy();
1305
                $image = get_status_gif($emulate);
1306 48 alirezamon
                ($conf_box,$set_win)=process_notebook_gen($emulate,$info,"emulate",$set_win, @charts);
1307
                $chart   =gen_multiple_charts  ($emulate,\@pages,\@charts,.4);
1308 38 alirezamon
                $v1 -> pack1($conf_box, TRUE, TRUE);
1309
                $v1 -> pack2($image, TRUE, TRUE);
1310
                $v2 -> pack2($chart, TRUE, TRUE);
1311
                $conf_box->show_all();
1312
                $main_table->show_all();
1313
                set_gui_status($emulate,"ideal",0);
1314
 
1315 25 alirezamon
                return TRUE;
1316
 
1317
        } );
1318 43 alirezamon
 
1319
         $diagram-> signal_connect("clicked" => sub{
1320
        show_topology_diagram ($emulate);
1321
    });
1322 25 alirezamon
 
1323
        $generate-> signal_connect("clicked" => sub{
1324 38 alirezamon
                my @samples =$emulate->object_get_attribute_order("samples");
1325
                foreach my $sample (@samples){
1326
                        $emulate->object_add_attribute ($sample,"status","run");
1327 25 alirezamon
                }
1328 48 alirezamon
                run_emulator($emulate,$info);
1329 25 alirezamon
        });
1330
 
1331
 
1332
        $open-> signal_connect("clicked" => sub{
1333 48 alirezamon
                load_emulation($emulate,$info);
1334 25 alirezamon
                set_gui_status($emulate,"ref",5);
1335
        });
1336
 
1337
        $save-> signal_connect("clicked" => sub{
1338
                save_emulation($emulate);
1339
                set_gui_status($emulate,"ref",5);
1340
        });
1341
 
1342 48 alirezamon
 
1343 25 alirezamon
 
1344 48 alirezamon
        return add_widget_to_scrolled_win($main_table);
1345 25 alirezamon
}
1346
 
1347
 
1348
 

powered by: WebSVN 2.1.0

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