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 56

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 56 alirezamon
                .PATTERN_VJTAG_INDEX(PATTERN_VJTAG_INDEX),
980
                .NOC_ID(0)
981 38 alirezamon
        )
982
        noc_emulate_top
983
        (
984
                .reset(reset_noc_sync),
985
                .jtag_ctrl_reset(reset_injector_sync),
986
                .clk(clk),
987
                .start_o(start_o),
988
                .done(done)
989
        );
990
 
991
 
992
 
993
        //clock counter
994
 
995
        function integer log2;
996
      input integer number; begin
997
         log2=(number <=1) ? 1: 0;
998
         while(2**log2<number) begin
999
            log2=log2+1;
1000
         end
1001
      end
1002
    endfunction // log2
1003
 
1004
        localparam   MAX_SIM_CLKs  = 1_000_000_000;
1005
        localparam   CLK_CNTw = log2(MAX_SIM_CLKs+1);
1006
 
1007
        reg     [CLK_CNTw-1             :   0] clk_counter;
1008
        wire    [CLK_CNTw-1             :   0] clk_limit;
1009
        reg start;
1010
        always @(posedge clk or posedge reset_injector_sync) begin
1011
                if(reset_injector_sync)begin
1012
                        clk_counter <= {CLK_CNTw{1'b0}};
1013
                        start<=1'b0;
1014
                end else begin
1015
                        if(start_o) start<=1'b1;
1016
                        if(done==1'b0 && start ) clk_counter<=clk_counter +1'b1;
1017
                end
1018
        end
1019
 
1020
        jtag_source_probe #(
1021
                .VJTAG_INDEX(COUNTER_VJTAG_INDEX),
1022
                .Dw(CLK_CNTw)   //source/probe width in bits
1023
        )the_clk_counter(
1024
                .probe(clk_counter),
1025
                .source(clk_limit)
1026
        );
1027
 
1028
        assign done_time_limit = (clk_counter >= clk_limit);
1029
endmodule
1030
";
1031
        return $top_v;
1032
}
1033 25 alirezamon
 
1034 38 alirezamon
sub save_the_sof_file{
1035 28 alirezamon
 
1036 38 alirezamon
        my $self=shift;
1037
        my $name=$self->object_get_attribute ('fpga_param',"SAVE_NAME");
1038
        my $sofdir="$ENV{PRONOC_WORK}/emulate/sof";
1039
        my $fpga_board=$self->object_get_attribute('compile','board');
1040
        my $target_dir  = "$ENV{'PRONOC_WORK'}/emulate/$name";
1041 28 alirezamon
 
1042 38 alirezamon
        mkpath("$sofdir/$fpga_board/",1,01777);
1043
        open(FILE,  ">$sofdir/$fpga_board/$name.inf") || die "Can not open: $!";
1044
        print FILE perl_file_header("$name.inf");
1045
        my %pp;
1046
        $pp{'noc_param'}= $self->{'noc_param'};
1047
        $pp{'fpga_param'}= $self->{'fpga_param'};
1048
        print FILE Data::Dumper->Dump([\%pp],["emulate_info"]);
1049
        close(FILE) || die "Error closing file: $!";
1050 28 alirezamon
 
1051
 
1052 38 alirezamon
        #find  $dir_name -name \*.sof -exec cp '{}' $sofdir/$fpga_board/$save_name.sof" 
1053
        my @files = File::Find::Rule->file()
1054
                 ->name( '*.sof' )
1055
                 ->in( "$target_dir" );
1056
        copy($files[0],"$sofdir/$fpga_board/$name.sof") or do {
1057
                my $err= "Error copy($files[0] , $sofdir/$fpga_board/$name.sof";
1058
                print "$err\n";
1059 48 alirezamon
                message_dialog($err,'error');
1060 38 alirezamon
                return;
1061
        };
1062
        #copy the board's programming and jtag interface files
1063
 
1064
        my $board_name=$self->object_get_attribute('compile','board');
1065
        #copy board jtag_intfc.sh file 
1066 48 alirezamon
        copy("../boards/Altera/$board_name/jtag_intfc.sh","$sofdir/$fpga_board/jtag_intfc.sh");
1067 38 alirezamon
        #print "../boards/$board_name/jtag_intfc.sh","$sofdir/$fpga_board/jtag_intfc.sh\n";
1068
        #add argument run to jtag_interface file 
1069
        my $runarg='
1070 28 alirezamon
 
1071 38 alirezamon
if [ $# -ne 0 ]
1072
  then
1073
    $JTAG_INTFC $1
1074
fi
1075
';
1076
        append_text_to_file ("$sofdir/$fpga_board/jtag_intfc.sh",$runarg );
1077
 
1078
 
1079
 
1080 28 alirezamon
 
1081 38 alirezamon
        #copy board program_device.sh file 
1082 48 alirezamon
        copy("../boards/Altera/$board_name/program_device.sh","$sofdir/$fpga_board/program_device.sh");
1083 38 alirezamon
 
1084
 
1085 28 alirezamon
 
1086 38 alirezamon
        message_dialog("sof file has been generated successfully");
1087
}
1088 28 alirezamon
 
1089
 
1090 25 alirezamon
 
1091
##########
1092
#       save_emulation
1093
##########
1094
sub save_emulation {
1095
        my ($emulate)=@_;
1096
        # read emulation name
1097
        my $name=$emulate->object_get_attribute ("emulate_name",undef);
1098
        my $s= (!defined $name)? 0 : (length($name)==0)? 0 :1;
1099
        if ($s == 0){
1100
                message_dialog("Please set emulation name!");
1101
                return 0;
1102
        }
1103
        # Write object file
1104
        open(FILE,  ">lib/emulate/$name.EML") || die "Can not open: $!";
1105
        print FILE perl_file_header("$name.EML");
1106 38 alirezamon
        print FILE Data::Dumper->Dump([\%$emulate],["emulate"]);
1107 25 alirezamon
        close(FILE) || die "Error closing file: $!";
1108
        message_dialog("Emulation saved as lib/emulate/$name.EML!");
1109
        return 1;
1110
}
1111
 
1112
#############
1113
#       load_emulation
1114
############
1115
 
1116
sub load_emulation {
1117
        my ($emulate,$info)=@_;
1118
        my $file;
1119 48 alirezamon
        my $dialog =  gen_file_dialog (undef, 'EML');
1120 25 alirezamon
        my $dir = Cwd::getcwd();
1121 48 alirezamon
        $dialog->set_current_folder ("$dir/lib/emulate");
1122 25 alirezamon
 
1123
        if ( "ok" eq $dialog->run ) {
1124
                $file = $dialog->get_filename;
1125
                my ($name,$path,$suffix) = fileparse("$file",qr"\..[^.]*$");
1126
                if($suffix eq '.EML'){
1127 43 alirezamon
 
1128
                        my ($pp,$r,$err) = regen_object($file);
1129
                        if ($r ){
1130
                                add_colored_info($info,"**Error reading  $file file: $err\n",'red');
1131 25 alirezamon
                                 $dialog->destroy;
1132
                                return;
1133
                        }
1134
 
1135
                        clone_obj($emulate,$pp);
1136
                        #message_dialog("done!");                               
1137
                }
1138
     }
1139
     $dialog->destroy;
1140
}
1141
 
1142 38 alirezamon
 
1143
 
1144
sub update_result {
1145
        my ($self,$sample,$name,$x,$y,$z)=@_;
1146
        my $ref=$self->object_get_attribute ($sample,$name);
1147
        my %results;
1148
        %results= %{$ref} if(defined $ref);
1149
        if(!defined $z) {$results{$x}=$y;}
1150
        else {$results{$x}{$y}=$z;}
1151
        $self->object_add_attribute ($sample,$name,\%results);
1152
}
1153
 
1154
 
1155
 
1156 48 alirezamon
 
1157 43 alirezamon
sub gen_sim_parameter_h {
1158
        my ($param_h,$includ_h,$ne,$nr,$router_p,$fifow)=@_;
1159
 
1160
        $param_h =~ s/\d\'b/ /g;
1161
        my $text=  "
1162
#ifndef     INCLUDE_PARAM
1163
        #define   INCLUDE_PARAM \n \n
1164 38 alirezamon
 
1165 43 alirezamon
        $param_h
1166
 
1167
        #define NE  $ne
1168
        #define NR  $nr
1169
        #define ROUTER_P_NUM $router_p
1170 48 alirezamon
 
1171
        extern Vtraffic         *traffic[NE];
1172
        extern Vpck_inj     *pck_inj[NE];
1173
        extern int reset,clk;
1174 43 alirezamon
 
1175
        //simulation parameter
1176
        #define MAX_RATIO   ".MAX_RATIO."
1177
        #define AVG_LATENCY_METRIC \"HEAD_2_TAIL\"
1178
        #define TIMSTMP_FIFO_NUM   $fifow
1179
 
1180
        $includ_h
1181
\n \n \#endif" ;
1182
        return $text;
1183
}
1184 38 alirezamon
 
1185 48 alirezamon
sub gen_noc_sim_param {
1186
        my $simulate=shift;
1187 43 alirezamon
        my $fifow=$simulate->object_get_attribute('fpga_param','TIMSTMP_FIFO_NUM');
1188
 
1189 48 alirezamon
        $fifow= '16' if (!defined $fifow);
1190
 
1191
        return "
1192 43 alirezamon
        //simulation parameter
1193 48 alirezamon
        //localparam MAX_RATIO = ".MAX_RATIO.";
1194 43 alirezamon
        localparam MAX_PCK_NUM = ".MAX_SIM_CLKs.";
1195
        localparam MAX_PCK_SIZ = ".MAX_PCK_SIZ.";
1196
        localparam MAX_SIM_CLKs=  ".MAX_SIM_CLKs.";
1197
        localparam TIMSTMP_FIFO_NUM = $fifow;
1198 48 alirezamon
        ";
1199
 
1200
}
1201
 
1202
 
1203
sub gen_noc_localparam_v_file {
1204
        my ($self,$dst_path,$sample)=@_;
1205
        # generate NoC parameter file
1206
        my ($noc_param,$pass_param)=gen_noc_param_v($self,$sample);
1207
        my $header=autogen_warning().get_license_header("noc_localparam.v");
1208
        open(FILE,  ">${dst_path}/noc_localparam.v") || die "Can not open: $!";
1209
        my $sim =gen_noc_sim_param($self);
1210
        print FILE  "$header
1211
 
1212
        \`ifdef   NOC_LOCAL_PARAM \n \n
1213
        $noc_param
1214
 
1215
        $sim
1216
 
1217
\n \n \`endif";
1218 43 alirezamon
        close FILE;
1219
}
1220
 
1221
 
1222 25 alirezamon
############
1223
#    main
1224
############
1225
sub emulator_main{
1226 38 alirezamon
 
1227 25 alirezamon
        add_color_to_gd();
1228
        my $emulate= emulator->emulator_new();
1229
        set_gui_status($emulate,"ideal",0);
1230 38 alirezamon
        $emulate->object_add_attribute('compile','compilers',"QuartusII");
1231 48 alirezamon
        my $left_table = def_table (25, 6, FALSE);
1232
        my $right_table =def_table (25, 6, FALSE);
1233
        my $main_table = def_table (25, 12, FALSE);
1234
        my ($infobox,$info)= create_txview();
1235 43 alirezamon
 
1236 48 alirezamon
 
1237 38 alirezamon
 
1238
        my @pages =(
1239
                {page_name=>" Avg. throughput/latency", page_num=>0},
1240
                {page_name=>" Injected Packet ", page_num=>1},
1241
                {page_name=>" Worst-Case Delay ",page_num=>2},
1242 48 alirezamon
                {page_name=>" Execution Time ",page_num=>3},
1243 38 alirezamon
        );
1244 25 alirezamon
 
1245 38 alirezamon
        my @charts = (
1246 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},
1247 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},
1248
                { 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},
1249
                { 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},
1250
                { 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},
1251
                { 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},
1252
        );
1253
 
1254 48 alirezamon
        my ($conf_box,$set_win)=process_notebook_gen($emulate,$info,"emulate", undef,@charts);
1255
        my $chart   =gen_multiple_charts ($emulate,\@pages,\@charts,.4);
1256 25 alirezamon
 
1257
        $main_table->set_row_spacings (4);
1258
        $main_table->set_col_spacings (1);
1259 38 alirezamon
 
1260 25 alirezamon
        my $generate = def_image_button('icons/forward.png','Run all');
1261
        my $open = def_image_button('icons/browse.png','Load');
1262 43 alirezamon
        my $diagram  = def_image_button('icons/diagram.png','Diagram');
1263 38 alirezamon
 
1264
        my ($entrybox,$entry) = def_h_labeled_entry('Save as:',undef);
1265 25 alirezamon
 
1266
        $entry->signal_connect( 'changed'=> sub{
1267
                my $name=$entry->get_text();
1268
                $emulate->object_add_attribute ("emulate_name",undef,$name);
1269
        });
1270
        my $save = def_image_button('icons/save.png','Save');
1271
        $entrybox->pack_end($save,   FALSE, FALSE,0);
1272 38 alirezamon
 
1273
        my $image = get_status_gif($emulate);
1274
        my $v1=gen_vpaned($conf_box,.45,$image);
1275
        my $v2=gen_vpaned($infobox,.2,$chart);
1276
        my $h1=gen_hpaned($v1,.4,$v2);
1277 25 alirezamon
 
1278
        #$table->attach_defaults ($event_box, $col, $col+1, $row, $row+1);
1279 38 alirezamon
        $main_table->attach_defaults ($h1  , 0, 12, 0,24);
1280 43 alirezamon
        $main_table->attach ($open,0, 2, 24,25,'expand','shrink',2,2);
1281
#       $main_table->attach ($diagram, 2, 4, 24,25,'expand','shrink',2,2);
1282
        $main_table->attach ($entrybox,4, 7, 24,25,'expand','shrink',2,2);
1283
        $main_table->attach ($generate, 7, 9, 24,25,'expand','shrink',2,2);
1284 32 alirezamon
 
1285 25 alirezamon
        #check soc status every 0.5 second. referesh device table if there is any changes 
1286 38 alirezamon
        Glib::Timeout->add (100, sub{
1287 25 alirezamon
                my ($state,$timeout)= get_gui_status($emulate);
1288
 
1289
                if ($timeout>0){
1290
                        $timeout--;
1291
                        set_gui_status($emulate,$state,$timeout);
1292 38 alirezamon
                        return TRUE;
1293 25 alirezamon
                }
1294 38 alirezamon
                if($state eq "ideal"){
1295
                        return TRUE;
1296
 
1297
                }
1298
 
1299 48 alirezamon
 
1300 38 alirezamon
                #refresh GUI
1301
                my $name=$emulate->object_get_attribute ("emulate_name",undef);
1302
                $entry->set_text($name) if(defined $name);
1303
                $conf_box->destroy();
1304
                $chart->destroy();
1305
                $image->destroy();
1306
                $image = get_status_gif($emulate);
1307 48 alirezamon
                ($conf_box,$set_win)=process_notebook_gen($emulate,$info,"emulate",$set_win, @charts);
1308
                $chart   =gen_multiple_charts  ($emulate,\@pages,\@charts,.4);
1309 38 alirezamon
                $v1 -> pack1($conf_box, TRUE, TRUE);
1310
                $v1 -> pack2($image, TRUE, TRUE);
1311
                $v2 -> pack2($chart, TRUE, TRUE);
1312
                $conf_box->show_all();
1313
                $main_table->show_all();
1314
                set_gui_status($emulate,"ideal",0);
1315
 
1316 25 alirezamon
                return TRUE;
1317
 
1318
        } );
1319 43 alirezamon
 
1320
         $diagram-> signal_connect("clicked" => sub{
1321
        show_topology_diagram ($emulate);
1322
    });
1323 25 alirezamon
 
1324
        $generate-> signal_connect("clicked" => sub{
1325 38 alirezamon
                my @samples =$emulate->object_get_attribute_order("samples");
1326
                foreach my $sample (@samples){
1327
                        $emulate->object_add_attribute ($sample,"status","run");
1328 25 alirezamon
                }
1329 48 alirezamon
                run_emulator($emulate,$info);
1330 25 alirezamon
        });
1331
 
1332
 
1333
        $open-> signal_connect("clicked" => sub{
1334 48 alirezamon
                load_emulation($emulate,$info);
1335 25 alirezamon
                set_gui_status($emulate,"ref",5);
1336
        });
1337
 
1338
        $save-> signal_connect("clicked" => sub{
1339
                save_emulation($emulate);
1340
                set_gui_status($emulate,"ref",5);
1341
        });
1342
 
1343 48 alirezamon
 
1344 25 alirezamon
 
1345 48 alirezamon
        return add_widget_to_scrolled_win($main_table);
1346 25 alirezamon
}
1347
 
1348
 
1349
 

powered by: WebSVN 2.1.0

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