SMTStabilizer API
Public API documentation for SMTStabilizer
Loading...
Searching...
No Matches
kind.h
Go to the documentation of this file.
1/* -*- Header -*-
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// Modified by Xiang Zhang, 2026
28// Additional changes licensed under the MIT License
29#ifndef _TYPES_H
30#define _TYPES_H
31
32#include <string>
33#include <unordered_map>
34#include <unordered_set>
35
36namespace stabilizer::parser {
37// common types
38enum class State { UNKNOWN = -1,
39 UNSAT,
40 SAT };
41
42enum class NODE_KIND {
43 NT_UNKNOWN = 0,
45 NT_NULL,
47
52
53 // CONSTANT / VARIABLE (not in parseOper)
55 NT_VAR,
61
62 // === START OF PARSEOPER CONTINUOUS SECTION ===
63 // BOOLEAN OPERATORS (in parseOper)
64 NT_AND,
65 NT_OR,
66 NT_NOT,
68 NT_XOR,
69
70 // CORE OPERATORS (in parseOper)
71 NT_EQ,
73 NT_ITE,
74
75 // ARITHMETIC COMMON OPERATORS (in parseOper)
76 NT_ADD,
77 NT_NEG,
78 NT_SUB,
79 NT_MUL,
80 NT_DT_FUN_APPLY, // Datatype function application (constructors/selectors),
81 // distinct from UF
82 NT_IAND,
83 NT_POW2,
84 NT_POW,
87 NT_MOD,
88 NT_ABS,
89 NT_SQRT,
91 NT_CEIL,
94
95 // TRANSCENDENTAL ARITHMETIC (in parseOper)
96 NT_EXP,
97 NT_LN,
98 NT_LG,
99 NT_LB,
100 NT_LOG,
101 NT_SIN,
102 NT_COS,
103 NT_TAN,
104 NT_COT,
105 NT_SEC,
106 NT_CSC,
107 NT_ASIN,
108 NT_ACOS,
109 NT_ATAN,
110 NT_ACOT,
111 NT_ASEC,
112 NT_ACSC,
113 NT_SINH,
114 NT_COSH,
115 NT_TANH,
116 NT_ASECH,
117 NT_ACSCH,
118 NT_ACOTH,
119 NT_ATAN2,
120 NT_ASINH,
121 NT_ACOSH,
122 NT_ATANH,
123 NT_SECH,
124 NT_CSCH,
125 NT_COTH,
126
127 // ARITHMETIC COMPARISON (in parseOper)
128 NT_LE,
129 NT_LT,
130 NT_GE,
131 NT_GT,
132
133 // ARITHMETIC CONVERSION (in parseOper)
134 NT_TO_INT,
136
137 // ARITHMETIC PROPERTIES (in parseOper)
138 NT_IS_INT,
142 NT_IS_ODD,
143
144 // ARITHMETIC FUNCTIONS (in parseOper)
145 NT_GCD,
146 NT_LCM,
147 NT_FACT,
148
149 // BITVECTOR OPERATORS (in parseOper)
150 NT_BV_NOT,
151 NT_BV_NEG,
152 NT_BV_AND,
153 NT_BV_OR,
154 NT_BV_XOR,
156 NT_BV_NOR,
159 NT_BV_ADD,
160 NT_BV_SUB,
161 NT_BV_MUL,
168 NT_BV_SHL,
171 NT_BV_ULT,
172 NT_BV_ULE,
173 NT_BV_UGT,
174 NT_BV_UGE,
175 NT_BV_SLT,
176 NT_BV_SLE,
177 NT_BV_SGT,
178 NT_BV_SGE,
183 // BITVECTOR FUNCTIONS (in parseOper with args and params)
193
194 // FLOATING POINT OPERATORS (in parseOper)
195 NT_FP_ADD,
196 NT_FP_SUB,
197 NT_FP_MUL,
198 NT_FP_DIV,
199 NT_FP_ABS,
200 NT_FP_NEG,
201 NT_FP_REM,
202 NT_FP_FMA,
205 NT_FP_MIN,
206 NT_FP_MAX,
207 NT_FP_LE,
208 NT_FP_LT,
209 NT_FP_GE,
210 NT_FP_GT,
211 NT_FP_EQ,
224
225 // ARRAY OPERATORS (in parseOper)
226 NT_SELECT,
227 NT_STORE,
228
229 // DATATYPE OPERATORS (in parseOper)
230 NT_DT_TESTER, // ((_ is C) t)
231 NT_DT_UPDATER, // ((_ update S) t u)
232
233 // TUPLE OPERATORS (in parseOper)
234 NT_TUPLE_CONSTRUCTOR, // (tuple ...)
235 NT_TUPLE_UNIT, // tuple.unit
236 NT_TUPLE_SELECT, // ((_ tuple.select i) t)
237 NT_TUPLE_UPDATE, // ((_ tuple.update i) t u)
238 NT_TUPLE_PROJECT, // ((_ tuple.project i1 ... in) t)
239
240 // STRING OPERATORS (in parseOper)
262 NT_STR_LT,
263 NT_STR_LE,
264 NT_STR_GT,
265 NT_STR_GE,
276
277 // REGULAR EXPRESSION OPERATORS (in parseOper)
288
289 // STRING RE FUNCTIONS (in parseOper with args and params)
291
292 // FUNCTION OPERATORS (in parseOper)
296
297 // FUNCTION RECURSION OPERATORS (in parseOper)
300
301 // === END OF PARSEOPER CONTINUOUS SECTION ===
302 // BITVECTOR OVERFLOW OPERATIONS
314
315 // TYPES NOT IN PARSEOPER
321
322 // ARITHMETIC CONSTANTS
326 NT_NAN,
332
333 // STRING RE CONSTANTS
337
338 // INTERVAL
339 NT_MAX,
340 NT_MIN,
341
342 // LET (CHAIN)
343 NT_LET,
345
346 // LET BIND VAR (LIST)
349
350 // QUANTIFIERS
351 NT_FORALL,
352 NT_EXISTS,
354
355 // FUNC PARAMETERS
357
358 // ROOT OBJECT
361
362 // NUM_KINDS
364};
365// NOTE: the last one is the number of kinds
366constexpr size_t NUM_KINDS = static_cast<size_t>(NODE_KIND::NUM_KINDS);
369// only used in preserving let mode
371 "_stabilizer::parser_Preserving_Let_Bind_Var_Suffix_"; // +k
372const std::unordered_map<std::string, NODE_KIND> kind_key_map = {
373 {"true", NODE_KIND::NT_CONST_TRUE},
374 {"false", NODE_KIND::NT_CONST_FALSE},
377 {"nan", NODE_KIND::NT_NAN},
378 {"epsilon", NODE_KIND::NT_EPSILON},
379 {"+epsilon", NODE_KIND::NT_POS_EPSILON},
380 {"-epsilon", NODE_KIND::NT_NEG_EPSILON},
383 {"inf", NODE_KIND::NT_INFINITY},
384};
385const std::unordered_map<std::string, NODE_KIND> oper_key_map = {
386 {"and", NODE_KIND::NT_AND},
387 {"or", NODE_KIND::NT_OR},
388 {"not", NODE_KIND::NT_NOT},
389 {"=>", NODE_KIND::NT_IMPLIES},
390 {"xor", NODE_KIND::NT_XOR},
391 {"=", NODE_KIND::NT_EQ},
392 {"==", NODE_KIND::NT_EQ},
393 {"<->", NODE_KIND::NT_EQ},
394 {"iff", NODE_KIND::NT_EQ},
395 {"<=>", NODE_KIND::NT_EQ},
396 {"distinct", NODE_KIND::NT_DISTINCT},
399 {"ite", NODE_KIND::NT_ITE},
400 {"+", NODE_KIND::NT_ADD},
401 {"-", NODE_KIND::NT_SUB},
402 {"*", NODE_KIND::NT_MUL},
403 {"iand", NODE_KIND::NT_IAND},
404 {"pow2", NODE_KIND::NT_POW2},
405 {"pow", NODE_KIND::NT_POW},
406 {"**", NODE_KIND::NT_POW},
407 {"^", NODE_KIND::NT_POW},
408 {"div", NODE_KIND::NT_DIV_INT},
410 {"%", NODE_KIND::NT_MOD},
411 {"mod", NODE_KIND::NT_MOD},
412 {"abs", NODE_KIND::NT_ABS},
413 {"sqrt", NODE_KIND::NT_SQRT},
414 {"safesqrt", NODE_KIND::NT_SAFESQRT},
415 {"safeSqrt", NODE_KIND::NT_SAFESQRT},
416 {"ceil", NODE_KIND::NT_CEIL},
417 {"floor", NODE_KIND::NT_FLOOR},
418 {"round", NODE_KIND::NT_ROUND},
419 {"exp", NODE_KIND::NT_EXP},
420 {"ln", NODE_KIND::NT_LN},
421 {"loge", NODE_KIND::NT_LN},
422 {"lg", NODE_KIND::NT_LG},
423 {"log10", NODE_KIND::NT_LG},
424 {"lb", NODE_KIND::NT_LB},
425 {"log2", NODE_KIND::NT_LB},
426 {"log", NODE_KIND::NT_LOG},
427 {"sin", NODE_KIND::NT_SIN},
428 {"cos", NODE_KIND::NT_COS},
429 {"tan", NODE_KIND::NT_TAN},
430 {"sec", NODE_KIND::NT_SEC},
431 {"csc", NODE_KIND::NT_CSC},
432 {"cot", NODE_KIND::NT_COT},
433 {"asin", NODE_KIND::NT_ASIN},
434 {"arcsin", NODE_KIND::NT_ASIN},
435 {"acos", NODE_KIND::NT_ACOS},
436 {"arccos", NODE_KIND::NT_ACOS},
437 {"atan", NODE_KIND::NT_ATAN},
438 {"arctan", NODE_KIND::NT_ATAN},
439 {"asec", NODE_KIND::NT_ASEC},
440 {"arcsec", NODE_KIND::NT_ASEC},
441 {"acsc", NODE_KIND::NT_ACSC},
442 {"arccsc", NODE_KIND::NT_ACSC},
443 {"acot", NODE_KIND::NT_ACOT},
444 {"arccot", NODE_KIND::NT_ACOT},
445 {"atan2", NODE_KIND::NT_ATAN2},
446 {"arctan2", NODE_KIND::NT_ATAN2},
447 {"sinh", NODE_KIND::NT_SINH},
448 {"cosh", NODE_KIND::NT_COSH},
449 {"tanh", NODE_KIND::NT_TANH},
450 {"sech", NODE_KIND::NT_SECH},
451 {"csch", NODE_KIND::NT_CSCH},
452 {"coth", NODE_KIND::NT_COTH},
453 {"asinh", NODE_KIND::NT_ASINH},
454 {"arcsinh", NODE_KIND::NT_ASINH},
455 {"acosh", NODE_KIND::NT_ACOSH},
456 {"arccosh", NODE_KIND::NT_ACOSH},
457 {"atanh", NODE_KIND::NT_ATANH},
458 {"arctanh", NODE_KIND::NT_ATANH},
459 {"asech", NODE_KIND::NT_ASECH},
460 {"arcsec", NODE_KIND::NT_ASECH},
461 {"asech", NODE_KIND::NT_ASECH},
462 {"arcsec", NODE_KIND::NT_ASECH},
463 {"acsch", NODE_KIND::NT_ACSCH},
464 {"arccsch", NODE_KIND::NT_ACSCH},
465 {"acoth", NODE_KIND::NT_ACOTH},
466 {"arccoth", NODE_KIND::NT_ACOTH},
467 {"<=", NODE_KIND::NT_LE},
468 {"<", NODE_KIND::NT_LT},
469 {">=", NODE_KIND::NT_GE},
470 {">", NODE_KIND::NT_GT},
471 {"to_real", NODE_KIND::NT_TO_REAL},
472 {"to_int", NODE_KIND::NT_TO_INT},
473 {"is_int", NODE_KIND::NT_IS_INT},
474 {"is_divisible", NODE_KIND::NT_IS_DIVISIBLE},
475 {"is_prime", NODE_KIND::NT_IS_PRIME},
476 {"is_even", NODE_KIND::NT_IS_EVEN},
477 {"is_odd", NODE_KIND::NT_IS_ODD},
478 {"gcd", NODE_KIND::NT_GCD},
479 {"lcm", NODE_KIND::NT_LCM},
480 {"factorial", NODE_KIND::NT_FACT},
481 {"bvnot", NODE_KIND::NT_BV_NOT},
482 {"bvneg", NODE_KIND::NT_BV_NEG},
483 {"bvand", NODE_KIND::NT_BV_AND},
484 {"bvor", NODE_KIND::NT_BV_OR},
485 {"bvxor", NODE_KIND::NT_BV_XOR},
486 {"bvnand", NODE_KIND::NT_BV_NAND},
487 {"bvnor", NODE_KIND::NT_BV_NOR},
488 {"bvxnor", NODE_KIND::NT_BV_XNOR},
489 {"bvcomp", NODE_KIND::NT_BV_COMP},
490 {"bvadd", NODE_KIND::NT_BV_ADD},
491 {"bvsub", NODE_KIND::NT_BV_SUB},
492 {"bvmul", NODE_KIND::NT_BV_MUL},
493 {"bvudiv", NODE_KIND::NT_BV_UDIV},
494 {"bvurem", NODE_KIND::NT_BV_UREM},
495 {"bvsdiv", NODE_KIND::NT_BV_SDIV},
496 {"bvsrem", NODE_KIND::NT_BV_SREM},
497 {"bvumod", NODE_KIND::NT_BV_UMOD},
498 {"bvsmod", NODE_KIND::NT_BV_SMOD},
499 {"bvshl", NODE_KIND::NT_BV_SHL},
500 {"bvlshr", NODE_KIND::NT_BV_LSHR},
501 {"bvashr", NODE_KIND::NT_BV_ASHR},
502 {"bvult", NODE_KIND::NT_BV_ULT},
503 {"bvule", NODE_KIND::NT_BV_ULE},
504 {"bvugt", NODE_KIND::NT_BV_UGT},
505 {"bvuge", NODE_KIND::NT_BV_UGE},
506 {"bvslt", NODE_KIND::NT_BV_SLT},
507 {"bvsle", NODE_KIND::NT_BV_SLE},
508 {"bvsgt", NODE_KIND::NT_BV_SGT},
509 {"bvsge", NODE_KIND::NT_BV_SGE},
510 {"concat", NODE_KIND::NT_BV_CONCAT},
511 {"bv2nat", NODE_KIND::NT_BV_TO_NAT},
512 {"nat2bv", NODE_KIND::NT_NAT_TO_BV},
513 {"bv2int", NODE_KIND::NT_BV_TO_INT},
514 {"int2bv", NODE_KIND::NT_INT_TO_BV},
515 {"int_to_bv", NODE_KIND::NT_INT_TO_BV},
516 {"ubv_to_int", NODE_KIND::NT_UBV_TO_INT},
517 {"sbv_to_int", NODE_KIND::NT_SBV_TO_INT},
518 {"extract", NODE_KIND::NT_BV_EXTRACT},
519 {"repeat", NODE_KIND::NT_BV_REPEAT},
520 {"zero_extend", NODE_KIND::NT_BV_ZERO_EXT},
521 {"sign_extend", NODE_KIND::NT_BV_SIGN_EXT},
522 {"rotate_left", NODE_KIND::NT_BV_ROTATE_LEFT},
523 {"rotate_right", NODE_KIND::NT_BV_ROTATE_RIGHT},
524 {"fp.abs", NODE_KIND::NT_FP_ABS},
525 {"fp.neg", NODE_KIND::NT_FP_NEG},
526 {"fp.add", NODE_KIND::NT_FP_ADD},
527 {"fp.sub", NODE_KIND::NT_FP_SUB},
528 {"fp.mul", NODE_KIND::NT_FP_MUL},
529 {"fp.div", NODE_KIND::NT_FP_DIV},
530 {"fp.fma", NODE_KIND::NT_FP_FMA},
531 {"fp.sqrt", NODE_KIND::NT_FP_SQRT},
532 {"fp.rem", NODE_KIND::NT_FP_REM},
533 {"fp.roundToIntegral", NODE_KIND::NT_FP_ROUND_TO_INTEGRAL},
534 {"fp.min", NODE_KIND::NT_FP_MIN},
535 {"fp.max", NODE_KIND::NT_FP_MAX},
536 {"fp.le", NODE_KIND::NT_FP_LE},
537 {"fp.leq", NODE_KIND::NT_FP_LE},
538 {"fp.lt", NODE_KIND::NT_FP_LT},
539 {"fp.ge", NODE_KIND::NT_FP_GE},
540 {"fp.geq", NODE_KIND::NT_FP_GE},
541 {"fp.gt", NODE_KIND::NT_FP_GT},
542 {"fp.eq", NODE_KIND::NT_FP_EQ},
543 {"fp.=", NODE_KIND::NT_FP_EQ},
544 {"fp.==", NODE_KIND::NT_FP_EQ},
545 {"fp.to_ubv", NODE_KIND::NT_FP_TO_UBV},
546 {"fp.toUbv", NODE_KIND::NT_FP_TO_UBV},
547 {"fp.to_sbv", NODE_KIND::NT_FP_TO_SBV},
548 {"fp.toSbv", NODE_KIND::NT_FP_TO_SBV},
549 {"fp.to_real", NODE_KIND::NT_FP_TO_REAL},
550 {"to_fp", NODE_KIND::NT_FP_TO_FP},
551 {"to_fp_unsigned", NODE_KIND::NT_FP_TO_FP_UNSIGNED},
552 {"fp.isNormal", NODE_KIND::NT_FP_IS_NORMAL},
553 {"fp.isSubnormal", NODE_KIND::NT_FP_IS_SUBNORMAL},
554 {"fp.isZero", NODE_KIND::NT_FP_IS_ZERO},
555 {"fp.isInf", NODE_KIND::NT_FP_IS_INF},
556 {"fp.isInfinite", NODE_KIND::NT_FP_IS_INF},
557 {"fp.isNan", NODE_KIND::NT_FP_IS_NAN},
558 {"fp.isNaN", NODE_KIND::NT_FP_IS_NAN},
559 {"fp.isNeg", NODE_KIND::NT_FP_IS_NEG},
560 {"fp.isNegative", NODE_KIND::NT_FP_IS_NEG},
561 {"fp.isPos", NODE_KIND::NT_FP_IS_POS},
562 {"fp.isPositive", NODE_KIND::NT_FP_IS_POS},
563 {"select", NODE_KIND::NT_SELECT},
564 {"store", NODE_KIND::NT_STORE},
565 // Datatype ops
567 {"update", NODE_KIND::NT_DT_UPDATER},
568 // Tuple ops
570 {"tuple.unit", NODE_KIND::NT_TUPLE_UNIT},
571 {"tuple.select", NODE_KIND::NT_TUPLE_SELECT},
572 {"tuple.update", NODE_KIND::NT_TUPLE_UPDATE},
573 {"tuple.project", NODE_KIND::NT_TUPLE_PROJECT},
574 {"str.len", NODE_KIND::NT_STR_LEN},
575 {"str.++", NODE_KIND::NT_STR_CONCAT},
576 {"str.substr", NODE_KIND::NT_STR_SUBSTR},
577 {"str.prefixof", NODE_KIND::NT_STR_PREFIXOF},
578 {"str.suffixof", NODE_KIND::NT_STR_SUFFIXOF},
579 {"str.indexof", NODE_KIND::NT_STR_INDEXOF},
580 {"str.at", NODE_KIND::NT_STR_CHARAT},
581 {"str.update", NODE_KIND::NT_STR_UPDATE},
582 {"str.replace", NODE_KIND::NT_STR_REPLACE},
583 {"str.replace_all", NODE_KIND::NT_STR_REPLACE_ALL},
584 {"str.replace_re", NODE_KIND::NT_STR_REPLACE_REG},
585 {"str.replace_re_all", NODE_KIND::NT_STR_REPLACE_REG_ALL},
586 {"str.indexof_re", NODE_KIND::NT_STR_INDEXOF_REG},
587 {"str.to_lower", NODE_KIND::NT_STR_TO_LOWER},
588 {"str.to_upper", NODE_KIND::NT_STR_TO_UPPER},
589 {"str.rev", NODE_KIND::NT_STR_REV},
590 {"str.split", NODE_KIND::NT_STR_SPLIT},
591 {"str.split_at", NODE_KIND::NT_STR_SPLIT_AT},
592 {"str.split_rest", NODE_KIND::NT_STR_SPLIT_REST},
593 {"str.num_splits", NODE_KIND::NT_STR_NUM_SPLITS},
594 {"str.split_at_re", NODE_KIND::NT_STR_SPLIT_AT_RE},
595 {"str.split_rest_re", NODE_KIND::NT_STR_SPLIT_REST_RE},
596 {"str.num_splits_re", NODE_KIND::NT_STR_NUM_SPLITS_RE},
597 {"str.<", NODE_KIND::NT_STR_LT},
598 {"str.<=", NODE_KIND::NT_STR_LE},
599 {"str.>", NODE_KIND::NT_STR_GT},
600 {"str.>=", NODE_KIND::NT_STR_GE},
601 {"str.in_re", NODE_KIND::NT_STR_IN_REG},
602 {"str.contains", NODE_KIND::NT_STR_CONTAINS},
603 {"str.is_digit", NODE_KIND::NT_STR_IS_DIGIT},
604 {"str.from_int", NODE_KIND::NT_STR_FROM_INT},
605 {"str.to_int", NODE_KIND::NT_STR_TO_INT},
606 {"str.to_re", NODE_KIND::NT_STR_TO_REG},
607 {"str.to_code", NODE_KIND::NT_STR_TO_CODE},
608 {"str.from_code", NODE_KIND::NT_STR_FROM_CODE},
609 {"re.++", NODE_KIND::NT_REG_CONCAT},
610 {"re.union", NODE_KIND::NT_REG_UNION},
611 {"re.inter", NODE_KIND::NT_REG_INTER},
612 {"re.diff", NODE_KIND::NT_REG_DIFF},
613 {"re.*", NODE_KIND::NT_REG_STAR},
614 {"re.+", NODE_KIND::NT_REG_PLUS},
615 {"re.?", NODE_KIND::NT_REG_OPT},
616 {"re.opt", NODE_KIND::NT_REG_OPT},
617 {"re.range", NODE_KIND::NT_REG_RANGE},
618 {"re.^", NODE_KIND::NT_REG_REPEAT},
619 {"re.repeat", NODE_KIND::NT_REG_REPEAT},
620 {"re.loop", NODE_KIND::NT_REG_LOOP},
621 {"re.comp", NODE_KIND::NT_REG_COMPLEMENT},
622 {"root-obj", NODE_KIND::NT_ROOT_OBJ},
623 {"root-of-with-interval", NODE_KIND::NT_ROOT_OF_WITH_INTERVAL}};
624
625std::string kindToString(const NODE_KIND &nk);
626NODE_KIND getFlipKind(const NODE_KIND &nk); // > -> <, < -> >, etc.
627NODE_KIND getNegatedKind(const NODE_KIND &nk); // > -> <=, < -> >=, etc.
628NODE_KIND getOperKind(const std::string &s);
629} // namespace stabilizer::parser
630
631#endif
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
const std::string PRESERVING_LET_BIND_VAR_SUFFIX
Definition kind.h:370
const std::unordered_set< NODE_KIND > static_kinds
Definition kind.h:367
NODE_KIND getOperKind(const std::string &s)
Definition kind.cpp:718
constexpr size_t NUM_KINDS
Definition kind.h:366
NODE_KIND getFlipKind(const NODE_KIND &nk)
Definition kind.cpp:635
const std::unordered_map< std::string, NODE_KIND > kind_key_map
Definition kind.h:372
NODE_KIND getNegatedKind(const NODE_KIND &nk)
Definition kind.cpp:577