table = [ ('00000000000???????????????000010', 'SRL'), ('00000000000???????????????000000', 'SLL'), ('00000000000???????????????000011', 'SRA'), ('000000???????????????00000000100', 'SLLV'), ('000000???????????????00000000110', 'SRLV'), ('000000???????????????00000000111', 'SRAV'), ('000000?????000000000000000001000', 'JR'), ('000000?????00000?????00000001001', 'JALR'), ('000000????????????????????001100', 'SYSCALL'), ('000000????????????????????001101', 'BREAK'), ('0000000000000000?????00000010000', 'MFHI'), ('000000?????000000000000000010001', 'MTHI'), ('0000000000000000?????00000010010', 'MFLO'), ('000000?????000000000000000010011', 'MTLO'), ('000000??????????0000000000011000', 'MULT'), ('000000??????????0000000000011001', 'MULTU'), ('000000??????????0000000000011010', 'DIV'), ('000000??????????0000000000011011', 'DIVU'), ('000000???????????????00000100000', 'ADD'), ('000000???????????????00000100001', 'ADDU'), ('000000???????????????00000100010', 'SUB'), ('000000???????????????00000100011', 'SUBU'), ('000000???????????????00000100100', 'AND'), ('000000???????????????00000100101', 'OR'), ('000000???????????????00000100110', 'XOR'), ('000000???????????????00000100111', 'NOR'), ('000000???????????????00000101010', 'SLT'), ('000000???????????????00000101011', 'SLTU'), ('000001?????00000????????????????', 'BLTZ'), ('000001?????10000????????????????', 'BLTZAL'), ('000001?????00001????????????????', 'BGEZ'), ('000001?????10001????????????????', 'BGEZAL'), ('000010??????????????????????????', 'J'), ('000011??????????????????????????', 'JAL'), ('000100??????????????????????????', 'BEQ'), ('000101??????????????????????????', 'BNE'), ('000110?????00000????????????????', 'BLEZ'), ('000111?????00000????????????????', 'BGTZ'), ('001000??????????????????????????', 'ADDI'), ('001001??????????????????????????', 'ADDIU'), ('001010??????????????????????????', 'SLTI'), ('001011??????????????????????????', 'SLTIU'), ('001100??????????????????????????', 'ANDI'), ('001101??????????????????????????', 'ORI'), ('001110??????????????????????????', 'XORI'), ('00111100000?????????????????????', 'LUI'), ('01000000000??????????00000000???', 'MFC0'), ('01000000100??????????00000000???', 'MTC0'), ('01000010000000000000000000000001', 'TLBR'), ('01000010000000000000000000000010', 'TLBWI'), ('01000010000000000000000000001000', 'TLBP'), ('01000010000000000000000000011000', 'ERET'), ('011100???????????????00000000010', 'MUL'), ('100000??????????????????????????', 'LB'), ('100001??????????????????????????', 'LH'), ('100011??????????????????????????', 'LW'), ('100100??????????????????????????', 'LBU'), ('100101??????????????????????????', 'LHU'), ('101000??????????????????????????', 'SB'), ('101001??????????????????????????', 'SH'), ('101011??????????????????????????', 'SW'), ('101111?????00000????????????????', 'I-Cache Index Invalid'), ('101111?????01000????????????????', 'I-Cache Index Store Tag'), ('101111?????10000????????????????', 'I-Cache Hit Invalid'), ('101111?????00001????????????????', 'D-Cache Index Writeback Invalid'), ('101111?????01001????????????????', 'D-Cache Index Store Tag'), ('101111?????10001????????????????', 'D-Cache Hit Invalid'), ('101111?????10101????????????????', 'D-Cache Hit Writeback Invalid'), ] class Boolean: def __init__(self, x): self.x = {'0': -1, '?': 0, '1': 1}.get(x, x) def __and__(self, other): return Boolean(min(self.x, other.x)) def __or__(self, other): return Boolean(max(self.x, other.x)) def __invert__(self): return Boolean(-self.x) def __repr__(self): return {-1: '0', 0: 'x', 1: '1'}[self.x] for inst, name in table: inst = list(Boolean(x) for x in inst[::-1]) print('=====', name, '=====') # print('C0W =', inst[30] & inst[23]) # print('HLS[2] =', ~inst[27] & ~inst[26] & (~inst[29] & ~inst[30] & ~inst[28] & inst[4] & inst[3] | inst[29] & inst[30])) # print('RS0[2] =', ~inst[30] & (inst[29] | inst[26] | ~inst[4])) print('DP0 =', ~inst[31] & (~inst[30] | inst[29] | ~inst[25] | inst[4])) print('DP1 =', inst[26] | (~inst[30] & (inst[31] | inst[29] | inst[28] | inst[27] | ~inst[4]) | inst[30] & (~inst[29] & inst[25] | inst[3]))) print()