import os,sys,time
|
|
import cli
|
|
from conf import *
|
|
from skyeye_common_module import *
|
|
import se_system as ss
|
|
import threading
|
|
from fuzzywuzzy import fuzz
|
|
import fault_inject as fi
|
|
import se_func as sf
|
|
import skyeye_autotest_command as sac
|
|
import pytimer
|
|
import skyeye_common_module as scm
|
|
|
|
|
|
MO_READ = 1
|
|
MO_WRITE = 2
|
|
|
|
OP_CHAR_TYPE = 1
|
|
OP_SHORT_TYPE = 2
|
|
OP_WORD_TYPE = 4
|
|
OP_DWORD_TYPE = 8
|
|
|
|
TY_INT = "int"
|
|
TY_FLOAT = "float"
|
|
TY_DOUBLE = "double"
|
|
|
|
def SE_define_conf(filename):
|
|
try:
|
|
Config = json_conf(parent = None, filename = filename)
|
|
if Config.get_init_result() == False:
|
|
print ("load_config error")
|
|
return False
|
|
Config.instance()
|
|
SetGlobalConfig(Config)
|
|
define_json_file[0] = os.path.join(os.getcwd(), filename)
|
|
except:
|
|
print ("load_config error")
|
|
return False
|
|
|
|
def SE_load_binary(cpuname,filename):
|
|
if os.path.isfile(filename)==False:
|
|
print ("No such binary file")
|
|
return False
|
|
if SkyEyeLoadBinary(cpuname,filename)!=1:
|
|
print ("load_binary error")
|
|
return False
|
|
binary_l[cpuname] = os.path.join(os.getcwd(), filename)
|
|
|
|
def SE_init_ok():
|
|
SkyEyePrepareToRun()
|
|
if ss.system ==None:
|
|
ss.CreateClass()
|
|
|
|
def SE_run_script(filename):
|
|
fullfilename = os.path.realpath(filename)
|
|
if not os.path.exists(fullfilename):
|
|
print ("%s file does not exists!" % fullfilename)
|
|
return False
|
|
fp = open(fullfilename,'r')
|
|
lines = fp.readlines()
|
|
fp.close()
|
|
cmd = cli.GetCommand("run-command")
|
|
if cmd == None:
|
|
SE_print("Can not find command: run-command")
|
|
return False
|
|
for line in lines:
|
|
line = line.strip(' \n')
|
|
if line == "" or line[0] == '#' or "run-pyfile" in line:
|
|
continue
|
|
try:
|
|
ret=cmd.run(line)
|
|
except Exception as e:
|
|
SE_print(e)
|
|
return False
|
|
return True
|
|
|
|
def SE_run():
|
|
SkyEyeRun()
|
|
|
|
def SE_stop():
|
|
SkyEyeStop()
|
|
|
|
def SE_stop_autotest():
|
|
if sac.ac != None:
|
|
sac.ac.autotest_run = False
|
|
|
|
def SE_reset():
|
|
SkyEyeReset()
|
|
|
|
def SE_restart():
|
|
SE_reset()
|
|
SE_define_conf(define_json_file[0])
|
|
for binary in binary_l.keys():
|
|
SE_load_binary(binary,os.path.normpath(binary_l[binary]))
|
|
SE_init_ok()
|
|
|
|
def SE_running_status():
|
|
return SkyEyeRunningStatus()
|
|
|
|
def SE_pre_conf_obj(classname, objname):
|
|
SkyEyePreConfObj(objname,classname)
|
|
obj = ss.SkyEyeBaseClass(objname,classname,None)
|
|
return obj
|
|
|
|
def SE_sleep(s):
|
|
time.sleep(s)
|
|
|
|
log=None
|
|
|
|
def SE_print(data):
|
|
global log
|
|
if log == None:
|
|
return
|
|
r_obj=ss.__redirection__()
|
|
r_obj.set_out()
|
|
print (data)
|
|
r_obj.reset()
|
|
log.WriteText(r_obj.buff)
|
|
|
|
def SE_compare(actual_out,expect_out,accuracy):
|
|
sj_output=actual_out
|
|
try:
|
|
fp1=open(sj_output,'r')
|
|
except:
|
|
SE_print('The actual output file was not found')
|
|
return
|
|
actual=fp1.read()
|
|
fp1.close()
|
|
rmlist=['\t','\r',' ','\n']
|
|
for i in rmlist:
|
|
actual=actual.replace(i,'')
|
|
expect_out=expect_out.replace(i,'')
|
|
if len(actual)==0:
|
|
SE_print('The actual output file is empty')
|
|
return
|
|
if len(expect_out)==0:
|
|
SE_print('The desired output is empty')
|
|
return
|
|
accuracy_list=[]
|
|
accuracy_list.append(fuzz.ratio(actual,expect_out))
|
|
accuracy_list.append(fuzz.partial_ratio(actual,expect_out))
|
|
if accuracy!=100:
|
|
accuracy_list.append(fuzz.token_set_ratio(actual,expect_out))
|
|
max_accuracy = max(accuracy_list)
|
|
if max_accuracy >= accuracy:
|
|
SE_print("Proofreading success")
|
|
return True
|
|
else:
|
|
SE_print('Check failure. expect accuracy: %d%% max actual accuracy: %d%%'%(accuracy,max_accuracy))
|
|
return False
|
|
|
|
def SE_set_fault_inject(machname,addr,bit,mode):
|
|
return fi.skyeye_set_fj_by_aadr(machname,addr,bit,mode)
|
|
|
|
def SE_get_fault_inject():
|
|
return fi.skyeye_get_fj()
|
|
|
|
def SE_clear_fault_injece(machname,addr,bit,mode):
|
|
return fi.skyeye_clear_fj_by_addr(machname,addr,bit,mode)
|
|
|
|
def SE_set_register_value(machname,addr,value):
|
|
return sf.set_reg_value_by_addr(machname,addr,value)
|
|
|
|
def SE_get_register_value(machname,addr):
|
|
return sf.get_reg_value_by_addr(machname,addr)
|
|
|
|
def SE_get_simulation_time(cpuname):
|
|
return SkyEyeGetSimulationRunTime(cpuname)
|
|
|
|
def SE_enable_parse_symbol(cpuname,binary):
|
|
cmd = cli.GetCommand("parse-symbol")
|
|
if cmd == None:
|
|
SE_print("Can not find command: parse-symbol")
|
|
return False
|
|
try:
|
|
ret=cmd.run([cpuname,binary])
|
|
except Exception as e:
|
|
SE_print(e)
|
|
return False
|
|
return ret
|
|
|
|
def SE_get_global_variable_addr(cpuname,varname):
|
|
return SkyEyeGetSymbolAddr(cpuname,varname)
|
|
|
|
def SE_get_global_variable_value(cpuname,varname,value_bytes_number,value_type):
|
|
if value_type == TY_INT:
|
|
return SkyEyeGetSymbolValue(cpuname,varname,value_bytes_number)
|
|
elif value_type == TY_FLOAT:
|
|
return SkyEyeGetFloatSymbolValue(cpuname,varname,value_bytes_number)
|
|
elif value_type == TY_DOUBLE:
|
|
return SkyEyeGetDoubleSymbolValue(cpuname,varname,value_bytes_number)
|
|
else:
|
|
pass
|
|
|
|
|
|
|
|
|
|
def SE_set_global_variable_value(cpuname,varname,value,value_bytes_number,value_type):
|
|
if value_type == TY_INT:
|
|
return SkyEyeSetSymbolValue(cpuname,varname,value,value_bytes_number)
|
|
elif value_type == TY_FLOAT:
|
|
return SkyEyeSetFloatSymbolValue(cpuname,varname,value,value_bytes_number)
|
|
elif value_type == TY_DOUBLE:
|
|
return SkyEyeSetDoubleSymbolValue(cpuname,varname,value,value_bytes_number)
|
|
else:
|
|
pass
|
|
|
|
def SE_log_output(filename,content):
|
|
now_time = time.strftime('%m%d%H%M%S',time.localtime(time.time()))
|
|
new_filename = filename+"_"+now_time+".txt"
|
|
try:
|
|
fp = open(new_filename,"w")
|
|
fp.write(content)
|
|
fp.close()
|
|
except:
|
|
print ("Write file failed")
|
|
|
|
def SE_out_error_log(log):
|
|
if sac.ac != None:
|
|
sac.ac.error_test.append([sac.ac.error_reset(sac.ac.test_info),log])
|
|
|
|
def SE_run_to_time(cpuname,time_s):
|
|
sf.run_to_time(cpuname,time_s)
|
|
|
|
def SE_create_breakpoint(cpuname,addr):
|
|
try:
|
|
SkyEyeCreateBreakpoint(cpuname,addr)
|
|
except Exception as e:
|
|
SE_print(e)
|
|
|
|
def SE_get_current_pc(cpuname):
|
|
try:
|
|
return SkyEyeGetPcByCoreName(cpuname)
|
|
except Exception as e:
|
|
SE_print(e)
|
|
|
|
def SE_get_cpu_freq(cpuname):
|
|
try:
|
|
return SkyEyeGetCpuFreq(cpuname)
|
|
except Exception as e:
|
|
SE_print(e)
|
|
|
|
def SE_read_byte(cpuname,addr):
|
|
try:
|
|
return SkyEyeReadByte(cpuname,addr)
|
|
except Exception as e:
|
|
SE_print(e)
|
|
|
|
def SE_read_dword(cpuname,addr):
|
|
try:
|
|
return SkyEyeReadDWord(cpuname,addr)
|
|
except Exception as e:
|
|
SE_print(e)
|
|
def SE_write_byte(cpuname,addr,value):
|
|
try:
|
|
return SkyEyeWriteByte(cpuname,addr,value)
|
|
except Exception as e:
|
|
SE_print(e)
|
|
|
|
def SE_write_dword(cpuname,addr,value):
|
|
try:
|
|
return SkyEyeWriteDWord(cpuname,addr,value)
|
|
except Exception as e:
|
|
SE_print(e)
|
|
|
|
def SE_sync_callback(cpuname,my_callback,argument):
|
|
return pytimer.PyTmrCreate(cpuname,0,pytimer.TMR_ONE_SHOT,my_callback, argument)
|
|
|
|
def SE_create_timer(cpuname,time_ms,my_callback,argument):
|
|
return pytimer.PyTmrCreate(cpuname,time_ms,pytimer.TMR_ONE_SHOT,my_callback, argument)
|
|
|
|
def SE_delete_timer(tmr):
|
|
try:
|
|
return pytimer.PyTmrDelete(tmr)
|
|
except:
|
|
return False
|
|
|
|
def SE_set_watch_on_pc(cpuname,pc_addr,my_callback,argument):
|
|
return pytimer.PySetWatchOnPc(cpuname,pc_addr,my_callback,argument)
|
|
|
|
def SE_del_watch_on_pc(watch):
|
|
try:
|
|
return pytimer.PyUnWatchOnPc(watch)
|
|
except:
|
|
return False
|
|
|
|
def SE_set_watch_on_mem(ms_name,mm_type,addr,data_type,length,my_callback,argument):
|
|
return pytimer.PySetWatchOnMem(ms_name,mm_type,addr,data_type,length,my_callback,argument)
|
|
|
|
def SE_del_watch_on_mem(watch):
|
|
try:
|
|
return pytimer.PyUnWatchOnMem(watch)
|
|
except:
|
|
return False
|
|
|
|
def SE_get_func_addr(cpuname,funcname):
|
|
try:
|
|
return SkyEyeGetFuncAddr(cpuname,funcname)
|
|
except Exception as e:
|
|
SE_print(e)
|
|
|
|
def SE_get_func_length(cpuname,funcname):
|
|
try:
|
|
return SkyEyeGetFuncLength(cpuname,funcname)
|
|
except Exception as e:
|
|
SE_print(e)
|
|
|
|
def SE_load_file(memoryname, filename, pc_addr):
|
|
if os.path.isfile(filename)==False:
|
|
print ("No such binary file")
|
|
return False
|
|
if SkyEyeNewLoadFile(memoryname, filename, pc_addr) != 1:
|
|
print ("load_file error")
|
|
return False
|
|
|
|
def SE_cpu_load_file(cpuname, filename, pc_addr):
|
|
if os.path.isfile(filename)==False:
|
|
print ("No such binary file")
|
|
return False
|
|
if SkyEyeLoadFile(cpuname, filename, pc_addr) != 1:
|
|
print ("load_file error")
|
|
return False
|
|
|
|
def SE_term_wait_for_string(termname, string):
|
|
return SkyEyeTermWaitForString(termname, string)
|
|
|
|
def SE_term_write(termname, string):
|
|
return SkyEyeTermWrite(termname, string)
|
|
|
|
def SE_term_wait_then_write(termname, wait_string, write_string):
|
|
return SkyEyeTermWaitThenWrite(termname, wait_string, write_string)
|
|
|
|
def SE_get_device_register_list(machname, devicename):
|
|
regs = []
|
|
RegNum = SkyEyeGetDevRegNum(machname,devicename)
|
|
for regid in range(0,RegNum):
|
|
regs.append(SkyEyeGetDevRegNameById(machname,devicename,regid))
|
|
return regs
|
|
|
|
def SE_Device_skyEyeGetDevRegNum(machname,devicename):
|
|
return SkyEyeGetDevRegNum(machname,devicename)
|
|
|
|
def SE_SkyEyeGetModules():
|
|
return SkyEyeGetModules()
|
|
|
|
def SE_get_regs(machname,devname):
|
|
return fi.get_device_register_info(machname,devname)
|
|
|
|
def SE_get_registers(devicename):
|
|
reg_list = []
|
|
reg_list1=[]
|
|
reg_attr_dic1 = {}
|
|
try:
|
|
num = scm.SkyEyeGetDevRegNum(None, devicename)
|
|
except:
|
|
return None
|
|
for i in range(0, num):
|
|
try:
|
|
name = scm.SkyEyeGetDevRegNameById(None, devicename, i)
|
|
if name == None:
|
|
continue
|
|
except:
|
|
return None
|
|
try:
|
|
value = scm.SkyEyeGetDevRegValueById(None, devicename, i)
|
|
except:
|
|
return None
|
|
try:
|
|
offset = scm.SkyEyeGetDevRegOffsetById(None, devicename, i)
|
|
except:
|
|
return None
|
|
if offset == 0xffffffff:
|
|
offset = i * 4
|
|
|
|
reg_attr_dic={}
|
|
|
|
reg_attr_dic["offset"] = offset
|
|
reg_attr_dic["size"] = 4
|
|
reg_attr_dic["value"] = value
|
|
reg_attr_dic["name"] = name
|
|
reg_list.append(reg_attr_dic)
|
|
|
|
reg_attr_dic1[devicename] = reg_list
|
|
# reg_list1.append(reg_attr_dic1)
|
|
return reg_attr_dic1
|
|
|
|
def SE_ReadDevice4(device, offset):
|
|
return SkyEyeReadDevice4(device, offset)
|
|
|
|
def SE_WriteDevice4(device, offset,data):
|
|
return SkyEyeWriteDevice4(device, offset,data)
|
|
|
|
def SE_Test_regs_read_wirte(test_num,device,reg_name, offset,alter_value,expect):
|
|
alter_value=int(alter_value)
|
|
init_vaule= SkyEyeReadDWord(device,offset)
|
|
a=SE_write_dword(device, offset,alter_value)
|
|
actual_value = SkyEyeReadDWord(device,offset)
|
|
if actual_value == expect:
|
|
result = "true"
|
|
else:
|
|
result = "false"
|
|
return [test_num,device,reg_name,hex(eval(str(offset))),hex(eval(str(init_vaule))),hex(eval(str(alter_value))),hex(eval(str(expect))),hex(eval(str(actual_value))),result]
|
|
|
|
def SE_get_simulation_device_info():
|
|
result='false'
|
|
error=None
|
|
device_info={}
|
|
config = GetGlobalConfig()
|
|
if config!=None:
|
|
mach_list=config.get_mach_list()
|
|
for machname in mach_list:
|
|
device_info[machname]={}
|
|
device_list = config.get_device_list_by_mach(machname)
|
|
dev_list=[]
|
|
if device_list != None:
|
|
for device in device_list:
|
|
cls = config.get_device_classname(machname, device)
|
|
base=SkyEyeGetClassType(cls)
|
|
if "image" in cls or "memory_space" in cls or "ram" in cls or "_core" in cls:
|
|
pass
|
|
else:
|
|
dev_list.append(device)
|
|
device_info[machname]=dev_list
|
|
result=device_info
|
|
device_list=[]
|
|
for j,k in result.items():
|
|
device_list.extend(k)
|
|
else:
|
|
error="The config is None"
|
|
return device_list
|
|
|
|
def SE_Quit():
|
|
SkyEyeQuit()
|