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 48

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
                                if ( $range[0] <= 0 || $range[0] >100  ) { message_dialog ("$range[0] is out of boundery (1:100)" ); return undef; }
68
                                push(@ratios,$range[0]);
69
                        }elsif($size ==3){# its a range
70
                                my($min,$max,$step)=@range;
71
                                if ( $min <= 0 || $min >100  ) { message_dialog ("$min in  $p is out of boundery (1:100)" ); return undef; }
72
                                if ( $max <= 0 || $max >100  ) { message_dialog ("$max in  $p is out of boundery (1:100)" ); return undef; }
73
                                for (my $i=$min; $i<=$max; $i=$i+$step){
74
                                                push(@ratios,$i);
75
                                }
76
 
77
                        }else{
78
                                 message_dialog ("$p has invalid format. The correct format for range is \$min:\$max:\$step" );
79
 
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 38 alirezamon
        my $l= "Define injection ratios. You can define individual ratios seprating by comma (\',\') or define a range of injection ratios with \$min:\$max:\$step format.
253
As an example defining 2,3,4:10:2 will result in (2,3,4,6,8,10) injection ratios." ;
254
        my $u=get_injection_ratios ($emulate,$sample,"ratios");
255 25 alirezamon
 
256 38 alirezamon
        attach_widget_to_table ($table,$row,gen_label_in_left("Injection ratios:"),gen_button_message ($l,"icons/help.png") , $u); $row++;
257 28 alirezamon
 
258 48 alirezamon
        my $scrolled_win = add_widget_to_scrolled_win($table);
259 25 alirezamon
 
260
        my $ok = def_image_button('icons/select.png','OK');
261 28 alirezamon
        my $mtable = def_table(10, 1, TRUE);
262
 
263
        $mtable->attach_defaults($scrolled_win,0,1,0,9);
264
        $mtable-> attach ($ok , 0, 1,  9, 10,'expand','shrink',2,2);
265 25 alirezamon
 
266 48 alirezamon
        add_widget_to_scrolled_win ($mtable,$set_win);
267 32 alirezamon
        $set_win->show_all();
268 28 alirezamon
 
269 32 alirezamon
        $set_win ->signal_connect (destroy => sub{
270
 
271
                $emulate->object_add_attribute("active_setting",undef,undef);
272
        });
273 28 alirezamon
 
274 25 alirezamon
 
275
 
276
        $ok->signal_connect("clicked"=> sub{
277
                #check if sof file has been selected
278 38 alirezamon
                my $s=get_sof_file_full_addr($emulate,$sample);
279 25 alirezamon
                #check if injection ratios are valid
280 38 alirezamon
                my $r=$emulate->object_get_attribute($sample,"ratios");
281 25 alirezamon
                if(defined $s && defined $r) {
282 48 alirezamon
                                $set_win->hide;
283
                                $emulate->object_add_attribute("active_setting",undef,undef);
284 25 alirezamon
                                set_gui_status($emulate,"ref",1);
285
                } else {
286
 
287
                        if(!defined $s){
288 32 alirezamon
                                my $m=($mode eq 'simulate') ? "Please select NoC verilated file" : "Please select sof file!";
289
                                message_dialog($m);
290 25 alirezamon
                        } else {
291 32 alirezamon
                                 message_dialog("Please define valid injection ratio(s)!");
292 25 alirezamon
                        }
293
                }
294
        });
295 28 alirezamon
 
296 32 alirezamon
 
297 25 alirezamon
}
298
 
299
 
300
 
301
#####################
302
#               gen_widgets_column
303
###################      
304
 
