OpenCores
URL https://opencores.org/ocsvn/an-fpga-implementation-of-low-latency-noc-based-mpsoc/an-fpga-implementation-of-low-latency-noc-based-mpsoc/trunk

Subversion Repositories an-fpga-implementation-of-low-latency-noc-based-mpsoc

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /an-fpga-implementation-of-low-latency-noc-based-mpsoc/trunk/mpsoc/perl_gui/lib/perl
    from Rev 16 to Rev 17
    Reverse comparison

Rev 16 → Rev 17

/hdr_file_gen.pl
0,0 → 1,92
use lib 'lib/perl';
 
use strict;
use warnings;
use soc;
use ip;
 
 
 
##################
# header file gen
##################
 
 
 
 
sub generate_header_file{
my ($soc)= @_;
my $soc_name=$soc->soc_get_soc_name();
$soc_name = uc($soc_name);
if(!defined $soc_name){$soc_name='soc'};
my @instances=$soc->soc_get_all_instances();
my $system_h="#ifndef $soc_name\_SYSTEM_H\n\t#define $soc_name\_SYSTEM_H\n";
#add_text_to_string(\$system_h, "\n #include <stdio.h> \n #include <stdlib.h> \n #include \"aemb/core.hh\"");
 
 
my $ip = ip->lib_new ();
foreach my $id (@instances){
my $module =$soc->soc_get_module($id);
my $module_name =$soc->soc_get_module_name($id);
my $category =$soc->soc_get_category($id);
my $inst =$soc->soc_get_instance_name($id);
add_text_to_string(\$system_h,"\n \n /* $inst */ \n");
$inst=uc($inst);
# print base address
my @plugs= $soc->soc_get_all_plugs_of_an_instance($id);
foreach my $plug (@plugs){
my @nums=$soc->soc_list_plug_nums($id,$plug);
foreach my $num (@nums){
my ($addr,$base,$end,$name,$connect_id,$connect_socket,$connect_socket_num)=$soc->soc_get_plug($id,$plug,$num);
#wishbone slave address
if((defined $connect_socket) && ($connect_socket eq 'wb_slave')){
#print "$addr,$base,$end,$connect_id,$connect_socket,$connect_socket_num\n";
my $base_hex=sprintf("0X%08x", $base);
my $end_hex=sprintf("0X%08x", $end);
add_text_to_string(\$system_h,"#define $inst\_BASE_ADDR$num \t\t $base_hex\n");
add_text_to_string(\$system_h,"#define $inst\_BASE_ADDR \t\t $inst\_BASE_ADDR0\n") if ($num==0);
}
#intrrupt
if((defined $connect_socket) && ($connect_socket eq 'interrupt_peripheral')){
add_text_to_string(\$system_h,"//intrrupt flag location\n");
add_text_to_string(\$system_h," #define $inst\_INT (1<<$connect_socket_num)\n") if(scalar (@nums)==1);
add_text_to_string(\$system_h," #define $inst\_$num\_INT (1<<$connect_socket_num)\n") if(scalar (@nums)>1);
}
}
}
my $hdr =$ip->ip_get_hdr($category,$module);
if(defined $hdr){
#replace IP name
my $key='\$IP\\\\';
($hdr=$hdr)=~s/$key/$inst/g;
 
$key='\$IP';
($hdr=$hdr)=~s/$key/$inst/g;
#replace BASE addr
$key='\$BASE';
($hdr=$hdr)=~s/$key/$inst\_BASE_ADDR/g;
add_text_to_string(\$system_h,"$hdr\n");
}
}
add_text_to_string(\$system_h,"#endif\n");
return $system_h;
 
}
 
 
1
hdr_file_gen.pl Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: ip.pm =================================================================== --- ip.pm (revision 16) +++ ip.pm (revision 17) @@ -401,13 +401,20 @@ } -sub ip_get_hdl_files{ - my ($self, $category,$module)=@_; +sub ip_get_files{ + my ($self, $category,$module,$list_name)=@_; my @l; - @l=@{$self->{categories}{$category}{names}{$module}{hdl}} if(defined $self->{categories}{$category}{names}{$module}{hdl}); + @l=@{$self->{categories}{$category}{names}{$module}{$list_name}} if(defined $self->{categories}{$category}{names}{$module}{$list_name}); return @l; } + +sub ip_get_unsuded_intfc_ports{ + my ($self, $category,$module)=@_; + return $self->{categories}{$category}{names}{$module}{"unused"}; + +} + sub add_ip{ my ($self,$ipgen) =@_; @@ -452,9 +459,15 @@ my $hdr= $ipgen->ipgen_get_hdr(); $self->{categories}{$category}{names}{$module}{header}=$hdr; - my @hdl_files= $ipgen->ipgen_get_hdl_files_list(); - $self->{categories}{$category}{names}{$module}{hdl}=\@hdl_files; + my @hdl_files= $ipgen->ipgen_get_files_list("hdl_files"); + $self->{categories}{$category}{names}{$module}{"hdl_files"}=\@hdl_files; + my @sw_files= $ipgen->ipgen_get_files_list("sw_files"); + $self->{categories}{$category}{names}{$module}{"sw_files"}=\@sw_files; + $self->{categories}{$category}{names}{$module}{"unused"}=$ipgen->ipgen_get_unused_intfc_ports(); + + + }
/mpsoc_gen.pl
25,7 → 25,7
 
require "widget.pl";
require "mpsoc_verilog_gen.pl";
require "aeMB.pl";
require "hdr_file_gen.pl";
 
 
 
241,7 → 241,7
 
sub get_conflict_decision{
my ($mpsoc,$name,$inserted,$conflicts,$msg,$state)=@_;
$msg="\tThe inserted tiles have been selected previously \"$msg\".\n \t Do u want to remove them for the current soc or 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 $label= gen_label_in_left($msg);
348,7 → 348,7
my @c=get_common_array(\@all_num,\@taken_tiles);
if (scalar @c) {
my $str=join(',', @c);
$conflicts_msg = (defined $conflicts_msg)? "$conflicts_msg, in $p:$str" : "in $p:$str";
$conflicts_msg = (defined $conflicts_msg)? "$conflicts_msg\n\t\t $str->$p" : "$str->$p";
@conflicts= (defined $conflicts_msg)? (@conflicts,@c): @c;
}
}#if
1148,7 → 1148,7
#copy hdl codes in src_verilog
my ($hdl_ref,$warnings)= get_all_hdl_files_list($soc);
my ($hdl_ref,$warnings)= get_all_files_list($soc);
foreach my $f(@{$hdl_ref}){
my $n="$project_dir$f";
if (-f "$n") {
1180,7 → 1180,7
# Write header file
my $file_h=aemb_generate_header($soc);
my $file_h=generate_header_file($soc);
open(FILE, ">lib/verilog/$soc_name.h") || die "Can not open: $!";
print FILE $file_h;
close(FILE) || die "Error closing file: $!";
/soc_gen.pl
10,7 → 10,7
use File::Path;
use File::Find;
use File::Copy;
 
use File::Copy::Recursive qw(dircopy);
use Cwd 'abs_path';
 
 
29,10 → 29,11
 
require "widget.pl";
require "verilog_gen.pl";
require "aeMB.pl";
 
require "hdr_file_gen.pl";
 
 
 
 
sub is_hex {
799,8 → 800,8
 
 
 
sub get_all_hdl_files_list {
my $soc=shift;
sub get_all_files_list {
my ($soc,$list_name)=@_;
my @instances=$soc->soc_get_all_instances();
my $ip = ip->lib_new ();
my @files;
815,11 → 816,11
my $category =$soc->soc_get_category($id);
my $inst =$soc->soc_get_instance_name($id);
my @new=$ip->ip_get_hdl_files( $category,$module);
my @new=$ip->ip_get_files( $category,$module,$list_name);
foreach my $f(@new){
my $n="$project_dir$f";
if (!(-f "$n") && !(-f "$f" )){
$warnings=(defined $warnings)? "$warnings WARNING: Can not find the hdl file \"$f\" which is required for \"$inst\" \n":"WARNING: Can not find the hdl file \"$f\" which is required for \"$inst\"\n ";
if (!(-f "$n") && !(-f "$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 ";
}
873,8 → 874,8
#copy hdl codes in src_verilog
my ($hdl_ref,$warnings)= get_all_hdl_files_list($soc);
foreach my $f(@{$hdl_ref}){
my ($file_ref,$warnings)= get_all_files_list($soc,"hdl_files");
foreach my $f(@{$file_ref}){
my $n="$project_dir$f";
if (-f "$n") {
copy ("$n","$target_dir/src_verilog/lib");
904,22 → 905,42
# Write header file
my $file_h=aemb_generate_header($soc);
# Write header files
my $file_h=generate_header_file($soc);
open(FILE, ">lib/verilog/$name.h") || die "Can not open: $!";
print FILE $file_h;
close(FILE) || die "Error closing file: $!";
copy ("$dir/lib/verilog/$name.h","$target_dir/sw/");
copy ("$dir/lib/verilog/$name.h","$target_dir/sw/");
# Write Software files
($file_ref,$warnings)= get_all_files_list($soc,"sw_files");
foreach my $f(@{$file_ref}){
my $name= basename($f);
my $n="$project_dir$f";
if (-f "$n") { #copy file
copy ("$n","$target_dir/sw");
}elsif(-f "$f" ){
copy ("$f","$target_dir/sw");
}elsif (-d "$n") {#copy folder
dircopy ("$n","$target_dir/sw/$name");
}elsif(-d "$f" ){
dircopy ("$f","$target_dir/sw/$name");
}
}
use File::Copy::Recursive qw(dircopy);
dircopy("$dir/../src_processor/aeMB/compiler","$target_dir/sw/") or die("$!\n");
message_dialog("SoC \"$name\" has been created successfully at $target_dir/ " );
exec($^X, $0, @ARGV);# reset ProNoC to apply changes
}else {
message_dialog("Please define the SoC name!");
/widget.pl
137,7 → 137,22
}
 
##############
# ComboBoxEntry
##############
 
sub gen_combo_entry{
my $list_ref=shift;
my @list=@{$list_ref};
 
my $combo_box_entry = Gtk2::ComboBoxEntry->new_text;
foreach my $p (@list){
$combo_box_entry->append_text($p);
}
$combo_box_entry->set_active(0);
return $combo_box_entry;
}
 
#############
# label
############
/soc.pm
613,4 → 613,28
 
 
 
sub new_wires {
my $class = shift;
my $self;
$self->{assigned_name}={};
bless($self,$class);
return $self;
}
sub wire_add{
my ($self,$name,$filed,$data)=@_;
$self->{assigned_name}{$name}{$filed}=$data;
}
 
sub wire_get{
my ($self,$name,$filed)=@_;
return $self->{assigned_name}{$name}{$filed};
}
 
sub wires_list{
my($self)=shift;
my @list= sort keys $self->{assigned_name};
return @list;
}
 
 
1
/interface_gen.pl
62,6 → 62,13
my $open= def_image_button("icons/select.png","Open");
my $browse= def_image_button("icons/browse.png","Browse");
my $file= $intfc_gen->intfc_get_interface_file();
my $intfc_info= def_image_button("icons/info.png","Description");
$intfc_info->signal_connect("clicked"=> sub{
get_intfc_description($intfc_gen,$soc_state,$info);
});
if(defined $file){$entry->set_text($file);}
show_info(\$info,"Please select the verilog file containig the interface\n");
$browse->signal_connect("clicked"=> sub{
112,10 → 119,11
show_info(\$info,"Please select the verilog file containig the interface\n");
});
$table->attach_defaults ($label, 0, 2 , $row, $row+1);
$table->attach_defaults ($entry, 2, 8 , $row, $row+1);
$table->attach_defaults ($browse, 8, 9, $row, $row+1);
$table->attach_defaults ($open, 9, 10, $row, $row+1);
$table->attach_defaults ($label, 0, 1 , $row, $row+1);
$table->attach_defaults ($entry, 1, 7 , $row, $row+1);
$table->attach_defaults ($browse, 7, 8, $row, $row+1);
$table->attach_defaults ($intfc_info, 8, 9 , $row, $row+1);
#$table->attach_defaults ($open, 9, 10, $row, $row+1);
#$table->attach_defaults ($entry, $col, $col+1, $row, $row+1);
#return $table;
232,7 → 240,7
my $in=$widget->get_active();
if ($in eq 1){
my $connect_type=($porttype eq "input")? "output" : ($porttype eq "output")? "input" : $porttype;
$infc_gen->intfc_add_port($port_id,$porttype,$portrange,$p,$connect_type,$portrange,$p,"concatenate");
$infc_gen->intfc_add_port($port_id,$porttype,$portrange,$p,$connect_type,$portrange,$p,"concatenate","Active low");
284,16 → 292,16
my ($category,$category_entry)=gen_entry_help('Define the Interface category:e.g RAM, wishbone,...');
my $saved_category=$infc_gen->intfc_get_category();
if(defined $saved_category){$category_entry->set_text($saved_category);}
my $intfc_info= def_image_button("icons/info.png","Description");
$table->attach_defaults ($label, 0, 2 , $row, $row+1);
$table->attach_defaults ($combo, 2, 4 , $row,$row+1);
$table->attach_defaults ($port, 4, 6 , $row, $row+1);
$table->attach_defaults ($label2, 6, 7 , $row, $row+1);
$table->attach_defaults ($category, 7, 9 , $row, $row+1);
$table->attach_defaults ($intfc_info, 9, 10 , $row, $row+1);
$table->attach_defaults ($label, 0, 1 , $row, $row+1);
$table->attach_defaults ($combo, 1, 3 , $row,$row+1);
$table->attach_defaults ($port, 3, 4 , $row, $row+1);
$table->attach_defaults ($label2, 4, 5 , $row, $row+1);
$table->attach_defaults ($category, 5, 6 , $row, $row+1);
$combo->signal_connect("changed"=> sub{
my $module= $combo->get_active_text();
$infc_gen->intfc_set_module_name($module);
311,15 → 319,11
$infc_gen->intfc_set_category($name);
});
$intfc_info->signal_connect("clicked"=> sub{
get_intfc_description($infc_gen,$soc_state,$info);
});
}
 
sub interface_type_select {
326,11 → 330,11
my ($infc_gen,$soc_state,$info,$table,$row)=@_;
my $saved_intfc_type= $infc_gen->intfc_get_interface_type();
my $label = gen_label_in_left("Interface name:");
$table->attach_defaults ($label, 0, 2 , $row, $row+1);
my $saved_name=$infc_gen->intfc_get_interface_name();
my $entry=gen_entry($saved_name);
$table->attach_defaults ($entry, 2, 4 , $row, $row+1);
$entry->signal_connect("changed"=>sub{
my $widget=shift;
my $name=$widget->get_text();
342,7 → 346,7
my $saved_connection_num= $infc_gen->intfc_get_connection_num();
my $label2 = gen_label_in_left("Select soket type:");
$table->attach_defaults ($label2, 5, 7 , $row, $row+1);
my @connection_nums=("single connection","multi connection");
my $pos;
if(defined $saved_connection_num){
353,7 → 357,7
$infc_gen->intfc_set_connection_num($connection_nums[0]);
}
my $combo=gen_combo(\@connection_nums,$pos);
$table->attach_defaults ($combo, 7, 9 , $row, $row+1);
$combo->signal_connect("changed"=>sub{
my $widget=shift;
my $connection_num=$widget->get_active_text();
361,14 → 365,30
set_state($soc_state,"refresh",1);
});
$table->attach_defaults ($label, 0, 1 , $row, $row+1);
$table->attach_defaults ($entry, 1, 2 , $row, $row+1);
$table->attach_defaults ($label2, 2, 3 , $row, $row+1);
$table->attach_defaults ($combo, 3, 4 , $row, $row+1);
}
 
sub port_width_repeat{
my ($range,$value)=@_;
$range=remove_all_white_spaces($range);
my ($h,$l)=split(':',$range);
return "$value" if(!defined $h ) ; # port width is 1
return "$value" if($h eq "0" && "$l" eq "0"); # port width is 1
$h=$l if($h eq "0" && "$l" ne "0");
if($h =~ /-1$/){ # the address ranged is endup with -1
$h =~ s/-1$//; # remove -1
return "\{$h\{$value\}\}" if($h =~ /\)$/);
return "\{($h)\{$value\}\}" if($h =~ /[\*\.\+\-\^\%\&]/);
return "\{$h\{$value\}\}";
}
return "\{($h+1){$value}}";
}
 
 
 
375,8 → 395,8
 
sub port_select{
my ($infc_gen,$soc_state,$info,$table,$row)=@_;
my(%types,%ranges,%names,%connect_types,%connect_ranges,%connect_names,%outport_types);
$infc_gen->intfc_get_ports(\%types,\%ranges,\%names,\%connect_types,\%connect_ranges,\%connect_names,\%outport_types);
my(%types,%ranges,%names,%connect_types,%connect_ranges,%connect_names,%outport_types,%default_outs);
$infc_gen->intfc_get_ports(\%types,\%ranges,\%names,\%connect_types,\%connect_ranges,\%connect_names,\%outport_types,\%default_outs);
 
my $size = keys %types;
if($size >0){
384,8 → 404,8
$table->attach_defaults ($sep, 0, 10 , $row, $row+1); $row++;
my $swap= def_image_button("icons/swap.png");
$table->attach_defaults ($swap, 4, 6 , $row, $row+1);
my $swap= def_image_button("icons/swap.png","swap");
$swap->signal_connect('clicked'=>sub{
my $type=$infc_gen->intfc_get_interface_type();
if($type eq 'plug'){
417,12 → 437,13
}
my $sep2 = Gtk2::HSeparator->new;
$table->attach_defaults ($lab1, 2, 3 , $row, $row+1);
$table->attach_defaults ($lab2, 7, 8 , $row, $row+1); $row++;
my $sep2 = Gtk2::HSeparator->new;
$table->attach_defaults ($sep2, 0, 10 , $row, $row+1); $row++;
$table->attach_defaults ($lab1, 1, 2 , $row, $row+1);
$table->attach_defaults ($swap, 3, 4 , $row, $row+1);
$table->attach_defaults ($lab2, 5, 6 , $row, $row+1); $row++;
$table->attach_defaults ($sep2, 0, 9 , $row, $row+1); $row++;
my $lab3= gen_label_in_center("Type");
429,16 → 450,16
my $lab4= gen_label_in_center("Range");
my $lab5= gen_label_in_center("Name");
$table->attach_defaults ($lab3, 0, 1 , $row, $row+1);
$table->attach_defaults ($lab4, 1, 3 , $row, $row+1);
$table->attach_defaults ($lab5, 3, 5 , $row, $row+1);
$table->attach_defaults ($lab4, 1, 2 , $row, $row+1);
$table->attach_defaults ($lab5, 2, 3 , $row, $row+1);
my $lab6= gen_label_in_center("Type");
my $lab7= gen_label_in_center("Range");
my $lab8= gen_label_in_center("Name");
$table->attach_defaults ($lab6, 5, 6 , $row, $row+1);
$table->attach_defaults ($lab7, 6, 8 , $row, $row+1);
$table->attach_defaults ($lab8, 8, 9 , $row, $row+1);
my $lab9= gen_label_help ("will be added later!","output type");
#$table->attach_defaults ($lab9, 9, 10 , $row, $row+1);
$table->attach_defaults ($lab6, 4, 5 , $row, $row+1);
$table->attach_defaults ($lab7, 5, 6 , $row, $row+1);
$table->attach_defaults ($lab8, 6, 7 , $row, $row+1);
my $lab9= gen_label_help ("When an IP core does not have any of interface output port, the default value will be send to the IP core's input port which is supposed to be connected to that port","Output port Default ");
$table->attach_defaults ($lab9, 8, 9 , $row, $row+1);
$row++;
foreach my $id (sort keys %ranges){
449,8 → 470,15
my $connect_range=$connect_ranges{$id};
my $connect_name=$connect_names{$id};
my $outport_type=$outport_types{$id};
my $box=def_hbox(FALSE,0);
my $default_out=$default_outs{$id};
if(! defined $default_out){
$default_out = "Active low"; # port_width_repeat($connect_range,"1\'b0");
$infc_gen->intfc_add_port($id,$type,$range,$name,$connect_type,$connect_range,$connect_name,$outport_type,$default_out);
print "\$default_out is set to: $default_out\n ";
}
#my $box=def_hbox(FALSE,0);
my @ports_type=("input","output","inout");
my $pos=get_scolar_pos($type,@ports_type);
my $combo1=gen_combo(\@ports_type,$pos);
461,39 → 489,51
my $entry4=gen_entry($connect_range);
my $entry5=gen_entry($connect_name);
my @outport_types=("shared","concatenate");
my $pos2=get_scolar_pos($outport_type,@outport_types);
my $pos2=get_scolar_pos($outport_type,@outport_types);
my $combo2=gen_combo(\@outport_types,$pos2);
$box->pack_start($entry3,FALSE,FALSE,3);
$box->pack_start($separator,FALSE,FALSE,3);
#my @list=(port_width_repeat($range,"1\'b0"),port_width_repeat($range,"1\'b1"),port_width_repeat($range,"1\'bx"));
my @list=("Active low","Active high","Don't care");
my $combentry=gen_combo_entry(\@list);
$pos2=get_scolar_pos($default_out,@list);
if( defined $pos2){
$combentry->set_active($pos2);
} else {
($combentry->child)->set_text($default_out);
}
#$box->pack_start($entry3,TRUE,FALSE,3);
#$box->pack_start($separator,TRUE,FALSE,3);
$table->attach_defaults ($combo1, 0, 1 , $row, $row+1);
$table->attach_defaults ($entry2, 1, 3 , $row, $row+1);
$table->attach_defaults ($box, 3, 5 , $row, $row+1);
$table->attach_defaults ($entry2, 1, 2 , $row, $row+1);
$table->attach_defaults ($entry3, 2, 3 , $row, $row+1);
$table->attach_defaults ($connect_type_lable, 5, 6 , $row, $row+1);
$table->attach_defaults ($entry4, 6, 8 , $row, $row+1);
$table->attach_defaults ($entry5, 8, 9 , $row, $row+1);
#$table->attach_defaults ($combo2, 9, 10 , $row, $row+1);
$table->attach_defaults ($connect_type_lable, 4, 5 , $row, $row+1);
$table->attach_defaults ($entry4, 5, 6 , $row, $row+1);
$table->attach_defaults ($entry5, 6, 7 , $row, $row+1);
$table->attach_defaults ($combentry, 8, 9 , $row, $row+1);
$combo1->signal_connect("changed"=>sub{
my $new_type=$combo1->get_active_text();
my $new_connect_type=($new_type eq "input")? "output" : ($new_type eq "output")? "input" : $new_type;
$infc_gen->intfc_add_port($id,$new_type,$range,$name,$new_connect_type,$connect_range,$connect_name,$outport_type);
$infc_gen->intfc_add_port($id,$new_type,$range,$name,$new_connect_type,$connect_range,$connect_name,$outport_type,$default_out);
set_state($soc_state,"refresh",1);
});
$entry2->signal_connect("changed"=>sub{
$range=$entry2->get_text();
$infc_gen->intfc_add_port($id,$type,$range,$name,$connect_type,$connect_range,$connect_name,$outport_type);
$infc_gen->intfc_add_port($id,$type,$range,$name,$connect_type,$connect_range,$connect_name,$outport_type,$default_out);
set_state($soc_state,"refresh",50);
});
$entry3->signal_connect("changed"=>sub{
$name=$entry3->get_text();
$infc_gen->intfc_add_port($id,$type,$range,$name,$connect_type,$connect_range,$connect_name,$outport_type);
$infc_gen->intfc_add_port($id,$type,$range,$name,$connect_type,$connect_range,$connect_name,$outport_type,$default_out);
set_state($soc_state,"refresh",50);
});
500,24 → 540,32
$entry4->signal_connect("changed"=>sub{
$connect_range=$entry4->get_text();
$infc_gen->intfc_add_port($id,$type,$range,$name,$connect_type,$connect_range,$connect_name,$outport_type);
$infc_gen->intfc_add_port($id,$type,$range,$name,$connect_type,$connect_range,$connect_name,$outport_type,$default_out);
set_state($soc_state,"refresh",50);
});
$entry5->signal_connect("changed"=>sub{
$connect_name=$entry5->get_text();
$infc_gen->intfc_add_port($id,$type,$range,$name,$connect_type,$connect_range,$connect_name,$outport_type);
$infc_gen->intfc_add_port($id,$type,$range,$name,$connect_type,$connect_range,$connect_name,$outport_type,$default_out);
set_state($soc_state,"refresh",50);
});
$combo2->signal_connect("changed"=>sub{
my $new_outport_type=$combo2->get_active_text();
$infc_gen->intfc_add_port($id,$type,$range,$name,$connect_type,$connect_range,$connect_name,$new_outport_type);
$infc_gen->intfc_add_port($id,$type,$range,$name,$connect_type,$connect_range,$connect_name,$new_outport_type,$default_out);
set_state($soc_state,"refresh",1);
});
($combentry->child)->signal_connect('changed' => sub {
my ($entry) = @_;
$default_out=$entry->get_text();
$infc_gen->intfc_add_port($id,$type,$range,$name,$connect_type,$connect_range,$connect_name,$outport_type,$default_out);
});
$row++;
574,9 → 622,9
$scrolled_win->add_with_viewport($dev_table);
$dev_table->show;
$scrolled_win->show_all;
#print "llllllllllllllllllllllllllllllllllllll\n";
});
#$box->attach_defaults ($dev_table, 0, 1, 0, 1);#$box->pack_start( $dev_table, FALSE, FALSE, 3);
#$box->show_all;
620,6 → 668,7
#store \%$intfc_gen, "lib/$name.ITC";
my $message="Interface $name has been generated successfully" ;
message_dialog($message);
exec($^X, $0, @ARGV);# reset ProNoC to apply changes
#$hashref = retrieve('file');
}else{
my $message="Category must be defined!";
667,9 → 716,40
 
 
 
sub load_interface{
my ($intfc_gen,$soc_state)=@_;
my $file;
my $dialog = Gtk2::FileChooserDialog->new(
'Select a File', undef,
'open',
'gtk-cancel' => 'cancel',
'gtk-ok' => 'ok',
);
 
my $filter = Gtk2::FileFilter->new();
$filter->set_name("ITC");
$filter->add_pattern("*.ITC");
$dialog->add_filter ($filter);
my $dir = Cwd::getcwd();
$dialog->set_current_folder ("$dir/lib/interface") ;
 
 
if ( "ok" eq $dialog->run ) {
$file = $dialog->get_filename;
my ($name,$path,$suffix) = fileparse("$file",qr"\..[^.]*$");
if($suffix eq '.ITC'){
$intfc_gen->intfc_set_interface_file($file);
set_state($soc_state,"load_file",0);
}
}
$dialog->destroy;
 
 
}
 
 
 
############
# main
############
681,7 → 761,7
# main window
#my $window = def_win_size(1000,800,"Top");
# The main table containg the lib tree, selected modules and info section
my $main_table = Gtk2::Table->new (15, 12, TRUE);
my $main_table = Gtk2::Table->new (15, 12, FALSE);
# The box which holds the info, warning, error ... mesages
my ($infobox,$info)= create_text();
706,6 → 786,12
$main_table->attach_defaults ($infobox , 0, 12, 12,14);
$main_table->attach_defaults ($genbox , 6, 8, 14,15);
 
 
my $open = def_image_button('icons/browse.png','Load Interface');
my $openbox=def_hbox(TRUE,0);
$openbox->pack_start($open, FALSE, FALSE,0);
$main_table->attach_defaults ($openbox,0, 2, 14,15);
 
#check soc status every 0.5 second. referesh gui if there is any changes
Glib::Timeout->add (100, sub{
732,10 → 818,17
return TRUE;
} );
$open-> signal_connect("clicked" => sub{
load_interface($intfc_gen,$soc_state);
});
$generate-> signal_connect("clicked" => sub{
if( check_intfc($intfc_gen)) {generate_lib($intfc_gen);}
if( check_intfc($intfc_gen)) {
generate_lib($intfc_gen);
}
$refresh->clicked;
/intfc_gen.pm
92,7 → 92,7
 
 
sub intfc_add_port{
my ($self,$port_id,$type,$range,$name,$connect_type,$connect_range,$connect_name,$outport_type)=@_;
my ($self,$port_id,$type,$range,$name,$connect_type,$connect_range,$connect_name,$outport_type,$default_out)=@_;
$self->{ports}{$port_id}{name}=$name;
$self->{ports}{$port_id}{range}=$range;
$self->{ports}{$port_id}{type}=$type;
99,11 → 99,12
$self->{ports}{$port_id}{connect_name}=$connect_name;
$self->{ports}{$port_id}{connect_range}=$connect_range;
$self->{ports}{$port_id}{connect_type}=$connect_type;
$self->{ports}{$port_id}{outport_type}=$outport_type;
$self->{ports}{$port_id}{outport_type}=$outport_type;
$self->{ports}{$port_id}{default_out}=$default_out;
}
 
sub intfc_get_ports{
my ($self,$types_ref,$ranges_ref,$names_ref,$connect_types_ref,$connect_ranges_ref,$connect_name_ref,$outport_type_ref)=@_;
my ($self,$types_ref,$ranges_ref,$names_ref,$connect_types_ref,$connect_ranges_ref,$connect_name_ref,$outport_type_ref,$default_out_ref)=@_;
if(exists ($self->{ports})){
foreach my $id (sort keys %{$self->{ports}}){
$types_ref->{$id}=$self->{ports}{$id}{type};
113,6 → 114,7
$connect_ranges_ref->{$id}=$self->{ports}{$id}{connect_range};
$connect_name_ref->{$id}=$self->{ports}{$id}{connect_name};
$outport_type_ref->{$id}=$self->{ports}{$id}{outport_type};
$default_out_ref->{$id}=$self->{ports}{$id}{default_out};
}
}
}
/verilog_gen.pl
31,9 → 31,10
my $body_v;
my ($param_v_all, $local_param_v_all, $wire_def_v_all, $inst_v_all, $plugs_assign_v_all, $sockets_assign_v_all,$io_full_v_all);
my $wires=soc->new_wires();
my $intfc=interface->interface_new();
foreach my $id (@instances){
my ($param_v, $local_param_v, $wire_def_v, $inst_v, $plugs_assign_v, $sockets_assign_v,$io_full_v)=gen_module_inst($id,$soc,\$io_sim_v,\$param_as_in_v,$top_ip);
my ($param_v, $local_param_v, $wire_def_v, $inst_v, $plugs_assign_v, $sockets_assign_v,$io_full_v)=gen_module_inst($id,$soc,\$io_sim_v,\$param_as_in_v,$top_ip,$intfc,$wires);
my $inst = $soc->soc_get_instance_name($id);
add_text_to_string(\$body_v,"/*******************\n*\n*\t$inst\n*\n*\n*********************/\n");
47,7 → 48,7
#print "$param_v $local_param_v $wire_def_v $inst_v $plugs_assign_v $sockets_assign_v $io_full_v";
}
my ($addr_map,$addr_localparam,$module_addr_localparam)= generate_address_cmp($soc);
my ($addr_map,$addr_localparam,$module_addr_localparam)= generate_address_cmp($soc,$wires);
 
#add functions
my $dir = Cwd::getcwd();
57,6 → 58,8
$functions_all="$functions_all $f1 ";
}
close($file1);
my $unused_wiers_v=assign_unconnected_wires($wires,$intfc);
 
my $soc_v = (defined $param_as_in_v )? "module $soc_name #(\n $param_as_in_v\n)(\n$io_sim_v\n);\n": "module $soc_name (\n$io_sim_v\n);\n";
add_text_to_string(\$soc_v,$functions_all);
65,6 → 68,7
add_text_to_string(\$soc_v,$module_addr_localparam);
add_text_to_string(\$soc_v,$io_full_v_all);
add_text_to_string(\$soc_v,$wire_def_v_all);
add_text_to_string(\$soc_v,$unused_wiers_v);
add_text_to_string(\$soc_v,$inst_v_all);
add_text_to_string(\$soc_v,$plugs_assign_v_all);
add_text_to_string(\$soc_v,$sockets_assign_v_all);
73,7 → 77,7
$soc->soc_add_top($top_ip);
#print @assigned_wires;
return "$soc_v";
 
 
84,7 → 88,7
###############
 
sub gen_module_inst {
my ($id,$soc,$io_sim_v,$param_as_in_v,$top_ip)=@_;
my ($id,$soc,$io_sim_v,$param_as_in_v,$top_ip, $intfc,$wires)=@_;
my $module =$soc->soc_get_module($id);
my $module_name =$soc->soc_get_module_name($id);
my $category =$soc->soc_get_category($id);
91,7 → 95,7
my $inst = $soc->soc_get_instance_name($id);
my %params = $soc->soc_get_module_param($id);
my $intfc=interface->interface_new();
my $ip = ip->lib_new ();
my @ports=$ip->ip_list_ports($category,$module);
168,7 → 172,7
$assigned_port="$inst\_$i_type\_$i_name\_$i_num\_$i_port";
#create plug wires
my $wire_string=generate_wire ($range,$assigned_port,$inst,\%params);
my $wire_string=generate_wire ($range,$assigned_port,$inst,\%params,$i_type,$i_name,$i_num,$i_port, $wires);
add_text_to_string(\$wire_def_v,$wire_string);
184,8 → 188,17
#connect plug port to socket port
my $new_range = add_instantc_name_to_parameters(\%params,$inst,$range);
my $connect_port_range=(length($new_range)>1)?"$connect_port\[$new_range\]":$connect_port;
$plugs_assign_v= ($type eq 'input' )? "$plugs_assign_v \tassign $assigned_port = $connect_port_range;\n":
"$plugs_assign_v \tassign $connect_port = $assigned_port;\n";
if($type eq 'input' ){
$plugs_assign_v= "$plugs_assign_v \tassign $assigned_port = $connect_port_range;\n";
$wires->wire_add($assigned_port,"connected",1);
}else{
$plugs_assign_v= "$plugs_assign_v \tassign $connect_port = $assigned_port;\n";
$wires->wire_add($connect_port,"connected",1);
}
 
 
}
}#plug
else{ #socket
197,7 → 210,7
my $name= $soc->soc_get_instance_name($id);
my $joint= "$name\_$i_type\_$i_name\_$v\_$i_port";
my $wire_string=generate_wire ($i_range,"$name\_$i_type\_$i_name\_$v\_$i_port",$inst,\%params);
my $wire_string=generate_wire ($i_range,"$name\_$i_type\_$i_name\_$v\_$i_port",$inst,\%params,$i_type,$i_name,$i_num,$i_port, $wires);
add_text_to_string(\$wire_def_v,$wire_string);
for(my $i=$v-1; $i>=0; $i--) {
204,7 → 217,7
$joint= "$joint ,$name\_$i_type\_$i_name\_$i\_$i_port";
#create socket wires
#create plug wires
my $wire_string=generate_wire ($i_range,"$name\_$i_type\_$i_name\_$i\_$i_port",$inst,\%params);
my $wire_string=generate_wire ($i_range,"$name\_$i_type\_$i_name\_$i\_$i_port",$inst,\%params,$i_type,$i_name,$i_num,$i_port, $wires);
add_text_to_string(\$wire_def_v,$wire_string);
213,8 → 226,17
}
$joint=($v>0)? "\{$joint\}" : "$joint";
my $text=($type eq 'input' )? "\tassign $assigned_port =$joint;\n": "\tassign $joint =$assigned_port;\n";
$wires->wire_add($assigned_port,"connected",1) if($type eq 'input');
if($type ne 'input' ){
my @w=split('\s*,\s*',$joint);
foreach my $q (@w) {
$wires->wire_add($q,"connected",1);
}
}
$joint=($v>0)? "\{ $joint\ }" : "$joint";
my $text=($type eq 'input' )? "\tassign $assigned_port = $joint;\n": "\tassign $joint = $assigned_port;\n";
add_text_to_string(\$sockets_assign_v,$text);
}
227,7 → 249,7
if (++$counter == scalar(@ports)){
if (++$counter == scalar(@ports)){#last port def
$inst_v=($NC eq 'yes')? "$inst_v\t\t.$port()\n": "$inst_v\t\t.$port($assigned_port)\n";
236,13 → 258,19
$inst_v=($NC eq 'yes')? "$inst_v\t\t.$port(),\n":"$inst_v\t\t.$port($assigned_port),\n";
}
if($type ne 'input' && $NC ne 'yes' ){
$wires->wire_add($assigned_port,"connected",1);
}
}
$inst_v="$inst_v\t);\n";
return ($param_v, $local_param_v, $wire_def_v, $inst_v, $plugs_assign_v, $sockets_assign_v,$io_full_v);
326,7 → 354,7
##############
 
sub generate_address_cmp{
my $soc=shift;
my ($soc,$wires)=@_;
my $number=0;
my $addr_mp_v="\n//Wishbone slave address match\n";
my $instance_addr_localparam="\n//Wishbone slave base address based on instance name\n";
352,8 → 380,9
add_text_to_string(\$module_addr_localparam,"\tlocalparam \t$instance_id\_END_ADDR\t=\t$end_hex;\n");
}
my $connect_name=$soc->soc_get_instance_name($connect_id);
$addr_mp_v="$addr_mp_v \tassign $connect_name\_socket_wb_addr_map_0_sel_one_hot[$connect_socket_num\]= (($connect_name\_socket_wb_addr_map_0_grant_addr >= $instance_name\_BASE_ADDR) & ($connect_name\_socket_wb_addr_map_0_grant_addr< $instance_name\_END_ADDR));\n";
my $connect_name=$soc->soc_get_instance_name($connect_id);
$wires->wire_add("$connect_name\_socket_wb_addr_map_0_sel_one_hot","connected",1);
$addr_mp_v="$addr_mp_v \tassign $connect_name\_socket_wb_addr_map_0_sel_one_hot[$connect_socket_num\] = (($connect_name\_socket_wb_addr_map_0_grant_addr >= $instance_name\_BASE_ADDR) & ($connect_name\_socket_wb_addr_map_0_grant_addr< $instance_name\_END_ADDR));\n";
$number++;
}#if
384,21 → 413,77
 
 
sub generate_wire {
my($range,$port_name,$inst_name,$params_ref)=@_;
my($range,$port_name,$inst_name,$params_ref,$i_type,$i_name,$i_num,$i_port, $wires)=@_;
my $wire_string;
my $new_range;
if(length ($range)>1 ){
#replace parameter in range
my $new_range = add_instantc_name_to_parameters($params_ref,$inst_name,$range);
$new_range = add_instantc_name_to_parameters($params_ref,$inst_name,$range);
$wire_string= "\twire\t[ $new_range ] $port_name;\n";
}
else{
$wire_string="\twire\t\t\t $port_name;\n";
}
}
$wires->wire_add("$port_name","range",$new_range);
$wires->wire_add("$port_name","inst_name",$inst_name);
$wires->wire_add("$port_name","i_type",$i_type);
$wires->wire_add("$port_name","i_name",$i_name);
$wires->wire_add("$port_name","i_num",$i_num);
$wires->wire_add("$port_name","i_port",$i_port);
return $wire_string;
}
 
sub port_width_repeat{
my ($range,$value)=@_;
$range=remove_all_white_spaces($range);
my ($h,$l)=split(':',$range);
return "$value" if(!defined $h ) ; # port width is 1
return "$value" if($h eq "0" && "$l" eq "0"); # port width is 1
$h=$l if($h eq "0" && "$l" ne "0");
if($h =~ /-1$/){ # the address ranged is endup with -1
$h =~ s/-1$//; # remove -1
return "\{$h\{$value\}\}" if($h =~ /\)$/);
return "\{($h)\{$value\}\}" if($h =~ /[\*\.\+\-\^\%\&]/);
return "\{$h\{$value\}\}";
}
return "\{($h+1){$value}}";
}
 
sub assign_unconnected_wires{
my($wires,$intfc)=@_;
my $unused_wire_v=undef;
my @all_wires=$wires->wires_list();
foreach my $p (@all_wires ){
if(!defined $wires->wire_get($p,"connected")){ # unconnected wires
# Take default value from interface definition
#$wires->wire_get("$p","inst_name");
my $i_type=$wires->wire_get($p,"i_type");
my $i_name= $wires->wire_get($p,"i_name");
my $i_num=$wires->wire_get($p,"i_num");
my $i_port=$wires->wire_get($p,"i_port");
my $new_range=$wires->wire_get($p,"range");
my ($range,$type,$connect,$default_out) = ($i_type eq "socket" )? $intfc->get_port_info_of_socket($i_name,$i_port):
$intfc->get_port_info_of_plug($i_name,$i_port);
#""Active high","Don't care"
my $default=(!defined $default_out )? port_width_repeat($new_range,"1\'bx"):
($default_out eq 'Active low' )? port_width_repeat($new_range,"1\'b0"):
($default_out eq 'Active high')? port_width_repeat($new_range,"1\'b1"):
($default_out eq 'Don\'t care')? port_width_repeat($new_range,"1\'bx"): $default_out;
$unused_wire_v= "$unused_wire_v \tassign ${p} = $default;\n";
}
}
$unused_wire_v="\n//Take the default value for ports that defined by interfaces but did not assigned to any wires.\n $unused_wire_v\n\n" if(defined $unused_wire_v);
return $unused_wire_v;
 
}
 
 
 
407,7 → 492,6
 
 
 
 
1;
 
 
/interface.pm
133,12 → 133,13
 
 
sub add_port_to_plug{
my($self,$interface,$port,$range,$type,$outport_type,$connect)=@_;
my($self,$interface,$port,$range,$type,$outport_type,$connect,$default_out)=@_;
$self->{plugs}{$interface}{ports}{$port}={};
$self->{plugs}{$interface}{ports}{$port}{range}=$range;
$self->{plugs}{$interface}{ports}{$port}{type}=$type;
$self->{plugs}{$interface}{ports}{$port}{outport_type}=$outport_type;
$self->{plugs}{$interface}{ports}{$port}{connect}=$connect;
$self->{plugs}{$interface}{ports}{$port}{default_out}=$default_out;
}
 
145,34 → 146,38
 
sub get_port_info_of_socket{
my($self,$socket,$port)=@_;
my($range,$type,$connect);
my($range,$type,$connect,$default_out);
if(exists ($self->{sockets}{$socket}{ports}{$port})){
$range=$self->{sockets}{$socket}{ports}{$port}{range};
$type=$self->{sockets}{$socket}{ports}{$port}{type};
$connect=$self->{sockets}{$socket}{ports}{$port}{connect};
$default_out=$self->{sockets}{$socket}{ports}{$port}{default_out};
}
return ($range,$type,$connect);
return ($range,$type,$connect,$default_out);
}
 
sub get_port_info_of_plug{
my($self,$plug,$port)=@_;
my($range,$type,$connect);
my($range,$type,$connect,$default_out);
if(exists ($self->{plugs}{$plug}{ports}{$port})){
$range=$self->{plugs}{$plug}{ports}{$port}{range};
$type=$self->{plugs}{$plug}{ports}{$port}{type};
$connect=$self->{plugs}{$plug}{ports}{$port}{connect};
$default_out=$self->{plugs}{$plug}{ports}{$port}{default_out};
 
}
return ($range,$type,$connect);
return ($range,$type,$connect,$default_out);
}
 
 
sub add_port_to_socket{
my($self,$socket,$port,$range,$type,$outport_type,$connect)=@_;
my($self,$socket,$port,$range,$type,$outport_type,$connect,$default_out)=@_;
$self->{sockets}{$socket}{ports}{$port}={};
$self->{sockets}{$socket}{ports}{$port}{range}=$range;
$self->{sockets}{$socket}{ports}{$port}{type}=$type;
$self->{sockets}{$socket}{ports}{$port}{outport_type}=$outport_type;
$self->{sockets}{$socket}{ports}{$port}{connect}=$connect;
$self->{sockets}{$socket}{ports}{$port}{default_out}=$default_out;
}
 
250,7 → 255,7
my $intfc_category=$infc_gen->intfc_get_category();
my(%types,%ranges,%names,%connect_types,%connect_ranges,%connect_names,%outport_types);
my(%types,%ranges,%names,%connect_types,%connect_ranges,%connect_names,%outport_types,%default_outs);
add_socket($self,$intfc_name,$intfc_info,$intfc_category,$connection_num,$intfc_name);
259,7 → 264,7
add_category($self,$intfc_category,$intfc_name,$intfc_info);
$infc_gen->intfc_get_ports(\%types,\%ranges,\%names,\%connect_types,\%connect_ranges,\%connect_names,\%outport_types);
$infc_gen->intfc_get_ports(\%types,\%ranges,\%names,\%connect_types,\%connect_ranges,\%connect_names,\%outport_types,\%default_outs);
foreach my $id (sort keys %ranges){
my $type=$types{$id};
my $range=$ranges{$id};
268,18 → 273,18
my $connect_range=$connect_ranges{$id};
my $connect_name=$connect_names{$id};
my $outport_type=$outport_types{$id};
my $default_out=$default_outs{$id};
if($intfc_type eq 'plug'){
#my($self,$interface,$port,$range,$type,$outport_type)
add_port_to_plug ($self,$intfc_name,$name,$range,$type,$outport_type,$connect_name);
add_port_to_plug ($self,$intfc_name,$name,$range,$type,$outport_type,$connect_name,$default_out);
#print "add_port_to_plug(\$self,$intfc_name,$name,$range,$type,,$outport_type);\n";
add_port_to_socket ($self,$intfc_name,$connect_name,$connect_range,$connect_type,$outport_type,$name);
add_port_to_socket ($self,$intfc_name,$connect_name,$connect_range,$connect_type,$outport_type,$name,$default_out);
#print "add_port_to_socket(\$self,$connect_name,$connect_range,$connect_type);\n";
}
else{
add_port_to_socket($self,$intfc_name,$name,$range,$type,$outport_type,$connect_name);
add_port_to_plug($self,$intfc_name,$connect_name,$connect_range,$connect_type,$outport_type,$name);
add_port_to_socket($self,$intfc_name,$name,$range,$type,$outport_type,$connect_name,$default_out);
add_port_to_plug($self,$intfc_name,$connect_name,$connect_range,$connect_type,$outport_type,$name,$default_out);
}
}
/ip_gen.pl
25,6 → 25,8
my $most_similar_pos=0;
my $lastsim=0;
my $i=0;
# convert item to lowercase
$item = lc $item;
foreach my $p(@list){
my $similarity= similarity $item, $p;
if ($similarity > $lastsim){
308,23 → 310,25
 
sub select_module{
my ($ipgen,$soc_state,$info,$table,$row)=@_;
my $label= gen_label_in_left(" Select module:");
my $label= gen_label_in_left(" Select\n module:");
my @modules= $ipgen->ipgen_get_module_list();
my $saved_module=$ipgen->ipgen_get_module_name();
my $pos=(defined $saved_module ) ? get_scolar_pos( $saved_module,@modules) : 0;
my $combo = gen_combo(\@modules, $pos);
my $param= def_image_button("icons/setting.png","Parameter\n setting");
my $label2= gen_label_in_left(" Select Category:");
my $def= def_image_button("icons/setting.png","Definition\n file setting");
my $label2= gen_label_in_left(" Select\n Category:");
my ($category,$category_entry)=gen_entry_help('Define the IP category:e.g RAM, GPIO,...');
my $saved_category=$ipgen->ipgen_get_category();
if(defined $saved_category){$category_entry->set_text($saved_category);}
my $ipinfo= def_image_button("icons/info.png","IP Description");
my $header_h= def_image_button("icons/h_file.png","Add Headerfile");
my $lib_hdl= def_image_button("icons/add-notes.png","Add HDL files");
my $ipinfo= def_image_button("icons/info.png"," IP\n Description");
my $header_h= def_image_button("icons/h_file.png","Add Software\n files");
my $lib_hdl= def_image_button("icons/add-notes.png","Add HDL\n files");
$table->attach_defaults ($label, 0, 1 , $row, $row+1);
$table->attach_defaults ($combo, 1, 5 , $row,$row+1);
$table->attach_defaults ($param, 5, 6 , $row, $row+1);
$table->attach_defaults ($combo, 1, 4 , $row,$row+1);
$table->attach_defaults ($param, 4, 6 , $row, $row+1);
#$table->attach_defaults ($def, 5, 6 , $row, $row+1);
$table->attach_defaults ($label2, 6, 7 , $row, $row+1);
$table->attach_defaults ($category, 7, 8 , $row, $row+1);
$table->attach_defaults ($ipinfo, 8, 9 , $row, $row+1);
346,6 → 350,12
});
 
$def->signal_connect("clicked"=> sub{
get_def_setting($ipgen,$soc_state,$info);
});
$category_entry->signal_connect("changed"=> sub{
my $name=$category_entry->get_text();
$ipgen->ipgen_set_category($name);
356,7 → 366,7
});
$header_h->signal_connect("clicked"=> sub{
get_header_file($ipgen,$soc_state,$info);
get_software_file($ipgen,$soc_state,$info);
});
$lib_hdl->signal_connect("clicked"=> sub{
399,8 → 409,12
sub file_info_box {
my($ipgen,$soc_state,$info)=@_;
my $table=def_table(2,11,FALSE);
ip_file_box ($ipgen,$soc_state,$info,$table,0);
select_module($ipgen,$soc_state,$info,$table,1);
my $table1=def_table(1,11,FALSE);
my $table2=def_table(1,11,FALSE);
ip_file_box ($ipgen,$soc_state,$info,$table1,0);
select_module($ipgen,$soc_state,$info,$table2,0);
$table->attach_defaults($table1,0,11,0,1);
$table->attach_defaults($table2,0,11,1,2);
return $table;
521,10 → 535,14
my @widget_type_list=("Fixed","Entry","Combo-box","Spin-button");
my @param_type_list=("localparam-pass", "parameter-pass", "localparam-notpass","parameter-notpass");
my $type_info="Define the parameter type:
\tFixed: The parameter is fixed and get the deafult value. the user can not see or change it.
\tEntry: The parameter value is recived via entry. The user can type anything.
\tCombo-box: The parameter value can be selected from a list of predefined value.
\tSpin-button: The parameter is numeric and will be adjast using spin button.";
 
Fixed: The parameter is fixed and get the default value. Users can not see or change the parameter value.
 
Entry: The parameter value is received via entry. The user can type anything.
 
Combo-box: The parameter value can be selected from a list of predefined value.
 
Spin-button: The parameter is numeric and will be obtained using spin button.";
my $content_info='
For Fixed and Entry leave it empty.
For Combo box define the parameters which must be shown in combo box as: "PAEAMETER1","PARAMETER2"...,"PARAMETERn".
718,6 → 736,36
$window->show_all;
}
 
 
 
 
############
# get_def_setting
##########
sub get_def_setting {
my ($ipgen,$soc_state,$info)=@_;
my $table = Gtk2::Table->new (15, 15, TRUE);
my $table2 = Gtk2::Table->new (15, 15, TRUE);
my $window=def_popwin_size(600,600,"Add definition file");
my $ok=def_image_button("icons/select.png",' Ok ');
my $scrwin= new Gtk2::ScrolledWindow (undef, undef);
$scrwin->set_policy( "automatic", "automatic" );
$scrwin->add_with_viewport($table2);
 
my $label=gen_label_help("You ","Selecet the Verilog file containig the definitions.");
my $brows=def_image_button("icons/browse.png",' Browse');
$table->attach_defaults($label,0,10,0,1);
$table->attach_defaults($brows,10,12,1,2);
$table->attach_defaults($scrwin,0,15,2,14);
$table->attach_defaults($ok,6,9,14,15);
 
$window->add($table);
$window->show_all;
 
 
}
 
 
###########
# get description
#########
759,9 → 807,9
my ($ipgen,$soc_state,$info)=@_;
my $hdr = $ipgen->ipgen_get_hdr();
my $table = Gtk2::Table->new (15, 15, TRUE);
my $window=def_popwin_size(600,600,"Add header file");
#my $window=def_popwin_size(600,600,"Add header file");
my ($scrwin,$text_view)=create_text();
my $ok=def_image_button("icons/select.png",' Ok ');
my $help_text=
'Define the header file for this peripheral device.
You can use two variable $BASEn and $IP.
769,10 → 817,10
during soc generation to system.h. If more than one slave
wishbone bus are used define them as $BASE0, $BASE1 ...
$IP: is the peripheral device name. It is recommended to
add it to the global variables, definitions and functions.
when more than one peripheral device is allowed to be
called in the SoC.
$IP: is the peripheral device name. When more than one
peripheral device is allowed to be called in the SoC, it is
recommended to add $IP to the global variables, definitions
and functions.
header file example
784,25 → 832,22
#define $IP_READ_REG1() $IP_REG_1
';
my $help=gen_label_help($help_text,"Define the header file for this peripheral devive");
my $help=gen_label_help($help_text,"Define the header file for this peripheral device. ");
$table->attach_defaults($help,0,15,0,1);
$table->attach_defaults($scrwin,0,15,1,14);
$table->attach_defaults($ok,6,9,14,15);
my $text_buffer = $text_view->get_buffer;
if(defined $hdr) {$text_buffer->set_text($hdr)};
$ok->signal_connect("clicked"=> sub {
$window->destroy;
my $text = $text_buffer->get_text($text_buffer->get_bounds, TRUE);
$ipgen->ipgen_set_hdr($text);
#print "$text\n";
});
$window->add($table);
$window->show_all();
my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
$scrolled_win->set_policy( "automatic", "automatic" );
$scrolled_win->add_with_viewport($table);
#$window->add($table);
#$window->show_all();
return ($scrolled_win,$text_buffer);
}
 
#############
810,12 → 855,11
############
sub get_hdl_file{
my ($ipgen,$soc_state,$info)=@_;
my $hdr = $ipgen->ipgen_get_hdr();
my $table = Gtk2::Table->new (15, 15, TRUE);
my $window=def_popwin_size(600,600,"Add header file");
my @saved_files=$ipgen->ipgen_get_hdl_files_list();
my $window=def_popwin_size(600,600,"Add HDL file()s");
my @saved_files=$ipgen->ipgen_get_files_list("hdl_files");
my $ok=def_image_button("icons/select.png",' Ok ');
my $scrwin=gen_file_list($ipgen,\@saved_files,$ok);
my $scrwin=gen_file_list($ipgen,"hdl_files",\@saved_files,$ok);
my $label=gen_label_in_left("Selecet the design files you want to include for the IP core");
my $brows=def_image_button("icons/browse.png",' Browse');
846,7 → 890,7
if ( "ok" eq $dialog->run ) {
@files = $dialog->get_filenames;
@saved_files=$ipgen->ipgen_get_hdl_files_list();
@saved_files=$ipgen->ipgen_get_files_list("hdl_files");
foreach my $p (@files){
#remove $project_dir form beginig of each file
$p =~ s/$project_dir//;
853,7 → 897,7
if(! grep (/^$p$/,@saved_files)){push(@saved_files,$p)};
}
$ipgen->ipgen_set_hdl_files_list(\@saved_files);
$ipgen->ipgen_set_files_list("hdl_files",\@saved_files);
$window->destroy;
get_hdl_file($ipgen,$soc_state,$info);
896,7 → 940,7
#########
 
sub gen_file_list{
my ($ipgen,$ref,$ok)=@_;
my ($ipgen,$list_name,$ref,$ok)=@_;
my @files=@{$ref};
my $file_num= scalar @files;
916,9 → 960,9
$table->attach_defaults ($remove, 9,10 , $row, $row+1);
$row++;
$remove->signal_connect("clicked"=> sub {
my @saved_files=$ipgen->ipgen_get_hdl_files_list();
my @saved_files=$ipgen->ipgen_get_files_list($list_name);
@saved_files=remove_scolar_from_array(\@saved_files,$p);
$ipgen->ipgen_set_hdl_files_list(\@saved_files);
$ipgen->ipgen_set_files_list($list_name,\@saved_files);
$entry->destroy;
$remove->destroy;
927,9 → 971,9
if(defined $entry){
my $n= $entry->get_text();
if($p ne $n){
my @saved_files=$ipgen->ipgen_get_hdl_files_list();
my @saved_files=$ipgen->ipgen_get_files_list($list_name);
@saved_files=replace_in_array(\@saved_files,$p, $n);
$ipgen->ipgen_set_hdl_files_list(\@saved_files);
$ipgen->ipgen_set_files_list($list_name,\@saved_files);
}
}
1252,11 → 1296,35
my $name_combo=gen_combo(\@list,$pos);
my $sbox=def_hbox(FALSE,0);
my $widget=gen_spin(1,31,1);
my $widget;
my @l=("Fixed","Parameterizable");
$pos=0;
 
if(!defined $saved_width){
$pos=0;
$saved_width=1;
 
}
else{
if(is_integer($saved_width)){
$pos= 0;
$widget=gen_spin(1,31,1);
$widget->set_value($saved_width);
} else{
$pos= 1;
my @parameters=$ipgen->ipgen_get_all_parameters_list();
my $p=get_scolar_pos($saved_width,@parameters);
 
$widget=gen_combo(\@parameters, $p);
 
}
 
 
}
 
 
my $comb=gen_combo(\@l, $pos);
$widget->set_value($saved_width);
#$widget->set_value($saved_width);
$sbox->pack_start($comb,FALSE,FALSE,3);
$sbox->pack_end($widget,FALSE,FALSE,3);
1320,9 → 1388,11
 
 
 
sub is_integer {
defined $_[0] && $_[0] =~ /^[+-]?\d+$/;
}
 
 
 
#############
# add_intfc_to_ip
##############
1521,7 → 1591,7
if(defined ($name) && defined ($category)){
if (!defined $ip_name) {$ip_name= $name}
#check if any source file has been added for this ip
my @l=$ipgen->ipgen_get_hdl_files_list();
my @l=$ipgen->ipgen_get_files_list("hdl_files");
if( scalar @l ==0){
my $mwindow;
my $dialog = Gtk2::MessageDialog->new ($mwindow,
1537,6 → 1607,7
close(FILE) || die "Error closing file: $!";
my $message="IP $ip_name has been generated successfully" ;
message_dialog($message);
exec($^X, $0, @ARGV);# reset ProNoC to apply changes
}
$dialog->destroy;
 
1550,6 → 1621,7
close(FILE) || die "Error closing file: $!";
my $message="IP $ip_name has been generated successfully" ;
message_dialog($message);
exec($^X, $0, @ARGV);# reset ProNoC to apply changes
}
}else{
my $message;
1569,7 → 1641,7
 
 
#########
#
# load_ip
########
 
sub load_ip{
1606,10 → 1678,273
 
 
 
###########
# get header file
#########
 
sub get_sw_file_folder{
my ($ipgen,$soc_state,$info,$window)=@_;
my @sw_dir = $ipgen->ipgen_get_files_list("sw_files");
my $table = Gtk2::Table->new (15, 15, TRUE);
my $help=gen_label_help("The files and folder that selected here will be copied in genertated processing tile SW folder.");
$table->attach_defaults($help,0,15,0,1);
my $ok=def_image_button("icons/select.png",' Ok ');
my $scrwin=gen_file_list($ipgen,"sw_files",\@sw_dir,$ok);
my $label=gen_label_in_left("Selecet file(s):");
my $brows=def_image_button("icons/browse.png",' Browse');
$table->attach_defaults($label,1,3,1,2);
$table->attach_defaults($brows,3,5,1,2);
my $label2=gen_label_in_left("Selecet folder(s):");
my $brows2=def_image_button("icons/browse.png",' Browse');
$table->attach_defaults($label2,7,9,1,2);
$table->attach_defaults($brows2,9,11,1,2);
my $dir = Cwd::getcwd();
my $project_dir = abs_path("$dir/../../"); #mpsoc directory address
$brows->signal_connect("clicked"=> sub {
my @files;
my $dialog = Gtk2::FileChooserDialog->new(
'Select a File',
undef,
'open',
'gtk-cancel' => 'cancel',
'gtk-ok' => 'ok',
);
my $filter = Gtk2::FileFilter->new();
my $dir = Cwd::getcwd();
$dialog->set_current_folder ("$dir/..") ;
$dialog->set_select_multiple(TRUE);
 
if ( "ok" eq $dialog->run ) {
@files = $dialog->get_filenames;
@sw_dir=$ipgen->ipgen_get_files_list("sw_files");
foreach my $p (@files){
#remove $project_dir form beginig of each file
$p =~ s/$project_dir//;
if(! grep (/^$p$/,@sw_dir)){push(@sw_dir,$p)};
}
$ipgen->ipgen_set_files_list("sw_files",\@sw_dir);
get_software_file($ipgen,$soc_state,$info);
$window->destroy;
#$$entry_ref->set_text($file);
#print "file = $file\n";
}
$dialog->destroy;
 
 
} );# # ,\$entry);
$brows2->signal_connect("clicked"=> sub {
my @files;
my $dialog = Gtk2::FileChooserDialog->new(
'Select Folder(s)',
undef,
'select-folder',
'gtk-cancel' => 'cancel',
'gtk-ok' => 'ok',
);
my $filter = Gtk2::FileFilter->new();
my $dir = Cwd::getcwd();
$dialog->set_current_folder ("$dir/..") ;
$dialog->set_select_multiple(TRUE);
 
if ( "ok" eq $dialog->run ) {
@files = $dialog->get_filenames;
@sw_dir=$ipgen->ipgen_get_files_list("sw_files");
foreach my $p (@files){
#remove $project_dir form beginig of each file
$p =~ s/$project_dir//;
if(! grep (/^$p$/,@sw_dir)){push(@sw_dir,$p)};
}
$ipgen->ipgen_set_files_list("sw_files",\@sw_dir);
get_software_file($ipgen,$soc_state,$info);
$window->destroy;
#$$entry_ref->set_text($file);
#print "file = $file\n";
}
$dialog->destroy;
 
 
} );# # ,\$entry);
$table->attach_defaults($scrwin,0,15,2,15);
#$table->attach_defaults($ok,6,9,14,15);
my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
$scrolled_win->set_policy( "automatic", "automatic" );
$scrolled_win->add_with_viewport($table);
#$window->add($table);
#$window->show_all();
return ($scrolled_win);
}
 
 
 
 
 
sub get_software_file{
my($ipgen,$soc_state,$info)=@_;
 
 
my $notebook = Gtk2::Notebook->new;
#$hbox->pack_start ($notebook, TRUE, TRUE, 0);
 
my($width,$hight)=max_win_size();
my $window = def_popwin_size($width*2/3,$hight*2/3,"Add Software file(s)");
my ($sw_dir)=get_sw_file_folder($ipgen,$soc_state,$info,$window);
$notebook->append_page ($sw_dir,Gtk2::Label->new_with_mnemonic ("_Add file/folder"));
 
my ($hdr_file,$text_buffer)= get_header_file($ipgen,$soc_state,$info);
$notebook->append_page ($hdr_file,Gtk2::Label->new_with_mnemonic ("_Add hedaer file"));
 
 
#my $socgen=socgen_main();
#$notebook->append_page ($socgen,Gtk2::Label->new_with_mnemonic ("_Processing tile generator"));
 
#my $mpsocgen =mpsocgen_main();
#$notebook->append_page ($mpsocgen,Gtk2::Label->new_with_mnemonic ("_NoC based MPSoC generator"));
 
my $table=def_table (15, 15, TRUE);
my $scrolled_win = new Gtk2::ScrolledWindow (undef, undef);
$scrolled_win->set_policy( "automatic", "automatic" );
$scrolled_win->add_with_viewport($table);
 
my $ok=def_image_button("icons/select.png",' Ok ');
$ok->signal_connect("clicked"=> sub {
$window->destroy;
my $text = $text_buffer->get_text($text_buffer->get_bounds, TRUE);
$ipgen->ipgen_set_hdr($text);
#print "$text\n";
});
#$table->attach_defaults ($event_box, $col, $col+1, $row, $row+1);
$table->attach_defaults ($ok , 7, 9, 14, 15);
$table->attach_defaults ($notebook , 0, 15, 0, 14);
#
$window->add($scrolled_win);
$window->show_all;
return $window;
 
 
 
}
 
 
############
# get_unused_intfc_ports_list
###########
 
sub get_unused_intfc_ports_list {
my($intfc,$ipgen,$soc_state,$info)=@_;
my @ports=$ipgen->ipgen_list_ports;
my ($name_ref,$ref)=get_list_of_all_interfaces($ipgen);
my @interfaces_name=@{$name_ref};
my @interfaces=@{$ref};
$ipgen->ipgen_remove_unused_intfc_port( );
foreach my $intfc_name (@interfaces)
{
#print "$intfc_name\n";
my($type,$name,$num)= split("[:\[ \\]]", $intfc_name);
my @all_ports;
if($type eq 'socket'){
@all_ports= $intfc->get_socket_port_list($name);
}elsif($type eq 'plug'){
@all_ports= $intfc->get_plug_port_list($name);
}
foreach my $p(@all_ports){
my $r= check_intfc_port_exits($intfc,$ipgen,$soc_state,$info,$intfc_name,$p);
if ($r eq "0"){
$ipgen->ipgen_add_unused_intfc_port( $intfc_name,$p );
}
}
 
}
}
 
sub check_intfc_port_exits{
my($intfc,$ipgen,$soc_state,$info,$intfc_name,$intfc_port)=@_;
my @ports=$ipgen->ipgen_list_ports;
my $result="0";
foreach my $p( @ports){
my ($range,$type,$assigned_intfc_name,$assigned_intfc_port)=$ipgen->ipgen_get_port($p);
#print "if($intfc_name eq $assigned_intfc_name && $intfc_port eq $assigned_intfc_port);\n";
if($intfc_name eq $assigned_intfc_name && $intfc_port eq $assigned_intfc_port){
if($result eq "1"){# one interface port has been connected to multiple IP port
}
$result = "1";
}
}
return $result;
}
 
 
############
# main
############
sub ipgen_main{
1621,7 → 1956,7
# main window
#my $window = def_win_size(1000,800,"Top");
# The main table containg the lib tree, selected modules and info section
my $main_table = def_table (15, 12, TRUE);
my $main_table = def_table (15, 12, FALSE);
# The box which holds the info, warning, error ... mesages
my ($infobox,$info)= create_text();
1700,6 → 2035,7
});
$generate-> signal_connect("clicked" => sub{
get_unused_intfc_ports_list ($intfc,$ipgen,$soc_state,$info);
generate_ip($ipgen);
$refresh_dev_win->clicked;
1723,3 → 2059,5
 
}
 
 
 
/ip_gen.pm
490,11 → 490,14
 
}
 
sub ipgen_get_hdl_files_list{
my $self=shift;
 
 
 
sub ipgen_get_files_list{
my ($self,$list_name)=@_;
my @l;
if ( defined $self->{hdl_files} ){
@l=@{$self->{hdl_files}};
if ( defined $self->{$list_name} ){
@l=@{$self->{$list_name}};
}
return @l;
501,12 → 504,28
}
 
 
sub ipgen_set_hdl_files_list{
my ($self,$ref)=@_;
$self->{hdl_files}= $ref;
sub ipgen_set_files_list{
my ($self,$list_name,$ref)=@_;
$self->{$list_name}= $ref;
}
 
 
sub ipgen_add_unused_intfc_port{
my ($self,$intfc_name,$port)=@_;
push(@{$self->{unused}{$intfc_name}},$port);
}
 
sub ipgen_get_unused_intfc_ports{
my $self=shift;
return $self->{unused};
}
 
sub ipgen_remove_unused_intfc_port{
my $self=shift;
$self->{unused}=undef;
}
 
######################################
 
 

powered by: WebSVN 2.1.0

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