diff python/graph.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 diff
--- a/python/graph.py	Mon Sep 16 21:51:17 2013 +0200
+++ b/python/graph.py	Thu Sep 26 21:14:25 2013 +0200
@@ -4,25 +4,45 @@
        Generic graph base class.
        Can dump to graphiz dot format for example!
     """
-    def __init__(self):
-        self.nodes = []
-        self.edges = []
+    def __init__(self, directed):
+        self.directed = directed
+        self.nodes = set()
+        self.edges = set()
 
     def newNode(self):
         n = Node(self)
-        self.nodes.append(n)
+        self.addNode(n)
         return n
 
+    def addNode(self, n):
+        self.nodes.add(n)
+
+    def delNode(self, n):
+        self.nodes.remove(n)
+
     def addEdge(self, n, m):
         """ Add an edge from n to m """
         if (n, m) not in self.edges and (m, n) not in self.edges:
-            self.edges.append((n, m))
-            n.succ.append(m)
-            m.pred.append(n)
+            self.edges.add((n, m))
+
+    def hasEdge(self, n, m):
+        # This can be directional or not :)
+        if self.directed:
+            return (n, m) in self.edges
+        else:
+            return (n, m) in self.edges or (m, n) in self.edges
 
-    def delEdge(self):
-        # TODO
-        pass
+    def adjecent(self, n):
+        """ Return all nodes with edges to n """
+        return set(m for m in self.nodes if self.hasEdge(n, m))
+
+    def preceeding(self, n):
+        assert self.directed
+        return set(m for m in self.nodes if self.hasEdge(m, n))
+
+    def succeeding(self, n):
+        assert self.directed
+        return set(m for m in self.nodes if self.hasEdge(n, m))
         
     def to_dot(self, f):
         """ Generate graphviz dot representation """
@@ -40,11 +60,22 @@
     """
     def __init__(self, g):
         self.g = g
-        self.succ = []
-        self.pred = []
+
+    @property
+    def Succ(self):
+        return self.g.succeeding(self)
+
+    @property
+    def Pred(self):
+        """ Return a set of predecessors """
+        return self.g.preceeding(self)
 
     @property
     def Adj(self):
-        return set(self.succ) | set(self.pred)
+        return self.g.adjecent(self)
+
+    @property
+    def Degree(self):
+        return len(self.Adj)