305
sub gen_emulation_column {
306 48 alirezamon
        my ($emulate,$mode, $row_num,$info,$set_win,@charts)=@_;
307 25 alirezamon
        my $table=def_table($row_num,10,FALSE);
308 48 alirezamon
        if(!defined $set_win){
309
                $set_win=def_popwin_size(40,80,"NoC configuration setting",'percent');
310
                $set_win->signal_connect (delete_event => sub {$emulate->object_add_attribute("active_setting",undef,undef); $set_win->hide_on_delete });
311
 
312
        } else{
313
                my @childs = $set_win->get_children;
314
                foreach my $c (@childs){ $c->destroy;}
315
        }
316 38 alirezamon
        my $scrolled_win = gen_scr_win_with_adjst ($emulate,"emulation_column");
317 48 alirezamon
        add_widget_to_scrolled_win($table,$scrolled_win);
318 25 alirezamon
        my $row=0;
319 32 alirezamon
 
320 25 alirezamon
        #title  
321 32 alirezamon
        my $title_l =($mode eq "simulate" ) ? "NoC Simulator" : "NoC Emulator";
322
        my $title=gen_label_in_center($title_l);
323 38 alirezamon
        $table->attach ($title , 0, 10,  $row, $row+1,'expand','shrink',2,2); $row++;
324 48 alirezamon
        add_Hsep_to_table($table,0,10,$row);$row++;
325 32 alirezamon
 
326 48 alirezamon
 
327 25 alirezamon
 
328 48 alirezamon
 
329
        my %order;
330
        $order{'+/-'}=0;
331
        $order{'Setting'}=1;
332
        $order{'Run'}=2;
333
        $order{'Name'}=3;
334
        $order{'Color'}=4;
335
        $order{'Clear'}=5;
336
        $order{'Traffic'}=6;
337
        $order{'Done'}=7;
338
 
339
        foreach my $t (sort keys %order){
340
                $table->attach (gen_label_in_center($t), $order{$t}, $order{$t}+1, $row, $row+1,'expand','shrink',2,2);
341 25 alirezamon
        }
342
 
343
        my $traffics="Random,Transposed 1,Transposed 2,Tornado";
344
 
345 48 alirezamon
 
346 25 alirezamon
        $row++;
347 48 alirezamon
 
348 38 alirezamon
 
349 25 alirezamon
 
350 38 alirezamon
        #my $i=0;
351 32 alirezamon
        my $active=$emulate->object_get_attribute("active_setting",undef);
352 38 alirezamon
        my @samples;
353
        @samples =$emulate->object_get_attribute_order("samples");
354
 
355 48 alirezamon
 
356
 
357 38 alirezamon
        foreach my $ss (@samples){
358
 
359 48 alirezamon
 
360 38 alirezamon
                my $sample=$ss;
361
                #my $sample="sample$i";
362
                #my $n=$i;
363
 
364 25 alirezamon
                my $name=$emulate->object_get_attribute($sample,"line_name");
365
                my $l;
366 38 alirezamon
                my $s=($mode eq "simulate" ) ? 1 : get_sof_file_full_addr($emulate,$sample);
367 32 alirezamon
                #check if injection ratios are valid
368 38 alirezamon
                my $r=$emulate->object_get_attribute($sample,"ratios");
369
                if(defined $s  && defined $name){
370 44 alirezamon
 
371 43 alirezamon
                         $l=def_image_button('icons/diagram.png',$name);
372
                         $l-> signal_connect("clicked" => sub{
373
                                my $st = ($mode eq "simulate" )?  check_sim_sample($emulate,$sample,$info)   : check_sample($emulate,$sample,$info);
374
                                return if $st==0;
375
                                my ($topology, $T1, $T2, $T3, $V, $Fpay) = get_sample_emulation_param($emulate,$sample);
376
                                $emulate->object_add_attribute('noc_param','T1',$T1);
377
                                $emulate->object_add_attribute('noc_param','T2',$T2);
378
                                $emulate->object_add_attribute('noc_param','T3',$T3);
379
                                $emulate->object_add_attribute('noc_param','TOPOLOGY',$topology);
380
                        show_topology_diagram ($emulate);
381
                 });
382 44 alirezamon
 
383
                 my $traffic = def_button("Pattern");
384
                 $traffic-> signal_connect("clicked" => sub{
385
                        my $st = ($mode eq "simulate" )?  check_sim_sample($emulate,$sample,$info)   : check_sample($emulate,$sample,$info);
386
                                return if $st==0;
387
                                my ($topology, $T1, $T2, $T3, $V, $Fpay) = get_sample_emulation_param($emulate,$sample);
388
                                $emulate->object_add_attribute('noc_param','T1',$T1);
389
                                $emulate->object_add_attribute('noc_param','T2',$T2);
390
                                $emulate->object_add_attribute('noc_param','T3',$T3);
391
                                $emulate->object_add_attribute('noc_param','TOPOLOGY',$topology);
392 48 alirezamon
                                my $pattern="";
393
                                my $traffictype=$emulate->object_get_attribute($sample,"TRAFFIC_TYPE");
394
                                $pattern=get_synthetic_traffic_pattern($emulate, $sample) if($traffictype eq "Synthetic");
395
                                $pattern=" Custom traffic based on input file. " if($traffictype eq "Task-graph");
396
 
397 44 alirezamon
                                my $window = def_popwin_size(40,40,"Traffic pattern",'percent');
398 48 alirezamon
                                my ($outbox,$tview)= create_txview();
399
                                show_info($tview,"$pattern");
400 44 alirezamon
                                $window->add ($outbox);
401
                                $window->show_all();
402
 
403
                 });
404
 
405
 
406 48 alirezamon
                 $table->attach ($l, $order{'Name'}, $order{'Name'}+1, $row, $row+1,'expand','shrink',2,2);
407
                 $table->attach ($traffic, $order{'Traffic'}, $order{'Traffic'}+1, $row, $row+1,'expand','shrink',2,2);
408
 
409 43 alirezamon
 
410 25 alirezamon
                } else {
411 32 alirezamon
                        $l=gen_label_in_left("Define NoC configuration");
412 44 alirezamon
                        $l->set_markup("<span  foreground= 'red' ><b>Define NoC configuration</b></span>");
413 48 alirezamon
                        $table->attach ($l, $order{'Name'}, $order{'Name'}+1, $row, $row+1,'expand','shrink',2,2);
414 25 alirezamon
                }
415 48 alirezamon
 
416 32 alirezamon
 
417 38 alirezamon
                #remove 
418
                my $remove=def_image_button("icons/cancel.png");
419 48 alirezamon
                $table->attach ($remove,$order{'+/-'},$order{'+/-'}+1, $row, $row+1,'expand','shrink',2,2);
420 38 alirezamon
                $remove->signal_connect("clicked"=> sub{
421
                        $emulate->object_delete_attribute_order("samples",$sample);
422
                        set_gui_status($emulate,"ref",2);
423
                });
424
 
425
                #setting
426
                my $set=def_image_button("icons/setting.png");
427 48 alirezamon
                $table->attach ($set, $order{'Setting'}, $order{'Setting'}+1, $row, $row+1,'expand','shrink',2,2);
428 38 alirezamon
 
429 32 alirezamon
 
430
                if(defined $active){#The setting windows ask for refershing so open it again
431 38 alirezamon
                        get_noc_configuration($emulate,$mode,$sample,$set_win) if       ($active eq $sample);
432 32 alirezamon
                }
433
 
434
 
435
 
436 25 alirezamon
                $set->signal_connect("clicked"=> sub{
437 38 alirezamon
                        $emulate->object_add_attribute("active_setting",undef,$sample);
438
                        get_noc_configuration($emulate,$mode,$sample,$set_win);
439 25 alirezamon
                });
440
 
441
 
442
 
443
                my $color_num=$emulate->object_get_attribute($sample,"color");
444
                if(!defined $color_num){
445 38 alirezamon
                        $color_num = (scalar @samples) +1;
446 25 alirezamon
                        $emulate->object_add_attribute($sample,"color",$color_num);
447
                }
448 48 alirezamon
                my $color=def_colored_button("   ",$color_num);
449
                $table->attach ($color, $order{'Color'}, $order{'Color'}+1, $row, $row+1,'fill','fill',2,2);
450 25 alirezamon
 
451
                $color->signal_connect("clicked"=> sub{
452
                        get_color_window($emulate,$sample,"color");
453
                });
454
 
455
                #clear line
456
                my $clear = def_image_button('icons/clear.png');
457
                $clear->signal_connect("clicked"=> sub{
458 38 alirezamon
                        foreach my $chart (@charts){
459
                                $emulate->object_add_attribute ($sample,"$chart->{result_name}",undef);
460
 
461
                                #print "\$emulate->object_add_attribute ($sample,$chart->{result_name}_result,undef);";
462
 
463
                        }
464 25 alirezamon
                        set_gui_status($emulate,"ref",2);
465
                });
466 48 alirezamon
                $table->attach ($clear, $order{'Clear'}, $order{'Clear'}+1, $row, $row+1,'expand','shrink',2,2);
467 25 alirezamon
                #run/pause
468 38 alirezamon
                my $run = def_image_button('icons/run.png',undef);
469 48 alirezamon
                $table->attach ($run, $order{'Run'}, $order{'Run'}+1, $row, $row+1,'expand','shrink',2,2);
470 25 alirezamon
                $run->signal_connect("clicked"=> sub{
471
                        $emulate->object_add_attribute ($sample,"status","run");
472
                        #start the emulator if it is not running        
473
                        my $status= $emulate->object_get_attribute('status',undef);
474
                        if($status ne 'run'){
475
 
476 32 alirezamon
                                run_emulator($emulate,$info) if($mode eq 'emulate');
477
                                run_simulator($emulate,$info) if($mode eq 'simulate');
478 25 alirezamon
                                set_gui_status($emulate,"ref",2);
479
                        }
480
 
481
                });
482
 
483 48 alirezamon
                my $image = gen_noc_status_image($emulate,$sample);
484
                $table->attach ($image, $order{'Done'},$order{'Done'}+1, $row, $row+1,'expand','shrink',2,2);
485
 
486 25 alirezamon
                $row++;
487
 
488
        }
489 38 alirezamon
        # add new simulation
490 25 alirezamon
 
491 48 alirezamon
        my $add=def_image_button("icons/plus.png",' A_dd ',FALSE,1);
492
        $table->attach ($add, $order{'+/-'},$order{'+/-'}+2, $row, $row+1,'expand','shrink',2,2);
493
 
494
 
495
 
496 38 alirezamon
        $add->signal_connect("clicked"=> sub{
497
                my $n=$emulate->object_get_attribute("id",undef);
498
                $n=0 if (!defined $n);
499
                my $sample="sample$n";
500
                $n++;
501
                $emulate->object_add_attribute("id",undef,$n);
502
                $emulate->object_add_attribute("active_setting",undef,$sample);
503
                #get_noc_configuration($emulate,$mode,$sample,$set_win);
504
                $emulate->object_add_attribute_order("samples",$sample);
505
                set_gui_status($emulate,"ref",1);
506
 
507
        });
508 48 alirezamon
 
509 38 alirezamon
 
510
 
511 32 alirezamon
        return ($scrolled_win,$set_win);
512 25 alirezamon
}
513
 
