cyclegraph: map Promises to Promise nodes
[model-checker.git] / cyclegraph.cc
index 57f8fc8c42fe0033abbe83d14caa674feeedb1e7..58cb79f22cdd573acf59e24976014c91731e6e7e 100644 (file)
@@ -47,12 +47,39 @@ CycleNode * CycleGraph::getNode(const ModelAction *action)
 }
 
 /**
- * Adds an edge between two ModelActions. The ModelAction @a to is ordered
- * after the ModelAction @a from.
- * @param to The edge points to this ModelAction
- * @param from The edge comes from this ModelAction
+ * @brief Returns a CycleNode corresponding to a promise
+ *
+ * Gets (or creates, if none exist) a CycleNode corresponding to a promised
+ * value.
+ *
+ * @param promise The Promise generated by a reader
+ * @return The CycleNode corresponding to the Promise
+ */
+CycleNode * CycleGraph::getNode(const Promise *promise)
+{
+       const ModelAction *reader = promise->get_action();
+       CycleNode *node = readerToPromiseNode.get(reader);
+       if (node == NULL) {
+               node = new CycleNode(promise);
+               readerToPromiseNode.put(reader, node);
+       }
+       return node;
+}
+
+/*
+ * @brief Adds an edge between objects
+ *
+ * This function will add an edge between any two objects which can be
+ * associated with a CycleNode. That is, if they have a CycleGraph::getNode
+ * implementation.
+ *
+ * The object to is ordered after the object from.
+ *
+ * @param to The edge points to this object, of type T
+ * @param from The edge comes from this object, of type U
  */
-void CycleGraph::addEdge(const ModelAction *from, const ModelAction *to)
+template <typename T, typename U>
+void CycleGraph::addEdge(const T from, const U to)
 {
        ASSERT(from);
        ASSERT(to);
@@ -60,7 +87,7 @@ void CycleGraph::addEdge(const ModelAction *from, const ModelAction *to)
        CycleNode *fromnode = getNode(from);
        CycleNode *tonode = getNode(to);
 
-       addEdge(fromnode, tonode);
+       addNodeEdge(fromnode, tonode);
 }
 
 /**
@@ -68,7 +95,7 @@ void CycleGraph::addEdge(const ModelAction *from, const ModelAction *to)
  * @param fromnode The edge comes from this CycleNode
  * @param tonode The edge points to this CycleNode
  */
-void CycleGraph::addEdge(CycleNode *fromnode, CycleNode *tonode)
+void CycleGraph::addNodeEdge(CycleNode *fromnode, CycleNode *tonode)
 {
        if (!hasCycles)
                hasCycles = checkReachable(tonode, fromnode);
@@ -131,7 +158,7 @@ void CycleGraph::addRMWEdge(const ModelAction *from, const ModelAction *rmw)
                }
        }
 
-       addEdge(fromnode, rmwnode);
+       addNodeEdge(fromnode, rmwnode);
 }
 
 #if SUPPORT_MOD_ORDER_DUMP