instr = []                  # 存储有效的指令
instr_num = 0
addr_label = []             # 存储地址标签的数值
instr_segment_size = []     # 存储两个地址标签之间的指令数目

final_instr = []            # 存入 .coe 文件的指令
final_instr_num = 0         

size_of_BRAM = 65536        # 设置 ITCM 大小为64KB
fin = []
addr_index = []
num_addr = 0



with open(r"C:\Users\great\Desktop\nice_control.verilog",'r') as rd_file:
    content = rd_file.read()        # file.read([size]) 将文件数据作为字符串返回，可选参数 size 控制读取的字节数
    content = content.split()       # str.split 将字符串按分隔符进行切片，默认为所有的空字符，包括空格、换行(\n)、制表符(\t)等
    for string in content:
        if(len(string) == 2):       # 若获取到指令，则写入 instr 列表中
            instr.append(string)        
            instr_num += 1

        else:                       # 若获取到其他内容（即@地址）
            addr_label.append(eval('0x' + string[1:9]))         # eval() 以字符串作为表达式执行数学操作，获取地址中的数值部分（去除@），写入 addr_label 列表中
            instr_segment_size.append(instr_num)                # 将地址行的索引写入 addr_index 列表中
            instr_num = 0

    instr_segment_size.append(instr_num)
    addr_label.append(99999999)                                 # 添加一个最后的地址标签，值设为最大，目的是可以将最后的全部指令都加载入 .coe 文件中

print("instr_segment_size:", instr_segment_size)
print("addr_label:", addr_label)
# print(instr)

with open(r"C:\Users\great\Desktop\instr.coe", 'w') as wr_file:
    wr_file.write("memory_initialization_radix=16; \n")      # 写入 .coe 标准格式抬头
    wr_file.write("memory_initialization_vector= \n")
    instr_segment_size_num = 1  # 地址0之前不存在指令段，以后的指令段为有效指令段
    addr_label_num = 1          # 最开始的地址标签均为0，以后的标签为有效地址标签
    instr_segment_num = 0
    instr_num = 0
    for i in range(size_of_BRAM):
        if(addr_label[addr_label_num - 1] + instr_segment_num < addr_label[addr_label_num]):
            if(instr_segment_num < instr_segment_size[instr_segment_size_num]):
                wr_file.write(' ' + instr[instr_num] + ' ')
                instr_segment_num += 1
                instr_num += 1
            elif(instr_segment_num >= instr_segment_size[instr_segment_size_num]):
                wr_file.write(" 00 ")
                instr_segment_num += 1
        elif(addr_label[addr_label_num - 1] + instr_segment_num == addr_label[addr_label_num]):
            addr_label_num += 1
            instr_segment_size_num += 1
            instr_segment_num = 0
        else:
            wr_file.write(" 00 ")

wr_file.close()


        