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 DOREdge *oldedge=edges.get(&edge);
29 if (oldedge != NULL) {
30 oldedge->mustbetrue=true;
32 DOREdge *newedge = new DOREdge(first, second, 0, first, second);
33 newedge->mustbetrue=true;
38 void DecomposeOrderResolver::remapEdge(uint64_t first, uint64_t second, uint64_t newfirst, uint64_t newsecond) {
39 DOREdge edge(first, second, 0, first, second);
40 DOREdge *oldedge = edges.get(&edge);
41 if (oldedge != NULL) {
42 edges.remove(oldedge);
43 oldedge->newfirst = newfirst;
44 oldedge->newsecond = newsecond;
47 DOREdge *newedge = new DOREdge(first, second, 0, newfirst, newsecond);
52 void DecomposeOrderResolver::setEdgeOrder(uint64_t first, uint64_t second, uint sccNum) {
53 DOREdge edge(first, second, 0, first, second);
54 DOREdge *oldedge = edges.get(&edge);
55 if (oldedge != NULL) {
56 oldedge->orderindex = sccNum;
58 DOREdge *newedge = new DOREdge(first, second, sccNum, first, second);
61 /* Also fix up reverse edge if it exists */
62 DOREdge revedge(second, first, 0, second, first);
63 oldedge = edges.get(&revedge);
64 if (oldedge != NULL) {
65 oldedge->orderindex = sccNum;
69 void DecomposeOrderResolver::setOrder(uint sccNum, Order *neworder) {
70 orders.setExpand(sccNum, neworder);
73 Order *DecomposeOrderResolver::getOrder(uint sccNum) {
74 Order *neworder = NULL;
75 if (orders.getSize() > sccNum)
76 neworder = orders.get(sccNum);
80 void DecomposeOrderResolver::buildGraph() {
81 graph = new OrderGraph(order);
82 SetIteratorDOREdge *iterator = edges.iterator();
83 while (iterator->hasNext()) {
84 DOREdge *doredge = iterator->next();
85 if (doredge->mustbetrue) {
86 graph->addEdge(doredge->origfirst, doredge->origsecond);
87 if (doredge->newfirst != doredge->origfirst || doredge->newsecond!=doredge->origsecond) {
88 graph->addEdge(doredge->newfirst, doredge->newsecond);
90 } else if (doredge->orderindex != 0) {
91 Order *suborder = orders.get(doredge->orderindex);
92 bool isEdge = suborder->encoding.resolver->resolveOrder(doredge->newfirst, doredge->newsecond);
94 graph->addEdge(doredge->origfirst, doredge->origsecond);
95 else if (order->type == SATC_TOTAL)
96 graph->addEdge(doredge->origsecond, doredge->origfirst);
100 if (order->type == SATC_TOTAL) {
101 graph->computeStronglyConnectedComponentGraph();
105 bool DecomposeOrderResolver::resolveOrder(uint64_t first, uint64_t second) {
109 OrderNode *from = graph->lookupOrderNodeFromOrderGraph(first);
111 ASSERT(order->type != SATC_TOTAL);
114 OrderNode *to = graph->lookupOrderNodeFromOrderGraph(second);
116 ASSERT(order->type != SATC_TOTAL);
119 switch (order->type) {
121 return from->sccNum < to->sccNum;
123 return resolvePartialOrder(from, to);
129 bool DecomposeOrderResolver::resolvePartialOrder(OrderNode *first, OrderNode *second) {
130 if (first->sccNum > second->sccNum) {
133 return graph->isTherePath(first, second);