builder.h 2.4 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
// Copyright (c) 2023 PaddlePaddle Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#pragma once

#include <list>

19 20
#include "paddle/ir/core/block.h"
#include "paddle/ir/core/operation.h"
21 22 23 24 25 26 27 28

namespace ir {
///
/// \brief Unified interface of the Attribute class. Derivation of all Attribute
/// classes only derives interfaces, not members.
///
class Builder {
 public:
Z
zhangbo9674 已提交
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
  explicit Builder(IrContext *context,
                   Block *block,
                   Block::iterator insert_point)
      : context_(context), block_(block), insert_point_(insert_point) {}

  static Builder AtBlockBegin(IrContext *context, Block *block) {
    return Builder(context, block, block->begin());
  }

  static Builder AtBlockEnd(IrContext *context, Block *block) {
    return Builder(context, block, block->end());
  }

  IrContext *context() const { return context_; }

  Block *block() const { return block_; }

  /// Creates an operation given the fields represented as an OperationState.
47
  Operation *Build(OperationArgument &&argument);
Z
zhangbo9674 已提交
48 49

  /// Creates an operation with the given fields.
50 51 52 53
  Operation *Build(const std::vector<ir::OpResult> &inputs,
                   const AttributeMap &attribute,
                   const std::vector<ir::Type> &output_types,
                   ir::OpInfo op_info);
54 55 56

  /// Create an operation of specific op type at the current insertion point.
  template <typename OpTy, typename... Args>
57
  OpTy Build(Args &&...args) {
58
    OperationArgument argument(context_->GetRegisteredOpInfo(OpTy::name()));
59
    OpTy::Build(*this, argument, std::forward<Args>(args)...);
60
    Operation *op = Build(std::move(argument));
61
    return op->dyn_cast<OpTy>();
62 63 64
  }

 private:
65 66
  Operation *Insert(Operation *op);

67
  IrContext *context_;
Z
zhangbo9674 已提交
68
  Block *block_ = nullptr;
69
  // The insertion point within the list that this builder is inserting before.
Z
zhangbo9674 已提交
70
  Block::iterator insert_point_;
71 72
};
}  // namespace ir