514
 
515
 
516
##########
517 38 alirezamon
# check_sample
518 25 alirezamon
##########
519
 
520
sub check_sample{
521 38 alirezamon
        my ($emulate,$sample,$info)=@_;
522 25 alirezamon
        my $status=1;
523 38 alirezamon
        my $sof=get_sof_file_full_addr($emulate,$sample);
524 36 alirezamon
 
525
 
526
 
527 25 alirezamon
        # ckeck if sample have sof file
528
        if(!defined $sof){
529 38 alirezamon
                #add_info($info, "Error: SoF file has not set for $sample!\n");
530
                add_colored_info($info, "Error: SoF file has not set for $sample!\n",'red');
531
                $emulate->object_add_attribute ($sample,"status","failed");
532 25 alirezamon
                $status=0;
533
        } else {
534
                # ckeck if sof file has info file 
535
                my ($name,$path,$suffix) = fileparse("$sof",qr"\..[^.]*$");
536 36 alirezamon
                my $sof_info= "$path$name.inf";
537 38 alirezamon
 
538
        #       print "\n $sof \t $sof_info\n";
539
 
540 25 alirezamon
                if(!(-f $sof_info)){
541 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');
542 38 alirezamon
                        $emulate->object_add_attribute ($sample,"status","failed");
543 25 alirezamon
                        $status=0;
544
                }else { #add info
545 28 alirezamon
                        my $pp= do $sof_info ;
546
 
547
                        my $p=$pp->{'noc_param'};
548
 
549 25 alirezamon
                        $status=0 if $@;
550 48 alirezamon
                        message_dialog("Error reading: $@",'error') if $@;
551 25 alirezamon
                        if ($status==1){
552 38 alirezamon
                                $emulate->object_add_attribute ($sample,"noc_info",$p) ;
553
 
554 25 alirezamon
 
555 38 alirezamon
                        }
556 25 alirezamon
                }
557
        }
558
 
559
        return $status;
560
}
561
 
562
 
563
 
564
 
565
 
566
 
567
 
568
 
569
 
570
#############
571
#  images
572
##########
573
sub get_status_gif{
574
                my $emulate=shift;
575
                my $status= $emulate->object_get_attribute('status',undef);
576
                if($status eq 'ideal'){
577
                        return show_gif ("icons/ProNoC.png");
578
                } elsif ($status eq 'run') {
579
                        my($width,$hight)=max_win_size();
580
                        my $image=($width>=1600)? "icons/hamster_l.gif":
581
                                  ($width>=1200)? "icons/hamster_m.gif": "icons/hamster_s.gif";
582
 
583
                        return show_gif ($image);
584 48 alirezamon
                } elsif ($status eq 'programmer_failed') {
585 25 alirezamon
                        return show_gif ("icons/Error.png");
586
                }
587
 
588
}
589
 
590
 
591
 
592
 
593
sub gen_noc_status_image {
594 38 alirezamon
        my ($emulate,$sample)=@_;
595
        my   $status= $emulate->object_get_attribute ($sample,"status");
596 48 alirezamon
        $status='' if(!defined  $status);
597 25 alirezamon
        my $image;
598 48 alirezamon
        my $box = def_hbox(TRUE,1);
599
        $image = new_image_from_file ("icons/load.gif") if($status eq "run");
600 34 alirezamon
        $image = def_icon("icons/button_ok.png") if($status eq "done");
601 43 alirezamon
        $image = def_icon("icons/warning.png") if($status eq "failed");
602 48 alirezamon
 
603
        if (defined $image) {
604
                $box->pack_start (add_frame_to_image($image), FALSE, FALSE, 0);
605 25 alirezamon
        }
606 48 alirezamon
        return $box;
607 25 alirezamon
 
608
}
609
 
610
 
611
############
612
#       run_emulator
613
###########
614
 
