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

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

[/] [an-fpga-implementation-of-low-latency-noc-based-mpsoc/] [trunk/] [mpsoc/] [perl_gui/] [lib/] [perl/] [mpsoc_verilog_gen.pl] - Diff between revs 54 and 56

Only display areas with differences | Details | Blame | View Log

Rev 54 Rev 56
use strict;
use strict;
use warnings;
use warnings;
use FindBin;
use FindBin;
use lib $FindBin::Bin;
use lib $FindBin::Bin;
 
 
use mpsoc;
use mpsoc;
use soc;
use soc;
use ip;
use ip;
use ip_gen;
use ip_gen;
use Cwd;
use Cwd;
use rvp;
use rvp;
 
 
 
 
sub mpsoc_generate_verilog{
sub mpsoc_generate_verilog{
        my ($mpsoc,$sw_dir,$txview)=@_;
        my ($mpsoc,$sw_dir,$txview)=@_;
        my $mpsoc_name=$mpsoc->object_get_attribute('mpsoc_name');
        my $mpsoc_name=$mpsoc->object_get_attribute('mpsoc_name');
        my $top_ip=ip_gen->top_gen_new();
        my $top_ip=ip_gen->top_gen_new();
 
 
 
 
 
 
 
 
        my $param_as_in_v;
        my $param_as_in_v;
        # generate top 
        # generate top 
 
 
 
 
 
 
        #generate socs_parameter
        #generate socs_parameter
        my $socs_param= gen_socs_param($mpsoc);
        my $socs_param= gen_socs_param($mpsoc);
 
 
        #generate noc_parameter
        #generate noc_parameter
        my ($noc_param,$pass_param)=gen_noc_param_v($mpsoc);
        my ($noc_param,$pass_param)=gen_noc_param_v($mpsoc);
 
 
        #generate the noc
        #generate the noc
        my $noc_v=gen_noc_v($mpsoc,$pass_param);
        my $noc_v=gen_noc_v($mpsoc,$pass_param);
 
 
        #generate socs  
        #generate socs  
        my ($socs_v,$io_short,$io_full,$top_io_short,$top_io_full,$top_io_pass,$href)=gen_socs_v($mpsoc,$top_ip,$sw_dir,$txview);
        my ($socs_v,$io_short,$io_full,$top_io_short,$top_io_full,$top_io_pass,$href)=gen_socs_v($mpsoc,$top_ip,$sw_dir,$txview);
        my %jtag_info=%{$href};
        my %jtag_info=%{$href};
        my $jtag_v=add_jtag_ctrl (\%jtag_info,$txview);
        my $jtag_v=add_jtag_ctrl (\%jtag_info,$txview);
 
 
        my ($clk_set, $clk_io_sim,$clk_io_full, $clk_assigned_port)= get_top_clk_setting($mpsoc);
        my ($clk_set, $clk_io_sim,$clk_io_full, $clk_assigned_port)= get_top_clk_setting($mpsoc);
 
 
        $top_io_short=$top_io_short.",\n$clk_io_sim" if (defined $clk_io_sim);
        $top_io_short=$top_io_short.",\n$clk_io_sim" if (defined $clk_io_sim);
    $top_io_full=$top_io_full."\n$clk_io_full";
    $top_io_full=$top_io_full."\n$clk_io_full";
    $top_io_pass=$top_io_pass.",\n$clk_assigned_port" if (defined $clk_assigned_port);
    $top_io_pass=$top_io_pass.",\n$clk_assigned_port" if (defined $clk_assigned_port);
 
 
        #functions
        #functions
        my $functions=get_functions();
        my $functions=get_functions();
 
        $param_as_in_v = (defined $param_as_in_v)? "$param_as_in_v,\nparameter NOC_ID=0\n" : "parameter NOC_ID=0\n";
        my $global_localparam=get_golal_param_v();
        my $global_localparam=get_golal_param_v();
 
        my $pdef = "`include \"pronoc_def.v\"";
        my $mpsoc_v = (defined $param_as_in_v )? "`timescale     1ns/1ps\nmodule $mpsoc_name\n\t import pronoc_pkg::*;\n\t #(\n $param_as_in_v\n)(\n$io_short\n);\n": "`timescale        1ns/1ps\nmodule $mpsoc_name\n \t import pronoc_pkg::*;\n\t(\n$io_short\n);\n";
        my $mpsoc_v = (defined $param_as_in_v )? " $pdef\nmodule $mpsoc_name\n\t  #(\n $param_as_in_v)(\n$io_short\n);\n\t`NOC_CONF": "$pdef\nmodule $mpsoc_name\n \t (\n$io_short\n);\n\t`NOC_CONF";
        $mpsoc_v=$mpsoc_v. "
        $mpsoc_v=$mpsoc_v. "
$functions
 
$global_localparam
$global_localparam
$socs_param
$socs_param
$io_full
$io_full
$noc_v
$noc_v
$socs_v
$socs_v
endmodule
endmodule
";
";
 
 
 
 
        my $top_v = (defined $param_as_in_v )? "`timescale       1ns/1ps\nmodule ${mpsoc_name}_top #(\n $param_as_in_v\n)(\n$top_io_short\n);\n": "`timescale    1ns/1ps\nmodule ${mpsoc_name}_top (\n $top_io_short\n);\n";
        my $top_v = (defined $param_as_in_v )? "$pdef\nmodule ${mpsoc_name}_top #(\n $param_as_in_v\n)(\n$top_io_short\n);\n": "$pdef\nmodule ${mpsoc_name}_top (\n $top_io_short\n);\n";
 
 
$top_v=$top_v."
$top_v=$top_v."
$global_localparam
$global_localparam
$socs_param
$socs_param
$top_io_full
$top_io_full
$clk_set
$clk_set
$jtag_v
$jtag_v
\t${mpsoc_name} the_${mpsoc_name} (
\t${mpsoc_name} the_${mpsoc_name} (
$top_io_pass
$top_io_pass
 
 
\t);
\t);
endmodule
endmodule
";
";
 
 
 
 
 
 
 
 
 
 
#       my $mp=get_top_ip($mpsoc,'mpsoc');
#       my $mp=get_top_ip($mpsoc,'mpsoc');
 
 
#       mkpath("$dir/lib/ip/mpsoc/",1,01777);   
#       mkpath("$dir/lib/ip/mpsoc/",1,01777);   
#       open(FILE,  ">$dir/lib/ip/mpsoc/MPSOC.IP") || die "Can not open: $!";
#       open(FILE,  ">$dir/lib/ip/mpsoc/MPSOC.IP") || die "Can not open: $!";
#       print FILE perl_file_header("MPSOC.IP");
#       print FILE perl_file_header("MPSOC.IP");
#       print FILE Data::Dumper->Dump([\%$mp],["ipgen"]);
#       print FILE Data::Dumper->Dump([\%$mp],["ipgen"]);
#       close(FILE) || die "Error closing file: $!";
#       close(FILE) || die "Error closing file: $!";
 
 
 
 
#       my ($mp_v,$top_v)=soc_generate_verilog($top_soc,"target_dir/sw1",$txview);
#       my ($mp_v,$top_v)=soc_generate_verilog($top_soc,"target_dir/sw1",$txview);
 
 
 
 
 
 
        #my $ins= gen_mpsoc_instance_v($mpsoc,$mpsoc_name,$param_pass_v);
        #my $ins= gen_mpsoc_instance_v($mpsoc,$mpsoc_name,$param_pass_v);
 
 
        #add_text_to_string(\$top_v,$local_param_v_all."\n".$io_full_v_all);
        #add_text_to_string(\$top_v,$local_param_v_all."\n".$io_full_v_all);
        #add_text_to_string(\$top_v,$ins);
        #add_text_to_string(\$top_v,$ins);
        $mpsoc->object_add_attribute('top_ip',undef,$top_ip);
        $mpsoc->object_add_attribute('top_ip',undef,$top_ip);
 
 
        my @chains = (sort { $b <=> $a } keys  %jtag_info);
        my @chains = (sort { $b <=> $a } keys  %jtag_info);
        $mpsoc->object_add_attribute('JTAG','M_CHAIN',$chains[0]);
        $mpsoc->object_add_attribute('JTAG','M_CHAIN',$chains[0]);
 
 
        return ($mpsoc_v,$top_v,$noc_param);
        return ($mpsoc_v,$top_v,$noc_param);
}
}
 
 
sub add_sources_to_top_ip{
sub add_sources_to_top_ip{
        my ($mpsoc,$top_ip)=@_;
        my ($mpsoc,$top_ip)=@_;
        my $sourc_short;
        my $sourc_short;
        my $source_full="";
        my $source_full="";
        my @sources=('clk','reset');
        my @sources=('clk','reset');
        foreach my $s (@sources){
        foreach my $s (@sources){
                my $num = $mpsoc->object_get_attribute('SOURCE_SET',"${s}_number");
                my $num = $mpsoc->object_get_attribute('SOURCE_SET',"${s}_number");
                $num=1 if (!defined $num);
                $num=1 if (!defined $num);
                for (my $n=0;$n<$num;$n++){
                for (my $n=0;$n<$num;$n++){
                        my $name=$mpsoc->object_get_attribute('SOURCE_SET',"${s}_${n}_name");
                        my $name=$mpsoc->object_get_attribute('SOURCE_SET',"${s}_${n}_name");
                        $name=$s if(!defined $name);
                        $name=$s if(!defined $name);
                        $top_ip->top_add_port('IO',$name,'', 'input' ,"plug:$s\[$n\]","${s}_i");
                        $top_ip->top_add_port('IO',$name,'', 'input' ,"plug:$s\[$n\]","${s}_i");
                        $sourc_short= (defined $sourc_short)? $sourc_short.",\n\t$name" : "\t$name";
                        $sourc_short= (defined $sourc_short)? $sourc_short.",\n\t$name" : "\t$name";
                        #$source_full=$source_full. "// synthesis attribute keep of $name is true;\n" if($s eq 'clk');
                        #$source_full=$source_full. "// synthesis attribute keep of $name is true;\n" if($s eq 'clk');
                        $source_full=$source_full."\tinput $name;\n";
                        $source_full=$source_full."\tinput $name;\n";
                }
                }
                #$top_ip->top_add_port('IO','clk','', 'input' ,'plug:clk[0]','clk_i');
                #$top_ip->top_add_port('IO','clk','', 'input' ,'plug:clk[0]','clk_i');
        }
        }
        return ($sourc_short, $source_full);
        return ($sourc_short, $source_full);
}
}
 
 
 
 
sub get_clk_constrain_file{
sub get_clk_constrain_file{
        my ($self)=@_;
        my ($self)=@_;
        my $s='clk';
        my $s='clk';
        my $num = $self->object_get_attribute('SOURCE_SET',"${s}_number");
        my $num = $self->object_get_attribute('SOURCE_SET',"${s}_number");
        my $top_name=$self->object_get_attribute('mpsoc_name');
        my $top_name=$self->object_get_attribute('mpsoc_name');
        $top_name=$self->object_get_attribute('soc_name') if(!defined $top_name);
        $top_name=$self->object_get_attribute('soc_name') if(!defined $top_name);
        my $xdc="";
        my $xdc="";
        return  if (!defined $num);
        return  if (!defined $num);
        for (my $n=0;$n<$num;$n++){
        for (my $n=0;$n<$num;$n++){
                my $clk_name=$self->object_get_attribute('SOURCE_SET',"${s}_${n}_name");
                my $clk_name=$self->object_get_attribute('SOURCE_SET',"${s}_${n}_name");
                my $period=$self->object_get_attribute('SOURCE_SET',"${s}_${n}_period");
                my $period=$self->object_get_attribute('SOURCE_SET',"${s}_${n}_period");
                my $fall=$self->object_get_attribute('SOURCE_SET',"${s}_${n}_fall");
                my $fall=$self->object_get_attribute('SOURCE_SET',"${s}_${n}_fall");
                my $rise=$self->object_get_attribute('SOURCE_SET',"${s}_${n}_rise");
                my $rise=$self->object_get_attribute('SOURCE_SET',"${s}_${n}_rise");
                my $fal_ns=  ($period * $fall)/100;
                my $fal_ns=  ($period * $fall)/100;
                my $rise_ns= ($period * $rise)/100;
                my $rise_ns= ($period * $rise)/100;
 
 
                $xdc=$xdc."create_clock -period $period -name internal_clk$n -waveform {$rise_ns $fal_ns} -add \[get_nets uut/the_${top_name}/${clk_name}\]\n";
                $xdc=$xdc."create_clock -period $period -name internal_clk$n -waveform {$rise_ns $fal_ns} -add \[get_nets uut/the_${top_name}/${clk_name}\]\n";
 
 
        }
        }
        return $xdc;
        return $xdc;
 
 
}
}
 
 
 
 
 
 
sub add_jtag_ctrl {
sub add_jtag_ctrl {
        my ($ref,$txview)=@_;
        my ($ref,$txview)=@_;
        my %jtag_info=%{$ref};
        my %jtag_info=%{$ref};
 
 
        my $jtag_v="\t//Allow software to remote reset/enable the cpu via jtag
        my $jtag_v="\t//Allow software to remote reset/enable the cpu via jtag
\twire jtag_cpu_en, jtag_system_reset;
\twire jtag_cpu_en, jtag_system_reset;
";
";
        my @chains = (sort { $b <=> $a } keys  %jtag_info);
        my @chains = (sort { $b <=> $a } keys  %jtag_info);
        my $altera=0;
        my $altera=0;
        my $xilinx=0;
        my $xilinx=0;
        my $glob_en;
        my $glob_en;
        foreach my $c (@chains){
        foreach my $c (@chains){
                my $xilinx_jtag_ctrl_in;
                my $xilinx_jtag_ctrl_in;
                my $xilinx_jtag_ctrl_out;
                my $xilinx_jtag_ctrl_out;
                my $r = $jtag_info{$c}{'wire'};
                my $r = $jtag_info{$c}{'wire'};
                my $index = $jtag_info{$c}{'index'};
                my $index = $jtag_info{$c}{'index'};
 
 
                my @array = (defined $r)? @{$r} :();
                my @array = (defined $r)? @{$r} :();
                my $wires_def = join ("\n",@array);
                my $wires_def = join ("\n",@array);
                $jtag_v=$jtag_v."\n//\tJtag chain $c Wire def\n$wires_def\n" if(@array);
                $jtag_v=$jtag_v."\n//\tJtag chain $c Wire def\n$wires_def\n" if(@array);
                $r= $jtag_info{$c}{'altera_num'};
                $r= $jtag_info{$c}{'altera_num'};
                @array = (defined $r)? @{$r} :();
                @array = (defined $r)? @{$r} :();
                my $altera_jtag_ctrl =(@array)? scalar @array : 0;
                my $altera_jtag_ctrl =(@array)? scalar @array : 0;
                $r= $jtag_info{$c}{'xilinx_num'};
                $r= $jtag_info{$c}{'xilinx_num'};
                @array = (defined $r)? @{$r} :();
                @array = (defined $r)? @{$r} :();
                my $xilinx_jtag_ctrl =(@array)? scalar @array : 0;
                my $xilinx_jtag_ctrl =(@array)? scalar @array : 0;
                $altera+=$altera_jtag_ctrl;
                $altera+=$altera_jtag_ctrl;
                $xilinx+=$xilinx_jtag_ctrl;
                $xilinx+=$xilinx_jtag_ctrl;
                if ($xilinx_jtag_ctrl>0){
                if ($xilinx_jtag_ctrl>0){
                        $r=$jtag_info{$c}{'input'};
                        $r=$jtag_info{$c}{'input'};
                        @array = (defined $r)? @{$r} :();
                        @array = (defined $r)? @{$r} :();
                        $xilinx_jtag_ctrl_in = ($xilinx_jtag_ctrl!=1)? '{'.join(',',@array).'}' : $array[0];
                        $xilinx_jtag_ctrl_in = ($xilinx_jtag_ctrl!=1)? '{'.join(',',@array).'}' : $array[0];
                        $r=$jtag_info{$c}{'output'};
                        $r=$jtag_info{$c}{'output'};
                        @array = (defined $r)? @{$r} :();
                        @array = (defined $r)? @{$r} :();
                        $xilinx_jtag_ctrl_out= ($xilinx_jtag_ctrl!=1)? '{'.join(',',@array).'}' : $array[0];
                        $xilinx_jtag_ctrl_out= ($xilinx_jtag_ctrl!=1)? '{'.join(',',@array).'}' : $array[0];
                        my $ctrl = (defined $glob_en)? "
                        my $ctrl = (defined $glob_en)? "
                .system_reset( ),
                .system_reset( ),
                .cpu_en( ),
                .cpu_en( ),
        " : "//The global reset/enable signals are connected to the tap with the largest jtag chain number
        " : "//The global reset/enable signals are connected to the tap with the largest jtag chain number
                .system_reset(jtag_system_reset),
                .system_reset(jtag_system_reset),
                .cpu_en(jtag_cpu_en),
                .cpu_en(jtag_cpu_en),
        ";
        ";
 
 
 
 
 
 
 
 
                        $glob_en=1;
                        $glob_en=1;
                        $jtag_v=$jtag_v."
                        $jtag_v=$jtag_v."
        xilinx_jtag_wb  #(
        xilinx_jtag_wb  #(
                .JTAG_CHAIN($c),
                .JTAG_CHAIN($c),
                .JWB_NUM($xilinx_jtag_ctrl)
                .JWB_NUM($xilinx_jtag_ctrl)
        )
        )
        jwb_$c
        jwb_$c
        (
        (
                $ctrl
                $ctrl
                .reset(jtag_debug_reset_in),
                .reset(jtag_debug_reset_in),
                .wb_to_jtag_all($xilinx_jtag_ctrl_out),
                .wb_to_jtag_all($xilinx_jtag_ctrl_out),
                .jtag_to_wb_all($xilinx_jtag_ctrl_in)
                .jtag_to_wb_all($xilinx_jtag_ctrl_in)
        );
        );
";
";
 
 
 
 
                }
                }
 
 
        }#for
        }#for
 
 
        if($altera>0 && $xilinx>0){
        if($altera>0 && $xilinx>0){
                my $r = $jtag_info{0}{'inst'};
                my $r = $jtag_info{0}{'inst'};
                my @array = (defined $r)? @{$r} :();
                my @array = (defined $r)? @{$r} :();
                my $inst=join ("\n\t",@array);
                my $inst=join ("\n\t",@array);
                add_colored_info($txview,"Found JTAG communication ports from different FPGA vendors:\n$inst.",'red');
                add_colored_info($txview,"Found JTAG communication ports from different FPGA vendors:\n$inst.",'red');
        }
        }
        elsif($altera>0){
        elsif($altera>0){
                $jtag_v=$jtag_v."
                $jtag_v=$jtag_v."
                jtag_system_en #(
                jtag_system_en #(
                        .FPGA_VENDOR(\"ALTERA\")
                        .FPGA_VENDOR(\"ALTERA\")
                ) jtag_en (
                ) jtag_en (
                        .cpu_en(jtag_cpu_en),
                        .cpu_en(jtag_cpu_en),
                        .system_reset(jtag_system_reset)
                        .system_reset(jtag_system_reset)
 
 
                );
                );
        ";
        ";
        }
        }
 
 
        elsif($altera==0 && $xilinx==0){
        elsif($altera==0 && $xilinx==0){
                $jtag_v=$jtag_v."
                $jtag_v=$jtag_v."
        //No jtag connection has found in the design
        //No jtag connection has found in the design
                jtag_system_en #(
                jtag_system_en #(
                        .FPGA_VENDOR(FPGA_VENDOR)
                        .FPGA_VENDOR(FPGA_VENDOR)
                ) jtag_en (
                ) jtag_en (
                        .cpu_en(jtag_cpu_en),
                        .cpu_en(jtag_cpu_en),
                        .system_reset(jtag_system_reset)
                        .system_reset(jtag_system_reset)
 
 
                );
                );
