【python脚本】ICer的脚本入门训练——find_key

news2024/9/25 7:26:03

 我们的目标是┏ (゜ω゜)=☞芯片前端全栈工程师~喵!

前言

往期回顾:

【python脚本】ICer的脚本入门训练——svn_back_尼德兰的喵的博客-CSDN博客_svn back文件

【python脚本】ICer的脚本入门训练——gen_tc_尼德兰的喵的博客-CSDN博客

查找关键词这一类脚本,之前写过针对word文档查找关键字的:

针对word.docx文档的关键词索引器_尼德兰的喵的博客-CSDN博客_docx预览跳到指定关键词位置

而这次作为脚本训练呢,是用来查找编译文件内的关键字(其实这个脚本我也写过几次,不过都在内网上(⊙﹏⊙))。具体使用的场景呢,举个例子,比如说我想找一个parameter是在哪个文件定义的,或者一个宏定义的位置,或者某个uvm关键字的声明位置,那么就可以使用脚本吃编译的log(或者综合的log),然后按文件去查找关键字所在的位置完成索引过程。

组织脚本

脚本gen_python find_key.py,起手式如下:

import sys
import os
import re
import argparse

def input_args_proc():#{{{
    parser = argparse.ArgumentParser(description="argparse info")
    parser.add_argument('-o', action='store_true', default=False, help='open this script')
    result = parser.parse_args()
    if result.o == True:
        os.system("gvim %s" % __file__)
        sys.exit(0)
pass#}}}

def main():
    input_args_proc()
pass

if __name__ == "__main__":
    print("%s is working" % __file__)
    main()

这个命令参考:【我有一个大胆的想法】用perl搞个脚本来自动gen_python哈哈哈哈哈_尼德兰的喵的博客-CSDN博客 , 这个格式主要的目的是通过-o来直接打开脚本,避免之前出现过的改了半天脚本结果发现执行的不是改的那个脚本的情况(我linux下的全局路径比较多)。

那么在此基础上我们先来增加几个输入参数:

def input_args_proc():#{{{
    parser = argparse.ArgumentParser(description="argparse info")
    parser.add_argument('-o', action='store_true', default=False, help='open this script')
    parser.add_argument('-k', help='key word')
    parser.add_argument('-f', help='log path')
    parser.add_argument('-n', help='return file num')
    result = parser.parse_args()
    if result.o == True:
        os.system("gvim %s" % __file__)
        sys.exit(0)
    if result.k:
        key_word = result.k
    else:
        raise ValueError("No key word input")
    if result.f: 
        file_path = result.f
    else:
        file_path = r"./sim_base/log/sim.log"
    if result.n:
        find_num = result.n
    else:
        find_num = -1
    print("Find \"{0}\" in log {1}, max return {2} files".format(key_word, file_path, find_num))
    return key_word, file_path, find_num
pass#}}}

对于查找脚本,需要的三个变量就是:查找的关键词、编译的log文件以及需要查找多少个文件,比如要找一个变量的定义位置那么大概率只需要找第一个文件即可。在上面的代码中,-k用于输入查找关键词,-f用于指定log,-n用于标记找到多少个文件后停止查找。三个输入参数均通过parser机制输入。

完成该函数后,将函数添加到main()中:

key_word, file_path, find_num = input_args_proc()

然后我们来观察下log文件的格式,内部编译的文件格式都是非常一致的:

Parsing design file '/home/synopsys/vcs/O-2018.09-SP2/etc/uvm-1.2/uvm_pkg.sv'
Parsing included file '/home/synopsys/vcs/O-2018.09-SP2/etc/uvm-1.2/uvm_macros.svh'.
Parsing included file '/home/synopsys/vcs/O-2018.09-SP2/etc/uvm-1.2/macros/uvm_version_defines.svh'.
Back to file '/home/synopsys/vcs/O-2018.09-SP2/etc/uvm-1.2/uvm_macros.svh'.
Parsing included file '/home/synopsys/vcs/O-2018.09-SP2/etc/uvm-1.2/macros/uvm_global_defines.svh'.
Back to file '/home/synopsys/vcs/O-2018.09-SP2/etc/uvm-1.2/uvm_macros.svh'.
Parsing included file '/home/synopsys/vcs/O-2018.09-SP2/etc/uvm-1.2/macros/uvm_message_defines.svh'.

那么根据这个格式,通过re.search来把所有编译的文件提出来就可以了:

def read_log(file_path):#{{{
    file_list = []
    with open(file_path, "r") as hd:
        handle = hd.readlines()
        for line in handle:
            res = re.search(r"file \'(.*)\'", line)
            if res:
                file_list.append(res.group(1))
                #print(res.group(1))
    return file_list
