view python/ir/basicblock.py @ 219:1fa3e0050b49

Expanded ad hoc code generator
author Windel Bouwman
date Sat, 06 Jul 2013 12:38:09 +0200
parents d77cb5962cc5
children 63bb40758066
line wrap: on
line source


class BasicBlock:
    """ Uninterrupted sequence of instructions. """
    def __init__(self, name):
      self.name = name
      self.instructions = []
    def __repr__(self):
      return 'BasicBlock {0}'.format(self.name)
    def addInstruction(self, i):
      i.parent = self
      self.instructions.append(i)
    addIns = addInstruction

    def replaceInstruction(self, i1, i2):
      idx = self.instructions.index(i1)
      i1.parent = None
      i1.delete()
      i2.parent = self
      self.instructions[idx] = i2

    def removeInstruction(self, i):
      i.parent = None
      self.instructions.remove(i)

    def getInstructions(self):
        return self.instructions

    def setInstructions(self, ins):
      for i in self.instructions:
         i.parent = None
      self.instructions = ins
      for i in self.instructions:
         i.parent = self
    Instructions = property(getInstructions, setInstructions)

    def getLastIns(self):
      return self.instructions[-1]
    LastInstruction = property(getLastIns)
    @property
    def Empty(self):
      return len(self.instructions) == 0
    @property
    def FirstInstruction(self):
      return self.instructions[0]
    FirstIns = FirstInstruction

    def getSuccessors(self):
      if not self.Empty:
         i = self.LastInstruction
         return i.Targets
      return []
    Successors = property(getSuccessors)

    def getPredecessors(self):
      preds = []
      for bb in self.parent.BasicBlocks:
         if self in bb.Successors:
            preds.append(bb)
      return preds
    Predecessors = property(getPredecessors)