python脚本处理------正则表达式提取关键字

python脚本处理------正则表达式提取关键字

使用到的 API

re 正则表达式api
argparse 做参数配置
gzip 对 .gz 格式的文件做解码操作

关键使用方法

re.sub()
re.findall()
gzip.open()
line.decode()


import gzip
import argparse
import re


parse = argparse.ArgumentParser()
# set root dir
parse.add_argument('--root_path','-r',default='/root/dir_ip_path',help='root dir path')
args = parse.parse_args()

root_path = args.root_path

### 正则表达式 提取 path 中的 关键字 --- ip
ip_search = r'/root/dir/(.*?)_path'
### get ip name
ip_name = re.findall(ip_search,root_path)[0]

## get macro path && memory list path
## 指定 root/dir_ip_path 内部子文件 ,后者有 .gz 文件,需要特殊处理
macro_path = "{0}/data/{1}.macro.ref.list".format(root_path,ip_name)
memory_list_path = "{0}/reports/synthesis/{1}.mapped.qor.rpt.gz".format(root_path,ip_name)

## get macro dict {Macro Count : ***}
## 用 常规的遍历方法 得到 macro count 个数
macro_file = open(macro_path,'r')
for line in macro_file.readlines():
    if ("Macro Count" not in line):
        continue
    else:
        line = line.split("\n")[0]
        macro_count = line.split(":")[1].split(" ")[1]
macro_file.close()


## read .gz file (need to decode)
memory_list_file = gzip.open(memory_list_path,'rb')


with open('./{}_memory_list.txt'.format(ip_name),'w') as f0:
    ip_clk0 = False
    ip_clk1 = False
    ip_clk2 = False
    for line in memory_list_file.readlines():
        ll = line.decode()
        f0.write(ll)
        if ("ip_clk0" in ll):
            ip_clk0 = True
        if ("ip_clk1" in ll):
            ip_clk1 = True
        if ("ip_clk2" in ll):
            ip_clk2 = True   
f0.close()


memory_txt = open('./{}_memory_list.txt'.format(ip_name)).read()
########## remove '/n' and '/*'   使用 re.sub 去掉转义字符
###### Regular expressions can only handle consecutive lines
memory_oneline = re.sub('\s+','',memory_txt).strip()

## 使用正则表达式的 re,findall 方法的到   关键信息
ecf_search = r'ecf_clk(.*?)CriticalPathClkPeriod'
ecf_log = re.findall(ecf_search,memory_oneline)[0]
ecf_CriticalPathSlack = ecf_log.split("CriticalPathSlack:")[1]
#print(ecf_CriticalPathSlack)

ecf_ICG_search = r'ecf_clk_TO_ICG(.*?)CriticalPathClkPeriod'
ecf_ICG_log = re.findall(ecf_ICG_search,memory_oneline)[0]
ecf_ICG_CriticalPathSlack = ecf_ICG_log.split("CriticalPathSlack:")[1]


edf_search = r'edf_clk(.*?)CriticalPathClkPeriod'
edf_log = re.findall(edf_search,memory_oneline)[0]
edf_CriticalPathSlack = edf_log.split("CriticalPathSlack:")[1]
#print(edf_CriticalPathSlack)

edf_ICG_search = r'edf_clk_TO_ICG(.*?)CriticalPathClkPeriod'
edf_ICG_log = re.findall(edf_ICG_search,memory_oneline)[0]
edf_ICG_CriticalPathSlack = edf_ICG_log.split("CriticalPathSlack:")[1]


if (ip_clk0 == True):
    ip0_search = r'ip_clk0(.*?)CriticalPathClkPeriod'
    ip0_log = re.findall(ip0_search,memory_oneline)[0]
    ip0_CriticalPathSlack = ip0_log.split("CriticalPathSlack:")[1]
    
    ip0_ICG_search = r'ip_clk0_TO_ICG(.*?)CriticalPathClkPeriod'
    ip0_ICG_log = re.findall(ip0_ICG_search,memory_oneline)[0]
    ip0_ICG_CriticalPathSlack = ip0_ICG_log.split("CriticalPathSlack:")[1]



