//===- PDLInterp.cpp - PDL Interpreter Dialect ------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "mlir/Dialect/PDLInterp/IR/PDLInterp.h" #include "mlir/Dialect/PDL/IR/PDLTypes.h" #include "mlir/IR/BuiltinTypes.h" #include "mlir/IR/DialectImplementation.h" using namespace mlir; using namespace mlir::pdl_interp; //===----------------------------------------------------------------------===// // PDLInterp Dialect //===----------------------------------------------------------------------===// void PDLInterpDialect::initialize() { addOperations< #define GET_OP_LIST #include "mlir/Dialect/PDLInterp/IR/PDLInterpOps.cpp.inc" >(); } //===----------------------------------------------------------------------===// // pdl_interp::CreateOperationOp //===----------------------------------------------------------------------===// static ParseResult parseCreateOperationOp(OpAsmParser &p, OperationState &state) { if (p.parseOptionalAttrDict(state.attributes)) return failure(); Builder &builder = p.getBuilder(); // Parse the operation name. StringAttr opName; if (p.parseAttribute(opName, "name", state.attributes)) return failure(); // Parse the operands. SmallVector operands; if (p.parseLParen() || p.parseOperandList(operands) || p.parseRParen() || p.resolveOperands(operands, builder.getType(), state.operands)) return failure(); // Parse the attributes. SmallVector attrNames; if (succeeded(p.parseOptionalLBrace())) { SmallVector attrOps; do { StringAttr nameAttr; OpAsmParser::OperandType operand; if (p.parseAttribute(nameAttr) || p.parseEqual() || p.parseOperand(operand)) return failure(); attrNames.push_back(nameAttr); attrOps.push_back(operand); } while (succeeded(p.parseOptionalComma())); if (p.parseRBrace() || p.resolveOperands(attrOps, builder.getType(), state.operands)) return failure(); } state.addAttribute("attributeNames", builder.getArrayAttr(attrNames)); state.addTypes(builder.getType()); // Parse the result types. SmallVector opResultTypes; if (p.parseArrow()) return failure(); if (succeeded(p.parseOptionalLParen())) { if (p.parseRParen()) return failure(); } else if (p.parseOperandList(opResultTypes) || p.resolveOperands(opResultTypes, builder.getType(), state.operands)) { return failure(); } int32_t operandSegmentSizes[] = {static_cast(operands.size()), static_cast(attrNames.size()), static_cast(opResultTypes.size())}; state.addAttribute("operand_segment_sizes", builder.getI32VectorAttr(operandSegmentSizes)); return success(); } static void print(OpAsmPrinter &p, CreateOperationOp op) { p << "pdl_interp.create_operation "; p.printOptionalAttrDict(op.getAttrs(), {"attributeNames", "name", "operand_segment_sizes"}); p << '"' << op.name() << "\"(" << op.operands() << ')'; // Emit the optional attributes. ArrayAttr attrNames = op.attributeNames(); if (!attrNames.empty()) { Operation::operand_range attrArgs = op.attributes(); p << " {"; interleaveComma(llvm::seq(0, attrNames.size()), p, [&](int i) { p << attrNames[i] << " = " << attrArgs[i]; }); p << '}'; } // Print the result type constraints of the operation. auto types = op.types(); if (types.empty()) p << " -> ()"; else p << " -> " << op.types(); } //===----------------------------------------------------------------------===// // TableGen Auto-Generated Op and Interface Definitions //===----------------------------------------------------------------------===// #define GET_OP_CLASSES #include "mlir/Dialect/PDLInterp/IR/PDLInterpOps.cpp.inc"