Line 283... |
Line 283... |
|
|
sub get_conflict_decision{
|
sub get_conflict_decision{
|
my ($mpsoc,$name,$inserted,$conflicts,$msg)=@_;
|
my ($mpsoc,$name,$inserted,$conflicts,$msg)=@_;
|
$msg="\tThe inserted tile number(s) have been mapped previously to \n\t\t\"$msg\".\n\tDo you want to remove the conflicted tiles number(s) in newly \n\tinsterd range or remove them from the previous ones? ";
|
$msg="\tThe inserted tile number(s) have been mapped previously to \n\t\t\"$msg\".\n\tDo you want to remove the conflicted tiles number(s) in newly \n\tinsterd range or remove them from the previous ones? ";
|
|
|
my $wind=def_popwin_size(100,300,"warning");
|
my $wind=def_popwin_size(10,30,"warning",'percent');
|
my $label= gen_label_in_left($msg);
|
my $label= gen_label_in_left($msg);
|
my $table=def_table(2,6,FALSE);
|
my $table=def_table(2,6,FALSE);
|
$table->attach_defaults ($label , 0, 6, 0,1);
|
$table->attach_defaults ($label , 0, 6, 0,1);
|
$wind->add($table);
|
$wind->add($table);
|
|
|
Line 417... |
Line 417... |
################
|
################
|
|
|
sub get_soc_parameter_setting{
|
sub get_soc_parameter_setting{
|
my ($mpsoc,$soc_name,$tile)=@_;
|
my ($mpsoc,$soc_name,$tile)=@_;
|
|
|
my $window = (defined $tile)? def_popwin_size(600,400,"Parameter setting for $soc_name located in tile($tile) "):def_popwin_size(600,400,"Default Parameter setting for $soc_name ");
|
my $window = (defined $tile)? def_popwin_size(40,40,"Parameter setting for $soc_name located in tile($tile) ",'percent'):def_popwin_size(40,40,"Default Parameter setting for $soc_name ",'percent');
|
my $table = def_table(10, 7, TRUE);
|
my $table = def_table(10, 7, TRUE);
|
|
|
my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
|
my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
|
$scrolled_win->set_policy( "automatic", "automatic" );
|
$scrolled_win->set_policy( "automatic", "automatic" );
|
$scrolled_win->add_with_viewport($table);
|
$scrolled_win->add_with_viewport($table);
|
Line 1099... |
Line 1099... |
######################
|
######################
|
|
|
sub get_config{
|
sub get_config{
|
my ($mpsoc,$info)=@_;
|
my ($mpsoc,$info)=@_;
|
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 = new Gtk2::ScrolledWindow (undef, undef);
|
#my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
|
$scrolled_win->set_policy( "automatic", "automatic" );
|
#$scrolled_win->set_policy( "automatic", "automatic" );
|
$scrolled_win->add_with_viewport($table);
|
#$scrolled_win->add_with_viewport($table);
|
|
|
#noc_setting
|
#noc_setting
|
my $row=noc_config ($mpsoc,$table);
|
my $row=noc_config ($mpsoc,$table);
|
|
|
|
|
Line 1157... |
Line 1157... |
|
|
|
|
|
|
|
|
|
|
return $scrolled_win;
|
return $table;
|
|
|
}
|
}
|
|
|
|
|
#############
|
#############
|
Line 1235... |
Line 1235... |
|
|
sub generate_soc_files{
|
sub generate_soc_files{
|
my ($mpsoc,$soc,$info)=@_;
|
my ($mpsoc,$soc,$info)=@_;
|
my $mpsoc_name=$mpsoc->object_get_attribute('mpsoc_name');
|
my $mpsoc_name=$mpsoc->object_get_attribute('mpsoc_name');
|
my $soc_name=$soc->object_get_attribute('soc_name');
|
my $soc_name=$soc->object_get_attribute('soc_name');
|
my ($file_v,$tmp)=soc_generate_verilog($soc);
|
|
|
# copy all files in project work directory
|
|
my $dir = Cwd::getcwd();
|
|
my $project_dir = abs_path("$dir/../../");
|
|
#make target dir
|
|
my $target_dir = "$ENV{'PRONOC_WORK'}/MPSOC/$mpsoc_name";
|
|
mkpath("$target_dir/src_verilog/lib/",1,0755);
|
|
mkpath("$target_dir/src_verilog/tiles/",1,0755);
|
|
mkpath("$target_dir/sw",1,0755);
|
|
|
|
my ($file_v,$tmp)=soc_generate_verilog($soc,"$target_dir/sw");
|
|
|
# Write object file
|
# Write object file
|
open(FILE, ">lib/soc/$soc_name.SOC") || die "Can not open: $!";
|
open(FILE, ">lib/soc/$soc_name.SOC") || die "Can not open: $!";
|
print FILE perl_file_header("$soc_name.SOC");
|
print FILE perl_file_header("$soc_name.SOC");
|
print FILE Data::Dumper->Dump([\%$soc],['mpsoc']);
|
print FILE Data::Dumper->Dump([\%$soc],['mpsoc']);
|
Line 1251... |
Line 1261... |
close(FILE) || die "Error closing file: $!";
|
close(FILE) || die "Error closing file: $!";
|
|
|
|
|
|
|
|
|
# copy all files in project work directory
|
|
my $dir = Cwd::getcwd();
|
|
my $project_dir = abs_path("$dir/../../");
|
|
#make target dir
|
|
my $target_dir = "$ENV{'PRONOC_WORK'}/MPSOC/$mpsoc_name";
|
|
mkpath("$target_dir/src_verilog/lib/",1,0755);
|
|
mkpath("$target_dir/src_verilog/tiles/",1,0755);
|
|
mkpath("$target_dir/sw",1,0755);
|
|
|
|
#copy hdl codes in src_verilog
|
#copy hdl codes in src_verilog
|
|
|
my ($hdl_ref,$warnings)= get_all_files_list($soc,"hdl_files");
|
my ($hdl_ref,$warnings)= get_all_files_list($soc,"hdl_files");
|
foreach my $f(@{$hdl_ref}){
|
foreach my $f(@{$hdl_ref}){
|
Line 1314... |
Line 1317... |
|
|
return $msg;
|
return $msg;
|
}
|
}
|
|
|
|
|
|
sub generate_mpsoc_lib_file {
|
|
my ($mpsoc,$info) = @_;
|
|
my $name=$mpsoc->object_get_attribute('mpsoc_name');
|
|
$mpsoc->mpsoc_remove_all_soc_tops();
|
|
open(FILE, ">lib/mpsoc/$name.MPSOC") || die "Can not open: $!";
|
|
print FILE perl_file_header("$name.MPSOC");
|
|
print FILE Data::Dumper->Dump([\%$mpsoc],[$name]);
|
|
close(FILE) || die "Error closing file: $!";
|
|
get_soc_list($mpsoc,$info);
|
|
|
|
}
|
|
|
|
|
################
|
################
|
# generate_mpsoc
|
# generate_mpsoc
|
#################
|
#################
|
|
|
sub generate_mpsoc{
|
sub generate_mpsoc{
|
my ($mpsoc,$info)=@_;
|
my ($mpsoc,$info)=@_;
|
my $name=$mpsoc->object_get_attribute('mpsoc_name');
|
my $name=$mpsoc->object_get_attribute('mpsoc_name');
|
if ( $name =~ /\W+/ ){
|
my $error = check_verilog_identifier_syntax($name);
|
message_dialog('The mpsoc name must not contain any non-word character:("./\()\':,.;<>~!@#$%^&*|+=[]{}`~?-")!")');
|
if ( defined $error ){
|
|
message_dialog("The \"$name\" is given with an unacceptable formatting. The mpsoc name will be used as top level verilog module name so it must follow Verilog identifier declaration formatting:\n $error");
|
return 0;
|
return 0;
|
}
|
}
|
my $size= (defined $name)? length($name) :0;
|
my $size= (defined $name)? length($name) :0;
|
if ($size ==0) {
|
if ($size ==0) {
|
message_dialog("Please define the MPSoC name!");
|
message_dialog("Please define the MPSoC name!");
|
Line 1352... |
Line 1369... |
my @files = glob( "$dir/../src_noc/*.v" );
|
my @files = glob( "$dir/../src_noc/*.v" );
|
copy_file_and_folders(\@files,$dir,"$hw_dir/lib/");
|
copy_file_and_folders(\@files,$dir,"$hw_dir/lib/");
|
|
|
|
|
|
|
my ($file_v,$top_v)=mpsoc_generate_verilog($mpsoc);
|
my ($file_v,$top_v)=mpsoc_generate_verilog($mpsoc,$sw_dir);
|
|
|
|
|
|
|
# Write object file
|
# Write object file
|
open(FILE, ">lib/mpsoc/$name.MPSOC") || die "Can not open: $!";
|
generate_mpsoc_lib_file($mpsoc,$info);
|
print FILE perl_file_header("$name.MPSOC");
|
|
print FILE Data::Dumper->Dump([\%$mpsoc],[$name]);
|
|
close(FILE) || die "Error closing file: $!";
|
|
|
|
# Write verilog file
|
# Write verilog file
|
open(FILE, ">lib/verilog/$name.v") || die "Can not open: $!";
|
open(FILE, ">lib/verilog/$name.v") || die "Can not open: $!";
|
print FILE $file_v;
|
print FILE $file_v;
|
close(FILE) || die "Error closing file: $!";
|
close(FILE) || die "Error closing file: $!";
|
Line 1579... |
Line 1593... |
}else {
|
}else {
|
$button =def_colored_button("Tile $tile ($x,$y)\n",50) if(! defined $soc_name);
|
$button =def_colored_button("Tile $tile ($x,$y)\n",50) if(! defined $soc_name);
|
}
|
}
|
|
|
$button->signal_connect("clicked" => sub{
|
$button->signal_connect("clicked" => sub{
|
my $window = def_popwin_size(400,400,"Parameter setting for Tile $tile ");
|
my $window = def_popwin_size(40,40,"Parameter setting for Tile $tile ",'percent');
|
my $table = def_table(6, 2, TRUE);
|
my $table = def_table(6, 2, TRUE);
|
|
|
my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
|
my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
|
$scrolled_win->set_policy( "automatic", "automatic" );
|
$scrolled_win->set_policy( "automatic", "automatic" );
|
$scrolled_win->add_with_viewport($table);
|
$scrolled_win->add_with_viewport($table);
|
Line 1715... |
Line 1729... |
|
|
}}
|
}}
|
|
|
|
|
|
|
|
sub software_edit_mpsoc {
|
|
my $self=shift;
|
|
my $name=$self->object_get_attribute('mpsoc_name');
|
|
if (length($name)==0){
|
|
message_dialog("Please define the MPSoC name!");
|
|
return ;
|
|
}
|
|
my $target_dir = "$ENV{'PRONOC_WORK'}/MPSOC/$name/sw";
|
|
my $sw = "$target_dir";
|
|
my ($app,$table,$tview) = software_main($sw);
|
|
|
|
|
|
|
|
|
|
my $make = def_image_button('icons/gen.png','Compile');
|
|
|
|
|
|
$table->attach ($make,9, 10, 1,2,'shrink','shrink',0,0);
|
|
|
|
|
|
$make -> signal_connect("clicked" => sub{
|
|
$app->do_save();
|
|
run_make_file($sw,$tview);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
############
|
############
|
Line 1751... |
Line 1791... |
|
|
|
|
my $noc_conf_box=get_config ($mpsoc,$info);
|
my $noc_conf_box=get_config ($mpsoc,$info);
|
my $noc_tiles=gen_tiles($mpsoc);
|
my $noc_tiles=gen_tiles($mpsoc);
|
|
|
|
my $scr_conf = new Gtk2::ScrolledWindow (undef, undef);
|
|
$scr_conf->set_policy( "automatic", "automatic" );
|
|
$scr_conf->add_with_viewport($noc_conf_box);
|
|
|
$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 $device_win=show_active_dev($soc,$soc,$infc,\$refresh,$info);
|
#my $device_win=show_active_dev($soc,$soc,$infc,\$refresh,$info);
|
Line 1765... |
Line 1807... |
|
|
|
|
|
|
|
|
my $open = def_image_button('icons/browse.png','Load MPSoC');
|
my $open = def_image_button('icons/browse.png','Load MPSoC');
|
|
my $compile = def_image_button('icons/run.png','Compile');
|
|
my $software = def_image_button('icons/binary.png','Software');
|
my $entry=gen_entry_object($mpsoc,'mpsoc_name',undef,undef,undef,undef);
|
my $entry=gen_entry_object($mpsoc,'mpsoc_name',undef,undef,undef,undef);
|
my $entrybox=labele_widget_info(" MPSoC name:",$entry);
|
my $entrybox=labele_widget_info(" MPSoC name:",$entry);
|
|
|
|
|
|
|
#$table->attach_defaults ($event_box, $col, $col+1, $row, $row+1);
|
#$table->attach_defaults ($event_box, $col, $col+1, $row, $row+1);
|
$main_table->attach_defaults ($noc_conf_box , 0, 4, 0, 22);
|
#$main_table->attach_defaults ($noc_conf_box , 0, 4, 0, 22);
|
$main_table->attach_defaults ($noc_tiles , 4, 12, 0, 22);
|
#$main_table->attach_defaults ($noc_tiles , 4, 12, 0, 22);
|
$main_table->attach_defaults ($infobox , 0, 12, 22,24);
|
#$main_table->attach_defaults ($infobox , 0, 12, 22,24);
|
|
|
|
my $h1=gen_hpaned($scr_conf,.3,$noc_tiles);
|
|
my $v2=gen_vpaned($h1,.55,$infobox);
|
|
$main_table->attach_defaults ($v2 , 0, 12, 0,24);
|
|
|
|
|
|
|
|
|
|
|
$main_table->attach ($open,0, 3, 24,25,'expand','shrink',2,2);
|
$main_table->attach ($open,0, 3, 24,25,'expand','shrink',2,2);
|
$main_table->attach_defaults ($entrybox,3, 7, 24,25);
|
$main_table->attach_defaults ($entrybox,3, 7, 24,25);
|
|
|
$main_table->attach ($generate, 10, 12, 24,25,'expand','shrink',2,2);
|
$main_table->attach ($generate, 8, 9, 24,25,'expand','shrink',2,2);
|
|
$main_table->attach ($software, 9, 10, 24,25,'expand','shrink',2,2);
|
|
$main_table->attach ($compile, 10, 12, 24,25,'expand','shrink',2,2);
|
|
|
#referesh the mpsoc generator
|
#referesh the mpsoc generator
|
$refresh-> signal_connect("clicked" => sub{
|
$refresh-> signal_connect("clicked" => sub{
|
$noc_conf_box->destroy();
|
$noc_conf_box->destroy();
|
$noc_conf_box=get_config ($mpsoc,$info);
|
$noc_conf_box=get_config ($mpsoc,$info);
|
$main_table->attach_defaults ($noc_conf_box , 0, 4, 0, 22);
|
$scr_conf->add_with_viewport($noc_conf_box);
|
$noc_conf_box->show_all();
|
#$main_table->attach_defaults ($noc_conf_box , 0, 4, 0, 22);
|
|
#$noc_conf_box->show_all();
|
|
|
|
|
|
|
$noc_tiles->destroy();
|
$noc_tiles->destroy();
|
$noc_tiles=gen_tiles($mpsoc);
|
$noc_tiles=gen_tiles($mpsoc);
|
$main_table->attach_defaults ($noc_tiles , 4, 12, 0, 22);
|
#$h1->destroy();
|
|
#$h1=gen_hpaned($noc_conf_box,.3,$noc_tiles);
|
|
$h1 -> pack1($scr_conf, TRUE, TRUE);
|
|
$h1 -> pack2($noc_tiles, TRUE, TRUE);
|
|
|
|
$v2-> pack1($h1, TRUE, TRUE);
|
|
$h1->show_all;
|
|
#$main_table->attach_defaults ($noc_tiles , 4, 12, 0, 22);
|
|
|
$main_table->show_all();
|
$main_table->show_all();
|
|
|
|
|
});
|
});
|
Line 1810... |
Line 1870... |
|
|
|
|
if ($timeout>0){
|
if ($timeout>0){
|
$timeout--;
|
$timeout--;
|
set_gui_status($mpsoc,$state,$timeout);
|
set_gui_status($mpsoc,$state,$timeout);
|
|
}elsif ($state eq 'save_project'){
|
|
# Write object file
|
|
my $name=$mpsoc->object_get_attribute('mpsoc_name');
|
|
open(FILE, ">lib/mpsoc/$name.MPSOC") || die "Can not open: $!";
|
|
print FILE perl_file_header("$name.MPSOC");
|
|
print FILE Data::Dumper->Dump([\%$mpsoc],[$name]);
|
|
close(FILE) || die "Error closing file: $!";
|
|
set_gui_status($mpsoc,"ideal",0);
|
}
|
}
|
elsif( $state ne "ideal" ){
|
elsif( $state ne "ideal" ){
|
$refresh->clicked;
|
$refresh->clicked;
|
my $saved_name=$mpsoc->object_get_attribute('mpsoc_name');
|
my $saved_name=$mpsoc->object_get_attribute('mpsoc_name');
|
if(defined $saved_name) {$entry->set_text($saved_name);}
|
if(defined $saved_name) {$entry->set_text($saved_name);}
|
Line 1842... |
Line 1910... |
load_mpsoc($mpsoc,$info);
|
load_mpsoc($mpsoc,$info);
|
|
|
});
|
});
|
|
|
|
|
|
$compile -> signal_connect("clicked" => sub{
|
|
my $name=$mpsoc->object_get_attribute('mpsoc_name');
|
|
if (length($name)==0){
|
|
message_dialog("Please define the MPSoC name!");
|
|
return ;
|
|
}
|
|
my $target_dir = "$ENV{'PRONOC_WORK'}/MPSOC/$name";
|
|
my $top_file = "$target_dir/src_verilog/${name}_top.v";
|
|
if (-f $top_file){
|
|
select_compiler($mpsoc,$name,$top_file,$target_dir);
|
|
} else {
|
|
message_dialog("Cannot find $top_file file. Please run RTL Generator first!");
|
|
return;
|
|
}
|
|
});
|
|
|
|
$software -> signal_connect("clicked" => sub{
|
|
software_edit_mpsoc($mpsoc);
|
|
|
|
});
|
|
|
|
|
my $sc_win = new Gtk2::ScrolledWindow (undef, undef);
|
my $sc_win = new Gtk2::ScrolledWindow (undef, undef);
|
$sc_win->set_policy( "automatic", "automatic" );
|
$sc_win->set_policy( "automatic", "automatic" );
|
$sc_win->add_with_viewport($main_table);
|
$sc_win->add_with_viewport($main_table);
|
|
|
return $sc_win;
|
return $sc_win;
|
Line 1880... |
Line 1970... |
$filter->set_name("MPSoC");
|
$filter->set_name("MPSoC");
|
$filter->add_pattern("*.MPSOC");
|
$filter->add_pattern("*.MPSOC");
|
$dialog->add_filter ($filter);
|
$dialog->add_filter ($filter);
|
my $dir = Cwd::getcwd();
|
my $dir = Cwd::getcwd();
|
$dialog->set_current_folder ("$dir/lib/mpsoc") ;
|
$dialog->set_current_folder ("$dir/lib/mpsoc") ;
|
|
my @newsocs=$mpsoc->mpsoc_get_soc_list();
|
|
add_info(\$info,'');
|
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 '.MPSOC'){
|
if($suffix eq '.MPSOC'){
|
my $pp= eval { do $file };
|
my $pp= eval { do $file };
|
if ($@ || !defined $pp){
|
if ($@ || !defined $pp){
|
show_info(\$info,"**Error reading $file file: $@\n");
|
add_info(\$info,"**Error: cannot open $file file: $@\n");
|
$dialog->destroy;
|
$dialog->destroy;
|
return;
|
return;
|
}
|
}
|
|
|
|
|
clone_obj($mpsoc,$pp);
|
clone_obj($mpsoc,$pp);
|
|
#read save mpsoc socs
|
|
my @oldsocs=$mpsoc->mpsoc_get_soc_list();
|
|
#add exsiting SoCs and add them to mpsoc
|
|
|
|
my $error;
|
|
#print "old: @oldsocs\n new @newsocs \n";
|
|
foreach my $p (@oldsocs) {
|
|
#print "$p\n";
|
|
my @num= $mpsoc->mpsoc_get_soc_tiles_num($p);
|
|
if (scalar @num && ( grep (/^$p$/,@newsocs)==0)){
|
|
my $m="Processing tile $p that has been used for ties @num but is not located in librray anymore\n";
|
|
$error = (defined $error ) ? "$error $m" : $m;
|
|
}
|
|
$mpsoc->mpsoc_remove_soc ($p) if (grep (/^$p$/,@newsocs)==0);
|
|
|
|
|
|
}
|
|
@newsocs=get_soc_list($mpsoc,$info); # add all existing socs
|
|
add_info(\$info,"**Error: \n $error\n") if(defined $error);
|
|
|
set_gui_status($mpsoc,"load_file",0);
|
set_gui_status($mpsoc,"load_file",0);
|
|
|
}
|
}
|
}
|
}
|
$dialog->destroy;
|
$dialog->destroy;
|