LLZK 3.0.0
An open-source IR for Zero Knowledge (ZK) circuits
Loading...
Searching...
No Matches
Ops.cpp.inc
Go to the documentation of this file.
1/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
2|* *|
3|* Op Definitions *|
4|* *|
5|* Automatically generated file, do not edit! *|
6|* From: Ops.td *|
7|* *|
8\*===----------------------------------------------------------------------===*/
9
10#ifdef GET_OP_LIST
11#undef GET_OP_LIST
12
15#endif // GET_OP_LIST
16
17#ifdef GET_OP_CLASSES
18#undef GET_OP_CLASSES
19
20
21//===----------------------------------------------------------------------===//
22// Local Utility Method Definitions
23//===----------------------------------------------------------------------===//
24
25
26static ::llvm::LogicalResult __mlir_ods_local_type_constraint_Ops1(
27 ::mlir::Operation *op, ::mlir::Type type, ::llvm::StringRef valueKind,
28 unsigned valueIndex) {
29 if (!((::llvm::isa<::llzk::felt::FeltType>(type)))) {
30 return op->emitOpError(valueKind) << " #" << valueIndex
31 << " must be finite field element, but got " << type;
32 }
33 return ::mlir::success();
34}
35
36static ::llvm::LogicalResult __mlir_ods_local_type_constraint_Ops2(
37 ::mlir::Operation *op, ::mlir::Type type, ::llvm::StringRef valueKind,
38 unsigned valueIndex) {
39 if (!((::llvm::isa<::mlir::IndexType>(type)))) {
40 return op->emitOpError(valueKind) << " #" << valueIndex
41 << " must be index, but got " << type;
42 }
43 return ::mlir::success();
44}
45
46static ::llvm::LogicalResult __mlir_ods_local_type_constraint_Ops3(
47 ::mlir::Operation *op, ::mlir::Type type, ::llvm::StringRef valueKind,
48 unsigned valueIndex) {
49 if (!(((type.isSignlessInteger(1))) || ((::llvm::isa<::mlir::IndexType>(type))))) {
50 return op->emitOpError(valueKind) << " #" << valueIndex
51 << " must be 1-bit signless integer or index, but got " << type;
52 }
53 return ::mlir::success();
54}
55
56static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_Ops1(
57 ::mlir::Attribute attr, ::llvm::StringRef attrName, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
58 if (attr && !((::llvm::isa<::llzk::cast::OverflowSemanticsAttr>(attr))))
59 return emitError() << "attribute '" << attrName
60 << "' failed to satisfy constraint: Specifies how a cast handles a source value outside the target's safe range. For a felt target with prime `p`, the safe range is `[0, p-1]`. For an index target with bitwidth `N`, it is `[0, 2^(N-1)-1]`.";
61 return ::mlir::success();
62}
63static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_Ops1(
64 ::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) {
65 return __mlir_ods_local_attr_constraint_Ops1(attr, attrName, [op]() {
66 return op->emitOpError();
67 });
68}
69namespace llzk::cast {
70
71
72//===----------------------------------------------------------------------===//
73// ::llzk::cast::FeltToIndexOp definitions
74//===----------------------------------------------------------------------===//
75
76namespace detail {
77
79
80::llzk::cast::OverflowSemanticsAttr FeltToIndexOpGenericAdaptorBase::getOverflowAttr() {
81 auto attr = ::llvm::dyn_cast_or_null<::llzk::cast::OverflowSemanticsAttr>(getProperties().overflow);
82 return attr;
83}
84
89
90
91} // namespace detail
93
94::llvm::LogicalResult FeltToIndexOpAdaptor::verify(::mlir::Location loc) {
95 auto tblgen_overflow = getProperties().overflow; (void)tblgen_overflow;
96
97 if (tblgen_overflow && !((::llvm::isa<::llzk::cast::OverflowSemanticsAttr>(tblgen_overflow))))
98 return emitError(loc, "'cast.toindex' op attribute 'overflow' failed to satisfy constraint: Specifies how a cast handles a source value outside the target's safe range. For a felt target with prime `p`, the safe range is `[0, p-1]`. For an index target with bitwidth `N`, it is `[0, 2^(N-1)-1]`.");
99 return ::mlir::success();
100}
101
102::llvm::LogicalResult FeltToIndexOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
103 ::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
104 if (!dict) {
105 emitError() << "expected DictionaryAttr to set properties";
106 return ::mlir::failure();
107 }
108
109 {
110 auto &propStorage = prop.overflow;
111 auto attr = dict.get("overflow");
112 if (attr) {
113 auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
114 if (convertedAttr) {
115 propStorage = convertedAttr;
116 } else {
117 emitError() << "Invalid attribute `overflow` in property conversion: " << attr;
118 return ::mlir::failure();
119 }
120 }
121 }
122 return ::mlir::success();
123}
124
125::mlir::Attribute FeltToIndexOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
126 ::mlir::SmallVector<::mlir::NamedAttribute> attrs;
127 ::mlir::Builder odsBuilder{ctx};
128
129 {
130 const auto &propStorage = prop.overflow;
131 if (propStorage)
132 attrs.push_back(odsBuilder.getNamedAttr("overflow",
133 propStorage));
134 }
135
136 if (!attrs.empty())
137 return odsBuilder.getDictionaryAttr(attrs);
138 return {};
139}
140
142 using llvm::hash_value;
143 return llvm::hash_combine(
144 llvm::hash_value(prop.overflow.getAsOpaquePointer()));
145}
146
147std::optional<mlir::Attribute> FeltToIndexOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
148 if (name == "overflow")
149 return prop.overflow;
150 return std::nullopt;
151}
152
153void FeltToIndexOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
154 if (name == "overflow") {
155 prop.overflow = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.overflow)>>(value);
156 return;
157 }
158}
159
160void FeltToIndexOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
161 if (prop.overflow) attrs.append("overflow", prop.overflow);
162}
163
164::llvm::LogicalResult FeltToIndexOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
165 {
166 ::mlir::Attribute attr = attrs.get(getOverflowAttrName(opName));
167 if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_Ops1(attr, "overflow", emitError)))
168 return ::mlir::failure();
169 }
170 return ::mlir::success();
171}
172
173::llvm::LogicalResult FeltToIndexOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
174 auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
175 if (::mlir::failed(reader.readOptionalAttribute(prop.overflow)))
176 return ::mlir::failure();
177 return ::mlir::success();
178}
179
180void FeltToIndexOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
181 auto &prop = getProperties(); (void)prop;
182
183 writer.writeOptionalAttribute(prop.overflow);
184}
185
187 auto attr = getOverflowAttr();
188 return attr.getValue();
189}
190
192 getProperties().overflow = ::llzk::cast::OverflowSemanticsAttr::get(::mlir::Builder((*this)->getContext()).getContext(), attrValue);
193}
194
195void FeltToIndexOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type result, ::llzk::cast::OverflowSemanticsAttr overflow, ::mlir::Value value) {
196 odsState.addOperands(value);
197 if (overflow) {
198 odsState.getOrAddProperties<Properties>().overflow = overflow;
199 }
200 odsState.addTypes(result);
201}
202
203FeltToIndexOp FeltToIndexOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type result, ::llzk::cast::OverflowSemanticsAttr overflow, ::mlir::Value value) {
204 ::mlir::OperationState __state__(location, getOperationName());
205 build(builder, __state__, std::forward<decltype(result)>(result), std::forward<decltype(overflow)>(overflow), std::forward<decltype(value)>(value));
206 auto __res__ = ::llvm::dyn_cast<FeltToIndexOp>(builder.create(__state__));
207 assert(__res__ && "builder didn't return the right type");
208 return __res__;
209}
210
211FeltToIndexOp FeltToIndexOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type result, ::llzk::cast::OverflowSemanticsAttr overflow, ::mlir::Value value) {
212 return create(builder, builder.getLoc(), std::forward<decltype(result)>(result), std::forward<decltype(overflow)>(overflow), std::forward<decltype(value)>(value));
213}
214
215void FeltToIndexOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::llzk::cast::OverflowSemanticsAttr overflow, ::mlir::Value value) {
216 odsState.addOperands(value);
217 if (overflow) {
218 odsState.getOrAddProperties<Properties>().overflow = overflow;
219 }
220
221 ::llvm::SmallVector<::mlir::Type, 2> inferredReturnTypes;
222 if (::mlir::succeeded(FeltToIndexOp::inferReturnTypes(odsBuilder.getContext(),
223 odsState.location, odsState.operands,
224 odsState.attributes.getDictionary(odsState.getContext()),
225 odsState.getRawProperties(),
226 odsState.regions, inferredReturnTypes)))
227 odsState.addTypes(inferredReturnTypes);
228 else
229 ::mlir::detail::reportFatalInferReturnTypesError(odsState);
230
231}
232
233FeltToIndexOp FeltToIndexOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::llzk::cast::OverflowSemanticsAttr overflow, ::mlir::Value value) {
234 ::mlir::OperationState __state__(location, getOperationName());
235 build(builder, __state__, std::forward<decltype(overflow)>(overflow), std::forward<decltype(value)>(value));
236 auto __res__ = ::llvm::dyn_cast<FeltToIndexOp>(builder.create(__state__));
237 assert(__res__ && "builder didn't return the right type");
238 return __res__;
239}
240
241FeltToIndexOp FeltToIndexOp::create(::mlir::ImplicitLocOpBuilder &builder, ::llzk::cast::OverflowSemanticsAttr overflow, ::mlir::Value value) {
242 return create(builder, builder.getLoc(), std::forward<decltype(overflow)>(overflow), std::forward<decltype(value)>(value));
243}
244
245void FeltToIndexOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::llzk::cast::OverflowSemanticsAttr overflow, ::mlir::Value value) {
246 odsState.addOperands(value);
247 if (overflow) {
248 odsState.getOrAddProperties<Properties>().overflow = overflow;
249 }
250 assert(resultTypes.size() == 1u && "mismatched number of results");
251 odsState.addTypes(resultTypes);
252}
253
254FeltToIndexOp FeltToIndexOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::llzk::cast::OverflowSemanticsAttr overflow, ::mlir::Value value) {
255 ::mlir::OperationState __state__(location, getOperationName());
256 build(builder, __state__, std::forward<decltype(resultTypes)>(resultTypes), std::forward<decltype(overflow)>(overflow), std::forward<decltype(value)>(value));
257 auto __res__ = ::llvm::dyn_cast<FeltToIndexOp>(builder.create(__state__));
258 assert(__res__ && "builder didn't return the right type");
259 return __res__;
260}
261
262FeltToIndexOp FeltToIndexOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::llzk::cast::OverflowSemanticsAttr overflow, ::mlir::Value value) {
263 return create(builder, builder.getLoc(), std::forward<decltype(resultTypes)>(resultTypes), std::forward<decltype(overflow)>(overflow), std::forward<decltype(value)>(value));
264}
265
266void FeltToIndexOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type result, ::llzk::cast::OverflowSemantics overflow, ::mlir::Value value) {
267 odsState.addOperands(value);
268 odsState.getOrAddProperties<Properties>().overflow = ::llzk::cast::OverflowSemanticsAttr::get(odsBuilder.getContext(), overflow);
269 odsState.addTypes(result);
270}
271
272FeltToIndexOp FeltToIndexOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type result, ::llzk::cast::OverflowSemantics overflow, ::mlir::Value value) {
273 ::mlir::OperationState __state__(location, getOperationName());
274 build(builder, __state__, std::forward<decltype(result)>(result), std::forward<decltype(overflow)>(overflow), std::forward<decltype(value)>(value));
275 auto __res__ = ::llvm::dyn_cast<FeltToIndexOp>(builder.create(__state__));
276 assert(__res__ && "builder didn't return the right type");
277 return __res__;
278}
279
280FeltToIndexOp FeltToIndexOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type result, ::llzk::cast::OverflowSemantics overflow, ::mlir::Value value) {
281 return create(builder, builder.getLoc(), std::forward<decltype(result)>(result), std::forward<decltype(overflow)>(overflow), std::forward<decltype(value)>(value));
282}
283
284void FeltToIndexOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::llzk::cast::OverflowSemantics overflow, ::mlir::Value value) {
285 odsState.addOperands(value);
286 odsState.getOrAddProperties<Properties>().overflow = ::llzk::cast::OverflowSemanticsAttr::get(odsBuilder.getContext(), overflow);
287
288 ::llvm::SmallVector<::mlir::Type, 2> inferredReturnTypes;
289 if (::mlir::succeeded(FeltToIndexOp::inferReturnTypes(odsBuilder.getContext(),
290 odsState.location, odsState.operands,
291 odsState.attributes.getDictionary(odsState.getContext()),
292 odsState.getRawProperties(),
293 odsState.regions, inferredReturnTypes)))
294 odsState.addTypes(inferredReturnTypes);
295 else
296 ::mlir::detail::reportFatalInferReturnTypesError(odsState);
297
298}
299
300FeltToIndexOp FeltToIndexOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::llzk::cast::OverflowSemantics overflow, ::mlir::Value value) {
301 ::mlir::OperationState __state__(location, getOperationName());
302 build(builder, __state__, std::forward<decltype(overflow)>(overflow), std::forward<decltype(value)>(value));
303 auto __res__ = ::llvm::dyn_cast<FeltToIndexOp>(builder.create(__state__));
304 assert(__res__ && "builder didn't return the right type");
305 return __res__;
306}
307
308FeltToIndexOp FeltToIndexOp::create(::mlir::ImplicitLocOpBuilder &builder, ::llzk::cast::OverflowSemantics overflow, ::mlir::Value value) {
309 return create(builder, builder.getLoc(), std::forward<decltype(overflow)>(overflow), std::forward<decltype(value)>(value));
310}
311
312void FeltToIndexOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::llzk::cast::OverflowSemantics overflow, ::mlir::Value value) {
313 odsState.addOperands(value);
314 odsState.getOrAddProperties<Properties>().overflow = ::llzk::cast::OverflowSemanticsAttr::get(odsBuilder.getContext(), overflow);
315 assert(resultTypes.size() == 1u && "mismatched number of results");
316 odsState.addTypes(resultTypes);
317}
318
319FeltToIndexOp FeltToIndexOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::llzk::cast::OverflowSemantics overflow, ::mlir::Value value) {
320 ::mlir::OperationState __state__(location, getOperationName());
321 build(builder, __state__, std::forward<decltype(resultTypes)>(resultTypes), std::forward<decltype(overflow)>(overflow), std::forward<decltype(value)>(value));
322 auto __res__ = ::llvm::dyn_cast<FeltToIndexOp>(builder.create(__state__));
323 assert(__res__ && "builder didn't return the right type");
324 return __res__;
325}
326
327FeltToIndexOp FeltToIndexOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::llzk::cast::OverflowSemantics overflow, ::mlir::Value value) {
328 return create(builder, builder.getLoc(), std::forward<decltype(resultTypes)>(resultTypes), std::forward<decltype(overflow)>(overflow), std::forward<decltype(value)>(value));
329}
330
331void FeltToIndexOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) {
332 assert(operands.size() == 1u && "mismatched number of parameters");
333 odsState.addOperands(operands);
334 odsState.addAttributes(attributes);
335 assert(resultTypes.size() == 1u && "mismatched number of return types");
336 odsState.addTypes(resultTypes);
337
338 if (!attributes.empty()) {
339 (void)odsState.getOrAddProperties<FeltToIndexOp::Properties>();
340 ::mlir::PropertyRef properties = odsState.getRawProperties();
341 std::optional<::mlir::RegisteredOperationName> info =
342 odsState.name.getRegisteredInfo();
343 if (failed(info->setOpPropertiesFromAttribute(odsState.name, properties,
344 odsState.attributes.getDictionary(odsState.getContext()), nullptr)))
345 ::llvm::report_fatal_error("Property conversion failed.");
346 }
347}
348
349FeltToIndexOp FeltToIndexOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) {
350 ::mlir::OperationState __state__(location, getOperationName());
351 build(builder, __state__, std::forward<decltype(resultTypes)>(resultTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
352 auto __res__ = ::llvm::dyn_cast<FeltToIndexOp>(builder.create(__state__));
353 assert(__res__ && "builder didn't return the right type");
354 return __res__;
355}
356
357FeltToIndexOp FeltToIndexOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) {
358 return create(builder, builder.getLoc(), std::forward<decltype(resultTypes)>(resultTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
359}
360
361void FeltToIndexOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) {
362 assert(operands.size() == 1u && "mismatched number of parameters");
363 odsState.addOperands(operands);
364 odsState.addAttributes(attributes);
365
366 if (!attributes.empty()) {
367 (void)odsState.getOrAddProperties<FeltToIndexOp::Properties>();
368 ::mlir::PropertyRef properties = odsState.getRawProperties();
369 std::optional<::mlir::RegisteredOperationName> info =
370 odsState.name.getRegisteredInfo();
371 if (failed(info->setOpPropertiesFromAttribute(odsState.name, properties,
372 odsState.attributes.getDictionary(odsState.getContext()), nullptr)))
373 ::llvm::report_fatal_error("Property conversion failed.");
374 }
375 ::llvm::SmallVector<::mlir::Type, 2> inferredReturnTypes;
376 if (::mlir::succeeded(FeltToIndexOp::inferReturnTypes(odsBuilder.getContext(),
377 odsState.location, operands,
378 odsState.attributes.getDictionary(odsState.getContext()),
379 odsState.getRawProperties(),
380 odsState.regions, inferredReturnTypes))) {
381 assert(inferredReturnTypes.size() == 1u && "mismatched number of return types");
382 odsState.addTypes(inferredReturnTypes);
383 } else {
384 ::llvm::report_fatal_error("Failed to infer result type(s).");
385 }
386}
387
388FeltToIndexOp FeltToIndexOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) {
389 ::mlir::OperationState __state__(location, getOperationName());
390 build(builder, __state__, std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
391 auto __res__ = ::llvm::dyn_cast<FeltToIndexOp>(builder.create(__state__));
392 assert(__res__ && "builder didn't return the right type");
393 return __res__;
394}
395
396FeltToIndexOp FeltToIndexOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) {
397 return create(builder, builder.getLoc(), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
398}
399
400void FeltToIndexOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) {
401 assert(operands.size() == 1u && "mismatched number of parameters");
402 odsState.addOperands(operands);
403 odsState.useProperties(const_cast<Properties&>(properties));
404 odsState.addAttributes(discardableAttributes);
405 assert(resultTypes.size() == 1u && "mismatched number of return types");
406 odsState.addTypes(resultTypes);
407}
408
409FeltToIndexOp FeltToIndexOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) {
410 ::mlir::OperationState __state__(location, getOperationName());
411 build(builder, __state__, std::forward<decltype(resultTypes)>(resultTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(properties)>(properties), std::forward<decltype(discardableAttributes)>(discardableAttributes));
412 auto __res__ = ::llvm::dyn_cast<FeltToIndexOp>(builder.create(__state__));
413 assert(__res__ && "builder didn't return the right type");
414 return __res__;
415}
416
417FeltToIndexOp FeltToIndexOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) {
418 return create(builder, builder.getLoc(), std::forward<decltype(resultTypes)>(resultTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(properties)>(properties), std::forward<decltype(discardableAttributes)>(discardableAttributes));
419}
420
421void FeltToIndexOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) {
422 assert(operands.size() == 1u && "mismatched number of parameters");
423 odsState.addOperands(operands);
424 odsState.useProperties(const_cast<Properties &>(properties));
425 odsState.addAttributes(discardableAttributes);
426
427 ::llvm::SmallVector<::mlir::Type, 2> inferredReturnTypes;
428 if (::mlir::succeeded(FeltToIndexOp::inferReturnTypes(odsBuilder.getContext(),
429 odsState.location, operands,
430 odsState.attributes.getDictionary(odsState.getContext()),
431 odsState.getRawProperties(),
432 odsState.regions, inferredReturnTypes))) {
433 assert(inferredReturnTypes.size() == 1u && "mismatched number of return types");
434 odsState.addTypes(inferredReturnTypes);
435 } else {
436 ::llvm::report_fatal_error("Failed to infer result type(s).");
437 }
438}
439
440FeltToIndexOp FeltToIndexOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) {
441 ::mlir::OperationState __state__(location, getOperationName());
442 build(builder, __state__, std::forward<decltype(operands)>(operands), std::forward<decltype(properties)>(properties), std::forward<decltype(discardableAttributes)>(discardableAttributes));
443 auto __res__ = ::llvm::dyn_cast<FeltToIndexOp>(builder.create(__state__));
444 assert(__res__ && "builder didn't return the right type");
445 return __res__;
446}
447
448FeltToIndexOp FeltToIndexOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) {
449 return create(builder, builder.getLoc(), std::forward<decltype(operands)>(operands), std::forward<decltype(properties)>(properties), std::forward<decltype(discardableAttributes)>(discardableAttributes));
450}
451
452void FeltToIndexOp::populateDefaultProperties(::mlir::OperationName opName, Properties &properties) {
453 ::mlir::Builder odsBuilder(opName.getContext());
454 if (!properties.overflow)
455 properties.overflow = ::llzk::cast::OverflowSemanticsAttr::get(odsBuilder.getContext(), OverflowSemantics::ASSERT);
456}
457
458::llvm::LogicalResult FeltToIndexOp::verifyInvariantsImpl() {
459 auto tblgen_overflow = getProperties().overflow; (void)tblgen_overflow;
460
461 if (::mlir::failed(__mlir_ods_local_attr_constraint_Ops1(*this, tblgen_overflow, "overflow")))
462 return ::mlir::failure();
463 {
464 unsigned index = 0; (void)index;
465 auto valueGroup0 = getODSOperands(0);
466
467 for (auto v : valueGroup0) {
468 if (::mlir::failed(__mlir_ods_local_type_constraint_Ops1(*this, v.getType(), "operand", index++)))
469 return ::mlir::failure();
470 }
471 }
472 {
473 unsigned index = 0; (void)index;
474 auto valueGroup0 = getODSResults(0);
475
476 for (auto v : valueGroup0) {
477 if (::mlir::failed(__mlir_ods_local_type_constraint_Ops2(*this, v.getType(), "result", index++)))
478 return ::mlir::failure();
479 }
480 }
481 return ::mlir::success();
482}
483
484::llvm::LogicalResult FeltToIndexOp::verifyInvariants() {
485 return verifyInvariantsImpl();
486}
487
488::llvm::LogicalResult FeltToIndexOp::inferReturnTypes(::mlir::MLIRContext *context, ::std::optional<::mlir::Location> location, ::mlir::ValueRange operands, ::mlir::DictionaryAttr attributes, ::mlir::PropertyRef properties, ::mlir::RegionRange regions, ::llvm::SmallVectorImpl<::mlir::Type>&inferredReturnTypes) {
489 inferredReturnTypes.resize(1);
490 ::mlir::Builder odsBuilder(context);
491 ::mlir::Type odsInferredType0 = odsBuilder.getIndexType();
492 inferredReturnTypes[0] = odsInferredType0;
493 return ::mlir::success();
494}
495
496::mlir::ParseResult FeltToIndexOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) {
497 ::llzk::cast::OverflowSemanticsAttr overflowAttr;
498 ::mlir::OpAsmParser::UnresolvedOperand valueRawOperand{};
499 ::llvm::ArrayRef<::mlir::OpAsmParser::UnresolvedOperand> valueOperands(&valueRawOperand, 1); ::llvm::SMLoc valueOperandsLoc;
500 (void)valueOperandsLoc;
501 ::mlir::Type valueRawType{};
502 ::llvm::ArrayRef<::mlir::Type> valueTypes(&valueRawType, 1);
503 {
504 auto odsResult = parseOptionalOverflowSemantics(parser, overflowAttr);
505 if (odsResult) return ::mlir::failure();
506 if (overflowAttr)
507 result.getOrAddProperties<FeltToIndexOp::Properties>().overflow = overflowAttr;
508 }
509
510 valueOperandsLoc = parser.getCurrentLocation();
511 if (parser.parseOperand(valueRawOperand))
512 return ::mlir::failure();
513 {
514 auto odsResult = parseInferredOrParsedType(parser, valueRawType, true);
515 if (odsResult) return ::mlir::failure();
516 }
517 {
518 auto loc = parser.getCurrentLocation();(void)loc;
519 if (parser.parseOptionalAttrDict(result.attributes))
520 return ::mlir::failure();
521 if (failed(verifyInherentAttrs(result.name, result.attributes, [&]() {
522 return parser.emitError(loc) << "'" << result.name.getStringRef() << "' op ";
523 })))
524 return ::mlir::failure();
525 }
526 ::mlir::Type odsBuildableType0 = parser.getBuilder().getIndexType();
527 result.addTypes(odsBuildableType0);
528 if (parser.resolveOperands(valueOperands, valueTypes, valueOperandsLoc, result.operands))
529 return ::mlir::failure();
530 return ::mlir::success();
531}
532
533void FeltToIndexOp::print(::mlir::OpAsmPrinter &_odsPrinter) {
534 printOptionalOverflowSemantics(_odsPrinter, *this, getOverflowAttr());
535 _odsPrinter << ' ';
536 _odsPrinter << getValue();
537 printInferredOrParsedType(_odsPrinter, *this, getValue().getType(), true);
538 ::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs;
539 elidedAttrs.push_back("overflow");
540 {
541 ::mlir::Builder odsBuilder(getContext());
542 ::mlir::Attribute attr = getOverflowAttr();
543 if(attr && (attr == ::llzk::cast::OverflowSemanticsAttr::get(odsBuilder.getContext(), OverflowSemantics::ASSERT)))
544 elidedAttrs.push_back("overflow");
545 }
546 _odsPrinter.printOptionalAttrDict((*this)->getAttrs(), elidedAttrs);
547}
548
551 ::llvm::SmallVectorImpl<::mlir::MemoryEffects::EffectInstance> &effects
552) {
553 if (canCastAssertFail(getValue().getType(), getOverflow())) {
554 effects.emplace_back(::mlir::MemoryEffects::Write::get());
555 }
556}
557
559::mlir::Speculation::Speculatability FeltToIndexOp::getSpeculatability() {
560 return canCastAssertFail(getValue().getType(), getOverflow())
561 ? ::mlir::Speculation::NotSpeculatable
562 : ::mlir::Speculation::Speculatable;
563}
564
565} // namespace llzk::cast
566MLIR_DEFINE_EXPLICIT_TYPE_ID(::llzk::cast::FeltToIndexOp)
568
569namespace llzk::cast {
570
571
572//===----------------------------------------------------------------------===//
573// ::llzk::cast::IntToFeltOp definitions
574//===----------------------------------------------------------------------===//
575
576namespace detail {
577
578IntToFeltOpGenericAdaptorBase::IntToFeltOpGenericAdaptorBase(IntToFeltOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
579
580::llzk::cast::OverflowSemanticsAttr IntToFeltOpGenericAdaptorBase::getOverflowAttr() {
581 auto attr = ::llvm::dyn_cast_or_null<::llzk::cast::OverflowSemanticsAttr>(getProperties().overflow);
582 return attr;
583}
584
589
590
591} // namespace detail
593
594::llvm::LogicalResult IntToFeltOpAdaptor::verify(::mlir::Location loc) {
595 auto tblgen_overflow = getProperties().overflow; (void)tblgen_overflow;
596
597 if (tblgen_overflow && !((::llvm::isa<::llzk::cast::OverflowSemanticsAttr>(tblgen_overflow))))
598 return emitError(loc, "'cast.tofelt' op attribute 'overflow' failed to satisfy constraint: Specifies how a cast handles a source value outside the target's safe range. For a felt target with prime `p`, the safe range is `[0, p-1]`. For an index target with bitwidth `N`, it is `[0, 2^(N-1)-1]`.");
599 return ::mlir::success();
600}
601
602::llvm::LogicalResult IntToFeltOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
603 ::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
604 if (!dict) {
605 emitError() << "expected DictionaryAttr to set properties";
606 return ::mlir::failure();
607 }
608
609 {
610 auto &propStorage = prop.overflow;
611 auto attr = dict.get("overflow");
612 if (attr) {
613 auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
614 if (convertedAttr) {
615 propStorage = convertedAttr;
616 } else {
617 emitError() << "Invalid attribute `overflow` in property conversion: " << attr;
618 return ::mlir::failure();
619 }
620 }
621 }
622 return ::mlir::success();
623}
624
625::mlir::Attribute IntToFeltOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
626 ::mlir::SmallVector<::mlir::NamedAttribute> attrs;
627 ::mlir::Builder odsBuilder{ctx};
628
629 {
630 const auto &propStorage = prop.overflow;
631 if (propStorage)
632 attrs.push_back(odsBuilder.getNamedAttr("overflow",
633 propStorage));
634 }
635
636 if (!attrs.empty())
637 return odsBuilder.getDictionaryAttr(attrs);
638 return {};
639}
640
641llvm::hash_code IntToFeltOp::computePropertiesHash(const Properties &prop) {
642 using llvm::hash_value;
643 return llvm::hash_combine(
644 llvm::hash_value(prop.overflow.getAsOpaquePointer()));
645}
646
647std::optional<mlir::Attribute> IntToFeltOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
648 if (name == "overflow")
649 return prop.overflow;
650 return std::nullopt;
651}
652
653void IntToFeltOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
654 if (name == "overflow") {
655 prop.overflow = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.overflow)>>(value);
656 return;
657 }
658}
659
660void IntToFeltOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
661 if (prop.overflow) attrs.append("overflow", prop.overflow);
662}
663
664::llvm::LogicalResult IntToFeltOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
665 {
666 ::mlir::Attribute attr = attrs.get(getOverflowAttrName(opName));
667 if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_Ops1(attr, "overflow", emitError)))
668 return ::mlir::failure();
669 }
670 return ::mlir::success();
671}
672
673::llvm::LogicalResult IntToFeltOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
674 auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
675 if (::mlir::failed(reader.readOptionalAttribute(prop.overflow)))
676 return ::mlir::failure();
677 return ::mlir::success();
678}
679
680void IntToFeltOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
681 auto &prop = getProperties(); (void)prop;
682
683 writer.writeOptionalAttribute(prop.overflow);
684}
685
687 auto attr = getOverflowAttr();
688 return attr.getValue();
689}
690
692 getProperties().overflow = ::llzk::cast::OverflowSemanticsAttr::get(::mlir::Builder((*this)->getContext()).getContext(), attrValue);
693}
694
695void IntToFeltOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type result, ::llzk::cast::OverflowSemanticsAttr overflow, ::mlir::Value value) {
696 odsState.addOperands(value);
697 if (overflow) {
698 odsState.getOrAddProperties<Properties>().overflow = overflow;
699 }
700 odsState.addTypes(result);
701}
702
703IntToFeltOp IntToFeltOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type result, ::llzk::cast::OverflowSemanticsAttr overflow, ::mlir::Value value) {
704 ::mlir::OperationState __state__(location, getOperationName());
705 build(builder, __state__, std::forward<decltype(result)>(result), std::forward<decltype(overflow)>(overflow), std::forward<decltype(value)>(value));
706 auto __res__ = ::llvm::dyn_cast<IntToFeltOp>(builder.create(__state__));
707 assert(__res__ && "builder didn't return the right type");
708 return __res__;
709}
710
711IntToFeltOp IntToFeltOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type result, ::llzk::cast::OverflowSemanticsAttr overflow, ::mlir::Value value) {
712 return create(builder, builder.getLoc(), std::forward<decltype(result)>(result), std::forward<decltype(overflow)>(overflow), std::forward<decltype(value)>(value));
713}
714
715void IntToFeltOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::llzk::cast::OverflowSemanticsAttr overflow, ::mlir::Value value) {
716 odsState.addOperands(value);
717 if (overflow) {
718 odsState.getOrAddProperties<Properties>().overflow = overflow;
719 }
720
721 ::llvm::SmallVector<::mlir::Type, 2> inferredReturnTypes;
722 if (::mlir::succeeded(IntToFeltOp::inferReturnTypes(odsBuilder.getContext(),
723 odsState.location, odsState.operands,
724 odsState.attributes.getDictionary(odsState.getContext()),
725 odsState.getRawProperties(),
726 odsState.regions, inferredReturnTypes)))
727 odsState.addTypes(inferredReturnTypes);
728 else
729 ::mlir::detail::reportFatalInferReturnTypesError(odsState);
730
731}
732
733IntToFeltOp IntToFeltOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::llzk::cast::OverflowSemanticsAttr overflow, ::mlir::Value value) {
734 ::mlir::OperationState __state__(location, getOperationName());
735 build(builder, __state__, std::forward<decltype(overflow)>(overflow), std::forward<decltype(value)>(value));
736 auto __res__ = ::llvm::dyn_cast<IntToFeltOp>(builder.create(__state__));
737 assert(__res__ && "builder didn't return the right type");
738 return __res__;
739}
740
741IntToFeltOp IntToFeltOp::create(::mlir::ImplicitLocOpBuilder &builder, ::llzk::cast::OverflowSemanticsAttr overflow, ::mlir::Value value) {
742 return create(builder, builder.getLoc(), std::forward<decltype(overflow)>(overflow), std::forward<decltype(value)>(value));
743}
744
745void IntToFeltOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::llzk::cast::OverflowSemanticsAttr overflow, ::mlir::Value value) {
746 odsState.addOperands(value);
747 if (overflow) {
748 odsState.getOrAddProperties<Properties>().overflow = overflow;
749 }
750 assert(resultTypes.size() == 1u && "mismatched number of results");
751 odsState.addTypes(resultTypes);
752}
753
754IntToFeltOp IntToFeltOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::llzk::cast::OverflowSemanticsAttr overflow, ::mlir::Value value) {
755 ::mlir::OperationState __state__(location, getOperationName());
756 build(builder, __state__, std::forward<decltype(resultTypes)>(resultTypes), std::forward<decltype(overflow)>(overflow), std::forward<decltype(value)>(value));
757 auto __res__ = ::llvm::dyn_cast<IntToFeltOp>(builder.create(__state__));
758 assert(__res__ && "builder didn't return the right type");
759 return __res__;
760}
761
762IntToFeltOp IntToFeltOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::llzk::cast::OverflowSemanticsAttr overflow, ::mlir::Value value) {
763 return create(builder, builder.getLoc(), std::forward<decltype(resultTypes)>(resultTypes), std::forward<decltype(overflow)>(overflow), std::forward<decltype(value)>(value));
764}
765
766void IntToFeltOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type result, ::llzk::cast::OverflowSemantics overflow, ::mlir::Value value) {
767 odsState.addOperands(value);
768 odsState.getOrAddProperties<Properties>().overflow = ::llzk::cast::OverflowSemanticsAttr::get(odsBuilder.getContext(), overflow);
769 odsState.addTypes(result);
770}
771
772IntToFeltOp IntToFeltOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type result, ::llzk::cast::OverflowSemantics overflow, ::mlir::Value value) {
773 ::mlir::OperationState __state__(location, getOperationName());
774 build(builder, __state__, std::forward<decltype(result)>(result), std::forward<decltype(overflow)>(overflow), std::forward<decltype(value)>(value));
775 auto __res__ = ::llvm::dyn_cast<IntToFeltOp>(builder.create(__state__));
776 assert(__res__ && "builder didn't return the right type");
777 return __res__;
778}
779
780IntToFeltOp IntToFeltOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type result, ::llzk::cast::OverflowSemantics overflow, ::mlir::Value value) {
781 return create(builder, builder.getLoc(), std::forward<decltype(result)>(result), std::forward<decltype(overflow)>(overflow), std::forward<decltype(value)>(value));
782}
783
784void IntToFeltOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::llzk::cast::OverflowSemantics overflow, ::mlir::Value value) {
785 odsState.addOperands(value);
786 odsState.getOrAddProperties<Properties>().overflow = ::llzk::cast::OverflowSemanticsAttr::get(odsBuilder.getContext(), overflow);
787
788 ::llvm::SmallVector<::mlir::Type, 2> inferredReturnTypes;
789 if (::mlir::succeeded(IntToFeltOp::inferReturnTypes(odsBuilder.getContext(),
790 odsState.location, odsState.operands,
791 odsState.attributes.getDictionary(odsState.getContext()),
792 odsState.getRawProperties(),
793 odsState.regions, inferredReturnTypes)))
794 odsState.addTypes(inferredReturnTypes);
795 else
796 ::mlir::detail::reportFatalInferReturnTypesError(odsState);
797
798}
799
800IntToFeltOp IntToFeltOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::llzk::cast::OverflowSemantics overflow, ::mlir::Value value) {
801 ::mlir::OperationState __state__(location, getOperationName());
802 build(builder, __state__, std::forward<decltype(overflow)>(overflow), std::forward<decltype(value)>(value));
803 auto __res__ = ::llvm::dyn_cast<IntToFeltOp>(builder.create(__state__));
804 assert(__res__ && "builder didn't return the right type");
805 return __res__;
806}
807
808IntToFeltOp IntToFeltOp::create(::mlir::ImplicitLocOpBuilder &builder, ::llzk::cast::OverflowSemantics overflow, ::mlir::Value value) {
809 return create(builder, builder.getLoc(), std::forward<decltype(overflow)>(overflow), std::forward<decltype(value)>(value));
810}
811
812void IntToFeltOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::llzk::cast::OverflowSemantics overflow, ::mlir::Value value) {
813 odsState.addOperands(value);
814 odsState.getOrAddProperties<Properties>().overflow = ::llzk::cast::OverflowSemanticsAttr::get(odsBuilder.getContext(), overflow);
815 assert(resultTypes.size() == 1u && "mismatched number of results");
816 odsState.addTypes(resultTypes);
817}
818
819IntToFeltOp IntToFeltOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::llzk::cast::OverflowSemantics overflow, ::mlir::Value value) {
820 ::mlir::OperationState __state__(location, getOperationName());
821 build(builder, __state__, std::forward<decltype(resultTypes)>(resultTypes), std::forward<decltype(overflow)>(overflow), std::forward<decltype(value)>(value));
822 auto __res__ = ::llvm::dyn_cast<IntToFeltOp>(builder.create(__state__));
823 assert(__res__ && "builder didn't return the right type");
824 return __res__;
825}
826
827IntToFeltOp IntToFeltOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::llzk::cast::OverflowSemantics overflow, ::mlir::Value value) {
828 return create(builder, builder.getLoc(), std::forward<decltype(resultTypes)>(resultTypes), std::forward<decltype(overflow)>(overflow), std::forward<decltype(value)>(value));
829}
830
831void IntToFeltOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) {
832 assert(operands.size() == 1u && "mismatched number of parameters");
833 odsState.addOperands(operands);
834 odsState.addAttributes(attributes);
835 assert(resultTypes.size() == 1u && "mismatched number of return types");
836 odsState.addTypes(resultTypes);
837
838 if (!attributes.empty()) {
839 (void)odsState.getOrAddProperties<IntToFeltOp::Properties>();
840 ::mlir::PropertyRef properties = odsState.getRawProperties();
841 std::optional<::mlir::RegisteredOperationName> info =
842 odsState.name.getRegisteredInfo();
843 if (failed(info->setOpPropertiesFromAttribute(odsState.name, properties,
844 odsState.attributes.getDictionary(odsState.getContext()), nullptr)))
845 ::llvm::report_fatal_error("Property conversion failed.");
846 }
847}
848
849IntToFeltOp IntToFeltOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) {
850 ::mlir::OperationState __state__(location, getOperationName());
851 build(builder, __state__, std::forward<decltype(resultTypes)>(resultTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
852 auto __res__ = ::llvm::dyn_cast<IntToFeltOp>(builder.create(__state__));
853 assert(__res__ && "builder didn't return the right type");
854 return __res__;
855}
856
857IntToFeltOp IntToFeltOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) {
858 return create(builder, builder.getLoc(), std::forward<decltype(resultTypes)>(resultTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
859}
860
861void IntToFeltOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) {
862 assert(operands.size() == 1u && "mismatched number of parameters");
863 odsState.addOperands(operands);
864 odsState.addAttributes(attributes);
865
866 if (!attributes.empty()) {
867 (void)odsState.getOrAddProperties<IntToFeltOp::Properties>();
868 ::mlir::PropertyRef properties = odsState.getRawProperties();
869 std::optional<::mlir::RegisteredOperationName> info =
870 odsState.name.getRegisteredInfo();
871 if (failed(info->setOpPropertiesFromAttribute(odsState.name, properties,
872 odsState.attributes.getDictionary(odsState.getContext()), nullptr)))
873 ::llvm::report_fatal_error("Property conversion failed.");
874 }
875 ::llvm::SmallVector<::mlir::Type, 2> inferredReturnTypes;
876 if (::mlir::succeeded(IntToFeltOp::inferReturnTypes(odsBuilder.getContext(),
877 odsState.location, operands,
878 odsState.attributes.getDictionary(odsState.getContext()),
879 odsState.getRawProperties(),
880 odsState.regions, inferredReturnTypes))) {
881 assert(inferredReturnTypes.size() == 1u && "mismatched number of return types");
882 odsState.addTypes(inferredReturnTypes);
883 } else {
884 ::llvm::report_fatal_error("Failed to infer result type(s).");
885 }
886}
887
888IntToFeltOp IntToFeltOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) {
889 ::mlir::OperationState __state__(location, getOperationName());
890 build(builder, __state__, std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
891 auto __res__ = ::llvm::dyn_cast<IntToFeltOp>(builder.create(__state__));
892 assert(__res__ && "builder didn't return the right type");
893 return __res__;
894}
895
896IntToFeltOp IntToFeltOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) {
897 return create(builder, builder.getLoc(), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
898}
899
900void IntToFeltOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) {
901 assert(operands.size() == 1u && "mismatched number of parameters");
902 odsState.addOperands(operands);
903 odsState.useProperties(const_cast<Properties&>(properties));
904 odsState.addAttributes(discardableAttributes);
905 assert(resultTypes.size() == 1u && "mismatched number of return types");
906 odsState.addTypes(resultTypes);
907}
908
909IntToFeltOp IntToFeltOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) {
910 ::mlir::OperationState __state__(location, getOperationName());
911 build(builder, __state__, std::forward<decltype(resultTypes)>(resultTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(properties)>(properties), std::forward<decltype(discardableAttributes)>(discardableAttributes));
912 auto __res__ = ::llvm::dyn_cast<IntToFeltOp>(builder.create(__state__));
913 assert(__res__ && "builder didn't return the right type");
914 return __res__;
915}
916
917IntToFeltOp IntToFeltOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) {
918 return create(builder, builder.getLoc(), std::forward<decltype(resultTypes)>(resultTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(properties)>(properties), std::forward<decltype(discardableAttributes)>(discardableAttributes));
919}
920
921void IntToFeltOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) {
922 assert(operands.size() == 1u && "mismatched number of parameters");
923 odsState.addOperands(operands);
924 odsState.useProperties(const_cast<Properties &>(properties));
925 odsState.addAttributes(discardableAttributes);
926
927 ::llvm::SmallVector<::mlir::Type, 2> inferredReturnTypes;
928 if (::mlir::succeeded(IntToFeltOp::inferReturnTypes(odsBuilder.getContext(),
929 odsState.location, operands,
930 odsState.attributes.getDictionary(odsState.getContext()),
931 odsState.getRawProperties(),
932 odsState.regions, inferredReturnTypes))) {
933 assert(inferredReturnTypes.size() == 1u && "mismatched number of return types");
934 odsState.addTypes(inferredReturnTypes);
935 } else {
936 ::llvm::report_fatal_error("Failed to infer result type(s).");
937 }
938}
939
940IntToFeltOp IntToFeltOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) {
941 ::mlir::OperationState __state__(location, getOperationName());
942 build(builder, __state__, std::forward<decltype(operands)>(operands), std::forward<decltype(properties)>(properties), std::forward<decltype(discardableAttributes)>(discardableAttributes));
943 auto __res__ = ::llvm::dyn_cast<IntToFeltOp>(builder.create(__state__));
944 assert(__res__ && "builder didn't return the right type");
945 return __res__;
946}
947
948IntToFeltOp IntToFeltOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) {
949 return create(builder, builder.getLoc(), std::forward<decltype(operands)>(operands), std::forward<decltype(properties)>(properties), std::forward<decltype(discardableAttributes)>(discardableAttributes));
950}
951
952void IntToFeltOp::populateDefaultProperties(::mlir::OperationName opName, Properties &properties) {
953 ::mlir::Builder odsBuilder(opName.getContext());
954 if (!properties.overflow)
955 properties.overflow = ::llzk::cast::OverflowSemanticsAttr::get(odsBuilder.getContext(), OverflowSemantics::ASSERT);
956}
957
958::llvm::LogicalResult IntToFeltOp::verifyInvariantsImpl() {
959 auto tblgen_overflow = getProperties().overflow; (void)tblgen_overflow;
960
961 if (::mlir::failed(__mlir_ods_local_attr_constraint_Ops1(*this, tblgen_overflow, "overflow")))
962 return ::mlir::failure();
963 {
964 unsigned index = 0; (void)index;
965 auto valueGroup0 = getODSOperands(0);
966
967 for (auto v : valueGroup0) {
968 if (::mlir::failed(__mlir_ods_local_type_constraint_Ops3(*this, v.getType(), "operand", index++)))
969 return ::mlir::failure();
970 }
971 }
972 {
973 unsigned index = 0; (void)index;
974 auto valueGroup0 = getODSResults(0);
975
976 for (auto v : valueGroup0) {
977 if (::mlir::failed(__mlir_ods_local_type_constraint_Ops1(*this, v.getType(), "result", index++)))
978 return ::mlir::failure();
979 }
980 }
981 return ::mlir::success();
982}
983
984::llvm::LogicalResult IntToFeltOp::verifyInvariants() {
985 return verifyInvariantsImpl();
986}
987
988::llvm::LogicalResult IntToFeltOp::inferReturnTypes(::mlir::MLIRContext *context, ::std::optional<::mlir::Location> location, ::mlir::ValueRange operands, ::mlir::DictionaryAttr attributes, ::mlir::PropertyRef properties, ::mlir::RegionRange regions, ::llvm::SmallVectorImpl<::mlir::Type>&inferredReturnTypes) {
989 inferredReturnTypes.resize(1);
990 ::mlir::Builder odsBuilder(context);
991 ::mlir::Type odsInferredType0 = ::llzk::felt::FeltType::get(odsBuilder.getContext());
992 inferredReturnTypes[0] = odsInferredType0;
993 return ::mlir::success();
994}
995
996::mlir::ParseResult IntToFeltOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) {
997 ::llzk::cast::OverflowSemanticsAttr overflowAttr;
998 ::mlir::OpAsmParser::UnresolvedOperand valueRawOperand{};
999 ::llvm::ArrayRef<::mlir::OpAsmParser::UnresolvedOperand> valueOperands(&valueRawOperand, 1); ::llvm::SMLoc valueOperandsLoc;
1000 (void)valueOperandsLoc;
1001 ::mlir::Type valueRawType{};
1002 ::llvm::ArrayRef<::mlir::Type> valueTypes(&valueRawType, 1);
1003 ::mlir::Type resultRawType{};
1004 ::llvm::ArrayRef<::mlir::Type> resultTypes(&resultRawType, 1);
1005 {
1006 auto odsResult = parseOptionalOverflowSemantics(parser, overflowAttr);
1007 if (odsResult) return ::mlir::failure();
1008 if (overflowAttr)
1009 result.getOrAddProperties<IntToFeltOp::Properties>().overflow = overflowAttr;
1010 }
1011
1012 valueOperandsLoc = parser.getCurrentLocation();
1013 if (parser.parseOperand(valueRawOperand))
1014 return ::mlir::failure();
1015 if (parser.parseColon())
1016 return ::mlir::failure();
1017
1018 {
1019 ::mlir::Type type;
1020 if (parser.parseCustomTypeWithFallback(type))
1021 return ::mlir::failure();
1022 valueRawType = type;
1023 }
1024 {
1025 auto odsResult = parseInferredOrParsedType(parser, resultRawType, false);
1026 if (odsResult) return ::mlir::failure();
1027 }
1028 {
1029 auto loc = parser.getCurrentLocation();(void)loc;
1030 if (parser.parseOptionalAttrDict(result.attributes))
1031 return ::mlir::failure();
1032 if (failed(verifyInherentAttrs(result.name, result.attributes, [&]() {
1033 return parser.emitError(loc) << "'" << result.name.getStringRef() << "' op ";
1034 })))
1035 return ::mlir::failure();
1036 }
1037 result.addTypes(resultTypes);
1038 if (parser.resolveOperands(valueOperands, valueTypes, valueOperandsLoc, result.operands))
1039 return ::mlir::failure();
1040 return ::mlir::success();
1041}
1042
1043void IntToFeltOp::print(::mlir::OpAsmPrinter &_odsPrinter) {
1044 printOptionalOverflowSemantics(_odsPrinter, *this, getOverflowAttr());
1045 _odsPrinter << ' ';
1046 _odsPrinter << getValue();
1047 _odsPrinter << ' ' << ":";
1048 _odsPrinter << ' ';
1049 {
1050 auto type = getValue().getType();
1051 if (auto validType = ::llvm::dyn_cast<::mlir::Type>(type))
1052 _odsPrinter.printStrippedAttrOrType(validType);
1053 else
1054 _odsPrinter << type;
1055 }
1056 printInferredOrParsedType(_odsPrinter, *this, getResult().getType(), false);
1057 ::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs;
1058 elidedAttrs.push_back("overflow");
1059 {
1060 ::mlir::Builder odsBuilder(getContext());
1061 ::mlir::Attribute attr = getOverflowAttr();
1062 if(attr && (attr == ::llzk::cast::OverflowSemanticsAttr::get(odsBuilder.getContext(), OverflowSemantics::ASSERT)))
1063 elidedAttrs.push_back("overflow");
1064 }
1065 _odsPrinter.printOptionalAttrDict((*this)->getAttrs(), elidedAttrs);
1066}
1067
1070 ::llvm::SmallVectorImpl<::mlir::MemoryEffects::EffectInstance> &effects
1071) {
1072 if (canCastAssertFail(getValue().getType(), getOverflow())) {
1073 effects.emplace_back(::mlir::MemoryEffects::Write::get());
1074 }
1075}
1076
1078::mlir::Speculation::Speculatability IntToFeltOp::getSpeculatability() {
1079 return canCastAssertFail(getValue().getType(), getOverflow())
1080 ? ::mlir::Speculation::NotSpeculatable
1081 : ::mlir::Speculation::Speculatable;
1082}
1083
1084} // namespace llzk::cast
1085MLIR_DEFINE_EXPLICIT_TYPE_ID(::llzk::cast::IntToFeltOp)
1087
1088
1089#endif // GET_OP_CLASSES
1090
::llvm::LogicalResult verify(::mlir::Location loc)
Definition Ops.cpp.inc:94
FeltToIndexOpGenericAdaptor(RangeT values, ::mlir::DictionaryAttr attrs, const Properties &properties, ::mlir::RegionRange regions={})
Definition Ops.h.inc:136
FeltToIndexOpAdaptor(FeltToIndexOp op)
Definition Ops.cpp.inc:92
static void populateDefaultProperties(::mlir::OperationName opName, Properties &properties)
Definition Ops.cpp.inc:452
static void populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs)
Definition Ops.cpp.inc:160
::llvm::LogicalResult verifyInvariants()
Definition Ops.cpp.inc:484
::llzk::cast::OverflowSemantics getOverflow()
Definition Ops.cpp.inc:186
::llvm::LogicalResult setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError)
Definition Ops.cpp.inc:102
static void setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value)
Definition Ops.cpp.inc:153
void getEffects(::llvm::SmallVectorImpl<::mlir::SideEffects::EffectInstance<::mlir::MemoryEffects::Effect > > &effects)
Model possible assertion failure as program termination, like bool.assert.
Definition Ops.cpp.inc:550
static FeltToIndexOp create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type result, ::llzk::cast::OverflowSemanticsAttr overflow, ::mlir::Value value)
Definition Ops.cpp.inc:203
static void build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type result, ::llzk::cast::OverflowSemanticsAttr overflow, ::mlir::Value value)
Definition Ops.cpp.inc:195
static llvm::hash_code computePropertiesHash(const Properties &prop)
Definition Ops.cpp.inc:141
::mlir::TypedValue<::llzk::felt::FeltType > getValue()
Definition Ops.h.inc:212
void print(::mlir::OpAsmPrinter &_odsPrinter)
Definition Ops.cpp.inc:533
::mlir::StringAttr getOverflowAttrName()
Definition Ops.h.inc:190
::llzk::cast::OverflowSemanticsAttr getOverflowAttr()
Definition Ops.h.inc:244
FoldAdaptor::Properties Properties
Definition Ops.h.inc:184
::mlir::Operation::result_range getODSResults(unsigned index)
Definition Ops.h.inc:225
void writeProperties(::mlir::DialectBytecodeWriter &writer)
Definition Ops.cpp.inc:180
::llvm::LogicalResult readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state)
Definition Ops.cpp.inc:173
::mlir::Speculation::Speculatability getSpeculatability()
Only infallible casts may execute on paths where they were not present.
Definition Ops.cpp.inc:559
::llvm::LogicalResult inferReturnTypes(::mlir::MLIRContext *context, ::std::optional<::mlir::Location > location, ::mlir::ValueRange operands, ::mlir::DictionaryAttr attributes, ::mlir::PropertyRef properties, ::mlir::RegionRange regions, ::llvm::SmallVectorImpl<::mlir::Type > &inferredReturnTypes)
Definition Ops.cpp.inc:488
::mlir::Attribute getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop)
Definition Ops.cpp.inc:125
static void printOptionalOverflowSemantics(::mlir::OpAsmPrinter &printer, FeltToIndexOp op, ::llzk::cast::OverflowSemanticsAttr overflow)
Definition Ops.cpp:148
void setOverflow(::llzk::cast::OverflowSemantics attrValue)
Definition Ops.cpp.inc:191
::mlir::ParseResult parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result)
Definition Ops.cpp.inc:496
::mlir::Operation::operand_range getODSOperands(unsigned index)
Definition Ops.h.inc:206
::llvm::LogicalResult verifyInvariantsImpl()
Definition Ops.cpp.inc:458
::mlir::ParseResult parseOptionalOverflowSemantics(::mlir::OpAsmParser &parser, ::llzk::cast::OverflowSemanticsAttr &overflow)
Definition Ops.cpp:142
static constexpr ::llvm::StringLiteral getOperationName()
Definition Ops.h.inc:198
::llvm::LogicalResult verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError)
Definition Ops.cpp.inc:164
static std::optional< mlir::Attribute > getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name)
Definition Ops.cpp.inc:147
::llvm::LogicalResult verify(::mlir::Location loc)
Definition Ops.cpp.inc:594
IntToFeltOpAdaptor(IntToFeltOp op)
Definition Ops.cpp.inc:592
IntToFeltOpGenericAdaptor(RangeT values, ::mlir::DictionaryAttr attrs, const Properties &properties, ::mlir::RegionRange regions={})
Definition Ops.h.inc:413
::llvm::LogicalResult verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError)
Definition Ops.cpp.inc:664
static void populateDefaultProperties(::mlir::OperationName opName, Properties &properties)
Definition Ops.cpp.inc:952
void print(::mlir::OpAsmPrinter &_odsPrinter)
Definition Ops.cpp.inc:1043
void setOverflow(::llzk::cast::OverflowSemantics attrValue)
Definition Ops.cpp.inc:691
::llvm::LogicalResult verifyInvariantsImpl()
Definition Ops.cpp.inc:958
::llzk::cast::OverflowSemanticsAttr getOverflowAttr()
Definition Ops.h.inc:522
static void populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs)
Definition Ops.cpp.inc:660
static constexpr ::llvm::StringLiteral getOperationName()
Definition Ops.h.inc:476
::mlir::StringAttr getOverflowAttrName()
Definition Ops.h.inc:468
void getEffects(::llvm::SmallVectorImpl<::mlir::SideEffects::EffectInstance<::mlir::MemoryEffects::Effect > > &effects)
Model possible assertion failure as program termination, like bool.assert.
Definition Ops.cpp.inc:1069
static void build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type result, ::llzk::cast::OverflowSemanticsAttr overflow, ::mlir::Value value)
Definition Ops.cpp.inc:695
::mlir::Attribute getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop)
Definition Ops.cpp.inc:625
::llvm::LogicalResult setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError)
Definition Ops.cpp.inc:602
static llvm::hash_code computePropertiesHash(const Properties &prop)
Definition Ops.cpp.inc:641
static std::optional< mlir::Attribute > getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name)
Definition Ops.cpp.inc:647
FoldAdaptor::Properties Properties
Definition Ops.h.inc:461
static void printOptionalOverflowSemantics(::mlir::OpAsmPrinter &printer, IntToFeltOp op, ::llzk::cast::OverflowSemanticsAttr overflow)
Definition Ops.cpp:118
::mlir::Operation::operand_range getODSOperands(unsigned index)
Definition Ops.h.inc:484
::mlir::ParseResult parseOptionalOverflowSemantics(::mlir::OpAsmParser &parser, ::llzk::cast::OverflowSemanticsAttr &overflow)
Definition Ops.cpp:114
::mlir::TypedValue<::llzk::felt::FeltType > getResult()
Definition Ops.h.inc:509
::mlir::ParseResult parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result)
Definition Ops.cpp.inc:996
::llvm::LogicalResult readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state)
Definition Ops.cpp.inc:673
::llzk::cast::OverflowSemantics getOverflow()
Definition Ops.cpp.inc:686
::mlir::Speculation::Speculatability getSpeculatability()
Only infallible casts may execute on paths where they were not present.
Definition Ops.cpp.inc:1078
static IntToFeltOp create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type result, ::llzk::cast::OverflowSemanticsAttr overflow, ::mlir::Value value)
Definition Ops.cpp.inc:703
void writeProperties(::mlir::DialectBytecodeWriter &writer)
Definition Ops.cpp.inc:680
::mlir::Operation::result_range getODSResults(unsigned index)
Definition Ops.h.inc:503
::llvm::LogicalResult verifyInvariants()
Definition Ops.cpp.inc:984
static void setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value)
Definition Ops.cpp.inc:653
::llvm::LogicalResult inferReturnTypes(::mlir::MLIRContext *context, ::std::optional<::mlir::Location > location, ::mlir::ValueRange operands, ::mlir::DictionaryAttr attributes, ::mlir::PropertyRef properties, ::mlir::RegionRange regions, ::llvm::SmallVectorImpl<::mlir::Type > &inferredReturnTypes)
Definition Ops.cpp.inc:988
::mlir::TypedValue<::mlir::Type > getValue()
Definition Ops.h.inc:490
FeltToIndexOpGenericAdaptorBase(::mlir::DictionaryAttr attrs, const Properties &properties, ::mlir::RegionRange regions={})
Definition Ops.h.inc:107
::std::optional<::mlir::OperationName > odsOpName
Definition Ops.h.inc:103
::llzk::cast::OverflowSemanticsAttr getOverflowAttr()
Definition Ops.cpp.inc:80
::llzk::cast::OverflowSemantics getOverflow()
Definition Ops.cpp.inc:85
::std::optional<::mlir::OperationName > odsOpName
Definition Ops.h.inc:380
::llzk::cast::OverflowSemantics getOverflow()
Definition Ops.cpp.inc:585
::llzk::cast::OverflowSemanticsAttr getOverflowAttr()
Definition Ops.cpp.inc:580
IntToFeltOpGenericAdaptorBase(::mlir::DictionaryAttr attrs, const Properties &properties, ::mlir::RegionRange regions={})
Definition Ops.h.inc:384
static FeltType get(::mlir::MLIRContext *context, ::mlir::StringAttr fieldName)
Definition Types.cpp.inc:69
Common interface for constant parameter-like symbol operations that can be defined within a TemplateO...