";
";
 
 
 
 
        }
        }
 
 
return $jtag_v;
return $jtag_v;
 
 
}
}
 
 
 
 
 
 
 
 
sub get_functions{
sub get_functions{
        my $p='
        my $p='
//functions
//functions
        function integer log2;
        function integer log2;
                input integer number; begin
                input integer number; begin
                        log2=0;
                        log2=0;
                        while(2**log2<number) begin
                        while(2**log2<number) begin
                                log2=log2+1;
                                log2=log2+1;
                        end
                        end
        end
        end
        endfunction // log2
        endfunction // log2
 
 
        ';
        ';
 
 
        return $p;
        return $p;
}
}
 
 
 
 
sub  gen_socs_param{
sub  gen_socs_param{
        my $mpsoc=shift;
        my $mpsoc=shift;
        my $socs_param="
        my $socs_param="
//SOC parameters\n";
//SOC parameters\n";
        my ($NE, $NR, $RAw,  $EAw, $Fw) = get_topology_info($mpsoc);
        my ($NE, $NR, $RAw,  $EAw, $Fw) = get_topology_info($mpsoc);
        my $processors_en=0;
        my $processors_en=0;
    for (my $tile=0;$tile<$NE;$tile++){
    for (my $tile=0;$tile<$NE;$tile++){
                        my ($soc_name,$n,$soc_num)=$mpsoc->mpsoc_get_tile_soc_name($tile);
                        my ($soc_name,$n,$soc_num)=$mpsoc->mpsoc_get_tile_soc_name($tile);
                        if(defined $soc_name) {
                        if(defined $soc_name) {
                                my $param=      gen_soc_param($mpsoc,$soc_name,$soc_num,$tile);
                                my $param=      gen_soc_param($mpsoc,$soc_name,$soc_num,$tile);
                                $socs_param=$socs_param.$param;
                                $socs_param=$socs_param.$param;
                        }
                        }
        }#$tile
        }#$tile
        $socs_param="$socs_param \n";
        $socs_param="$socs_param \n";
        return $socs_param;
        return $socs_param;
}
}
 
 
 
 
sub  gen_soc_param {
sub  gen_soc_param {
        my ($mpsoc,$soc_name,$soc_num,$tile_num)=@_;
        my ($mpsoc,$soc_name,$soc_num,$tile_num)=@_;
        my $top=$mpsoc->mpsoc_get_soc($soc_name);
        my $top=$mpsoc->mpsoc_get_soc($soc_name);
        my $setting=$mpsoc->mpsoc_get_tile_param_setting($tile_num);
        my $setting=$mpsoc->mpsoc_get_tile_param_setting($tile_num);
        my %params;
        my %params;
        #if ($setting eq 'Custom'){
        #if ($setting eq 'Custom'){
        %params= $top->top_get_custom_soc_param($tile_num);
        %params= $top->top_get_custom_soc_param($tile_num);
        #}else{
        #}else{
        #        %params=$top->top_get_default_soc_param();
        #        %params=$top->top_get_default_soc_param();
        #}
        #}
        my $params="\n\t //Parameter setting for $soc_name  located in tile: $tile_num \n";
        my $params="\n\t //Parameter setting for $soc_name  located in tile: $tile_num \n";
        $params{'CORE_ID'}=$tile_num;
        $params{'CORE_ID'}=$tile_num;
        foreach my $p (get_param_list_in_order(\%params)){
        foreach my $p (get_param_list_in_order(\%params)){
                        $params{$p}=add_instantc_name_to_parameters(\%params,"T$tile_num",$params{$p});
                        $params{$p}=add_instantc_name_to_parameters(\%params,"T$tile_num",$params{$p});
 
 
                        $params="$params\t localparam T${tile_num}_$p=$params{$p};\n";
                        $params="$params\t localparam T${tile_num}_$p=$params{$p};\n";
        }
        }
        return $params;
        return $params;
}
}
 
 
 
 
 
 
sub gen_noc_param_v{
sub gen_noc_param_v{
        my ($mpsoc,$sample)=@_;
        my ($mpsoc,$sample)=@_;
        my $param_v="\n\n//NoC parameters\n";
        my $param_v="\n\n//NoC parameters\n";
        my $pass_param="";
        my $pass_param="";
        my @params=$mpsoc->object_get_attribute_order('noc_param');
        my @params=$mpsoc->object_get_attribute_order('noc_param');
        my $custom_topology = $mpsoc->object_get_attribute('noc_param','CUSTOM_TOPOLOGY_NAME');
        my $custom_topology = $mpsoc->object_get_attribute('noc_param','CUSTOM_TOPOLOGY_NAME');
        my ($NE, $NR, $RAw, $EAw, $Fw) = get_topology_info($mpsoc);
        my ($NE, $NR, $RAw, $EAw, $Fw) = get_topology_info($mpsoc);
        my %noc_info;
        my %noc_info;
        if(defined $sample ){
        if(defined $sample ){
                my $ref=$mpsoc->object_get_attribute($sample,"noc_info");
                my $ref=$mpsoc->object_get_attribute($sample,"noc_info");
                %noc_info= %$ref;
                %noc_info= %$ref;
                ($NE, $NR, $RAw, $EAw, $Fw) = get_topology_info_from_parameters($ref);
                ($NE, $NR, $RAw, $EAw, $Fw) = get_topology_info_from_parameters($ref);
        }
        }
 
 
        foreach my $p (@params){
        foreach my $p (@params){
 
 
                my $val= (defined $sample) ? $noc_info{$p} :$mpsoc->object_get_attribute('noc_param',$p);
                my $val= (defined $sample) ? $noc_info{$p} :$mpsoc->object_get_attribute('noc_param',$p);
                next if($p eq "CUSTOM_TOPOLOGY_NAME");
                next if($p eq "CUSTOM_TOPOLOGY_NAME");
                $val=$custom_topology if($p eq "TOPOLOGY" && $val eq "\"CUSTOM\"");
                $val=$custom_topology if($p eq "TOPOLOGY" && $val eq "\"CUSTOM\"");
                if($p eq 'MCAST_ENDP_LIST'){
                if($p eq 'MCAST_ENDP_LIST'){
 
 
                        $val="$NE".$val;
                        $val="$NE".$val;
                }
                }
                $param_v= $param_v."\tlocalparam $p=$val;\n";
                $param_v= $param_v."\tlocalparam $p=$val;\n";
                $pass_param=$pass_param."\t\t.$p($p),\n";
                $pass_param=$pass_param."\t\t.$p($p),\n";
                #print "$p:$val\n";
                #print "$p:$val\n";
 
 
        }
        }
        my $class=$mpsoc->object_get_attribute('noc_param',"C");
        my $class=$mpsoc->object_get_attribute('noc_param',"C");
        my $str;
        my $str;
        if( $class > 1){
        if( $class > 1){
                for (my $i=0; $i<=$class-1; $i++){
                for (my $i=0; $i<=$class-1; $i++){
                        my $n="Cn_$i";
                        my $n="Cn_$i";
                        my $val=$mpsoc->object_get_attribute('class_param',$n);
                        my $val=$mpsoc->object_get_attribute('class_param',$n);
                        $param_v=$param_v."\tlocalparam $n=$val;\n";
                        $param_v=$param_v."\tlocalparam $n=$val;\n";
                }
                }
                $str="CLASS_SETTING={";
                $str="CLASS_SETTING={";
                for (my $i=$class-1; $i>=0;$i--){
                for (my $i=$class-1; $i>=0;$i--){
                        $str=($i==0)?  "${str}Cn_0};\n " : "${str}Cn_$i,";
                        $str=($i==0)?  "${str}Cn_0};\n " : "${str}Cn_$i,";
                }
                }
        }else {
        }else {
                $str="CLASS_SETTING={V{1\'b1}};\n";
                $str="CLASS_SETTING={V{1\'b1}};\n";
        }
        }
        $param_v=$param_v."\tlocalparam $str";
        $param_v=$param_v."\tlocalparam $str";
        $pass_param=$pass_param."\t\t.CLASS_SETTING(CLASS_SETTING),\n";
        $pass_param=$pass_param."\t\t.CLASS_SETTING(CLASS_SETTING),\n";
        my $v=$mpsoc->object_get_attribute('noc_param',"V")-1;
        my $v=$mpsoc->object_get_attribute('noc_param',"V")-1;
        my $escape=$mpsoc->object_get_attribute('noc_param',"ESCAP_VC_MASK");
        my $escape=$mpsoc->object_get_attribute('noc_param',"ESCAP_VC_MASK");
        if (! defined $escape){
        if (! defined $escape){
                $param_v=$param_v."\tlocalparam [$v     :0] ESCAP_VC_MASK=1;\n";
                $param_v=$param_v."\tlocalparam [$v     :0] ESCAP_VC_MASK=1;\n";
                $pass_param=$pass_param.".\t\tESCAP_VC_MASK(ESCAP_VC_MASK),\n";
                $pass_param=$pass_param.".\t\tESCAP_VC_MASK(ESCAP_VC_MASK),\n";
        }
        }
        $param_v=$param_v." \tlocalparam  CVw=(C==0)? V : C * V;\n";
        $param_v=$param_v." \tlocalparam  CVw=(C==0)? V : C * V;\n";
        $pass_param=$pass_param."\t\t.CVw(CVw)\n";
        $pass_param=$pass_param."\t\t.CVw(CVw)\n";
        return ($param_v,$pass_param);
        return ($param_v,$pass_param);
 
 
}
}
 
 
 
 
sub gen_noc_param_h{
sub gen_noc_param_h{
        my $mpsoc=shift;
        my $mpsoc=shift;
        my $param_h="\n\n//NoC parameters\n";
        my $param_h="\n\n//NoC parameters\n";
 
 
        my $topology = $mpsoc->object_get_attribute('noc_param','TOPOLOGY');
        my $topology = $mpsoc->object_get_attribute('noc_param','TOPOLOGY');
        $topology =~ s/"//g;
        $topology =~ s/"//g;
        $param_h.="\t#define  IS_${topology}\n";
        $param_h.="\t#define  IS_${topology}\n";
 
 
        my ($NE, $NR, $RAw, $EAw, $Fw) = get_topology_info($mpsoc);
        my ($NE, $NR, $RAw, $EAw, $Fw) = get_topology_info($mpsoc);
 
 
 
 
 
 
 
 
        my @params=$mpsoc->object_get_attribute_order('noc_param');
        my @params=$mpsoc->object_get_attribute_order('noc_param');
        my $custom_topology = $mpsoc->object_get_attribute('noc_param','CUSTOM_TOPOLOGY_NAME');
        my $custom_topology = $mpsoc->object_get_attribute('noc_param','CUSTOM_TOPOLOGY_NAME');
        foreach my $p (@params){
        foreach my $p (@params){
                my $val=$mpsoc->object_get_attribute('noc_param',$p);
                my $val=$mpsoc->object_get_attribute('noc_param',$p);
                next if($p eq "CUSTOM_TOPOLOGY_NAME");
                next if($p eq "CUSTOM_TOPOLOGY_NAME");
                $val=$custom_topology if($p eq "TOPOLOGY" && $val eq "\"CUSTOM\"");
                $val=$custom_topology if($p eq "TOPOLOGY" && $val eq "\"CUSTOM\"");
                if($p eq "MCAST_ENDP_LIST" || $p eq "ESCAP_VC_MASK"){
                if($p eq "MCAST_ENDP_LIST" || $p eq "ESCAP_VC_MASK"){
                        $val="$NE".$val if($p eq 'MCAST_ENDP_LIST');
                        $val="$NE".$val if($p eq 'MCAST_ENDP_LIST');
                        $val =~ s/\'/\\\'/g;
                        $val =~ s/\'/\\\'/g;
                        $val="\"$val\"";
                        $val="\"$val\"";
                }
                }
 
 
                $param_h=$param_h."\t#define $p\t$val\n";
                $param_h=$param_h."\t#define $p\t$val\n";
 
 
                #print "$p:$val\n";
                #print "$p:$val\n";
 
 
        }
        }
        my $class=$mpsoc->object_get_attribute('noc_param',"C");
        my $class=$mpsoc->object_get_attribute('noc_param',"C");
        my $str;
        my $str;
        if( $class > 1){
        if( $class > 1){
                for (my $i=0; $i<=$class-1; $i++){
                for (my $i=0; $i<=$class-1; $i++){
                        my $n="Cn_$i";
                        my $n="Cn_$i";
                        my $val=$mpsoc->object_get_attribute('class_param',$n);
                        my $val=$mpsoc->object_get_attribute('class_param',$n);
                        $param_h=$param_h."\t#define $n\t$val\n";
                        $param_h=$param_h."\t#define $n\t$val\n";
                }
                }
                $str="CLASS_SETTING  {";
                $str="CLASS_SETTING  {";
                for (my $i=$class-1; $i>=0;$i--){
                for (my $i=$class-1; $i>=0;$i--){
                        $str=($i==0)?  "${str}Cn_0};\n " : "${str}Cn_$i,";
                        $str=($i==0)?  "${str}Cn_0};\n " : "${str}Cn_$i,";
                }
                }
        }else {
        }else {
                $str="CLASS_SETTING={V{1\'b1}}\n";
                $str="CLASS_SETTING={V{1\'b1}}\n";
        }
        }
        #add_text_to_string (\$param_h,"\t#define $str");
        #add_text_to_string (\$param_h,"\t#define $str");
 
 
        my $v=$mpsoc->object_get_attribute('noc_param',"V")-1;
        my $v=$mpsoc->object_get_attribute('noc_param',"V")-1;
        my $escape=$mpsoc->object_get_attribute('noc_param',"ESCAP_VC_MASK");
        my $escape=$mpsoc->object_get_attribute('noc_param',"ESCAP_VC_MASK");
        if (! defined $escape){
        if (! defined $escape){
                #add_text_to_string (\$param_h,"\tlocalparam [$v        :0] ESCAP_VC_MASK=1;\n");
                #add_text_to_string (\$param_h,"\tlocalparam [$v        :0] ESCAP_VC_MASK=1;\n");
                #add_text_to_string (\$pass_param,".ESCAP_VC_MASK(ESCAP_VC_MASK),\n"); 
                #add_text_to_string (\$pass_param,".ESCAP_VC_MASK(ESCAP_VC_MASK),\n"); 
        }
        }
        #add_text_to_string (\$param_h," \tlocalparam  CVw=(C==0)? V : C * V;\n");
        #add_text_to_string (\$param_h," \tlocalparam  CVw=(C==0)? V : C * V;\n");
        #add_text_to_string (\$pass_param,".CVw(CVw)\n");
        #add_text_to_string (\$pass_param,".CVw(CVw)\n");
 
 
 
 
        #remove 'b and 'h
        #remove 'b and 'h
        #$param_h =~ s/\d\'b/ /g;
        #$param_h =~ s/\d\'b/ /g;
        #$param_h =~ s/\'h/ /g;
        #$param_h =~ s/\'h/ /g;
 
 
        return  $param_h;
        return  $param_h;
}
}
 
 
 
 
 
 
 
 
 
 
sub gen_noc_v{
sub gen_noc_v{
        my ($mpsoc,$pass_param) = @_;
        my ($mpsoc,$pass_param) = @_;
        my ($NE, $NR, $RAw, $EAw, $Fw) = get_topology_info($mpsoc);
        my ($NE, $NR, $RAw, $EAw, $Fw) = get_topology_info($mpsoc);
 
 
 
 
    my $noc_clk   =  $mpsoc->object_get_attribute('SOURCE_SET_CONNECT',"NoC_clk");
    my $noc_clk   =  $mpsoc->object_get_attribute('SOURCE_SET_CONNECT',"NoC_clk");
        my $noc_reset =  $mpsoc->object_get_attribute('SOURCE_SET_CONNECT',"NoC_reset");
        my $noc_reset =  $mpsoc->object_get_attribute('SOURCE_SET_CONNECT',"NoC_reset");
        $noc_clk   = 'clk0'   if(!defined $noc_clk  );
        $noc_clk   = 'clk0'   if(!defined $noc_clk  );
        $noc_reset = 'reset0' if(!defined $noc_reset);
        $noc_reset = 'reset0' if(!defined $noc_reset);
 
 
        my $noc_v="
        my $noc_v="
 
 
        //connection wire to NoC
        //connection wire to NoC
        smartflit_chanel_t ni_chan_in  [NE-1 : 0];
        smartflit_chanel_t ni_chan_in  [NE-1 : 0];
        smartflit_chanel_t ni_chan_out [NE-1 : 0];
        smartflit_chanel_t ni_chan_out [NE-1 : 0];
 
 
        wire                                    noc_clk_in,noc_reset_in;
        wire                                    noc_clk_in,noc_reset_in;
 
 
    //NoC
    //NoC
        noc_top the_noc
        noc_top # (
        (
                .NOC_ID(NOC_ID)
 
        ) the_noc (
                .reset(noc_reset_in),
                .reset(noc_reset_in),
                .clk(noc_clk_in),
                .clk(noc_clk_in),
                .chan_in_all(ni_chan_out),
                .chan_in_all(ni_chan_out),
                .chan_out_all(ni_chan_in),
                .chan_out_all(ni_chan_in),
                .router_event( )
                .router_event( )
        );
        );
 
 
 
 
 
 
 
 
        clk_source  src         (
        clk_source  src         (
                .clk_in($noc_clk),
                .clk_in($noc_clk),
                .clk_out(noc_clk_in),
                .clk_out(noc_clk_in),
                .reset_in($noc_reset),
                .reset_in($noc_reset),
                .reset_out(noc_reset_in)
                .reset_out(noc_reset_in)
        );
        );
";
";
 
 
;
;
        return $noc_v;
        return $noc_v;
 
 
}
}
 
 
 
 
 
 
 
 
sub gen_socs_v{
sub gen_socs_v{
        my ($mpsoc,$top_ip,$sw_dir,$txview)=@_;
        my ($mpsoc,$top_ip,$sw_dir,$txview)=@_;
 
 
        #add clk reset signals
        #add clk reset signals
        my ($sourc_short, $source_full)=add_sources_to_top_ip($mpsoc,$top_ip);
        my ($sourc_short, $source_full)=add_sources_to_top_ip($mpsoc,$top_ip);
 
 
 
 
        my $io_short=$sourc_short;
        my $io_short=$sourc_short;
        my $top_io_short="\tjtag_debug_reset_in";
        my $top_io_short="\tjtag_debug_reset_in";
 
 
 
 
#       my $jtag_def="// Allow software to remote reset/enable the cpu via jtag
#       my $jtag_def="// Allow software to remote reset/enable the cpu via jtag
#\twire jtag_cpu_en, jtag_system_reset; 
#\twire jtag_cpu_en, jtag_system_reset; 
#\twire processors_en_anded_jtag = processors_en & jtag_cpu_en;
#\twire processors_en_anded_jtag = processors_en & jtag_cpu_en;
#       
#       
#";
#";
 
 
        my $io_full=$source_full;
        my $io_full=$source_full;
        my $top_io_full= "\tinput jtag_debug_reset_in;\n";
        my $top_io_full= "\tinput jtag_debug_reset_in;\n";
        my $top_io_pass="//";
        my $top_io_pass="//";
 
 
        my %jtag_info;
        my %jtag_info;
        %jtag_info=append_to_hash (\%jtag_info,0,'wire',"wire processors_en_anded_jtag = processors_en & jtag_cpu_en;\n");
        %jtag_info=append_to_hash (\%jtag_info,0,'wire',"wire processors_en_anded_jtag = processors_en & jtag_cpu_en;\n");
        #my $altera_jtag_ctrl=0;
        #my $altera_jtag_ctrl=0;
        #my $xilinx_jtag_ctrl=0; #if it becomes larger than 0 then add jtag to wb module 
        #my $xilinx_jtag_ctrl=0; #if it becomes larger than 0 then add jtag to wb module 
        #my $jtag_insts="";
        #my $jtag_insts="";
        #my $xilinx_jtag_ctrl_in="";
        #my $xilinx_jtag_ctrl_in="";
        #my $xilinx_jtag_ctrl_out=""; 
        #my $xilinx_jtag_ctrl_out=""; 
 
 
 
 
        my $socs_v="";
        my $socs_v="";
        my ($NE, $NR, $RAw, $EAw, $Fw)= get_topology_info ($mpsoc);
        my ($NE, $NR, $RAw, $EAw, $Fw)= get_topology_info ($mpsoc);
 
 
 
 
        my $processors_en=0;
        my $processors_en=0;
        for (my $tile_num=0;$tile_num<$NE;$tile_num++){
        for (my $tile_num=0;$tile_num<$NE;$tile_num++){
                        my ($soc_name,$n,$soc_num)=$mpsoc->mpsoc_get_tile_soc_name($tile_num);
                        my ($soc_name,$n,$soc_num)=$mpsoc->mpsoc_get_tile_soc_name($tile_num);
 
 
                        if(defined $soc_name) {
                        if(defined $soc_name) {
                                my ($soc_v,$en,$io_short1,$io_full1,$top_io_short1,$top_io_full1,$top_io_pass1,$ref)=
                                my ($soc_v,$en,$io_short1,$io_full1,$top_io_short1,$top_io_full1,$top_io_pass1,$ref)=
                                gen_soc_v($mpsoc,$top_ip,$sw_dir,$soc_name,$tile_num,$soc_num,$txview,\%jtag_info);
                                gen_soc_v($mpsoc,$top_ip,$sw_dir,$soc_name,$tile_num,$soc_num,$txview,\%jtag_info);
                                %jtag_info=%{$ref};
                                %jtag_info=%{$ref};
                                $socs_v=$socs_v.$soc_v;
                                $socs_v=$socs_v.$soc_v;
                                $io_short    = $io_short    .$io_short1;
                                $io_short    = $io_short    .$io_short1;
                                $io_full     = $io_full     .$io_full1;
                                $io_full     = $io_full     .$io_full1;
                                $top_io_short= $top_io_short.$top_io_short1;
                                $top_io_short= $top_io_short.$top_io_short1;
                                $top_io_full = $top_io_full. $top_io_full1;
                                $top_io_full = $top_io_full. $top_io_full1;
                                $top_io_pass = $top_io_pass. $top_io_pass1;
                                $top_io_pass = $top_io_pass. $top_io_pass1;
                        #       $jtag_def    = $jtag_def    .$jtag_def1;
                        #       $jtag_def    = $jtag_def    .$jtag_def1;
                        #       $jtag_insts=$jtag_insts.$jtag_insts1; 
                        #       $jtag_insts=$jtag_insts.$jtag_insts1; 
                        #       $altera_jtag_ctrl+=$altera_jtag_ctrl1;
                        #       $altera_jtag_ctrl+=$altera_jtag_ctrl1;
                        #       $xilinx_jtag_ctrl+=$xilinx_jtag_ctrl1;
                        #       $xilinx_jtag_ctrl+=$xilinx_jtag_ctrl1;
                        #       $xilinx_jtag_ctrl_in =(length ($xilinx_jtag_ctrl_in )>2)? "$xilinx_jtag_ctrl_in,$xilinx_jtag_ctrl_in1"  : $xilinx_jtag_ctrl_in.$xilinx_jtag_ctrl_in1;
                        #       $xilinx_jtag_ctrl_in =(length ($xilinx_jtag_ctrl_in )>2)? "$xilinx_jtag_ctrl_in,$xilinx_jtag_ctrl_in1"  : $xilinx_jtag_ctrl_in.$xilinx_jtag_ctrl_in1;
                        #       $xilinx_jtag_ctrl_out=(length ($xilinx_jtag_ctrl_out)>2)? "$xilinx_jtag_ctrl_out,$xilinx_jtag_ctrl_out1" :$xilinx_jtag_ctrl_out.$xilinx_jtag_ctrl_out1;
                        #       $xilinx_jtag_ctrl_out=(length ($xilinx_jtag_ctrl_out)>2)? "$xilinx_jtag_ctrl_out,$xilinx_jtag_ctrl_out1" :$xilinx_jtag_ctrl_out.$xilinx_jtag_ctrl_out1;
 
 
                                $processors_en|=$en;
                                $processors_en|=$en;
 
 
                        }else{
                        }else{
                                #this tile is not connected to any ip. the noc input ports will be connected to ground
                                #this tile is not connected to any ip. the noc input ports will be connected to ground
                                my $soc_v="\n\n // Tile:$tile_num    is not assigned to any ip\n";
                                my $soc_v="\n\n // Tile:$tile_num    is not assigned to any ip\n";
                                $soc_v="$soc_v
                                $soc_v="$soc_v
 
 
        assign ni_credit_out[$tile_num]={V{1'b0}};
        assign ni_credit_out[$tile_num]={V{1'b0}};
        assign ni_flit_out[$tile_num]={Fw{1'b0}};
        assign ni_flit_out[$tile_num]={Fw{1'b0}};
        assign ni_flit_out_wr[$tile_num]=1'b0;
        assign ni_flit_out_wr[$tile_num]=1'b0;
        ";
        ";
                $socs_v=$socs_v.$soc_v;
                $socs_v=$socs_v.$soc_v;
 
 
                        }
                        }
 
 
        }
        }
 
 
    if($processors_en){
    if($processors_en){
        $io_short=$io_short.",\n\tprocessors_en";
        $io_short=$io_short.",\n\tprocessors_en";
        $io_full=$io_full."\tinput processors_en;";
        $io_full=$io_full."\tinput processors_en;";
        $top_io_short=$top_io_short.",\n\tprocessors_en";
        $top_io_short=$top_io_short.",\n\tprocessors_en";
        $top_io_full=$top_io_full."\t input processors_en;";
        $top_io_full=$top_io_full."\t input processors_en;";
        $top_io_pass=$top_io_pass.",\n\t\t.processors_en(processors_en_anded_jtag)";
        $top_io_pass=$top_io_pass.",\n\t\t.processors_en(processors_en_anded_jtag)";
                $top_ip->top_add_port('IO','processors_en','' ,'input','plug:enable[0]','enable_i');
                $top_ip->top_add_port('IO','processors_en','' ,'input','plug:enable[0]','enable_i');
 
 
    }
    }
 
 
 #  $io_short=$io_short.",\n\tjtag_system_reset";
 #  $io_short=$io_short.",\n\tjtag_system_reset";
 #  $io_full=$io_full."\n\tinput jtag_system_reset;"; 
 #  $io_full=$io_full."\n\tinput jtag_system_reset;"; 
 #  $top_io_pass=$top_io_pass.",\n\t\t.jtag_system_reset(jtag_system_reset)";
 #  $top_io_pass=$top_io_pass.",\n\t\t.jtag_system_reset(jtag_system_reset)";
 
 
 
 
        return ($socs_v,$io_short,$io_full,$top_io_short,$top_io_full,$top_io_pass,\%jtag_info);
        return ($socs_v,$io_short,$io_full,$top_io_short,$top_io_full,$top_io_pass,\%jtag_info);
 
 
}
}
 
 
 
 
 
 
##############
##############
#       gen_soc_v
#       gen_soc_v
##############
##############
 
 
 
 
#$mpsoc,$top_ip,$sw_dir,$soc_name,$id,$soc_num,$txview
#$mpsoc,$top_ip,$sw_dir,$soc_name,$id,$soc_num,$txview
sub   gen_soc_v{
sub   gen_soc_v{
        my ($mpsoc,$top_ip,$sw_path,$soc_name,$tile_num,$soc_num,$txview,$href)=@_;
        my ($mpsoc,$top_ip,$sw_path,$soc_name,$tile_num,$soc_num,$txview,$href)=@_;
        my %jtag_info = %{$href};
        my %jtag_info = %{$href};
 
 
        my $io_short="";
        my $io_short="";
        my $io_full="";
        my $io_full="";
        my $top_io_short="";
        my $top_io_short="";
        my $top_io_full="";
        my $top_io_full="";
        my $top_io_pass="";
        my $top_io_pass="";
 
 
 
 
 
 
        my $processor_en=0;
        my $processor_en=0;
 
 
 
 
 
 
 
 
 
 
        my ($NE, $NR, $RAw, $EAw, $Fw)= get_topology_info ($mpsoc);
        my ($NE, $NR, $RAw, $EAw, $Fw)= get_topology_info ($mpsoc);
        my $e_addr=endp_addr_encoder($mpsoc,$tile_num);
        my $e_addr=endp_addr_encoder($mpsoc,$tile_num);
        my $router_num = get_connected_router_id_to_endp($mpsoc,$tile_num);
        my $router_num = get_connected_router_id_to_endp($mpsoc,$tile_num);
        my $r_addr=router_addr_encoder($mpsoc,$router_num);
        my $r_addr=router_addr_encoder($mpsoc,$router_num);
 
 
 
 
 
 
        my $soc_v="\n\n // Tile:$tile_num ($e_addr)\n   \t$soc_name #(\n";
        my $soc_v="\n\n // Tile:$tile_num ($e_addr)\n   \t$soc_name #(\n";
 
 
        # Global parameter
        # Global parameter
        $soc_v=$soc_v."\t\t.CORE_ID($tile_num),\n\t\t.SW_LOC(\"$sw_path/tile$tile_num\")";
        $soc_v=$soc_v."\t\t.CORE_ID($tile_num),\n\t\t.SW_LOC(\"$sw_path/tile$tile_num\")";
 
 
 
 
        # ni parameter
        # ni parameter
        my $top=$mpsoc->mpsoc_get_soc($soc_name);
        my $top=$mpsoc->mpsoc_get_soc($soc_name);
        my @nis=get_NI_instance_list($top);
        my @nis=get_NI_instance_list($top);
        my @noc_param=$top->top_get_parameter_list($nis[0]);
        my @noc_param=$top->top_get_parameter_list($nis[0]);
        my $inst_name=$top->top_get_def_of_instance($nis[0],'instance');
        my $inst_name=$top->top_get_def_of_instance($nis[0],'instance');
 
 
        #other parameters
        #other parameters
        my %params=$top->top_get_default_soc_param();
        my %params=$top->top_get_default_soc_param();
 
 
 
 
 
 
        foreach my $p (@noc_param){
        foreach my $p (@noc_param){
                my $parm_next = $p;
                my $parm_next = $p;
                $parm_next =~ s/${inst_name}_//;
                $parm_next =~ s/${inst_name}_//;
                my $param=  ",\n\t\t.$p($parm_next)";
                my $param=  ",\n\t\t.$p($parm_next)";
                $soc_v=$soc_v.$param;
                $soc_v=$soc_v.$param;
        }
        }
        foreach my $p (sort keys %params){
        foreach my $p (sort keys %params){
                my $parm_next= "T${tile_num}_$p";
                my $parm_next= "T${tile_num}_$p";
                my $param=  ",\n\t\t.$p($parm_next)";
                my $param=  ",\n\t\t.$p($parm_next)";
                $soc_v=$soc_v.$param;
                $soc_v=$soc_v.$param;
 
 
        }
        }
 
 
        $soc_v=$soc_v."\n\t)the_${soc_name}_$soc_num(\n";
        $soc_v=$soc_v."\n\t)the_${soc_name}_$soc_num(\n";
 
 
        my @intfcs=$top->top_get_intfc_list();
        my @intfcs=$top->top_get_intfc_list();
 
 
        my $i=0;
        my $i=0;
 
 
        my $dir = Cwd::getcwd();
        my $dir = Cwd::getcwd();
        my $mpsoc_name=$mpsoc->object_get_attribute('mpsoc_name');
        my $mpsoc_name=$mpsoc->object_get_attribute('mpsoc_name');
        my $target_dir  = "$ENV{'PRONOC_WORK'}/MPSOC/$mpsoc_name";
        my $target_dir  = "$ENV{'PRONOC_WORK'}/MPSOC/$mpsoc_name";
        my $soc_file="$target_dir/src_verilog/tiles/$soc_name.sv";
        my $soc_file="$target_dir/src_verilog/tiles/$soc_name.sv";
 
 
        my $vdb =read_verilog_file($soc_file);
        my $vdb =read_verilog_file($soc_file);
 
 
        my %soc_localparam = $vdb->get_modules_parameters($soc_name);
        my %soc_localparam = $vdb->get_modules_parameters($soc_name);
 
 
 
 
        foreach my $intfc (@intfcs){
        foreach my $intfc (@intfcs){
 
 
                # ni intfc
                # ni intfc
                if( $intfc eq 'socket:ni[0]'){
                if( $intfc eq 'socket:ni[0]'){
                        my @ports=$top->top_get_intfc_ports_list($intfc);
                        my @ports=$top->top_get_intfc_ports_list($intfc);
 
 
                        foreach my $p (@ports){
                        foreach my $p (@ports){
                                my($inst,$range,$type,$intfc_name,$intfc_port)= $top->top_get_port($p);
                                my($inst,$range,$type,$intfc_name,$intfc_port)= $top->top_get_port($p);
                                my $q=  ($intfc_port eq "current_e_addr")? "$EAw\'d$e_addr" :
                                my $q=  ($intfc_port eq "current_e_addr")? "$EAw\'d$e_addr" :
                                                ($intfc_port eq "current_r_addr")? "$RAw\'d$r_addr" :
                                                ($intfc_port eq "current_r_addr")? "$RAw\'d$r_addr" :
                                                "ni_$intfc_port\[$tile_num\]";
                                                "ni_$intfc_port\[$tile_num\]";
                                $soc_v=$soc_v.',' if ($i);
                                $soc_v=$soc_v.',' if ($i);
                                $soc_v=$soc_v."\n\t\t.$p($q)";
                                $soc_v=$soc_v."\n\t\t.$p($q)";
                                $i=1;
                                $i=1;
 
 
 
 
                        }
                        }
                }
                }
                # clk source
                # clk source
                elsif( $intfc =~ /plug:clk\[/ ){
                elsif( $intfc =~ /plug:clk\[/ ){
                        my @ports=$top->top_get_intfc_ports_list($intfc);
                        my @ports=$top->top_get_intfc_ports_list($intfc);
                        foreach my $p (@ports){
                        foreach my $p (@ports){
                                my($inst,$range,$type,$intfc_name,$intfc_port)= $top->top_get_port($p);
                                my($inst,$range,$type,$intfc_name,$intfc_port)= $top->top_get_port($p);
                                $soc_v=$soc_v.',' if ($i);
                                $soc_v=$soc_v.',' if ($i);
                                my $src =  $mpsoc->object_get_attribute('SOURCE_SET_CONNECT',"T${tile_num}_$p");
                                my $src =  $mpsoc->object_get_attribute('SOURCE_SET_CONNECT',"T${tile_num}_$p");
                                $src = 'clk0' if(!defined $src);
                                $src = 'clk0' if(!defined $src);
                                $soc_v=$soc_v."\n\t\t.$p($src)";
                                $soc_v=$soc_v."\n\t\t.$p($src)";
                            $i=1;
                            $i=1;
 
 
                        }
                        }
                }
                }
                #reset
                #reset
                elsif( $intfc =~ /plug:reset\[/){
                elsif( $intfc =~ /plug:reset\[/){
                        my @ports=$top->top_get_intfc_ports_list($intfc);
                        my @ports=$top->top_get_intfc_ports_list($intfc);
                        foreach my $p (@ports){
                        foreach my $p (@ports){
                                my($inst,$range,$type,$intfc_name,$intfc_port)= $top->top_get_port($p);
                                my($inst,$range,$type,$intfc_name,$intfc_port)= $top->top_get_port($p);
                                $soc_v=$soc_v.',' if ($i);
                                $soc_v=$soc_v.',' if ($i);
                                my $src =  $mpsoc->object_get_attribute('SOURCE_SET_CONNECT',"T${tile_num}_$p");
                                my $src =  $mpsoc->object_get_attribute('SOURCE_SET_CONNECT',"T${tile_num}_$p");
                                $src = 'reset0' if(!defined $src);
                                $src = 'reset0' if(!defined $src);
                                $soc_v=$soc_v."\n\t\t.$p(${src} )";#| jtag_system_reset)";
                                $soc_v=$soc_v."\n\t\t.$p(${src} )";#| jtag_system_reset)";
                            $i=1;
                            $i=1;
 
 
                        }
                        }
                }
                }
                #enable
                #enable
                elsif( $intfc =~ /plug:enable\[/){
                elsif( $intfc =~ /plug:enable\[/){
                        my @ports=$top->top_get_intfc_ports_list($intfc);
                        my @ports=$top->top_get_intfc_ports_list($intfc);
                        foreach my $p (@ports){
                        foreach my $p (@ports){
                                my($inst,$range,$type,$intfc_name,$intfc_port)= $top->top_get_port($p);
                                my($inst,$range,$type,$intfc_name,$intfc_port)= $top->top_get_port($p);
                                $soc_v=$soc_v.',' if ($i);
                                $soc_v=$soc_v.',' if ($i);
                                $soc_v=$soc_v."\n\t\t.$p(processors_en)";
                                $soc_v=$soc_v."\n\t\t.$p(processors_en)";
                            $processor_en=1;
                            $processor_en=1;
                            $i=1;
                            $i=1;
                        }
                        }
                }
                }
                #RxD_sim
                #RxD_sim
                elsif( $intfc eq 'socket:RxD_sim[0]'){
                elsif( $intfc eq 'socket:RxD_sim[0]'){
                        #This interface is for simulation only donot include it in top module
                        #This interface is for simulation only donot include it in top module
                        my @ports=$top->top_get_intfc_ports_list($intfc);
                        my @ports=$top->top_get_intfc_ports_list($intfc);
                        foreach my $p (@ports){
                        foreach my $p (@ports){
                                $soc_v=$soc_v.',' if ($i);
                                $soc_v=$soc_v.',' if ($i);
                                $soc_v=$soc_v."\n\t\t.$p( )";
                                $soc_v=$soc_v."\n\t\t.$p( )";
                                $i=1;
                                $i=1;
                        }
                        }
 
 
                }
                }
                #jtag_to_wb
                #jtag_to_wb
                elsif( $intfc =~ /socket:jtag_to_wb\[/){ #check JTAG connect parameter. if it is XILINX then connect it to jtag tap
                elsif( $intfc =~ /socket:jtag_to_wb\[/){ #check JTAG connect parameter. if it is XILINX then connect it to jtag tap
                        my @ports=$top->top_get_intfc_ports_list($intfc);
                        my @ports=$top->top_get_intfc_ports_list($intfc);
 
 
                        my $setting=$mpsoc->mpsoc_get_tile_param_setting($tile_num);
                        my $setting=$mpsoc->mpsoc_get_tile_param_setting($tile_num);
                        my %topparams;
                        my %topparams;
                        #if ($setting eq 'Custom'){
                        #if ($setting eq 'Custom'){
                                 %topparams= $top->top_get_custom_soc_param($tile_num);
                                 %topparams= $top->top_get_custom_soc_param($tile_num);
                #       }else{
                #       }else{
                        #        %topparams=$top->top_get_default_soc_param();
                        #        %topparams=$top->top_get_default_soc_param();
                        #}
                        #}
 
 
 
 
                        #my $JTAG_CONNECT=$soc->soc_get_module_param_value ($id,'JTAG_CONNECT');
                        #my $JTAG_CONNECT=$soc->soc_get_module_param_value ($id,'JTAG_CONNECT');
 
 
                        foreach my $p (@ports){
                        foreach my $p (@ports){
                                my($id,$range,$type,$intfc_name,$intfc_port)= $top->top_get_port($p);
                                my($id,$range,$type,$intfc_name,$intfc_port)= $top->top_get_port($p);
                                my $inst_name=$top->top_get_def_of_instance($id,'instance');
                                my $inst_name=$top->top_get_def_of_instance($id,'instance');
                                my $JTAG_CONNECT=  $topparams{"${inst_name}_JTAG_CONNECT"};
                                my $JTAG_CONNECT=  $topparams{"${inst_name}_JTAG_CONNECT"};
                                my $chain=$topparams{"${inst_name}_JTAG_CHAIN"};
                                my $chain=$topparams{"${inst_name}_JTAG_CHAIN"};
                                my $index=$topparams{"${inst_name}_JTAG_INDEX"};
                                my $index=$topparams{"${inst_name}_JTAG_INDEX"};
                                #print Dumper (\%topparams);
                                #print Dumper (\%topparams);
                                #print "my $JTAG_CONNECT=  \$topparams{${inst_name}_JTAG_CONNECT}\n";
                                #print "my $JTAG_CONNECT=  \$topparams{${inst_name}_JTAG_CONNECT}\n";
 
 
                                #print "$inst,$range,$type,$intfc_name,$intfc_port-> $JTAG_CONNECT;";
                                #print "$inst,$range,$type,$intfc_name,$intfc_port-> $JTAG_CONNECT;";
                                if($JTAG_CONNECT  =~ /XILINX_JTAG_WB/){
                                if($JTAG_CONNECT  =~ /XILINX_JTAG_WB/){
 
 
                                        my ($io_port,$type,$new_range,$intfc_name,$intfc_port)= get_top_port_io_info($top,$p,$tile_num,\%params,\%soc_localparam);
                                        my ($io_port,$type,$new_range,$intfc_name,$intfc_port)= get_top_port_io_info($top,$p,$tile_num,\%params,\%soc_localparam);
                                        my $port_def=(length ($new_range)>1 )?  "\t$type\t [ $new_range    ] $io_port;\n": "\t$type\t\t\t$io_port;\n";
                                        my $port_def=(length ($new_range)>1 )?  "\t$type\t [ $new_range    ] $io_port;\n": "\t$type\t\t\t$io_port;\n";
                                        $top_ip->top_add_port("T${tile_num}" ,$io_port, $new_range ,$type,$intfc_name,$intfc_port);
                                        $top_ip->top_add_port("T${tile_num}" ,$io_port, $new_range ,$type,$intfc_name,$intfc_port);
 
 
                                        my $wire_def=(length ($new_range)>1 )?  "\twire\t [ $new_range    ] $io_port;": "\twire\t\t\t$io_port;";
                                        my $wire_def=(length ($new_range)>1 )?  "\twire\t [ $new_range    ] $io_port;": "\twire\t\t\t$io_port;";
                                #       my $new_range = add_instantc_name_to_parameters(\%params,"${soc_name}_$soc_num",$range);
                                #       my $new_range = add_instantc_name_to_parameters(\%params,"${soc_name}_$soc_num",$range);
 
 
                                #       $jtag_def=$jtag_def."$wire_def";
                                #       $jtag_def=$jtag_def."$wire_def";
                                        %jtag_info=append_to_hash (\%jtag_info,$chain,'wire',"$wire_def");
                                        %jtag_info=append_to_hash (\%jtag_info,$chain,'wire',"$wire_def");
 
 
 
 
                                        $soc_v=$soc_v.',' if ($i);
                                        $soc_v=$soc_v.',' if ($i);
                                        $soc_v=$soc_v."\n\t\t.$p($io_port)";
                                        $soc_v=$soc_v."\n\t\t.$p($io_port)";
                                        $i=1;
                                        $i=1;
                                        if($type eq 'input'){
                                        if($type eq 'input'){
                                                %jtag_info=check_jtag_indexs(\%jtag_info,$chain,$index,$txview,$inst_name,$tile_num);
                                                %jtag_info=check_jtag_indexs(\%jtag_info,$chain,$index,$txview,$inst_name,$tile_num);
                                                #$jtag_insts=$jtag_insts."$id XILINX JTAG,";
                                                #$jtag_insts=$jtag_insts."$id XILINX JTAG,";
                                                %jtag_info=append_to_hash (\%jtag_info,0,'inst',"$id XILINX JTAG");
                                                %jtag_info=append_to_hash (\%jtag_info,0,'inst',"$id XILINX JTAG");
                                                #$xilinx_jtag_ctrl++;
                                                #$xilinx_jtag_ctrl++;
                                                %jtag_info=append_to_hash (\%jtag_info,$chain,'xilinx_num',1);
                                                %jtag_info=append_to_hash (\%jtag_info,$chain,'xilinx_num',1);
                                                #$xilinx_jtag_ctrl_in=(length ($xilinx_jtag_ctrl_in)>2)? "$xilinx_jtag_ctrl_in,$io_port" : "$io_port";
                                                #$xilinx_jtag_ctrl_in=(length ($xilinx_jtag_ctrl_in)>2)? "$xilinx_jtag_ctrl_in,$io_port" : "$io_port";
                                                %jtag_info=append_to_hash (\%jtag_info,$chain,'input',$io_port);
                                                %jtag_info=append_to_hash (\%jtag_info,$chain,'input',$io_port);
                                        }else {
                                        }else {
                                                #$xilinx_jtag_ctrl_out=(length($xilinx_jtag_ctrl_out)>2)? "$xilinx_jtag_ctrl_out,$io_port" : "$io_port";
                                                #$xilinx_jtag_ctrl_out=(length($xilinx_jtag_ctrl_out)>2)? "$xilinx_jtag_ctrl_out,$io_port" : "$io_port";
                                                %jtag_info=append_to_hash (\%jtag_info,$chain,'output',$io_port);
                                                %jtag_info=append_to_hash (\%jtag_info,$chain,'output',$io_port);
                                        }
                                        }
                                        $io_short=$io_short.",\n\t$io_port";
                                        $io_short=$io_short.",\n\t$io_port";
                                        $io_full=$io_full."$port_def";
                                        $io_full=$io_full."$port_def";
                                        $top_io_pass=$top_io_pass.",\n\t\t.$io_port($io_port)";
                                        $top_io_pass=$top_io_pass.",\n\t\t.$io_port($io_port)";
#
#
                                }else{#Dont not connect
                                }else{#Dont not connect
                                        $soc_v=$soc_v.',' if ($i);
                                        $soc_v=$soc_v.',' if ($i);
                                        $soc_v=$soc_v."\n\t\t.$p( )";
                                        $soc_v=$soc_v."\n\t\t.$p( )";
                                        $i=1;
                                        $i=1;
                                }
                                }
 
 
                                if($JTAG_CONNECT =~ /ALTERA_JTAG_WB/){
                                if($JTAG_CONNECT =~ /ALTERA_JTAG_WB/){
                                        if($type eq 'input'){
                                        if($type eq 'input'){
                                                #$jtag_insts=$jtag_insts."$id ALTERA JTAG,";
                                                #$jtag_insts=$jtag_insts."$id ALTERA JTAG,";
                                                #$altera_jtag_ctrl++;
                                                #$altera_jtag_ctrl++;
                                                %jtag_info=append_to_hash (\%jtag_info,0,'inst',"$id ALTERA JTAG");
                                                %jtag_info=append_to_hash (\%jtag_info,0,'inst',"$id ALTERA JTAG");
                                                %jtag_info=append_to_hash (\%jtag_info,0,'altera_num',1);
                                                %jtag_info=append_to_hash (\%jtag_info,0,'altera_num',1);
                                                %jtag_info=check_jtag_indexs(\%jtag_info,0,$index,$txview,$inst_name,$tile_num);
                                                %jtag_info=check_jtag_indexs(\%jtag_info,0,$index,$txview,$inst_name,$tile_num);
 
 
                                        }
                                        }
                                }
                                }
 
 
                        }
                        }
 
 
                }
                }
 
 
                else {
                else {
                #other interface
                #other interface
                        my @ports=$top->top_get_intfc_ports_list($intfc);
                        my @ports=$top->top_get_intfc_ports_list($intfc);
                        foreach my $p (@ports){
                        foreach my $p (@ports){
                                my ($io_port,$type,$new_range,$intfc_name,$intfc_port)= get_top_port_io_info($top,$p,$tile_num,\%params,\%soc_localparam);
                                my ($io_port,$type,$new_range,$intfc_name,$intfc_port)= get_top_port_io_info($top,$p,$tile_num,\%params,\%soc_localparam);
 
 
                                $io_short=$io_short.",\n\t$io_port";
                                $io_short=$io_short.",\n\t$io_port";
                                $top_io_short=$top_io_short.",\n\t$io_port";
                                $top_io_short=$top_io_short.",\n\t$io_port";
                                $top_io_pass=$top_io_pass.",\n\t\t.$io_port($io_port)";
                                $top_io_pass=$top_io_pass.",\n\t\t.$io_port($io_port)";
                                #io definition
                                #io definition
                                #my $new_range = add_instantc_name_to_parameters(\%params,"${soc_name}_$soc_num",$range);
                                #my $new_range = add_instantc_name_to_parameters(\%params,"${soc_name}_$soc_num",$range);
                                my $port_def=(length ($new_range)>1 )?  "\t$type\t [ $new_range    ] $io_port;\n": "\t$type\t\t\t$io_port;\n";
                                my $port_def=(length ($new_range)>1 )?  "\t$type\t [ $new_range    ] $io_port;\n": "\t$type\t\t\t$io_port;\n";
                                $top_ip->top_add_port("T${tile_num}" ,$io_port, $new_range ,$type,$intfc_name,$intfc_port);
                                $top_ip->top_add_port("T${tile_num}" ,$io_port, $new_range ,$type,$intfc_name,$intfc_port);
 
 
                                $io_full=$io_full."$port_def";
                                $io_full=$io_full."$port_def";
                                $top_io_full=$top_io_full."$port_def";
                                $top_io_full=$top_io_full."$port_def";
                                $soc_v=$soc_v.',' if ($i);
                                $soc_v=$soc_v.',' if ($i);
                                $soc_v=$soc_v."\n\t\t.$p($io_port)";
                                $soc_v=$soc_v."\n\t\t.$p($io_port)";
                                $i=1;
                                $i=1;
 
 
                        }
                        }
                }
                }
        }
        }
 
 
 
 
 
 
        $soc_v=$soc_v."\n\t);\n";
        $soc_v=$soc_v."\n\t);\n";
 
 
 
 
        return ($soc_v,$processor_en,$io_short,$io_full,$top_io_short,  $top_io_full,$top_io_pass,\%jtag_info);
        return ($soc_v,$processor_en,$io_short,$io_full,$top_io_short,  $top_io_full,$top_io_pass,\%jtag_info);
 
 
}
}
 
 
 
 
sub check_jtag_indexs{
sub check_jtag_indexs{
        my ($ref,$chain,$index,$txview,$inst_name,$core_id)=@_;
        my ($ref,$chain,$index,$txview,$inst_name,$core_id)=@_;
        my %jtag_info = %{$ref} if (defined $ref);
        my %jtag_info = %{$ref} if (defined $ref);
 
 
        chomp $index;
        chomp $index;
        # replace coreid parameter
        # replace coreid parameter
        ($index=$index)=~ s/CORE_ID/$core_id/g;
        ($index=$index)=~ s/CORE_ID/$core_id/g;
        $index = eval $index;
        $index = eval $index;
        my $inst1 =$jtag_info{$chain}{'index'}{$index};
        my $inst1 =$jtag_info{$chain}{'index'}{$index};
        my $id1 = $jtag_info{$chain}{'core_id'}{$index};
        my $id1 = $jtag_info{$chain}{'core_id'}{$index};
        if (defined $inst1){
        if (defined $inst1){
                add_colored_info($txview,"Error: The JTAG INDEX number $index in JTAG Chain $chain is not unique. The same index number is used in tile($id1):$inst1  & tile($core_id):$inst_name  IPs. It should be used in only one module.\n",'red');
                add_colored_info($txview,"Error: The JTAG INDEX number $index in JTAG Chain $chain is not unique. The same index number is used in tile($id1):$inst1  & tile($core_id):$inst_name  IPs. It should be used in only one module.\n",'red');
        }
        }
        $jtag_info{$chain}{'index'}{$index}=$inst_name;
        $jtag_info{$chain}{'index'}{$index}=$inst_name;
        $jtag_info{$chain}{'core_id'}{$index}=$core_id;
        $jtag_info{$chain}{'core_id'}{$index}=$core_id;
        #print "\$jtag_info{$chain}{'index'}{$index}=$inst_name\n";
        #print "\$jtag_info{$chain}{'index'}{$index}=$inst_name\n";
        return %jtag_info;
        return %jtag_info;
}
}
 
 
 
 
 
 
sub get_top_clk_setting{
sub get_top_clk_setting{
        my $mpsoc=shift;
        my $mpsoc=shift;
    #get mpsoc with clock setting interface
    #get mpsoc with clock setting interface
        my $dir = Cwd::getcwd();
        my $dir = Cwd::getcwd();
        my $soc =get_source_set_top($mpsoc);
        my $soc =get_source_set_top($mpsoc);
 
 
    my @instances=$soc->soc_get_all_instances();
    my @instances=$soc->soc_get_all_instances();
    my $top_ip=ip_gen->top_gen_new();
    my $top_ip=ip_gen->top_gen_new();
    my $body_v;
    my $body_v;
    my $param_pass_v="";
    my $param_pass_v="";
    my $io_sim_v;
    my $io_sim_v;
        my $io_top_sim_v;
        my $io_top_sim_v;
        my $core_id= 0 ;
        my $core_id= 0 ;
        my $param_as_in_v="";
        my $param_as_in_v="";
        my $local_param_v_all="";
        my $local_param_v_all="";
        my $inst_v_all="";
        my $inst_v_all="";
    my $param_v_all="";
    my $param_v_all="";
    my $wire_def_v_all="";
    my $wire_def_v_all="";
        my $plugs_assign_v_all="";
        my $plugs_assign_v_all="";
        my $sockets_assign_v_all="";
        my $sockets_assign_v_all="";
        my $io_full_v_all="";
        my $io_full_v_all="";
        my $io_top_full_v_all="";
        my $io_top_full_v_all="";
        my $io_sim_v_all;
        my $io_sim_v_all;
        my $system_v_all="";
        my $system_v_all="";
 
 
        my $wires=soc->new_wires();
        my $wires=soc->new_wires();
        my $intfc=interface->interface_new();
        my $intfc=interface->interface_new();
        my $clk_assigned_port;
        my $clk_assigned_port;
    foreach my $id (@instances){
    foreach my $id (@instances){
        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,
        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);
                $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);
 
 
                #my ($param_v, $local_param_v, $wire_def_v, $inst_v, $plugs_assign_v, $sockets_assign_v,$io_full_v,$io_top_full_v,$system_v,$assigned_ports)=gen_module_inst($id,$soc,\$io_sim_v,\$io_top_sim_v,\$param_as_in_v,$top_ip,$intfc,$wires,\$param_pass_v,\$system_v);
                #my ($param_v, $local_param_v, $wire_def_v, $inst_v, $plugs_assign_v, $sockets_assign_v,$io_full_v,$io_top_full_v,$system_v,$assigned_ports)=gen_module_inst($id,$soc,\$io_sim_v,\$io_top_sim_v,\$param_as_in_v,$top_ip,$intfc,$wires,\$param_pass_v,\$system_v);
                my $inst        = $soc->soc_get_instance_name($id);
                my $inst        = $soc->soc_get_instance_name($id);
                if ($id ne 'TOP'){
                if ($id ne 'TOP'){
                        add_text_to_string(\$body_v,"/*******************\n*\n*\t$inst\n*\n*\n*********************/\n");
                        add_text_to_string(\$body_v,"/*******************\n*\n*\t$inst\n*\n*\n*********************/\n");
                        add_text_to_string(\$system_v_all,"$system_v\n")        if(defined($system_v));
                        add_text_to_string(\$system_v_all,"$system_v\n")        if(defined($system_v));
                        add_text_to_string(\$local_param_v_all,"$local_param_v\n")      if(defined($local_param_v));
                        add_text_to_string(\$local_param_v_all,"$local_param_v\n")      if(defined($local_param_v));
                        add_text_to_string(\$wire_def_v_all,"$wire_def_v\n")                    if(defined($wire_def_v));
                        add_text_to_string(\$wire_def_v_all,"$wire_def_v\n")                    if(defined($wire_def_v));
                        add_text_to_string(\$inst_v_all,$inst_v)                                                if(defined($inst_v));
                        add_text_to_string(\$inst_v_all,$inst_v)                                                if(defined($inst_v));
                        add_text_to_string(\$plugs_assign_v_all,"$plugs_assign_v\n")    if(defined($plugs_assign_v));
                        add_text_to_string(\$plugs_assign_v_all,"$plugs_assign_v\n")    if(defined($plugs_assign_v));
                        add_text_to_string(\$sockets_assign_v_all,"$sockets_assign_v\n")if(defined($sockets_assign_v));
                        add_text_to_string(\$sockets_assign_v_all,"$sockets_assign_v\n")if(defined($sockets_assign_v));
                        add_text_to_string(\$io_full_v_all,"$io_full_v\n")                              if(length($io_full_v)>3);
                        add_text_to_string(\$io_full_v_all,"$io_full_v\n")                              if(length($io_full_v)>3);
                        add_text_to_string(\$io_top_full_v_all,"$io_top_full_v\n")              if(length($io_top_full_v)>3);
                        add_text_to_string(\$io_top_full_v_all,"$io_top_full_v\n")              if(length($io_top_full_v)>3);
                        $io_sim_v_all     = (defined $io_sim_v_all    )? "$io_sim_v_all,\n$io_sim_v"         : $io_sim_v                if(defined($io_sim_v));
                        $io_sim_v_all     = (defined $io_sim_v_all    )? "$io_sim_v_all,\n$io_sim_v"         : $io_sim_v                if(defined($io_sim_v));
                }else{
                }else{
                        add_text_to_string(\$system_v_all,"$system_v\n")        if(defined($system_v));
                        add_text_to_string(\$system_v_all,"$system_v\n")        if(defined($system_v));
                        add_text_to_string(\$wire_def_v_all,"$wire_def_v\n")                    if(defined($wire_def_v));
                        add_text_to_string(\$wire_def_v_all,"$wire_def_v\n")                    if(defined($wire_def_v));
                        add_text_to_string(\$plugs_assign_v_all,"$plugs_assign_v\n")    if(defined($plugs_assign_v));
                        add_text_to_string(\$plugs_assign_v_all,"$plugs_assign_v\n")    if(defined($plugs_assign_v));
                        add_text_to_string(\$sockets_assign_v_all,"$sockets_assign_v\n")if(defined($sockets_assign_v));
                        add_text_to_string(\$sockets_assign_v_all,"$sockets_assign_v\n")if(defined($sockets_assign_v));
                        add_text_to_string(\$io_full_v_all,"$io_full_v\n")                              if(length($io_full_v)>3);
                        add_text_to_string(\$io_full_v_all,"$io_full_v\n")                              if(length($io_full_v)>3);
                        $io_sim_v_all     = (defined $io_sim_v_all    )? "$io_sim_v_all,\n$io_sim_v"         : $io_sim_v                if(defined($io_sim_v));
                        $io_sim_v_all     = (defined $io_sim_v_all    )? "$io_sim_v_all,\n$io_sim_v"         : $io_sim_v                if(defined($io_sim_v));
                        add_text_to_string(\$io_top_full_v_all,"$io_top_full_v\n")                      if(length($io_top_full_v)>3);
                        add_text_to_string(\$io_top_full_v_all,"$io_top_full_v\n")                      if(length($io_top_full_v)>3);
                        $clk_assigned_port= (defined $clk_assigned_port)? "$clk_assigned_port,\n$assigned_ports"  : $assigned_ports if(defined $assigned_ports);
                        $clk_assigned_port= (defined $clk_assigned_port)? "$clk_assigned_port,\n$assigned_ports"  : $assigned_ports if(defined $assigned_ports);
                }
                }
 
 
    }
    }
 
 
 
 
 
 
 
 
 
 
 
 
    my $unused_wiers_v=assign_unconnected_wires($wires,$intfc);
    my $unused_wiers_v=assign_unconnected_wires($wires,$intfc);
    $unused_wiers_v= "" if(!defined $unused_wiers_v);
    $unused_wiers_v= "" if(!defined $unused_wiers_v);
 
 
   my $soc_v = "
   my $soc_v = "
   $system_v_all
   $system_v_all
   $local_param_v_all
   $local_param_v_all
   $wire_def_v_all
   $wire_def_v_all
   $unused_wiers_v
   $unused_wiers_v
   $inst_v_all
   $inst_v_all
   $plugs_assign_v_all
   $plugs_assign_v_all
   $sockets_assign_v_all
   $sockets_assign_v_all
 
 
";
";
        my $clk_io_full= $io_full_v_all;
        my $clk_io_full= $io_full_v_all;
        my $clk_io_sim=$io_sim_v_all;
        my $clk_io_sim=$io_sim_v_all;
        return ($soc_v,$clk_io_sim,$clk_io_full,$clk_assigned_port);
        return ($soc_v,$clk_io_sim,$clk_io_full,$clk_assigned_port);
 
 
}
}
 
 
sub get_top_port_io_info{
sub get_top_port_io_info{
        my ($top,$port,$tile_num,$params_ref,$local_param_ref)=@_;
        my ($top,$port,$tile_num,$params_ref,$local_param_ref)=@_;
        my %params =%{$params_ref} if(defined $params_ref);
        my %params =%{$params_ref} if(defined $params_ref);
        my %localparams=%{$local_param_ref} if(defined $local_param_ref);
        my %localparams=%{$local_param_ref} if(defined $local_param_ref);
        my($inst,$range,$type,$intfc_name,$intfc_port)= $top->top_get_port($port);
        my($inst,$range,$type,$intfc_name,$intfc_port)= $top->top_get_port($port);
        my $io_port="T${tile_num}_${port}";
        my $io_port="T${tile_num}_${port}";
    #resolve range parameter
    #resolve range parameter
        if (defined $range ){
        if (defined $range ){
                        my @a= split (/\b/,$range);
                        my @a= split (/\b/,$range);
                        foreach my $l (@a){
                        foreach my $l (@a){
                                #if defined in parameter list ignore it
                                #if defined in parameter list ignore it
                                next  if(defined $params{$l});
                                next  if(defined $params{$l});
                                ($range=$range)=~ s/\b$l\b/$localparams{$l}/g      if(defined $localparams{$l});
                                ($range=$range)=~ s/\b$l\b/$localparams{$l}/g      if(defined $localparams{$l});
                        }
                        }
        }
        }
        my $new_range = add_instantc_name_to_parameters(\%params,"T${tile_num}",$range);
        my $new_range = add_instantc_name_to_parameters(\%params,"T${tile_num}",$range);
        return ($io_port,$type,$new_range,$intfc_name,$intfc_port);
        return ($io_port,$type,$new_range,$intfc_name,$intfc_port);
}
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
1
 
 

powered by: WebSVN 2.1.0

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