X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=cyclegraph.cc;h=8f095dc580afa72ab0f48756b29df97e092d6749;hb=63e202b2db7a90e176db54c864d2e54ec535c03f;hp=1ff9d70b792ad685749f8fa3c038bc7de91fdb86;hpb=5d0c8be1e7d652a85d36827074f4c72661e7457f;p=model-checker.git diff --git a/cyclegraph.cc b/cyclegraph.cc index 1ff9d70..8f095dc 100644 --- a/cyclegraph.cc +++ b/cyclegraph.cc @@ -251,6 +251,35 @@ void CycleGraph::addRMWEdge(const T *from, const ModelAction *rmw) template void CycleGraph::addRMWEdge(const ModelAction *from, const ModelAction *rmw); template void CycleGraph::addRMWEdge(const Promise *from, const ModelAction *rmw); +/** + * @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 + * @return True, if new edge(s) are added; otherwise false + */ +template +bool CycleGraph::addEdge(const T *from, const U *to) +{ + ASSERT(from); + ASSERT(to); + + CycleNode *fromnode = getNode(from); + CycleNode *tonode = getNode(to); + + return addNodeEdge(fromnode, tonode); +} +/* Instantiate three forms of CycleGraph::addEdge */ +template bool CycleGraph::addEdge(const ModelAction *from, const ModelAction *to); +template bool CycleGraph::addEdge(const ModelAction *from, const Promise *to); +template bool CycleGraph::addEdge(const Promise *from, const ModelAction *to); + #if SUPPORT_MOD_ORDER_DUMP void CycleGraph::dumpNodes(FILE *file) const { @@ -311,6 +340,29 @@ bool CycleGraph::checkReachable(const CycleNode *from, const CycleNode *to) cons return false; } +/** + * Checks whether one ModelAction can reach another ModelAction/Promise + * @param from The ModelAction from which to begin exploration + * @param to The ModelAction or Promise to reach + * @return True, @a from can reach @a to; otherwise, false + */ +template +bool CycleGraph::checkReachable(const ModelAction *from, const T *to) const +{ + CycleNode *fromnode = getNode_noCreate(from); + CycleNode *tonode = getNode_noCreate(to); + + if (!fromnode || !tonode) + return false; + + return checkReachable(fromnode, tonode); +} +/* Instantiate two forms of CycleGraph::checkReachable */ +template bool CycleGraph::checkReachable(const ModelAction *from, + const ModelAction *to) const; +template bool CycleGraph::checkReachable(const ModelAction *from, + const Promise *to) const; + /** @return True, if the promise has failed; false otherwise */ bool CycleGraph::checkPromise(const ModelAction *fromact, Promise *promise) const {