def stb(line):
    rs = int(line[6:11], 2)
    ra = int(line[11:16], 2)
    ds = int(line[16:30], 2)
    t1 = int(mem_man.read_register(ra), 2)
    ea = ds + t1
    data = mem_man.read_register(rs)
    mem_man.update_memory(ea, data[-8:])
def stw(line):
    rs = int(line[6:11], 2)
    ra = int(line[11:16], 2)
    ds = int(line[16:30], 2)
    t1 = int(mem_man.read_register(ra), 2)
    ea = ds + t1
    data = mem_man.read_register(rs)
    mem_man.update_memory(ea, data[-8:])
    mem_man.update_memory(ea + 1, data[-16:-8])
    mem_man.update_memory(ea + 2, data[-24:-16])
    mem_man.update_memory(ea + 3, data[-32:-24])
def instruction_add(line):
    instruction = "Add"
    opind1 = int(line[6:11], 2)
    opind2 = int(line[11:16], 2)
    opind3 = int(line[16:21], 2)
    rctemp = line[31]
    #action=op1+"<- ("+op2+") AND ("+op3+")"
    #print details
    op1 = ""
    op2 = mem_man.read_register(opind2)
    op3 = mem_man.read_register(opind3)
    op1 = bin(int(op2, 2) + int(op3, 2))[2:]
    mem_man.update_register(opind1, op1)
def instruction_sld(line):
    instruction = "sld"
    #extracting operands
    opind1 = int(line[6:11], 2)
    opind2 = int(line[11:16], 2)
    opind3 = int(line[16:21], 2)
    rctemp = line[31]

    op1 = mem_man.read_register(opind1)
    op3 = mem_man.read_register(opind3)
    n = int(op3[-7:], 2)
    op2 = op1[n:]
    for i in range(n):
        op2 = op2 + "0"
    mem_man.update_register(opind2, op2)
def xori(line):
    rs = int(line[6:11], 2)
    ra = int(line[11:16], 2)
    ui = int(line[16:32], 2)
    t1 = int(mem_man.read_register(rs)[-16:], 2)
    t2 = str(t1 ^ ui)
    mem_man.update_register(ra, t2)
def std(line):
    rs = int(line[6:11], 2)
    ra = int(line[11:16], 2)
    ds = int(line[16:30], 2)
    t1 = int(mem_man.read_register(ra), 2)
    disp = ds * 4
    ea = disp + t1
    data = mem_man.read_register(rs)
    mem_man.update_memory(ea, data[-8:])
    mem_man.update_memory(ea + 1, data[-16:-8])
    mem_man.update_memory(ea + 2, data[-24:-16])
    mem_man.update_memory(ea + 3, data[-32:-24])
    mem_man.update_memory(ea + 4, data[-40:-32])
    mem_man.update_memory(ea + 5, data[-48:-40])
    mem_man.update_memory(ea + 6, data[-56:-48])
    mem_man.update_memory(ea + 7, data[-64:-56])
def lbz(line):
    rt = int(line[6:11], 2)
    ra = int(line[11:16], 2)
    ds = int(line[16:32], 2)
    t1 = int(mem_man.read_register(ra), 2)
    ea = ds + t1
    data = mem_man.read_memory(ea)
    mem_man.update_register(rt, data)
def instruction_srad(line):
    instruction = "srad"
    #extracting operands
    opind1 = int(line[6:11], 2)
    opind2 = int(line[11:16], 2)
    opind3 = int(line[16:21], 2)
    rctemp = line[31]

    op1 = mem_man.read_register(opind1)
    op3 = mem_man.read_register(opind3)
    n = int(op3[-7:], 2)
    op2 = ""
    filler = op1[0]
    for i in range(n):
        op2 = op2 + filler
    op2 = op2 + op1[:-n]
    mem_man.update_register(opind2, op2)
def instruction_xor(line):
    instruction = "Xor"
    #extracting operands
    opind1 = int(line[6:11], 2)
    opind2 = int(line[11:16], 2)
    opind3 = int(line[16:21], 2)
    rctemp = line[31]
    #action=op1+"<- ("+op2+") AND ("+op3+")"
    #print details
    op1 = ""
    op2 = mem_man.read_register(opind2)
    op3 = mem_man.read_register(opind3)
    for i in range(64):
        if (op2[i] == op3[i]):
            op1 = op1 + "0"
        else:
            op1 = op1 + "1"
    mem_man.update_register(opind1, op1)
def lhz(line):
    rt = int(line[6:11], 2)
    ra = int(line[11:16], 2)
    ds = int(line[16:32], 2)
    t1 = int(mem_man.read_register(ra), 2)
    ea = ds + t1
    datum1 = mem_man.read_memory(ea)
    datum2 = mem_man.read_memory(ea + 1)
    data = datum2 + datum1
    mem_man.update_register(rt, data)
def instruction_subf(line):
    instruction = "subf"
    #extracting operands
    opind1 = int(line[6:11], 2)
    opind2 = int(line[11:16], 2)
    opind3 = int(line[16:21], 2)
    rctemp = line[31]
    #action=op1+"<- ("+op2+") AND ("+op3+")"
    #print details
    op1 = ""
    temp = ""
    op2 = mem_man.read_register(opind2)
    op3 = mem_man.read_register(opind3)
    for i in range(64):
        if (op2[i] == "0"):
            temp = temp + "1"
        else:
            temp = temp + "0"
    op2 = temp
    op1 = bin(int(op2, 2) + int(op3, 2) + int("1", 2))[2:]
    mem_man.update_register(opind1, op1)
def instruction_extsw(line):
    instruction = "srad"
    #extracting operands
    opind1 = int(line[6:11], 2)
    opind2 = int(line[11:16], 2)
    rctemp = line[31]
    op1 = mem_man.read_register(opind1)
    filler = op1[32]
    op2 = ""
    for i in range(32):
        op2 = op2 + filler
    op2 = op2 + op1[32:]
    mem_man.update_register(opind2, op2)
def ld(line):
    rt = int(line[6:11], 2)
    ra = int(line[11:16], 2)
    ds = int(line[16:30], 2)
    t1 = int(mem_man.read_register(ra), 2)
    disp = ds * 4
    ea = int(disp) + int(t1)
    datum1 = mem_man.read_memory(ea)
    datum2 = mem_man.read_memory(ea + 1)
    datum3 = mem_man.read_memory(ea + 2)
    datum4 = mem_man.read_memory(ea + 3)
    datum5 = mem_man.read_memory(ea + 4)
    datum6 = mem_man.read_memory(ea + 5)
    datum7 = mem_man.read_memory(ea + 6)
    datum8 = mem_man.read_memory(ea + 7)
    data = datum8 + datum7 + datum6 + datum5 + datum4 + datum3 + datum2 + datum1
    mem_man.update_register(rt, data)