| |
|
|
| |
| from asyncore import write |
| import My_Difflib |
| from distutils.command.config import config |
| import os, sys,string,re,glob |
| import html |
| import csv |
| import copy |
| from tqdm import tqdm |
| import pathlib |
|
|
| folder = str(pathlib.Path(__file__).parent.resolve()) |
|
|
| Wrong_Dir = folder |
| Mips_Dir = folder + "/Mips_Code" |
| VEGA_Dir = folder + "/VEGA_Code" |
| Ans_Dir = folder + "/Std_Code" |
| count_wrong = 0 |
|
|
| Mod_File_Func = {} |
| Mod_Result = {} |
|
|
|
|
|
|
| def deal_dir(src_dir): |
| global Mod_File_Func |
| global Mod_Result |
| if not os.path.exists(src_dir): |
| return False |
| filelists = os.listdir(src_dir) |
| for eachfile in filelists: |
| tem =eachfile |
| eachfile = src_dir + '/' +eachfile |
| if os.path.isdir(eachfile): |
| deal_dir(eachfile) |
| elif os.path.isfile(eachfile) and ".cpp" in eachfile: |
| module = eachfile.split("/")[-3] |
| if module not in Mod_Result.keys(): |
| Mod_Result[module] = [0,0,0] |
| file = eachfile.split("/")[-2] |
| func = eachfile.split("/")[-1].replace(".cpp", "") |
| if (" ").join([module, file, func]) not in Mod_File_Func.keys(): |
| Mod_File_Func[(" ").join([module, file, func])] = [] |
| codes = "" |
| f2 = open(eachfile, encoding = "utf-8") |
| lines = f2.readlines() |
| |
| for idx, l in enumerate(lines): |
| if idx == len(lines) - 1: |
| codes += l.replace(" ", "").replace("\n", "").lower().replace("mips","").replace("xcore", "").replace("pulp", "").replace("riscv", "") |
| else: |
| codes += l.replace(" ", "").lower().replace("mips","").replace("xcore", "").replace("pulp", "").replace("riscv", "") |
| f2.close() |
| |
| if "/Mips" in eachfile: |
| Mod_File_Func[(" ").join([module, file, func])].append(["Mips", codes]) |
| elif "/Std_Code/" in eachfile: |
| Mod_File_Func[(" ").join([module, file, func])].append(["Ans", codes]) |
| elif "/VEGA" in eachfile: |
| Mod_File_Func[(" ").join([module, file, func])].append(["VEGA", codes]) |
| return True |
|
|
| wrong_stmt = [] |
| def get_wrong_list(): |
| global wrong_stmt |
| with open(Wrong_Dir+"/wrong_list_all.csv", 'r', encoding='utf-8') as fcsv: |
| reader = csv.reader(fcsv) |
| for row in reader: |
| if row[0] == "idx": |
| continue |
| wrong_stmt.append(row[0].strip().lower() + " " + row[1].strip().lower() + " " + row[2].strip().lower()) |
| |
|
|
|
|
|
|
| def duplicate_data(tar): |
| global wrong_stmt |
| global Mod_File_Func |
| global Mod_Result |
|
|
| for kv in Mod_File_Func.items(): |
| module = kv[0].split(" ")[0] |
| if len(kv[1]) != 3: |
| print(tar + " " + kv[0]) |
| Ans = "" |
| Vega = "" |
| Mips = "" |
| |
| for codes in kv[1]: |
| if codes[0] == "Mips": |
| Mips = codes[1] |
| |
| if codes[0] == "Ans": |
| Ans = codes[1] |
| if codes[0] == "VEGA": |
| Vega = codes[1] |
| |
| total = len(Ans.split("\n")) |
| |
| Mod_Result[module][0] += total |
|
|
| vega_same = 0 |
| vega_modi = 0 |
| vega_add = 0 |
| Mips_same = 0 |
| Mips_modi = 0 |
| Mips_add = 0 |
| diff_vega = list(My_Difflib.Differ().compare(Ans.splitlines(), Vega.splitlines())) |
| |
| for idx, dv in enumerate(diff_vega): |
| if dv[0] == '-': |
| if idx < len(diff_vega) - 1 and diff_vega[idx+1][0] == '?': |
| vega_modi += 1 |
| else: |
| vega_add += 1 |
| elif dv[0] == '+': |
| continue |
| elif dv[0] == '?': |
| continue |
| |
| elif dv.strip().replace("\n", "") == '': |
| continue |
| else: |
| vega_same += 1 |
|
|
| if kv[0].split(" ")[-2].strip().lower() + " " + kv[0].split(" ")[-1].strip().lower() + " " + tar.lower() not in wrong_stmt: |
| vega_same = total |
| vega_modi = 0 |
| vega_add = 0 |
| Mod_Result[module][2] += vega_same |
| if Mips.replace("\n", "") != "None": |
| diff_mips = list(My_Difflib.Differ().compare(Ans.splitlines(), Mips.splitlines())) |
| for dm in diff_mips: |
| if dm[0] == '-': |
| if idx < len(diff_mips) - 1 and diff_mips[idx+1][0] == '?': |
| Mips_modi += 1 |
| else: |
| Mips_add += 1 |
| elif dm[0] == '+': |
| continue |
| elif dm[0] == '?': |
| continue |
| |
| elif dm.strip().replace("\n", "") == '': |
| continue |
| else: |
| Mips_same += 1 |
| else: |
| Mips_add = total |
| |
| Mod_Result[module][1] += Mips_same |
|
|
|
|
| with open(folder+"/Fig9.csv", 'a', encoding='utf-8', newline="") as f: |
| f_csv = csv.writer(f) |
| avg_vega = 0.0 |
| avg_mips = 0.0 |
| for kv in Mod_Result.items(): |
| f_csv.writerow([tar.replace("PULP", "RI5CY"), kv[0], round(kv[1][1]*1.0 / kv[1][0], 3), round(kv[1][2]*1.0 / kv[1][0], 3)]) |
| avg_vega += float(round(kv[1][2]*1.0 / kv[1][0], 3)) |
| avg_mips += float(round(kv[1][1]*1.0 / kv[1][0], 3)) |
| f_csv.writerow([tar.replace("PULP", "RI5CY"), "Avg", round(avg_mips / len(Mod_Result), 3), round(avg_vega / len(Mod_Result), 3)]) |
|
|
| with open(folder+"/Table3.csv", 'a', encoding='utf-8', newline="") as f: |
| f_csv = csv.writer(f) |
| all_vega = 0 |
| all_mips = 0 |
| all_stmt = 0 |
| for kv in Mod_Result.items(): |
| f_csv.writerow([tar.replace("PULP", "RI5CY"), kv[0], kv[1][2], kv[1][0]-kv[1][2]]) |
| all_vega += kv[1][2] |
| all_mips += kv[1][1] |
| all_stmt += kv[1][0] |
| f_csv.writerow([tar.replace("PULP", "RI5CY"), "All", all_vega, all_stmt - all_vega]) |
|
|
| if __name__ == '__main__': |
| get_wrong_list() |
| with open(folder+"/Fig9.csv", 'w', encoding='utf-8', newline="") as f: |
| f_csv = csv.writer(f) |
| f_csv.writerow(["Target", "Module", "Fork_Acc", "VEGA_Acc"]) |
|
|
| with open(folder+"/Table3.csv", 'w', encoding='utf-8', newline="") as f: |
| f_csv = csv.writer(f) |
| f_csv.writerow(["Target", "Module", "VEGA_Accurate_Lines", "VEGA_Manual_Lines"]) |
|
|
| for tar in ["XCore", "PULP", "RISCV"]: |
| Mod_File_Func = {} |
| Mod_Result = {} |
| deal_dir(Mips_Dir+"/"+tar) |
| deal_dir(VEGA_Dir+"/"+tar) |
| deal_dir(Ans_Dir+"/"+tar) |
|
|
| duplicate_data(tar) |
|
|