SMTStabilizer API
Public API documentation for SMTStabilizer
Loading...
Searching...
No Matches
kind.cpp
Go to the documentation of this file.
1/* -*- Source -*-
2 *
3 * The Kind Enumeration
4 *
5 * Author: Fuqi Jia <jiafq@ios.ac.cn>
6 *
7 * Copyright (C) 2025 Fuqi Jia
8 *
9 * Permission is hereby granted, free of charge, to any person obtaining a
10 * copy of this software and associated documentation files (the "Software"),
11 * to deal in the Software without restriction, including without limitation
12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13 * and/or sell copies of the Software, and to permit persons to whom the
14 * Software is furnished to do so, subject to the following conditions:
15 *
16 * The above copyright notice and this permission notice shall be included in
17 * all copies or substantial portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25 * DEALINGS IN THE SOFTWARE.
26 */
27
28// Modified by Xiang Zhang, 2026
29// Additional changes licensed under the MIT License
30
31#include "kind.h"
32
33namespace stabilizer::parser {
34
35std::string kindToString(const NODE_KIND &nk) {
36 switch (nk) {
38 return "UNKNOWN_KIND";
40 return "ERROR";
42 return "NULL";
44 return "true";
46 return "false";
48 return "const_array";
50 return "placeholder_var";
51 // CORE OPERATORS
53 return "=";
55 return "distinct";
57 return "=";
59 return "=";
61 return "distinct";
63 return "distinct";
64 // CONSTANT / VARIABLE
66 return "CONST";
68 return "VAR";
70 return "TEMP_VAR";
71 // BOOLEAN
73 return "not";
75 return "and";
77 return "or";
79 return "=>";
81 return "xor";
82 // UF
84 return "UF_APPLY";
86 return "DT_FUN_APPLY";
87 // ARITHMATIC COMMON OPERATORS
89 return "+";
91 return "*";
93 return "iand";
95 return "pow2";
97 return "^";
99 return "-";
101 return "-";
103 return "div";
105 return "/";
107 return "mod";
109 return "abs";
111 return "sqrt";
113 return "safesqrt";
115 return "ceil";
117 return "floor";
119 return "round";
120 // TRANSCENDENTAL ARITHMATIC
122 return "exp";
124 return "log";
125 case NODE_KIND::NT_LN:
126 return "ln";
127 case NODE_KIND::NT_LG:
128 return "lg";
129 case NODE_KIND::NT_LB:
130 return "lb";
132 return "sin";
134 return "cos";
136 return "sec";
138 return "csc";
140 return "tan";
142 return "cot";
144 return "asin";
146 return "acos";
148 return "asec";
150 return "acsc";
152 return "atan";
154 return "acot";
156 return "sinh";
158 return "cosh";
160 return "tanh";
162 return "sech";
164 return "csch";
166 return "coth";
168 return "asinh";
170 return "acosh";
172 return "atanh";
174 return "asech";
176 return "acsch";
178 return "acoth";
180 return "atan2";
181 case NODE_KIND::NT_LE:
182 return "<=";
183 case NODE_KIND::NT_LT:
184 return "<";
185 case NODE_KIND::NT_GE:
186 return ">=";
187 case NODE_KIND::NT_GT:
188 return ">";
189 // ARITHMATIC CONVERSION
191 return "to_int";
193 return "to_real";
194 // ARITHMATIC PROPERTIES
196 return "is_int";
198 return "is_divisible";
200 return "is_prime";
202 return "is_even";
204 return "is_odd";
205 // ARITHMATIC CONSTANTS
207 return "pi";
209 return "e";
211 return "inf";
213 return "+inf";
215 return "-inf";
217 return "NaN";
219 return "epsilon";
221 return "+epsilon";
223 return "-epsilon";
224 // ARITHMATIC FUNCTIONS
225 // case NODE_KIND::NT_SUM:
226 // return "sum";
227 // case NODE_KIND::NT_PROD:
228 // return "prod";
230 return "gcd";
232 return "lcm";
234 return "factorial";
235 // BITVECTOR COMMON OPERATORS
236 // Bit-wise operations
238 return "bvnot";
240 return "bvand";
242 return "bvor";
244 return "bvxor";
246 return "bvnand";
248 return "bvnor";
250 return "bvxnor";
252 return "bvcomp";
253 // Arithmetic operations
255 return "bvneg";
257 return "bvadd";
259 return "bvsub";
261 return "bvmul";
263 return "bvudiv";
265 return "bvsdiv";
267 return "bvurem";
269 return "bvsrem";
271 return "bvumod";
273 return "bvsmod";
274 // Arithmetic operations with overflow
276 return "bvnego";
278 return "bvsaddo";
280 return "bvuaddo";
282 return "bvsmulo";
284 return "bvumulo";
286 return "bvsdivo";
288 return "bvudivo";
290 return "bvsremo";
292 return "bvuremo";
294 return "bvsmodo";
296 return "bvumodo";
297 // Shift operations
299 return "bvshl";
301 return "bvlshr";
303 return "bvashr";
304 // Function
306 return "concat";
308 return "extract";
310 return "repeat";
312 return "zero_extend";
314 return "sign_extend";
316 return "rotate_left";
318 return "rotate_right";
319 // BITVECTOR COMP
321 return "bvult";
323 return "bvule";
325 return "bvugt";
327 return "bvuge";
329 return "bvslt";
331 return "bvsle";
333 return "bvsgt";
335 return "bvsge";
336 // BITVECTOR CONVERSION
338 return "bv2nat";
340 return "nat2bv";
342 return "ubv_to_int";
344 return "sbv_to_int";
346 return "int2bv";
348 return "bv2nat";
349 // FLOATING POINT COMMON OPERATORS
351 return "fp.add";
353 return "fp.sub";
355 return "fp.mul";
357 return "fp.div";
359 return "fp.abs";
361 return "fp.neg";
363 return "fp.rem";
365 return "fp.fma";
367 return "fp.sqrt";
369 return "fp.roundToIntegral";
371 return "fp.min";
373 return "fp.max";
374 // FLOATING POINT COMP
376 return "fp.leq";
378 return "fp.lt";
380 return "fp.geq";
382 return "fp.gt";
384 return "fp.eq";
385 // FLOATING POINT CONVERSION
387 return "fp.to_ubv";
389 return "fp.to_sbv";
391 return "fp.to_real";
393 return "to_fp";
395 return "to_fp_unsigned";
396
397 // FLOATING POINT PROPERTIES
399 return "fp.isNormal";
401 return "fp.isSubnormal";
403 return "fp.isZero";
405 return "fp.isInfinite";
407 return "fp.isNaN";
409 return "fp.isNegative";
411 return "fp.isPositive";
412 // ARRAY
414 return "select";
416 return "store";
417 // DATATYPES
419 return "is";
421 return "update";
422 // TUPLES
424 return "tuple";
426 return "tuple.unit";
428 return "tuple.select";
430 return "tuple.update";
432 return "tuple.project";
433 // STRINGS COMMON OPERATORS
435 return "str.len";
437 return "str.++";
439 return "str.substr";
441 return "str.prefixof";
443 return "str.suffixof";
445 return "str.indexof";
447 return "str.at";
449 return "str.update";
451 return "str.replace";
453 return "str.replace_all";
455 return "str.to_lower";
457 return "str.to_upper";
459 return "str.rev";
461 return "str.split";
463 return "str.split_at";
465 return "str.split_rest";
467 return "str.num_splits";
469 return "str.split_at_re";
471 return "str.split_rest_re";
473 return "str.num_splits_re";
474 // STRINGS COMP
476 return "str.<";
478 return "str.<=";
480 return "str.>";
482 return "str.>=";
483 // STRINGS PROPERTIES
485 return "str.in_re";
487 return "str.contains";
489 return "str.is_digit";
490 // STRINGS CONVERSION
492 return "str.from_int";
494 return "str.to_int";
496 return "str.to_re";
498 return "str.to_code";
500 return "str.from_code";
502 return "re.none";
504 return "re.all";
506 return "re.allchar";
508 return "re.++";
510 return "re.union";
512 return "re.inter";
514 return "re.diff";
516 return "re.*";
518 return "re.+";
520 return "re.opt";
522 return "re.range";
524 return "re.^";
526 return "re.loop";
528 return "re.comp";
529 // STRINGS RE FUNCTIONS
531 return "str.replace_re";
533 return "str.replace_re_all";
535 return "str.indexof";
536 // INTERVAL
538 return "max";
540 return "min";
541 // LET
543 return "let";
545 return "let_chain";
547 return "let_bind_var";
549 return "let_bind_var_list";
550 // ITE
552 return "ite";
553 // QUANTIFIERS
555 return "forall";
557 return "exists";
559 return "quant_var";
560 // FUNC
562 return "func_dec";
564 return "func_def";
566 return "func_param";
568 return "func_apply";
570 return "func_rec";
572 return "func_rec_apply";
573 default:
574 return "UNKNOWN_KIND";
575 }
576}
578 switch (nk) {
579 case NODE_KIND::NT_EQ:
582 return NODE_KIND::NT_EQ;
591 case NODE_KIND::NT_LE:
592 return NODE_KIND::NT_GT;
593 case NODE_KIND::NT_LT:
594 return NODE_KIND::NT_GE;
595 case NODE_KIND::NT_GE:
596 return NODE_KIND::NT_LT;
597 case NODE_KIND::NT_GT:
598 return NODE_KIND::NT_LE;
616 return NODE_KIND::NT_FP_GT;
618 return NODE_KIND::NT_FP_GE;
620 return NODE_KIND::NT_FP_LT;
622 return NODE_KIND::NT_FP_LE;
631 default:
633 }
634}
636 switch (nk) {
637 case NODE_KIND::NT_EQ:
638 return NODE_KIND::NT_EQ;
649 case NODE_KIND::NT_LE:
650 return NODE_KIND::NT_GE;
651 case NODE_KIND::NT_LT:
652 return NODE_KIND::NT_GT;
653 case NODE_KIND::NT_GE:
654 return NODE_KIND::NT_LE;
655 case NODE_KIND::NT_GT:
656 return NODE_KIND::NT_LT;
658 return NODE_KIND::NT_SUB;
660 return NODE_KIND::NT_ADD;
662 return NODE_KIND::NT_MUL;
664 return NODE_KIND::NT_MUL;
698 return NODE_KIND::NT_FP_GE;
700 return NODE_KIND::NT_FP_GT;
702 return NODE_KIND::NT_FP_LE;
704 return NODE_KIND::NT_FP_LT;
713 default:
715 }
716}
717
718NODE_KIND getOperKind(const std::string &s) {
719 auto it = oper_key_map.find(s);
720 if (it != oper_key_map.end()) {
721 return it->second;
722 }
724}
725} // namespace stabilizer::parser
const std::unordered_map< std::string, NODE_KIND > oper_key_map
Definition kind.h:385
std::string kindToString(const NODE_KIND &nk)
Definition kind.cpp:35
NODE_KIND getOperKind(const std::string &s)
Definition kind.cpp:718
NODE_KIND getFlipKind(const NODE_KIND &nk)
Definition kind.cpp:635
NODE_KIND getNegatedKind(const NODE_KIND &nk)
Definition kind.cpp:577