edit
[satune.git] / src / Translator / decomposeorderresolver.h
1
2 /*
3  * File:   DecomposeOrderResolver.h
4  * Author: hamed
5  *
6  * Created on September 1, 2017, 10:36 AM
7  */
8
9 #ifndef DECOMPOSEORDERRESOLVER_H
10 #define DECOMPOSEORDERRESOLVER_H
11 #include "classlist.h"
12 #include "mymemory.h"
13 #include "structs.h"
14 #include "orderresolver.h"
15
16 class DOREdge {
17 public:
18         DOREdge(uint64_t _origfirst, uint64_t _origsecond, uint _orderindex, uint64_t _newfirst, uint64_t _newsecond) :
19                 origfirst(_origfirst),
20                 origsecond(_origsecond),
21                 orderindex(_orderindex),
22                 newfirst(_newfirst),
23                 newsecond(_newsecond),
24                 mustbetrue(false) {
25         }
26         uint64_t origfirst;
27         uint64_t origsecond;
28         uint orderindex;
29         uint64_t newfirst;
30         uint64_t newsecond;
31         bool mustbetrue;
32         CMEMALLOC;
33 };
34
35 class DecomposeOrderResolver : public OrderResolver {
36 public:
37         DecomposeOrderResolver(Order *_order);
38         virtual bool resolveOrder(uint64_t first, uint64_t second);
39         virtual ~DecomposeOrderResolver();
40         void mustOrderEdge(uint64_t first, uint64_t second);
41         void remapEdge(uint64_t oldfirst, uint64_t oldsecond, uint64_t newfirst, uint64_t newsecond);
42         void setEdgeOrder(uint64_t first, uint64_t second, uint sccNum);
43         void setOrder(uint sccNum, Order *order);
44         Order *getOrder(uint sccNum);
45         CMEMALLOC;
46
47 private:
48         bool resolvePartialOrder(OrderNode *first, OrderNode *second);
49         void buildGraph();
50         OrderGraph *graph;
51         Order *order;
52         Vector<Order *> orders;
53         HashsetDOREdge edges;
54 };
55
56 #endif/* DECOMPOSEORDERRESOLVER_H */
57