615
sub run_emulator {
616
        my ($emulate,$info)=@_;
617 38 alirezamon
        #my $graph_name="latency_ratio";
618 25 alirezamon
        #return if(!check_samples($emulate,$info));
619
        $emulate->object_add_attribute('status',undef,'run');
620
        set_gui_status($emulate,"ref",1);
621 38 alirezamon
        show_colored_info($info, "start emulation\n",'blue');
622 25 alirezamon
 
623 38 alirezamon
#       #search for available usb blaster
624
#       my $cmd = "jtagconfig";
625
#       my ($stdout,$exit)=run_cmd_in_back_ground_get_stdout("$cmd");
626
#       my @matches= ($stdout =~ /USB-Blaster.*/g);
627
#       my $usb_blaster=$matches[0];
628
#       if (!defined $usb_blaster){
629
#               add_info($info, "jtagconfig could not find any USB blaster cable: $stdout \n");
630 48 alirezamon
#               $emulate->object_add_attribute('status',undef,'programmer_failed');
631 38 alirezamon
#               set_gui_status($emulate,"ref",2);
632
#               #/***/
633
#               return; 
634
#       }else{
635
#               add_info($info, "find $usb_blaster\n");
636
#       }
637
        my @samples =$emulate->object_get_attribute_order("samples");
638
        foreach my $sample (@samples){
639
                my $status=$emulate->object_get_attribute ($sample,"status");
640 25 alirezamon
                next if($status ne "run");
641 38 alirezamon
                next if(!check_sample($emulate,$sample,$info));
642
                my $r= $emulate->object_get_attribute($sample,"ratios");
643 25 alirezamon
                my @ratios=@{check_inserted_ratios($r)};
644
                #$emulate->object_add_attribute ("sample$i","status","run");                    
645 38 alirezamon
                my $sof=get_sof_file_full_addr($emulate,$sample);
646
                add_info($info, "Programe FPGA device using $sof.sof\n");
647
                my ($name,$path,$suffix) = fileparse("$sof",qr"\..[^.]*$");
648 48 alirezamon
                my $programmer="$path/program_device.sh";
649 38 alirezamon
                my $jtag_intfc="$path/jtag_intfc.sh";
650 48 alirezamon
                if((-f $programmer)==0){
651
                        add_colored_info ($info, " Error: file  \"$programmer\"  dose not exist. \n",'red');
652
                        $emulate->object_add_attribute('status',undef,'programmer_failed');
653 38 alirezamon
                        $emulate->object_add_attribute ($sample,"status","failed");
654
                        set_gui_status($emulate,"ref",2);
655
                        last;
656
                }
657
                if((-f $jtag_intfc)==0){
658
                        add_colored_info ($info, " Error: file  \"$jtag_intfc\"  dose not exist. \n",'red');
659 48 alirezamon
                        $emulate->object_add_attribute('status',undef,'programmer_failed');
660 38 alirezamon
                        $emulate->object_add_attribute ($sample,"status","failed");
661
                        set_gui_status($emulate,"ref",2);
662
                        last;
663
                }
664 48 alirezamon
                my $cmd =  "bash $programmer $sof.sof";
665 36 alirezamon
 
666 38 alirezamon
 
667
                #my $Quartus_bin=  $ENV{QUARTUS_BIN};
668 25 alirezamon
 
669
 
670 38 alirezamon
                #my $cmd = "$Quartus_bin/quartus_pgm -c \"$usb_blaster\" -m jtag -o \"p;$sof\"";
671 28 alirezamon
 
672 25 alirezamon
                #my $output = `$cmd 2>&1 1>/dev/null`;           # either with backticks
673 28 alirezamon
 
674
                #/***/
675 25 alirezamon
                my ($stdout,$exit)=run_cmd_in_back_ground_get_stdout("$cmd");
676
                if($exit){#programming FPGA board has failed
677 48 alirezamon
                        $emulate->object_add_attribute('status',undef,'programmer_failed');
678 38 alirezamon
                        add_colored_info($info, "$stdout\n",'red');
679
                        $emulate->object_add_attribute ($sample,"status","failed");
680 25 alirezamon
                        set_gui_status($emulate,"ref",2);
681
                        next;
682 28 alirezamon
                }
683
                #print "$stdout\n";
684
 
685 38 alirezamon
                # load noc configuration 
686 28 alirezamon
                foreach  my $ratio_in (@ratios){
687 25 alirezamon
 
688 28 alirezamon
                        add_info($info, "Configure packet generators for  injection ratio of $ratio_in \% \n");
689 38 alirezamon
                        if(!programe_pck_gens($emulate,$sample,$ratio_in,$info,$jtag_intfc)){
690
                                add_colored_info($info, "Error in programe_pck_gens function\n",'red');
691
                                next;
692
                        }
693 28 alirezamon
 
694 38 alirezamon
 
695
                        my $r=read_pack_gen($emulate,$sample,$info,$jtag_intfc,$ratio_in);
696
                            next if (!defined $r);
697
 
698
 
699
 
700 28 alirezamon
                        set_gui_status($emulate,"ref",2);
701 25 alirezamon
 
702
                }
703 38 alirezamon
                $emulate->object_add_attribute ($sample,"status","done");
704 25 alirezamon
 
705
        }
706
 
707 38 alirezamon
        add_colored_info($info, "End emulation!\n",'blue');
708 25 alirezamon
        $emulate->object_add_attribute('status',undef,'ideal');
709
        set_gui_status($emulate,"ref",1);
710
}
711
 
712
 
713
 
714
 
715
 
716
 
717 38 alirezamon
##############
718
#        process_notebook_gen
719
##############
720 25 alirezamon
 
721
 
722
sub process_notebook_gen{
723 48 alirezamon
                my ($emulate,$info,$mode,$set_win,@charts)=@_;
724
                my $notebook = gen_notebook();
725 25 alirezamon
                $notebook->set_tab_pos ('left');
726
                $notebook->set_scrollable(TRUE);
727 48 alirezamon
                #$notebook->can_focus(FALSE);
728 32 alirezamon
 
729 48 alirezamon
                my $page1;
730
                ($page1,$set_win)=gen_emulation_column($emulate, $mode,10,$info,$set_win,@charts);
731
                $notebook->append_page ($page1,gen_label_with_mnemonic ("  _Run emulator  ")) if($mode eq "emulate");
732
                $notebook->append_page ($page1,gen_label_with_mnemonic ("  _Run simulator ")) if($mode eq "simulate");
733 25 alirezamon
 
734
 
735 32 alirezamon
                my $page2=get_noc_setting_gui ($emulate,$info,$mode);
736 38 alirezamon
                my $tt=($mode eq "emulate")? "  _Generate NoC \nEmulation Model" : "  _Generate NoC \nSimulation Model" ;
737 48 alirezamon
                $notebook->append_page ($page2,gen_label_with_mnemonic ($tt));
738 25 alirezamon
 
739
 
740 48 alirezamon
 
741
                my $scrolled_win = add_widget_to_scrolled_win($notebook);
742 25 alirezamon
                $scrolled_win->show_all;
743
                my $page_num=$emulate->object_get_attribute ("process_notebook","currentpage");
744
                $notebook->set_current_page ($page_num) if(defined $page_num);
745
                $notebook->signal_connect( 'switch-page'=> sub{
746
                        $emulate->object_add_attribute ("process_notebook","currentpage",$_[2]);        #save the new pagenumber
747
 
748
                });
749
 
750 32 alirezamon
                return ($scrolled_win,$set_win);
751 25 alirezamon
 
752
}
753
 
754
 
