dag.py 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. class Dag:
  2. def __init__(self, block):
  3. """Create the Directed Acyclic Graph of all binary operations in a
  4. basic block."""
  5. self.nodes = []
  6. for s in block:
  7. if s.is_command('move') or s.is_monop():
  8. rd, rs = s
  9. y = self.find_reg_node(rs)
  10. self.find_op_node(s.name, rd, y)
  11. elif s.is_binop():
  12. rd, rs, rt = s
  13. y = self.find_reg_node(rs)
  14. z = self.find_reg_node(rt)
  15. self.find_op_node(s.name, rd, y, z)
  16. def find_reg_node(self, reg):
  17. for n in self.nodes:
  18. if reg in n.reg:
  19. return n
  20. node = DagLeaf(reg)
  21. self.nodes.append(node)
  22. return node
  23. def find_op_node(self, op, rd, *args):
  24. for n in self.nodes:
  25. if not isinstance(n, DagLeaf) and n.op == op and n.nodes == args:
  26. n.labels.append(rd)
  27. return n
  28. node = DagNode(op, rd, *args)
  29. self.nodes.append(node)
  30. return node
  31. class DagNode:
  32. def __init__(self, op, label, *args):
  33. self.op = op
  34. self.labels = [label]
  35. self.nodes = args
  36. class DagLeaf:
  37. def __init__(self, reg):
  38. self.reg = reg