if (ip_clk1 == True):
    ip1_search = r'ip_clk1(.*?)CriticalPathClkPeriod'
    ip1_log = re.findall(ip1_search,memory_oneline)[0]
    ip1_CriticalPathSlack = ip1_log.split("CriticalPathSlack:")[1]

    ip1_ICG_search = r'ip_clk1_TO_ICG(.*?)CriticalPathClkPeriod'
    ip1_ICG_log = re.findall(ip1_ICG_search,memory_oneline)[0]
    ip1_ICG_CriticalPathSlack = ip1_ICG_log.split("CriticalPathSlack:")[1]


if (ip_clk2 == True):
    ip2_search = r'ip_clk2(.*?)CriticalPathClkPeriod'
    ip2_log = re.findall(ip2_search,memory_oneline)[0]
    ip2_CriticalPathSlack = ip2_log.split("CriticalPathSlack:")[1]

    ip2_ICG_search = r'ip_clk2_TO_ICG(.*?)CriticalPathClkPeriod'
    ip2_ICG_log = re.findall(ip2_ICG_search,memory_oneline)[0]
    ip2_ICG_CriticalPathSlack = ip2_ICG_log.split("CriticalPathSlack:")[1]


comb_area_search = r'CombinationalArea:(.*?)NoncombinationalArea'
comb_area = re.findall(comb_area_search,memory_oneline)[0]


noncomb_area_search = r'NoncombinationalArea:(.*?)Buf/InvArea'
noncomb_area = re.findall(noncomb_area_search,memory_oneline)[0]


macro_black_area_search = r'Macro/BlackBoxArea:(.*?)NetArea'
macro_black_area = re.findall(macro_black_area_search,memory_oneline)[0]


## if string have "()" , such as CellArea(netlist) , we need to operation like this :
## ()  change to [(][)]
cell_area_search = r'CellArea[(]netlist[)]:(.*?)CellArea[(]netlistandphysicalonly[)]'
cell_area = re.findall(cell_area_search,memory_oneline)[0]



##   打开一个 txt 文件,追加写入 信息 到 txt 文件中去
with open ('./info.txt','a') as ff:
    ff.write("{}:Macro_Count={}\n".format(ip_name,macro_count))
    ff.write("{}:ecf_clk.Critical Path Slack={}\n".format(ip_name,ecf_CriticalPathSlack))
    ff.write("{}:ecf_clk_TO_ICG.Critical Path Slack={}\n".format(ip_name,ecf_ICG_CriticalPathSlack))
    ff.write("{}:edf_clk.Critical Path Slack={}\n".format(ip_name,edf_CriticalPathSlack))
    ff.write("{}:edf_clk_TO_ICG.Critical Path Slack={}\n".format(ip_name,edf_ICG_CriticalPathSlack))
    if (ip_clk0 == True):
        ff.write("{}:ip_clk0.Critical Path Slack={}\n".format(ip_name,ip0_CriticalPathSlack))
        ff.write("{}:ip_clk0_TO_ICG.Critical Path Slack={}\n".format(ip_name,ip0_ICG_CriticalPathSlack))
    if (ip_clk1 == True):
        ff.write("{}:ip_clk1.Critical Path Slack={}\n".format(ip_name,ip1_CriticalPathSlack))
        ff.write("{}:ip_clk1_TO_ICG.Critical Path Slack={}\n".format(ip_name,ip1_ICG_CriticalPathSlack))
    if (ip_clk2 == True):
        ff.write("{}:ip_clk2.Critical Path Slack={}\n".format(ip_name,ip2_CriticalPathSlack))
        ff.write("{}:ip_clk2_TO_ICG.Critical Path Slack={}\n".format(ip_name,ip2_ICG_CriticalPathSlack))
    
    ff.write("{}:Combinational Area={}\n".format(ip_name,comb_area))
    ff.write("{}:Noncombinational Area={}\n".format(ip_name,noncomb_area))
    ff.write("{}:Macro/Black Box Area={}\n".format(ip_name,macro_black_area))
    ff.write("{}:Cell Area (netlist)={}\n".format(ip_name,cell_area))

ff.close()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wiggle coin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值