Process函数被传入IPS_LIST hash表。 Process子程序主要做的是拿到IPS_LIST hash后,开始遍历此hash,然后开始每次定义出IP_NAME和IP_VERSION,然后处理。 处理的主要思路是,先判断对应
I
P
N
A
M
E
/
{IP_NAME}/
I P N A ME / {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 ;
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" ;
chdir "$IPS_PATH" ;
}
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" ;
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" ;
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 > ) {
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 ;
}