755
sub get_noc_setting_gui {
756 32 alirezamon
        my ($emulate,$info_text,$mode)=@_;
757 28 alirezamon
        my $table=def_table(20,10,FALSE);#      my ($row,$col,$homogeneous)=@_;
758 38 alirezamon
 
759 48 alirezamon
 
760 38 alirezamon
        my $scrolled_win = gen_scr_win_with_adjst ($emulate,"noc_setting_gui");
761 48 alirezamon
        add_widget_to_scrolled_win($table,$scrolled_win);
762
        my $row=noc_config ($emulate,$table,$info_text);
763 25 alirezamon
 
764 28 alirezamon
        my($label,$param,$default,$content,$type,$info);
765 48 alirezamon
        my @dirs = grep {-d} glob("../boards/Altera/*");
766 28 alirezamon
        my $fpgas;
767
        foreach my $dir (@dirs) {
768
                my ($name,$path,$suffix) = fileparse("$dir",qr"\..[^.]*$");
769
                $default=$name;
770 38 alirezamon
                $fpgas= (defined $fpgas)? "$fpgas,$name" : "$name";
771 28 alirezamon
        }
772
 
773 38 alirezamon
        my @fpgainfo;
774
        if($mode eq "emulate"){
775
                @fpgainfo = (
776
                { 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},
777
                { label=>'Save as:', param_name=>'SAVE_NAME', type=>"Entry", default_val=>'emulate1', content=>undef, info=>undef, param_parent=>'fpga_param', ref_delay=>undef},
778
                { 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 },
779
                );
780
 
781
        }
782
        else {
783
                @fpgainfo = (
784
                { 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},
785
                { label=>'Save as:', param_name=>'SAVE_NAME', type=>"Entry", default_val=>'simulate1', content=>undef, info=>undef, param_parent=>'sim_param', ref_delay=>undef},
786
                { 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 },
787 48 alirezamon
 
788 38 alirezamon
                );
789
        }
790 25 alirezamon
 
791 43 alirezamon
        my $coltmp=0;
792
        foreach my $d (@fpgainfo) {
793
                ($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});
794 38 alirezamon
        }
795 48 alirezamon
 
796
        my $maintable=def_table(20,10,FALSE);#  my ($row,$col,$homogeneous)=@_;
797 38 alirezamon
 
798 43 alirezamon
        my $generate = def_image_button('icons/gen.png','Gener_ate',FALSE,1);
799
        my $diagram  = def_image_button('icons/diagram.png','Diagram');
800 48 alirezamon
        my $import   = def_image_button('icons/import.png','I_mport',FALSE,1);
801
        set_tip($import ,"Import NoC configuration from file");
802
 
803
        $maintable->attach_defaults ($scrolled_win, 0,10, 0, 9);
804
        $maintable->attach_defaults (gen_Hsep(), 0,10, 8, 9);
805
        $maintable->attach ($generate, 0,2, 9, 10,'expand','shrink',2,2);
806
        $maintable->attach ($diagram, 2,4, 9, 10,'expand','shrink',2,2);
807
        $maintable->attach ($import, 4,6, 9, 10,'expand','shrink',2,2);
808
 
809
 
810 43 alirezamon
    $diagram-> signal_connect("clicked" => sub{
811
        show_topology_diagram ($emulate);
812
    });
813 38 alirezamon
    $generate->signal_connect ('clicked'=> sub{
814
                generate_sof_file($emulate,$info_text) if($mode eq "emulate");
815
                generate_sim_bin_file($emulate,$info_text) if($mode eq "simulate");
816 43 alirezamon
 
817 38 alirezamon
        });
818 48 alirezamon
 
819
        $import-> signal_connect("clicked" => sub{
820
                import_noc_info_file($emulate,$mode);
821
        });
822
 
823
        $scrolled_win->show_all;
824
        return $maintable;
825 38 alirezamon
}
826 28 alirezamon
 
827 48 alirezamon
sub import_noc_info_file{
828
        my ($self,$mode)=@_;
829
        my $file;
830
        my $dialog = gen_file_dialog(undef,'inf');
831
 
832
        my $open_in       = ($mode ne "emulate" ) ? abs_path("$ENV{'PRONOC_WORK'}/simulate") : abs_path("$ENV{'PRONOC_WORK'}/emulate");
833
        $dialog->set_current_folder ($open_in);
834
        if ( "ok" eq $dialog->run ) {
835
                my $status=1;
836
                $file = $dialog->get_filename;
837
                my $pp= do $file ;
838
                my $p=$pp->{'noc_param'};
839
                $status=0 if $@;
840
                message_dialog("Error reading: $@") if $@;
841
                if ($status==1){
842
                        $self->object_add_attribute ("noc_param",undef,$p);
843
                        my ($name,$path,$suffix) = fileparse("$file",qr"\..[^.]*$");
844
                        my $attr1 = ($mode ne "emulate" ) ? 'sim_param' : 'fpga_param';
845
                        $self->object_add_attribute ($attr1,'SAVE_NAME',$name);
846
 
847
                        set_gui_status($self,"ref",1);
848
                }
849
        }
850
        $dialog->destroy;
851
}
852
 
853 38 alirezamon
##########
854
#       generate_sof_file
855
##########
856 32 alirezamon
 
857
 
858 38 alirezamon
sub generate_sof_file {
859 43 alirezamon
        my ($self,$info)=@_;
860 38 alirezamon
        my $name=$self->object_get_attribute ('fpga_param',"SAVE_NAME");
861
        my $target_dir  = "$ENV{'PRONOC_WORK'}/emulate/$name";
862
        my $top         = "$target_dir/src_verilog/${name}_top.v";
863
 
864
        if (!defined $name){
865
                message_dialog("Please define the Save as filed!");
866
                return;
867
        }
868 32 alirezamon
 
869 38 alirezamon
        #copy all noc source codes
870 48 alirezamon
        my @files = (
871
'/mpsoc/rtl/src_emulate/rtl/',
872
'/mpsoc/rtl/src_peripheral/jtag/jtag_wb/',
873
'/mpsoc/rtl/src_peripheral/ram/',
874
'/mpsoc/rtl/main_comp.v',
875
'/mpsoc/rtl/arbiter.v',
876
'/mpsoc/rtl/src_topolgy/',
877
'/mpsoc/rtl/src_noc/');
878
 
879 38 alirezamon
        my $dir = Cwd::getcwd();
880
        my $project_dir   = abs_path("$dir/../../");
881
        my ($stdout,$exit)=run_cmd_in_back_ground_get_stdout("mkdir -p $target_dir/src_verilog" );
882
        copy_file_and_folders(\@files,$project_dir,"$target_dir/src_verilog/lib/");
883 32 alirezamon
 
884
 
885 38 alirezamon
        #generate parameters for emulator_top.v file
886 48 alirezamon
        gen_noc_localparam_v_file($self,"$target_dir/src_verilog/lib/src_noc/");
887
 
888 38 alirezamon
        open(FILE,  ">$top") || die "Can not open: $!";
889
        print FILE create_emulate_top($self,$name,$top);
890
        close(FILE) || die "Error closing file: $!";
891
        select_compiler($self,$name,$top,$target_dir,\&save_the_sof_file);
892
 
893
return;
894 28 alirezamon
}
895
 
