|
14 | 14 | #include <iostream> |
15 | 15 | #include <memory> |
16 | 16 | #include <set> |
| 17 | +#include <unordered_set> |
17 | 18 |
|
18 | 19 | #include <libasr/asr.h> |
19 | 20 | #include <libasr/containers.h> |
@@ -97,6 +98,7 @@ class SymEngineQueue { |
97 | 98 | if(queue_front == -1 || queue_front >= static_cast<int>(queue.size())) { |
98 | 99 | var = "queue" + std::to_string(queue.size()); |
99 | 100 | queue.push_back(var); |
| 101 | + if(queue_front == -1) queue_front++; |
100 | 102 | symengine_src = indent + "basic " + var + ";\n"; |
101 | 103 | symengine_src += indent + "basic_new_stack(" + var + ");\n"; |
102 | 104 | } |
@@ -1952,6 +1954,40 @@ PyMODINIT_FUNC PyInit_lpython_module_)" + fn_name + R"((void) { |
1952 | 1954 | handle_Compare(x); |
1953 | 1955 | } |
1954 | 1956 |
|
| 1957 | + void visit_SymbolicCompare(const ASR::SymbolicCompare_t &x) { |
| 1958 | + CHECK_FAST_C_CPP(compiler_options, x) |
| 1959 | + self().visit_expr(*x.m_left); |
| 1960 | + std::string left_src = symengine_src; |
| 1961 | + if(ASR::is_a<ASR::Var_t>(*x.m_left)){ |
| 1962 | + symengine_queue.pop(); |
| 1963 | + } |
| 1964 | + std::string left = std::move(src); |
| 1965 | + |
| 1966 | + self().visit_expr(*x.m_right); |
| 1967 | + std::string right_src = symengine_src; |
| 1968 | + if(ASR::is_a<ASR::Var_t>(*x.m_right)){ |
| 1969 | + symengine_queue.pop(); |
| 1970 | + } |
| 1971 | + std::string right = std::move(src); |
| 1972 | + std::string op_str = ASRUtils::cmpop_to_str(x.m_op); |
| 1973 | + switch (x.m_op) { |
| 1974 | + case (ASR::cmpopType::Eq) : { |
| 1975 | + src = "basic_eq(" + left + ", " + right + ") " + op_str + " 1"; |
| 1976 | + break; |
| 1977 | + } |
| 1978 | + case (ASR::cmpopType::NotEq) : { |
| 1979 | + src = "basic_neq(" + left + ", " + right + ") " + op_str + " 0"; |
| 1980 | + break; |
| 1981 | + } |
| 1982 | + default : { |
| 1983 | + throw LCompilersException("Symbolic comparison operator: '" |
| 1984 | + + op_str |
| 1985 | + + "' is not implemented"); |
| 1986 | + } |
| 1987 | + } |
| 1988 | + symengine_src = left_src + right_src; |
| 1989 | + } |
| 1990 | + |
1955 | 1991 | template<typename T> |
1956 | 1992 | void handle_Compare(const T &x) { |
1957 | 1993 | CHECK_FAST_C_CPP(compiler_options, x) |
|
0 commit comments