MIPS/tools/decoder.py
2021-08-12 21:40:52 +08:00

97 lines
4.1 KiB
Python

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()