view python/flowgraph.py @ 277:046017431c6a

Started register allocator
author Windel Bouwman
date Thu, 26 Sep 2013 21:14:25 +0200
parents ea93e0a7a31e
children 9fca39eebe50
line wrap: on
line source

import graph


class FlowGraphNode(graph.Node):
    """ A node in the flow graph """
    def __init__(self, g, ins):
        super().__init__(g)
        self.ins = ins
        self.uses = set(ins.src)
        self.defs = set(ins.dst)
        self.live_in = set()
        self.live_out = set()

    def __repr__(self):
        r = '{}'.format(self.ins)
        if self.uses:
            r += ' uses:' + ', '.join(str(u) for u in self.uses)
        if self.defs:
            r += ' defs:' + ', '.join(str(d) for d in self.defs)
        return r


class FlowGraph(graph.Graph):
    def __init__(self, instrs):
        """ Create a flowgraph from a list of abstract instructions """
        super().__init__(True)
        self._map = {}
        # Add nodes:
        for ins in instrs:
            n = self.newNode(ins)

        # Make edges:
        prev = None
        for ins in instrs:
            n = self._map[ins]
            if prev:
                self.addEdge(prev, n)
            if ins.jumps:
                prev = None
                for j in ins.jumps:
                    to_n = self._map[j]
                    self.addEdge(n, to_n)
            else:
                prev = n

    def newNode(self, ins):
        """ Override new node to make flow graph node """
        n = FlowGraphNode(self, ins)
        self._map[ins] = n
        self.addNode(n)
        return n