LLZK 3.0.0
An open-source IR for Zero Knowledge (ZK) circuits
Loading...
Searching...
No Matches
DynamicAPIntHelper.h
Go to the documentation of this file.
1//===-- DynamicAPIntHelper.h ------------------------------------*- C++ -*-===//
2//
3// Part of the LLZK Project, under the Apache License v2.0.
4// See LICENSE.txt for license information.
5// Copyright 2025 Veridise Inc.
6// SPDX-License-Identifier: Apache-2.0
7//
8//===----------------------------------------------------------------------===//
16//===----------------------------------------------------------------------===//
17
18#pragma once
19
20#include "llzk/Util/Compare.h"
21
22#include <llvm/ADT/APInt.h>
23#include <llvm/ADT/APSInt.h>
24#include <llvm/ADT/ArrayRef.h>
25#include <llvm/ADT/DynamicAPInt.h>
26#include <llvm/ADT/Hashing.h>
27#include <llvm/ADT/StringRef.h>
28#include <llvm/ADT/Twine.h>
29#include <llvm/Support/Error.h>
30
31#include <climits>
32#include <concepts>
33#include <cstddef>
34#include <cstdint>
35#include <limits>
36
37namespace llzk {
38
40llvm::Expected<llvm::DynamicAPInt> parseDynamicAPInt(llvm::StringRef str);
41
43llvm::hash_code hashDynamicAPInt(const llvm::DynamicAPInt &value);
44
46llvm::Expected<llvm::APInt>
47checkedToAPInt(const llvm::DynamicAPInt &value, unsigned bitWidth, bool isSigned);
48
50llvm::Expected<int64_t> checkedToInt64(const llvm::DynamicAPInt &value);
51
53llvm::Expected<uint64_t> checkedToUInt64(const llvm::DynamicAPInt &value);
54
57llvm::Expected<size_t> checkedToSize(const llvm::DynamicAPInt &value, const llvm::Twine &context);
58
60llvm::DynamicAPInt operator&(const llvm::DynamicAPInt &lhs, const llvm::DynamicAPInt &rhs);
61llvm::DynamicAPInt operator|(const llvm::DynamicAPInt &lhs, const llvm::DynamicAPInt &rhs);
62llvm::DynamicAPInt operator^(const llvm::DynamicAPInt &lhs, const llvm::DynamicAPInt &rhs);
63
66llvm::DynamicAPInt operator<<(const llvm::DynamicAPInt &lhs, const llvm::DynamicAPInt &rhs);
69llvm::DynamicAPInt operator<<(const llvm::DynamicAPInt &lhs, int64_t rhs);
73llvm::DynamicAPInt operator>>(const llvm::DynamicAPInt &lhs, const llvm::DynamicAPInt &rhs);
77llvm::DynamicAPInt operator>>(const llvm::DynamicAPInt &lhs, int64_t rhs);
78
81template <std::unsigned_integral T>
82llvm::DynamicAPInt operator>>(const llvm::DynamicAPInt &lhs, T rhs) {
83 if (rhs > static_cast<uint64_t>(std::numeric_limits<int64_t>::max())) {
84 return llvm::DynamicAPInt(lhs < 0 ? -1 : 0);
85 }
86 return lhs >> static_cast<int64_t>(rhs);
87}
88
91llvm::DynamicAPInt toDynamicAPInt(llvm::StringRef str);
92
93llvm::DynamicAPInt toDynamicAPInt(const llvm::APSInt &i);
94
97llvm::DynamicAPInt toDynamicAPInt(const llvm::APInt &i);
98
102llvm::DynamicAPInt toSignedDynamicAPInt(llvm::ArrayRef<uint64_t> parts);
103
104inline llvm::DynamicAPInt toDynamicAPInt(size_t i) {
105 return toDynamicAPInt(llvm::APInt(sizeof(size_t) * CHAR_BIT, llzk::checkedCast<uint64_t>(i)));
106}
107
110llvm::APSInt toAPSInt(const llvm::DynamicAPInt &i);
111
113llvm::DynamicAPInt modExp(
114 const llvm::DynamicAPInt &base, const llvm::DynamicAPInt &exp, const llvm::DynamicAPInt &mod
115);
116
117llvm::DynamicAPInt modInversePrime(const llvm::DynamicAPInt &f, const llvm::DynamicAPInt &p);
118
119} // namespace llzk
ExpressionValue mod(const llvm::SMTSolverRef &solver, const ExpressionValue &lhs, const ExpressionValue &rhs)
Expected< size_t > checkedToSize(const DynamicAPInt &value, const Twine &context)
Interval operator|(const Interval &lhs, const Interval &rhs)
hash_code hashDynamicAPInt(const DynamicAPInt &value)
Interval operator^(const Interval &lhs, const Interval &rhs)
DynamicAPInt toDynamicAPInt(StringRef str)
Expected< DynamicAPInt > parseDynamicAPInt(StringRef str)
Interval operator<<(const Interval &lhs, const Interval &rhs)
constexpr T checkedCast(U u) noexcept
Definition Compare.h:94
Expected< uint64_t > checkedToUInt64(const DynamicAPInt &value)
Interval operator>>(const Interval &lhs, const Interval &rhs)
Interval operator&(const Interval &lhs, const Interval &rhs)
Expected< int64_t > checkedToInt64(const DynamicAPInt &value)
DynamicAPInt toSignedDynamicAPInt(ArrayRef< uint64_t > parts)
DynamicAPInt modInversePrime(const DynamicAPInt &f, const DynamicAPInt &p)
APSInt toAPSInt(const DynamicAPInt &i)
Expected< APInt > checkedToAPInt(const DynamicAPInt &value, unsigned bitWidth, bool isSigned)
DynamicAPInt modExp(const DynamicAPInt &base, const DynamicAPInt &exp, const DynamicAPInt &mod)