pass#}}}

而后,将read_log也添加到main()中:

file_list = read_log(file_path)

最后一步,使用os.popen(cmd)方法,在python中执行grep命令,检查每个文件中是否包含关键字key_word,如果包含则将文件路径打印并判定返回的文件数量是否超过了设置的find_num值:

def find_key_in_file(key_word, find_num, file_list):#{{{
    num = 0
    for file in file_list:
        #print(file)
        ret = os.popen("grep {0} {1} -l".format(key_word, file)).readlines() 
        if ret:
            print("    " + ret[0].strip())
            num += 1
            if num >= int(find_num) and int(find_num) >= 0:
                break
pass#}}}

最后把find_key_in_file()函数也加入main()中即可:

find_key_in_file(key_word, find_num, file_list)

测试一下效果:

$./find_key.py -k uvm_factory -n 10
./find_key.py is working
Find "uvm_factory" in log ./sim_base/log/sim.log, max return 10 files as:
    /home/synopsys/vcs/O-2018.09-SP2/etc/uvm-1.2/macros/uvm_deprecated_defines.svh
    /home/synopsys/vcs/O-2018.09-SP2/etc/uvm-1.2/base/uvm_base.svh
    /home/synopsys/vcs/O-2018.09-SP2/etc/uvm-1.2/base/uvm_coreservice.svh
    /home/synopsys/vcs/O-2018.09-SP2/etc/uvm-1.2/base/uvm_base.svh
    /home/synopsys/vcs/O-2018.09-SP2/etc/uvm-1.2/base/uvm_base.svh
    /home/synopsys/vcs/O-2018.09-SP2/etc/uvm-1.2/base/uvm_base.svh
    /home/synopsys/vcs/O-2018.09-SP2/etc/uvm-1.2/base/uvm_misc.svh
    /home/synopsys/vcs/O-2018.09-SP2/etc/uvm-1.2/base/uvm_base.svh
    /home/synopsys/vcs/O-2018.09-SP2/etc/uvm-1.2/base/uvm_object.svh
    /home/synopsys/vcs/O-2018.09-SP2/etc/uvm-1.2/base/uvm_base.svh

初步看,是可以满足使用需求的,最后将之存档:

find_key.py · 尼德兰的喵/myscript_python - Gitee.com

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

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

相关文章

TFT-LCD LVGL与硬件交互

TFT-LCD LVGL与硬件交互 屏幕能正常显示LVGL官方例程,说明LVGL移植成功了,本次实验使用屏幕通过LVGL控制开发板硬件 实现效果 用LVGL画两个按钮和一个标签,一个按钮控制蜂鸣器,另一个按钮控制继电器,标签显示“TFT-…

基于intel机器人控制器,支持slam,激光雷达和AI加速

9th/8th gen Intel Core™ i7/i5/i3 & Celeron.XM-5149 是专为机器人行业设计的工业计算机产品,高性能的处理能力加速 AI 学习速度,多种类 I/0 可接摄像头、雷达等丰富外设。在设备密闭舱体内,整机可以高温稳定运行不降速。 产品规格 芯…

flink不同部署方式-1.14

1. 版本说明 本文档内容基于 flink-1.14.x,其他版本的整理,请查看本人博客的 flink 专栏其他文章。 2. 概述 Flink 是一种通用性框架,支持多种不同的部署方式。 本章简要介绍 Flink 集群的组成部分、用途和可用实现。如果你只是想在本地启…

最全LaTeX 数学公式、字母符号、上下标、列表矩阵、公式注释、分数二进制数、分割字符、逻辑集合论、否定符号等

最全LaTeX 数学公式、字母符号、上下标、列表矩阵、公式注释、分数二进制数、分割字符、逻辑集合论、否定符号等 1. 公式示例 E(T)∑(p,q)ϵκ∣∣p−Tq∣∣2E(T)\sum_{(p,q)\epsilon\kappa} \mid\mid p-T_q \mid \mid ^2 E(T)(p,q)ϵκ∑​∣∣p−Tq​∣∣2 E(T)∑(p,q)ϵκ…

高数 |【23数一 李林六套卷】卷四 自用思路 及 知识点 整理

23数一 李林六套卷 —— 自用思路 及 知识点 整理 ——【卷一】 以下均为个人复盘。 T1:高阶无穷小 T6:傅里叶级数 法一:直接套傅里叶展开公式,死算 法二:用技巧。取一个x,看最后结果趋近于这个数!是趋近于!不是直接等于 直接等于不可以。再来看下一个。

Java--IO流详解

