from binandint import * def alu(a, b, alu_ctrl): # a,b为两个运算数,alu_ctrl为控制信号,返回运算结果result与是否为0 zero signed = a - b if alu_ctrl == '00000': # add,jalr alu_result = a + b elif alu_ctrl == '00001': # sub alu_result = a - b elif alu_ctrl == '00010': # or alu_result = a | b elif alu_ctrl == '00011': # and alu_result = a & b elif alu_ctrl == '00100': # slt if (signed >= 0): alu_result = 0 else: alu_result = 1 elif alu_ctrl == '00101': # beq if a == b: alu_result = 1 else: alu_result = 0 elif alu_ctrl == '00110': # bne if a != b: alu_result = 1 else: alu_result = 0 elif alu_ctrl == '00111': # blt if a < b: alu_result = 1 else: alu_result = 0 elif alu_ctrl == '01000': # bge if a >= b: alu_result = 1 else: alu_result = 0 elif alu_ctrl == '01001': if a < 0: ua = a + 2 ** 32 else: ua = a if b < 0: ub = b + 2 ** 32 else: ub = b if ua < ub: alu_result = 1 else: alu_result = 0 elif alu_ctrl == '01010': if a < 0: ua = a + 2 ** 32 else: ua = a if b < 0: ub = b + 2 ** 32 else: ub = b if ua >= ub: alu_result = 1 else: alu_result = 0 elif alu_ctrl == '01011': alu_result = 1 elif alu_ctrl == '01100': alu_result = a ^ b elif alu_ctrl == '01101': alu_result = a << b elif alu_ctrl == '01110': if a < 0: ua = a + 2 ** 32 else: ua = a if b < 0: ub = b + 2 ** 32 else: ub = b if ua <= ub: alu_result = 1 else: alu_result = 0 elif alu_ctrl == '01111': if a < 0: ua = a + 2 ** 32 else: ua = a alu_result = a >> b elif alu_ctrl == '10000': alu_result = a >> b else: alu_result = 0 return alu_result