SMTStabilizer API
Public API documentation for SMTStabilizer
Loading...
Searching...
No Matches
util.h
Go to the documentation of this file.
1/* -*- Header -*-
2 *
3 * The Util Functions
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 UTIL_HEADER
30#define UTIL_HEADER
31
32#include <cstdint>
33#include <iomanip>
34#include <iostream>
35#include <sstream>
36#include <vector>
37
38#include "asserting.h"
39#include "kind.h"
40#include "number.h"
41
42namespace stabilizer::parser {
43
44// Type checking utilities
49 public:
50 static bool isInt(const std::string &str);
51 static bool isReal(const std::string &str);
52 static bool isBV(const std::string &str);
53 static bool isFP(const std::string &str);
54 static bool isString(const std::string &str);
55 static bool isScientificNotation(const std::string &str);
56 static bool isNumber(const std::string &str);
57};
58
59// Mathematical utilities
63class MathUtils {
64 public:
65 static Integer pow(const Integer &base, const Integer &exp);
66 static Real pow(const Real &base, const Real &exp);
67 static Integer gcd(const Integer &a, const Integer &b);
68 static Integer lcm(const Integer &a, const Integer &b);
69 static Real sqrt(const Integer &i);
70 static Real sqrt(const Real &r);
71 static Real safeSqrt(const Integer &i);
72 static Real safeSqrt(const Real &r);
73 static Integer ceil(const Real &r);
74 static Integer floor(const Real &r);
75 static Integer round(const Real &r);
76 static bool isPrime(const Integer &n);
77 static bool isEven(const Integer &n);
78 static bool isOdd(const Integer &n);
79 static Integer factorial(const Integer &n);
80};
81
82// Bit vector utilities
87 public:
88 static Integer bvToNat(const std::string &bv);
89 static std::string natToBv(const Integer &i, const Integer &n);
90 static std::string natToBv(const std::string &i, const Integer &n);
91 static Integer bvToInt(const std::string &bv);
92 static std::string intToBv(const Integer &i, const Integer &n);
93
94 static std::string bvNot(const std::string &bv);
95 static std::string bvAnd(const std::string &bv1, const std::string &bv2);
96 static std::string bvOr(const std::string &bv1, const std::string &bv2);
97 static std::string bvXor(const std::string &bv1, const std::string &bv2);
98 static std::string bvNand(const std::string &bv1, const std::string &bv2);
99 static std::string bvNor(const std::string &bv1, const std::string &bv2);
100 static std::string bvXnor(const std::string &bv1, const std::string &bv2);
101
102 static std::string bvNeg(const std::string &bv);
103 static std::string bvAdd(const std::string &bv1, const std::string &bv2);
104 static std::string bvSub(const std::string &bv1, const std::string &bv2);
105 static std::string bvMul(const std::string &bv1, const std::string &bv2);
106
107 static std::string bvUdiv(const std::string &bv1, const std::string &bv2);
108 static std::string bvUrem(const std::string &bv1, const std::string &bv2);
109 static std::string bvUmod(const std::string &bv1, const std::string &bv2);
110 static std::string bvSdiv(const std::string &bv1, const std::string &bv2);
111 static std::string bvSrem(const std::string &bv1, const std::string &bv2);
112 static std::string bvSmod(const std::string &bv1, const std::string &bv2);
113
114 static std::string bvShl(const std::string &bv, const std::string &n);
115 static std::string bvLshr(const std::string &bv, const std::string &n);
116 static std::string bvAshr(const std::string &bv, const std::string &n);
117
118 static std::string bvConcat(const std::string &bv1, const std::string &bv2);
119 static std::string bvExtract(const std::string &bv, const Integer &i, const Integer &j);
120 static std::string bvRepeat(const std::string &bv, const Integer &n);
121 static std::string bvZeroExtend(const std::string &bv, const Integer &n);
122 static std::string bvSignExtend(const std::string &bv, const Integer &n);
123
124 static std::string bvRotateLeft(const std::string &bv, const Integer &n);
125 static std::string bvRotateRight(const std::string &bv, const Integer &n);
126
127 static bool bvComp(const std::string &bv1, const std::string &bv2, const NODE_KIND &kind);
128 static bool bvIsMinSigned(const std::string &bv);
129 static bool bvIsMaxSigned(const std::string &bv);
130 static bool bvIsMaxUnsigned(const std::string &bv);
131 static bool bvIsNegOne(const std::string &bv);
132 static int bvCompareToUint(const std::string &bv, const uint64_t &u);
133 static std::string mkOnes(const Integer &n);
134};
135
136// Floating point utilities
141 public:
142 static std::string fpToUbv(const std::string &fp, const Integer &n);
143 static std::string fpToSbv(const std::string &fp, const Integer &n);
144};
145
146// String utilities
151 public:
152 static std::string strSubstr(const std::string &s, const Integer &i, const Integer &j);
153 static bool strPrefixof(const std::string &s, const std::string &t);
154 static bool strSuffixof(const std::string &s, const std::string &t);
155 static bool strContains(const std::string &s, const std::string &t);
156 static Integer strIndexof(const std::string &s, const std::string &t, const Integer &i);
157 static std::string strCharAt(const std::string &s, const Integer &i);
158 static std::string strUpdate(const std::string &s, const Integer &i, const std::string &t);
159 static std::string strReplace(const std::string &s, const std::string &t, const std::string &u);
160 static std::string strReplaceAll(const std::string &s, const std::string &t, const std::string &u);
161 static std::string strToLower(const std::string &s);
162 static std::string strToUpper(const std::string &s);
163 static std::string strRev(const std::string &s);
164 static std::string strUnquate(const std::string &s) {
165 if (s.size() >= 2 && s[0] == '"' && s[s.size() - 1] == '"')
166 return s.substr(1, s.size() - 2);
167 else
168 return s;
169 }
170};
171
172// Conversion utilities
177 public:
178 static std::string toString(const Integer &i);
179 static std::string toString(const Real &r);
180 static std::string toString(const int &i);
181 static std::string toString(const double &d);
182 static std::string toString(const float &f);
183 static std::string toString(const long &l);
184 static std::string toString(const short &s);
185 static std::string toString(const char &c);
186 static std::string toString(const bool &b);
187 static std::string parseScientificNotation(const std::string &str);
188 static std::string escapeString(const std::string &s);
189 static std::string unescapeString(const std::string &s);
190};
191} // namespace stabilizer::parser
192
193#endif
Bitvector conversion and arithmetic helpers on SMT bitstring forms.
Definition util.h:86
static std::string bvNand(const std::string &bv1, const std::string &bv2)
Definition util.cpp:390
static bool bvComp(const std::string &bv1, const std::string &bv2, const NODE_KIND &kind)
Definition util.cpp:637
static std::string bvUdiv(const std::string &bv1, const std::string &bv2)
Definition util.cpp:472
static std::string bvExtract(const std::string &bv, const Integer &i, const Integer &j)
Definition util.cpp:585
static std::string bvSub(const std::string &bv1, const std::string &bv2)
Definition util.cpp:447
static std::string bvUmod(const std::string &bv1, const std::string &bv2)
Definition util.cpp:495
static std::string bvZeroExtend(const std::string &bv, const Integer &n)
Definition util.cpp:608
static std::string bvSdiv(const std::string &bv1, const std::string &bv2)
Definition util.cpp:504
static int bvCompareToUint(const std::string &bv, const uint64_t &u)
Definition util.cpp:704
static std::string bvShl(const std::string &bv, const std::string &n)
Definition util.cpp:541
static std::string bvLshr(const std::string &bv, const std::string &n)
Definition util.cpp:552
static bool bvIsMaxUnsigned(const std::string &bv)
Definition util.cpp:692
static std::string bvConcat(const std::string &bv1, const std::string &bv2)
Definition util.cpp:577
static std::string bvXor(const std::string &bv1, const std::string &bv2)
Definition util.cpp:378
static std::string bvRotateLeft(const std::string &bv, const Integer &n)
Definition util.cpp:621
static std::string bvNot(const std::string &bv)
Definition util.cpp:345
static bool bvIsMaxSigned(const std::string &bv)
Definition util.cpp:676
static Integer bvToNat(const std::string &bv)
Definition util.cpp:724
static std::string natToBv(const Integer &i, const Integer &n)
Definition util.cpp:733
static std::string bvSignExtend(const std::string &bv, const Integer &n)
Definition util.cpp:614
static std::string bvSrem(const std::string &bv1, const std::string &bv2)
Definition util.cpp:516
static Integer bvToInt(const std::string &bv)
Definition util.cpp:852
static std::string bvRotateRight(const std::string &bv, const Integer &n)
Definition util.cpp:628
static bool bvIsNegOne(const std::string &bv)
Definition util.cpp:698
static std::string bvXnor(const std::string &bv1, const std::string &bv2)
Definition util.cpp:414
static std::string bvOr(const std::string &bv1, const std::string &bv2)
Definition util.cpp:366
static std::string bvUrem(const std::string &bv1, const std::string &bv2)
Definition util.cpp:484
static std::string mkOnes(const Integer &n)
Definition util.cpp:720
static std::string bvNeg(const std::string &bv)
Definition util.cpp:427
static std::string bvSmod(const std::string &bv1, const std::string &bv2)
Definition util.cpp:528
static std::string bvAshr(const std::string &bv, const std::string &n)
Definition util.cpp:564
static std::string bvNor(const std::string &bv1, const std::string &bv2)
Definition util.cpp:402
static bool bvIsMinSigned(const std::string &bv)
Definition util.cpp:684
static std::string bvAnd(const std::string &bv1, const std::string &bv2)
Definition util.cpp:354
static std::string bvRepeat(const std::string &bv, const Integer &n)
Definition util.cpp:599
static std::string intToBv(const Integer &i, const Integer &n)
Definition util.cpp:870
static std::string bvAdd(const std::string &bv1, const std::string &bv2)
Definition util.cpp:435
static std::string bvMul(const std::string &bv1, const std::string &bv2)
Definition util.cpp:459
Conversion and escaping helpers for parser I/O and literals.
Definition util.h:176
static std::string toString(const Integer &i)
Definition util.cpp:1111
static std::string parseScientificNotation(const std::string &str)
Definition util.cpp:148
static std::string unescapeString(const std::string &s)
Definition util.cpp:1189
static std::string escapeString(const std::string &s)
Definition util.cpp:1135
Floating-point conversion helpers used by parser evaluation paths.
Definition util.h:140
static std::string fpToSbv(const std::string &fp, const Integer &n)
Definition util.cpp:923
static std::string fpToUbv(const std::string &fp, const Integer &n)
Definition util.cpp:897
Numeric helper wrappers shared by parser-side evaluation and rewrite.
Definition util.h:63
static Real safeSqrt(const Integer &i)
Definition util.cpp:301
static Real sqrt(const Integer &i)
Definition util.cpp:288
static bool isEven(const Integer &n)
Definition util.cpp:333
static Integer lcm(const Integer &a, const Integer &b)
Definition util.cpp:284
static Integer pow(const Integer &base, const Integer &exp)
Definition util.cpp:267
static Integer factorial(const Integer &n)
Definition util.cpp:337
static Integer round(const Real &r)
Definition util.cpp:317
static bool isPrime(const Integer &n)
Definition util.cpp:319
static Integer gcd(const Integer &a, const Integer &b)
Definition util.cpp:278
static bool isOdd(const Integer &n)
Definition util.cpp:335
static Integer floor(const Real &r)
Definition util.cpp:316
static Integer ceil(const Real &r)
Definition util.cpp:315
String theory helper functions for SMT string operators.
Definition util.h:150
static std::string strToUpper(const std::string &s)
Definition util.cpp:1094
static std::string strUnquate(const std::string &s)
Definition util.h:164
static std::string strCharAt(const std::string &s, const Integer &i)
Definition util.cpp:1024
static bool strSuffixof(const std::string &s, const std::string &t)
Definition util.cpp:984
static std::string strReplaceAll(const std::string &s, const std::string &t, const std::string &u)
Definition util.cpp:1062
static Integer strIndexof(const std::string &s, const std::string &t, const Integer &i)
Definition util.cpp:1007
static std::string strSubstr(const std::string &s, const Integer &i, const Integer &j)
Definition util.cpp:950
static std::string strReplace(const std::string &s, const std::string &t, const std::string &u)
Definition util.cpp:1042
static bool strContains(const std::string &s, const std::string &t)
Definition util.cpp:998
static std::string strToLower(const std::string &s)
Definition util.cpp:1085
static std::string strUpdate(const std::string &s, const Integer &i, const std::string &t)
Definition util.cpp:1030
static bool strPrefixof(const std::string &s, const std::string &t)
Definition util.cpp:971
static std::string strRev(const std::string &s)
Definition util.cpp:1103
Lexical classifiers for SMT-LIB literals and token shapes.
Definition util.h:48
static bool isReal(const std::string &str)
Definition util.cpp:58
static bool isScientificNotation(const std::string &str)
Definition util.cpp:75
static bool isFP(const std::string &str)
Definition util.cpp:248
static bool isString(const std::string &str)
Definition util.cpp:259
static bool isInt(const std::string &str)
Definition util.cpp:47
static bool isBV(const std::string &str)
Definition util.cpp:219
static bool isNumber(const std::string &str)
Definition util.cpp:43