目录 一、IO流的介绍 二、IO流的具体详解 (1)字节流 1:FileOutputStream 2:FileInputStream (2)字符流 1:解码编码 2:FileReader 3:FileWriter 三、IO流的使用 …

MATLB|基于改进教学的优化算法(TLSBO)的最优功率优化

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥 📝目前更新:🌟🌟🌟电力系统相关知识,期刊论文&…

使用 Zabbix 监控Oracle

zabbix ODBC 数据库监控 ODBC 是 C 语言开发的、用于访问数据库的中间件接口.zabbix 支持查询任何 ODBC 支持的数据库.zabbix 经过调用 ODBC 来获取数据库的数据以及数据库状态等等信息 一、安装unixODBC 官方主页:http://www.unixodbc.org/download.html 使用阿里巴巴提供的…

线性方程组迭代法

雅可比迭代法与高斯-塞德尔迭代法 雅可比迭代法 例一 {10x1−x2−2x37.2−x110x2−2x38.3−x1−x25x34.2\left\{\begin{array}{l} 10 x_{1}-x_{2}-2 x_{3}7.2 \\ -x_{1}10 x_{2}-2 x_{3}8.3 \\ -x_{1}-x_{2}5 x_{3}4.2 \end{array}\right. ⎩⎨⎧​10x1​−x2​−2x3​7.2−x…

Css-Grid布局(强大)

前言 我们前面讲的Flex布局是轴线布局,只能指定"项目"针对轴线的位置,可以看做是一维布局,Grid布局则是将容器划分成"行"和"列",产生单元格,然后指定"项目所在"的单元格&…

从手动测试到自动化测试老司机,只用了3个月,我的薪资翻了一倍

虽然笔者是一个测试老人了,但是基本上所有的测试经验都停留在手工测试方面,对于自动化测试方面的实战经验少之又少,可以说,从这个角度来说,就像生活在原始社会,一切靠双手解决问题。(别想歪了&a…

【深度学习】李宏毅2021/2022春深度学习课程笔记 - Deep Learning Introduction

文章目录一、深度学习的概念二、函数的类型三、深度学习的步骤3.1 定义一个参数未知的函数表达式3.2 定义一个损失函数3.3 采用梯度下降法求解使得函数表达式的Loss最小的参数四、视频播放量预测案例4.1 案例介绍和思路分析4.2 线性函数表达式14.3 改进1:使用前一段…

此文件存在危险因此chrome已将其拦截

当您尝试在 chrome 中下载一些文件时,有时 chrome 会说“此文件可能很危险,因此 Chrome 已阻止它”。这可能是因为 Chrome 的内置安全功能可能已将其检测为可能有害的文件。但是,如果您信任文件的来源并想要下载它,那么您可以按照…

authorization server client resource 使用1

authorization server && client && resource 使用1 OAuth2介绍 OAuth(Open Authorization)是一个关于授权(authorization)的开放网络标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上…

leetcode.1691 堆叠长方体的最大高度 - dp + 排序

1691. 堆叠长方体的最大高度 目录 1、java 2、c 思路: 根据题目描述,长方体 j 能够放在长方体 i 上,当且仅当 题目允许旋转长方体,也就是可以选择长方体的任意一边作为长方体的高。 对于任意一种合法的堆叠&#xff0…

聊一聊三级等保

本文为joshua317原创文章,转载请注明:转载自joshua317博客 聊一聊三级等保 - joshua317的博客 一、前言 1.1 基本认知 网络安全:根据《信息安全技术网络安全等级保护基本要求》(GB/T 22239-2019),是指通过采取必要措…

m基于功率谱,高阶累积量和BP神经网络-GRNN网络的调制方式识别仿真,对比2psk,4PSK,2FSK以及4FSK

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 首先区分大类的话采用的基于功率谱提取的len参数(峰值频率间隔),用峰值个数来代替,这样能很好的区分大类把MFSK和MPSK信号区分开。 针对MPSK&…

VSCode-远程连接服务器进行开发

一:安装插件 二:设置SSH 按照划线位置依次配置要连接的服务器配置 三:打开远程连接选项 勾选此选项后即可显示配置好的远程服务器,点击登录即可。 输入服务器用户密码 注意 :终端框install不要关闭!&#…

基于MPS算法和改进的非支配排序遗传算法II(MNSGA-II)求解配备起重机的模糊鲁棒设施布局问题(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

【C语言航路】第八站:调试(第二幕)

目录 四、一些调试的实例 1.实例一 2.实例二 五、如何写出优秀的,易于调试的代码 1.优秀的代码 2.几个经典的例子 (1)模拟实现strcpy函数 (2)模拟实现strlen 六、编程常见的错误 1.编译型错误 2.链接型错误 …