LLZK 0.1.0
Veridise's ZK Language IR
Loading...
Searching...
No Matches
Builder.cpp
Go to the documentation of this file.
1//===-- Builder.cpp - C API for op builder ----------------------*- 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//===----------------------------------------------------------------------===//
9
10#include "llzk/CAPI/Builder.h"
11#include "llzk/CAPI/Support.h"
12
13#include "llzk-c/Builder.h"
14
15#include <mlir/CAPI/IR.h>
16#include <mlir/CAPI/Support.h>
17#include <mlir/CAPI/Wrap.h>
18#include <mlir/IR/Builders.h>
19
20using namespace mlir;
21
22using OpBuilderT = OpBuilder;
23
24namespace {
25
26class ListenerT : public OpBuilder::Listener {
27public:
28 ListenerT(MlirNotifyOperationInserted op, MlirNotifyBlockInserted block, void *data)
29 : opInsertedCb(op), blockInsertedCb(block), userData(data) {}
30
31 void notifyOperationInserted(Operation *op) final { opInsertedCb(wrap(op), userData); }
32
33 void notifyBlockCreated(Block *block) final { blockInsertedCb(wrap(block), userData); }
34
35private:
36 MlirNotifyOperationInserted opInsertedCb;
37 MlirNotifyBlockInserted blockInsertedCb;
38 void *userData = nullptr;
39};
40
41} // namespace
42
43//===----------------------------------------------------------------------===//
44// MlirOpBuilder
45//===----------------------------------------------------------------------===//
46
47MlirOpBuilder mlirOpBuilderCreate(MlirContext ctx) {
48 return MlirOpBuilder {.ptr = new OpBuilderT(unwrap(ctx))};
49}
50
51MlirOpBuilder mlirOpBuilderCreateWithListener(MlirContext ctx, MlirOpBuilderListener listener) {
52 auto *l = reinterpret_cast<ListenerT *>(listener.ptr);
53 return MlirOpBuilder {.ptr = new OpBuilderT(unwrap(ctx), l)};
54}
55
56void mlirOpBuilderDestroy(MlirOpBuilder builder) {
57 delete reinterpret_cast<OpBuilderT *>(builder.ptr);
58}
59
60MlirContext mlirOpBuilderGetContext(MlirOpBuilder builder) {
61 return wrap(unwrap(builder)->getContext());
62}
63
64void mlirOpBuilderSetInsertionPointToStart(MlirOpBuilder builder, MlirBlock block) {
65 unwrap(builder)->setInsertionPointToStart(unwrap(block));
66}
67
68MlirOperation mlirOpBuilderGetInsertionPoint(MlirOpBuilder builder) {
69 auto it = unwrap(builder)->getInsertionPoint();
70 auto *blk = unwrap(builder)->getInsertionBlock();
71 if (!blk) {
72 return MlirOperation {nullptr};
73 }
74
75 return wrap(it != blk->end() ? &*it : nullptr);
76}
77
79MlirBlock mlirOpBuilderGetInsertionBlock(MlirOpBuilder builder) {
80 return wrap(unwrap(builder)->getInsertionBlock());
81}
82
83//===----------------------------------------------------------------------===//
84// MlirOpBuilderListener
85//===----------------------------------------------------------------------===//
86
87MlirOpBuilderListener mlirOpBuilderListenerCreate(
88 MlirNotifyOperationInserted opCb, MlirNotifyBlockInserted blockCb, void *userData
89) {
90 return MlirOpBuilderListener {.ptr = new ListenerT(opCb, blockCb, userData)};
91}
92
93void mlirOpBuilderListenerDestroy(MlirOpBuilderListener listener) {
94 delete reinterpret_cast<ListenerT *>(listener.ptr);
95}
void mlirOpBuilderDestroy(MlirOpBuilder builder)
Destroys the given builder.
Definition Builder.cpp:56
MlirOpBuilder mlirOpBuilderCreate(MlirContext ctx)
Definition Builder.cpp:47
MlirOpBuilder mlirOpBuilderCreateWithListener(MlirContext ctx, MlirOpBuilderListener listener)
Definition Builder.cpp:51
void mlirOpBuilderSetInsertionPointToStart(MlirOpBuilder builder, MlirBlock block)
Sets the insertion point to the beginning of the given block.
Definition Builder.cpp:64
MlirOperation mlirOpBuilderGetInsertionPoint(MlirOpBuilder builder)
Returns the current insertion point in the builder.
Definition Builder.cpp:68
OpBuilder OpBuilderT
Definition Builder.cpp:22
void mlirOpBuilderListenerDestroy(MlirOpBuilderListener listener)
Destroys the given listener.
Definition Builder.cpp:93
MlirBlock mlirOpBuilderGetInsertionBlock(MlirOpBuilder builder)
Returns the current insertion block in the builder.
Definition Builder.cpp:79
MlirOpBuilderListener mlirOpBuilderListenerCreate(MlirNotifyOperationInserted opCb, MlirNotifyBlockInserted blockCb, void *userData)
Creates a new mlir::OpBuilder::Listener.
Definition Builder.cpp:87
MlirContext mlirOpBuilderGetContext(MlirOpBuilder builder)
Returns the context.
Definition Builder.cpp:60
void(* MlirNotifyOperationInserted)(MlirOperation, void *)
Definition Builder.h:52
void(* MlirNotifyBlockInserted)(MlirBlock, void *)
Definition Builder.h:53