5ed3a5e89638a0437b7500de2ada68d78eef1adb
[satune.git] / src / Translator / orderresolver.cc
1 #include "orderresolver.h"
2 #include "ordergraph.h"
3 #include "ordernode.h"
4 #include "orderedge.h"
5
6 OrderResolver::OrderResolver(OrderGraph* _graph)
7         :graph(_graph)
8 {
9 }
10
11 OrderResolver::~OrderResolver(){
12         delete graph;
13 }
14
15 HappenedBefore OrderResolver::resolveOrder(uint64_t first, uint64_t second){
16         OrderNode *from = graph->getOrderNodeFromOrderGraph(first, false /*Don't create new node if doesn't exist*/);
17         if(from == NULL){
18                 return SATC_UNORDERED;
19         }
20         OrderNode *to = graph->getOrderNodeFromOrderGraph(second, false);
21         if(from == NULL){
22                 return SATC_UNORDERED;
23         }
24         if (from->sccNum != to->sccNum) {
25                 OrderEdge *edge = graph->getOrderEdgeFromOrderGraph(from, to, false /* Don't create a new edge*/);
26                 if (edge != NULL && edge->mustPos){
27                         return SATC_FIRST;
28                 } else if( edge != NULL && edge->mustNeg){
29                         return SATC_SECOND;
30                 }else {
31                         ASSERT(0);
32                         //It's a case that either there's no edge, or there is an edge
33                         // but we don't know the value! (This case shouldn't happen)
34                         //return from->sccNum < to->sccNum? SATC_FIRST: SATC_SECOND;
35                 }
36         } else {
37                 return getOrder(from, to);
38         }
39 }