python做FPGA EG01约束文件文本格式批量更改
一切机械的重复的工作都应该自动化
这两天陪YJJ学FPGA,我也是头一次接触vivado和verilog,写起程序来真是让人头大。其中有一个EG01约束文件,就是用来配引脚的,但是原本文件的格式没法直接用,需要改一下。一个17页的文档呀,一条一条的改不得改到疫情结束呀-- 一切机械的重复的工作都应该自动化。 秉承这个理念我夸下海口:“放着我来!”于是蹩脚的使用python做FPGA EG01约束文件文本格式批量更改。
先看看我们具体要干什么
原来这个文档全都是最后一行那个样子,我们需要把它转化成上面两行那样。
再做一下任务分解
1.读取原文件
2.标记重要信息
3.提取重要信息
4.重新塑造格式
5.导出保存
最后做一下环境说明
本程序编写环境 win10+vscode+python3.8.1
1.读取原文件
FPGA的EG01约束文件是docx格式,python在做读取之前需要载入pyhton-docx包。
win+R打开运行框键入cmd打开命令窗口,进入到python加载包的路径也就是安装路径下的script文件夹,这是我的路径,cd是进入文件夹操作,后面的路径需自行更换
cd C:\Users\yuuki\AppData\Local\Programs\Python\Python38-32\Scripts
再使用pip下载python-docx包
pip install python-docx
做完这些准备之后打开编辑器vscode,导入我们刚才下载的操作word文档所需要的包
from docx import Document
from docx.shared import Inches
加载word文档
EG01 = Document('E:\yjj\EGO1约束文件.docx') #打开EGO1约束文件.docx
来验证一下效果
for paragraph in EG01.paragraphs: #遍历每一段
print(paragraph.text) #打印各段落内容文本
ok没问题,终端显示文档已按段导入成功
2.标记重要信息
通过分析文本特点我们发现,关键信息为本文第一张图里面突出的部分,而与这部分紧密连接的上下文,有共通的地方,利用每段单一存在的特殊符号做字符串分割是最轻松的,所以我们对文本信息先进行预处理,将关键信息上下文共通的地方在word里统一替换成每段唯一特殊符号(文档里有几句格式并不统一,需手动更改,以保证所提取信息的完整性和正确性),本例使用“ * ”和“ + ” 号
3.提取重要信息
接下来我们需要批量提取标题和关键信息
for paragraph in EG01.paragraphs: #遍历每一段
a = paragraph.text.split('*') #提取关键信息(已在文件中标记)
b = paragraph.text.split('+')
if len(a) == 1: #提取结果验证
print(a[0])
else:
print(a[1],b[1])
在终端查看一下提取结果验证,ok没问题
4.重新塑造格式
按照目标格式编写word文件每一段内容模板并嵌入标题和关键信息
for paragraph in EG01.paragraphs: #遍历每一段
#print(paragraph.text) #打印各段落内容文本
a = paragraph.text.split('*') #提取关键信息(已在文件中标记)
b = paragraph.text.split('+')
if len(a) == 1:
yjj.add_paragraph(a[0]) #打印分割标题
else:
yjj.add_paragraph('set_property PACKAGE_PIN' + a[1] + '[get_ports{' + b[1] + '}]') #按新格式要求打印文本
yjj.add_paragraph('set_property IOSTANDARD LVCMOS33' + '[get_ports{' + b[1] + '}]')
5.导出保存
yjj.save("E:\yjj\yjj.docx") #保存文件
来让我们看一下最终效果
ok完美完成任务,收工
完整程序如下:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
__author__ = 'Yuuki'
from docx import Document
from docx.shared import Inches
import re
EG01 = Document('E:\yjj\EGO1约束文件.docx') #打开EGO1约束文件.docx
yjj = Document() #创建新文件
for paragraph in EG01.paragraphs: #遍历每一段
#print(paragraph.text) #打印各段落内容文本
a = paragraph.text.split('*') #提取关键信息(已在文件中标记)
b = paragraph.text.split('+')
if len(a) == 1:
yjj.add_paragraph(a[0]) #打印分割标题
else:
yjj.add_paragraph('set_property PACKAGE_PIN' + a[1] + '[get_ports{' + b[1] + '}]') #按新格式要求打印文本
yjj.add_paragraph('set_property IOSTANDARD LVCMOS33' + '[get_ports{' + b[1] + '}]')
yjj.save("E:\yjj\yjj.docx") #保存文件