view python/flowgraph.py @ 269:5f8c04a8d26b

Towards better modularity
author Windel Bouwman
date Sun, 18 Aug 2013 17:43:18 +0200
parents
children ea93e0a7a31e
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):
        return '{}, use={}, def={}'.format(self.ins, self.uses, self.defs)


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

        # 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.nodes.append(n)
        return n