From b4d08411f407a6901e30f8ce3bce20bd328523b4 Mon Sep 17 00:00:00 2001 From: Aryan Date: Wed, 17 Apr 2024 18:41:31 +0530 Subject: [PATCH] function definitions --- simulator.py | 300 ++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 260 insertions(+), 40 deletions(-) diff --git a/simulator.py b/simulator.py index c9562fe..c1bb96f 100644 --- a/simulator.py +++ b/simulator.py @@ -4,111 +4,247 @@ f = open('test1.txt', 'r') data = f.readlines() abi2register = { - "x0": 0, - "x1": 0, - "x2": 0, - "x3": 0, - "x4": 0, - "x5": 0, - "x6": 0, - "x7": 0, - "x8": 0, - "x8": 0, - "x9": 0, - "x10": 0, - "x11": 0, - "x12": 0, - "x13": 0, - "x14": 0, - "x15": 0, - "x16": 0, - "x17": 0, - "x18": 0, - "x19": 0, - "x20": 0, - "x21": 0, - "x22": 0, - "x23": 0, - "x24": 0, - "x25": 0, - "x26": 0, - "x27": 0, - "x28": 0, - "x29": 0, - "x30": 0, - "x31": 0, + "x0": 0,#hard wired zero + "x1": 0,#return address + "x2": 0,#stack pointer + "x3": 0,#global pointer + "x4": 0,#thread pointer + "x5": 0,#temporary/alternate link register + "x6": 0,#temporaries + "x7": 0,#temporaries + "x8": 0,#saved register/frame pointer + "x9": 0,#saved register + "x10": 0,#function arguments/return values + "x11": 0,#function arguments/return values + "x12": 0,#function arguments + "x13": 0,#function arguments + "x14": 0,#function arguments + "x15": 0,#function arguments + "x16": 0,#function arguments + "x17": 0,#function arguments + "x18": 0,#saved register + "x19": 0,#saved register + "x20": 0,#saved register + "x21": 0,#saved register + "x22": 0,#saved register + "x23": 0,#saved register + "x24": 0,#saved register + "x25": 0,#saved register + "x26": 0,#saved register + "x27": 0,#saved register + "x28": 0,#temporaries + "x29": 0,#temporaries + "x30": 0,#temporaries + "x31": 0,#temporaries } +def func(r):#binary in string -> x(int) in string + return f"x{int(r,2)}"#"100" 100 + +def sign_extend(value, bits): + mask = 1 << (bits - 1) + return (value & ((1 << bits) - 1)) - (value & mask) + def r_add(data): + rd = func(data[-12:-7]) + rs1 = func(data[-20:-15]) + rs2 = func(data[-25:-20]) + abi2register[rd] = abi2register[rs1] + abi2register[rs2] return None def r_sub(data): + rd = func(data[-12:-7]) + rs1 = func(data[-20:-15]) + rs2 = func(data[-25:-20]) + abi2register[rd] = abi2register[rs1] - abi2register[rs2] return None def r_sll(data): + return None def r_slt(data): + rd = func(data[-12:-7]) + rs1 = func(data[-20:-15]) + rs2 = func(data[-25:-20]) + if abi2register[rs1]abi2register[rs2]: + abi2register["x1"] = pc + pc += imm + run(pc) + pc = abi2register["x1"] return None -def b_bltu(data): +def b_bltu(data):#unsigned return None -def b_bgeu(data): +def b_bgeu(data):#unsigned return None def u_aupic(data): + rd = func(data[-12:-7]) + imm = sign_extend(int(data[-31:-12], 2), 12) + abi2register[rd] = pc + imm return None def u_lui(data): + rd = func(data[-12:-7]) + imm = sign_extend(int(data[-31:-12], 2), 12) + abi2register[rd] = imm return None def j_jal(data): + rd = func(data[-12:-7]) + imm = sign_extend(int(data[-31:-12], 2), 12) + abi2register[rd] = pc + pc+= imm + val = str(pc) + val = val[:-1] + val = val+"0" + pc = int(val) + run(pc) + pc = abi2register[rd] + return None + +def Bonus_mul(data): + rs1 = func(data[-20:-15]) + rs2 = func(data[-25:-20]) + rd = func(data[-12:-7]) + num1 = str(abi2register[rs1]) + num2 = str(abi2register[rs2]) + abi2register[rd] = bin(int(num1,2)*int(num2,2)) return None -pc = 0 +def Bonus_rst(data): + for i in abi2register: + if(i==pc): + continue + abi2register[i]=1 + return None + +def Bonus_rvrs(data):#check + rs1 = func(data[-20:-15]) + rd = func(data[-12:-7]) + val = abi2register[rs1] + abi2register[rd] = int(str(val)[::-1]) + return None + +ra = "x1" +pc =0 + while pc < len(data): if data[pc][-7:] == '0110011' and data[pc][-15:-12] == '000' and data[pc][-32:-25] == '0000000': r_add(data[pc]) @@ -136,6 +272,9 @@ def j_jal(data): elif data[pc][-7:] == '0110011' and data[pc][-15:-12] == '111' and data[pc][-32:-25] == '0000000': r_and(data[pc]) + + elif data[pc][-7:] == '0110011' and data[pc][-15:-12] == '000' and data[pc][-32:-25] == '0000001': + Bonus_mul(data[pc]) elif data[pc][-7:] == '0000011' and data[pc][-15:-12] == '010': i_lw(data[pc]) @@ -178,9 +317,90 @@ def j_jal(data): elif data[pc][-7:] == '1101111': j_jal(data[pc]) + + elif data[pc] == '00000000000000000000000000000000': + Bonus_rst(data[pc]) + + elif data[pc][-7:] == '0001011': + Bonus_rvrs(data[pc]) else: print("Illegal instruction") sys.exit() - pc += 1 \ No newline at end of file + pc += 1 + +def run(pc): + while pc < len(data): + if data[pc][-7:] == '0110011' and data[pc][-15:-12] == '000' and data[pc][-32:-25] == '0000000': + r_add(data[pc]) + + elif data[pc][-7:] == '0110011' and data[pc][-15:-12] == '000' and data[pc][-32:-25] == '0100000': + r_sub(data[pc]) + + elif data[pc][-7:] == '0110011' and data[pc][-15:-12] == '001' and data[pc][-32:-25] == '0000000': + r_sll(data[pc]) + + elif data[pc][-7:] == '0110011' and data[pc][-15:-12] == '010' and data[pc][-32:-25] == '0000000': + r_slt(data[pc]) + + elif data[pc][-7:] == '0110011' and data[pc][-15:-12] == '011' and data[pc][-32:-25] == '0000000': + r_sltu(data[pc]) + + elif data[pc][-7:] == '0110011' and data[pc][-15:-12] == '100' and data[pc][-32:-25] == '0000000': + r_xor(data[pc]) + + elif data[pc][-7:] == '0110011' and data[pc][-15:-12] == '101' and data[pc][-32:-25] == '0000000': + r_srl(data[pc]) + + elif data[pc][-7:] == '0110011' and data[pc][-15:-12] == '110' and data[pc][-32:-25] == '0000000': + r_or(data[pc]) + + elif data[pc][-7:] == '0110011' and data[pc][-15:-12] == '111' and data[pc][-32:-25] == '0000000': + r_and(data[pc]) + + elif data[pc][-7:] == '0000011' and data[pc][-15:-12] == '010': + i_lw(data[pc]) + + elif data[pc][-7:] == '0010011' and data[pc][-15:-12] == '000': + i_addi(data[pc]) + + elif data[pc][-7:] == '0000011' and data[pc][-15:-12] == '011': + i_sltiu(data[pc]) + + elif data[pc][-7:] == '1100111' and data[pc][-15:-12] == '000': + i_jalr(data[pc]) + + elif data[pc][-7:] == '0100011' and data[pc][-15:-12] == '010': + s_sw(data[pc]) + + elif data[pc][-7:] == '1100011' and data[pc][-15:-12] == '000': + b_beq(data[pc]) + + elif data[pc][-7:] == '1100011' and data[pc][-15:-12] == '001': + b_bne(data[pc]) + + elif data[pc][-7:] == '1100011' and data[pc][-15:-12] == '100': + b_blt(data[pc]) + + elif data[pc][-7:] == '1100011' and data[pc][-15:-12] == '101': + b_bge(data[pc]) + + elif data[pc][-7:] == '1100011' and data[pc][-15:-12] == '110': + b_bltu(data[pc]) + + elif data[pc][-7:] == '1100011' and data[pc][-15:-12] == '111': + b_bgeu(data[pc]) + + elif data[pc][-7:] == '0110111': + u_lui(data[pc]) + + elif data[pc][-7:] == '0010111': + u_aupic(data[pc]) + + elif data[pc][-7:] == '1101111': + j_jal(data[pc]) + + else: + print("Illegal instruction") + sys.exit() \ No newline at end of file