21#include <mlir/Support/LLVM.h>
23#include <llvm/ADT/STLExtras.h>
30 if (
auto feltType = llvm::dyn_cast<llzk::felt::FeltType>(sourceType);
31 feltType && feltType.hasField()) {
34 feltType.getField().maxVal(), mlir::IndexType::kInternalStorageBitWidth, overflow
45static inline ParseResult
46parseOptionalOverflowSemantics(OpAsmParser &parser, llzk::cast::OverflowSemanticsAttr &overflow) {
48 if (failed(parser.parseOptionalKeyword(&keyword))) {
52 std::optional<llzk::cast::OverflowSemantics> semantics =
55 return parser.emitError(parser.getCurrentLocation()) <<
"expected overflow semantics keyword";
58 overflow = llzk::cast::OverflowSemanticsAttr::get(parser.getContext(), *semantics);
63printOptionalOverflowSemantics(OpAsmPrinter &printer, llzk::cast::OverflowSemanticsAttr overflow) {
74 return lhs.size() == rhs.size() && llvm::all_of(llvm::zip_equal(lhs, rhs), [](
auto pair) {
75 auto [lhsType, rhsType] = pair;
76 auto lhsFeltType = llvm::dyn_cast<llzk::felt::FeltType>(lhsType);
77 auto rhsFeltType = llvm::dyn_cast<llzk::felt::FeltType>(rhsType);
82 if (lhsFeltType && rhsFeltType && lhsFeltType != rhsFeltType) {
88 return !lhsFeltType.hasField();
92 return lhsType == rhsType;
97 auto value = llvm::dyn_cast_if_present<IntegerAttr>(adaptor.
getValue());
100 if (!value || !resultType.
hasField()) {
110 return felt::FeltConstAttr::get(getContext(), *result, resultType);
115 return ::parseOptionalOverflowSemantics(parser, overflow);
119 OpAsmPrinter &printer,
IntToFeltOp , OverflowSemanticsAttr overflow
125 auto value = llvm::dyn_cast_if_present<felt::FeltConstAttr>(adaptor.
getValue());
130 auto reduced = value.getReducedValue();
139 return IntegerAttr::get(getType(), cantFail(
checkedToInt64(*result)));
143 OpAsmParser &parser, OverflowSemanticsAttr &overflow
145 return ::parseOptionalOverflowSemantics(parser, overflow);
149 OpAsmPrinter &printer,
FeltToIndexOp , OverflowSemanticsAttr overflow
This file implements helpers for DynamicAPInt operations and conversions that LLVM does not provide.
Information about the prime finite field used for the interval analysis.
::llzk::cast::OverflowSemantics getOverflow()
::mlir::OpFoldResult fold(FoldAdaptor adaptor)
GenericAdaptor<::llvm::ArrayRef<::mlir::Attribute > > FoldAdaptor
static void printOptionalOverflowSemantics(::mlir::OpAsmPrinter &printer, FeltToIndexOp op, ::llzk::cast::OverflowSemanticsAttr overflow)
::mlir::ParseResult parseOptionalOverflowSemantics(::mlir::OpAsmParser &parser, ::llzk::cast::OverflowSemanticsAttr &overflow)
::mlir::OpFoldResult fold(FoldAdaptor adaptor)
GenericAdaptor<::llvm::ArrayRef<::mlir::Attribute > > FoldAdaptor
static void printOptionalOverflowSemantics(::mlir::OpAsmPrinter &printer, IntToFeltOp op, ::llzk::cast::OverflowSemanticsAttr overflow)
::mlir::ParseResult parseOptionalOverflowSemantics(::mlir::OpAsmParser &parser, ::llzk::cast::OverflowSemanticsAttr &overflow)
::llzk::cast::OverflowSemantics getOverflow()
static bool isCompatibleReturnTypes(::mlir::TypeRange lhs, ::mlir::TypeRange rhs)
const ::llzk::Field & getField() const
std::optional< DynamicAPInt > applyIntToFeltOverflow(const DynamicAPInt &value, const Field &field, OverflowSemantics overflow)
::llvm::StringRef stringifyOverflowSemantics(OverflowSemantics val)
std::optional< DynamicAPInt > applyFeltToIndexOverflow(const DynamicAPInt &value, unsigned indexBitWidth, OverflowSemantics overflow)
::std::optional< OverflowSemantics > symbolizeOverflowSemantics(::llvm::StringRef str)
Expected< int64_t > checkedToInt64(const DynamicAPInt &value)
llvm::DynamicAPInt integerAttrToDynamicAPInt(mlir::IntegerAttr attr)
Decode an MLIR integer using its signedness; signless i1 denotes a boolean.