三. 利用perl对SoC中的IP进程lint check: Process lint_check_run lint_report_check子程序

  • Process函数被传入IPS_LIST hash表。
  • Process子程序主要做的是拿到IPS_LIST hash后,开始遍历此hash,然后开始每次定义出IP_NAME和IP_VERSION,然后处理。
  • 处理的主要思路是,先判断对应 I P N A M E / {IP_NAME}/ IPNAME/{IP_VERSION}目录中的rtl和*.prj文件是否存在,如果不存在,在$PERL_LINTCHECK_REPOT创建对应错误的文件夹,进行下一个ip check。如果存在,怎调用lint_check_run子程序,根据之前设置的变量,先判断是否需要进行rtl build,然后再判断是否还需lint run spyglass。
  • Run好之后进入lint_report_check子程序判断,利用正则匹配,提取相应的pattern,然后检查Fatals和Errors,创建相应状态的文件夹。
  • 代码结构如下
sub process {
    my %IPS_LIST_PROC   = @_;
    my $IPS_CNT_CHECKED = 0;
    foreach my $PATH_KEY (keys %IPS_LIST_PROC){
        my $IP_VERSION      = $IPS_LIST_PROC{$PATH_KEY};
        my @IP_NAME_VERSION = split "\/",$PATH_KEY;
        my $IP_NAME         = $IP_NAME_VERSION[0]; 
        my $IP_PATH = "$IPS_PATH/$IP_NAME/$IP_VERSION";
        $IPS_CNT_CHECKED++;
        if(-e "$IP_PATH/rtl") {
            if(-e "$IP_PATH/lint/${IP_NAME}.prj"){
                lint_check_run($IP_PATH,$IP_NAME,$IP_VERSION);
            }else{
                print "[ERROR]: $IP_PATH/lint/${IP_NAME}.prj doesn't exit \n";
                system("mkdir $PERL_LINTCHECK_REPORT_PATH/${IP_NAME}_${IP_VERSION}_no_.prj");
                next;
            }
        }else{
            print "[ERROR]: $IP_PATH/rtl doesn't exist \n";
            system("mkdir $PERL_LINTCHECK_REPORT_PATH/${IP_NAME}_${IP_VERSION}_no_rtl_data");
            next;
        }
        print "[INFO]: checked ${IP_NAME}_${IP_VERSION} over, refer to$PERL_LINTCHECK_REPORT_PATH  \n";
    }

    if($IPS_CNT_CHECKED == $IPS_NUM && $IPS_NUM != 0){
        print "[INFO]: LINT CHECKED SUCCESSFUL! \n";
    }else{
        print "[INFO]: LINT CHECKED FAILED! \n";
        print "[INFO]: LIN HAS CHECKED $IPS_CNT_CHECKED, TOTAL $IPS_NUM \n";
    }
}

sub lint_check_run {
    my($IP_PATH,$IP_NAME,$IP_VERSION) = @_;
    chdir $IP_PATH;
    # rtl build 
    if(1 == $IPS_LEVEL_BUILD){
        print "[INFO]: build the rtl in $IP_PATH/rtl \n";
        chdir "$IP_PATH/rtl";
        print "[RLT BUILD]: begin $IP_NAME,$IP_VERSION rtl build \n";
        #system("make rtl build");
        chdir "$IPS_PATH";
    }
    # run lin check, according to $RestartCheck
    if(1 == $RestartCheck){
        if(-e "$IP_PATH/lint/Output_Results/summart.rpt"){
            print "[INFO]: summart.rpt has already exist in $IP_PATH/lint/Output_Results \n";
        }else{
            print "[INFO]: run lint chec SpyGlass \n";
            chdir "$IP_PATH/lint";
            #system("make rtl lint check ");
            print "[Run SpyGlass]: begin $IP_NAME,$IP_VERSION rtl lint check \n";
            chdir "$IPS_PATH";
        }
    }else{
        print "[INFO]: run lint chec SpyGlass \n";
        chdir "$IP_PATH/lint";
        #system("make rtl lint check ");
        print "[Run SpyGlass]: begin $IP_NAME,$IP_VERSION rtl lint check \n";
        chdir "$IPS_PATH";
    }

    print "[INFO]: check ${IP_NAME}_${IP_VERSION} summary.rpt \n";
    lint_report_check($IP_PATH,$IP_NAME,$IP_VERSION);
}

sub lint_report_check {
    my $IP_REPORT_PATH = "$_[0]/lint/Output_Results";
    my $IP_NAME = $_[1];
    my $IP_VERSION = $_[2];
    print "[DEBUG]: Report PATH is $IP_REPORT_PATH \n";
    open(my $fh_input,"<$IP_REPORT_PATH\/summary.rpt") or die("[ERROR]: can't open report files in $IP_REPORT_PATH \n");
    while(my $line = <$fh_input>){
        # num0 Fatals, num1 Errors
        if($line =~ /(\d+)\sFatals,\s+(\d+)\sErrors/){ 
            print "[INFO]: ${IP_NAME}_{IP_VERSION} find $1 Fatals, $2 Errors \n";
            if (0!=$1 || 0!=$2) {
                system("mkdir $PERL_LINTCHECK_REPORT_PATH/${IP_NAME}_${IP_VERSION}_${1}_Fatals_${2}_Errors");
                system("cp $IP_REPORT_PATH/summary.rpt $PERL_LINTCHECK_REPORT_PATH/${IP_NAME}_${IP_VERSION}_${1}_Fatals_${2}_Errors");
            }else{
                print "[INFO: ${IP_NAME}_${IP_VERSION} Lint check is clean \n";
                system("mkdir $PERL_LINTCHECK_REPORT_PATH/${IP_NAME}_${IP_VERSION}_clean");
            }
        }
    }    
    close $fh_input;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值