【IC验证】perl脚本——分析前/后仿用例回归情况

news2024/12/23 14:29:13

目录

1 脚本名称

2 脚本使用说明

3 nocare_list文件示例

4 脚本执行方法

5 postsim_result.log文件示例

6 脚本代码


1 脚本名称

post_analysis

2 脚本使用说明

help:打印脚本说明信息

命令:post_analysis help

前/后仿结束后,首先填写好nocare_list(要过滤的log信息),然后在有log文件的上一层次路径下运行post_analysis脚本,执行脚本时若不带-all参数,则过滤掉nocare_list中的信息后只对后仿log进行分析,若带-all参数,则会过滤nocare_list中的信息后,对前/后仿的log信息进行分析,给出pass、timeout、bombed、violation等结果:

(1)不带-all参数:

  脚本会只分析名称带max或者min的后仿文件夹如(rfdig_m33_tc029_max、rfdig_m33_tc001_max_20230911),除去runsim.log文件中和nocare_list中的内容相关的violation,之后在各个用例文件夹下产生runsim_temp.log文件,随后分析runsim_temp.log文件out of reset之后的内容,若case PASS但存在violation,则输出结果 VOILATION以及$setuphold/$setup/$hold/$width违例的数量,并产生结果文件: postsim_result.log;若不仍存在violation,则输出结果PASS到postsim_result.log文件中;否则输出结果FAIL、TIMEOUT、RUNNING、BOMB到postsim_result.log文件中。

(2)带-all参数:

对前仿也进行上述分析。

3 nocare_list文件示例

在runsim.log中找到包含以下关键字的行,并将其删除:

4 脚本执行方法

post_analysis //只对文件夹名称中有max或者min的后仿文件夹进行分析
post_analysis -all //对前后仿的文件夹都进行分析

5 postsim_result.log文件示例

(1)PASS说明reset后无任何violation;

(2)VOILATION说明reset后仍存在violation,需查看对应的runsim_temp.log确认每一个violation;

(3)FAIL说明用例fail,需查看对应的runsim_temp.log,确认fail原因;

(4)TIMEOUT说明用例超时,需查看对应的runsim_temp.log,确认超时原因;

(5)RUNNING说明用例还在跑,确认相关原因;

(6)BOMB说明用例编译失败,需查看对应的vcs_compile.log确认编译失败原因;

6 脚本代码

#! /usr/bin/perl -w

#==========================================================
# PERL MODULE 
#==========================================================

use Cwd;
use Getopt::Long;
    $Getopt::Long::ignorecase = 0;

#==========================================================
# PERL FUNCTION GetOptions (get command parameters)
#==========================================================
GetOptions("all" => \$g_dir) or die ("Invalid arguments. \n");

our $g_help = 0;
if (!GetOptions (
     "help" => \$g_help,
                )
   ) {
  &print_message();
  exit 0;
}


#==========================================================
# GENERATE postsim_result.log FILE
#==========================================================


our $sim_log = "runsim.log";
our $new_sim_log = "runsim_temp.log";
our @dirs = <*>;

our $reset_line_num;
our $tail_lines; 
our $casename;

($sec,$min,$hour,$mday,$mon,$year) = localtime();

