Mercurial > lcfOS
view python/ppci/codegen/flowgraph.py @ 321:8c569fbe60e4
Load yacc and burg dynamic
author | Windel Bouwman |
---|---|
date | Sun, 19 Jan 2014 18:48:45 +0100 |
parents | 6753763d3bec |
children | b00219172a42 |
line wrap: on
line source
from .graph import DiGraph, DiNode class FlowGraphNode(DiNode): """ 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(DiGraph): def __init__(self, instrs): """ Create a flowgraph from a list of abstract instructions """ super().__init__() self._map = {} # Add nodes: for ins in instrs: n = FlowGraphNode(self, ins) self._map[ins] = n self.addNode(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