|
|
|
|
|
|
|
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) |
|
|