if (open(NOCARE_ID,"nocare_list") or die "cannot open nocare_list, no such file!!!") {
    @nocarecontent = <NOCARE_ID>;

    my $cur_dir = getcwd; 
    chdir($cur_dir) or die "cannot cd $cur_dir"; #cd simdir 

    open(PS_ID,">postsim_result.log");
    print  PS_ID "====================================================";
    printf PS_ID "%02d/%02d/%02d %02d:%02d:%02d",$year+1900,$mon+1,$mday,"$hour","$min","$sec";
    print  PS_ID "====================================================\n";
    
    foreach $dir (@dirs) { 
        chdir($cur_dir) or die "cannot cd $cur_dir"; #cd simdir 
        if ($g_dir) {
            if ($dir =~ /(.+)tc(\d+)(.*)/) {
                $casename = $dir;
                print "dir_name = $casename \n" ;
            }
            else {
                next;
            }
        }
        else {
            if (($dir =~ /(.+)(\d+)(.*)max(.*)/) or ($dir =~ /(.+)(\d+)(.*)min(.*)/)) {
                $casename = $dir;
                print "dir_name = $casename \n" ;
            }
            else {
                next;
            }
        }
        chdir($dir) or die "cannot cd $dir"; #cd simdir/xxx_tc00X(every case dir)
        unlink $new_sim_log;
        open(NEW_ID,">runsim_temp.log");
        $nocarename=$sim_log; #simdir/xxx_tcXXX/runsim.log
        if (open(LOG_ID,"$nocarename")) {
            @logcontent = <LOG_ID>; #ever line in runsim.log
            $match=0;
            $write_en=0;
            foreach $log (@logcontent) {
                if ($match eq 1) {
                    $match = 0;
                } else {
                    foreach $nocare (@nocarecontent) {
                        if ($log =~ /$nocare/) {
                            $match = 1;
                            $write_en = 0;
                            last;
                        } else {
                            $write_en = 1;
                        }
                    }
                    if ($write_en eq 1) {
                        print NEW_ID $log;
                        $write_en = 0;
                    }
                }
            }
            close NEW_ID; #finish write run_sim_temp.log
            close LOG_ID; #finish read run_sim.log
        } 
        else {
            print "Can not find $nocarename file!!! \n";
        }

        ####report###
        if(-e "runsim.log") {
            if (open NEW_ID,$new_sim_log) {
                @linecontent = <NEW_ID>;
                $reset_bgn = 0;
                $setuphold = 0;
                $width     = 0;
                $print_over= 0;
                foreach $line (@linecontent) {
                    if ($reset_bgn eq 1) {
                        if ($line =~ /.*\$setuphold.*/ or $line =~ /.*\$setup.*/ or $line =~ /.*\$hold.*/) {
                            $setuphold = $setuphold+1;
                        } elsif ($line =~ /.*\$width.*/) {
                            $width = $width+1;
                        } elsif ($line =~ /.*the test case finished with (\w+).*/) {
                            if($1 eq "FAIL") {
                                $print_over = 1;
                                printf PS_ID "%-50s%-10s%-30s","$casename",">>>>","FAIL";
                                print  PS_ID "\n"; 
                            } elsif ($1 eq "TIMEOUT") {
                                $print_over = 1;
                                printf PS_ID "%-50s%-10s%-30s","$casename",">>>>","TIMEOUT";
                                print  PS_ID "\n";  
                            } elsif ($1 eq "PASS") {
                                $print_over = 1;
                                if ($setuphold > 0 or $width > 0) {
                                    printf PS_ID "%-50s%-10s%-30s","$casename",">>>>","VOILATION";
                                    printf PS_ID "\$setuphold:%-5d \$width:%-5d",$setuphold,$width;
                                    print  PS_ID "\n";    
                                } else {
                                    printf PS_ID "%-50s%-10s%-30s","$casename",">>>>","PASS";
                                    print  PS_ID "\n";   
                                }
                            } else {
                               next;
                            }
                        } else {
                            next;

                        }
                    } else {
                        if ($line =~ /.*Out of reset!.*/) {
                            $reset_bgn = 1;
                        } else {
                            next;
                        }
                    }
                }
                if ($print_over eq 0) {
                    printf PS_ID "%-50s%-10s%-30s","$casename",">>>>","RUNNING";
                    print  PS_ID "\n"; 
                } else {
                    next;
                }
            } else {
                next;
            }
        } else {
             printf PS_ID "%-50s%-10s%-30s","$casename",">>>>","BOMBED";
             print  PS_ID "\n";    
        }
    }
    printf PS_ID "%-58s","========================================================";
    printf PS_ID "%-7s",$ENV{'USER'};
    printf PS_ID "%58s","========================================================";
    close PS_ID;
}