896 38 alirezamon
sub create_emulate_top{
897
        my ($self,$name,$top)=@_;
898
        my $top_v= get_license_header("$top");
899 32 alirezamon
 
900 38 alirezamon
$top_v  ="$top_v
901 32 alirezamon
 
902 38 alirezamon
`timescale       1ns/1ps
903 32 alirezamon
 
904 38 alirezamon
module ${name}_top(
905
        output done_led,
906
        output noc_reset_led,
907
        output jtag_reset_led,
908
        input  reset,
909
        input  clk
910
);
911 32 alirezamon
 
912 25 alirezamon
 
913 38 alirezamon
        localparam
914
                STATISTIC_VJTAG_INDEX=124,
915
                PATTERN_VJTAG_INDEX=125,
916
                COUNTER_VJTAG_INDEX=126,
917
                DONE_RESET_VJTAG_INDEX=127;
918
 
919 25 alirezamon
 
920 48 alirezamon
 
921 38 alirezamon
 
922
        wire  reset_noc, reset_injector, reset_noc_sync, reset_injector_sync, done;
923
        wire jtag_reset_injector, jtag_reset_noc;
924
        wire start_o;
925
        wire done_time_limit;
926
 
927
        assign done_led = done | done_time_limit;
928
        assign noc_reset_led= reset_noc;
929
        assign jtag_reset_led   = reset_injector;
930 25 alirezamon
 
931 38 alirezamon
 
932 25 alirezamon
 
933 38 alirezamon
        //  two reset sources which can be controled using jtag. One for reseting NoC another packet injectors
934
        jtag_source_probe #(
935
                .VJTAG_INDEX(DONE_RESET_VJTAG_INDEX),
936
                .Dw(2)  //source/probe width in bits
937
        )the_reset(
938
                .probe({done_time_limit,done}),
939
                .source({jtag_reset_injector,jtag_reset_noc})
940
        );
941 25 alirezamon
 
942
 
943 38 alirezamon
        assign  reset_noc               =       (jtag_reset_noc | reset);
944
        assign  reset_injector          =       (jtag_reset_injector | reset);
945 25 alirezamon
 
946 38 alirezamon
        altera_reset_synchronizer noc_rst_sync
947
        (
948
                .reset_in(reset_noc),
949
                .clk(clk),
950
                .reset_out(reset_noc_sync)
951
        );
952 25 alirezamon
 
953
 
954 38 alirezamon
        altera_reset_synchronizer inject_rst_sync
955
        (
956
                .reset_in(reset_injector),
957
                .clk(clk),
958
                .reset_out(reset_injector_sync)
959
        );
960
 
961
        //noc emulator
962
 
963
        noc_emulator #(
964 48 alirezamon
                .STATISTIC_VJTAG_INDEX(STATISTIC_VJTAG_INDEX),
965
                .PATTERN_VJTAG_INDEX(PATTERN_VJTAG_INDEX)
966 38 alirezamon
        )
967
        noc_emulate_top
968
        (
969
                .reset(reset_noc_sync),
970
                .jtag_ctrl_reset(reset_injector_sync),
971
                .clk(clk),
972
                .start_o(start_o),
973
                .done(done)
974
        );
975
 
976
 
977
 
978
        //clock counter
979
 
980
        function integer log2;
981
      input integer number; begin
982
         log2=(number <=1) ? 1: 0;
983
         while(2**log2<number) begin
984
            log2=log2+1;
985
         end
986
      end
987
    endfunction // log2
988
 
989
        localparam   MAX_SIM_CLKs  = 1_000_000_000;
990
        localparam   CLK_CNTw = log2(MAX_SIM_CLKs+1);
991
 
992
        reg     [CLK_CNTw-1             :   0] clk_counter;
993
        wire    [CLK_CNTw-1             :   0] clk_limit;
994
        reg start;
995
        always @(posedge clk or posedge reset_injector_sync) begin
996
                if(reset_injector_sync)begin
997
                        clk_counter <= {CLK_CNTw{1'b0}};
998
                        start<=1'b0;
999
                end else begin
1000
                        if(start_o) start<=1'b1;
1001
                        if(done==1'b0 && start ) clk_counter<=clk_counter +1'b1;
1002
                end
1003
        end
1004
 
1005
        jtag_source_probe #(
1006
                .VJTAG_INDEX(COUNTER_VJTAG_INDEX),
1007
                .Dw(CLK_CNTw)   //source/probe width in bits
1008
        )the_clk_counter(
1009
                .probe(clk_counter),
1010
                .source(clk_limit)
1011
        );
1012
 
1013
        assign done_time_limit = (clk_counter >= clk_limit);
1014
endmodule
1015
";
1016
        return $top_v;
1017
}
1018 25 alirezamon
 
1019 38 alirezamon
sub save_the_sof_file{
1020 28 alirezamon
 
1021 38 alirezamon
        my $self=shift;
1022
        my $name=$self->object_get_attribute ('fpga_param',"SAVE_NAME");
1023
        my $sofdir="$ENV{PRONOC_WORK}/emulate/sof";
1024
        my $fpga_board=$self->object_get_attribute('compile','board');
1025
        my $target_dir  = "$ENV{'PRONOC_WORK'}/emulate/$name";
1026 28 alirezamon
 
1027 38 alirezamon
        mkpath("$sofdir/$fpga_board/",1,01777);
1028
        open(FILE,  ">$sofdir/$fpga_board/$name.inf") || die "Can not open: $!";
1029
        print FILE perl_file_header("$name.inf");
1030
        my %pp;
1031
        $pp{'noc_param'}= $self->{'noc_param'};
1032
        $pp{'fpga_param'}= $self->{'fpga_param'};
1033
        print FILE Data::Dumper->Dump([\%pp],["emulate_info"]);
1034
        close(FILE) || die "Error closing file: $!";
1035 28 alirezamon
 
1036
 
1037 38 alirezamon
        #find  $dir_name -name \*.sof -exec cp '{}' $sofdir/$fpga_board/$save_name.sof" 
1038
        my @files = File::Find::Rule->file()
1039
                 ->name( '*.sof' )
1040
                 ->in( "$target_dir" );
1041
        copy($files[0],"$sofdir/$fpga_board/$name.sof") or do {
1042
                my $err= "Error copy($files[0] , $sofdir/$fpga_board/$name.sof";
1043
                print "$err\n";
1044 48 alirezamon
                message_dialog($err,'error');
1045 38 alirezamon
                return;
1046
        };
1047
        #copy the board's programming and jtag interface files
1048
 
1049
        my $board_name=$self->object_get_attribute('compile','board');
1050
        #copy board jtag_intfc.sh file 
1051 48 alirezamon
        copy("../boards/Altera/$board_name/jtag_intfc.sh","$sofdir/$fpga_board/jtag_intfc.sh");
1052 38 alirezamon
        #print "../boards/$board_name/jtag_intfc.sh","$sofdir/$fpga_board/jtag_intfc.sh\n";
1053
        #add argument run to jtag_interface file 
1054
        my $runarg='
1055 28 alirezamon
 
1056 38 alirezamon
if [ $# -ne 0 ]
1057
  then
1058
    $JTAG_INTFC $1
1059
fi
1060
';
1061
        append_text_to_file ("$sofdir/$fpga_board/jtag_intfc.sh",$runarg );
1062
 
1063
 
1064
 
1065 28 alirezamon
 
1066 38 alirezamon
        #copy board program_device.sh file 
1067 48 alirezamon
        copy("../boards/Altera/$board_name/program_device.sh","$sofdir/$fpga_board/program_device.sh");
1068 38 alirezamon
 
1069
 
1070 28 alirezamon
 
1071 38 alirezamon
        message_dialog("sof file has been generated successfully");
1072
}
1073 28 alirezamon
 
1074
 
1075 25 alirezamon
 
1076
##########
1077
#       save_emulation
1078
##########
1079
sub save_emulation {
1080
        my ($emulate)=@_;
1081
        # read emulation name
1082
        my $name=$emulate->object_get_attribute ("emulate_name",undef);
1083
        my $s= (!defined $name)? 0 : (length($name)==0)? 0 :1;
1084
        if ($s == 0){
1085
                message_dialog("Please set emulation name!");
1086
                return 0;
1087
        }
1088
        # Write object file
1089
        open(FILE,  ">lib/emulate/$name.EML") || die "Can not open: $!";
1090
        print FILE perl_file_header("$name.EML");
1091 38 alirezamon
        print FILE Data::Dumper->Dump([\%$emulate],["emulate"]);
1092 25 alirezamon
        close(FILE) || die "Error closing file: $!";
1093
        message_dialog("Emulation saved as lib/emulate/$name.EML!");
1094
        return 1;
1095
}
1096
 
1097
#############
1098
#       load_emulation
1099
############
1100
 
1101
sub load_emulation {
1102
        my ($emulate,$info)=@_;
1103
        my $file;
1104 48 alirezamon
        my $dialog =  gen_file_dialog (undef, 'EML');
1105 25 alirezamon
        my $dir = Cwd::getcwd();
1106 48 alirezamon
        $dialog->set_current_folder ("$dir/lib/emulate");
1107 25 alirezamon
 
1108
        if ( "ok" eq $dialog->run ) {
1109
                $file = $dialog->get_filename;
1110
                my ($name,$path,$suffix) = fileparse("$file",qr"\..[^.]*$");
1111
                if($suffix eq '.EML'){
1112 43 alirezamon
 
1113
                        my ($pp,$r,$err) = regen_object($file);
1114
                        if ($r ){
1115
                                add_colored_info($info,"**Error reading  $file file: $err\n",'red');
1116 25 alirezamon
                                 $dialog->destroy;
1117
                                return;
1118
                        }
1119
 
1120
                        clone_obj($emulate,$pp);
1121
                        #message_dialog("done!");                               
1122
                }
1123
     }
1124
     $dialog->destroy;
1125
}
1126
 
1127 38 alirezamon
 
1128
 
1129
sub update_result {
1130
        my ($self,$sample,$name,$x,$y,$z)=@_;
1131
        my $ref=$self->object_get_attribute ($sample,$name);
1132
        my %results;
1133
        %results= %{$ref} if(defined $ref);
1134
        if(!defined $z) {$results{$x}=$y;}
1135
        else {$results{$x}{$y}=$z;}
1136
        $self->object_add_attribute ($sample,$name,\%results);
1137
}
1138
 
1139
 
1140
 
1141 48 alirezamon
 
1142 43 alirezamon
sub gen_sim_parameter_h {
1143
        my ($param_h,$includ_h,$ne,$nr,$router_p,$fifow)=@_;
1144
 
1145
        $param_h =~ s/\d\'b/ /g;
1146
        my $text=  "
1147
#ifndef     INCLUDE_PARAM
1148
        #define   INCLUDE_PARAM \n \n
1149 38 alirezamon
 
1150 43 alirezamon
        $param_h
1151
 
1152
        #define NE  $ne
1153
        #define NR  $nr
1154
        #define ROUTER_P_NUM $router_p
1155 48 alirezamon
 
1156
        extern Vtraffic         *traffic[NE];
1157
        extern Vpck_inj     *pck_inj[NE];
1158
        extern int reset,clk;
1159 43 alirezamon
 
1160
        //simulation parameter
1161
        #define MAX_RATIO   ".MAX_RATIO."
1162
        #define AVG_LATENCY_METRIC \"HEAD_2_TAIL\"
1163
        #define TIMSTMP_FIFO_NUM   $fifow
1164
 
1165
        $includ_h
1166
\n \n \#endif" ;
1167
        return $text;
1168
}
1169 38 alirezamon
 
1170 48 alirezamon
sub gen_noc_sim_param {
1171
        my $simulate=shift;
1172 43 alirezamon
        my $fifow=$simulate->object_get_attribute('fpga_param','TIMSTMP_FIFO_NUM');
1173
 
1174 48 alirezamon
        $fifow= '16' if (!defined $fifow);
1175
 
1176
        return "
1177 43 alirezamon
        //simulation parameter
1178 48 alirezamon
        //localparam MAX_RATIO = ".MAX_RATIO.";
1179 43 alirezamon
        localparam MAX_PCK_NUM = ".MAX_SIM_CLKs.";
1180
        localparam MAX_PCK_SIZ = ".MAX_PCK_SIZ.";
1181
        localparam MAX_SIM_CLKs=  ".MAX_SIM_CLKs.";
1182
        localparam TIMSTMP_FIFO_NUM = $fifow;
1183 48 alirezamon
        ";
1184
 
1185
}
1186
 
1187
 
1188
sub gen_noc_localparam_v_file {
1189
        my ($self,$dst_path,$sample)=@_;
1190
        # generate NoC parameter file
1191
        my ($noc_param,$pass_param)=gen_noc_param_v($self,$sample);
1192
        my $header=autogen_warning().get_license_header("noc_localparam.v");
1193
        open(FILE,  ">${dst_path}/noc_localparam.v") || die "Can not open: $!";
1194
        my $sim =gen_noc_sim_param($self);
1195
        print FILE  "$header
1196
 
1197
        \`ifdef   NOC_LOCAL_PARAM \n \n
1198
        $noc_param
1199
 
1200
        $sim
1201
 
1202
\n \n \`endif";
1203 43 alirezamon
        close FILE;
1204
}
1205
 
1206
 
1207 25 alirezamon
############
1208
#    main
1209
############
1210
sub emulator_main{
1211 38 alirezamon
 
1212 25 alirezamon
        add_color_to_gd();
1213
        my $emulate= emulator->emulator_new();
1214
        set_gui_status($emulate,"ideal",0);
1215 38 alirezamon
        $emulate->object_add_attribute('compile','compilers',"QuartusII");
1216 48 alirezamon
        my $left_table = def_table (25, 6, FALSE);
1217
        my $right_table =def_table (25, 6, FALSE);
1218
        my $main_table = def_table (25, 12, FALSE);
1219
        my ($infobox,$info)= create_txview();
1220 43 alirezamon
 
1221 48 alirezamon
 
1222 38 alirezamon
 
1223
        my @pages =(
1224
                {page_name=>" Avg. throughput/latency", page_num=>0},
1225
                {page_name=>" Injected Packet ", page_num=>1},
1226
                {page_name=>" Worst-Case Delay ",page_num=>2},
1227 48 alirezamon
                {page_name=>" Execution Time ",page_num=>3},
1228 38 alirezamon
        );
1229 25 alirezamon
 
1230 38 alirezamon
        my @charts = (
1231 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},
1232 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},
1233
                { 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},
1234
                { 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},
1235
                { 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},
1236
                { 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},
1237
        );
1238
 
1239 48 alirezamon
        my ($conf_box,$set_win)=process_notebook_gen($emulate,$info,"emulate", undef,@charts);
1240
        my $chart   =gen_multiple_charts ($emulate,\@pages,\@charts,.4);
1241 25 alirezamon
 
1242
        $main_table->set_row_spacings (4);
1243
        $main_table->set_col_spacings (1);
1244 38 alirezamon
 
1245 25 alirezamon
        my $generate = def_image_button('icons/forward.png','Run all');
1246
        my $open = def_image_button('icons/browse.png','Load');
1247 43 alirezamon
        my $diagram  = def_image_button('icons/diagram.png','Diagram');
1248 38 alirezamon
 
1249
        my ($entrybox,$entry) = def_h_labeled_entry('Save as:',undef);
1250 25 alirezamon
 
1251
        $entry->signal_connect( 'changed'=> sub{
1252
                my $name=$entry->get_text();
1253
                $emulate->object_add_attribute ("emulate_name",undef,$name);
1254
        });
1255
        my $save = def_image_button('icons/save.png','Save');
1256
        $entrybox->pack_end($save,   FALSE, FALSE,0);
1257 38 alirezamon
 
1258
        my $image = get_status_gif($emulate);
1259
        my $v1=gen_vpaned($conf_box,.45,$image);
1260
        my $v2=gen_vpaned($infobox,.2,$chart);
1261
        my $h1=gen_hpaned($v1,.4,$v2);
1262 25 alirezamon
 
1263
        #$table->attach_defaults ($event_box, $col, $col+1, $row, $row+1);
1264 38 alirezamon
        $main_table->attach_defaults ($h1  , 0, 12, 0,24);
1265 43 alirezamon
        $main_table->attach ($open,0, 2, 24,25,'expand','shrink',2,2);
1266
#       $main_table->attach ($diagram, 2, 4, 24,25,'expand','shrink',2,2);
1267
        $main_table->attach ($entrybox,4, 7, 24,25,'expand','shrink',2,2);
1268
        $main_table->attach ($generate, 7, 9, 24,25,'expand','shrink',2,2);
1269 32 alirezamon
 
1270 25 alirezamon
        #check soc status every 0.5 second. referesh device table if there is any changes 
1271 38 alirezamon
        Glib::Timeout->add (100, sub{
1272 25 alirezamon
                my ($state,$timeout)= get_gui_status($emulate);
1273
 
1274
                if ($timeout>0){
1275
                        $timeout--;
1276
                        set_gui_status($emulate,$state,$timeout);
1277 38 alirezamon
                        return TRUE;
1278 25 alirezamon
                }
1279 38 alirezamon
                if($state eq "ideal"){
1280
                        return TRUE;
1281
 
1282
                }
1283
 
1284 48 alirezamon
 
1285 38 alirezamon
                #refresh GUI
1286
                my $name=$emulate->object_get_attribute ("emulate_name",undef);
1287
                $entry->set_text($name) if(defined $name);
1288
                $conf_box->destroy();
1289
                $chart->destroy();
1290
                $image->destroy();
1291
                $image = get_status_gif($emulate);
1292 48 alirezamon
                ($conf_box,$set_win)=process_notebook_gen($emulate,$info,"emulate",$set_win, @charts);
1293
                $chart   =gen_multiple_charts  ($emulate,\@pages,\@charts,.4);
1294 38 alirezamon
                $v1 -> pack1($conf_box, TRUE, TRUE);
1295
                $v1 -> pack2($image, TRUE, TRUE);
1296
                $v2 -> pack2($chart, TRUE, TRUE);
1297
                $conf_box->show_all();
1298
                $main_table->show_all();
1299
                set_gui_status($emulate,"ideal",0);
1300
 
1301 25 alirezamon
                return TRUE;
1302
 
1303
        } );
1304 43 alirezamon
 
1305
         $diagram-> signal_connect("clicked" => sub{
1306
        show_topology_diagram ($emulate);
1307
    });
1308 25 alirezamon
 
1309
        $generate-> signal_connect("clicked" => sub{
1310 38 alirezamon
                my @samples =$emulate->object_get_attribute_order("samples");
1311
                foreach my $sample (@samples){
1312
                        $emulate->object_add_attribute ($sample,"status","run");
1313 25 alirezamon
                }
1314 48 alirezamon
                run_emulator($emulate,$info);
1315 25 alirezamon
        });
1316
 
1317
 
1318
        $open-> signal_connect("clicked" => sub{
1319 48 alirezamon
                load_emulation($emulate,$info);
1320 25 alirezamon
                set_gui_status($emulate,"ref",5);
1321
        });
1322
 
1323
        $save-> signal_connect("clicked" => sub{
1324
                save_emulation($emulate);
1325
                set_gui_status($emulate,"ref",5);
1326
        });
1327
 
1328 48 alirezamon
 
1329 25 alirezamon
 
1330 48 alirezamon
        return add_widget_to_scrolled_win($main_table);
1331 25 alirezamon
}
1332
 
1333
 
1334
 

powered by: WebSVN 2.1.0

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