对于硬件工程师来说,学习一些软件可以起到事半功倍的效果,当前运用python无疑是比较高效的,有很多的库函数可以使用,并且语法简洁学习成本较低。
原理图,PCB等EDA工具可以方便的导出网表等文本文件,处理这些文件用于生成各种设计报告,check设计错误非常有帮助,下边以处理网表生成格式化的字典格式的网络-器件对应关系,器件-位号对应关系为例说明。
首先,先清理下数据,讲分散在多行的数据整合进一行,去除多余的空格,并分开网表信息和器件对应关系信息。网表来源:打开Xpedition Designer,打开要处理的原理图,依次点击file - export - keyin netlist
import re
def file_processing(file):
"""
file processing for normalization
1. summarize data in lines to single line
2. change continuous space to single space
3. split info to netlist(type:list) and part info(type:list)
file is a netlist file path, such as D:/xxx/xxx/xxx.kyn,
generated by clicking the Xpedition Designer(ee): file- export-keyin netlist
"""
data = ""
with open(file,"r") as f:
data = f.read()
data = data.replace("\n*","")
data = " ".join(re.split(r'[ ]+',data))
data_list = data.replace("%Part","%page").split("%page")
net_info = data_list[1:-1]
part_info = data_list[-1:]
return net_info,part_info
处理网表信息
def net_processing(net_info):
"""
processing info into net_dict:
eg:
{net:[[comp,pin],[comp,pin]...],...}
"""
net_dict = dict()
for page in net_info:
page = page.strip()
net_list = page.split("\n")
if len(net_list) >=1:
if net_list[0].startswith("\\"):
pass
else: # remove the first line
net_list = net_list[1:]
for net_txt in net_list:
net_data = net_txt.split(" ")
net = net_data[0].replace("\\","")
net_content = []
for net_conn in net_data[1:]:
if len(net_conn.strip()) == 0:
break
comp,pin = net_conn.split("\\-\\")
comp = comp.replace("\\","")
pin = pin.replace("\\","")
net_content.append([comp,pin])
net_dict[net] = net_content
else:
print("page no content: ", page)
return net_dict
处理器件信息
def part_processing(part_info):
"""
processing info into part_dict:
eg:
{part_position : part_name,...}
part_position, C101,U200
part_name, different between different ee library
"""
part_dict = dict()
for page in part_info:
page = page.strip()
part_list = page.split("\n")
if len(part_list) > 0:
if part_list[0].startswith("\\"):
pass
else :
part_list = part_list[1:]
for part_txt in part_list:
part_txt = part_txt.strip()
part_data = part_txt.split(" ")
part_name = part_data[0].replace("\\","")
for part_pos in part_data[1:]:
if len(part_pos.strip()) == 0:
break
part_position = part_pos.replace("\\","")
part_dict[part_position] = part_name
else:
print("part no info", page)
return part_dict
验证内容:
file = "xxx.kyn" # change to your file
net_info,part_info = file_processing(file)
print(net_info,part_info)
net_dict = net_processing(net_info)
print(net_dict)
part_dict = part_processing(part_info)
print(part_dict)
后续,可以利用这些信息处理一些事情了,比如某个网络上的负载情况,耐压情况,比如双SIM必须4根线都有连接,还可以设置checklist的标准文件,自动check。