view python/target.py @ 200:5e391d9a3381

Split off asm nodes
author Windel Bouwman
date Sun, 09 Jun 2013 16:06:49 +0200
parents a690473b79e2
children d5debbfc0200
line wrap: on
line source

from asmnodes import ASymbol, AInstruction
from ppci import CompilerError

"""
  Base classes for defining a target
"""

# Machine code interface:
class Operand:
   """ Single machine operand """
   pass

class Register(Operand):
    def __init__(self, name):
        self.name = name

class Instruction:
   def __init__(self, opcode):
      self.opcode = opcode

class Target:
    def __init__(self):
        self.registers = []
        self.instructions = []

    def mapOperand(self, operand):
        """ Try to map an operand to a target type """
        if type(operand) is ASymbol:
            # Try to map to register:
            regs = {}
            for r in self.registers:
                regs[r.name] = r
            if operand.name in regs:
                return regs[operand.name]
        else:
            return

    def mapInstruction(self, vi):
        """ Map ast tree to real instruction for this target """

        # map to real operands:
        rops = tuple(map(self.mapOperand, vi.operands))
        optypes = tuple(map(type, rops))

        # look for a suitable instruction
        for ic in self.instructions:
            if ic.mnemonic == vi.opcode and ic.operands == optypes:
                ri = ic(*rops)
                return ri
        raise CompilerError('No suitable instruction found')