Mercurial > lcfOS
view python/ppci/codegen/dag.py @ 306:b145f8e6050b
Start on c3 rewrite
author | Windel Bouwman |
---|---|
date | Mon, 09 Dec 2013 19:00:21 +0100 |
parents | 6753763d3bec |
children |
line wrap: on
line source
# Instruction selection with DAG (Directed Acyclic Graph) class DagLeaf: def __init__(self, v): self.v = v class DagNode: def __init__(self, name): self.name = name self.children = [] def __repr__(self): return str(self.name) class Dag: def __init__(self, bb): self.mapping = {} self.buildFromBB(bb) def buildFromBB(self, bb): for ins in bb.Instructions: if type(ins) is ir.BinaryOperator: if not ins.value1 in self.mapping: self.mapping[ins.value1] = DagNode(ins.value1) if not ins.value2 in self.mapping: self.mapping[ins.value2] = DagNode(ins.value2) # look for op with left and right operand the same: N = None lnode = self.mapping[ins.value1] rnode = self.mapping[ins.value2] for node in self.mapping.values(): if node.name == ins.operation: if node.children[0] == lnode and node.children[1] == rnode: N = node break if not N: # Create a node. N = DagNode(ins.operation) N.children.append(lnode) N.children.append(rnode) self.mapping[ins.result] = N else: pass def dumpgv(self, outf): outf.write('subgraph {0} {{\n'.format(id(self))) for node in self.mapping.values(): outf.write('{0} [label="{1}"];\n'.format(id(node), node.name)) for c in node.children: outf.write('{0} -> {1};\n'.format(id(node), id(c))) outf.write('label="dag"}\n') def insSelect(mod): """ Create DAG from ir-code """ for bb in mod.BasicBlocks: print(bb) dag = Dag(bb) print(dag.mapping) bb.dag = dag