import argparse
import os

parser = argparse.ArgumentParser(description='Takes an instruction name and generates c0_uart_prog_tb.v.')

parser.add_argument('inst', help='Name of the instruction')

args = parser.parse_args()
inst_name = args.inst

pwd = os.getcwd() + "/verilog/dv/test_c0"

imem_f = open(pwd + "/coe/" + inst_name + "/imem.coe")
dmem_f = open(pwd + "/coe/" + inst_name + "/dmem.coe")
ps_dump = open(pwd + "/coe/" + inst_name + "/cekirdek_ps_hex.txt")
out_f  = open(pwd + "/c0_uart_prog_tb.v", "w")

os.system("cp " + pwd + "/coe/" + inst_name + "/cekirdek_ps_hex.txt " + pwd + "/sim_ps.txt")

imem_arr = imem_f.readlines()
dmem_arr = dmem_f.readlines()
ps = ps_dump.readlines()

imem_f.close()
dmem_f.close()
ps_dump.close()

last_ps = hex(int(ps[-1].strip(), 16) + 4)[2:]

imem_bytes = (len(imem_arr) - 2) * 4
dmem_bytes = (len(dmem_arr) - 2) * 4

hex_data = imem_bytes.to_bytes(4, 'little')

byte_ctr = 0

out_f.write("`timescale 1ns / 1ps\n\nmodule c0_uart_prog(\n\t\tinput c0_tx,\n\t\toutput reg c0_rx\n\t);")

out_f.write("\n\n\t// Program len       : " + str(imem_bytes + dmem_bytes + 8))
out_f.write("\n\t// # of instructions : " + str(int(imem_bytes/4)))
out_f.write("\n\t// # of data         : " + str(int(dmem_bytes/4)) + "\n")
out_f.write("\n\t// Last PC           : 32'h" + last_ps + "\n")


out_f.write("\n\twire [7:0] program [" + str(imem_bytes + dmem_bytes + 50) + ":0];\n\n")


for i in range(4):
    out_f.write("\tassign program[" + str(byte_ctr) + "] = 8'd" + str(hex_data[i]) + ";\n")
    byte_ctr += 1

for line in imem_arr:
    if line.startswith('memory_'):
        continue
    else:
        hex_str = line[:8]
        hex_data = bytearray.fromhex(hex_str)
        for i in range(3,-1,-1):
            out_f.write("\tassign program[" + str(byte_ctr) + "] = 8'd" + str(hex_data[i]) + ";\n")
            byte_ctr += 1

hex_data = dmem_bytes.to_bytes(4, 'little')

for i in range(4):
    out_f.write("\tassign program[" + str(byte_ctr) + "] = 8'd" + str(hex_data[i]) + ";\n")
    byte_ctr += 1

for line in dmem_arr:
    if line.startswith('memory_'):
        continue
    else:
        hex_str = line[:8]
        hex_data = bytearray.fromhex(hex_str)
        for i in range(3,-1,-1):
            out_f.write("\tassign program[" + str(byte_ctr) + "] = 8'd" + str(hex_data[i]) + ";\n")
            byte_ctr += 1

out_f.write("\n\n\tparameter BAUD_PERIOD = 340;\n\tparameter CLK_PERIOD = 20;\n\n\tparameter UART_DELAY = BAUD_PERIOD / CLK_PERIOD;")
out_f.write("\n\n\n\tinteger i, j;\n\tinitial begin\n\t\tc0_rx = 1'b1;\n\t\t#270000;\n\t\tfor (i = 0 ; i < " + str(byte_ctr) + " ; i = i+1) begin")
out_f.write("\n\t\t\tc0_rx = 1'b0;\n\t\t\t#BAUD_PERIOD;\n\t\t\tfor (j = 0 ; j < 8 ; j = j+1) begin\n\t\t\t\tc0_rx = program[i][j];\n\t\t\t\t#BAUD_PERIOD;\n\t\t\tend")
out_f.write("\n\t\t\tc0_rx = 1'b1;\n\t\t\t#BAUD_PERIOD;\n\t\t\tc0_rx = 1'b1;\n\t\t\t#(BAUD_PERIOD*5);\n\t\tend\n\tend\n\nendmodule\n")

out_f.close()

old_tb = open(pwd + "/test_c0_tb.v", "r")
new_tb = open(pwd + "/temp.v", "w")

for line in old_tb.readlines():
    if("// Update this with test_prog ps_dump" in line):
        new_tb.write("\t\twait(io_ps == 32'h" + last_ps + ");\t// Update this with test_prog ps_dump\n")
    else:
        new_tb.write(line)
old_tb.close()
new_tb.close()

os.system("cp " + pwd + "/temp.v " + pwd + "/test_c0_tb.v")
os.system("rm " + pwd + "/temp.v")

old_c = open(pwd + "/test_c0.c", "r")
new_c = open(pwd + "/temp.c", "w")

for line in old_c.readlines():
    if("reg_mprj_datal == (0x" in line):
        new_c.write("\t\tif (reg_mprj_datal == (0x" + last_ps + " << 3)) {\n")
    else:
        new_c.write(line)
old_c.close()
new_c.close()

os.system("cp " + pwd + "/temp.c " + pwd + "/test_c0.c")
os.system("rm " + pwd + "/temp.c")
