3 * File: DecomposeOrderResolver.cc
6 * Created on September 1, 2017, 10:36 AM
9 #include "decomposeorderresolver.h"
11 #include "ordernode.h"
12 #include "ordergraph.h"
14 DecomposeOrderResolver::DecomposeOrderResolver(Order *_order) :
20 DecomposeOrderResolver::~DecomposeOrderResolver() {
23 edges.resetAndDelete();
26 void DecomposeOrderResolver::mustOrderEdge(uint64_t first, uint64_t second) {
27 DOREdge edge(first, second, 0, first, second);
28 if (!edges.contains(&edge)) {
29 DOREdge *newedge = new DOREdge(first, second, 0, first, second);
34 void DecomposeOrderResolver::remapEdge(uint64_t first, uint64_t second, uint64_t newfirst, uint64_t newsecond) {
35 DOREdge edge(first, second, 0, first, second);
36 DOREdge *oldedge = edges.get(&edge);
37 if (oldedge != NULL) {
38 edges.remove(oldedge);
39 oldedge->newfirst = newfirst;
40 oldedge->newsecond = newsecond;
43 DOREdge *newedge = new DOREdge(first, second, 0, newfirst, newsecond);
48 void DecomposeOrderResolver::setEdgeOrder(uint64_t first, uint64_t second, uint sccNum) {
49 DOREdge edge(first, second, 0, first, second);
50 DOREdge *oldedge = edges.get(&edge);
51 if (oldedge != NULL) {
52 oldedge->orderindex = sccNum;
54 DOREdge *newedge = new DOREdge(first, second, sccNum, first, second);
59 void DecomposeOrderResolver::setOrder(uint sccNum, Order *neworder) {
60 orders.setExpand(sccNum, neworder);
63 Order *DecomposeOrderResolver::getOrder(uint sccNum) {
64 Order *neworder = NULL;
65 if (orders.getSize() > sccNum)
66 neworder = orders.get(sccNum);
70 void DecomposeOrderResolver::buildGraph() {
71 graph = new OrderGraph(order);
72 SetIteratorDOREdge *iterator = edges.iterator();
73 while (iterator->hasNext()) {
74 DOREdge *doredge = iterator->next();
75 if (doredge->orderindex == 0) {
76 graph->addEdge(doredge->origfirst, doredge->origsecond);
78 Order *suborder = orders.get(doredge->orderindex);
79 bool isEdge = suborder->encoding.resolver->resolveOrder(doredge->newfirst, doredge->newsecond);
81 graph->addEdge(doredge->origfirst, doredge->origsecond);
82 else if (order->type == SATC_TOTAL)
83 graph->addEdge(doredge->origsecond, doredge->origfirst);
87 if (order->type == SATC_TOTAL) {
88 graph->computeStronglyConnectedComponentGraph();
92 bool DecomposeOrderResolver::resolveOrder(uint64_t first, uint64_t second) {
96 OrderNode *from = graph->lookupOrderNodeFromOrderGraph(first);
98 ASSERT(order->type != SATC_TOTAL);
101 OrderNode *to = graph->lookupOrderNodeFromOrderGraph(second);
103 ASSERT(order->type != SATC_TOTAL);
106 switch (order->type) {
108 return from->sccNum < to->sccNum;
110 return resolvePartialOrder(from, to);
116 bool DecomposeOrderResolver::resolvePartialOrder(OrderNode *first, OrderNode *second) {
117 if (first->sccNum > second->sccNum) {
120 return graph->isTherePath(first, second);