前言
vivado 综合+实现要跑好长时间,耍会儿手机不过分吧。然而我不想时不时抬头看有没有跑完,于是产生了该脚本
一. QQ邮箱配置
参考:https://blog.csdn.net/qq_40608730/article/details/104904398?spm=1001.2014.3001.5502
(注:网易邮箱等也可以配置)
首先按下面三张图开启SMTP服务,开启后会出现一个授权码,请牢记这个邮箱授权码,后面也会用到
二. Python脚本
我用的是python 3.9.12,应该不需要额外安装包
我使用的Vivado版本为Vivado2020.2
下面脚本需要修改的变量有:
1. QQ发送邮箱:my_sender
2. QQ发送邮箱的授权码:my_pass
3. QQ接收邮箱:my_user,因为我是自己发给自己也能收到,所以my_suer = my_sender
4. vivado的runs路径,如果工程路径为xxx\project_1,那么runs的路径为xxx/project_1\project_1.runs
5. 变量SYN,应该不需要更改,但是SYN=r’\synth_2’的情况还是有的
6. 变量IMP,应该也不需要更改,但是IMP=r’\impl_2`的情况也还是有的
7.时间问题,主要有两个时间,一个是函数vivado_run_over()里的50秒,还有一个是代码最后一行的5秒。不改的话问题应该不大,我的工程是没有50秒就跑完的
# coding=utf-8
import time
import os
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
def mail(title,message,mail_sender,mail_pass,mail_user):
ret=True
try:
#msg=MIMEText('填写邮件内容','plain','utf-8')
mail_msg = message
msg = MIMEText(mail_msg, 'html', 'utf-8')
msg['From']=formataddr(["Project",mail_sender]) # 括号里的对应发件人邮箱昵称、发件人邮箱账号
msg['To']=formataddr(["nothing",my_user]) # 括号里的对应收件人邮箱昵称、收件人邮箱账号
msg['Subject']=title # 邮件的主题,也可以说是标题
'''
QQ邮箱使用下面这种方式才成功
'''
server=smtplib.SMTP_SSL("smtp.qq.com", 465) # 发件人邮箱中的SMTP服务器,端口是465,固定的,不能更改
server.login(mail_sender, mail_pass) # 括号中对应的是发件人邮箱账号、邮箱密码
server.set_debuglevel(1)
server.sendmail(mail_sender,[mail_user,],msg.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
server.quit() # 关闭连接
except Exception as err: # 如果 try 中的语句没有执行,则会执行下面的 ret=False
print(err)
ret=False
return ret
def vivado_run_over(vivado_runs,fold):
file_path = vivado_runs + fold
file_path = file_path + r'\runme.log'
#print(file_path)
if os.path.exists(file_path):
file_time = os.path.getmtime(file_path)
now_time = time.time()
interval = timeMinus(file_time,now_time)
if(interval < 50):#假设至少50秒跑完synthesis 或 implementation
if(get_vivado_state(file_path)):
print("send email")
flag = True
else:
flag = False
else:
#print("continue\n")
flag = False
else:
flag = False
return flag
def timeMinus(time1,time2):
interval = int(abs(time1-time2))
return interval
def delay(DELAY):
time.sleep(DELAY) #seconds
print("delay " + str(DELAY) + " seconds\n")
def get_vivado_state(file_name):
status = False
with open (file_name,'r') as rf:
line = rf.readlines()[-1]
if line.count('Exiting Vivado'):
status = True
else:
status = False
return status
my_sender='xxxxxxxx@qq.com' # 发件人邮箱账号
my_pass = 'xxxxxxxx' # 发件人邮箱授权码,第一步得到的
my_user=my_sender # 收件人邮箱账号,可以发送给自己
title_syn= 'Synthesis 跑完了'
title_imp= 'Implementation 跑完了'
message ="""
<p>Vivado 提醒警告...</p>
"""
vivado_runs = r'xxxxx\project_1\project_1.runs'
if __name__ == "__main__":
SYN = r'\synth_1'
IMP = r'\impl_1'
just_syn = True
just_imp = True
while(True):
if(just_syn and vivado_run_over(vivado_runs,SYN)):
if(mail(title_syn,message,my_sender,my_pass,my_user)):
print("Synthesis 邮件发送成功")
just_syn = False
break
else:
print("Synthesis 邮件发送失败")
break
elif(just_imp and vivado_run_over(vivado_runs,IMP)):
if(mail(title_imp,message,my_sender,my_pass,my_user)):
print("Implementation 邮件发送成功")
just_imp = False
break
else:
print("Implementation 邮件发送失败")
break
else:
if((not just_syn) and (not just_imp) ):
break
delay(5) #延迟5秒