45 auto sort = param->getSort();
46 return sort && (sort->isInt() || sort->isIntOrReal());
49 auto sort = param->getSort();
50 return sort && (sort->isReal() || sort->isIntOrReal());
53 auto sort = param->getSort();
54 return sort && sort->isBool();
57 auto sort = param->getSort();
58 return sort && sort->isBv();
61 auto sort = param->getSort();
62 return sort && sort->isFp();
65 auto sort = param->getSort();
66 return sort && sort->isStr();
69 auto sort = param->getSort();
70 return sort && sort->isReg();
73 auto sort = param->getSort();
74 return sort && sort->isArray();
124bool canExempt(std::shared_ptr<Sort> l, std::shared_ptr<Sort> r) {
125 if ((l->isInt() || l->isReal()) && (r->isInt() || r->isReal())) {
132 std::shared_ptr<Sort> sort =
nullptr;
134 bool is_int_real_sort = params[0]->getSort()->isInt() ||
135 params[0]->getSort()->isReal() ||
136 params[0]->getSort()->isIntOrReal();
137 if (is_int_real_sort) {
138 for (
size_t i = 0; i < params.size(); i++) {
139 if (params[i]->
getSort()->isReal()) {
144 if (sort ==
nullptr) {
149 for (
size_t i = 0; i < params.size(); i++) {
150 if (!params[i]->isConst()) {
151 sort = params[i]->getSort();
160 return param->getSort();
163 std::shared_ptr<DAGNode> r) {
167 std::shared_ptr<DAGNode> r,
168 std::shared_ptr<DAGNode> m) {
172std::vector<std::shared_ptr<DAGNode>>
180 std::vector<std::shared_ptr<DAGNode>> params = p;
183 std::vector<std::pair<std::shared_ptr<DAGNode>,
size_t>> params_with_hash;
184 params_with_hash.reserve(params.size());
186 for (
const auto ¶m : params) {
187 params_with_hash.emplace_back(param, param->hashCode());
191 std::sort(params_with_hash.begin(), params_with_hash.end(), [](
const std::pair<std::shared_ptr<DAGNode>,
size_t> &a,
const std::pair<std::shared_ptr<DAGNode>,
size_t> &b) {
192 if (a.second != b.second)
193 return a.second < b.second;
195 return a.first < b.first;
199 for (
size_t i = 0; i < params_with_hash.size(); i++) {
200 params[i] = params_with_hash[i].first;
207 std::shared_ptr<DAGNode> p) {
208 std::vector<std::shared_ptr<DAGNode>> params;
209 params.emplace_back(p);
210 return mkOper(sort, t, params);
214 std::shared_ptr<DAGNode> l,
215 std::shared_ptr<DAGNode> r) {
216 std::vector<std::shared_ptr<DAGNode>> params;
217 params.emplace_back(l);
218 params.emplace_back(r);
219 return mkOper(sort, t, params);
223 std::shared_ptr<DAGNode> l,
224 std::shared_ptr<DAGNode> m,
225 std::shared_ptr<DAGNode> r) {
226 std::vector<std::shared_ptr<DAGNode>> params;
227 params.emplace_back(l);
228 params.emplace_back(m);
229 params.emplace_back(r);
230 return mkOper(sort, t, params);
232std::shared_ptr<DAGNode>
242 static size_t quant_counter = 0;
244 for (
size_t i = 1, isz = p.size(); i < isz; i++) {
245 p.at(i)->setName(
"Q" + std::to_string(quant_counter) +
"-" +
246 std::to_string(i - 1));
290 std::reverse(np.begin(), np.end());
293std::shared_ptr<DAGNode>
297 std::vector<std::shared_ptr<DAGNode>> params(p);
298 for (
auto &child : params) {
299 if (child->isFuncDef()) {
301 if (child->getChildrenSize() != 1) {
302 throw std::runtime_error(
"Error: function " + child->getName() +
" is not fully defined.");
304 child = child->getFuncBody();
310 if (result !=
nullptr)
319 std::vector<std::shared_ptr<DAGNode>> nparams(params.begin() + 1,
322 nparams.insert(nparams.begin(), params[0]);
338 if (result !=
nullptr)
345std::shared_ptr<DAGNode>
347 const std::vector<std::shared_ptr<Sort>> ¶ms,
348 std::shared_ptr<Sort> out_sort) {
354 std::string new_name =
356 std::vector<std::shared_ptr<DAGNode>> children;
357 for (
auto ¶m : params) {
359 std::shared_ptr<DAGNode> param_node =
node_manager->createNode(
361 children.emplace_back(param_node);
366 std::shared_ptr<DAGNode> func =
node_manager->createNode(
369 fun_key_map.insert(std::pair<std::string, std::shared_ptr<DAGNode>>(
378 std::vector<std::shared_ptr<DAGNode>> children;
379 for (
auto ¶m : params) {
381 std::shared_ptr<DAGNode> param_node =
node_manager->createNode(
383 children.emplace_back(param_node);
388 std::shared_ptr<DAGNode> func =
node_manager->createNode(
391 std::pair<std::string, std::shared_ptr<DAGNode>>(name, func));
396std::shared_ptr<DAGNode>
398 const std::vector<std::shared_ptr<DAGNode>> ¶ms,
399 std::shared_ptr<Sort> out_sort,
400 std::shared_ptr<DAGNode> body) {
401 std::shared_ptr<DAGNode> func =
nullptr;
405 "mkFuncDef: func is not a function declaration");
410 func->updateFuncDef(out_sort, body, params);
424 std::vector<std::shared_ptr<DAGNode>> children;
425 children.emplace_back(body);
426 for (
auto ¶m : params) {
427 children.emplace_back(param);
429 std::shared_ptr<DAGNode> func =
node_manager->createNode(
432 std::pair<std::string, std::shared_ptr<DAGNode>>(name, func));
437std::shared_ptr<DAGNode>
439 const std::vector<std::shared_ptr<DAGNode>> ¶ms,
440 std::shared_ptr<Sort> out_sort,
441 std::shared_ptr<DAGNode> body) {
442 std::shared_ptr<DAGNode> func =
nullptr;
446 "mkFuncRec: func is not a function declaration");
451 func->updateFuncDef(out_sort, body, params,
true);
457 "Multiple definitions of recursive function",
467 std::vector<std::shared_ptr<DAGNode>> children;
468 children.emplace_back(body);
469 for (
auto ¶m : params) {
470 children.emplace_back(param);
472 std::shared_ptr<DAGNode> func =
node_manager->createNode(
475 std::pair<std::string, std::shared_ptr<DAGNode>>(name, func));
481 const size_t &arity) {
487 const std::vector<std::shared_ptr<Sort>> ¶ms,
488 std::shared_ptr<Sort> out_sort) {
489 return sort_manager->createSortDef(name, params, out_sort);
507 std::shared_ptr<Sort> elem) {
512std::shared_ptr<DAGNode>
514 if (params.size() < 2) {
518 std::shared_ptr<Sort> sort =
getSort(params);
524 std::vector<std::shared_ptr<DAGNode>> new_params;
526 for (
size_t i = 0; i < params.size(); i++) {
527 if (sort !=
nullptr && !params[i]->
getSort()->isEqTo(sort)) {
529 std::cerr <<
"Type mismatch in eq, but now exempt for int/real"
537 if (params[i]->isTrue()) {
542 new_params.emplace_back(params[i]);
546 if (new_params.size() == 0) {
550 else if (new_params.size() == 1) {
552 return new_params[0];
566std::shared_ptr<DAGNode>
568 if (params.size() < 2) {
572 std::shared_ptr<Sort> sort =
getSort(params);
574 std::vector<std::shared_ptr<DAGNode>> new_params;
576 for (
size_t i = 0; i < params.size(); i++) {
577 if (params[i]->isErr())
579 if (sort !=
nullptr && !params[i]->
getSort()->isEqTo(sort)) {
581 std::cerr <<
"Type mismatch in distinct, but now exempt for int/real"
589 if (params[i]->isFalse()) {
594 new_params.emplace_back(params[i]);
598 if (new_params.size() == 0) {
602 else if (new_params.size() == 1) {
604 return new_params[0];
621 const std::string &sort) {
625 const std::shared_ptr<Sort> &sort) {
626 return mkVar(sort, name);
630std::shared_ptr<DAGNode>
632 const std::shared_ptr<DAGNode> &expr) {
638 std::vector<std::shared_ptr<DAGNode>> children;
639 children.emplace_back(expr);
640 std::shared_ptr<DAGNode> new_var =
node_manager->createNode(
643 std::pair<std::string, std::shared_ptr<DAGNode>>(name, new_var));
649 const std::vector<std::shared_ptr<DAGNode>> &bind_vars) {
653 std::shared_ptr<Sort> list_sort = bind_vars[0]->getSort();
657std::shared_ptr<DAGNode>
659 const std::shared_ptr<DAGNode> &body) {
665 std::vector<std::shared_ptr<DAGNode>> children;
666 for (
const auto &list : bind_var_lists) {
667 children.emplace_back(list);
669 children.emplace_back(body);
691 "mkConstReal: invalid real constant");
703 std::string v_str = std::to_string(v);
715 std::string processed_v = v;
728 const size_t &width) {
729 std::string sort_key_name =
"BV_" + std::to_string(width);
730 std::shared_ptr<Sort> sort =
nullptr;
734 std::pair<std::string, std::shared_ptr<Sort>>(sort_key_name, sort));
745 std::string sort_key_name =
746 "FP_" + std::to_string(e) +
"_" + std::to_string(s);
747 std::shared_ptr<Sort> sort =
nullptr;
751 std::pair<std::string, std::shared_ptr<Sort>>(sort_key_name, sort));
778 std::shared_ptr<DAGNode> newvar =
785 const std::string &name) {
791 std::shared_ptr<DAGNode> newvar =
794 std::pair<std::string, size_t>(name,
node_manager->getIndex(newvar)));
806 std::shared_ptr<Sort> sort =
808 std::shared_ptr<DAGNode> newvar =
811 "Created placeholder variable is not a placeholder variable");
813 std::pair<std::string, size_t>(name,
node_manager->getIndex(newvar)));
827 const size_t &width) {
828 std::string sort_key_name =
"BV_" + std::to_string(width);
829 std::shared_ptr<Sort> sort =
nullptr;
833 std::pair<std::string, std::shared_ptr<Sort>>(sort_key_name, sort));
838 return mkVar(sort, name);
843 std::string sort_key_name =
844 "FP_" + std::to_string(e) +
"_" + std::to_string(s);
845 std::shared_ptr<Sort> sort =
nullptr;
849 std::pair<std::string, std::shared_ptr<Sort>>(sort_key_name, sort));
854 return mkVar(sort, name);
864 std::shared_ptr<Sort> rounding_mode_sort =
866 return mkVar(rounding_mode_sort, name);
869 const std::string &name) {
870 std::shared_ptr<DAGNode> newvar =
878 std::shared_ptr<Sort> index,
879 std::shared_ptr<Sort> elem) {
880 std::string sort_key_name =
881 "ARRAY_" + index->toString() +
"_" + elem->toString();
882 std::shared_ptr<Sort> sort =
nullptr;
886 std::pair<std::string, std::shared_ptr<Sort>>(sort_key_name, sort));
891 return mkVar(sort, name);
899 std::shared_ptr<DAGNode> value) {
900 if (!sort->isArray()) {
906 std::shared_ptr<Sort> elem_sort = sort->getElemSort();
907 std::shared_ptr<Sort> value_sort = value->getSort();
926std::shared_ptr<DAGNode>
928 if (params.size() == 0) {
929 std::cerr <<
"AND on empty parameters, return true" << std::endl;
932 else if (params.size() == 1) {
936 std::vector<std::shared_ptr<DAGNode>> new_params;
938 for (
size_t i = 0; i < params.size(); i++) {
943 if (params[i]->isErr()) {
946 else if (params[i]->isTrue()) {
950 else if (params[i]->isFalse()) {
956 new_params.emplace_back(params[i]);
960 if (new_params.size() == 0) {
964 else if (new_params.size() == 1) {
966 return new_params[0];
974std::shared_ptr<DAGNode>
976 if (params.size() == 0) {
977 std::cerr <<
"OR on empty parameters, return false" << std::endl;
980 else if (params.size() == 1) {
984 std::vector<std::shared_ptr<DAGNode>> new_params;
986 for (
size_t i = 0; i < params.size(); i++) {
991 if (params[i]->isErr()) {
994 else if (params[i]->isFalse()) {
998 else if (params[i]->isTrue()) {
1004 new_params.emplace_back(params[i]);
1008 if (new_params.size() == 0) {
1012 else if (new_params.size() == 1) {
1014 return new_params[0];
1021std::shared_ptr<DAGNode>
1023 if (params.size() < 2) {
1028 std::vector<std::shared_ptr<DAGNode>> new_params;
1030 for (
size_t i = 0; i < params.size() - 1; i++) {
1031 if (params[i]->isErr())
1033 if (params[i]->isFalse()) {
1037 else if (params[i]->isTrue()) {
1041 new_params.emplace_back(params[i]);
1045 if (params.back()->isErr())
1046 return params.back();
1048 if (new_params.size() == 0) {
1051 return params.back();
1054 new_params.emplace_back(params.back());
1058std::shared_ptr<DAGNode>
1060 if (params.size() == 0) {
1061 std::cerr <<
"XOR on empty parameters, return false" << std::endl;
1064 else if (params.size() == 1) {
1068 std::vector<std::shared_ptr<DAGNode>> new_params;
1069 for (
size_t i = 0; i < params.size(); i++) {
1070 if (params[i]->isErr())
1072 if (params[i]->isFalse()) {
1077 new_params.emplace_back(params[i]);
1081 if (new_params.size() == 0) {
1085 else if (new_params.size() == 1) {
1087 return new_params[0];
1097 std::shared_ptr<DAGNode> l,
1098 std::shared_ptr<DAGNode> r) {
1107std::shared_ptr<DAGNode>
1109 if (params.size() != 3) {
1114 return mkIte(params[0], params[1], params[2]);
1118std::shared_ptr<DAGNode>
1120 if (params.size() == 0) {
1124 else if (params.size() == 1) {
1127 condAssert(params.size() >= 2,
"mkAdd: params has less than 2 elements");
1128 std::shared_ptr<Sort> sort =
getSort(params);
1130 std::vector<std::shared_ptr<DAGNode>> new_params;
1132 for (
size_t i = 0; i < params.size(); i++) {
1133 if (params[i]->isErr())
1135 if (sort !=
nullptr && !params[i]->
getSort()->isEqTo(sort)) {
1137 std::cerr <<
"Type mismatch in add, but now exempt for int/real"
1149 new_params.emplace_back(params[i]);
1154 if (new_params.size() == 0) {
1156 if (
options->isRealTheory()) {
1159 else if (
options->isIntTheory()) {
1167 else if (new_params.size() == 1) {
1169 return new_params[0];
1172 if (sort ==
nullptr) {
1173 if (
options->isRealTheory()) {
1176 else if (
options->isIntTheory()) {
1188std::shared_ptr<DAGNode>
1190 if (params.size() == 1) {
1193 condAssert(params.size() >= 2,
"mkMul: params has less than 2 elements");
1194 std::shared_ptr<Sort> sort =
getSort(params);
1196 std::vector<std::shared_ptr<DAGNode>> new_params;
1198 for (
size_t i = 0; i < params.size(); i++) {
1199 if (params[i]->isErr())
1201 if (sort !=
nullptr && !params[i]->
getSort()->isEqTo(sort)) {
1203 std::cerr <<
"Type mismatch in mul, but now exempt for int/real"
1215 else if (
options->isRealTheory()) {
1219 else if (
isOne(params[i])) {
1223 new_params.emplace_back(params[i]);
1227 if (new_params.size() == 0) {
1232 else if (
options->isRealTheory()) {
1240 else if (new_params.size() == 1) {
1242 return new_params[0];
1245 if (sort ==
nullptr) {
1246 if (
options->isRealTheory()) {
1249 else if (
options->isIntTheory()) {
1257 if (new_params.size() == 2) {
1258 if (new_params[0]->isCInt() && new_params[1]->isCInt()) {
1261 else if (new_params[0]->isCReal() && new_params[1]->isCReal()) {
1272std::shared_ptr<DAGNode>
1274 if (params.size() == 1) {
1277 condAssert(params.size() >= 2,
"mkIand: params has less than 2 elements");
1278 std::shared_ptr<Sort> sort =
getSort(params);
1280 std::vector<std::shared_ptr<DAGNode>> new_params;
1281 for (
size_t i = 0; i < params.size(); i++) {
1282 if (params[i]->isErr())
1284 if (sort !=
nullptr && !params[i]->
getSort()->isEqTo(sort)) {
1286 std::cerr <<
"Type mismatch in iand, but now exempt for int/real"
1295 new_params.emplace_back(params[i]);
1298 if (sort ==
nullptr) {
1299 if (
options->isRealTheory()) {
1302 else if (
options->isIntTheory()) {
1310 if (new_params.size() == 2) {
1311 if (new_params[0]->isCInt() && new_params[1]->isCInt()) {
1322 std::shared_ptr<DAGNode> r) {
1326std::shared_ptr<DAGNode>
1328 if (params.size() == 0) {
1332 if (params.size() == 1) {
1333 return mkNeg(params[0]);
1336 std::shared_ptr<Sort> sort =
getSort(params);
1337 std::vector<std::shared_ptr<DAGNode>> new_params;
1339 for (
size_t i = 0; i < params.size(); i++) {
1340 if (params[i]->isErr())
1342 if (sort !=
nullptr && !params[i]->
getSort()->isEqTo(sort)) {
1344 std::cerr <<
"Type mismatch in sub, but now exempt for int/real"
1352 new_params.emplace_back(params[i]);
1354 if (sort ==
nullptr) {
1355 if (
options->isRealTheory()) {
1358 else if (
options->isIntTheory()) {
1366 if (new_params.size() == 2) {
1367 if ((sort->isInt() || sort->isIntOrReal()) && new_params[0]->isCInt() &&
1368 new_params[1]->isCInt()) {
1371 else if (sort->isReal() && new_params[0]->isCReal() &&
1372 new_params[1]->isCReal()) {
1375 else if (
isZero(new_params[0])) {
1376 return mkNeg(new_params[1]);
1378 else if (
isZero(new_params[1])) {
1379 return new_params[0];
1391std::shared_ptr<DAGNode>
1393 if (params.size() < 2) {
1397 if (params.size() == 1) {
1403std::shared_ptr<DAGNode>
1408std::shared_ptr<DAGNode>
1410 if (params.size() < 2) {
1414 if (params.size() == 1) {
1423 std::shared_ptr<DAGNode> r) {
1514 std::shared_ptr<DAGNode> r) {
1515 if (!l->getSort()->isEqTo(r->getSort())) {
1516 if (
canExempt(l->getSort(), r->getSort())) {
1517 std::cerr <<
"Type mismatch in log, but now exempt for int/real"
1675 std::shared_ptr<DAGNode> r) {
1679std::shared_ptr<DAGNode>
1681 if (params.size() < 2) {
1687std::shared_ptr<DAGNode>
1689 if (params.size() < 2) {
1695std::shared_ptr<DAGNode>
1697 if (params.size() < 2) {
1705std::shared_ptr<DAGNode>
1707 if (params.size() < 2) {
1749 std::shared_ptr<DAGNode> r) {
1808 else if (sort->isFp()) {
1810 size_t eb = sort->getExponentWidth();
1811 size_t sb = sort->getSignificandWidth();
1812 std::string const_name =
1813 "(_ +oo " + std::to_string(eb) +
" " + std::to_string(sb) +
")";
1834 else if (sort->isFp()) {
1836 size_t eb = sort->getExponentWidth();
1837 size_t sb = sort->getSignificandWidth();
1838 std::string const_name =
1839 "(_ -oo " + std::to_string(eb) +
" " + std::to_string(sb) +
")";
1860 else if (sort->isFp()) {
1862 size_t eb = sort->getExponentWidth();
1863 size_t sb = sort->getSignificandWidth();
1864 std::string const_name =
1865 "(_ NaN " + std::to_string(eb) +
" " + std::to_string(sb) +
")";
1893 std::shared_ptr<DAGNode> r) {
1904 std::shared_ptr<DAGNode> r) {
1932std::shared_ptr<DAGNode>
1934 if (params.size() == 0) {
1935 std::cerr <<
"BVAND on empty parameters, return true" << std::endl;
1938 else if (params.size() == 1) {
1941 std::shared_ptr<Sort> sort =
getSort(params);
1943 std::vector<std::shared_ptr<DAGNode>> new_params;
1945 for (
size_t i = 0; i < params.size(); i++) {
1946 if (params[i]->isErr())
1948 if (sort !=
nullptr && !
isBvParam(params[i])) {
1952 new_params.emplace_back(params[i]);
1955 if (sort ==
nullptr) {
1956 sort = new_params[0]->getSort();
1965std::shared_ptr<DAGNode>
1967 if (params.size() == 0) {
1968 std::cerr <<
"BVOR on empty parameters, return false" << std::endl;
1971 else if (params.size() == 1) {
1974 std::shared_ptr<Sort> sort =
getSort(params);
1976 std::vector<std::shared_ptr<DAGNode>> new_params;
1978 for (
size_t i = 0; i < params.size(); i++) {
1979 if (params[i]->isErr())
1981 if (sort !=
nullptr && !
isBvParam(params[i])) {
1985 new_params.emplace_back(params[i]);
1988 if (sort ==
nullptr) {
1989 sort = new_params[0]->getSort();
1995std::shared_ptr<DAGNode>
1997 if (params.size() == 0) {
1998 std::cerr <<
"BVXOR on empty parameters, return false" << std::endl;
2001 else if (params.size() == 1) {
2004 std::shared_ptr<Sort> sort =
getSort(params);
2006 std::vector<std::shared_ptr<DAGNode>> new_params;
2008 for (
size_t i = 0; i < params.size(); i++) {
2009 if (params[i]->isErr())
2011 if (sort !=
nullptr && !
isBvParam(params[i])) {
2015 new_params.emplace_back(params[i]);
2018 if (sort ==
nullptr) {
2019 sort = new_params[0]->getSort();
2026 std::shared_ptr<DAGNode> r) {
2027 std::shared_ptr<Sort> sort =
getSort(l, r);
2028 if (sort ==
nullptr) {
2029 sort = l->getSort();
2036 std::shared_ptr<DAGNode> r) {
2037 std::shared_ptr<Sort> sort =
getSort(l, r);
2038 if (sort ==
nullptr) {
2039 sort = l->getSort();
2045std::shared_ptr<DAGNode>
2047 std::shared_ptr<Sort> sort =
sort_manager->createBVSort(1);
2053 std::shared_ptr<DAGNode> r) {
2054 std::shared_ptr<Sort> sort =
getSort(l, r);
2056 if (sort ==
nullptr) {
2057 sort = l->getSort();
2070std::shared_ptr<DAGNode>
2072 if (params.size() == 0) {
2076 else if (params.size() == 1) {
2079 std::shared_ptr<Sort> sort =
getSort(params);
2080 std::vector<std::shared_ptr<DAGNode>> new_params;
2082 for (
size_t i = 0; i < params.size(); i++) {
2083 if (params[i]->isErr())
2085 if (sort !=
nullptr && !
isBvParam(params[i])) {
2089 new_params.emplace_back(params[i]);
2092 if (sort ==
nullptr) {
2093 sort = new_params[0]->getSort();
2100 std::shared_ptr<DAGNode> r) {
2101 std::shared_ptr<Sort> sort =
getSort(l, r);
2103 if (sort ==
nullptr) {
2104 sort = l->getSort();
2110std::shared_ptr<DAGNode>
2112 if (params.size() == 0) {
2116 else if (params.size() == 1) {
2119 std::shared_ptr<Sort> sort =
getSort(params);
2120 std::vector<std::shared_ptr<DAGNode>> new_params;
2121 for (
size_t i = 0; i < params.size(); i++) {
2122 if (params[i]->isErr())
2124 if (sort !=
nullptr && !
isBvParam(params[i])) {
2128 new_params.emplace_back(params[i]);
2131 if (sort ==
nullptr) {
2132 sort = new_params[0]->getSort();
2141 std::shared_ptr<DAGNode> r) {
2152 std::shared_ptr<DAGNode> r) {
2163 std::shared_ptr<DAGNode> r) {
2174 std::shared_ptr<DAGNode> r) {
2185 std::shared_ptr<DAGNode> r) {
2196 std::shared_ptr<DAGNode> r) {
2207 std::shared_ptr<DAGNode> r) {
2218 std::shared_ptr<DAGNode> r) {
2229 std::shared_ptr<DAGNode> r) {
2239std::shared_ptr<DAGNode>
2241 if (params.size() == 0) {
2245 else if (params.size() == 1) {
2248 std::vector<std::shared_ptr<DAGNode>> new_params;
2251 for (
size_t i = 0; i < params.size(); i++) {
2252 if (params[i]->isErr())
2259 width += params[i]->getSort()->getBitWidth();
2260 new_params.emplace_back(params[i]);
2262 std::shared_ptr<Sort> new_sort =
sort_manager->createBVSort(width);
2270 std::shared_ptr<DAGNode> r,
2271 std::shared_ptr<DAGNode> s) {
2272 if (l->isErr() || r->isErr() || s->isErr())
2273 return l->isErr() ? l : r;
2279 std::shared_ptr<Sort> new_sort =
sort_manager->createBVSort(width);
2287 std::shared_ptr<DAGNode> r) {
2292 size_t width = l->getSort()->getBitWidth() *
toInt(r).
toULong();
2293 std::shared_ptr<Sort> new_sort =
sort_manager->createBVSort(width);
2301 std::shared_ptr<DAGNode> r) {
2307 std::shared_ptr<Sort> new_sort =
2308 sort_manager->createBVSort(width + l->getSort()->getBitWidth());
2315 std::shared_ptr<DAGNode> r) {
2321 std::shared_ptr<Sort> new_sort =
2322 sort_manager->createBVSort(width + l->getSort()->getBitWidth());
2330 std::shared_ptr<DAGNode> r) {
2336 size_t width = l->getSort()->getBitWidth();
2337 std::shared_ptr<Sort> new_sort =
sort_manager->createBVSort(width);
2345 std::shared_ptr<DAGNode> r) {
2350 size_t width = l->getSort()->getBitWidth();
2351 std::shared_ptr<Sort> new_sort =
sort_manager->createBVSort(width);
2360 std::shared_ptr<DAGNode> r) {
2374 std::shared_ptr<DAGNode> r) {
2380 if (l->isCBV() && r->isCBV()) {
2395 std::shared_ptr<DAGNode> r) {
2401 if (l->isCBV() && r->isCBV()) {
2416 std::shared_ptr<DAGNode> r) {
2422 if (l->isCBV() && r->isCBV()) {
2437 std::shared_ptr<DAGNode> r) {
2443 if (l->isCBV() && r->isCBV()) {
2458 std::shared_ptr<DAGNode> r) {
2464 if (l->isCBV() && r->isCBV()) {
2479 std::shared_ptr<DAGNode> r) {
2485 if (l->isCBV() && r->isCBV()) {
2500 std::shared_ptr<DAGNode> r) {
2506 if (l->isCBV() && r->isCBV()) {
2533 std::shared_ptr<DAGNode> size) {
2538 std::shared_ptr<Sort> new_sort =
2572 std::shared_ptr<DAGNode> size) {
2577 std::shared_ptr<Sort> new_sort =
2586std::shared_ptr<DAGNode>
2588 if (params.size() != 3) {
2590 "fp.add requires exactly 3 parameters: RoundingMode, "
2591 "FloatingPoint, FloatingPoint",
2596 if (params[0]->isErr() || params[1]->isErr() || params[2]->isErr()) {
2597 return params[0]->isErr() ? params[0]
2598 : (params[1]->isErr() ? params[1] : params[2]);
2601 if (!params[0]->
getSort()->isRoundingMode()) {
2603 "First parameter of fp.add must be a rounding mode",
2611 "Second and third parameters of fp.add must be floating point numbers",
2616 std::shared_ptr<Sort> result_sort = params[1]->getSort();
2617 if (!(*result_sort == *params[2]->
getSort())) {
2619 "Floating point operands must have the same sort",
2629std::shared_ptr<DAGNode>
2631 if (params.size() != 3) {
2633 "fp.sub requires exactly 3 parameters: RoundingMode, "
2634 "FloatingPoint, FloatingPoint",
2639 if (params[0]->isErr() || params[1]->isErr() || params[2]->isErr()) {
2640 return params[0]->isErr() ? params[0]
2641 : (params[1]->isErr() ? params[1] : params[2]);
2644 if (!params[0]->
getSort()->isRoundingMode()) {
2646 "First parameter of fp.sub must be a rounding mode",
2654 "Second and third parameters of fp.sub must be floating point numbers",
2659 std::shared_ptr<Sort> result_sort = params[1]->getSort();
2660 if (!(*result_sort == *params[2]->
getSort())) {
2662 "Floating point operands must have the same sort",
2672std::shared_ptr<DAGNode>
2674 if (params.size() != 3) {
2676 "fp.mul requires exactly 3 parameters: RoundingMode, "
2677 "FloatingPoint, FloatingPoint",
2682 if (params[0]->isErr() || params[1]->isErr() || params[2]->isErr()) {
2683 return params[0]->isErr() ? params[0]
2684 : (params[1]->isErr() ? params[1] : params[2]);
2687 if (!params[0]->
getSort()->isRoundingMode()) {
2689 "First parameter of fp.mul must be a rounding mode",
2697 "Second and third parameters of fp.mul must be floating point numbers",
2702 std::shared_ptr<Sort> result_sort = params[1]->getSort();
2703 if (!(*result_sort == *params[2]->
getSort())) {
2705 "Floating point operands must have the same sort",
2715std::shared_ptr<DAGNode>
2717 if (params.size() != 3) {
2719 "fp.div requires exactly 3 parameters: RoundingMode, "
2720 "FloatingPoint, FloatingPoint",
2725 if (params[0]->isErr() || params[1]->isErr() || params[2]->isErr()) {
2726 return params[0]->isErr() ? params[0]
2727 : (params[1]->isErr() ? params[1] : params[2]);
2730 if (!params[0]->
getSort()->isRoundingMode()) {
2732 "First parameter of fp.div must be a rounding mode",
2740 "Second and third parameters of fp.div must be floating point numbers",
2745 std::shared_ptr<Sort> result_sort = params[1]->getSort();
2746 if (!(*result_sort == *params[2]->
getSort())) {
2748 "Floating point operands must have the same sort",
2781 std::shared_ptr<DAGNode> r) {
2792std::shared_ptr<DAGNode>
2794 if (params.size() != 4) {
2796 "fp.fma requires exactly 4 parameters: RoundingMode Fp Fp Fp",
2802 if (!params[0]->
getSort()->isRoundingMode()) {
2804 "First parameter must be a rounding mode in fp.fma",
2810 for (
size_t i = 1; i < params.size(); i++) {
2811 if (params[i]->isErr())
2815 "Parameters 2-4 must be floating point in fp.fma",
2822 std::shared_ptr<Sort> sort = params[1]->getSort();
2823 for (
size_t i = 2; i < params.size(); i++) {
2824 if (!(*params[i]->
getSort() == *sort)) {
2826 "All floating point parameters must have the same sort in fp.fma",
2838 std::shared_ptr<DAGNode> param) {
2839 if (rm->isErr() || param->isErr())
2840 return rm->isErr() ? rm : param;
2863std::shared_ptr<DAGNode>
2865 std::shared_ptr<DAGNode> param) {
2866 if (rm->isErr() || param->isErr())
2867 return rm->isErr() ? rm : param;
2879std::shared_ptr<DAGNode>
2892 std::shared_ptr<DAGNode> r) {
2893 std::shared_ptr<Sort> sort =
getSort(l, r);
2895 if (sort ==
nullptr) {
2896 sort = l->getSort();
2905 std::shared_ptr<DAGNode> r) {
2906 std::shared_ptr<Sort> sort =
getSort(l, r);
2908 if (sort ==
nullptr) {
2909 sort = l->getSort();
2918std::shared_ptr<DAGNode>
2932std::shared_ptr<DAGNode>
2946std::shared_ptr<DAGNode>
2959std::shared_ptr<DAGNode>
2972std::shared_ptr<DAGNode>
2988 std::shared_ptr<DAGNode> param,
2989 std::shared_ptr<DAGNode> size) {
2990 if (!rm->getSort()->isRoundingMode() || !
isFpParam(param) ||
2996 if (param->isCBV() && size->isCBV()) {
2999 toInt(size).toULong());
3002 std::shared_ptr<Sort> new_sort =
3008 std::shared_ptr<DAGNode> param,
3009 std::shared_ptr<DAGNode> size) {
3010 if (!rm->getSort()->isRoundingMode() || !
isFpParam(param) ||
3016 if (param->isCBV() && size->isCBV()) {
3019 toInt(size).toULong());
3022 std::shared_ptr<Sort> new_sort =
3045 std::shared_ptr<DAGNode> sb,
3046 std::shared_ptr<DAGNode> rm,
3047 std::shared_ptr<DAGNode> param) {
3048 if (eb->isErr() || sb->isErr() || rm->isErr() || param->isErr())
3049 return eb->isErr() ? eb : (sb->isErr() ? sb : (rm->isErr() ? rm : param));
3052 if (!eb->isCInt() && !eb->isConst()) {
3054 "Exponent width must be an integer in to_fp",
3058 if (!sb->isCInt() && !sb->isConst()) {
3060 "Significand width must be an integer in to_fp",
3066 if (!rm->getSort()->isRoundingMode()) {
3068 "Third parameter must be a rounding mode in to_fp",
3076 std::shared_ptr<Sort> sort =
3077 sort_manager->createFPSort(exponent_width, significand_width);
3082 "Fourth parameter must be Real, BitVec, or FloatingPoint in to_fp",
3087 std::vector<std::shared_ptr<DAGNode>> params = {eb, sb, rm, param};
3092 std::shared_ptr<DAGNode> sb,
3093 std::shared_ptr<DAGNode> param) {
3094 if (eb->isErr() || sb->isErr() || param->isErr())
3095 return eb->isErr() ? eb : (sb->isErr() ? sb : param);
3098 if (!eb->isCInt() && !eb->isConst()) {
3100 "Exponent width must be an integer in to_fp",
3104 if (!sb->isCInt() && !sb->isConst()) {
3106 "Significand width must be an integer in to_fp",
3114 std::shared_ptr<Sort> sort =
3115 sort_manager->createFPSort(exponent_width, significand_width);
3128std::shared_ptr<DAGNode>
3129Parser::mkToFpUnsigned(std::shared_ptr<DAGNode> eb, std::shared_ptr<DAGNode> sb, std::shared_ptr<DAGNode> rm, std::shared_ptr<DAGNode> param) {
3130 if (eb->isErr() || sb->isErr() || rm->isErr() || param->isErr())
3131 return eb->isErr() ? eb : (sb->isErr() ? sb : (rm->isErr() ? rm : param));
3133 if (!eb->isCInt() && !eb->isConst()) {
3135 "Exponent width must be an integer in to_fp_unsigned",
3139 if (!sb->isCInt() && !sb->isConst()) {
3142 "Significand width must be an integer in to_fp_unsigned",
3149 std::shared_ptr<Sort> sort =
3150 sort_manager->createFPSort(exponent_width, significand_width);
3152 if (!rm->getSort()->isRoundingMode()) {
3154 "Third parameter must be a rounding mode in to_fp_unsigned",
3161 "Fourth parameter must be BitVec in to_fp_unsigned",
3166 std::vector<std::shared_ptr<DAGNode>> params = {eb, sb, rm, param};
3173 std::shared_ptr<DAGNode> exp,
3174 std::shared_ptr<DAGNode> mant) {
3175 if (sign->isErr() || exp->isErr() || mant->isErr())
3176 return sign->isErr() ? sign : (exp->isErr() ? exp : mant);
3180 "All parameters must be BitVec in fp constant",
3185 size_t sign_width = sign->getSort()->getBitWidth();
3186 size_t exp_width = exp->getSort()->getBitWidth();
3187 size_t mant_width = mant->getSort()->getBitWidth();
3189 if (sign_width != 1) {
3194 std::shared_ptr<Sort> sort =
3196 std::vector<std::shared_ptr<DAGNode>> children = {sign, exp, mant};
3214std::shared_ptr<DAGNode>
3283 std::shared_ptr<DAGNode> r) {
3295 std::shared_ptr<DAGNode> r,
3296 std::shared_ptr<DAGNode> v) {
3297 if (l->isErr() || r->isErr() || v->isErr())
3298 return l->isErr() ? l : r;
3321std::shared_ptr<DAGNode>
3323 if (params.size() == 0) {
3327 else if (params.size() == 1) {
3330 std::vector<std::shared_ptr<DAGNode>> new_params;
3332 for (
size_t i = 0; i < params.size(); i++) {
3333 if (params[i]->isErr())
3339 new_params.emplace_back(params[i]);
3342 if (new_params.size() == 0)
3344 if (new_params.size() == 1)
3345 return new_params[0];
3352 std::shared_ptr<DAGNode> r,
3353 std::shared_ptr<DAGNode> s) {
3354 if (l->isErr() || r->isErr() || s->isErr())
3355 return l->isErr() ? l : r;
3367 std::shared_ptr<DAGNode> r) {
3379 std::shared_ptr<DAGNode> r) {
3391 std::shared_ptr<DAGNode> r,
3392 std::shared_ptr<DAGNode> s) {
3393 if (l->isErr() || r->isErr() || s->isErr())
3394 return l->isErr() ? l : r;
3406 std::shared_ptr<DAGNode> r) {
3418 std::shared_ptr<DAGNode> r,
3419 std::shared_ptr<DAGNode> v) {
3420 if (l->isErr() || r->isErr() || v->isErr())
3421 return l->isErr() ? l : r;
3433 std::shared_ptr<DAGNode> r,
3434 std::shared_ptr<DAGNode> v) {
3435 if (l->isErr() || r->isErr() || v->isErr())
3436 return l->isErr() ? l : r;
3448 std::shared_ptr<DAGNode> r,
3449 std::shared_ptr<DAGNode> v) {
3468 std::shared_ptr<DAGNode> r,
3469 std::shared_ptr<DAGNode> v) {
3470 if (l->isErr() || r->isErr() || v->isErr())
3471 return l->isErr() ? l : r;
3482std::shared_ptr<DAGNode>
3484 std::shared_ptr<DAGNode> r,
3485 std::shared_ptr<DAGNode> v) {
3486 if (l->isErr() || r->isErr() || v->isErr())
3487 return l->isErr() ? l : r;
3499 std::shared_ptr<DAGNode> r) {
3500 if (l->isErr() || r->isErr())
3501 return l->isErr() ? l : r;
3546 std::shared_ptr<DAGNode> r) {
3558 std::shared_ptr<DAGNode> r,
3559 std::shared_ptr<DAGNode> s) {
3567 std::shared_ptr<DAGNode> r,
3568 std::shared_ptr<DAGNode> s) {
3576 std::shared_ptr<DAGNode> r) {
3587 std::shared_ptr<DAGNode> r,
3588 std::shared_ptr<DAGNode> s) {
3599 std::shared_ptr<DAGNode> r,
3600 std::shared_ptr<DAGNode> s) {
3611 std::shared_ptr<DAGNode> r) {
3622std::shared_ptr<DAGNode>
3633std::shared_ptr<DAGNode>
3640std::shared_ptr<DAGNode>
3647std::shared_ptr<DAGNode>
3649 std::vector<std::shared_ptr<DAGNode>> nparams(params.rbegin(), params.rend());
3657 std::shared_ptr<DAGNode> r) {
3672 std::shared_ptr<DAGNode> r) {
3754std::shared_ptr<DAGNode>
3756 if (params.size() == 0) {
3760 else if (params.size() == 1) {
3763 std::vector<std::shared_ptr<DAGNode>> new_params;
3765 for (
size_t i = 0; i < params.size(); i++) {
3766 if (params[i]->isErr())
3772 new_params.emplace_back(params[i]);
3780std::shared_ptr<DAGNode>
3782 if (params.size() == 0) {
3786 else if (params.size() == 1) {
3789 std::vector<std::shared_ptr<DAGNode>> new_params;
3791 for (
size_t i = 0; i < params.size(); i++) {
3792 if (params[i]->isErr())
3798 new_params.emplace_back(params[i]);
3806std::shared_ptr<DAGNode>
3808 if (params.size() == 0) {
3812 else if (params.size() == 1) {
3815 std::vector<std::shared_ptr<DAGNode>> new_params;
3817 for (
size_t i = 0; i < params.size(); i++) {
3818 if (params[i]->isErr())
3824 new_params.emplace_back(params[i]);
3832std::shared_ptr<DAGNode>
3834 if (params.size() != 2) {
3838 if (params[0]->isErr() || params[1]->isErr())
3839 return params[0]->isErr() ? params[0] : params[1];
3884 std::shared_ptr<DAGNode> r) {
3896 std::shared_ptr<DAGNode> r) {
3910 std::shared_ptr<DAGNode> r,
3911 std::shared_ptr<DAGNode> s) {
3912 if (l->isErr() || r->isErr() || s->isErr())
3913 return l->isErr() ? l : r;
3924std::shared_ptr<DAGNode>
3938 std::shared_ptr<DAGNode> r,
3939 std::shared_ptr<DAGNode> v) {
3940 if (l->isErr() || r->isErr() || v->isErr())
3941 return l->isErr() ? l : r;
3953 std::shared_ptr<DAGNode> r,
3954 std::shared_ptr<DAGNode> v) {
3955 if (l->isErr() || r->isErr() || v->isErr())
3956 return l->isErr() ? l : r;
3968 std::shared_ptr<DAGNode> r) {
3978std::shared_ptr<DAGNode>
3980 if (params.size() == 0) {
3984 else if (params.size() == 1) {
3987 std::shared_ptr<Sort> sort =
getSort(params);
3989 std::vector<std::shared_ptr<DAGNode>> new_params;
3992 for (
size_t i = 0; i < params.size() - 1; i++) {
3993 if (params[i]->isErr())
3995 if (sort !=
nullptr && !params[i]->
getSort()->isEqTo(sort)) {
3997 std::cerr <<
"Type mismatch in max, but now exempt for int/real"
4005 new_params.emplace_back(params[i]);
4010std::shared_ptr<DAGNode>
4012 if (params.size() == 0) {
4016 else if (params.size() == 1) {
4019 std::shared_ptr<Sort> sort =
getSort(params);
4021 std::vector<std::shared_ptr<DAGNode>> new_params;
4024 for (
size_t i = 0; i < params.size() - 1; i++) {
4025 if (params[i]->isErr())
4027 if (sort !=
nullptr && !params[i]->
getSort()->isEqTo(sort)) {
4029 std::cerr <<
"Type mismatch in min, but now exempt for int/real"
4037 new_params.emplace_back(params[i]);
4301 std::shared_ptr<DAGNode> index_node =
mkConstInt(index);
4306 "root-obj(" +
toString(expr) +
"," + std::to_string(index) +
")";
4307 std::vector<std::shared_ptr<DAGNode>> children = {expr, index_node};
4313 const std::vector<std::shared_ptr<DAGNode>> &coeffs,
4314 std::shared_ptr<DAGNode> lower_bound,
4315 std::shared_ptr<DAGNode> upper_bound) {
4316 if (lower_bound->isErr())
4318 if (upper_bound->isErr())
4322 for (
const auto &coeff : coeffs) {
4331 std::string name =
"root-of-with-interval(coeffs:";
4332 for (
size_t i = 0; i < coeffs.size(); i++) {
4337 name +=
",lb:" +
toString(lower_bound) +
",ub:" +
toString(upper_bound) +
")";
4340 std::vector<std::shared_ptr<DAGNode>> children;
4341 children.insert(children.end(), coeffs.begin(), coeffs.end());
4342 children.push_back(lower_bound);
4343 children.push_back(upper_bound);
#define condAssert(cond, msg)
static bool bvComp(const std::string &bv1, const std::string &bv2, const NODE_KIND &kind)
static std::string natToBv(const Integer &i, const Integer &n)
static std::string toString(const Integer &i)
static std::string fpToSbv(const std::string &fp, const Integer &n)
static std::string fpToUbv(const std::string &fp, const Integer &n)
unsigned long toULong() const
static const std::shared_ptr< DAGNode > E_NODE
static const std::shared_ptr< DAGNode > INT_INF_NODE
static const std::shared_ptr< DAGNode > STR_NEG_INF_NODE
static const std::shared_ptr< DAGNode > POS_EPSILON_NODE
static const std::shared_ptr< DAGNode > PI_NODE
static const std::shared_ptr< DAGNode > UNKNOWN_NODE
static const std::shared_ptr< DAGNode > NAN_NODE
static const std::shared_ptr< DAGNode > REAL_INF_NODE
static const std::shared_ptr< DAGNode > STR_POS_INF_NODE
static const std::shared_ptr< DAGNode > REAL_NEG_INF_NODE
static const std::shared_ptr< DAGNode > NEG_EPSILON_NODE
static const std::shared_ptr< DAGNode > REAL_POS_INF_NODE
static const std::shared_ptr< DAGNode > TRUE_NODE
static const std::shared_ptr< DAGNode > STR_INF_NODE
static const std::shared_ptr< DAGNode > NULL_NODE
static const std::shared_ptr< DAGNode > INT_POS_INF_NODE
static const std::shared_ptr< DAGNode > INT_NEG_INF_NODE
static const std::shared_ptr< DAGNode > EPSILON_NODE
static const std::shared_ptr< DAGNode > FALSE_NODE
HighPrecisionInteger toInteger() const
HighPrecisionReal toReal(mpfr_prec_t precision=128) const
std::shared_ptr< DAGNode > mkSelect(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create an array select node.
std::shared_ptr< DAGNode > mkBvSub(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector subtraction node.
std::shared_ptr< DAGNode > mkReplaceRegAll(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r, std::shared_ptr< DAGNode > v)
Create a string replace-all-regex node.
void err_all(const ERROR_TYPE e, const std::string s="", const size_t ln=0) const
std::shared_ptr< DAGNode > mkAnd(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create an and node.
std::shared_ptr< DAGNode > mkCot(std::shared_ptr< DAGNode > param)
Create a cot node.
std::shared_ptr< GlobalOptions > options
std::shared_ptr< DAGNode > mkSin(std::shared_ptr< DAGNode > param)
Create an sin node.
std::shared_ptr< DAGNode > mkSbvToInt(std::shared_ptr< DAGNode > param)
std::shared_ptr< DAGNode > mkConstArray(std::shared_ptr< Sort > sort, std::shared_ptr< DAGNode > value)
Create a constant array node.
std::shared_ptr< DAGNode > mkStrLt(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a string less-than node.
std::shared_ptr< DAGNode > mkFpToSbv(std::shared_ptr< DAGNode > rm, std::shared_ptr< DAGNode > param, std::shared_ptr< DAGNode > size)
Create a floating-point to signed bitvector conversion node.
std::shared_ptr< Sort > mkRealSort()
Create a real sort.
std::shared_ptr< DAGNode > mkAsinh(std::shared_ptr< DAGNode > param)
Create an asinh node.
std::shared_ptr< DAGNode > mkAsec(std::shared_ptr< DAGNode > param)
Create an asec node.
std::shared_ptr< DAGNode > mkCeil(std::shared_ptr< DAGNode > param)
Create an ceil node.
std::shared_ptr< Sort > mkSortDef(const std::string &name, const std::vector< std::shared_ptr< Sort > > ¶ms, std::shared_ptr< Sort > out_sort)
Create a sort definition.
std::unordered_map< std::string, size_t > fun_dup_count_map
std::shared_ptr< DAGNode > mkLcm(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a lcm node.
std::shared_ptr< DAGNode > mkXor(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create an xor node.
std::shared_ptr< DAGNode > mkStrPrefixof(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a string prefix check node.
std::unordered_map< std::string, size_t > temp_var_names
std::shared_ptr< DAGNode > mkStrToReg(std::shared_ptr< DAGNode > param)
Create a string to-regex conversion node.
std::shared_ptr< DAGNode > mkVarBool(const std::string &name)
Create a boolean variable.
std::shared_ptr< DAGNode > mkIntToBv(std::shared_ptr< DAGNode > param, std::shared_ptr< DAGNode > width)
Create an integer to bitvector conversion node.
bool isOne(std::shared_ptr< DAGNode > expr)
Check if an expression is one.
std::shared_ptr< DAGNode > mkAcsc(std::shared_ptr< DAGNode > param)
Create an acsc node.
std::shared_ptr< DAGNode > mkFpEq(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a floating-point equality node.
std::shared_ptr< DAGNode > mkBvAdd(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a bitvector addition node.
std::shared_ptr< DAGNode > mkStrSplitAt(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r, std::shared_ptr< DAGNode > s)
std::shared_ptr< DAGNode > mkBvSmod(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector signed modulo node.
static std::vector< std::shared_ptr< DAGNode > > sortParams(const std::vector< std::shared_ptr< DAGNode > > &p)
Return sorted operand list for deterministic commutative handling.
std::shared_ptr< DAGNode > mkStrInReg(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a string in-regex check node.
std::shared_ptr< DAGNode > mkBvXnor(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector xnor node.
std::shared_ptr< DAGNode > mkTan(std::shared_ptr< DAGNode > param)
Create an tan node.
std::shared_ptr< DAGNode > mkFalse()
Create a false node.
std::shared_ptr< DAGNode > mkGt(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a gt node.
std::shared_ptr< DAGNode > mkNegEpsilon()
Create a negative epsilon node.
std::shared_ptr< DAGNode > mkBvSrem(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector signed remainder node.
std::shared_ptr< DAGNode > mkNegInfinity(std::shared_ptr< Sort > sort=nullptr)
Create a negative infinity node.
std::shared_ptr< DAGNode > mkTanh(std::shared_ptr< DAGNode > param)
Create a tanh node.
std::shared_ptr< DAGNode > mkCsch(std::shared_ptr< DAGNode > param)
Create a csch node.
std::shared_ptr< DAGNode > mkIsInt(std::shared_ptr< DAGNode > param)
Create a is_int node.
std::shared_ptr< DAGNode > mkNot(std::shared_ptr< DAGNode > param)
Create a not node.
std::shared_ptr< DAGNode > mkBvSdiv(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector signed division node.
std::shared_ptr< DAGNode > mkVarRoundingMode(const std::string &name)
Create a rounding mode variable.
std::shared_ptr< DAGNode > mkBvUlt(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector unsigned less than node.
std::shared_ptr< DAGNode > mkIsOdd(std::shared_ptr< DAGNode > param)
Create a is_odd node.
std::shared_ptr< DAGNode > mkSec(std::shared_ptr< DAGNode > param)
Create an sec node.
std::shared_ptr< DAGNode > mkUbvToInt(std::shared_ptr< DAGNode > param)
std::shared_ptr< DAGNode > mkStrReplaceReg(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r, std::shared_ptr< DAGNode > v)
Create a string replace-regex node.
std::shared_ptr< DAGNode > mkLb(std::shared_ptr< DAGNode > param)
Create an lb/log2 node.
std::shared_ptr< DAGNode > mkBvZeroExt(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector zero extension node.
std::shared_ptr< DAGNode > mkEpsilon()
Create a epsilon node.
std::shared_ptr< DAGNode > mkMul(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create an mul node.
std::shared_ptr< DAGNode > mkVarInt(const std::string &name)
Create an integer variable.
std::shared_ptr< DAGNode > mkRegInter(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a regex intersection node.
std::shared_ptr< DAGNode > mkLe(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a le node.
std::shared_ptr< Sort > mkFPSort(const size_t &e, const size_t &s)
Create a floating-point sort.
std::shared_ptr< DAGNode > mkStrContains(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a string contains check node.
std::shared_ptr< DAGNode > mkFpIsSubnormal(std::shared_ptr< DAGNode > param)
Create a floating-point is-subnormal check node.
std::shared_ptr< DAGNode > mkInternalOper(const std::shared_ptr< Sort > &sort, const NODE_KIND &t, const std::vector< std::shared_ptr< DAGNode > > &p)
std::shared_ptr< DAGNode > mkRegAll()
Create a regex all node.
std::shared_ptr< DAGNode > mkStore(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r, std::shared_ptr< DAGNode > v)
Create an array store node.
std::shared_ptr< DAGNode > mkFpRoundToIntegral(std::shared_ptr< DAGNode > rm, std::shared_ptr< DAGNode > param)
Create a floating-point round to integral node.
std::shared_ptr< DAGNode > mkRegOpt(std::shared_ptr< DAGNode > param)
Create a regex option node.
std::shared_ptr< DAGNode > mkRegLoop(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r, std::shared_ptr< DAGNode > s)
Create a regex loop node.
std::shared_ptr< DAGNode > mkMax(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a max node.
std::shared_ptr< DAGNode > mkRegUnion(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a regex union node.
std::shared_ptr< DAGNode > mkRegDiff(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a regex difference node.
std::shared_ptr< Sort > mkArraySort(std::shared_ptr< Sort > index, std::shared_ptr< Sort > elem)
Create an array sort.
std::shared_ptr< DAGNode > mkDistinct(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a distinct node.
std::shared_ptr< DAGNode > mkFpDiv(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a floating-point division node.
std::shared_ptr< DAGNode > mkAcsch(std::shared_ptr< DAGNode > param)
Create an acsch node.
std::shared_ptr< Sort > placeholder_var_sort
std::shared_ptr< DAGNode > mkFpSqrt(std::shared_ptr< DAGNode > rm, std::shared_ptr< DAGNode > param)
Create a floating-point square root node.
Integer toInt(std::shared_ptr< DAGNode > expr)
Convert an expression to an integer.
std::unordered_map< std::string, std::shared_ptr< DAGNode > > preserving_let_key_map
std::shared_ptr< DAGNode > mkIsEven(std::shared_ptr< DAGNode > param)
Create a is_even node.
std::shared_ptr< DAGNode > mkTrue()
Create a true node.
std::shared_ptr< DAGNode > mkAsin(std::shared_ptr< DAGNode > param)
Create an asin node.
std::shared_ptr< DAGNode > mkAcosh(std::shared_ptr< DAGNode > param)
Create an acosh node.
std::shared_ptr< DAGNode > mkVarStr(const std::string &name)
Create a string variable.
std::shared_ptr< DAGNode > mkStrCharat(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a string char-at node.
std::string toString(std::shared_ptr< DAGNode > expr)
Print an expression.
std::shared_ptr< DAGNode > mkBvToNat(std::shared_ptr< DAGNode > param)
Create a bitvector to natural number conversion node.
std::shared_ptr< DAGNode > mkRegRepeat(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a regex repeat node.
std::shared_ptr< DAGNode > mkSub(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create an sub node.
std::shared_ptr< DAGNode > mkBvNot(std::shared_ptr< DAGNode > param)
Create a bitvector not node.
std::shared_ptr< Sort > mkNatSort()
Create a natural sort.
std::shared_ptr< DAGNode > mkRegConcat(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a regex concatenation node.
std::unordered_map< std::string, size_t > var_names
std::shared_ptr< DAGNode > mkFpIsZero(std::shared_ptr< DAGNode > param)
Create a floating-point is-zero check node.
std::shared_ptr< DAGNode > mkInfinity(std::shared_ptr< Sort > sort)
Create a infinity node.
std::shared_ptr< DAGNode > mkStrSubstr(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r, std::shared_ptr< DAGNode > s)
Create a string substring node.
std::shared_ptr< DAGNode > mkConstBv(const std::string &v, const size_t &width)
Create a bit-vector constant.
std::unordered_map< std::string, std::shared_ptr< Sort > > sort_key_map
std::shared_ptr< DAGNode > mkFpRem(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a floating-point remainder node.
std::shared_ptr< DAGNode > mkBvRotateLeft(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector rotate left node.
std::shared_ptr< DAGNode > mkPosInfinity(std::shared_ptr< Sort > sort=nullptr)
Create a positive infinity node.
std::shared_ptr< DAGNode > mkBvToInt(std::shared_ptr< DAGNode > param)
Create a bitvector to integer conversion node.
std::shared_ptr< DAGNode > mkBvNeg(std::shared_ptr< DAGNode > param)
Create a bitvector negation node.
std::shared_ptr< Sort > mkStrSort()
Create a string sort.
std::shared_ptr< DAGNode > mkStrReplace(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r, std::shared_ptr< DAGNode > v)
Create a string replace node.
std::shared_ptr< DAGNode > mkIndexofReg(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a string index-of-regex node.
std::shared_ptr< DAGNode > mkConstReal(const std::string &v)
Create a real constant from string.
std::shared_ptr< Sort > mkSortDec(const std::string &name, const size_t &arity)
Create a sort declaration.
std::shared_ptr< DAGNode > mkRegComplement(std::shared_ptr< DAGNode > param)
Create a regex complement node.
std::shared_ptr< DAGNode > mkDivReal(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create an div node.
std::shared_ptr< DAGNode > mkToFp(std::shared_ptr< DAGNode > eb, std::shared_ptr< DAGNode > sb, std::shared_ptr< DAGNode > rm, std::shared_ptr< DAGNode > param)
Create a value to floating-point conversion node.
std::shared_ptr< DAGNode > mkFpMin(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a floating-point minimum node.
std::shared_ptr< DAGNode > mkConstReg(const std::string &v)
Create a regular expression constant.
std::shared_ptr< DAGNode > mkStrSplit(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a string split node.
std::shared_ptr< DAGNode > mkFuncDec(const std::string &name, const std::vector< std::shared_ptr< Sort > > ¶ms, std::shared_ptr< Sort > out_sort)
Create a function declaration.
std::shared_ptr< DAGNode > mkFpConst(std::shared_ptr< DAGNode > sign, std::shared_ptr< DAGNode > exp, std::shared_ptr< DAGNode > mant)
std::shared_ptr< DAGNode > mkCosh(std::shared_ptr< DAGNode > param)
Create a cosh node.
std::shared_ptr< DAGNode > mkFpMax(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a floating-point maximum node.
std::shared_ptr< DAGNode > mkVarBv(const std::string &name, const size_t &width)
Create a bit-vector variable.
std::shared_ptr< DAGNode > mkErr(const ERROR_TYPE t)
std::shared_ptr< DAGNode > mkUnknown()
Create an unknown node.
std::shared_ptr< DAGNode > mkFpLt(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a floating-point less than node.
std::shared_ptr< DAGNode > mkStrGt(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a string greater-than node.
std::shared_ptr< DAGNode > mkToReal(std::shared_ptr< DAGNode > param)
Create a to_real node.
std::shared_ptr< DAGNode > mkOr(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create an or node.
std::shared_ptr< DAGNode > mkBvRepeat(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector repeat node.
std::shared_ptr< DAGNode > mkLetBindVar(const std::string &name, const std::shared_ptr< DAGNode > &expr)
std::shared_ptr< DAGNode > mkIsPrime(std::shared_ptr< DAGNode > param)
Create a is_prime node.
std::shared_ptr< DAGNode > mkBvShl(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector shift left node.
std::shared_ptr< DAGNode > mkAcos(std::shared_ptr< DAGNode > param)
Create an acos node.
std::shared_ptr< DAGNode > mkSafeSqrt(std::shared_ptr< DAGNode > param)
Create an safeSqrt node.
std::shared_ptr< DAGNode > mkStrToUpper(std::shared_ptr< DAGNode > param)
Create a string to-upper node.
std::shared_ptr< DAGNode > mkBvUle(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector unsigned less than or equal node.
std::shared_ptr< DAGNode > mkLetBindVarList(const std::vector< std::shared_ptr< DAGNode > > &bind_vars)
std::shared_ptr< DAGNode > mkStrToInt(std::shared_ptr< DAGNode > param)
Create a string to-integer conversion node.
std::shared_ptr< DAGNode > mkBvConcat(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a bitvector concatenation node.
std::shared_ptr< DAGNode > mkConstInt(const std::string &v)
Create an integer constant from string.
std::shared_ptr< DAGNode > mkOper(const std::shared_ptr< Sort > &sort, const NODE_KIND &t, std::shared_ptr< DAGNode > p)
Create an operation.
std::shared_ptr< DAGNode > mkIsDivisible(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a is_divisible node.
bool isZero(std::shared_ptr< DAGNode > expr)
Check if an expression is zero.
std::shared_ptr< DAGNode > mkBvComp(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a bitvector comparison node.
std::shared_ptr< DAGNode > mkLetChain(const std::vector< std::shared_ptr< DAGNode > > &bind_var_lists, const std::shared_ptr< DAGNode > &body)
std::shared_ptr< DAGNode > mkStrNumSplits(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
std::shared_ptr< DAGNode > mkStrFromCode(std::shared_ptr< DAGNode > param)
Create a string from-code conversion node.
std::shared_ptr< DAGNode > mkFuncDef(const std::string &name, const std::vector< std::shared_ptr< DAGNode > > ¶ms, std::shared_ptr< Sort > out_sort, std::shared_ptr< DAGNode > body)
Create a function definition.
std::shared_ptr< DAGNode > mkBvUrem(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector unsigned remainder node.
std::shared_ptr< DAGNode > mkFpToReal(std::shared_ptr< DAGNode > param)
Create a floating-point to real conversion node.
std::shared_ptr< DAGNode > mkSqrt(std::shared_ptr< DAGNode > param)
Create an sqrt node.
std::shared_ptr< DAGNode > mkDiv(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create an div node.
std::shared_ptr< DAGNode > mkStrIndexof(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r, std::shared_ptr< DAGNode > s)
Create a string index-of node.
std::shared_ptr< DAGNode > mkE()
Create a e node.
std::shared_ptr< DAGNode > mkFpToUbv(std::shared_ptr< DAGNode > rm, std::shared_ptr< DAGNode > param, std::shared_ptr< DAGNode > size)
Create a floating-point to unsigned bitvector conversion node.
std::shared_ptr< DAGNode > mkCos(std::shared_ptr< DAGNode > param)
Create an cos node.
std::shared_ptr< DAGNode > mkFpAdd(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a floating-point addition node.
std::shared_ptr< DAGNode > mkRegAllChar()
Create a regex allchar node.
std::shared_ptr< DAGNode > mkRootObj(std::shared_ptr< DAGNode > expr, int index)
std::shared_ptr< DAGNode > rewrite_oper(NODE_KIND &t, std::vector< std::shared_ptr< DAGNode > > &p)
Core operation rewrite helper used before node-manager creation.
std::shared_ptr< DAGNode > mkGcd(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a gcd node.
std::shared_ptr< DAGNode > mkToFpUnsigned(std::shared_ptr< DAGNode > eb, std::shared_ptr< DAGNode > sb, std::shared_ptr< DAGNode > rm, std::shared_ptr< DAGNode > param)
std::shared_ptr< DAGNode > mkRootOfWithInterval(const std::vector< std::shared_ptr< DAGNode > > &coeffs, std::shared_ptr< DAGNode > lower_bound, std::shared_ptr< DAGNode > upper_bound)
std::shared_ptr< Sort > mkBVSort(const size_t &width)
Create a bit-vector sort.
std::shared_ptr< DAGNode > mkStrIsDigit(std::shared_ptr< DAGNode > param)
Create a string is-digit check node.
std::shared_ptr< DAGNode > mkGe(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a ge node.
std::shared_ptr< DAGNode > mkBvSignExt(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector sign extension node.
std::shared_ptr< DAGNode > mkFpGe(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a floating-point greater than or equal node.
std::shared_ptr< DAGNode > mkTempVar(const std::shared_ptr< Sort > &sort)
Create a temporary variable.
std::shared_ptr< DAGNode > mkPi()
Create a pi node.
std::shared_ptr< DAGNode > mkFact(std::shared_ptr< DAGNode > param)
Create a factorial node.
std::shared_ptr< DAGNode > mkFpIsPos(std::shared_ptr< DAGNode > param)
Create a floating-point is-positive check node.
std::shared_ptr< DAGNode > mkDivInt(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create an div node.
std::shared_ptr< Sort > mkRegSort()
Create a regular expression sort.
std::shared_ptr< DAGNode > mkArray(const std::string &name, std::shared_ptr< Sort > index, std::shared_ptr< Sort > elem)
Create an array.
std::shared_ptr< DAGNode > mkBvUmod(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector unsigned modulo node.
Real toReal(std::shared_ptr< DAGNode > expr)
Convert an expression to a real.
std::shared_ptr< Sort > mkIntSort()
Create an integer sort.
std::shared_ptr< DAGNode > mkFpNeg(std::shared_ptr< DAGNode > param)
Create a floating-point negation node.
std::shared_ptr< DAGNode > mkRegStar(std::shared_ptr< DAGNode > param)
Create a regex star node.
std::shared_ptr< DAGNode > mkStrSplitRestRe(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r, std::shared_ptr< DAGNode > s)
std::shared_ptr< DAGNode > mkStrUpdate(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r, std::shared_ptr< DAGNode > v)
Create a string update node.
std::shared_ptr< DAGNode > mkBvUdiv(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector unsigned division node.
std::shared_ptr< DAGNode > mkRegPlus(std::shared_ptr< DAGNode > param)
Create a regex plus node.
std::shared_ptr< DAGNode > mkVarFp(const std::string &name, const size_t &e, const size_t &s)
Create a floating-point variable.
std::shared_ptr< DAGNode > mkStrConcat(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a string concatenation node.
std::shared_ptr< DAGNode > mkEq(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create an equality node.
std::shared_ptr< DAGNode > mkBvSlt(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector signed less than node.
std::shared_ptr< DAGNode > mkSinh(std::shared_ptr< DAGNode > param)
Create a sinh node.
std::shared_ptr< DAGNode > mkSech(std::shared_ptr< DAGNode > param)
Create a sech node.
std::shared_ptr< DAGNode > mkBvRotateRight(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector rotate right node.
std::shared_ptr< DAGNode > mkBvOr(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a bitvector or node.
std::shared_ptr< DAGNode > mkBvMul(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a bitvector multiplication node.
std::shared_ptr< DAGNode > mkLn(std::shared_ptr< DAGNode > param)
Create an ln node.
void err_type_mis(const std::string nm, const size_t ln) const
std::shared_ptr< DAGNode > mkFpIsInf(std::shared_ptr< DAGNode > param)
Create a floating-point is-infinity check node.
std::shared_ptr< DAGNode > mkPow2(std::shared_ptr< DAGNode > param)
Create an pow2 node.
std::shared_ptr< DAGNode > mkConstFP(const std::string &fp_expr)
Create a floating-point constant from expression.
std::shared_ptr< DAGNode > mkFpAbs(std::shared_ptr< DAGNode > param)
Create a floating-point absolute value node.
std::shared_ptr< DAGNode > mkBvExtract(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r, std::shared_ptr< DAGNode > s)
Create a bitvector extract node.
std::shared_ptr< DAGNode > mkFpIsNeg(std::shared_ptr< DAGNode > param)
Create a floating-point is-negative check node.
std::shared_ptr< DAGNode > mkBvAshr(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector arithmetic shift right node.
std::shared_ptr< DAGNode > mkVarReg(const std::string &name)
Create a regular expression variable.
std::shared_ptr< DAGNode > mkBvAnd(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a bitvector and node.
std::shared_ptr< DAGNode > mkBvNor(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector nor node.
std::shared_ptr< DAGNode > mkAcoth(std::shared_ptr< DAGNode > param)
Create an acoth node.
std::shared_ptr< DAGNode > mkRegNone()
Create a regex none node.
std::shared_ptr< DAGNode > mkAtan(std::shared_ptr< DAGNode > param)
Create an atan node.
std::shared_ptr< DAGNode > mkStrLen(std::shared_ptr< DAGNode > param)
Create a string length node.
std::shared_ptr< DAGNode > mkStrLe(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a string less-than-or-equal node.
std::shared_ptr< DAGNode > mkRound(std::shared_ptr< DAGNode > param)
Create an round node.
std::shared_ptr< DAGNode > mkIte(std::shared_ptr< DAGNode > cond, std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create an ite node.
std::shared_ptr< DAGNode > mkStrToLower(std::shared_ptr< DAGNode > param)
Create a string to-lower node.
std::shared_ptr< DAGNode > mkAtanh(std::shared_ptr< DAGNode > param)
Create an atanh node.
std::shared_ptr< DAGNode > mkBvNand(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector nand node.
std::shared_ptr< DAGNode > mkPosEpsilon()
Create a positive epsilon node.
std::unordered_map< std::string, size_t > placeholder_var_names
std::shared_ptr< DAGNode > mkCoth(std::shared_ptr< DAGNode > param)
Create a coth node.
std::shared_ptr< DAGNode > mkFunParamVar(std::shared_ptr< Sort > sort, const std::string &name)
Create a function parameter variable.
std::shared_ptr< DAGNode > mkToInt(std::shared_ptr< DAGNode > param)
Create a to_int node.
std::shared_ptr< DAGNode > mkStrFromInt(std::shared_ptr< DAGNode > param)
Create a string from-integer conversion node.
std::shared_ptr< DAGNode > mkNaN(std::shared_ptr< Sort > sort=nullptr)
Create a NaN node.
std::shared_ptr< DAGNode > mkAsech(std::shared_ptr< DAGNode > param)
Create an asech node.
std::shared_ptr< DAGNode > mkAdd(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create an add node.
std::shared_ptr< Sort > mkBoolSort()
Create a boolean sort.
std::shared_ptr< DAGNode > mkBvSle(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector signed less than or equal node.
std::shared_ptr< DAGNode > mkPow(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create an pow node.
std::shared_ptr< DAGNode > mkBvSge(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector signed greater than or equal node.
std::shared_ptr< DAGNode > mkStrIndexofReg(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a string indexof-regex node.
std::shared_ptr< DAGNode > mkFpFma(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a floating-point fused multiply-add node.
std::shared_ptr< DAGNode > mkStrReplaceAll(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r, std::shared_ptr< DAGNode > v)
Create a string replace-all node.
std::shared_ptr< DAGNode > mkLg(std::shared_ptr< DAGNode > param)
Create an lg/log10 node.
std::shared_ptr< DAGNode > mkBvUge(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector unsigned greater than or equal node.
std::shared_ptr< DAGNode > mkBvXor(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a bitvector xor node.
std::shared_ptr< DAGNode > mkNatToBv(std::shared_ptr< DAGNode > param, std::shared_ptr< DAGNode > width)
Create a natural number to bitvector conversion node.
std::shared_ptr< DAGNode > mkStrNumSplitsRe(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
std::shared_ptr< DAGNode > mkFpIsNormal(std::shared_ptr< DAGNode > param)
Create a floating-point is-normal check node.
std::shared_ptr< DAGNode > mkVar(const std::shared_ptr< Sort > &sort, const std::string &name)
Create a variable.
std::shared_ptr< DAGNode > mkLt(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a lt node.
std::shared_ptr< DAGNode > mkFpLe(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a floating-point less than or equal node.
std::shared_ptr< DAGNode > mkFpIsNaN(std::shared_ptr< DAGNode > param)
Create a floating-point is-NaN check node.
std::shared_ptr< DAGNode > mkIand(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create an iand node.
std::shared_ptr< DAGNode > mkRegRange(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a regex range node.
std::shared_ptr< DAGNode > mkBvSgt(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector signed greater than node.
std::shared_ptr< DAGNode > mkFpMul(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a floating-point multiplication node.
std::shared_ptr< DAGNode > mkReplaceReg(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r, std::shared_ptr< DAGNode > v)
Create a string replace-regex node.
std::shared_ptr< DAGNode > mkLog(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create an log node.
std::shared_ptr< DAGNode > mkStrGe(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a string greater-than-or-equal node.
std::shared_ptr< DAGNode > mkStrSplitAtRe(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r, std::shared_ptr< DAGNode > s)
std::unique_ptr< NodeManager > node_manager
std::shared_ptr< DAGNode > mkStrSuffixof(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a string suffix check node.
std::shared_ptr< DAGNode > mkAtan2(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create an atan2 node.
std::shared_ptr< DAGNode > mkVarReal(const std::string &name)
Create a real variable.
std::shared_ptr< DAGNode > mkStrToCode(std::shared_ptr< DAGNode > param)
Create a string to-code conversion node.
int getArity(NODE_KIND k) const
Get the arity of a node kind.
std::shared_ptr< DAGNode > mkConstStr(const std::string &v)
Create a string constant.
static bool isCommutative(NODE_KIND t)
Check whether an operation kind is treated as commutative.
std::unique_ptr< SortManager > sort_manager
std::shared_ptr< DAGNode > mkPlaceholderVar(const std::string &name)
std::shared_ptr< DAGNode > mkRoundingMode(const std::string &mode)
Create a rounding mode constant.
std::shared_ptr< DAGNode > mkConstFp(const std::string &v, const size_t &e, const size_t &s)
Create a floating-point constant.
std::shared_ptr< DAGNode > mkStrReplaceRegAll(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r, std::shared_ptr< DAGNode > v)
Create a string replace-regex-all node.
std::shared_ptr< DAGNode > mkImplies(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create an implies node.
std::shared_ptr< DAGNode > mkStrRev(std::shared_ptr< DAGNode > param)
Create a string reverse node.
std::shared_ptr< DAGNode > mkCsc(std::shared_ptr< DAGNode > param)
Create an csc node.
std::shared_ptr< DAGNode > mkBvUgt(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector unsigned greater than node.
std::shared_ptr< Sort > getSort(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Get sort.
std::shared_ptr< DAGNode > mkFpGt(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a floating-point greater than node.
std::unordered_map< std::string, std::shared_ptr< DAGNode > > fun_key_map
std::shared_ptr< DAGNode > mkFpSub(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a floating-point subtraction node.
std::shared_ptr< DAGNode > mkFloor(std::shared_ptr< DAGNode > param)
Create an floor node.
std::shared_ptr< DAGNode > mkAbs(std::shared_ptr< DAGNode > param)
Create an abs node.
std::shared_ptr< DAGNode > declareVar(const std::string &name, const std::string &sort)
Declare a variable.
std::shared_ptr< DAGNode > mkNeg(std::shared_ptr< DAGNode > param)
Create an neg node.
std::shared_ptr< DAGNode > mkExp(std::shared_ptr< DAGNode > param)
Create an exp node.
std::shared_ptr< Sort > mkRoundingModeSort()
Create a rounding mode sort.
std::shared_ptr< DAGNode > mkMin(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a min node.
std::shared_ptr< DAGNode > mkBvLshr(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector logical shift right node.
std::shared_ptr< DAGNode > mkStrSplitRest(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r, std::shared_ptr< DAGNode > s)
std::shared_ptr< DAGNode > mkFuncRec(const std::string &name, const std::vector< std::shared_ptr< DAGNode > > ¶ms, std::shared_ptr< Sort > out_sort, std::shared_ptr< DAGNode > body)
Create a recursive function definition.
std::shared_ptr< DAGNode > mkAcot(std::shared_ptr< DAGNode > param)
Create an acot node.
std::shared_ptr< DAGNode > mkMod(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create an mod node.
static const std::shared_ptr< Sort > INTOREAL_SORT
static const std::shared_ptr< Sort > ROUNDING_MODE_SORT
static const std::shared_ptr< Sort > STR_SORT
static const std::shared_ptr< Sort > INT_SORT
static const std::shared_ptr< Sort > REG_SORT
static const std::shared_ptr< Sort > BOOL_SORT
static const std::shared_ptr< Sort > REAL_SORT
static const std::shared_ptr< Sort > NAT_SORT
static bool isReal(const std::string &str)
bool isRegParam(std::shared_ptr< DAGNode > param)
bool isArrayParam(std::shared_ptr< DAGNode > param)
std::string kindToString(const NODE_KIND &nk)
HighPrecisionInteger Integer
bool isRealParam(std::shared_ptr< DAGNode > param)
bool isStrParam(std::shared_ptr< DAGNode > param)
bool isBoolParam(std::shared_ptr< DAGNode > param)
bool isIntParam(std::shared_ptr< DAGNode > param)
bool canExempt(std::shared_ptr< Sort > l, std::shared_ptr< Sort > r)
bool isBvParam(std::shared_ptr< DAGNode > param)
@ NT_FP_ROUND_TO_INTEGRAL
@ NT_ROOT_OF_WITH_INTERVAL
bool isFpParam(std::shared_ptr< DAGNode > param)