Line 1... |
Line 1... |
#! /usr/bin/perl -w
|
#! /usr/bin/perl -w
|
use Glib qw/TRUE FALSE/;
|
use constant::boolean;
|
use strict;
|
use strict;
|
use warnings;
|
use warnings;
|
|
|
use FindBin;
|
use FindBin;
|
use lib $FindBin::Bin;
|
use lib $FindBin::Bin;
|
|
|
use Gtk2;
|
|
use Gtk2::Ex::Graph::GD;
|
|
use GD::Graph::Data;
|
use GD::Graph::Data;
|
use emulator;
|
use emulator;
|
use IO::CaptureOutput qw(capture qxx qxy);
|
|
use GD::Graph::colour qw/:colours/;
|
use GD::Graph::colour qw/:colours/;
|
use Proc::Background;
|
|
use Time::HiRes qw( usleep ualarm gettimeofday tv_interval nanosleep clock_gettime clock_getres clock_nanosleep clock stat );
|
|
|
|
use File::Basename;
|
use File::Basename;
|
use File::Path qw/make_path/;
|
use File::Path qw/make_path/;
|
use File::Copy;
|
use File::Copy;
|
use File::Find::Rule;
|
use File::Find::Rule;
|
Line 48... |
Line 44... |
use constant MAX_PCK_SIZ => (2**PCK_SIZw)-1;
|
use constant MAX_PCK_SIZ => (2**PCK_SIZw)-1;
|
use constant MAX_SIM_CLKs=> 1000000000; # simulation end at if clock counter reach this number
|
use constant MAX_SIM_CLKs=> 1000000000; # simulation end at if clock counter reach this number
|
|
|
|
|
use constant MAX_RATIO => 1000;# 0->0 1->0.1 ... 1000->100
|
use constant MAX_RATIO => 1000;# 0->0 1->0.1 ... 1000->100
|
use constant EMULATION_RTLS => "/mpsoc/src_emulate/rtl/ , /mpsoc/src_peripheral/jtag/jtag_wb/ , /mpsoc/src_peripheral/ram/ , /mpsoc/src_noc/ ,";
|
|
use constant EMULATION_TOP => "/mpsoc/src_emulate/emulator_top.v";
|
use constant EMULATION_TOP => "/mpsoc/rtl/src_emulate/emulator_top.v";
|
|
|
|
|
sub get_MAX_PCK_NUM(){MAX_PCK_NUM}
|
sub get_MAX_PCK_NUM(){MAX_PCK_NUM}
|
sub get_MAX_SIM_CLKs(){MAX_SIM_CLKs}
|
sub get_MAX_SIM_CLKs(){MAX_SIM_CLKs}
|
sub get_MAX_PCK_SIZ(){MAX_PCK_SIZ}
|
sub get_MAX_PCK_SIZ(){MAX_PCK_SIZ}
|
|
|
sub check_inserted_ratios {
|
sub check_inserted_ratios {
|
my $str=shift;
|
my $str=shift;
|
my @ratios;
|
my @ratios;
|
|
|
my @chunks=split(',',$str);
|
my @chunks=split(/\s*,\s*/,$str);
|
foreach my $p (@chunks){
|
foreach my $p (@chunks){
|
if($p !~ /^[0-9.:,]+$/){ message_dialog ("$p has invalid character(S)" ); return undef; }
|
if($p !~ /^[0-9.:,]+$/){ message_dialog ("$p has invalid character(S)" ); return undef; }
|
my @range=split(':',$p);
|
my @range=split(':',$p);
|
my $size= scalar @range;
|
my $size= scalar @range;
|
if($size==1){ # its a number
|
if($size==1){ # its a number
|
Line 90... |
Line 86... |
}
|
}
|
|
|
|
|
sub get_injection_ratios{
|
sub get_injection_ratios{
|
my ($emulate,$atrebute1,$atrebute2)=@_;
|
my ($emulate,$atrebute1,$atrebute2)=@_;
|
my $box = Gtk2::HBox->new( FALSE, 0 );
|
my $box =def_hbox(FALSE, 0);
|
my $init=$emulate->object_get_attribute($atrebute1,$atrebute2);
|
my $init=$emulate->object_get_attribute($atrebute1,$atrebute2);
|
my $entry=gen_entry($init);
|
my $entry=gen_entry($init);
|
my $button=def_image_button("icons/right.png",'Check');
|
my $button=def_image_button("icons/right.png",'Check');
|
$button->signal_connect("clicked" => sub {
|
$button->signal_connect("clicked" => sub {
|
my $text= $entry->get_text();
|
my $text= $entry->get_text();
|
Line 144... |
Line 140... |
my $traffics="tornado,transposed 1,transposed 2,bit reverse,bit complement,random,shuffle,bit rotation,neighbor"; #TODO hot spot for emulator
|
my $traffics="tornado,transposed 1,transposed 2,bit reverse,bit complement,random,shuffle,bit rotation,neighbor"; #TODO hot spot for emulator
|
|
|
#search path
|
#search path
|
my $dir = Cwd::getcwd();
|
my $dir = Cwd::getcwd();
|
my $open_in = abs_path("$ENV{PRONOC_WORK}/emulate/sof");
|
my $open_in = abs_path("$ENV{PRONOC_WORK}/emulate/sof");
|
attach_widget_to_table ($table,$row,gen_label_in_left("Search Path:"),gen_button_message ("Select the the Path where the verilator simulation files are located. Different NoC verilated models can be generated using Generate NoC configuration tab.","icons/help.png"),
|
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"),
|
get_dir_in_object ($emulate,$sample,"sof_path",undef,'ref_set_win',1,$open_in)); $row++;
|
get_dir_in_object ($emulate,$sample,"sof_path",undef,'ref_set_win',1,$open_in)); $row++;
|
$open_in = $emulate->object_get_attribute($sample,"sof_path");
|
$open_in = $emulate->object_get_attribute($sample,"sof_path");
|
|
|
|
|
|
|
Line 257... |
Line 253... |
As an example defining 2,3,4:10:2 will result in (2,3,4,6,8,10) injection ratios." ;
|
As an example defining 2,3,4:10:2 will result in (2,3,4,6,8,10) injection ratios." ;
|
my $u=get_injection_ratios ($emulate,$sample,"ratios");
|
my $u=get_injection_ratios ($emulate,$sample,"ratios");
|
|
|
attach_widget_to_table ($table,$row,gen_label_in_left("Injection ratios:"),gen_button_message ($l,"icons/help.png") , $u); $row++;
|
attach_widget_to_table ($table,$row,gen_label_in_left("Injection ratios:"),gen_button_message ($l,"icons/help.png") , $u); $row++;
|
|
|
my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
|
my $scrolled_win = add_widget_to_scrolled_win($table);
|
$scrolled_win->set_policy( "automatic", "automatic" );
|
|
$scrolled_win->add_with_viewport($table);
|
|
|
|
my $ok = def_image_button('icons/select.png','OK');
|
my $ok = def_image_button('icons/select.png','OK');
|
my $mtable = def_table(10, 1, TRUE);
|
my $mtable = def_table(10, 1, TRUE);
|
|
|
$mtable->attach_defaults($scrolled_win,0,1,0,9);
|
$mtable->attach_defaults($scrolled_win,0,1,0,9);
|
$mtable-> attach ($ok , 0, 1, 9, 10,'expand','shrink',2,2);
|
$mtable-> attach ($ok , 0, 1, 9, 10,'expand','shrink',2,2);
|
|
|
$set_win->add ($mtable);
|
add_widget_to_scrolled_win ($mtable,$set_win);
|
$set_win->show_all();
|
$set_win->show_all();
|
|
|
$set_win ->signal_connect (destroy => sub{
|
$set_win ->signal_connect (destroy => sub{
|
|
|
$emulate->object_add_attribute("active_setting",undef,undef);
|
$emulate->object_add_attribute("active_setting",undef,undef);
|
Line 283... |
Line 277... |
#check if sof file has been selected
|
#check if sof file has been selected
|
my $s=get_sof_file_full_addr($emulate,$sample);
|
my $s=get_sof_file_full_addr($emulate,$sample);
|
#check if injection ratios are valid
|
#check if injection ratios are valid
|
my $r=$emulate->object_get_attribute($sample,"ratios");
|
my $r=$emulate->object_get_attribute($sample,"ratios");
|
if(defined $s && defined $r) {
|
if(defined $s && defined $r) {
|
$set_win->destroy;
|
$set_win->hide;
|
#$emulate->object_add_attribute("active_setting",undef,undef);
|
$emulate->object_add_attribute("active_setting",undef,undef);
|
set_gui_status($emulate,"ref",1);
|
set_gui_status($emulate,"ref",1);
|
} else {
|
} else {
|
|
|
if(!defined $s){
|
if(!defined $s){
|
my $m=($mode eq 'simulate') ? "Please select NoC verilated file" : "Please select sof file!";
|
my $m=($mode eq 'simulate') ? "Please select NoC verilated file" : "Please select sof file!";
|
Line 307... |
Line 301... |
#####################
|
#####################
|
# gen_widgets_column
|
# gen_widgets_column
|
###################
|
###################
|
|
|
sub gen_emulation_column {
|
sub gen_emulation_column {
|
my ($emulate,$mode, $row_num,$info,@charts)=@_;
|
my ($emulate,$mode, $row_num,$info,$set_win,@charts)=@_;
|
my $table=def_table($row_num,10,FALSE);
|
my $table=def_table($row_num,10,FALSE);
|
|
if(!defined $set_win){
|
|
$set_win=def_popwin_size(40,80,"NoC configuration setting",'percent');
|
|
$set_win->signal_connect (delete_event => sub {$emulate->object_add_attribute("active_setting",undef,undef); $set_win->hide_on_delete });
|
|
|
my $set_win=def_popwin_size(40,80,"NoC configuration setting",'percent');
|
} else{
|
|
my @childs = $set_win->get_children;
|
|
foreach my $c (@childs){ $c->destroy;}
|
|
}
|
my $scrolled_win = gen_scr_win_with_adjst ($emulate,"emulation_column");
|
my $scrolled_win = gen_scr_win_with_adjst ($emulate,"emulation_column");
|
$scrolled_win->add_with_viewport($table);
|
add_widget_to_scrolled_win($table,$scrolled_win);
|
my $row=0;
|
my $row=0;
|
|
|
#title
|
#title
|
my $title_l =($mode eq "simulate" ) ? "NoC Simulator" : "NoC Emulator";
|
my $title_l =($mode eq "simulate" ) ? "NoC Simulator" : "NoC Emulator";
|
my $title=gen_label_in_center($title_l);
|
my $title=gen_label_in_center($title_l);
|
$table->attach ($title , 0, 10, $row, $row+1,'expand','shrink',2,2); $row++;
|
$table->attach ($title , 0, 10, $row, $row+1,'expand','shrink',2,2); $row++;
|
my $separator = Gtk2::HSeparator->new;
|
add_Hsep_to_table($table,0,10,$row);$row++;
|
$table->attach ($separator , 0, 10 , $row, $row+1,'fill','fill',2,2); $row++;
|
|
|
|
|
|
my @positions=(0,1,2,3,4,5,6,7);
|
|
my $col=0;
|
|
|
|
my @title=("Name","Traffic", " Add/Remove "," Setting ", "Line\'s color", "Clear","Run");
|
my %order;
|
foreach my $t (@title){
|
$order{'+/-'}=0;
|
$table->attach (gen_label_in_center($title[$col]), $positions[$col], $positions[$col+1], $row, $row+1,'expand','shrink',2,2);$col++;
|
$order{'Setting'}=1;
|
|
$order{'Run'}=2;
|
|
$order{'Name'}=3;
|
|
$order{'Color'}=4;
|
|
$order{'Clear'}=5;
|
|
$order{'Traffic'}=6;
|
|
$order{'Done'}=7;
|
|
|
|
foreach my $t (sort keys %order){
|
|
$table->attach (gen_label_in_center($t), $order{$t}, $order{$t}+1, $row, $row+1,'expand','shrink',2,2);
|
}
|
}
|
|
|
my $traffics="Random,Transposed 1,Transposed 2,Tornado";
|
my $traffics="Random,Transposed 1,Transposed 2,Tornado";
|
|
|
$col=0;
|
|
$row++;
|
$row++;
|
@positions=(0,2,3,4,5,6,7,8);
|
|
|
|
|
|
#my $i=0;
|
#my $i=0;
|
my $active=$emulate->object_get_attribute("active_setting",undef);
|
my $active=$emulate->object_get_attribute("active_setting",undef);
|
my @samples;
|
my @samples;
|
@samples =$emulate->object_get_attribute_order("samples");
|
@samples =$emulate->object_get_attribute_order("samples");
|
|
|
|
|
|
|
foreach my $ss (@samples){
|
foreach my $ss (@samples){
|
|
|
$col=0;
|
|
my $sample=$ss;
|
my $sample=$ss;
|
#my $sample="sample$i";
|
#my $sample="sample$i";
|
#my $n=$i;
|
#my $n=$i;
|
|
|
my $name=$emulate->object_get_attribute($sample,"line_name");
|
my $name=$emulate->object_get_attribute($sample,"line_name");
|
Line 378... |
Line 387... |
my ($topology, $T1, $T2, $T3, $V, $Fpay) = get_sample_emulation_param($emulate,$sample);
|
my ($topology, $T1, $T2, $T3, $V, $Fpay) = get_sample_emulation_param($emulate,$sample);
|
$emulate->object_add_attribute('noc_param','T1',$T1);
|
$emulate->object_add_attribute('noc_param','T1',$T1);
|
$emulate->object_add_attribute('noc_param','T2',$T2);
|
$emulate->object_add_attribute('noc_param','T2',$T2);
|
$emulate->object_add_attribute('noc_param','T3',$T3);
|
$emulate->object_add_attribute('noc_param','T3',$T3);
|
$emulate->object_add_attribute('noc_param','TOPOLOGY',$topology);
|
$emulate->object_add_attribute('noc_param','TOPOLOGY',$topology);
|
my $pattern=get_synthetic_traffic_pattern($emulate, $sample);
|
my $pattern="";
|
|
my $traffictype=$emulate->object_get_attribute($sample,"TRAFFIC_TYPE");
|
|
$pattern=get_synthetic_traffic_pattern($emulate, $sample) if($traffictype eq "Synthetic");
|
|
$pattern=" Custom traffic based on input file. " if($traffictype eq "Task-graph");
|
|
|
my $window = def_popwin_size(40,40,"Traffic pattern",'percent');
|
my $window = def_popwin_size(40,40,"Traffic pattern",'percent');
|
my ($outbox,$tview)= create_text();
|
my ($outbox,$tview)= create_txview();
|
show_info(\$tview,"$pattern");
|
show_info($tview,"$pattern");
|
$window->add ($outbox);
|
$window->add ($outbox);
|
$window->show_all();
|
$window->show_all();
|
|
|
});
|
});
|
|
|
|
|
$table->attach ($l, $positions[$col], $positions[$col]+1, $row, $row+1,'expand','shrink',2,2);
|
$table->attach ($l, $order{'Name'}, $order{'Name'}+1, $row, $row+1,'expand','shrink',2,2);
|
$table->attach ($traffic, $positions[$col]+1, $positions[$col+1], $row, $row+1,'expand','shrink',2,2);
|
$table->attach ($traffic, $order{'Traffic'}, $order{'Traffic'}+1, $row, $row+1,'expand','shrink',2,2);
|
$col++;
|
|
|
|
} else {
|
} else {
|
$l=gen_label_in_left("Define NoC configuration");
|
$l=gen_label_in_left("Define NoC configuration");
|
$l->set_markup("<span foreground= 'red' ><b>Define NoC configuration</b></span>");
|
$l->set_markup("<span foreground= 'red' ><b>Define NoC configuration</b></span>");
|
$table->attach ($l, $positions[$col], $positions[$col+1], $row, $row+1,'expand','shrink',2,2);$col++;
|
$table->attach ($l, $order{'Name'}, $order{'Name'}+1, $row, $row+1,'expand','shrink',2,2);
|
}
|
}
|
#my $box=def_pack_hbox(FALSE,0,(gen_label_in_left("$i- "),$l,$set));
|
|
|
|
|
|
#remove
|
#remove
|
my $remove=def_image_button("icons/cancel.png");
|
my $remove=def_image_button("icons/cancel.png");
|
$table->attach ($remove, $positions[$col], $positions[$col+1], $row, $row+1,'expand','shrink',2,2);$col++;
|
$table->attach ($remove,$order{'+/-'},$order{'+/-'}+1, $row, $row+1,'expand','shrink',2,2);
|
$remove->signal_connect("clicked"=> sub{
|
$remove->signal_connect("clicked"=> sub{
|
$emulate->object_delete_attribute_order("samples",$sample);
|
$emulate->object_delete_attribute_order("samples",$sample);
|
set_gui_status($emulate,"ref",2);
|
set_gui_status($emulate,"ref",2);
|
});
|
});
|
|
|
#setting
|
#setting
|
my $set=def_image_button("icons/setting.png");
|
my $set=def_image_button("icons/setting.png");
|
$table->attach ($set, $positions[$col], $positions[$col+1], $row, $row+1,'expand','shrink',2,2);$col++;
|
$table->attach ($set, $order{'Setting'}, $order{'Setting'}+1, $row, $row+1,'expand','shrink',2,2);
|
|
|
|
|
if(defined $active){#The setting windows ask for refershing so open it again
|
if(defined $active){#The setting windows ask for refershing so open it again
|
get_noc_configuration($emulate,$mode,$sample,$set_win) if ($active eq $sample);
|
get_noc_configuration($emulate,$mode,$sample,$set_win) if ($active eq $sample);
|
}
|
}
|
Line 432... |
Line 444... |
if(!defined $color_num){
|
if(!defined $color_num){
|
$color_num = (scalar @samples) +1;
|
$color_num = (scalar @samples) +1;
|
$emulate->object_add_attribute($sample,"color",$color_num);
|
$emulate->object_add_attribute($sample,"color",$color_num);
|
}
|
}
|
my $color=def_colored_button(" ",$color_num);
|
my $color=def_colored_button(" ",$color_num);
|
$table->attach ($color, $positions[$col], $positions[$col+1], $row, $row+1,'expand','shrink',2,2);$col++;
|
$table->attach ($color, $order{'Color'}, $order{'Color'}+1, $row, $row+1,'fill','fill',2,2);
|
|
|
|
|
|
|
$color->signal_connect("clicked"=> sub{
|
$color->signal_connect("clicked"=> sub{
|
get_color_window($emulate,$sample,"color");
|
get_color_window($emulate,$sample,"color");
|
});
|
});
|
|
|
Line 451... |
Line 461... |
#print "\$emulate->object_add_attribute ($sample,$chart->{result_name}_result,undef);";
|
#print "\$emulate->object_add_attribute ($sample,$chart->{result_name}_result,undef);";
|
|
|
}
|
}
|
set_gui_status($emulate,"ref",2);
|
set_gui_status($emulate,"ref",2);
|
});
|
});
|
$table->attach ($clear, $positions[$col], $positions[$col+1], $row, $row+1,'expand','shrink',2,2);$col++;
|
$table->attach ($clear, $order{'Clear'}, $order{'Clear'}+1, $row, $row+1,'expand','shrink',2,2);
|
#run/pause
|
#run/pause
|
my $run = def_image_button('icons/run.png',undef);
|
my $run = def_image_button('icons/run.png',undef);
|
$table->attach ($run, $positions[$col], $positions[$col+1], $row, $row+1,'expand','shrink',2,2);$col++;
|
$table->attach ($run, $order{'Run'}, $order{'Run'}+1, $row, $row+1,'expand','shrink',2,2);
|
$run->signal_connect("clicked"=> sub{
|
$run->signal_connect("clicked"=> sub{
|
$emulate->object_add_attribute ($sample,"status","run");
|
$emulate->object_add_attribute ($sample,"status","run");
|
#start the emulator if it is not running
|
#start the emulator if it is not running
|
my $status= $emulate->object_get_attribute('status',undef);
|
my $status= $emulate->object_get_attribute('status',undef);
|
if($status ne 'run'){
|
if($status ne 'run'){
|
Line 469... |
Line 479... |
}
|
}
|
|
|
});
|
});
|
|
|
my $image = gen_noc_status_image($emulate,$sample);
|
my $image = gen_noc_status_image($emulate,$sample);
|
|
$table->attach ($image, $order{'Done'},$order{'Done'}+1, $row, $row+1,'expand','shrink',2,2);
|
$table->attach ($image, $positions[$col], $positions[$col+1], $row, $row+1,'expand','shrink',2,2);
|
|
|
|
|
|
$row++;
|
$row++;
|
|
|
}
|
}
|
# add new simulation
|
# add new simulation
|
my $add=def_image_button("icons/plus.png", );
|
|
$table->attach ($add, $positions[1], $positions[2], $row, $row+1,'expand','shrink',2,2);
|
my $add=def_image_button("icons/plus.png",' A_dd ',FALSE,1);
|
|
$table->attach ($add, $order{'+/-'},$order{'+/-'}+2, $row, $row+1,'expand','shrink',2,2);
|
|
|
|
|
|
|
$add->signal_connect("clicked"=> sub{
|
$add->signal_connect("clicked"=> sub{
|
my $n=$emulate->object_get_attribute("id",undef);
|
my $n=$emulate->object_get_attribute("id",undef);
|
$n=0 if (!defined $n);
|
$n=0 if (!defined $n);
|
my $sample="sample$n";
|
my $sample="sample$n";
|
Line 494... |
Line 505... |
set_gui_status($emulate,"ref",1);
|
set_gui_status($emulate,"ref",1);
|
|
|
});
|
});
|
|
|
|
|
|
|
return ($scrolled_win,$set_win);
|
return ($scrolled_win,$set_win);
|
}
|
}
|
|
|
|
|
|
|
Line 533... |
Line 545... |
my $pp= do $sof_info ;
|
my $pp= do $sof_info ;
|
|
|
my $p=$pp->{'noc_param'};
|
my $p=$pp->{'noc_param'};
|
|
|
$status=0 if $@;
|
$status=0 if $@;
|
message_dialog("Error reading: $@") if $@;
|
message_dialog("Error reading: $@",'error') if $@;
|
if ($status==1){
|
if ($status==1){
|
$emulate->object_add_attribute ($sample,"noc_info",$p) ;
|
$emulate->object_add_attribute ($sample,"noc_info",$p) ;
|
|
|
|
|
}
|
}
|
Line 547... |
Line 559... |
return $status;
|
return $status;
|
}
|
}
|
|
|
|
|
|
|
##########
|
|
# run external commands
|
|
##########
|
|
|
|
sub run_cmd_in_back_ground
|
|
{
|
|
my $command = shift;
|
|
#print "\t$command\n";
|
|
|
|
### Start running the Background Job:
|
|
my $proc = Proc::Background->new($command);
|
|
my $PID = $proc->pid;
|
|
my $start_time = $proc->start_time;
|
|
my $alive = $proc->alive;
|
|
|
|
### While $alive is NOT '0', then keep checking till it is...
|
|
# *When $alive is '0', it has finished executing.
|
|
while($alive ne 0)
|
|
{
|
|
$alive = $proc->alive;
|
|
|
|
# This while loop will cause Gtk2 to conti processing events, if
|
|
# there are events pending... *which there are...
|
|
while (Gtk2->events_pending) {
|
|
Gtk2->main_iteration;
|
|
}
|
|
Gtk2::Gdk->flush;
|
|
|
|
usleep(1000);
|
|
}
|
|
|
|
my $end_time = $proc->end_time;
|
|
# print "*Command Completed at $end_time, with PID = $PID\n\n";
|
|
|
|
# Since the while loop has exited, the BG job has finished running:
|
|
# so close the pop-up window...
|
|
# $popup_window->hide;
|
|
|
|
# Get the RETCODE from the Background Job using the 'wait' method
|
|
my $retcode = $proc->wait;
|
|
$retcode /= 256;
|
|
|
|
print "\t*RETCODE == $retcode\n\n";
|
|
Gtk2::Gdk->flush;
|
|
### Check if the RETCODE returned with an Error:
|
|
if ($retcode ne 0) {
|
|
print "Error: The Background Job ($command) returned with an Error...!\n";
|
|
return 1;
|
|
} else {
|
|
#print "Success: The Background Job Completed Successfully...!\n";
|
|
return 0;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sub run_cmd_in_back_ground_get_stdout
|
|
{
|
|
my $cmd=shift;
|
|
my $exit;
|
|
my ($stdout, $stderr);
|
|
capture { $exit=run_cmd_in_back_ground($cmd) } \$stdout, \$stderr;
|
|
return ($stdout,$exit,$stderr);
|
|
|
|
}
|
|
|
|
|
|
#############
|
#############
|
# images
|
# images
|
##########
|
##########
|
Line 630... |
Line 579... |
my($width,$hight)=max_win_size();
|
my($width,$hight)=max_win_size();
|
my $image=($width>=1600)? "icons/hamster_l.gif":
|
my $image=($width>=1600)? "icons/hamster_l.gif":
|
($width>=1200)? "icons/hamster_m.gif": "icons/hamster_s.gif";
|
($width>=1200)? "icons/hamster_m.gif": "icons/hamster_s.gif";
|
|
|
return show_gif ($image);
|
return show_gif ($image);
|
} elsif ($status eq 'programer_failed') {
|
} elsif ($status eq 'programmer_failed') {
|
return show_gif ("icons/Error.png");
|
return show_gif ("icons/Error.png");
|
}
|
}
|
|
|
}
|
}
|
|
|
Line 644... |
Line 593... |
sub gen_noc_status_image {
|
sub gen_noc_status_image {
|
my ($emulate,$sample)=@_;
|
my ($emulate,$sample)=@_;
|
my $status= $emulate->object_get_attribute ($sample,"status");
|
my $status= $emulate->object_get_attribute ($sample,"status");
|
$status='' if(!defined $status);
|
$status='' if(!defined $status);
|
my $image;
|
my $image;
|
my $vbox = Gtk2::HBox->new (TRUE,1);
|
my $box = def_hbox(TRUE,1);
|
$image = Gtk2::Image->new_from_file ("icons/load.gif") if($status eq "run");
|
$image = new_image_from_file ("icons/load.gif") if($status eq "run");
|
$image = def_icon("icons/button_ok.png") if($status eq "done");
|
$image = def_icon("icons/button_ok.png") if($status eq "done");
|
$image = def_icon("icons/warning.png") if($status eq "failed");
|
$image = def_icon("icons/warning.png") if($status eq "failed");
|
#$image_file = "icons/load.gif" if($status eq "run");
|
|
|
|
if (defined $image) {
|
if (defined $image) {
|
my $align = Gtk2::Alignment->new (0.5, 0.5, 0, 0);
|
$box->pack_start (add_frame_to_image($image), FALSE, FALSE, 0);
|
my $frame = Gtk2::Frame->new;
|
|
$frame->set_shadow_type ('in');
|
|
# Animation
|
|
$frame->add ($image);
|
|
$align->add ($frame);
|
|
$vbox->pack_start ($align, FALSE, FALSE, 0);
|
|
}
|
}
|
return $vbox;
|
return $box;
|
|
|
}
|
}
|
|
|
|
|
############
|
############
|
Line 683... |
Line 625... |
# my ($stdout,$exit)=run_cmd_in_back_ground_get_stdout("$cmd");
|
# my ($stdout,$exit)=run_cmd_in_back_ground_get_stdout("$cmd");
|
# my @matches= ($stdout =~ /USB-Blaster.*/g);
|
# my @matches= ($stdout =~ /USB-Blaster.*/g);
|
# my $usb_blaster=$matches[0];
|
# my $usb_blaster=$matches[0];
|
# if (!defined $usb_blaster){
|
# if (!defined $usb_blaster){
|
# add_info($info, "jtagconfig could not find any USB blaster cable: $stdout \n");
|
# add_info($info, "jtagconfig could not find any USB blaster cable: $stdout \n");
|
# $emulate->object_add_attribute('status',undef,'programer_failed');
|
# $emulate->object_add_attribute('status',undef,'programmer_failed');
|
# set_gui_status($emulate,"ref",2);
|
# set_gui_status($emulate,"ref",2);
|
# #/***/
|
# #/***/
|
# return;
|
# return;
|
# }else{
|
# }else{
|
# add_info($info, "find $usb_blaster\n");
|
# add_info($info, "find $usb_blaster\n");
|
Line 701... |
Line 643... |
my @ratios=@{check_inserted_ratios($r)};
|
my @ratios=@{check_inserted_ratios($r)};
|
#$emulate->object_add_attribute ("sample$i","status","run");
|
#$emulate->object_add_attribute ("sample$i","status","run");
|
my $sof=get_sof_file_full_addr($emulate,$sample);
|
my $sof=get_sof_file_full_addr($emulate,$sample);
|
add_info($info, "Programe FPGA device using $sof.sof\n");
|
add_info($info, "Programe FPGA device using $sof.sof\n");
|
my ($name,$path,$suffix) = fileparse("$sof",qr"\..[^.]*$");
|
my ($name,$path,$suffix) = fileparse("$sof",qr"\..[^.]*$");
|
my $programer="$path/program_device.sh";
|
my $programmer="$path/program_device.sh";
|
my $jtag_intfc="$path/jtag_intfc.sh";
|
my $jtag_intfc="$path/jtag_intfc.sh";
|
if((-f $programer)==0){
|
if((-f $programmer)==0){
|
add_colored_info ($info, " Error: file \"$programer\" dose not exist. \n",'red');
|
add_colored_info ($info, " Error: file \"$programmer\" dose not exist. \n",'red');
|
$emulate->object_add_attribute('status',undef,'programer_failed');
|
$emulate->object_add_attribute('status',undef,'programmer_failed');
|
$emulate->object_add_attribute ($sample,"status","failed");
|
$emulate->object_add_attribute ($sample,"status","failed");
|
set_gui_status($emulate,"ref",2);
|
set_gui_status($emulate,"ref",2);
|
last;
|
last;
|
}
|
}
|
if((-f $jtag_intfc)==0){
|
if((-f $jtag_intfc)==0){
|
add_colored_info ($info, " Error: file \"$jtag_intfc\" dose not exist. \n",'red');
|
add_colored_info ($info, " Error: file \"$jtag_intfc\" dose not exist. \n",'red');
|
$emulate->object_add_attribute('status',undef,'programer_failed');
|
$emulate->object_add_attribute('status',undef,'programmer_failed');
|
$emulate->object_add_attribute ($sample,"status","failed");
|
$emulate->object_add_attribute ($sample,"status","failed");
|
set_gui_status($emulate,"ref",2);
|
set_gui_status($emulate,"ref",2);
|
last;
|
last;
|
}
|
}
|
my $cmd = "bash $programer $sof.sof";
|
my $cmd = "bash $programmer $sof.sof";
|
|
|
|
|
#my $Quartus_bin= $ENV{QUARTUS_BIN};
|
#my $Quartus_bin= $ENV{QUARTUS_BIN};
|
|
|
|
|
Line 730... |
Line 672... |
#my $output = `$cmd 2>&1 1>/dev/null`; # either with backticks
|
#my $output = `$cmd 2>&1 1>/dev/null`; # either with backticks
|
|
|
#/***/
|
#/***/
|
my ($stdout,$exit)=run_cmd_in_back_ground_get_stdout("$cmd");
|
my ($stdout,$exit)=run_cmd_in_back_ground_get_stdout("$cmd");
|
if($exit){#programming FPGA board has failed
|
if($exit){#programming FPGA board has failed
|
$emulate->object_add_attribute('status',undef,'programer_failed');
|
$emulate->object_add_attribute('status',undef,'programmer_failed');
|
add_colored_info($info, "$stdout\n",'red');
|
add_colored_info($info, "$stdout\n",'red');
|
$emulate->object_add_attribute ($sample,"status","failed");
|
$emulate->object_add_attribute ($sample,"status","failed");
|
set_gui_status($emulate,"ref",2);
|
set_gui_status($emulate,"ref",2);
|
next;
|
next;
|
}
|
}
|
Line 776... |
Line 718... |
# process_notebook_gen
|
# process_notebook_gen
|
##############
|
##############
|
|
|
|
|
sub process_notebook_gen{
|
sub process_notebook_gen{
|
my ($emulate,$info,$mode,@charts)=@_;
|
my ($emulate,$info,$mode,$set_win,@charts)=@_;
|
my $notebook = Gtk2::Notebook->new;
|
my $notebook = gen_notebook();
|
$notebook->set_tab_pos ('left');
|
$notebook->set_tab_pos ('left');
|
$notebook->set_scrollable(TRUE);
|
$notebook->set_scrollable(TRUE);
|
$notebook->can_focus(FALSE);
|
#$notebook->can_focus(FALSE);
|
|
|
|
|
my ($page1,$set_win)=gen_emulation_column($emulate, $mode,10,$info,@charts);
|
my $page1;
|
$notebook->append_page ($page1,Gtk2::Label->new_with_mnemonic (" _Run emulator ")) if($mode eq "emulate");
|
($page1,$set_win)=gen_emulation_column($emulate, $mode,10,$info,$set_win,@charts);
|
$notebook->append_page ($page1,Gtk2::Label->new_with_mnemonic (" _Run simulator ")) if($mode eq "simulate");
|
$notebook->append_page ($page1,gen_label_with_mnemonic (" _Run emulator ")) if($mode eq "emulate");
|
|
$notebook->append_page ($page1,gen_label_with_mnemonic (" _Run simulator ")) if($mode eq "simulate");
|
|
|
|
|
my $page2=get_noc_setting_gui ($emulate,$info,$mode);
|
my $page2=get_noc_setting_gui ($emulate,$info,$mode);
|
my $tt=($mode eq "emulate")? " _Generate NoC \nEmulation Model" : " _Generate NoC \nSimulation Model" ;
|
my $tt=($mode eq "emulate")? " _Generate NoC \nEmulation Model" : " _Generate NoC \nSimulation Model" ;
|
$notebook->append_page ($page2,Gtk2::Label->new_with_mnemonic ($tt));
|
$notebook->append_page ($page2,gen_label_with_mnemonic ($tt));
|
|
|
|
|
#if($mode eq "simulate"){
|
|
#my $page3=gen_custom_traffic ($emulate,$info,$mode);
|
|
#$notebook->append_page ($page3,Gtk2::Label->new_with_mnemonic ("_Generate Custom\n Traffic Pattern"));
|
|
#}
|
|
|
|
my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
|
my $scrolled_win = add_widget_to_scrolled_win($notebook);
|
$scrolled_win->set_policy( "automatic", "automatic" );
|
|
$scrolled_win->add_with_viewport($notebook);
|
|
$scrolled_win->show_all;
|
$scrolled_win->show_all;
|
my $page_num=$emulate->object_get_attribute ("process_notebook","currentpage");
|
my $page_num=$emulate->object_get_attribute ("process_notebook","currentpage");
|
$notebook->set_current_page ($page_num) if(defined $page_num);
|
$notebook->set_current_page ($page_num) if(defined $page_num);
|
$notebook->signal_connect( 'switch-page'=> sub{
|
$notebook->signal_connect( 'switch-page'=> sub{
|
$emulate->object_add_attribute ("process_notebook","currentpage",$_[2]); #save the new pagenumber
|
$emulate->object_add_attribute ("process_notebook","currentpage",$_[2]); #save the new pagenumber
|
Line 817... |
Line 754... |
|
|
sub get_noc_setting_gui {
|
sub get_noc_setting_gui {
|
my ($emulate,$info_text,$mode)=@_;
|
my ($emulate,$info_text,$mode)=@_;
|
my $table=def_table(20,10,FALSE);# my ($row,$col,$homogeneous)=@_;
|
my $table=def_table(20,10,FALSE);# my ($row,$col,$homogeneous)=@_;
|
|
|
|
|
my $scrolled_win = gen_scr_win_with_adjst ($emulate,"noc_setting_gui");
|
my $scrolled_win = gen_scr_win_with_adjst ($emulate,"noc_setting_gui");
|
$scrolled_win->add_with_viewport($table);
|
add_widget_to_scrolled_win($table,$scrolled_win);
|
my $row=noc_config ($emulate,$table);
|
my $row=noc_config ($emulate,$table,$info_text);
|
|
|
my($label,$param,$default,$content,$type,$info);
|
my($label,$param,$default,$content,$type,$info);
|
my @dirs = grep {-d} glob("../boards/*");
|
my @dirs = grep {-d} glob("../boards/Altera/*");
|
my $fpgas;
|
my $fpgas;
|
foreach my $dir (@dirs) {
|
foreach my $dir (@dirs) {
|
my ($name,$path,$suffix) = fileparse("$dir",qr"\..[^.]*$");
|
my ($name,$path,$suffix) = fileparse("$dir",qr"\..[^.]*$");
|
$default=$name;
|
$default=$name;
|
$fpgas= (defined $fpgas)? "$fpgas,$name" : "$name";
|
$fpgas= (defined $fpgas)? "$fpgas,$name" : "$name";
|
Line 844... |
Line 782... |
else {
|
else {
|
@fpgainfo = (
|
@fpgainfo = (
|
{ 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},
|
{ 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},
|
{ label=>'Save as:', param_name=>'SAVE_NAME', type=>"Entry", default_val=>'simulate1', content=>undef, info=>undef, param_parent=>'sim_param', ref_delay=>undef},
|
{ label=>'Save as:', param_name=>'SAVE_NAME', type=>"Entry", default_val=>'simulate1', content=>undef, info=>undef, param_parent=>'sim_param', ref_delay=>undef},
|
{ 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 },
|
{ 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 },
|
|
|
);
|
);
|
}
|
}
|
|
|
my $coltmp=0;
|
my $coltmp=0;
|
foreach my $d (@fpgainfo) {
|
foreach my $d (@fpgainfo) {
|
($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});
|
($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});
|
}
|
}
|
|
|
|
my $maintable=def_table(20,10,FALSE);# my ($row,$col,$homogeneous)=@_;
|
|
|
my $generate = def_image_button('icons/gen.png','Gener_ate',FALSE,1);
|
my $generate = def_image_button('icons/gen.png','Gener_ate',FALSE,1);
|
my $diagram = def_image_button('icons/diagram.png','Diagram');
|
my $diagram = def_image_button('icons/diagram.png','Diagram');
|
$table->attach ($generate, 0,2, $row, $row+1,'expand','shrink',2,2);
|
my $import = def_image_button('icons/import.png','I_mport',FALSE,1);
|
$table->attach ($diagram, 2,4, $row, $row+1,'expand','shrink',2,2);
|
set_tip($import ,"Import NoC configuration from file");
|
|
|
|
$maintable->attach_defaults ($scrolled_win, 0,10, 0, 9);
|
|
$maintable->attach_defaults (gen_Hsep(), 0,10, 8, 9);
|
|
$maintable->attach ($generate, 0,2, 9, 10,'expand','shrink',2,2);
|
|
$maintable->attach ($diagram, 2,4, 9, 10,'expand','shrink',2,2);
|
|
$maintable->attach ($import, 4,6, 9, 10,'expand','shrink',2,2);
|
|
|
|
|
$diagram-> signal_connect("clicked" => sub{
|
$diagram-> signal_connect("clicked" => sub{
|
show_topology_diagram ($emulate);
|
show_topology_diagram ($emulate);
|
});
|
});
|
$generate->signal_connect ('clicked'=> sub{
|
$generate->signal_connect ('clicked'=> sub{
|
generate_sof_file($emulate,$info_text) if($mode eq "emulate");
|
generate_sof_file($emulate,$info_text) if($mode eq "emulate");
|
generate_sim_bin_file($emulate,$info_text) if($mode eq "simulate");
|
generate_sim_bin_file($emulate,$info_text) if($mode eq "simulate");
|
|
|
});
|
});
|
|
|
return $scrolled_win;
|
$import-> signal_connect("clicked" => sub{
|
|
import_noc_info_file($emulate,$mode);
|
|
});
|
|
|
|
$scrolled_win->show_all;
|
|
return $maintable;
|
|
}
|
|
|
|
sub import_noc_info_file{
|
|
my ($self,$mode)=@_;
|
|
my $file;
|
|
my $dialog = gen_file_dialog(undef,'inf');
|
|
|
|
my $open_in = ($mode ne "emulate" ) ? abs_path("$ENV{'PRONOC_WORK'}/simulate") : abs_path("$ENV{'PRONOC_WORK'}/emulate");
|
|
$dialog->set_current_folder ($open_in);
|
|
if ( "ok" eq $dialog->run ) {
|
|
my $status=1;
|
|
$file = $dialog->get_filename;
|
|
my $pp= do $file ;
|
|
my $p=$pp->{'noc_param'};
|
|
$status=0 if $@;
|
|
message_dialog("Error reading: $@") if $@;
|
|
if ($status==1){
|
|
$self->object_add_attribute ("noc_param",undef,$p);
|
|
my ($name,$path,$suffix) = fileparse("$file",qr"\..[^.]*$");
|
|
my $attr1 = ($mode ne "emulate" ) ? 'sim_param' : 'fpga_param';
|
|
$self->object_add_attribute ($attr1,'SAVE_NAME',$name);
|
|
|
|
set_gui_status($self,"ref",1);
|
|
}
|
|
}
|
|
$dialog->destroy;
|
}
|
}
|
|
|
##########
|
##########
|
# generate_sof_file
|
# generate_sof_file
|
##########
|
##########
|
Line 885... |
Line 865... |
message_dialog("Please define the Save as filed!");
|
message_dialog("Please define the Save as filed!");
|
return;
|
return;
|
}
|
}
|
|
|
#copy all noc source codes
|
#copy all noc source codes
|
my @files = split(/\s*,\s*/,EMULATION_RTLS);
|
my @files = (
|
|
'/mpsoc/rtl/src_emulate/rtl/',
|
|
'/mpsoc/rtl/src_peripheral/jtag/jtag_wb/',
|
|
'/mpsoc/rtl/src_peripheral/ram/',
|
|
'/mpsoc/rtl/main_comp.v',
|
|
'/mpsoc/rtl/arbiter.v',
|
|
'/mpsoc/rtl/src_topolgy/',
|
|
'/mpsoc/rtl/src_noc/');
|
|
|
my $dir = Cwd::getcwd();
|
my $dir = Cwd::getcwd();
|
my $project_dir = abs_path("$dir/../../");
|
my $project_dir = abs_path("$dir/../../");
|
my ($stdout,$exit)=run_cmd_in_back_ground_get_stdout("mkdir -p $target_dir/src_verilog" );
|
my ($stdout,$exit)=run_cmd_in_back_ground_get_stdout("mkdir -p $target_dir/src_verilog" );
|
copy_file_and_folders(\@files,$project_dir,"$target_dir/src_verilog/lib/");
|
copy_file_and_folders(\@files,$project_dir,"$target_dir/src_verilog/lib/");
|
|
|
|
|
#generate parameters for emulator_top.v file
|
#generate parameters for emulator_top.v file
|
my ($localparam, $pass_param)=gen_noc_param_v( $self);
|
gen_noc_localparam_v_file($self,"$target_dir/src_verilog/lib/src_noc/");
|
open(FILE, ">$target_dir/src_verilog/noc_parameters.v") || die "Can not open: $!";
|
|
print FILE $localparam;
|
|
close(FILE) || die "Error closing file: $!";
|
|
open(FILE, ">$target_dir/src_verilog/pass_parameters.v") || die "Can not open: $!";
|
|
print FILE $pass_param;
|
|
my $fifow=$self->object_get_attribute('fpga_param','TIMSTMP_FIFO_NUM');
|
|
print FILE ",.TIMSTMP_FIFO_NUM($fifow)\n";
|
|
close(FILE) || die "Error closing file: $!";
|
|
open(FILE, ">$top") || die "Can not open: $!";
|
open(FILE, ">$top") || die "Can not open: $!";
|
print FILE create_emulate_top($self,$name,$top);
|
print FILE create_emulate_top($self,$name,$top);
|
close(FILE) || die "Error closing file: $!";
|
close(FILE) || die "Error closing file: $!";
|
select_compiler($self,$name,$top,$target_dir,\&save_the_sof_file);
|
select_compiler($self,$name,$top,$target_dir,\&save_the_sof_file);
|
|
|
Line 934... |
Line 915... |
PATTERN_VJTAG_INDEX=125,
|
PATTERN_VJTAG_INDEX=125,
|
COUNTER_VJTAG_INDEX=126,
|
COUNTER_VJTAG_INDEX=126,
|
DONE_RESET_VJTAG_INDEX=127;
|
DONE_RESET_VJTAG_INDEX=127;
|
|
|
|
|
//NoC parameters will be defined by user
|
|
`define NOC_PARAM
|
|
`include \"noc_parameters.v\"
|
|
|
|
wire reset_noc, reset_injector, reset_noc_sync, reset_injector_sync, done;
|
wire reset_noc, reset_injector, reset_noc_sync, reset_injector_sync, done;
|
wire jtag_reset_injector, jtag_reset_noc;
|
wire jtag_reset_injector, jtag_reset_noc;
|
wire start_o;
|
wire start_o;
|
wire done_time_limit;
|
wire done_time_limit;
|
Line 981... |
Line 960... |
|
|
//noc emulator
|
//noc emulator
|
|
|
noc_emulator #(
|
noc_emulator #(
|
.STATISTIC_VJTAG_INDEX(STATISTIC_VJTAG_INDEX),
|
.STATISTIC_VJTAG_INDEX(STATISTIC_VJTAG_INDEX),
|
.PATTERN_VJTAG_INDEX(PATTERN_VJTAG_INDEX),
|
.PATTERN_VJTAG_INDEX(PATTERN_VJTAG_INDEX)
|
`include \"pass_parameters.v\"
|
|
|
|
)
|
)
|
noc_emulate_top
|
noc_emulate_top
|
(
|
(
|
.reset(reset_noc_sync),
|
.reset(reset_noc_sync),
|
.jtag_ctrl_reset(reset_injector_sync),
|
.jtag_ctrl_reset(reset_injector_sync),
|
Line 1062... |
Line 1039... |
->name( '*.sof' )
|
->name( '*.sof' )
|
->in( "$target_dir" );
|
->in( "$target_dir" );
|
copy($files[0],"$sofdir/$fpga_board/$name.sof") or do {
|
copy($files[0],"$sofdir/$fpga_board/$name.sof") or do {
|
my $err= "Error copy($files[0] , $sofdir/$fpga_board/$name.sof";
|
my $err= "Error copy($files[0] , $sofdir/$fpga_board/$name.sof";
|
print "$err\n";
|
print "$err\n";
|
message_dialog($err);
|
message_dialog($err,'error');
|
return;
|
return;
|
};
|
};
|
#copy the board's programming and jtag interface files
|
#copy the board's programming and jtag interface files
|
|
|
my $board_name=$self->object_get_attribute('compile','board');
|
my $board_name=$self->object_get_attribute('compile','board');
|
#copy board jtag_intfc.sh file
|
#copy board jtag_intfc.sh file
|
copy("../boards/$board_name/jtag_intfc.sh","$sofdir/$fpga_board/jtag_intfc.sh");
|
copy("../boards/Altera/$board_name/jtag_intfc.sh","$sofdir/$fpga_board/jtag_intfc.sh");
|
#print "../boards/$board_name/jtag_intfc.sh","$sofdir/$fpga_board/jtag_intfc.sh\n";
|
#print "../boards/$board_name/jtag_intfc.sh","$sofdir/$fpga_board/jtag_intfc.sh\n";
|
#add argument run to jtag_interface file
|
#add argument run to jtag_interface file
|
my $runarg='
|
my $runarg='
|
|
|
if [ $# -ne 0 ]
|
if [ $# -ne 0 ]
|
Line 1085... |
Line 1062... |
|
|
|
|
|
|
|
|
#copy board program_device.sh file
|
#copy board program_device.sh file
|
copy("../boards/$board_name/program_device.sh","$sofdir/$fpga_board/program_device.sh");
|
copy("../boards/Altera/$board_name/program_device.sh","$sofdir/$fpga_board/program_device.sh");
|
|
|
|
|
|
|
message_dialog("sof file has been generated successfully");
|
message_dialog("sof file has been generated successfully");
|
}
|
}
|
Line 1122... |
Line 1099... |
############
|
############
|
|
|
sub load_emulation {
|
sub load_emulation {
|
my ($emulate,$info)=@_;
|
my ($emulate,$info)=@_;
|
my $file;
|
my $file;
|
my $dialog = Gtk2::FileChooserDialog->new(
|
my $dialog = gen_file_dialog (undef, 'EML');
|
'Select a File', undef,
|
|
'open',
|
|
'gtk-cancel' => 'cancel',
|
|
'gtk-ok' => 'ok',
|
|
);
|
|
|
|
my $filter = Gtk2::FileFilter->new();
|
|
$filter->set_name("EML");
|
|
$filter->add_pattern("*.EML");
|
|
$dialog->add_filter ($filter);
|
|
my $dir = Cwd::getcwd();
|
my $dir = Cwd::getcwd();
|
$dialog->set_current_folder ("$dir/lib/emulate");
|
$dialog->set_current_folder ("$dir/lib/emulate");
|
|
|
|
|
if ( "ok" eq $dialog->run ) {
|
if ( "ok" eq $dialog->run ) {
|
$file = $dialog->get_filename;
|
$file = $dialog->get_filename;
|
my ($name,$path,$suffix) = fileparse("$file",qr"\..[^.]*$");
|
my ($name,$path,$suffix) = fileparse("$file",qr"\..[^.]*$");
|
if($suffix eq '.EML'){
|
if($suffix eq '.EML'){
|
|
|
Line 1169... |
Line 1135... |
else {$results{$x}{$y}=$z;}
|
else {$results{$x}{$y}=$z;}
|
$self->object_add_attribute ($sample,$name,\%results);
|
$self->object_add_attribute ($sample,$name,\%results);
|
}
|
}
|
|
|
|
|
sub capture_cores_data {
|
|
my ($data,$text)=@_;
|
|
my %result;
|
|
my @q =split (/Core/,$text);
|
|
my $i=0;
|
|
foreach my $p (@q){
|
|
if ($i!=0){
|
|
my @d = split (/[^0-9. ]/,$p);
|
|
my $n= $d[0];
|
|
my $val = capture_number_after("$data",$p);
|
|
$result{remove_all_white_spaces($n)}=remove_all_white_spaces($val);
|
|
}
|
|
$i++;
|
|
}
|
|
return %result;
|
|
}
|
|
|
|
sub gen_sim_parameter_h {
|
sub gen_sim_parameter_h {
|
my ($param_h,$includ_h,$ne,$nr,$router_p,$fifow)=@_;
|
my ($param_h,$includ_h,$ne,$nr,$router_p,$fifow)=@_;
|
|
|
$param_h =~ s/\d\'b/ /g;
|
$param_h =~ s/\d\'b/ /g;
|
Line 1200... |
Line 1151... |
|
|
#define NE $ne
|
#define NE $ne
|
#define NR $nr
|
#define NR $nr
|
#define ROUTER_P_NUM $router_p
|
#define ROUTER_P_NUM $router_p
|
|
|
|
extern Vtraffic *traffic[NE];
|
|
extern Vpck_inj *pck_inj[NE];
|
|
extern int reset,clk;
|
|
|
//simulation parameter
|
//simulation parameter
|
#define MAX_RATIO ".MAX_RATIO."
|
#define MAX_RATIO ".MAX_RATIO."
|
#define AVG_LATENCY_METRIC \"HEAD_2_TAIL\"
|
#define AVG_LATENCY_METRIC \"HEAD_2_TAIL\"
|
#define TIMSTMP_FIFO_NUM $fifow
|
#define TIMSTMP_FIFO_NUM $fifow
|
|
|
$includ_h
|
$includ_h
|
\n \n \#endif" ;
|
\n \n \#endif" ;
|
return $text;
|
return $text;
|
}
|
}
|
|
|
sub gen_vrouter_param_v {
|
sub gen_noc_sim_param {
|
my ($simulate,$src_verilog_dr)=@_;
|
my $simulate=shift;
|
# generate NoC parameter file
|
|
my ($noc_param,$pass_param)=gen_noc_param_v($simulate);
|
|
open(FILE, ">$src_verilog_dr/parameter.v") || die "Can not open: $!";
|
|
my $fifow=$simulate->object_get_attribute('fpga_param','TIMSTMP_FIFO_NUM');
|
my $fifow=$simulate->object_get_attribute('fpga_param','TIMSTMP_FIFO_NUM');
|
|
|
|
$fifow= '16' if (!defined $fifow);
|
|
|
|
return "
|
print FILE " \`ifdef INCLUDE_PARAM \n \n
|
|
$noc_param
|
|
|
|
//simulation parameter
|
//simulation parameter
|
localparam MAX_RATIO = ".MAX_RATIO.";
|
//localparam MAX_RATIO = ".MAX_RATIO.";
|
localparam MAX_PCK_NUM = ".MAX_SIM_CLKs.";
|
localparam MAX_PCK_NUM = ".MAX_SIM_CLKs.";
|
localparam MAX_PCK_SIZ = ".MAX_PCK_SIZ.";
|
localparam MAX_PCK_SIZ = ".MAX_PCK_SIZ.";
|
localparam MAX_SIM_CLKs= ".MAX_SIM_CLKs.";
|
localparam MAX_SIM_CLKs= ".MAX_SIM_CLKs.";
|
localparam TIMSTMP_FIFO_NUM = $fifow;
|
localparam TIMSTMP_FIFO_NUM = $fifow;
|
|
";
|
|
|
|
}
|
|
|
|
|
|
sub gen_noc_localparam_v_file {
|
|
my ($self,$dst_path,$sample)=@_;
|
|
# generate NoC parameter file
|
|
my ($noc_param,$pass_param)=gen_noc_param_v($self,$sample);
|
|
my $header=autogen_warning().get_license_header("noc_localparam.v");
|
|
open(FILE, ">${dst_path}/noc_localparam.v") || die "Can not open: $!";
|
|
my $sim =gen_noc_sim_param($self);
|
|
print FILE "$header
|
|
|
|
\`ifdef NOC_LOCAL_PARAM \n \n
|
|
$noc_param
|
|
|
|
$sim
|
|
|
\n \n \`endif" ;
|
\n \n \`endif" ;
|
close FILE;
|
close FILE;
|
}
|
}
|
|
|
|
|
Line 1242... |
Line 1211... |
|
|
add_color_to_gd();
|
add_color_to_gd();
|
my $emulate= emulator->emulator_new();
|
my $emulate= emulator->emulator_new();
|
set_gui_status($emulate,"ideal",0);
|
set_gui_status($emulate,"ideal",0);
|
$emulate->object_add_attribute('compile','compilers',"QuartusII");
|
$emulate->object_add_attribute('compile','compilers',"QuartusII");
|
my $left_table = Gtk2::Table->new (25, 6, FALSE);
|
my $left_table = def_table (25, 6, FALSE);
|
my $right_table = Gtk2::Table->new (25, 6, FALSE);
|
my $right_table =def_table (25, 6, FALSE);
|
my $main_table = Gtk2::Table->new (25, 12, FALSE);
|
my $main_table = def_table (25, 12, FALSE);
|
my ($infobox,$info)= create_text();
|
my ($infobox,$info)= create_txview();
|
|
|
|
|
|
|
my @pages =(
|
my @pages =(
|
{page_name=>" Avg. throughput/latency", page_num=>0},
|
{page_name=>" Avg. throughput/latency", page_num=>0},
|
{page_name=>" Injected Packet ", page_num=>1},
|
{page_name=>" Injected Packet ", page_num=>1},
|
{page_name=>" Worst-Case Delay ",page_num=>2},
|
{page_name=>" Worst-Case Delay ",page_num=>2},
|
{page_name=>" Executaion Time ",page_num=>3},
|
{page_name=>" Execution Time ",page_num=>3},
|
);
|
);
|
|
|
my @charts = (
|
my @charts = (
|
{ 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},
|
{ 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},
|
{ 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},
|
{ 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},
|
Line 1264... |
Line 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},
|
{ 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},
|
{ 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},
|
{ 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},
|
{ 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},
|
{ 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},
|
);
|
);
|
|
|
my ($conf_box,$set_win)=process_notebook_gen($emulate,\$info,"emulate", @charts);
|
my ($conf_box,$set_win)=process_notebook_gen($emulate,$info,"emulate", undef,@charts);
|
my $chart =gen_multiple_charts ($emulate,\@pages,\@charts);
|
my $chart =gen_multiple_charts ($emulate,\@pages,\@charts,.4);
|
|
|
$main_table->set_row_spacings (4);
|
$main_table->set_row_spacings (4);
|
$main_table->set_col_spacings (1);
|
$main_table->set_col_spacings (1);
|
|
|
my $generate = def_image_button('icons/forward.png','Run all');
|
my $generate = def_image_button('icons/forward.png','Run all');
|
Line 1308... |
Line 1278... |
}
|
}
|
if($state eq "ideal"){
|
if($state eq "ideal"){
|
return TRUE;
|
return TRUE;
|
|
|
}
|
}
|
elsif($state eq 'ref_set_win'){
|
|
my $s=$emulate->object_get_attribute("active_setting",undef);
|
|
$set_win->destroy();
|
|
$emulate->object_add_attribute("active_setting",undef,$s);
|
|
}
|
|
|
|
#refresh GUI
|
#refresh GUI
|
my $name=$emulate->object_get_attribute ("emulate_name",undef);
|
my $name=$emulate->object_get_attribute ("emulate_name",undef);
|
$entry->set_text($name) if(defined $name);
|
$entry->set_text($name) if(defined $name);
|
$conf_box->destroy();
|
$conf_box->destroy();
|
$set_win->destroy();
|
|
$chart->destroy();
|
$chart->destroy();
|
$image->destroy();
|
$image->destroy();
|
$image = get_status_gif($emulate);
|
$image = get_status_gif($emulate);
|
($conf_box,$set_win)=process_notebook_gen($emulate,\$info,"emulate", @charts);
|
($conf_box,$set_win)=process_notebook_gen($emulate,$info,"emulate",$set_win, @charts);
|
$chart =gen_multiple_charts ($emulate,\@pages,\@charts);
|
$chart =gen_multiple_charts ($emulate,\@pages,\@charts,.4);
|
$v1 -> pack1($conf_box, TRUE, TRUE);
|
$v1 -> pack1($conf_box, TRUE, TRUE);
|
$v1 -> pack2($image, TRUE, TRUE);
|
$v1 -> pack2($image, TRUE, TRUE);
|
$v2 -> pack2($chart, TRUE, TRUE);
|
$v2 -> pack2($chart, TRUE, TRUE);
|
$conf_box->show_all();
|
$conf_box->show_all();
|
$main_table->show_all();
|
$main_table->show_all();
|
Line 1344... |
Line 1309... |
$generate-> signal_connect("clicked" => sub{
|
$generate-> signal_connect("clicked" => sub{
|
my @samples =$emulate->object_get_attribute_order("samples");
|
my @samples =$emulate->object_get_attribute_order("samples");
|
foreach my $sample (@samples){
|
foreach my $sample (@samples){
|
$emulate->object_add_attribute ($sample,"status","run");
|
$emulate->object_add_attribute ($sample,"status","run");
|
}
|
}
|
run_emulator($emulate,\$info);
|
run_emulator($emulate,$info);
|
});
|
});
|
|
|
|
|
$open-> signal_connect("clicked" => sub{
|
$open-> signal_connect("clicked" => sub{
|
load_emulation($emulate,\$info);
|
load_emulation($emulate,$info);
|
set_gui_status($emulate,"ref",5);
|
set_gui_status($emulate,"ref",5);
|
});
|
});
|
|
|
$save-> signal_connect("clicked" => sub{
|
$save-> signal_connect("clicked" => sub{
|
save_emulation($emulate);
|
save_emulation($emulate);
|
set_gui_status($emulate,"ref",5);
|
set_gui_status($emulate,"ref",5);
|
});
|
});
|
|
|
my $sc_win = new Gtk2::ScrolledWindow (undef, undef);
|
|
$sc_win->set_policy( "automatic", "automatic" );
|
|
$sc_win->add_with_viewport($main_table);
|
|
|
|
return $sc_win;
|
|
|
return add_widget_to_scrolled_win($main_table);
|
}
|
}
|
|
|
|
|
|
|
|
|
No newline at end of file
|
No newline at end of file
|