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 soc;
|
use soc;
|
Line 14... |
Line 14... |
use File::Copy;
|
use File::Copy;
|
use File::Copy::Recursive qw(dircopy);
|
use File::Copy::Recursive qw(dircopy);
|
use Cwd 'abs_path';
|
use Cwd 'abs_path';
|
|
|
|
|
use Gtk2;
|
|
use Gtk2::Pango;
|
|
|
|
|
|
|
|
|
|
# clean names for column numbers.
|
|
use constant DISPLAY_COLUMN => 0;
|
|
use constant CATRGORY_COLUMN => 1;
|
|
use constant MODULE_COLUMN => 2;
|
|
use constant ITALIC_COLUMN => 3;
|
|
use constant NUM_COLUMNS => 4;
|
|
|
|
|
|
require "widget.pl";
|
require "widget.pl";
|
require "verilog_gen.pl";
|
require "verilog_gen.pl";
|
require "readme_gen.pl";
|
require "readme_gen.pl";
|
require "hdr_file_gen.pl";
|
require "hdr_file_gen.pl";
|
require "diagram.pl";
|
require "diagram.pl";
|
Line 67... |
Line 53... |
|
|
#################
|
#################
|
# add_module_to_soc
|
# add_module_to_soc
|
###############
|
###############
|
sub add_module_to_soc{
|
sub add_module_to_soc{
|
my ($soc,$ip,$category,$module,$info)=@_;
|
my ($soc,$category,$module,$info)=@_;
|
|
my $ip = ip->lib_new ();
|
my ($instance_id,$id)= get_instance_id($soc,$category,$module);
|
my ($instance_id,$id)= get_instance_id($soc,$category,$module);
|
|
|
#add module instanance
|
#add module instanance
|
my $result=$soc->soc_add_instance($instance_id,$category,$module,$ip);
|
my $result=$soc->soc_add_instance($instance_id,$category,$module,$ip);
|
|
|
Line 89... |
Line 76... |
# Read default parameter from lib and add them to soc
|
# Read default parameter from lib and add them to soc
|
my %param_default= $ip->get_param_default($category,$module);
|
my %param_default= $ip->get_param_default($category,$module);
|
|
|
my $rr=$soc->soc_add_instance_param($instance_id,\%param_default);
|
my $rr=$soc->soc_add_instance_param($instance_id,\%param_default);
|
if($rr == 0){
|
if($rr == 0){
|
my $info_text= "Failed to add defualt parameter to \"$instance_id\". $instance_id does not exist exist.";
|
my $info_text= "Failed to add default parameter to \"$instance_id\". $instance_id does not exist exist.";
|
show_info($info,$info_text);
|
show_info($info,$info_text);
|
return;
|
return;
|
}
|
}
|
my @r=$ip->ip_get_param_order($category,$module);
|
my @r=$ip->ip_get_param_order($category,$module);
|
$soc->soc_add_instance_param_order($instance_id,\@r);
|
$soc->soc_add_instance_param_order($instance_id,\@r);
|
|
|
get_module_parameter($soc,$ip,$instance_id);
|
get_module_parameter($soc,$ip,$instance_id);
|
|
undef $ip;
|
|
set_gui_status($soc,"refresh_soc",0);
|
|
|
}
|
}
|
################
|
################
|
# remove_instance_from_soc
|
# remove_instance_from_soc
|
################
|
################
|
sub remove_instance_from_soc{
|
sub remove_instance_from_soc{
|
Line 128... |
Line 114... |
my @parameters=$ip->ip_get_param_order($category,$module);
|
my @parameters=$ip->ip_get_param_order($category,$module);
|
my $param_num = @parameters;
|
my $param_num = @parameters;
|
|
|
#read soc parameters
|
#read soc parameters
|
my %param_value= $soc->soc_get_module_param($instance_id);
|
my %param_value= $soc->soc_get_module_param($instance_id);
|
|
my %param_type= $soc->soc_get_module_param_type($instance_id);
|
my %new_param_value=%param_value;
|
my %new_param_value=%param_value;
|
|
|
|
|
|
|
#gui
|
#gui
|
my $table_size = ($param_num<10) ? 10 : $param_num;
|
my $table_size = ($param_num<10) ? 10 : $param_num;
|
my $window = def_popwin_size(60,60, "Parameter setting for $module ",'percent');
|
my $window = def_popwin_size(40,60, "Parameter setting for $module ",'percent');
|
my $table = def_table($table_size, 7, FALSE);
|
my $table = def_table($table_size, 7, FALSE);
|
|
|
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 $row=0;
|
my $row=0;
|
|
my $column=0;
|
|
|
my $ok = def_image_button('icons/select.png','OK');
|
my $ok = def_image_button('icons/select.png','OK');
|
|
|
my $at0= 'expand';
|
my $at0= 'shrink';
|
my $at1= 'shrink';
|
my $at1= 'shrink';
|
|
|
$table->attach (gen_label_in_left("Parameter name"),0, 3, $row, $row+1,$at0,$at1,2,2);
|
$table->attach (gen_label_in_left("Parameter name"),0, 2, $row, $row+1,$at0,$at1,2,2);
|
$table->attach (gen_label_in_left("Value"),3, 6, $row, $row+1,$at0,$at1,2,2);
|
$table->attach (gen_label_in_left("Value"),2, 3, $row, $row+1,$at0,$at1,2,2);
|
$table->attach (gen_label_in_left("Description"),6, 7, $row, $row+1,$at0,$at1,2,2);
|
my $param_info='Define how parameter will be included in the SoC/Tile top module containing this IP core. If you define it as "Parameter", its value can be changed at SoC/tile instantiation time. So multiple different instancitaions of single SoC/tile can be used in MPSoC where each has its own parameter value';
|
$row++;
|
$table->attach (gen_label_help($param_info,"Type"),3, 4, $row, $row+1,$at0,$at1,2,2);
|
foreach my $p (@parameters){
|
|
my ($default,$type,$content,$info)= $ip->ip_get_parameter($category,$module,$p);
|
|
|
|
my $value=$param_value{$p};
|
|
#$value = $default if (!defined $value && defined $default);
|
|
#print "$value\n";
|
|
if ($type eq "File_Entry"){
|
|
my $entry=gen_entry($value);
|
|
my $brows=get_file_name(undef,undef,$entry,undef,undef,undef,undef,undef);
|
|
my $box=def_hbox(TRUE,0);
|
|
$box->pack_start($entry,FALSE,FALSE,3);
|
|
$box->pack_start($brows,FALSE,FALSE,3);
|
|
$table->attach ($box, 3, 6, $row, $row+1,$at0,$at1,2,2);
|
|
$entry-> signal_connect("changed" => sub{$new_param_value{$p}=$entry->get_text();});
|
|
}
|
|
|
|
elsif ($type eq "Entry"){
|
|
my $entry=gen_entry($value);
|
|
$table->attach ($entry, 3, 6, $row, $row+1,$at0,$at1,2,2);
|
|
$entry-> signal_connect("changed" => sub{$new_param_value{$p}=$entry->get_text();});
|
|
}
|
|
elsif ($type eq "Combo-box"){
|
|
my @combo_list=split(",",$content);
|
|
my $pos=get_item_pos($value, @combo_list);
|
|
my $combo=gen_combo(\@combo_list, $pos);
|
|
$table->attach ($combo, 3, 6, $row, $row+1,$at0,$at1,2,2);
|
|
$combo-> signal_connect("changed" => sub{$new_param_value{$p}=$combo->get_active_text();});
|
|
|
|
}
|
|
elsif ($type eq "Spin-button"){
|
|
my ($min,$max,$step)=split(",",$content);
|
|
$value=~ s/\D//g;
|
|
$min=~ s/\D//g;
|
|
$max=~ s/\D//g;
|
|
$step=~ s/\D//g;
|
|
my $spin=gen_spin($min,$max,$step);
|
|
if(defined $value) {$spin->set_value($value);}
|
|
else {$spin->set_value($min);}
|
|
$table->attach ($spin, 3, 4, $row, $row+1,$at0,$at1,2,2);
|
|
$spin-> signal_connect("value_changed" => sub{ $new_param_value{$p}=$spin->get_value_as_int(); });
|
|
|
|
# $box=def_label_spin_help_box ($param,$info, $value,$min,$max,$step, 2);
|
|
}
|
|
if (defined $info && $type ne "Fixed"){
|
|
my $info_button=def_image_button('icons/help.png');
|
|
$table->attach ($info_button, 6, 7, $row, $row+1,$at0,$at1,2,2);
|
|
$info_button->signal_connect('clicked'=>sub{
|
|
message_dialog($info);
|
|
|
|
});
|
|
|
|
}
|
|
if ($type ne "Fixed"){
|
|
#print "$p:val:$value\n";
|
|
my $label =gen_label_in_left($p);
|
|
$table->attach ($label, 0, 3, $row, $row+1,$at0,$at1,2,2);
|
|
$row++;
|
$row++;
|
|
foreach my $p (@parameters){
|
|
my ($default,$type,$content,$info,$vfile_param_type)= $ip->ip_get_parameter($category,$module,$p);
|
|
my $show = ($type ne "Fixed");
|
|
if ($show){
|
|
my $default_type= "Localparam";
|
|
$default_type=$param_type{$p} if(defined $param_type{$p});
|
|
my $combo = gen_combobox_object($soc,'current_module_param_type',$p,"Parameter,Localparam",$default_type,undef,undef);
|
|
$table->attach ($combo,3, 4, $row, $row+1,$at0,$at1,2,2) if($vfile_param_type ne 'Parameter' && $category ne 'NoC' && $p ne 'WB_Aw' );
|
}
|
}
|
|
$default= $param_value{$p} if(defined $param_value{$p});
|
|
($row,$column)=add_param_widget($soc,$p,$p, $default,$type,$content,$info, $table,$row,$column,$show,'current_module_param',undef,undef,'vertical');
|
|
|
}
|
}
|
#if ($row== 0){
|
|
#my $label =gen_label_in_left("The $module IP does not have any adjatable parameter");
|
|
# $table->attach ($label, 0, 7, $row, $row+1,$at0,'shrink',2,2);
|
|
|
|
#}
|
|
|
|
|
|
|
|
my $mtable = def_table(10, 1, FALSE);
|
my $mtable = def_table(10, 1, FALSE);
|
|
|
Line 228... |
Line 168... |
$window->show_all();
|
$window->show_all();
|
|
|
$ok-> signal_connect("clicked" => sub{
|
$ok-> signal_connect("clicked" => sub{
|
$window->destroy;
|
$window->destroy;
|
#save new values
|
#save new values
|
|
my $ref=$soc->object_get_attribute('current_module_param');
|
|
if(defined $ref){
|
|
%new_param_value=%{$ref} ;
|
$soc->soc_add_instance_param($instance_id,\%new_param_value);
|
$soc->soc_add_instance_param($instance_id,\%new_param_value);
|
|
}
|
|
$ref=$soc->object_get_attribute('current_module_param_type');
|
|
if(defined $ref){
|
|
%new_param_value=%{$ref} ;
|
|
$soc->soc_add_instance_param_type($instance_id,\%new_param_value);
|
|
}
|
|
|
|
|
|
|
#check if wishbone address bus is parameterizable regenerate the addresses again
|
#check if wishbone address bus is parameterizable regenerate the addresses again
|
my @plugs= $soc->soc_get_all_plugs_of_an_instance($instance_id);
|
my @plugs= $soc->soc_get_all_plugs_of_an_instance($instance_id);
|
foreach my $plug (@plugs){
|
foreach my $plug (@plugs){
|
Line 256... |
Line 206... |
}
|
}
|
}
|
}
|
}#plug_num
|
}#plug_num
|
}#if
|
}#if
|
}#plugs
|
}#plugs
|
|
$soc->object_add_attribute('current_module_param',undef,undef);
|
|
$soc->object_add_attribute('current_module_param_type',undef,undef);
|
set_gui_status($soc,"refresh_soc",0);
|
set_gui_status($soc,"refresh_soc",0);
|
#$$refresh_soc->clicked;
|
|
|
|
});
|
});
|
|
|
|
|
}
|
}
|
|
|
|
|
|
|
############
|
############
|
# param_box
|
# param_box
|
#
|
#
|
############
|
############
|
sub get_item_pos{#if not in return 0
|
|
my ($item,@list)=@_;
|
|
my $pos=0;
|
|
foreach my $p (@list){
|
|
#print "$p eq $item\n";
|
|
if ($p eq $item){return $pos;}
|
|
$pos++;
|
|
}
|
|
return 0;
|
|
|
|
}
|
|
|
|
sub param_box{
|
sub param_box{
|
my ($param, $default,$type,$content,$info, $value)=@_;
|
my ($param, $default,$type,$content,$info, $value)=@_;
|
my $box=def_hbox(TRUE,0);
|
my $box=def_hbox(TRUE,0);
|
my $label =gen_label_in_left($param);
|
my $label =gen_label_in_left($param);
|
Line 296... |
Line 233... |
my $entry=gen_entry($default);
|
my $entry=gen_entry($default);
|
$box->pack_start($entry,FALSE,FALSE,3);
|
$box->pack_start($entry,FALSE,FALSE,3);
|
|
|
}
|
}
|
elsif ($type eq "Combo-box"){
|
elsif ($type eq "Combo-box"){
|
my @combo_list=split(",",$content);
|
my @combo_list=split(/\s*,\s*/,$content);
|
my $pos=get_item_pos($default, @combo_list);
|
my $pos=get_item_pos($default, @combo_list);
|
my $combo=gen_combo(\@combo_list, $pos);
|
my $combo=gen_combo(\@combo_list, $pos);
|
$box->pack_start($combo,FALSE,FALSE,3);
|
$box->pack_start($combo,FALSE,FALSE,3);
|
}
|
}
|
elsif ($type eq "Spin-button"){
|
elsif ($type eq "Spin-button"){
|
my ($min,$max,$step)=split(",",$content);
|
my ($min,$max,$step)=split(/\s*,\s*/,$content);
|
$default=~ s/\D//g;
|
$default=~ s/\D//g;
|
$min=~ s/\D//g;
|
$min=~ s/\D//g;
|
$max=~ s/\D//g;
|
$max=~ s/\D//g;
|
$step=~ s/\D//g;
|
$step=~ s/\D//g;
|
my $spin=gen_spin($min,$max,$step);
|
my $spin=gen_spin($min,$max,$step);
|
Line 345... |
Line 282... |
##############
|
##############
|
# gen_dev_box
|
# gen_dev_box
|
##############
|
##############
|
|
|
sub gen_instance{
|
sub gen_instance{
|
#my ($soc,$ip,$infc,$instance_id,$info)=@_;
|
|
my ($soc,$ip,$infc,$instance_id,$info,$table,$offset)=@_;
|
my ($soc,$ip,$infc,$instance_id,$info,$table,$offset)=@_;
|
|
|
|
|
|
|
# my $box= def_vbox (FALSE,0);
|
# my $box= def_vbox (FALSE,0);
|
Line 377... |
Line 313... |
if (-f "${project_dir}$pdf"){
|
if (-f "${project_dir}$pdf"){
|
system qq (xdg-open ${project_dir}$pdf);
|
system qq (xdg-open ${project_dir}$pdf);
|
}elsif (-f "$pdf"){
|
}elsif (-f "$pdf"){
|
system qq (xdg-open $pdf);
|
system qq (xdg-open $pdf);
|
}else{
|
}else{
|
message_dialog("Error! $pdf or ${project_dir}$pdf did not find!\n");
|
message_dialog("Error! $pdf or ${project_dir}$pdf did not find!\n",'error');
|
}
|
}
|
|
|
});
|
});
|
|
|
}
|
}
|
Line 404... |
Line 340... |
|
|
});
|
});
|
|
|
#remove button
|
#remove button
|
#my ($box2,$cancel_button) = button_box("Remove");
|
#my ($box2,$cancel_button) = button_box("Remove");
|
|
|
my $cancel_button=def_image_button('icons/cancel.png','Remove');
|
my $cancel_button=def_image_button('icons/cancel.png','Remove');
|
my $box2=def_hbox(FALSE,5);
|
my $box2=def_hbox(FALSE,5);
|
|
|
my $dwn=def_image_button("icons/down_sim.png");
|
my $dwn=def_image_button("icons/down_sim.png");
|
$box2->pack_start( $dwn, FALSE, FALSE, 3);
|
$box2->pack_start( $dwn, FALSE, FALSE, 3);
|
$box2->pack_start($cancel_button, FALSE, FALSE,3);
|
$box2->pack_start($cancel_button, FALSE, FALSE,3);
|
$table->attach ($box2,0,1,$offset+2,$offset+3,'expand','shrink',2,2);
|
$table->attach ($box2,0,1,$offset+2,$offset+3,'expand','shrink',2,2);
|
$cancel_button->signal_connect (clicked => sub{
|
$cancel_button->signal_connect (clicked => sub{
|
remove_instance_from_soc($soc,$instance_id);
|
remove_instance_from_soc($soc,$instance_id);
|
|
|
});
|
});
|
|
|
$dwn->signal_connect (clicked => sub{
|
$dwn->signal_connect (clicked => sub{
|
$soc->soc_increase_instance_order($instance_id);
|
$soc->soc_increase_instance_order($instance_id);
|
set_gui_status($soc,"refresh_soc",0);
|
set_gui_status($soc,"refresh_soc",0);
|
|
|
});
|
});
|
|
|
|
|
|
|
#instance name
|
#instance name
|
my $instance_name=$soc->soc_get_instance_name($instance_id);
|
my $instance_name=$soc->soc_get_instance_name($instance_id);
|
my $instance_label=gen_label_in_left(" Instance name");
|
my $instance_label=gen_label_in_left(" Instance name");
|
my $instance_entry = gen_entry($instance_name);
|
my $instance_entry = gen_entry($instance_name);
|
|
|
|
|
|
|
$table->attach ($instance_label,1,2,$offset+0,$offset+1,'expand','shrink',2,2);
|
$table->attach ($instance_label,1,2,$offset+0,$offset+1,'expand','shrink',2,2);
|
#$table->attach_defaults ($instance_entry,1,2,$offset+1,$offset+2);
|
#$table->attach_defaults ($instance_entry,1,2,$offset+1,$offset+2);
|
|
|
|
|
my $enter= def_image_button("icons/enter.png");
|
my $enter= def_image_button("icons/enter.png");
|
Line 444... |
Line 377... |
my ($old_v,$new_v)= get_old_new_ip_version ($soc,$ip,$instance_id);
|
my ($old_v,$new_v)= get_old_new_ip_version ($soc,$ip,$instance_id);
|
if($old_v != $new_v){
|
if($old_v != $new_v){
|
my $warn=def_image_button("icons/warning.png");
|
my $warn=def_image_button("icons/warning.png");
|
$table->attach ($warn,1,2,$offset+2,$offset+3,'expand','shrink',2,2); #$box2->pack_start($warn, FALSE, FALSE, 3);
|
$table->attach ($warn,1,2,$offset+2,$offset+3,'expand','shrink',2,2); #$box2->pack_start($warn, FALSE, FALSE, 3);
|
$warn->signal_connect (clicked => sub{
|
$warn->signal_connect (clicked => sub{
|
message_dialog("Warning: ${module}'s version (V.$old_v) missmatches with the one exsiting in librray (V.$new_v). The generated system may not work correctly. Please remove and then add $module again to update it with current version")
|
message_dialog("Warning: ${module}'s version (V.$old_v) mismatches with the one existing in library (V.$new_v). The generated system may not work correctly. Please remove and then add $module again to update it with current version")
|
|
|
});
|
});
|
|
|
|
|
}
|
}
|
Line 503... |
Line 436... |
|
|
|
|
#interface_pluges
|
#interface_pluges
|
my %plugs = $ip->get_module_plugs_value($category,$module);
|
my %plugs = $ip->get_module_plugs_value($category,$module);
|
|
|
|
##print "******* %plug=get_module_plugs_value($category,$module)*************\n";
|
|
#print Dumper (\%$ip);
|
my $row=0;
|
my $row=0;
|
foreach my $plug (sort keys %plugs) {
|
foreach my $plug (sort keys %plugs) {
|
|
#print "******* $plug *************\n";
|
my $plug_num= $plugs{$plug};
|
my $plug_num= $plugs{$plug};
|
for (my $k=0;$k<$plug_num;$k++){
|
for (my $k=0;$k<$plug_num;$k++){
|
|
|
my @connettions=("IO");
|
my @connettions=("IO");
|
my @connettions_name=("IO");
|
my @connettions_name=("IO");
|
Line 518... |
Line 453... |
|
|
|
|
|
|
my %connect_list= $soc->get_modules_have_this_socket($matched_soket);
|
my %connect_list= $soc->get_modules_have_this_socket($matched_soket);
|
foreach my $id(sort keys %connect_list ){
|
foreach my $id(sort keys %connect_list ){
|
if($instance_id ne $id){ # assum its forbidden to connect the socket and plug of same ip to each other
|
if($instance_id ne $id){ # assume its forbidden to connect the socket and plug of same ip to each other
|
#generate soket list
|
#generate socket list
|
my $name=$soc->soc_get_instance_name($id);
|
my $name=$soc->soc_get_instance_name($id);
|
#check if its a number or parameter
|
#check if its a number or parameter
|
my $param=$connect_list{$id};
|
my $param=$connect_list{$id};
|
my $value=$soc->soc_get_module_param_value($id,$param);
|
my $value=$soc->soc_get_module_param_value($id,$param);
|
my $array_name=0;
|
my $array_name=0;
|
Line 608... |
Line 543... |
my %connected_plugs=%$ref1;
|
my %connected_plugs=%$ref1;
|
my %connected_plug_nums=%$ref2;
|
my %connected_plug_nums=%$ref2;
|
foreach my $p (sort keys %connected_plugs) {
|
foreach my $p (sort keys %connected_plugs) {
|
#%pp{$instance_id}=$plug
|
#%pp{$instance_id}=$plug
|
$soc->soc_add_instance_plug_conection($p,$connected_plugs{$p},$connected_plug_nums{$p},'IO');
|
$soc->soc_add_instance_plug_conection($p,$connected_plugs{$p},$connected_plug_nums{$p},'IO');
|
my $info_text="$id\:$socket\[$num\] support only single connection. The previouse connection to $p:$connected_plugs{$p}\[$connected_plug_nums{$p}] has been removed.";
|
my $info_text="$id\:$socket\[$num\] support only single connection. The previous connection to $p:$connected_plugs{$p}\[$connected_plug_nums{$p}] has been removed.";
|
show_info(\$info, $info_text);
|
show_info($info, $info_text);
|
}
|
}
|
|
|
}
|
}
|
}
|
}
|
#print "$id \n $connect \n$num\n";
|
#print "$id \n $connect \n$num\n";
|
Line 659... |
Line 594... |
}#for $plug_num
|
}#for $plug_num
|
|
|
}#foreach plug
|
}#foreach plug
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#$box->pack_start($table, FALSE, FALSE, 0);
|
|
my $separator = Gtk2::HSeparator->new;
|
|
#$box->pack_start($separator, FALSE, FALSE, 3);
|
|
if($row<3) {$row=3;}
|
if($row<3) {$row=3;}
|
$table->attach ($separator,0,5,$row+$offset,$row+$offset+1,'fill','fill',2,2); $row++;
|
add_Hsep_to_table ($table,0,5,$row+$offset);$row++;
|
|
|
return ($offset+$row);
|
return ($offset+$row);
|
}
|
}
|
|
|
|
|
sub find_connection{
|
sub find_connection{
|
Line 695... |
Line 622... |
###############
|
###############
|
# generate_dev_table
|
# generate_dev_table
|
############
|
############
|
sub generate_dev_table{
|
sub generate_dev_table{
|
my($soc,$ip,$infc,$info)=@_;
|
my($soc,$ip,$infc,$info)=@_;
|
#my $box= def_hbox (TRUE,0);
|
|
|
|
my $table=def_table(3,25,FALSE);
|
my $table=def_table(3,25,FALSE);
|
my $row=0;
|
my $row=0;
|
my @instance_list=$soc->soc_get_instance_order();
|
my @instance_list=$soc->soc_get_instance_order();
|
if (scalar @instance_list ==0 ){
|
if (scalar @instance_list ==0 ){
|
@instance_list=$soc->soc_get_all_instances();
|
@instance_list=$soc->soc_get_all_instances();
|
}
|
}
|
my $i=0;
|
my $i=0;
|
|
|
|
|
|
|
foreach my $instanc(@instance_list){
|
foreach my $instanc(@instance_list){
|
$row=gen_instance($soc,$ip,$infc,$instanc,$info,$table,$row);
|
$row=gen_instance($soc,$ip,$infc,$instanc,$info,$table,$row);
|
|
|
}
|
}
|
if($row<20){for ($i=$row; $i<20; $i++){
|
if($row<20){for ($i=$row; $i<20; $i++){
|
|
|
#my $temp=gen_label_in_center(" ");
|
|
#$table->attach_defaults ($temp, 0, 1 , $i, $i+1);
|
|
}}
|
}}
|
|
|
|
|
#$box->pack_start( $scrolled_win, TRUE, TRUE, 3);
|
|
return $table;
|
return $table;
|
}
|
}
|
|
|
|
|
####################
|
####################
|
# show_active_dev
|
# show_active_dev
|
#
|
#
|
################
|
################
|
|
|
sub show_active_dev{
|
sub show_active_dev{
|
my($soc,$ip,$infc,$refresh_ref,$info)=@_;
|
my($soc,$ip,$infc,$info)=@_;
|
my $box= def_table (1, 1, FALSE);
|
|
my $dev_table = generate_dev_table($soc,$ip,$infc,$info);
|
my $dev_table = generate_dev_table($soc,$ip,$infc,$info);
|
my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
|
my $scrolled_win = gen_scr_win_with_adjst($soc,'device_win_adj');
|
$scrolled_win->set_policy( "automatic", "automatic" );
|
add_widget_to_scrolled_win($dev_table,$scrolled_win);
|
$scrolled_win->add_with_viewport($dev_table);
|
|
|
|
|
|
|
|
$$refresh_ref-> signal_connect("clicked" => sub{
|
|
|
|
$dev_table->destroy;
|
|
select(undef, undef, undef, 0.1); #wait 10 ms
|
|
$dev_table = generate_dev_table($soc,$ip,$infc,$info);
|
|
#$box->attach_defaults ($dev_table, 0, 1, 0, 1);#( $dev_table, FALSE, FALSE, 3);
|
|
$scrolled_win->add_with_viewport($dev_table);
|
|
$dev_table->show;
|
|
$scrolled_win->show_all;
|
|
|
|
|
|
|
|
});
|
|
#$box->attach_defaults ($dev_table, 0, 1, 0, 1);#$box->pack_start( $dev_table, FALSE, FALSE, 3);
|
|
#$box->show_all;
|
|
return $scrolled_win;
|
return $scrolled_win;
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
sub row_activated_cb{
|
|
my ($tree_view, $path, $column) = @_;
|
|
my $model = $tree_view->get_model;
|
|
my $iter = $model->get_iter ($path);
|
|
|
|
#my ($selection, $ref) = @_;
|
|
#my ($model,$textview)=@{$ref};
|
|
#my $iter = $selection->get_selected;
|
|
#return unless defined $iter;
|
|
my ($category) = $model->get ($iter, DISPLAY_COLUMN);
|
|
my ($module) = $model->get ($iter, CATRGORY_COLUMN);
|
|
|
|
|
|
|
|
#if($module){print "$module is selected via row activaton!\n"}
|
|
}
|
}
|
|
|
|
|
|
|
|
|
##############
|
|
# create tree
|
|
##############
|
|
sub create_tree {
|
|
my ($info,$ip,$soc)=@_;
|
|
my $model = Gtk2::TreeStore->new ('Glib::String', 'Glib::String', 'Glib::Scalar', 'Glib::Boolean');
|
|
my $tree_view = Gtk2::TreeView->new;
|
|
$tree_view->set_model ($model);
|
|
my $selection = $tree_view->get_selection;
|
|
|
|
$selection->set_mode ('browse');
|
|
#$tree_view->set_size_request (200, -1);
|
|
|
|
#
|
|
# this code only supports 1 level of children. If we
|
|
# want more we probably have to use a recursing function.
|
|
#
|
|
|
|
|
|
my @categories= $ip->ip_get_categories();
|
|
|
|
|
|
|
|
|
|
foreach my $p (@categories)
|
|
{
|
|
my @modules= $ip->get_modules($p);
|
|
#my @dev_entry= @{$tree_entry{$p}};
|
|
my $iter = $model->append (undef);
|
|
$model->set ($iter,
|
|
DISPLAY_COLUMN, $p,
|
|
CATRGORY_COLUMN, $p || '',
|
|
MODULE_COLUMN, 0 || '',
|
|
ITALIC_COLUMN, FALSE);
|
|
|
|
next unless @modules;
|
|
|
|
foreach my $v ( @modules){
|
|
my $child_iter = $model->append ($iter);
|
|
my $entry= '';
|
|
|
|
$model->set ($child_iter,
|
|
DISPLAY_COLUMN, $v,
|
|
CATRGORY_COLUMN, $p|| '',
|
|
MODULE_COLUMN, $v || '',
|
|
ITALIC_COLUMN, FALSE);
|
|
}
|
|
|
|
|
|
|
sub show_select_ip_description {
|
}
|
my ($soc,$category,$module,$info)=@_;
|
|
my $ip = ip->lib_new ();
|
my $cell = Gtk2::CellRendererText->new;
|
|
$cell->set ('style' => 'italic');
|
|
my $column = Gtk2::TreeViewColumn->new_with_attributes
|
|
("IP list",
|
|
$cell,
|
|
'text' => DISPLAY_COLUMN,
|
|
'style_set' => ITALIC_COLUMN);
|
|
|
|
$tree_view->append_column ($column);
|
|
my @ll=($model,\$info);
|
|
#row selected
|
|
$selection->signal_connect (changed =>sub {
|
|
my ($selection, $ref) = @_;
|
|
my ($model,$info)=@{$ref};
|
|
my $iter = $selection->get_selected;
|
|
return unless defined $iter;
|
|
|
|
my ($category) = $model->get ($iter, CATRGORY_COLUMN);
|
|
my ($module) = $model->get ($iter,MODULE_COLUMN );
|
|
my $describ=$ip->ip_get($category,$module,"description");
|
my $describ=$ip->ip_get($category,$module,"description");
|
if($describ){
|
if($describ){
|
#print "$entry describtion is: $describ \n";
|
|
show_info($info,$describ);
|
show_info($info,$describ);
|
|
|
}
|
}
|
|
undef $ip;
|
|
|
}, \@ll);
|
|
|
|
# row_activated
|
|
$tree_view->signal_connect (row_activated => sub{
|
|
|
|
my ($tree_view, $path, $column) = @_;
|
|
my $model = $tree_view->get_model;
|
|
my $iter = $model->get_iter ($path);
|
|
my ($category) = $model->get ($iter, CATRGORY_COLUMN);
|
|
my ($module) = $model->get ($iter,MODULE_COLUMN );
|
|
|
|
|
|
|
|
if($module){
|
|
#print "$module is selected via row activaton!\n";
|
|
add_module_to_soc($soc,$ip,$category,$module,\$info);
|
|
set_gui_status($soc,"refresh_soc",0);
|
|
}
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}, \@ll);
|
|
|
|
#$tree_view->expand_all;
|
|
|
|
my $scrolled_window = Gtk2::ScrolledWindow->new;
|
|
$scrolled_window->set_policy ('automatic', 'automatic');
|
|
$scrolled_window->set_shadow_type ('in');
|
|
$scrolled_window->add($tree_view);
|
|
|
|
my $hbox = Gtk2::HBox->new (FALSE, 0);
|
|
$hbox->pack_start ( $scrolled_window, TRUE, TRUE, 0);
|
|
|
|
|
|
|
|
return $hbox;
|
|
}
|
|
|
|
|
|
|
|
sub get_all_files_list {
|
sub get_all_files_list {
|
my ($soc,$list_name)=@_;
|
my ($soc,$list_name)=@_;
|
my @instances=$soc->soc_get_all_instances();
|
my @instances=$soc->soc_get_all_instances();
|
my $ip = ip->lib_new ();
|
my $ip = ip->lib_new ();
|
my @files;
|
my @files;
|
Line 927... |
Line 704... |
#print "@new\n";
|
#print "@new\n";
|
foreach my $f(@new){
|
foreach my $f(@new){
|
my $n="$project_dir$f";
|
my $n="$project_dir$f";
|
if (!(-f "$n") && !(-f "$f" ) && !(-d "$n") && !(-d "$f" ) ){
|
if (!(-f "$n") && !(-f "$f" ) && !(-d "$n") && !(-d "$f" ) ){
|
$warnings=(defined $warnings)? "$warnings WARNING: Can not find \"$f\" which is required for \"$inst\" \n":"WARNING: Can not find \"$f\" which is required for \"$inst\"\n ";
|
$warnings=(defined $warnings)? "$warnings WARNING: Can not find \"$f\" which is required for \"$inst\" \n":"WARNING: Can not find \"$f\" which is required for \"$inst\"\n ";
|
|
|
}
|
}
|
|
|
|
|
}
|
}
|
|
|
|
|
|
|
|
|
@files=(@files,@new);
|
@files=(@files,@new);
|
}
|
}
|
return \@files,$warnings;
|
return \@files,$warnings;
|
}
|
}
|
|
|
Line 971... |
Line 741... |
################
|
################
|
# generate_soc
|
# generate_soc
|
#################
|
#################
|
|
|
sub generate_soc{
|
sub generate_soc{
|
my ($soc,$info,$target_dir,$hw_path,$sw_path,$gen_top,$gen_hw_lib,$oldfiles)=@_;
|
my ($soc,$info,$target_dir,$hw_path,$sw_path,$gen_top,$gen_hw_lib,$oldfiles,$multi_core)=@_;
|
my $name=$soc->object_get_attribute('soc_name');
|
my $name=$soc->object_get_attribute('soc_name');
|
$oldfiles = "remove" if(!defined $oldfiles);
|
$oldfiles = "remove" if(!defined $oldfiles);
|
|
$multi_core = 0 if(!defined $multi_core);
|
my ($file_v,$top_v,$readme,$prog)=soc_generate_verilog($soc,$sw_path);
|
my ($file_v,$top_v,$readme,$prog)=soc_generate_verilog($soc,$sw_path,$info);
|
|
|
# Write object file
|
# Write object file
|
open(FILE, ">lib/soc/$name.SOC") || die "Can not open: $!";
|
open(FILE, ">lib/soc/$name.SOC") || die "Can not open: $!";
|
print FILE perl_file_header("$name.SOC");
|
print FILE perl_file_header("$name.SOC");
|
print FILE Data::Dumper->Dump([\%$soc],['soc']);
|
print FILE Data::Dumper->Dump([\%$soc],['soc']);
|
close(FILE) || die "Error closing file: $!";
|
close(FILE) || die "Error closing file: $!";
|
|
|
# Write verilog file
|
# Write verilog file
|
my $h=autogen_warning().get_license_header("${name}.v")."\n`timescale 1ns / 1ps\n";
|
my $h=autogen_warning().get_license_header("${name}.sv")."\n`timescale 1ns / 1ps\n";
|
open(FILE, ">lib/verilog/$name.v") || die "Can not open: $!";
|
open(FILE, ">lib/verilog/$name.sv") || die "Can not open: $!";
|
print FILE $h.$file_v;
|
print FILE $h.$file_v;
|
close(FILE) || die "Error closing file: $!";
|
close(FILE) || die "Error closing file: $!";
|
|
|
# Write Top module file
|
# Write Top module file
|
if($gen_top){
|
if($gen_top){
|
my $l=autogen_warning().get_license_header("${name}_top.v")."\n`timescale 1ns / 1ps\n";
|
my $l=autogen_warning().get_license_header("${name}_top.sv")."\n`timescale 1ns / 1ps\n";
|
open(FILE, ">lib/verilog/${name}_top.v") || die "Can not open: $!";
|
open(FILE, ">lib/verilog/${name}_top.sv") || die "Can not open: $!";
|
print FILE "$l\n$top_v";
|
print FILE "$l\n$top_v";
|
close(FILE) || die "Error closing file: $!";
|
close(FILE) || die "Error closing file: $!";
|
}
|
}
|
|
|
# Write readme file
|
# Write readme file
|
Line 1008... |
Line 778... |
# Write memory prog file
|
# Write memory prog file
|
open(FILE, ">lib/verilog/write_memory.sh") || die "Can not open: $!";
|
open(FILE, ">lib/verilog/write_memory.sh") || die "Can not open: $!";
|
print FILE $prog;
|
print FILE $prog;
|
close(FILE) || die "Error closing file: $!";
|
close(FILE) || die "Error closing file: $!";
|
|
|
|
|
|
my $m_chain = $soc->object_get_attribute('JTAG','M_CHAIN');
|
|
|
#generate prog_mem
|
#generate prog_mem
|
open(FILE, ">lib/verilog/program.sh") || die "Can not open: $!";
|
open(FILE, ">lib/verilog/program.sh") || die "Can not open: $!";
|
print FILE soc_mem_prog();
|
print FILE soc_mem_prog($m_chain) if (defined $m_chain);
|
close(FILE) || die "Error closing file: $!";
|
close(FILE) || die "Error closing file: $!";
|
|
|
|
|
|
|
my $dir = Cwd::getcwd();
|
my $dir = Cwd::getcwd();
|
my $project_dir = abs_path("$dir/../../");
|
my $project_dir = abs_path("$dir/../../");
|
if($gen_hw_lib){
|
if($gen_hw_lib){
|
|
|
#make target dir
|
#make target dir
|
my $hw_lib="$hw_path/lib";
|
my $hw_lib="$hw_path/lib";
|
|
my $hw_sim="$hw_path/../src_sim";
|
mkpath("$hw_lib/",1,01777);
|
mkpath("$hw_lib/",1,01777);
|
mkpath("$sw_path/",1,01777);
|
mkpath("$sw_path/",1,01777);
|
|
mkpath("$hw_sim/",1,01777);
|
|
|
if ($oldfiles eq "remove"){
|
if ($oldfiles eq "remove"){
|
#remove old rtl files that were copied by ProNoC
|
#remove old rtl files that were copied by ProNoC
|
my ($old_file_ref,$r,$err) = regen_object("$hw_path/file_list");
|
my ($old_file_ref,$r,$err) = regen_object("$hw_path/file_list");
|
if (defined $old_file_ref){
|
if (defined $old_file_ref){
|
remove_file_and_folders($old_file_ref,$target_dir);
|
remove_file_and_folders($old_file_ref,$target_dir);
|
}
|
}
|
}
|
}
|
|
|
#copy hdl codes in src_verilog
|
#copy hdl codes in src_verilog
|
my ($file_ref,$warnings)= get_all_files_list($soc,"hdl_files");
|
my ($file_ref,$warnings)= get_all_files_list($soc,"hdl_files");
|
|
my ($sim_ref,$warnings2)= get_all_files_list($soc,"hdl_files_ticked");
|
|
#file_ref-sim_ref
|
|
my @n= get_diff_array($file_ref,$sim_ref);
|
|
$file_ref=\@n;
|
|
|
copy_file_and_folders($file_ref,$project_dir,$hw_lib);
|
copy_file_and_folders($file_ref,$project_dir,$hw_lib);
|
show_info(\$info,$warnings) if(defined $warnings);
|
show_colored_info($info,$warnings,'green') if(defined $warnings);
|
add_to_project_file_list($file_ref,$hw_lib,$hw_path);
|
add_to_project_file_list($file_ref,$hw_lib,$hw_path);
|
|
|
|
|
|
copy_file_and_folders($sim_ref,$project_dir,$hw_sim );
|
|
show_colored_info($info,$warnings2,'green') if(defined $warnings2);
|
|
add_to_project_file_list($sim_ref,$hw_sim,$hw_path);
|
|
|
|
|
|
|
|
|
|
#copy clk setting hdl codes in src_verilog
|
|
my $sc_soc =get_source_set_top($soc,'soc');
|
|
($file_ref,$warnings)= get_all_files_list($sc_soc,"hdl_files");
|
|
($sim_ref,$warnings2)= get_all_files_list($soc,"hdl_files_ticked");
|
|
#file_ref-sim_ref
|
|
my @m= get_diff_array($file_ref,$sim_ref);
|
|
$file_ref=\@m;
|
|
|
|
|
|
copy_file_and_folders($file_ref,$project_dir,$hw_lib);
|
|
show_colored_info($info,$warnings,'green') if(defined $warnings);
|
|
add_to_project_file_list($file_ref,$hw_lib,$hw_path);
|
|
|
|
copy_file_and_folders($sim_ref,$project_dir,$hw_sim );
|
|
show_colored_info($info,$warnings2,'green') if(defined $warnings2);
|
|
add_to_project_file_list($sim_ref,$hw_sim,$hw_path);
|
|
|
#copy jtag control files
|
#copy jtag control files
|
my @jtags=(("/mpsoc/src_peripheral/jtag/jtag_wb"),("jtag"));
|
my @jtags=(("/mpsoc/rtl/src_peripheral/jtag/jtag_wb"),("jtag"));
|
copy_file_and_folders(\@jtags,$project_dir,$hw_lib);
|
copy_file_and_folders(\@jtags,$project_dir,$hw_lib);
|
add_to_project_file_list(\@jtags,$hw_lib,$hw_path);
|
add_to_project_file_list(\@jtags,$hw_lib,$hw_path);
|
|
|
move ("$dir/lib/verilog/$name.v","$hw_path/");
|
move ("$dir/lib/verilog/$name.sv","$hw_path/");
|
move ("$dir/lib/verilog/${name}_top.v","$hw_path/");
|
move ("$dir/lib/verilog/${name}_top.sv","$hw_path/");
|
move ("$dir/lib/verilog/README" ,"$sw_path/");
|
move ("$dir/lib/verilog/README" ,"$sw_path/");
|
move ("$dir/lib/verilog/write_memory.sh" ,"$sw_path/");
|
move ("$dir/lib/verilog/write_memory.sh" ,"$sw_path/");
|
move ("$dir/lib/verilog/program.sh" ,"$sw_path/");
|
move ("$dir/lib/verilog/program.sh" ,"$sw_path/");
|
}
|
}
|
|
|
Line 1061... |
Line 865... |
}
|
}
|
|
|
# Copy Software files
|
# Copy Software files
|
my ($file_ref,$warnings)= get_all_files_list($soc,"sw_files");
|
my ($file_ref,$warnings)= get_all_files_list($soc,"sw_files");
|
copy_file_and_folders($file_ref,$project_dir,$sw_path);
|
copy_file_and_folders($file_ref,$project_dir,$sw_path);
|
|
show_colored_info($info,$warnings,'green') if(defined $warnings);
|
|
|
my @new_file_ref;
|
my @new_file_ref;
|
foreach my $f(@{$file_ref}){
|
foreach my $f(@{$file_ref}){
|
my ($name,$path,$suffix) = fileparse("$f",qr"\..[^.]*$");
|
my ($name,$path,$suffix) = fileparse("$f",qr"\..[^.]*$");
|
push(@new_file_ref,"$sw_path/$name$suffix");
|
push(@new_file_ref,"$sw_path/$name$suffix");
|
Line 1084... |
Line 888... |
# Write main.c file if not exist
|
# Write main.c file if not exist
|
my $n="$sw_path/main.c";
|
my $n="$sw_path/main.c";
|
if (!(-f "$n")) {
|
if (!(-f "$n")) {
|
# Write main.c
|
# Write main.c
|
open(FILE, ">$n") || die "Can not open: $!";
|
open(FILE, ">$n") || die "Can not open: $!";
|
|
print FILE '#define MULTI_CORE' if($multi_core);
|
print FILE main_c_template($name);
|
print FILE main_c_template($name);
|
close(FILE) || die "Error closing file: $!";
|
close(FILE) || die "Error closing file: $!";
|
|
|
|
#write makefile source lib list file
|
|
open(FILE, ">$sw_path/SOURCE_LIB") || die "Can not open: $!";
|
|
print FILE "SOURCE_LIB += $name.c ";
|
|
close(FILE) || die "Error closing file: $!";
|
|
|
|
|
}
|
}
|
|
|
|
#regenerate linker var file
|
|
create_linker_var_file($soc);
|
|
|
|
|
#write perl_object_file
|
#write perl_object_file
|
mkpath("$target_dir/perl_lib/",1,01777);
|
mkpath("$target_dir/perl_lib/",1,01777);
|
open(FILE, ">$target_dir/perl_lib/$name.SOC") || die "Can not open: $!";
|
open(FILE, ">$target_dir/perl_lib/$name.SOC") || die "Can not open: $!";
|
print FILE perl_file_header("$name.SOC");
|
print FILE perl_file_header("$name.SOC");
|
print FILE Data::Dumper->Dump([\%$soc],['soc']);
|
print FILE Data::Dumper->Dump([\%$soc],['soc']);
|
Line 1154... |
Line 969... |
my $taken_base=$taken_bases{$taken_end};
|
my $taken_base=$taken_bases{$taken_end};
|
#print "taken:($taken_base,$taken_end)\n";
|
#print "taken:($taken_base,$taken_end)\n";
|
if (($base <= $taken_base && $end >= $taken_base ) || ($base <= $taken_end && $end >= $taken_end )){
|
if (($base <= $taken_base && $end >= $taken_base ) || ($base <= $taken_end && $end >= $taken_end )){
|
#if (!(($base < $taken_base && $end < $taken_end ) || ($base > $taken_base && $end > $taken_end ))){
|
#if (!(($base < $taken_base && $end < $taken_end ) || ($base > $taken_base && $end > $taken_end ))){
|
$conflict=1;
|
$conflict=1;
|
$base=$taken_end+1;
|
$base+=(1 << $width)while($base<$taken_end);
|
|
# $base=$taken_end+1;
|
|
|
$end= $base+(1 << $width)-1;
|
$end= $base+(1 << $width)-1;
|
last;
|
last;
|
|
|
}
|
}
|
}
|
}
|
Line 1182... |
Line 999... |
|
|
sub set_unset_infc{
|
sub set_unset_infc{
|
my $soc =shift;
|
my $soc =shift;
|
my $window = def_popwin_size(40,60,"Unconnected Socket Interfaces",'percent');
|
my $window = def_popwin_size(40,60,"Unconnected Socket Interfaces",'percent');
|
my $table = def_table(10,4, FALSE);
|
my $table = def_table(10,4, FALSE);
|
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 $row=0;
|
my $row=0;
|
my $column=0;
|
my $column=0;
|
|
|
my $ip = ip->lib_new ();
|
my $ip = ip->lib_new ();
|
my @instances=$soc->soc_get_all_instances();
|
my @instances=$soc->soc_get_all_instances();
|
Line 1199... |
Line 1014... |
my $inst = $soc->soc_get_instance_name($id);
|
my $inst = $soc->soc_get_instance_name($id);
|
my @ports=$ip->ip_list_ports($category,$module);
|
my @ports=$ip->ip_list_ports($category,$module);
|
foreach my $port (@ports){
|
foreach my $port (@ports){
|
my ($type,$range,$intfc_name,$i_port)=$ip->ip_get_port($category,$module,$port);
|
my ($type,$range,$intfc_name,$i_port)=$ip->ip_get_port($category,$module,$port);
|
my($i_type,$i_name,$i_num) =split("[:\[ \\]]", $intfc_name);
|
my($i_type,$i_name,$i_num) =split("[:\[ \\]]", $intfc_name);
|
if($i_type eq 'socket' && $i_name ne'wb_addr_map' ){
|
if($i_type eq 'socket' && $i_name ne'wb_addr_map' && $i_name ne'jtag_to_wb'){
|
my ($ref1,$ref2)= $soc->soc_get_modules_plug_connected_to_socket($id,$i_name,$i_num);
|
my ($ref1,$ref2)= $soc->soc_get_modules_plug_connected_to_socket($id,$i_name,$i_num);
|
my %connected_plugs=%$ref1;
|
my %connected_plugs=%$ref1;
|
my %connected_plug_nums=%$ref2;
|
my %connected_plug_nums=%$ref2;
|
if(!%connected_plugs ){
|
if(!%connected_plugs ){
|
my ($s_type,$s_value,$s_connection_num)=$soc->soc_get_socket_of_instance($id,$i_name);
|
my ($s_type,$s_value,$s_connection_num)=$soc->soc_get_socket_of_instance($id,$i_name);
|
Line 1228... |
Line 1043... |
}
|
}
|
}
|
}
|
}
|
}
|
|
|
my $box1=def_hbox(FALSE, 1);
|
my $box1=def_hbox(FALSE, 1);
|
$box1->pack_start( Gtk2::VSeparator->new, FALSE, FALSE, 3);
|
$box1->pack_start( gen_Vsep(), FALSE, FALSE, 3);
|
$table->attach($box1,3,4,0,$row+1,'expand','fill',2,2);
|
$table->attach($box1,3,4,0,$row+1,'expand','fill',2,2);
|
my $ok = def_image_button('icons/select.png','OK');
|
my $ok = def_image_button('icons/select.png','OK');
|
$ok->signal_connect ( 'clicked'=> sub {
|
$ok->signal_connect ( 'clicked'=> sub {
|
$window->destroy;
|
$window->destroy;
|
});
|
});
|
Line 1259... |
Line 1074... |
|
|
|
|
my $window = def_popwin_size(80,50,"Wishbone slave port address setting",'percent');
|
my $window = def_popwin_size(80,50,"Wishbone slave port address setting",'percent');
|
my $table = def_table(10, 6, FALSE);
|
my $table = def_table(10, 6, FALSE);
|
|
|
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 $row=0;
|
my $row=0;
|
|
|
#title
|
#title
|
$table->attach(gen_label_in_left ("Instance name"),0,1,$row,$row+1,'expand','shrink',2,2);
|
$table->attach(gen_label_in_left ("Instance name"),0,1,$row,$row+1,'expand','shrink',2,2);
|
$table->attach(gen_label_in_left ("Interface name"),1,2,$row,$row+1,'expand','shrink',2,2);
|
$table->attach(gen_label_in_left ("Interface name"),1,2,$row,$row+1,'expand','shrink',2,2);
|
Line 1310... |
Line 1123... |
|
|
my $connected_instance_name= $soc->soc_get_instance_name($connect_id);
|
my $connected_instance_name= $soc->soc_get_instance_name($connect_id);
|
my $number=$row-1;
|
my $number=$row-1;
|
my $label1= gen_label_in_left("$number: $instance_name");
|
my $label1= gen_label_in_left("$number: $instance_name");
|
my $label2= gen_label_in_left($connected_instance_name);
|
my $label2= gen_label_in_left($connected_instance_name);
|
my $entry1= Gtk2::Entry->new_with_max_length (10);
|
my $entry1= gen_entry_new_with_max_length (10,sprintf("0x%08x", $base));
|
$entry1->set_text(sprintf("0x%08x", $base));
|
my $entry2= gen_entry_new_with_max_length (10,sprintf("0x%08x", $end));
|
|
|
my $entry2= Gtk2::Entry->new_with_max_length (10);
|
|
$entry2->set_text(sprintf("0x%08x", $end));
|
|
|
|
my ($box,$valid) =addr_box_gen(sprintf("0x%08x", $base), sprintf("0x%08x", $end),\@newbase,\@newend,\@connects,$number);
|
my ($box,$valid) =addr_box_gen(sprintf("0x%08x", $base), sprintf("0x%08x", $end),\@newbase,\@newend,\@connects,$number);
|
$status_all[$number]=$valid;
|
$status_all[$number]=$valid;
|
|
|
|
|
Line 1412... |
Line 1222... |
|
|
|
|
|
|
$window->destroy;
|
$window->destroy;
|
}else{
|
}else{
|
message_dialog("Invalid address!");
|
message_dialog("Invalid address!",'error');
|
|
|
}
|
}
|
|
|
|
|
});
|
});
|
Line 1480... |
Line 1290... |
#get ordered param
|
#get ordered param
|
my @ordered_param=$soc->soc_get_instance_param_order($id);
|
my @ordered_param=$soc->soc_get_instance_param_order($id);
|
my %sim_params;
|
my %sim_params;
|
foreach my $p (@ordered_param){
|
foreach my $p (@ordered_param){
|
my $value=$soc->soc_get_module_param_value($id,$p);
|
my $value=$soc->soc_get_module_param_value($id,$p);
|
|
#print "\n$value=\$soc->soc_get_module_param_value($id,$p)\n";
|
foreach my $q (sort keys %sim_params){
|
foreach my $q (sort keys %sim_params){
|
|
|
$value=replace_value($value,$q,$sim_params{$q}) if (defined $value);
|
$value=replace_value($value,$q,$sim_params{$q}) if (defined $value);
|
|
|
|
|
}
|
}
|
$sim_params{$p}=$value;
|
$sim_params{$p}=$value;
|
#print "$sim_params{$p}=$value;\n";
|
#print "\$sim_params{$p}=$value;\n";
|
}
|
}
|
return $sim_params{$param};
|
return $sim_params{$param};
|
}
|
}
|
|
|
|
|
Line 1499... |
Line 1313... |
|
|
my $new_string=$string;
|
my $new_string=$string;
|
#print "$new_range\n";
|
#print "$new_range\n";
|
my $new_param= $value;
|
my $new_param= $value;
|
($new_string=$new_string)=~ s/\b$param\b/$new_param/g;
|
($new_string=$new_string)=~ s/\b$param\b/$new_param/g;
|
return eval $new_string;
|
my $new_val = eval $new_string;
|
|
return $new_val if (defined $new_val);
|
|
return $string;
|
|
|
}
|
}
|
|
|
|
|
|
|
Line 1551... |
Line 1366... |
#############
|
#############
|
|
|
sub load_soc{
|
sub load_soc{
|
my ($soc,$info,$ip)=@_;
|
my ($soc,$info,$ip)=@_;
|
my $file;
|
my $file;
|
my $dialog = Gtk2::FileChooserDialog->new(
|
my $dialog = gen_file_dialog (undef, 'SOC');
|
'Select a File', undef,
|
|
'open',
|
|
'gtk-cancel' => 'cancel',
|
|
'gtk-ok' => 'ok',
|
|
);
|
|
|
|
my $filter = Gtk2::FileFilter->new();
|
|
$filter->set_name("SoC");
|
|
$filter->add_pattern("*.SOC");
|
|
$dialog->add_filter ($filter);
|
|
my $dir = Cwd::getcwd();
|
my $dir = Cwd::getcwd();
|
$dialog->set_current_folder ("$dir/lib/soc") ;
|
$dialog->set_current_folder ("$dir/lib/soc") ;
|
|
|
|
|
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 '.SOC'){
|
if($suffix eq '.SOC'){
|
my ($pp,$r,$err) = regen_object($file);
|
my ($pp,$r,$err) = regen_object($file);
|
if ($r || !defined $pp){
|
if ($r || !defined $pp){
|
show_info(\$info,"**Error reading $file file: $err\n");
|
show_info($info,"**Error reading $file file: $err\n");
|
$dialog->destroy;
|
$dialog->destroy;
|
return;
|
return;
|
}
|
}
|
clone_obj($soc,$pp);
|
clone_obj($soc,$pp);
|
check_instances_version($soc,$ip);
|
check_instances_version($soc,$ip);
|
set_gui_status($soc,"load_file",0);
|
set_gui_status($soc,"load_file",0);
|
}
|
}
|
}
|
}
|
$dialog->destroy;
|
$dialog->destroy;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
sub check_instances_version{
|
sub check_instances_version{
|
my ($soc,$ip)=@_;
|
my ($soc,$ip)=@_;
|
|
|
#check if the IP's version didnt increases
|
#check if the IP's version didnt increases
|
my @all_instances=$soc->soc_get_all_instances();
|
my @all_instances=$soc->soc_get_all_instances();
|
foreach my $instance_id (@all_instances){
|
foreach my $instance_id (@all_instances){
|
my ($old_v,$new_v)= get_old_new_ip_version ($soc,$ip,$instance_id);
|
my ($old_v,$new_v)= get_old_new_ip_version ($soc,$ip,$instance_id);
|
my $differences='';
|
my $differences='';
|
$differences="$differences \t The $instance_id version (V.$old_v) missmatches with the one exsiting in the library (V.$new_v).\n " if($old_v != $new_v);
|
$differences="$differences \t The $instance_id version (V.$old_v) mismatches with the one existing in the library (V.$new_v).\n " if($old_v != $new_v);
|
|
|
|
|
message_dialog("Warning: The generated system may not work correctly: \n $differences Please remove and then add the aforementioned instance(s) to update them with current version(s)") if(length($differences)>1);
|
message_dialog("Warning: The generated system may not work correctly: \n $differences Please remove and then add the aforementioned instance(s) to update them with current version(s)") if(length($differences)>1);
|
|
|
}
|
}
|
Line 1639... |
Line 1442... |
sub get_ram_init{
|
sub get_ram_init{
|
my $soc=shift;
|
my $soc=shift;
|
my $window = def_popwin_size(80,50,"Memory initial file setting setting",'percent');
|
my $window = def_popwin_size(80,50,"Memory initial file setting setting",'percent');
|
my $table = def_table(10, 6, FALSE);
|
my $table = def_table(10, 6, FALSE);
|
|
|
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 $row=0;
|
my $row=0;
|
my $col=0;
|
my $col=0;
|
my @instances=$soc->soc_get_all_instances();
|
my @instances=$soc->soc_get_all_instances();
|
foreach my $id (@instances){
|
foreach my $id (@instances){
|
my $category = $soc->soc_get_category($id);
|
my $category = $soc->soc_get_category($id);
|
Line 1674... |
Line 1475... |
|
|
|
|
sub software_edit_soc {
|
sub software_edit_soc {
|
my $soc=shift;
|
my $soc=shift;
|
my $name=$soc->object_get_attribute('soc_name');
|
my $name=$soc->object_get_attribute('soc_name');
|
|
$name="" if (!defined $name);
|
if (length($name)==0){
|
if (length($name)==0){
|
message_dialog("Please define the Tile name!");
|
message_dialog("Please define the Tile name!");
|
return ;
|
return ;
|
}
|
}
|
my $target_dir = "$ENV{'PRONOC_WORK'}/SOC/$name";
|
my $target_dir = "$ENV{'PRONOC_WORK'}/SOC/$name";
|
my $sw = "$target_dir/sw";
|
my $sw = "$target_dir/sw";
|
my ($app,$table,$tview) = software_main($sw);
|
my ($app,$table,$tview) = software_main($sw);
|
|
|
|
|
|
|
|
my $ram = def_image_button('icons/info.png',"Required BRAMs\' size",FALSE,1);
|
|
my $linker = def_image_button('icons/setting.png','LD Linker',FALSE,1);
|
my $make = def_image_button('icons/gen.png','Compile');
|
my $make = def_image_button('icons/gen.png','Compile');
|
my $regen= def_image_button('icons/refresh.png','Regenerate main.c');
|
my $regen= def_image_button('icons/refresh.png','Regenerate main.c');
|
my $prog= def_image_button('icons/write.png','Program the memory');
|
my $prog= def_image_button('icons/write.png','Program the memory');
|
|
|
$table->attach ($regen,0, 1, 1,2,'shrink','shrink',0,0);
|
$table->attach ($ram,0, 1, 1,2,'shrink','shrink',0,0);
|
|
$table->attach ($regen,1, 2, 1,2,'shrink','shrink',0,0);
|
|
$table->attach ($linker,4, 5, 1,2,'shrink','shrink',0,0);
|
$table->attach ($make,5, 6, 1,2,'shrink','shrink',0,0);
|
$table->attach ($make,5, 6, 1,2,'shrink','shrink',0,0);
|
$table->attach ($prog,9, 10, 1,2,'shrink','shrink',0,0);
|
$table->attach ($prog,9, 10, 1,2,'shrink','shrink',0,0);
|
$regen -> signal_connect ("clicked" => sub{
|
$regen -> signal_connect ("clicked" => sub{
|
my $dialog = Gtk2::MessageDialog->new (my $window,
|
my $response = yes_no_dialog("Are you sure you want to regenerate the main.c file? Note that any changes you have made will be lost");
|
'destroy-with-parent',
|
|
'question', # message type
|
|
'yes-no', # which set of buttons?
|
|
"Are you sure you want to regenaret the main.c file? Note that any changes you have made will be lost");
|
|
my $response = $dialog->run;
|
|
if ($response eq 'yes') {
|
if ($response eq 'yes') {
|
|
|
save_file ("$sw/main.c",main_c_template($name));
|
save_file ("$sw/main.c",main_c_template($name));
|
$app->load_source("$sw/main.c");
|
$app->refresh_source("$sw/main.c");
|
}
|
}
|
$dialog->destroy;
|
|
|
|
});
|
});
|
|
|
|
my $load;
|
$make -> signal_connect("clicked" => sub{
|
$make -> signal_connect("clicked" => sub{
|
$app->do_save();
|
$load->destroy if(defined $load);
|
my $load= show_gif("icons/load.gif");
|
$app->ask_to_save_changes();
|
|
$load= show_gif("icons/load.gif");
|
|
$table->attach ($load,7, 8, 1,2,'shrink','shrink',0,0);
|
|
$load->show_all;
|
|
unless (run_make_file($sw,$tview,'clean')){
|
|
$load->destroy;
|
|
$load=def_icon("icons/cancel.png");
|
|
$table->attach ($load,7, 8, 1,2,'shrink','shrink',0,0);
|
|
$load->show_all;
|
|
return;
|
|
};
|
|
unless (run_make_file($sw,$tview)){
|
|
$load->destroy;
|
|
$load=def_icon("icons/cancel.png");
|
$table->attach ($load,7, 8, 1,2,'shrink','shrink',0,0);
|
$table->attach ($load,7, 8, 1,2,'shrink','shrink',0,0);
|
$load->show_all;
|
$load->show_all;
|
run_make_file($sw,$tview);
|
return;
|
|
}
|
$load->destroy;
|
$load->destroy;
|
|
$load=def_icon("icons/button_ok.png");
|
|
$table->attach ($load,7, 8, 1,2,'shrink','shrink',0,0);
|
|
$load->show_all;
|
});
|
});
|
|
|
#Programe the board
|
#Programe the board
|
$prog-> signal_connect("clicked" => sub{
|
$prog-> signal_connect("clicked" => sub{
|
my $error = 0;
|
my $error = 0;
|
my $bash_file="$target_dir/sw/program.sh";
|
my $bash_file="$target_dir/sw/program.sh";
|
my $jtag_intfc="$sw/jtag_intfc.sh";
|
my $jtag_intfc="$sw/jtag_intfc.sh";
|
|
|
add_info(\$tview,"Programe the board using quartus_pgm and $bash_file file\n");
|
add_info($tview,"Program the board using quartus_pgm and $bash_file file\n");
|
#check if the programming file exists
|
#check if the programming file exists
|
unless (-f $bash_file) {
|
unless (-f $bash_file) {
|
add_colored_info(\$tview,"\tThe $bash_file does not exists! \n", 'red');
|
add_colored_info($tview,"\tThe $bash_file does not exists! \n", 'red');
|
$error=1;
|
$error=1;
|
}
|
}
|
#check if the jtag_intfc.sh file exists
|
#check if the jtag_intfc.sh file exists
|
unless (-f $jtag_intfc) {
|
unless (-f $jtag_intfc) {
|
add_colored_info(\$tview,"\tThe $jtag_intfc does not exists!. Press the compile button and select your FPGA board first to generate $jtag_intfc file\n", 'red');
|
add_colored_info($tview,"\tThe $jtag_intfc does not exists!. Press the compile button and select your FPGA board first to generate $jtag_intfc file\n", 'red');
|
$error=1;
|
$error=1;
|
}
|
}
|
|
|
return if($error);
|
return if($error);
|
my $command = "cd $target_dir/sw; bash program.sh";
|
my $command = "cd $target_dir/sw; bash program.sh";
|
add_info(\$tview,"$command\n");
|
add_info($tview,"$command\n");
|
my ($stdout,$exit,$stderr)=run_cmd_in_back_ground_get_stdout($command);
|
my ($stdout,$exit,$stderr)=run_cmd_in_back_ground_get_stdout($command);
|
if(length $stderr>1){
|
if(length $stderr>1){
|
add_colored_info(\$tview,"$stderr\n",'red');
|
add_colored_info($tview,"$stderr\n",'red');
|
add_colored_info(\$tview,"Memory was not programed successfully!\n",'red');
|
add_colored_info($tview,"Memory was not programmed successfully!\n",'red');
|
}else {
|
}else {
|
|
|
if($exit){
|
if($exit){
|
add_colored_info(\$tview,"$stdout\n",'red');
|
add_colored_info($tview,"$stdout\n",'red');
|
add_colored_info(\$tview,"Memory was not programed successfully!\n",'red');
|
add_colored_info($tview,"Memory was not programmed successfully!\n",'red');
|
}else{
|
}else{
|
add_info(\$tview,"$stdout\n");
|
add_info($tview,"$stdout\n");
|
add_colored_info(\$tview,"Memory is programed successfully!\n",'blue');
|
add_colored_info($tview,"Memory is programmed successfully!\n",'blue');
|
|
|
}
|
}
|
|
|
}
|
}
|
});
|
});
|
|
|
|
$ram -> signal_connect("clicked" => sub{
|
|
show_reqired_brams($soc,$tview);
|
|
});
|
|
|
|
$linker -> signal_connect("clicked" => sub{
|
|
linker_setting($soc,$tview);
|
|
});
|
|
|
}
|
}
|
|
|
|
|
sub soc_mem_prog {
|
sub soc_mem_prog {
|
my $string='#!/bin/bash
|
my $chain=shift;
|
|
my $string="#!/bin/bash
|
|
|
|
|
#JTAG_INTFC="$PRONOC_WORK/toolchain/bin/JTAG_INTFC"
|
#JTAG_INTFC=\"\$PRONOC_WORK/toolchain/bin/JTAG_INTFC\"
|
source ./jtag_intfc.sh
|
source ./jtag_intfc.sh
|
|
|
#reset and disable cpus, then release the reset but keep the cpus disabled
|
#reset and disable cpus, then release the reset but keep the cpus disabled
|
|
|
$JTAG_INTFC -n 127 -d "I:1,D:2:3,D:2:2,I:0"
|
\$JTAG_INTFC -t $chain -n 127 -d \"I:1,D:2:3,D:2:2,I:0\"
|
|
|
# jtag instruction
|
# jtag instruction
|
# 0: bypass
|
# 0: bypass
|
# 1: getting data
|
# 1: getting data
|
# jtag data :
|
# jtag data :
|
Line 1783... |
Line 1607... |
# D:2:2 load jtag_enable data register with 0x2 reset=0 disable=1
|
# D:2:2 load jtag_enable data register with 0x2 reset=0 disable=1
|
# I:0 set jtag_enable in bypass mode
|
# I:0 set jtag_enable in bypass mode
|
|
|
|
|
|
|
#programe the memory
|
#Program the memory
|
|
|
bash write_memory.sh
|
bash write_memory.sh
|
|
|
|
|
#Enable the cpu
|
#Enable the cpu
|
$JTAG_INTFC -n 127 -d "I:1,D:2:0,I:0"
|
\$JTAG_INTFC -t $chain -n 127 -d \"I:1,D:2:0,I:0\"
|
# I:1 set jtag_enable in active mode
|
# I:1 set jtag_enable in active mode
|
# D:2:0 load jtag_enable data register with 0x0 reset=0 disable=0
|
# D:2:0 load jtag_enable data register with 0x0 reset=0 disable=0
|
# I:0 set jtag_enable in bypass mode
|
# I:0 set jtag_enable in bypass mode
|
';
|
";
|
return $string;
|
return $string;
|
|
|
}
|
}
|
|
|
|
|
|
sub soc_gen_top_ip{
|
|
my $soc=shift;
|
############
|
my $top_ip=ip_gen->top_gen_new();
|
# main
|
|
############
|
|
sub socgen_main{
|
|
|
|
my $infc = interface->interface_new();
|
|
my $ip = ip->lib_new ();
|
my $ip = ip->lib_new ();
|
my $soc = soc->soc_new();
|
my $intfc=interface->interface_new();
|
set_gui_status($soc,"ideal",0);
|
my @instances=$soc->soc_get_all_instances();
|
|
my $wires=soc->new_wires();
|
#my $soc= eval { do 'lib/soc/soc.SOC' };
|
foreach my $id (@instances){
|
#message_dialog("$ENV{'PRONOC_WORK'}\n");
|
my ($param_v, $local_param_v, $wire_def_v, $inst_v, $plugs_assign_v, $sockets_assign_v,$io_full_v,$io_top_full_v,$io_sim_v,
|
|
$top_io_short,$param_as_in_v,$param_pass_v,$system_v,$assigned_ports,$top_io_pass,$src_io_short, $src_io_full)=gen_module_inst($id,$soc,$top_ip,$intfc,$wires);
|
# main window
|
} #$id
|
#my $window = def_win_size(1000,800,"Top");
|
return $top_ip;
|
# The main table containg the lib tree, selected modules and info section
|
}
|
my $main_table = Gtk2::Table->new (20, 12, FALSE);
|
|
|
|
# The box which holds the info, warning, error ... mesages
|
|
my ($infobox,$info)= create_text();
|
|
|
|
|
|
my $refresh_dev_win = Gtk2::Button->new_from_stock('ref');
|
|
|
|
# A tree view for holding a library
|
|
my $tree_box = create_tree ($info,$ip,$soc);
|
|
|
|
|
|
|
|
$main_table->set_row_spacings (4);
|
|
$main_table->set_col_spacings (1);
|
|
|
|
my $device_win=show_active_dev($soc,$ip,$infc,\$refresh_dev_win,$info);
|
|
|
|
|
|
my $generate = def_image_button('icons/gen.png','Generate RTL');
|
sub get_soc_clk_source_list{
|
my $compile = def_image_button('icons/gate.png','Compile RTL');
|
my $soc=shift;
|
my $software = def_image_button('icons/binary.png','Software');
|
my %all_sources;
|
my $diagram = def_image_button('icons/diagram.png','Diagram');
|
my $top = soc_gen_top_ip($soc);
|
my $unset = def_image_button('icons/intfc.png','Unset Intfc.');
|
my @intfcs=$top->top_get_intfc_list();
|
|
my @sources=('clk','reset');
|
|
foreach my $intfc (@intfcs){
|
|
my($type,$name,$num)= split("[:\[ \\]]", $intfc);
|
|
foreach my $s (@sources){
|
|
if ($intfc =~ /plug:$s/){
|
|
my @ports=$top->top_get_intfc_ports_list($intfc);
|
|
$all_sources{$s}=\@ports;
|
|
}
|
|
}
|
|
}
|
|
return %all_sources;
|
|
}
|
|
|
my $ram = def_image_button('icons/RAM.png','Memory');
|
sub check_soc_name{
|
|
my $name=shift;
|
|
$name="" if (!defined $name);
|
|
if (length($name)==0){
|
|
message_dialog("Please define the Tile name!");
|
|
return 1;
|
|
}
|
|
|
|
my @tmp=split('_',$name);
|
|
if ( $tmp[-1] =~ /^[0-9]+$/ ){
|
|
message_dialog("The soc name must not end with '_number'!");
|
|
return 1;
|
|
}
|
|
|
|
my $error = check_verilog_identifier_syntax($name);
|
|
if ( defined $error ){
|
|
message_dialog("The \"$name\" is given with an unacceptable formatting. This name will be used as top level Verilog module name so it must follow Verilog identifier declaration formatting:\n $error");
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
############
|
|
# main
|
|
############
|
|
|
|
|
my $wb = def_image_button('icons/setting.png','WB addr');
|
|
|
|
|
sub soc_clk_setting_win1 {
|
|
my ($soc,$info)=@_;
|
|
my $window = def_popwin_size(80,80,"CLK setting",'percent');
|
|
|
|
my $next=def_image_button('icons/right.png','Next');
|
|
my $mtable = def_table(10, 1, FALSE);
|
|
#get the list of all tiles clk sources
|
|
|
my $open = def_image_button('icons/browse.png','Load Tile');
|
|
|
|
|
|
my $entry=gen_entry_object($soc,'soc_name',undef,undef,undef,undef);
|
my $table = def_table(10, 7, FALSE);
|
my $entrybox=labele_widget_info(" Tile name:",$entry);
|
my($row,$column)=(0,0);
|
|
|
|
my %all = get_soc_clk_source_list($soc) ;
|
|
my @ports = @{$all{'clk'}} if defined $all{'clk'};
|
|
my $n=0;
|
|
foreach my $p (@ports){
|
|
my $r_lab=gen_label_in_center("$p:");
|
|
$table->attach ($r_lab,$column,$column+1,$row,$row+1,'fill','shrink',2,2);$column+=1;
|
|
$soc->object_add_attribute('SOURCE_SET',"clk_${n}_name",$p);
|
|
($column,$row)=get_clk_constrain_widget($soc,$table,$column,$row,'clk',$n);
|
|
$n++;
|
|
}
|
|
|
#$table->attach_defaults ($event_box, $col, $col+1, $row, $row+1);
|
$mtable->attach_defaults($table,0,1,0,1);
|
|
$mtable->attach($next,0,1,20,21,'expand','fill',2,2);
|
|
$window->add ($mtable);
|
|
$window->show_all();
|
|
$next-> signal_connect("clicked" => sub{
|
|
$window->destroy;
|
|
clk_setting_win2($soc,$info,'soc');
|
|
|
|
});
|
|
|
|
|
|
|
#$main_table->attach_defaults ($tree_box , 0, 2, 0, 17);
|
|
#$main_table->attach_defaults ($device_win , 2, 12, 0, 17);
|
|
#$main_table->attach_defaults ($infobox , 0, 12, 17,19);
|
|
|
|
|
}
|
|
|
my $h1=gen_hpaned($tree_box,.15,$device_win);
|
|
my $v2=gen_vpaned($h1,.55,$infobox);
|
|
$main_table->attach_defaults ($v2 , 0, 12, 0,19);
|
|
|
|
|
######
|
|
# ctrl
|
|
######
|
|
|
|
sub soc_ctrl_tab {
|
|
my ($soc,$info,$ip)=@_;
|
|
|
|
my $generate = def_image_button('icons/gen.png','_Generate RTL',FALSE,1);
|
|
my $compile = def_image_button('icons/gate.png','Compile RTL');
|
|
my $software = def_image_button('icons/binary.png','Software');
|
|
my $diagram = def_image_button('icons/diagram.png','Diagram');
|
|
my $clk= def_image_button('icons/clk.png','CLK setting');
|
|
my $unset = def_image_button('icons/intfc.png','Unset Intfc.');
|
|
|
|
my $ram = def_image_button('icons/RAM.png','Memory');
|
|
my $wb = def_image_button('icons/setting.png','WB addr');
|
|
my $open = def_image_button('icons/browse.png',"_Load Tile",FALSE,1);
|
|
my $entry=gen_entry_object($soc,'soc_name',undef,undef,undef,undef);
|
|
my $entrybox=gen_label_info(" Tile name:",$entry);
|
|
my $save = def_image_button('icons/save.png');
|
|
my $open_dir = def_image_button('icons/open-folder.png');
|
|
set_tip($save, "Save current tile configuration setting");
|
|
set_tip($open_dir, "Open target tile folder");
|
|
|
|
$entrybox->pack_start( $save, FALSE, FALSE, 0);
|
|
$entrybox->pack_start( $open_dir, FALSE, FALSE, 0);
|
|
|
|
my $main_table = def_table (1, 12, FALSE);
|
|
|
|
$main_table->attach ($open , 0, 1, 0,1,'expand','shrink',2,2);
|
|
$main_table->attach ($entrybox , 1, 3, 0,1,'expand','shrink',2,2);
|
|
$main_table->attach ($unset , 3, 4, 0,1,'expand','shrink',2,2);
|
|
$main_table->attach ($wb , 4, 5, 0,1,'expand','shrink',2,2);
|
|
$main_table->attach ($diagram , 5, 6, 0,1,'expand','shrink',2,2);
|
|
$main_table->attach ($clk , 6, 7, 0,1,'expand','shrink',2,2);
|
|
$main_table->attach ($generate , 7, 8, 0,1,'expand','shrink',2,2);
|
|
$main_table->attach ($software , 8, 9, 0,1,'expand','shrink',2,2);
|
|
$main_table->attach ($compile ,10,12, 0,1,'expand','shrink',2,2);
|
|
|
$main_table->attach ($open,0, 1, 19,20,'expand','shrink',2,2);
|
|
$main_table->attach_defaults ($entrybox,1, 3, 19,20);
|
|
$main_table->attach ($unset, 3,4, 19,20,'expand','shrink',2,2);
|
|
|
|
$main_table->attach ($wb, 4,6, 19,20,'expand','shrink',2,2);
|
|
$main_table->attach ($diagram, 6, 7, 19,20,'expand','shrink',2,2);
|
|
$main_table->attach ($generate, 7, 8, 19,20,'expand','shrink',2,2);
|
|
$main_table->attach ($software, 8, 9, 19,20,'expand','shrink',2,2);
|
|
#$main_table->attach ($ram, 9, 10, 19,20,'expand','shrink',2,2);
|
|
$main_table->attach ($compile, 10, 12, 19,20,'expand','shrink',2,2);
|
|
|
|
|
$clk-> signal_connect("clicked" => sub{
|
|
soc_clk_setting_win1($soc,$info);
|
|
});
|
|
|
$diagram-> signal_connect("clicked" => sub{
|
$diagram-> signal_connect("clicked" => sub{
|
show_tile_diagram ($soc);
|
show_tile_diagram ($soc);
|
});
|
});
|
|
|
|
|
$generate-> signal_connect("clicked" => sub{
|
$save-> signal_connect("clicked" => sub{
|
my $name=$soc->object_get_attribute('soc_name');
|
my $name=$soc->object_get_attribute('soc_name');
|
|
return if(check_soc_name($name)) ;
|
|
|
if (length($name)==0){
|
# Write object file
|
message_dialog("Please define the Tile name!");
|
open(FILE, ">lib/soc/$name.SOC") || die "Can not open: $!";
|
return ;
|
print FILE perl_file_header("$name.SOC");
|
}
|
print FILE Data::Dumper->Dump([\%$soc],['soc']);
|
|
close(FILE) || die "Error closing file: $!";
|
|
message_dialog("Processing Tile \"$name\" is saved as lib/soc/$name.SOC.");
|
|
|
|
});
|
|
|
my @tmp=split('_',$name);
|
|
if ( $tmp[-1] =~ /^[0-9]+$/ ){
|
$generate-> signal_connect("clicked" => sub{
|
message_dialog("The soc name must not end with '_number'!");
|
my $name=$soc->object_get_attribute('soc_name');
|
return ;
|
return if(check_soc_name($name)) ;
|
}
|
|
my $error = check_verilog_identifier_syntax($name);
|
|
if ( defined $error ){
|
|
message_dialog("The \"$name\" is given with an unacceptable formatting. This name will be used as top level verilog module name so it must follow Verilog identifier declaration formatting:\n $error");
|
|
return ;
|
|
}
|
|
|
|
my $target_dir = "$ENV{'PRONOC_WORK'}/SOC/$name";
|
my $target_dir = "$ENV{'PRONOC_WORK'}/SOC/$name";
|
my $hw_dir = "$target_dir/src_verilog";
|
my $hw_dir = "$target_dir/src_verilog";
|
my $sw_path = "$target_dir/sw";
|
my $sw_path = "$target_dir/sw";
|
|
|
Line 1927... |
Line 1806... |
unlink "$hw_dir/file_list";
|
unlink "$hw_dir/file_list";
|
generate_soc($soc,$info,$target_dir,$hw_dir,$sw_path,1,1);
|
generate_soc($soc,$info,$target_dir,$hw_dir,$sw_path,1,1);
|
|
|
my $has_ni= check_for_ni($soc);
|
my $has_ni= check_for_ni($soc);
|
if($has_ni){
|
if($has_ni){
|
my $dialog = Gtk2::MessageDialog->new (my $window,
|
my $message = "Processing Tile \"$name\" has been created successfully at $target_dir/. In order to include this tile in MPSoC Generator you need to restart the ProNoC. Do you ant to reset the ProNoC now?";
|
'destroy-with-parent',
|
my $response = yes_no_dialog ($message);
|
'question', # message type
|
|
'yes-no', # which set of buttons?
|
|
"Processing Tile \"$name\" has been created successfully at $target_dir/. In order to include this tile in MPSoC Generator you need to restar the ProNoC. Do you ant to reset the ProNoC now?");
|
|
my $response = $dialog->run;
|
|
if ($response eq 'yes') {
|
if ($response eq 'yes') {
|
exec($^X, $0, @ARGV);# reset ProNoC to apply changes
|
exec($^X, $0, @ARGV);# reset ProNoC to apply changes
|
}
|
}
|
$dialog->destroy;
|
|
} else {
|
} else {
|
message_dialog("Processing Tile \"$name\" has been created successfully at $target_dir/.");
|
message_dialog("Processing Tile \"$name\" has been created successfully at $target_dir/.");
|
|
|
}
|
}
|
|
|
|
|
|
|
|
|
});
|
});
|
|
|
$software -> signal_connect("clicked" => sub{
|
$software -> signal_connect("clicked" => sub{
|
software_edit_soc($soc);
|
software_edit_soc($soc);
|
|
|
Line 1962... |
Line 1833... |
get_ram_init($soc);
|
get_ram_init($soc);
|
|
|
});
|
});
|
|
|
|
|
|
|
$compile -> signal_connect("clicked" => sub{
|
$compile -> signal_connect("clicked" => sub{
|
$soc->object_add_attribute('compile','compilers',"QuartusII,Verilator,Modelsim");
|
$soc->object_add_attribute('compile','compilers',"QuartusII,Vivado,Verilator,Modelsim");
|
my $name=$soc->object_get_attribute('soc_name');
|
my $name=$soc->object_get_attribute('soc_name');
|
|
$name="" if (!defined $name);
|
if (length($name)==0){
|
if (length($name)==0){
|
message_dialog("Please define the Tile name!");
|
message_dialog("Please define the Tile name!");
|
return ;
|
return ;
|
}
|
}
|
my $target_dir = "$ENV{'PRONOC_WORK'}/SOC/$name";
|
my $target_dir = "$ENV{'PRONOC_WORK'}/SOC/$name";
|
my $hw_dir = "$target_dir/src_verilog";
|
my $hw_dir = "$target_dir/src_verilog";
|
my $sw_path = "$target_dir/sw";
|
my $sw_path = "$target_dir/sw";
|
my $top = "$target_dir/src_verilog/${name}_top.v";
|
my $top = "$target_dir/src_verilog/${name}_top.sv";
|
if (-f $top){
|
if (-f $top){
|
unlink "$hw_dir/file_list";
|
unlink "$hw_dir/file_list";
|
generate_soc($soc,$info,$target_dir,$hw_dir,$sw_path,1,1);
|
generate_soc($soc,$info,$target_dir,$hw_dir,$sw_path,1,1);
|
select_compiler($soc,$name,$top,$target_dir);
|
select_compiler($soc,$name,$top,$target_dir);
|
} else {
|
} else {
|
message_dialog("Cannot find $top file. Please run RTL Generator first!");
|
message_dialog("Cannot find $top file. Please run RTL Generator first!",'error');
|
return;
|
return;
|
}
|
}
|
});
|
});
|
|
|
$wb-> signal_connect("clicked" => sub{
|
$wb-> signal_connect("clicked" => sub{
|
Line 1993... |
Line 1866... |
$open-> signal_connect("clicked" => sub{
|
$open-> signal_connect("clicked" => sub{
|
load_soc($soc,$info,$ip);
|
load_soc($soc,$info,$ip);
|
|
|
});
|
});
|
|
|
my $sc_win = new Gtk2::ScrolledWindow (undef, undef);
|
$open_dir-> signal_connect("clicked" => sub{
|
$sc_win->set_policy( "automatic", "automatic" );
|
my $name=$soc->object_get_attribute('soc_name');
|
$sc_win->add_with_viewport($main_table);
|
$name="" if (!defined $name);
|
|
if (length($name)==0){
|
|
message_dialog("Please define the Tile name!");
|
|
return ;
|
|
}
|
|
my $target_dir = "$ENV{'PRONOC_WORK'}/SOC/$name";
|
|
unless (-d $target_dir){
|
|
message_dialog("Cannot find $target_dir.\n Please run RTL Generator first!",'error');
|
|
return;
|
|
}
|
|
system "xdg-open $target_dir";
|
|
|
|
});
|
|
|
|
return $main_table;
|
|
|
|
}
|
|
|
|
|
|
sub socgen_main{
|
|
|
|
my $infc = interface->interface_new();
|
|
my $ip = ip->lib_new ();
|
|
my $soc = soc->soc_new();
|
|
set_gui_status($soc,"ideal",0);
|
|
|
|
# The main table containing the lib tree, selected modules and info section
|
|
my $main_table = def_table (20, 12, FALSE);
|
|
|
|
# The box which holds the info, warning, error ... messages
|
|
my ($infobox,$info)= create_txview();
|
|
|
|
|
#check soc status every 0.5 second. referesh device table if there is any changes
|
# A tree view for holding a library
|
|
my %tree_text;
|
|
my @categories= $ip->ip_get_categories();
|
|
foreach my $p (@categories)
|
|
{
|
|
#next if ($p eq 'PLL');
|
|
my @modules= $ip->get_modules($p);
|
|
$tree_text{$p}=\@modules;
|
|
}
|
|
my $tree_box = create_tree ($soc,'IP list', $info,\%tree_text,\&show_select_ip_description,\&add_module_to_soc);
|
|
|
|
$main_table->set_row_spacings (4);
|
|
$main_table->set_col_spacings (1);
|
|
|
|
my $device_win=show_active_dev($soc,$ip,$infc,$info);
|
|
|
|
|
|
|
|
|
|
|
|
my $h1=gen_hpaned($tree_box,.15,$device_win);
|
|
my $v2=gen_vpaned($h1,.55,$infobox);
|
|
$main_table->attach_defaults ($v2 , 0, 12, 0,19);
|
|
|
|
my $ctrl = soc_ctrl_tab($soc,$info,$ip);
|
|
$main_table->attach ($ctrl , 0, 12, 19,20,'fill','fill',2,2);
|
|
|
|
|
|
|
|
my $sc_win = add_widget_to_scrolled_win($main_table);
|
|
|
|
|
|
|
|
#check soc status every 0.5 second. refresh device table if there is any changes
|
Glib::Timeout->add (100, sub{
|
Glib::Timeout->add (100, sub{
|
my ($state,$timeout)= get_gui_status($soc);
|
my ($state,$timeout)= get_gui_status($soc);
|
|
|
if ($timeout>0){
|
if ($timeout>0){
|
$timeout--;
|
$timeout--;
|
Line 2017... |
Line 1952... |
print FILE Data::Dumper->Dump([\%$soc],['soc']);
|
print FILE Data::Dumper->Dump([\%$soc],['soc']);
|
close(FILE) || die "Error closing file: $!";
|
close(FILE) || die "Error closing file: $!";
|
set_gui_status($soc,"ideal",0);
|
set_gui_status($soc,"ideal",0);
|
}
|
}
|
elsif( $state ne "ideal" ){
|
elsif( $state ne "ideal" ){
|
$refresh_dev_win->clicked;
|
$device_win->destroy;
|
my $saved_name=$soc->object_get_attribute('soc_name',undef);
|
$device_win=show_active_dev($soc,$ip,$infc,$info);
|
if(defined $saved_name) {$entry->set_text($saved_name);}
|
$h1 -> pack2($device_win, TRUE, TRUE);
|
|
$h1 -> show_all;
|
|
$ctrl->destroy;
|
|
$ctrl= soc_ctrl_tab($soc,$info,$ip);
|
|
$main_table->attach ($ctrl , 0, 12, 19,20,'fill','fill',2,2);
|
|
$main_table->show_all;
|
set_gui_status($soc,"ideal",0);
|
set_gui_status($soc,"ideal",0);
|
}
|
}
|
return TRUE;
|
return TRUE;
|
|
|
} );
|
} );
|
|
|
|
|
|
|
return $sc_win;
|
return $sc_win;
|
#return $main_table;
|
|
|
|
|
|
}
|
}
|
|
|
|
|