summaryrefslogtreecommitdiff
path: root/lib/parserel/src/parseRel.cc
blob: 2c3713826a80ff4d35c3e7510360fa06b035fe0b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include <stdio.h>
#include <string.h>
#include "parseRel.hh"

static std::string to_string(int ival) {
  char buffer[4];
  sprintf(buffer, "%d", ival);
  return std::string(buffer);
}

simap_vec_t* make_prog(simap_vec_t* cond) {
  return cond;
}

simap_vec_t* make_cond_gt(simap_t* lhs, simap_t* rhs) {
  simap_vec_t* nvec = new simap_vec_t();
  for(simap_t::iterator it = rhs->begin(); it != rhs->end(); it++)
    (*lhs)[it->first] -= it->second;
  (*lhs)[to_string(0)] -= 1;
  nvec->push_back(*lhs);
  delete rhs;
  delete lhs;
  return nvec;
}

simap_vec_t* make_cond_lt(simap_t* lhs, simap_t* rhs) {
  return make_cond_gt(rhs, lhs);
}

simap_vec_t* make_cond_ge(simap_t* lhs, simap_t* rhs) {
  simap_vec_t* nvec = new simap_vec_t();
  for(simap_t::iterator it = rhs->begin(); it != rhs->end(); it++)
    (*lhs)[it->first] -= it->second;
  nvec->push_back(*lhs);
  delete rhs;
  delete lhs;
  return nvec;
}

simap_vec_t* make_cond_le(simap_t* lhs, simap_t* rhs) {
  return make_cond_ge(rhs, lhs);
}

simap_vec_t* make_cond_eq(simap_t* lhs, simap_t* rhs) {
  simap_vec_t* nvec = new simap_vec_t();
  for(simap_t::iterator it = lhs->begin(); it != lhs->end(); it++)
    (*rhs)[it->first] -= it->second;
  nvec->push_back(*rhs);
  for(simap_t::iterator it = rhs->begin(); it != rhs->end(); it++)
    it->second = -it->second;
  nvec->push_back(*rhs);
  delete rhs;
  delete lhs;
  return nvec;
}

simap_t* make_cond_item_add(simap_t* lhs, simap_t* rhs) {
  for(simap_t::iterator it = lhs->begin(); it != lhs->end(); it++)
    (*rhs)[it->first] += it->second;
  delete lhs;
  return rhs;
}

simap_t* make_cond_item_sub(simap_t* lhs, simap_t* rhs) {
  for(simap_t::iterator it = lhs->begin(); it != lhs->end(); it++)
    (*rhs)[it->first] = it->second - (*rhs)[it->first];
  delete lhs;
  return rhs;
}

simap_t* make_cond_item_mul(simap_t* lhs, simap_t* rhs) {
  (*lhs)[to_string(0)] += 0;
  (*rhs)[to_string(0)] += 0;
  if(rhs->size() == 1) {
    int t = (*rhs)[to_string(0)];
    for(simap_t::iterator it = lhs->begin(); it != lhs->end(); it++)
      it->second *= t;
    delete rhs;
    return lhs;
  }
  else if(rhs->size() == 1) {
    int t = (*lhs)[to_string(0)];
    for(simap_t::iterator it = rhs->begin(); it != rhs->end(); it++)
      it->second *= t;
    delete lhs;
    return rhs;
  }
  else {
    fprintf(stderr, "require Presburger formula");
    delete lhs;
    delete rhs;
    // exit(2); <-- this may be a boost feature
  }
}

simap_t* make_cond_item_neg(simap_t* expr) {
  for (simap_t::iterator it = expr->begin(); it != expr->end(); it++) {
    it->second = -(it->second);
  }
  return expr;
}

simap_t* make_cond_item_number(int n) {
  simap_t* nmap = new simap_t();
  (*nmap)[to_string(0)] = n;
  return nmap;
}

simap_t* make_cond_item_variable(const char* var) {
  simap_t* nmap = new simap_t();
  (*nmap)[std::string(var)] = 1;
  return nmap;
}

simap_t* make_cond_item_level(int n) {
  simap_t* nmap = new simap_t();
  (*nmap)[to_string(n)] = 1;
  return nmap;
}