#==========================================================
# HELP INFORMATION PRINT
#==========================================================

if ($g_help) {
  &print_message();
  exit 0;
}

#==========================================================
# SUB PROGRAM (print help ingormation) 
#==========================================================

sub print_message ()
{
  print "
NAME
      post_analysis - Check case sim result script

MAXSCEND
      post_analysis [-h]

Options
      -h : help information

You should run this script in the directory containing all the cases' working directories
        \n";
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1313429.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

餐饮品牌小红书探店怎么做?建议收藏

对于餐饮行业来说&#xff0c;消费者的口味和选择越来越多样化&#xff0c;如何在众多竞争者中脱颖而出&#xff0c;成为消费者的心头好&#xff0c;探店活动便应运而生。小红书作为国内知名的社交电商平台&#xff0c;拥有庞大的用户群体&#xff0c;特别是年轻人和美食爱好者…

多域名https证书购买选择

多域名https证书是一种特殊的SSL证书&#xff0c;它允许一个证书同时保护多个域名&#xff0c;并且不限制域名的类型&#xff0c;可以保护多个域名和子域名&#xff0c;确保网站传输信息时不被窃取、篡改。那么我们该怎么选择符合需求的多域名https证书呢&#xff1f;今天就随S…

Python神器:快速删除文本文件中指定行的方法

1. 简介 文件操作是编程中的重要方面。Python作为强大的编程语言&#xff0c;提供了处理文件的能力。删除特定行是文件处理中常见的需求。 2. 打开文件和读取内容 当打开文件并读取其内容时&#xff0c;open()函数和with语句是Python中常用的工具。以下是展示如何使用它们的…

由@EnableWebMvc注解引发的Jackson解析异常

同事合了代码到开发分支&#xff0c;并没有涉及到改动的类却报错。错误信息如下&#xff1a; Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http.conv…

第1章:企业级研发测试流程

通过实际&#xff08;自研互联网&#xff09;企业的研发流程一览图。 我们发现分为9个阶段&#xff0c;当然每个公司细节并不一样。 所以我希望你能理解这句话&#xff1a; 一切的流程、行为、结果都是围绕“产品质量”这4个字开展活动。而作为测试&#xff0c;你该考虑的是如何…

数据结构与算法—查找算法(线性查找、二分查找、插值查找、斐波那契查找)

查找算法 文章目录 查找算法1. 线性查找算法2. 二分查找算法2.1 二分查找思路分析2.2 应用实例 3. 插值查找3.1 基本原理3.2 应用实例 4. 斐波那契4.1 基本原理4.2 应用实例 5. 查找总结 在java中&#xff0c;常用的查找有四种&#xff1a; 顺序(线性)查找二分查找/折半查找插值…

JS基本语法

JS基本语法 变量数据类型原始数据类型 函数定义第一种方式第二种方式 JS 对象ArrayStringJavaScript 自定义对象JSONDOMBOM JS 事件事件监听事件绑定常见事件 变量 数据类型 原始数据类型 函数定义 第一种方式 第二种方式 JS 对象 Array String JavaScript 自定义对象 JSON …

2023版本QT学习记录 -2- 标准文件对话框

头文件的使用 #include "QFileDialog"函数原型 getOpenFileName效果 参数 未完待续

电阻的运用

本文引注 https://baijiahao.baidu.com/s?id1749115196647029942&wfrspider&forpc 一、零欧电阻 在电子电路设计时经常用到的一种元件就是电阻&#xff0c;我们都知道电阻在电路中起到分压限流的作用。然而&#xff0c;实际使用时会用到一种特殊的电阻&#xff1a;零…

3ds max软件中的一些常用功能分享!

3ds max软件有很多小伙伴反馈说&#xff0c;明明有很多3ds max教程资料。却不知道如何入门3dmax。 掌握3dmax基本功能是开始使用3dmax的基础之一&#xff0c;所以&#xff0c;小编带大家盘点一下3dmax常用操作。 3dmax常用功能介绍如下&#xff0c;快快跟着小编一起看起来。 1…

[渗透测试学习] Codify - HackTheBox

首先nmap扫描端口 nmap -sV -sC -p- -v --min-rate 1000 10.10.11.239扫出来三个端口&#xff0c;22端口为ssh服务&#xff0c;80端口有http服务&#xff0c;3000端口为nodejs框架 尝试访问下80端口&#xff0c;发现页面重定向 将该域名添加到hosts里 sudo vim /etc/hosts 成…

优先考虑泛型

Java中的泛型&#xff08;Generics&#xff09;提供了一种参数化类型的机制&#xff0c;使得你可以编写更灵活、类型安全的代码。下面是一个例子&#xff0c;说明在Java中优先考虑泛型的好处&#xff1a; 考虑一个简单的容器类&#xff0c;它可以存储任意类型的元素&#xff0…

三种好用的在线色彩提取工具

#三种好用的在线色彩提取工具 1.ecjson网站 网址: https://www.ecjson.com/image_color#b1cfea 或点击链接&#xff1a; ecjson在线色彩提取 图1 ecjson网站色彩提取举例 2.微查网 网址&#xff1a;http://zxqsq.wiicha.com/ 或点击链接&#xff1a; 微查网在线色彩提取 …

JaveEE:手动实现定时器精讲

前言 在Java并发编程学习中&#xff0c;定时器是必不可少的环节。 我们知道线程的调度是随机的&#xff0c;但是有的时候我们就是需要它有序一些&#xff0c;此时的定时器就可以很好的解决这个问题。它可以按照一定的先后顺序&#xff0c;将我们的任务依次执行。 目录 一.Java官…

elementui + vue2实现表格行的上下移动

场景&#xff1a; 如上&#xff0c;要实现表格行的上下移动 实现&#xff1a; <el-dialogappend-to-bodytitle"条件编辑":visible.sync"dialogVisible"width"60%"><el-table :data"data1" border style"width: 100%&q…

mybatis高级扩展-插件和分页插件PageHelper

1、建库建表 create database mybatis-example; use mybatis-example; create table emp (empNo varchar(40),empName varchar(100),sal int,deptno varchar(10) ); insert into emp values(e001,张三,8000,d001); insert into emp values(e002,李四,9000,d001); insert into…

MATLAB代码:分布式电源接入对配电网影响分析

微♥关注“电击小子程高兴的MATLAB小屋”获取专属优惠 关键词&#xff1a;分布式电源 配电网 评估 仿真平台&#xff1a;MATLAB 主要内容&#xff1a;代码主要做的是分布式电源接入场景下对配电网运行影响的分析&#xff0c;其中&#xff0c;可以自己设置分布式电源接入…

【信息学奥赛】拼在起跑线上,想入道就别落下自己!

编程无难事&#xff0c;只怕有心人&#xff0c;学就是了&#xff01; 文章目录 1 信息学奥赛简介2 信息学竞赛的经验回顾3 优秀参考图书推荐《信息学奥赛一本通关》4 高质量技术圈开放 1 信息学奥赛简介 信息学奥赛&#xff0c;作为全国中学生学科奥林匹克“五大学科竞赛”之一…

LeetCode刷题--- 二叉树剪枝

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏&#xff1a;http://t.csdnimg.cn/ZxuNL http://t.csdnimg.cn/c9twt 前言&#xff1a;这个专栏主要讲述递归递归、搜索与回溯算法&#xff0c;所以下面题目主要也是这些算法做的 我讲述…

分析若依的文件上传处理逻辑

分析若依的文件上传处理逻辑 注&#xff1a;已经从若依框架完成拆分&#xff0c;此处单独分析一下人家精彩的封装&#xff0c;也来理解一下怎么做一个通用的上传接口&#xff01;如有分析的&#xff0c;理解的不透彻的地方&#xff0c;大家多多包含&#xff0c;欢迎批评指正&am…