# --------------------------------------------------------------------------------
# @Title: A template python file to measure the CET (Core Execution Time)
# @Description: 
#	It requires the taskevents csv file from the Trace.EXPORT.TASKEVENTS
#	(ex. temp.csv)
#
# @Author: JIM
# @Copyright: (C) 1989-2018 Lauterbach GmbH, licensed for use with TRACE32(R) only
# --------------------------------------------------------------------------------
# $Id: $

from prettytable import PrettyTable
import sys
import csv

def find_element_in_list(list_element, element):
    try:
        index_element = list_element.index(element)
        return index_element
    except ValueError:
        return None

time  = [] # time list
task  = [] # task list
event = [] #event list
markerName = [] # marker list

# input parameter passing

args_num=(len(sys.argv)-2)  # args number, skip the first 2 parameters (.py & .csv)

#for i in range(args_num):
#    markerName.append(sys.argv[i+2])

#print ("marker name:")
#for i,name in enumerate(markerName):
#    print(i,name)

if args_num == 0:  #default
    markerName.append("start")
    markerName.append("resume")
    markerName.append("stop")

else: #input the marker name to the marker Name Table
    for i in range(args_num):
        markerName.append(sys.argv[i+2])

filename = sys.argv[1]
print('Filename: %s' % filename)
if not '.csv' in filename:
    print ('ERROR: csv file is missing')
    sys.exit(0)

# csv input file parsing
f = open ( filename, 'r', encoding='utf-8')
rdr = csv.reader(f, delimiter=';')
record=list(rdr) #list

for line in record:
    str1 = ''.join(line[0])   #convert list item to the string
    if str1.find("#") != -1:
        pass
    else:
        time.append(line[0].strip())
        task.append(line[1].strip())
        event.append(line[2].strip())
f.close()

# generate task_name Table 
taskNameTable = []
for i in task:
    if i not in taskNameTable:
        taskNameTable.append(i)

# generate event_name Table 
eventNameTable = []
for i in event:
    if i not in eventNameTable:
        eventNameTable.append(i)

for i,name in enumerate(markerName):
    if find_element_in_list(eventNameTable, name ) == None:
        print("ERROR: the event name does not exist: %s" % name )
        print("events list:")
        print(eventNameTable)
        print ("example)")
        print ("cet.py temp.csv start resume stop    ; the CET time")
        sys.exit(0)
    else:
        print ("Event marker %d: %s" %(i,name) )


#print( "fist event marker: %s " % markerName[0])
#print( "end event marker : %s " % markerName[-1])

print("\n")

#sys.exit(0)

resultTbl = PrettyTable(['time(ns)', 'task_name', 'events', 'e-time(ns)'])

for j,tb in enumerate(taskNameTable):
    print ("!!!!! task: %s !!!!!" % taskNameTable[j])
    s_task = []
    for i, item in enumerate(task):
        if item==taskNameTable[j]:  
            s_task.append([time[i], task[i], event[i]])
 
#improve events context 
#for example, (switch&start) -> (schedule&start)
    for i,item in enumerate(s_task):
        if s_task[i][2].find('switch') != -1:
            if(i+1)<len(s_task):
                if s_task[i+1][2].find('start') != -1:
                    s_task[i][2]='schedule'
   
#calculate each event execution time (ti.back)
    basetime=int(s_task[0][0])

    for i,item in enumerate(s_task):

        if (i+1)==len(s_task): # if the last record
            nexttime=int(s_task[i][0])
        else:
            nexttime=int(s_task[i+1][0])
        
        exectime = nexttime-basetime
        s_task[i].append(exectime)
        resultTbl.add_row([s_task[i][0], s_task[i][1], s_task[i][2], exectime])
        basetime = nexttime

# calculate cet
    measurementTimeTbl=[]
    pre_start_time=0
    cet_status=0 #bit0, start marker hit or not
    cet_time=0

    for i,item in enumerate(s_task):
        str1 = ''.join(s_task[i][2]) # convert list item to the string
        
        if str1 in markerName:
            if markerName.index(str1) == 0: #start marker
                cet_status|=0x1
                pre_start_time=int(s_task[i][0])
                cet_time=int(s_task[i][3])
            elif markerName.index(str1) == (len(markerName)-1): #stop marker
                cet_time+=int(s_task[i][3]) #stop marker exuection time added
                if (cet_time!=0):
                    measurementTimeTbl.append(cet_time)
                cet_time=0 #clear the cet time
                cet_status&=~0x1 #clear start flag
            else: # middle events for example, "resume"
                if (cet_status&0x1):
                    cet_time+=int(s_task[i][3])

    print(resultTbl)
    table_txt = resultTbl.get_string()
    resultTbl.clear_rows() # empty all the contents in the table

    print("running time, events order %s" %markerName)

    if measurementTimeTbl:  # not empty list
#        for i in measurementTimeTbl:
#            print(i)
        print("max: %d(ns)" % (max(measurementTimeTbl)))
        print("avr: %d(ns)" % (sum(measurementTimeTbl)/len(measurementTimeTbl)))
    else:
        print("max: 0 (ns)" )
        print("avr: 0 (ns)" )

    print ("\n")

sys.exit(0)

