Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class AbstractOp():
- def __init__(self):
- self.registers = []
- self.can = set()
- self.cannot = set()
- def compute(self, registers, inp):
- self.registers = list(registers)
- self._compute(inp)
- return self.registers
- def _compute(self, input):
- raise RuntimeException()
- def __str__(self):
- return self.__class__.__name__
- class Addr(AbstractOp):
- def _compute(self, inp):
- self.registers[inp[2]] = self.registers[inp[0]] + self.registers[inp[1]]
- class Addi(AbstractOp):
- def _compute(self, inp):
- self.registers[inp[2]] = self.registers[inp[0]] + inp[1]
- class Mulr(AbstractOp):
- def _compute(self, inp):
- self.registers[inp[2]] = self.registers[inp[0]] * self.registers[inp[1]]
- class Muli(AbstractOp):
- def _compute(self, inp):
- self.registers[inp[2]] = self.registers[inp[0]] * inp[1]
- class Banr(AbstractOp):
- def _compute(self, inp):
- self.registers[inp[2]] = self.registers[inp[0]] & self.registers[inp[1]]
- class Bani(AbstractOp):
- def _compute(self, inp):
- self.registers[inp[2]] = self.registers[inp[0]] & inp[1]
- class Borr(AbstractOp):
- def _compute(self, inp):
- self.registers[inp[2]] = self.registers[inp[0]] | self.registers[inp[1]]
- class Bori(AbstractOp):
- def _compute(self, inp):
- self.registers[inp[2]] = self.registers[inp[0]] | inp[1]
- class Setr(AbstractOp):
- def _compute(self, inp):
- self.registers[inp[2]] = self.registers[inp[0]]
- class Seti(AbstractOp):
- def _compute(self, inp):
- self.registers[inp[2]] = inp[0]
- class Gtir(AbstractOp):
- def _compute(self, inp):
- self.registers[inp[2]] = 1 if inp[0] > self.registers[inp[1]] else 0
- class Gtri(AbstractOp):
- def _compute(self, inp):
- self.registers[inp[2]] = 1 if self.registers[inp[0]] > inp[1] else 0
- class Gtrr(AbstractOp):
- def _compute(self, inp):
- self.registers[inp[2]] = 1 if self.registers[inp[0]] > self.registers[inp[1]] else 0
- class Eqir(AbstractOp):
- def _compute(self, inp):
- self.registers[inp[2]] = 1 if inp[0] == self.registers[inp[1]] else 0
- class Eqri(AbstractOp):
- def _compute(self, inp):
- self.registers[inp[2]] = 1 if self.registers[inp[0]] == inp[1] else 0
- class Eqrr(AbstractOp):
- def _compute(self, inp):
- self.registers[inp[2]] = 1 if self.registers[inp[0]] == self.registers[inp[1]] else 0
- class CPU():
- def __init__(self):
- self.registers = [0, 0, 0, 0]
- self.instructions = [Addr(), Addi(), Mulr(), Muli(), Banr(), Bani(), Borr(), Bori(),
- Setr(), Seti(), Gtir(), Gtri(), Gtrr(), Eqir(), Eqri(), Eqrr()]
- self.name_to_instr = {}
- for instr in self.instructions:
- self.name_to_instr[str(instr).lower()] = instr
- print self.name_to_instr
- def execute_program(self, instructions):
- for instr in instructions:
- self.registers = self.opcodes_to_instr[instr[0]].compute(self.registers, instr[1:])
- c = CPU()
- #c.execute_program(instructions)
- #print c.registers
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement