今天写了一个python的脚本,作用是吃进excel中的寄存器列表,生成设置寄存器值得指令task。我觉得这个还满有用的,以后可以用它来生成仿真测试的setup激励了。分享给大家
···
#!/usr/bin/python3
#1.利用import导入第三方库openpyxl
import os;
import openpyxl;
from openpyxl import load_workbook
#2.打开文件
#file_location = "/mnt/hgfs/share/python/test1.xlsx";
#file_location = "D:/share/test1.xlsx";
file_location = "D:/share/python/93010E_Register_list.xlsx";
#3.利用load_workbook载入表格的位置,加载表格
excel = load_workbook(file_location);
#4.通过get_sheet_by_name方法,来去读表格
table = excel.get_sheet_by_name('Summary');
#global i2c_page;
i2c_page ='FF';#给i2c_page设置初始值
# 处理行的page及命令
def page_set(page,dev_addr):
str='';
global i2c_page;
if(page!=i2c_page):
print(page);
#切换page
str='\t' + '//change i2c page register\n';
str=str+'\t' + 'u_pmb_mstr_send_cmd_one_byte(7\'h'+dev_addr+',8\'h00'+',8\'h'+page+');\n';
i2c_page = page;
return str;
# 产生写寄存器的命令文本
def cmd_line_proc(dev_addr,page,cmd,reg_value,length,reg_name):
## print register name
str=page_set(page,dev_addr);
str=str+'\t' + '//'+reg_name+'\n';
if(length=='0'):
str =str +'\t'+'u_pmb_mstr_send_cmd_no_byte(7\'h'+dev_addr+',8\'h'+cmd+';\n';
elif(length=='1'):
str =str +'\t'+'u_pmb_mstr_send_cmd_one_byte(7\'h'+dev_addr+',8\'h'+cmd+',16\'h'+reg_value+');\n';
elif(length=='2'):
str =str +'\t'+'u_pmb_mstr_send_cmd_two_byte(7\'h'+dev_addr+',8\'h'+cmd+',16\'h'+reg_value+');\n';
else:
str ='\n';
return str;
#5.通过指定行和列来获取具体单元格的值
def proc_cmds(n):
line='';
dev_addr = table.cell(row=n,column=2).value;
page = table.cell(row=n,column=3).value;
cmd = table.cell(row=n,column=4).value;
reg_value = table.cell(row=n,column=5).value;
length = table.cell(row=n,column=6).value;
reg_name = table.cell(row=n,column=7).value;
print(dev_addr,page,cmd,reg_value,length);
if(dev_addr==None):
line='';
else:
line=cmd_line_proc(dev_addr,page,cmd,reg_value,length,reg_name);
return line;
fo = open("task.v", mode='w+', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
print ("文件名: ", fo.name)
print ("是否已关闭 : ", fo.closed)
print ("访问模式 : ", fo.mode);
print ("第一次打开文件,打印读出的内容");
str = fo.read();
print (str);
fo.write( "task register_setting;\n" )
b = 'begin\n';
fo.write( b );
print(i2c_page);
for n in range(2, 300):
c=proc_cmds(n);
## if present columm is empty, then no more commands need to be read
if(c==''):
break;
else:
fo.write( c );
fo.write("end\n");
fo.write("endtask");
···