534 if ((l->isCReal() || l->isCInt()) && (r->isCReal() || r->isCInt())) {
545 if (l->isCInt() && r->isCInt())
552 if ((l->isCInt() || l->isCReal()) && (r->isCInt() || r->isCReal())) {
564 if ((l->isCInt() || l->isCReal()) && r->isCReal()) {
571 if (l->isCInt() && r->isCInt())
579 if (l->isCInt() && r->isCInt())
587 if (l->isCInt() && r->isCInt())
595 if (l->isCBV() && r->isCBV())
598 return mkConstBv(
"#b" + std::string(l->getSort()->getBitWidth(),
'1'), l->getSort()->getBitWidth());
604 if (l->isCBV() && r->isCBV())
614 if (l->isCBV() && r->isCBV())
618 else if (
isOne(r) || l == r)
623 if (l->isCBV() && r->isCBV())
625 else if (
isOne(r) || l == r)
633 if (l->isCBV() && r->isCBV())
637 else if (
isOne(r) || l == r)
649 if (l->isCBV() && r->isCBV())
658 if (l->isCBV() && r->isCBV())
667 if (l->isCBV() && r->isCBV())
674 if (l->isCBV() && r->isCBV())
685 if (l->isCBV() && r->isCBV())
692 if (l->isCBV() && r->isCBV())
703 if (l->isCBV() && r->isCBV())
730 if (l->isCInt() && r->isCInt())
735 if (l->isCInt() && r->isCInt())
746 if (l->isCStr() && r->isCStr())
751 if (l->isCStr() && r->isCStr())
756 if (l->isCStr() && r->isCInt())
767 if (l->isCStr() && r->isCStr())
774 if (l->isCBV() && r->isCInt())
781 if (l->isCBV() && r->isCInt())
785 else if (l->isBVZeroExt() && l->getChild(1)->isCInt()) {
793 if (l->isCBV() && r->isCInt())
797 else if (l->isBVSignExt() && l->getChild(1)->isCInt()) {
805 if (l->isCBV() && r->isCInt())
807 else if (r->isCInt() &&
toInt(r).toULong() % l->getSort()->getBitWidth() == 0)
809 else if (l->isBVRotLeft() && r->isCInt()) {
812 total_rotate = total_rotate % bitwidth;
817 else if (l->isBVRotRight() && r->isCInt()) {
819 return l->getChild(0);
824 total_rotate = total_rotate % bitwidth;
832 total_rotate = total_rotate % bitwidth;
842 if (l->isCBV() && r->isCInt())
844 else if (r->isCInt() &&
toInt(r).toULong() % l->getSort()->getBitWidth() == 0)
846 else if (l->isBVRotRight() && r->isCInt()) {
849 total_rotate = total_rotate % bitwidth;
854 else if (l->isBVRotLeft() && r->isCInt()) {
856 return l->getChild(0);
861 total_rotate = total_rotate % bitwidth;
869 total_rotate = total_rotate % bitwidth;
882 if (l->isCBV() && r->isCBV())
889 if (l->isCBV() && r->isCBV())
902 if (l->isCBV() && r->isCBV())
915 if (l->isCBV() && r->isCBV())
1023 std::vector<std::shared_ptr<DAGNode>> np{p.front()};
1024 np.reserve(p.size());
1025 size_t suf_count = (np.front()->isCInt() || np.front()->isCReal());
1026 std::shared_ptr<DAGNode> last_const = suf_count ? np.front() :
nullptr;
1027 for (
size_t i = 1, isz = p.size(); i < isz; ++i) {
1028 if (p.at(i) == np.back())
1030 else if (p.at(i)->isCInt() || p.at(i)->isCReal()) {
1031 if (last_const !=
nullptr) {
1032 if (p.at(i)->isCInt() && last_const->isCInt()) {
1033 auto lvalue =
toInt(last_const), rvalue =
toInt(p.at(i));
1034 if (lvalue > rvalue)
1036 else if (last_const == np.back() && lvalue == rvalue)
1040 auto lvalue =
toReal(last_const), rvalue =
toReal(p.at(i));
1041 if (lvalue > rvalue)
1043 else if (last_const == np.back() && lvalue == rvalue)
1048 last_const = p.at(i);
1053 if (suf_count > 2) {
1057 np.emplace_back(p.at(i));
1060 size_t lidx = 0, ridx = np.size() - 1;
1061 if (np.front()->isConst())
1062 while (lidx + 1 < np.size()) {
1063 if (!np.at(lidx + 1)->isConst())
1067 if (np.back()->isConst())
1069 if (!np.at(ridx - 1)->isConst())
1075 np = std::vector<std::shared_ptr<DAGNode>>(np.begin() + lidx, np.begin() + ridx + 1);
1079 else if (np.front()->isConst() && np.back()->isConst()) {
1090 std::vector<std::shared_ptr<DAGNode>> np{p.front()};
1091 np.reserve(p.size());
1092 size_t suf_count = (np.front()->isCInt() || np.front()->isCReal());
1093 std::shared_ptr<DAGNode> last_const = suf_count ? np.front() :
nullptr;
1094 for (
size_t i = 1, isz = p.size(); i < isz; ++i) {
1095 if (p.at(i) == np.back())
1097 else if (p.at(i)->isCInt() || p.at(i)->isCReal()) {
1098 if (last_const !=
nullptr) {
1099 if (p.at(i)->isCInt() && last_const->isCInt()) {
1100 auto lvalue =
toInt(last_const), rvalue =
toInt(p.at(i));
1101 if (lvalue >= rvalue)
1105 auto lvalue =
toReal(last_const), rvalue =
toReal(p.at(i));
1106 if (lvalue >= rvalue)
1111 last_const = p.at(i);
1116 if (suf_count > 2) {
1120 np.emplace_back(p.at(i));
1122 size_t lidx = 0, ridx = np.size() - 1;
1123 if (np.front()->isConst())
1124 while (lidx + 1 < np.size()) {
1125 if (!np.at(lidx + 1)->isConst())
1129 if (np.back()->isConst())
1131 if (!np.at(ridx - 1)->isConst())
1137 np = std::vector<std::shared_ptr<DAGNode>>(np.begin() + lidx, np.begin() + ridx + 1);
1148 std::reverse(p.begin(), p.end());
1152 std::reverse(p.begin(), p.end());
1157 std::sort(p.begin(), p.end(), [](
const std::shared_ptr<DAGNode> &a,
const std::shared_ptr<DAGNode> &b) {
1158 if (a->isConst() && !b->isConst())
1160 else if (!a->isConst() && b->isConst())
1165 p.erase(std::unique(p.begin(), p.end()), p.end());
1166 while (p.size() >= 2 && p.rbegin()[0]->isConst() && p.rbegin()[1]->isConst()) {
1167 if (p.rbegin()[0]->isCInt() && p.rbegin()[1]->isCInt())
1169 else if (p.rbegin()[0]->isNumeral() && p.rbegin()[1]->isNumeral()) {
1174 else if (p.rbegin()[0]->getName() ==
"(fp_bit_representation)" || p.rbegin()[1]->getName() ==
"(fp_bit_representation)") {
1184 if (p.front()->isCInt() || p.front()->isCReal()) {
1185 std::vector<std::shared_ptr<DAGNode>> np;
1186 np.reserve(p.size());
1187 std::shared_ptr<DAGNode> last_const = p.front();
1188 for (
size_t i = 1, isz = p.size(); i < isz; ++i) {
1189 if (p.at(i)->isCInt() || p.at(i)->isCReal()) {
1190 if (last_const->isCInt() && p.at(i)->isCInt())
1195 echo_error(
"unexpected divide int rewrite !!!");
1198 for (
size_t j = i; j < isz; ++j)
1199 np.emplace_back(p.at(j));
1205 np.insert(np.begin(), last_const);
1213 std::vector<std::shared_ptr<DAGNode>> np{p.front()};
1214 np.reserve(p.size());
1215 size_t suf_count = np.front()->isCStr();
1216 std::shared_ptr<DAGNode> last_const = suf_count ? np.front() :
nullptr;
1217 for (
size_t i = 1, isz = p.size(); i < isz; ++i) {
1218 if (p.at(i) == np.back())
1220 else if (p.at(i)->isCStr()) {
1221 if (last_const !=
nullptr) {
1222 auto lvalue = last_const->toString(), rvalue = p.at(i)->toString();
1223 if (lvalue >= rvalue)
1227 last_const = p.at(i);
1232 if (suf_count > 2) {
1236 np.emplace_back(p.at(i));
1238 size_t lidx = 0, ridx = np.size() - 1;
1239 if (np.front()->isConst())
1240 while (lidx + 1 < np.size()) {
1241 if (!np.at(lidx + 1)->isConst())
1245 if (np.back()->isConst())
1247 if (!np.at(ridx - 1)->isConst())
1253 np = std::vector<std::shared_ptr<DAGNode>>(np.begin() + lidx, np.begin() + ridx + 1);
1261 std::vector<std::shared_ptr<DAGNode>> np{p.front()};
1262 np.reserve(p.size());
1263 size_t suf_count = np.front()->isCStr();
1264 std::shared_ptr<DAGNode> last_const = suf_count ? np.front() :
nullptr;
1265 for (
size_t i = 1, isz = p.size(); i < isz; ++i) {
1266 if (p.at(i) == np.back())
1268 else if (p.at(i)->isCStr()) {
1269 if (last_const !=
nullptr) {
1270 auto lvalue = last_const->toString(), rvalue = p.at(i)->toString();
1271 if (lvalue > rvalue)
1273 else if (last_const == np.back() && lvalue == rvalue)
1277 last_const = p.at(i);
1282 if (suf_count > 2) {
1286 np.emplace_back(p.at(i));
1289 size_t lidx = 0, ridx = np.size() - 1;
1290 if (np.front()->isConst())
1291 while (lidx + 1 < np.size()) {
1292 if (!np.at(lidx + 1)->isConst())
1296 if (np.back()->isConst())
1298 if (!np.at(ridx - 1)->isConst())
1304 np = std::vector<std::shared_ptr<DAGNode>>(np.begin() + lidx, np.begin() + ridx + 1);
1308 else if (np.front()->isConst() && np.back()->isConst()) {
1309 if (np.front()->toString() == np.back()->toString()) {
1320 std::reverse(p.begin(), p.end());
1324 std::reverse(p.begin(), p.end());
1329 std::sort(p.begin(), p.end());
1330 for (
size_t i = 1, isz = p.size(); i < isz; ++i) {
1331 if (p.at(i) == p.at(i - 1))
1336 std::sort(p.begin(), p.end());
1337 std::vector<std::shared_ptr<DAGNode>> np;
1338 np.reserve(p.size());
1339 for (
const auto &pc : p) {
1342 else if (pc->isTrue())
1344 else if (!np.empty() && pc == np.back())
1347 np.emplace_back(pc);
1351 else if (np.size() == 1)
1357 std::sort(p.begin(), p.end());
1358 std::vector<std::shared_ptr<DAGNode>> np;
1359 np.reserve(p.size());
1360 for (
const auto &pc : p) {
1363 else if (pc->isFalse())
1365 else if (!np.empty() && pc == np.back())
1368 np.emplace_back(pc);
1372 else if (np.size() == 1)
1378 if (p.back()->isTrue())
1380 std::vector<std::shared_ptr<DAGNode>> np;
1381 np.reserve(p.size());
1382 for (
size_t i = 0, isz = p.size() - 1; i < isz; ++i) {
1383 if (p.at(i)->isFalse())
1385 else if (p.at(i)->isTrue())
1387 else if (!np.empty() && p.at(i) == np.back())
1389 else if (p.at(i) == p.back())
1392 np.emplace_back(p.at(i));
1394 np.emplace_back(p.back());
1401 std::sort(p.begin(), p.end());
1402 std::vector<std::shared_ptr<DAGNode>> np;
1403 np.reserve(p.size());
1404 for (
const auto &pc : p) {
1407 else if (!np.empty() && pc == np.back())
1410 np.emplace_back(pc);
1414 else if (np.size() == 1)
1420 std::shared_ptr<DAGNode> cst =
nullptr;
1421 std::vector<std::shared_ptr<DAGNode>> np;
1422 np.reserve(p.size());
1423 for (
const auto &pc : p) {
1430 else if (pc->isCReal()) {
1437 np.emplace_back(pc);
1440 if (cst !=
nullptr) {
1442 np.emplace_back(cst);
1446 else if (np.size() == 1)
1452 std::shared_ptr<DAGNode> cst =
nullptr;
1453 std::vector<std::shared_ptr<DAGNode>> np;
1454 np.reserve(p.size());
1455 for (
const auto &pc : p) {
1462 else if (pc->isCReal()) {
1469 np.emplace_back(pc);
1472 if (cst !=
nullptr) {
1475 else if (!
isOne(cst))
1476 np.emplace_back(cst);
1480 else if (np.empty())
1486 std::shared_ptr<DAGNode> cst =
nullptr;
1487 std::vector<std::shared_ptr<DAGNode>> np;
1488 np.reserve(p.size());
1489 for (
const auto &pc : p) {
1497 np.emplace_back(pc);
1500 if (cst !=
nullptr) {
1504 np.emplace_back(cst);
1512 std::vector<std::shared_ptr<DAGNode>> np{p.front()};
1513 np.reserve(p.size());
1514 for (
size_t i = 1, isz = p.size(); i < isz; ++i) {
1515 const auto &pc = p.at(i);
1516 if (pc == np.back()) {
1518 if (pc->getSort()->isInt())
1523 else if (pc->isNumeral() && np.back()->isNumeral()) {
1524 if (pc->isCInt() && np.back()->isCInt())
1530 for (
size_t j = i; j < isz; ++j)
1531 np.emplace_back(p.at(j));
1542 std::sort(p.begin(), p.end());
1543 std::vector<std::shared_ptr<DAGNode>> np;
1544 np.reserve(p.size());
1545 std::shared_ptr<DAGNode> cst =
nullptr;
1546 for (
const auto &pc : p) {
1553 else if (!np.empty() && pc == np.back())
1556 np.emplace_back(pc);
1559 if (cst !=
nullptr) {
1563 np.emplace_back(cst);
1568 else if (np.size() == 1)
1574 std::sort(p.begin(), p.end());
1575 std::vector<std::shared_ptr<DAGNode>> np;
1576 np.reserve(p.size());
1577 std::shared_ptr<DAGNode> cst =
nullptr;
1578 for (
const auto &pc : p) {
1585 else if (!np.empty() && pc == np.back())
1588 np.emplace_back(pc);
1591 if (cst !=
nullptr) {
1595 np.emplace_back(cst);
1600 else if (np.size() == 1)
1606 std::sort(p.begin(), p.end());
1607 std::vector<std::shared_ptr<DAGNode>> np;
1608 np.reserve(p.size());
1609 std::shared_ptr<DAGNode> cst =
nullptr;
1610 for (
const auto &pc : p) {
1617 else if (!np.empty() && pc == np.back())
1620 np.emplace_back(pc);
1623 if (cst !=
nullptr) {
1625 np.emplace_back(cst);
1630 else if (np.size() == 1)
1637 std::sort(p.begin(), p.end());
1638 p.erase(std::unique(p.begin(), p.end()), p.end());
1639 bool has_const =
false;
1640 for (
const auto &pc : p) {
1653 std::shared_ptr<DAGNode> cst =
nullptr;
1654 std::vector<std::shared_ptr<DAGNode>> np;
1655 np.reserve(p.size());
1656 for (
const auto &pc : p) {
1664 np.emplace_back(pc);
1667 if (cst !=
nullptr) {
1669 np.emplace_back(cst);
1673 else if (np.size() == 1)
1679 std::shared_ptr<DAGNode> cst =
nullptr;
1680 std::vector<std::shared_ptr<DAGNode>> np;
1681 np.reserve(p.size());
1682 for (
const auto &pc : p) {
1690 np.emplace_back(pc);
1693 if (cst !=
nullptr) {
1696 else if (!
isOne(cst))
1697 np.emplace_back(cst);
1701 else if (np.empty())
1714 std::vector<std::shared_ptr<DAGNode>> np{p.front()};
1715 for (
size_t i = 1, isz = p.size(); i < isz; ++i) {
1716 if (p.at(i)->isCBV() && np.back()->isCBV()) {
1720 np.back()->getSort()->getBitWidth() + p.at(i)->getSort()->getBitWidth()));
1723 np.emplace_back(p.at(i));
1727 else if (np.size() == 2) {
1728 if (
isZero(np.front())) {
1741 std::reverse(p.begin(), p.end());
1745 std::reverse(p.begin(), p.end());
1751 std::vector<std::shared_ptr<DAGNode>> np{p.front()};
1752 for (
size_t i = 1, isz = p.size(); i < isz; ++i) {
1753 if (p.at(i)->isCStr() && np.back()->isCStr()) {
1754 std::string l_str = np.back()->toString();
1755 std::string r_str = p.at(i)->toString();
1756 if (l_str.back() ==
'\"' && r_str.front() ==
'\"')
1757 np.back() =
mkConstStr(l_str.substr(0, l_str.size() - 1) + r_str.substr(1));
1761 else if (p.at(i)->isCStr() && (p.at(i)->toString() ==
"\"\""))
1764 np.emplace_back(p.at(i));
1767 if (np.size() > 1 && np.front()->isCStr() && (np.front()->toString() ==
"\"\"")) {
1768 np.erase(np.begin());
1784 std::shared_ptr<DAGNode> cst =
nullptr;
1785 std::sort(p.begin(), p.end());
1786 p.erase(std::unique(p.begin(), p.end()), p.end());
1787 std::vector<std::shared_ptr<DAGNode>> np;
1788 for (
const auto &pc : p) {
1792 else if (cst->isCInt()) {
1796 else if (cst->isCReal()) {
1801 else if (pc->isCReal()) {
1809 echo_error(
"unexpected constant type in MIN operation!");
1810 np.emplace_back(pc);
1814 np.emplace_back(cst);
1821 std::shared_ptr<DAGNode> cst =
nullptr;
1822 std::vector<std::shared_ptr<DAGNode>> np;
1823 std::sort(p.begin(), p.end());
1824 p.erase(std::unique(p.begin(), p.end()), p.end());
1825 for (
const auto &pc : p) {
1829 else if (cst->isCInt()) {
1833 else if (cst->isCReal()) {
1838 else if (pc->isCReal()) {
1846 echo_error(
"unexpected constant type in MIN operation!");
1847 np.emplace_back(pc);
1851 np.emplace_back(cst);
1858 std::cout <<
"NODEKIND: " <<
kindToString(t) << std::endl;
1859 echo_error(
"unexpect NODE_KIND in rewrite n-ary !!!");