LLZK 3.0.0
An open-source IR for Zero Knowledge (ZK) circuits
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
12#include "llzk-c/Builder.h"
13
14#include "llzk/CAPI/Support.h"
15
16#include <mlir/CAPI/IR.h>
17#include <mlir/CAPI/Support.h>
18#include <mlir/CAPI/Wrap.h>
19#include <mlir/IR/Builders.h>
20
21using namespace mlir;
22
23using OpBuilderT = OpBuilder;
24
25namespace {
26
28static MlirOpBuilderInsertPoint wrapInsertPoint(OpBuilder::InsertPoint point) {
29 auto *block = point.getBlock();
30 if (!block) {
31 return {.block = {.ptr = nullptr}, .point = {.ptr = nullptr}};
32 }
33
34 if (point.getPoint() == block->end()) {
35 return {.block = wrap(block), .point = {.ptr = nullptr}};
36 }
37
38 return {.block = wrap(block), .point = wrap(&*point.getPoint())};
39}
40
43class ListenerT : public OpBuilder::Listener {
44public:
45 ListenerT(MlirNotifyOperationInserted op, MlirNotifyBlockInserted block, void *data)
46 : opInsertedCb(op), blockInsertedCb(block), userData(data) {}
47
50 void notifyOperationInserted(Operation *op, OpBuilder::InsertPoint previous) final {
51 opInsertedCb(wrap(op), wrapInsertPoint(previous), userData);
52 }
53
56 void notifyBlockInserted(Block *block, Region *previous, Region::iterator previousIt) final {
57 blockInsertedCb(
58 wrap(block), wrap(previous),
59 (!previous || previous->end() == previousIt) ? MlirBlock {.ptr = nullptr}
60 : wrap(&*previousIt),
61 userData
62 );
63 }
64
65private:
66 MlirNotifyOperationInserted opInsertedCb;
67 MlirNotifyBlockInserted blockInsertedCb;
68 void *userData = nullptr;
69};
70
71} // namespace
72
73//===----------------------------------------------------------------------===//
74// MlirOpBuilder
75//===----------------------------------------------------------------------===//
76
78MlirOpBuilder mlirOpBuilderCreate(MlirContext ctx) {
79 return MlirOpBuilder {.ptr = new OpBuilderT(unwrap(ctx))};
80}
81
84MlirOpBuilder mlirOpBuilderCreateWithListener(MlirContext ctx, MlirOpBuilderListener listener) {
85 auto *l = reinterpret_cast<ListenerT *>(listener.ptr);
86 return MlirOpBuilder {.ptr = new OpBuilderT(unwrap(ctx), l)};
87}
88
90void mlirOpBuilderDestroy(MlirOpBuilder builder) {
91 delete reinterpret_cast<OpBuilderT *>(builder.ptr);
92}
93
95MlirContext mlirOpBuilderGetContext(MlirOpBuilder builder) {
96 return wrap(unwrap(builder)->getContext());
97}
98
101void mlirOpBuilderSetInsertionPointToStart(MlirOpBuilder builder, MlirBlock block) {
102 unwrap(builder)->setInsertionPointToStart(unwrap(block));
103}
104
106void mlirOpBuilderSetInsertionPointToEnd(MlirOpBuilder builder, MlirBlock block) {
107 unwrap(builder)->setInsertionPointToEnd(unwrap(block));
108}
109
111void mlirOpBuilderSetInsertionPoint(MlirOpBuilder builder, MlirOperation operation) {
112 unwrap(builder)->setInsertionPoint(unwrap(operation));
113}
114
116void mlirOpBuilderSetInsertionPointAfter(MlirOpBuilder builder, MlirOperation operation) {
117 unwrap(builder)->setInsertionPointAfter(unwrap(operation));
118}
119
121void mlirOpBuilderSetInsertionPointAfterValue(MlirOpBuilder builder, MlirValue value) {
122 unwrap(builder)->setInsertionPointAfterValue(unwrap(value));
123}
124
127 return wrapInsertPoint(unwrap(builder)->saveInsertionPoint());
128}
129
132 auto *block = unwrap(rawIp.block);
133 if (!block) {
134 OpBuilderT::InsertPoint ip;
135 unwrap(builder)->restoreInsertionPoint(ip);
136 } else {
137 Block::iterator it = rawIp.point.ptr ? Block::iterator(unwrap(rawIp.point)) : block->end();
138 OpBuilderT::InsertPoint ip(block, it);
139 unwrap(builder)->restoreInsertionPoint(ip);
140 }
141}
142
144void mlirOpBuilderClearInsertionPoint(MlirOpBuilder builder) {
145 unwrap(builder)->clearInsertionPoint();
146}
147
150MlirOperation mlirOpBuilderGetInsertionPoint(MlirOpBuilder builder) {
151 auto it = unwrap(builder)->getInsertionPoint();
152 auto *blk = unwrap(builder)->getInsertionBlock();
153 if (!blk) {
154 return MlirOperation {nullptr};
155 }
156
157 return wrap(it != blk->end() ? &*it : nullptr);
158}
159
162MlirBlock mlirOpBuilderGetInsertionBlock(MlirOpBuilder builder) {
163 return wrap(unwrap(builder)->getInsertionBlock());
164}
165
167MlirOperation mlirOpBuilderInsert(MlirOpBuilder builder, MlirOperation op) {
168 return wrap(unwrap(builder)->insert(unwrap(op)));
169}
170
171//===----------------------------------------------------------------------===//
172// MlirOpBuilderListener
173//===----------------------------------------------------------------------===//
174
178MlirOpBuilderListener mlirOpBuilderListenerCreate(
179 MlirNotifyOperationInserted opCb, MlirNotifyBlockInserted blockCb, void *userData
180) {
181 return MlirOpBuilderListener {.ptr = new ListenerT(opCb, blockCb, userData)};
182}
183
185void mlirOpBuilderListenerDestroy(MlirOpBuilderListener listener) {
186 delete reinterpret_cast<ListenerT *>(listener.ptr);
187}
void mlirOpBuilderRestoreInsertionPoint(MlirOpBuilder builder, MlirOpBuilderInsertPoint rawIp)
Restore the insert point to a previously saved point.
Definition Builder.cpp:131
void mlirOpBuilderDestroy(MlirOpBuilder builder)
Destroys builder and frees the underlying OpBuilder object.
Definition Builder.cpp:90
void mlirOpBuilderClearInsertionPoint(MlirOpBuilder builder)
Reset the insertion point to no location.
Definition Builder.cpp:144
MlirOpBuilder mlirOpBuilderCreate(MlirContext ctx)
Creates a new OpBuilder for the given MLIR context.
Definition Builder.cpp:78
MlirOpBuilder mlirOpBuilderCreateWithListener(MlirContext ctx, MlirOpBuilderListener listener)
Creates a new OpBuilder for the given MLIR context and attaches listener so that operation and block ...
Definition Builder.cpp:84
void mlirOpBuilderSetInsertionPointToStart(MlirOpBuilder builder, MlirBlock block)
Sets the insertion point of builder to the beginning of block so that subsequent insertions prepend t...
Definition Builder.cpp:101
MlirOpBuilderInsertPoint mlirOpBuilderSaveInsertionPoint(MlirOpBuilder builder)
Return a saved insertion point.
Definition Builder.cpp:126
void mlirOpBuilderSetInsertionPointAfter(MlirOpBuilder builder, MlirOperation operation)
Sets the insertion point right after the given operation.
Definition Builder.cpp:116
MlirOperation mlirOpBuilderGetInsertionPoint(MlirOpBuilder builder)
Returns the operation before which new operations will be inserted, or a null MlirOperation if there ...
Definition Builder.cpp:150
OpBuilder OpBuilderT
Definition Builder.cpp:23
void mlirOpBuilderSetInsertionPointToEnd(MlirOpBuilder builder, MlirBlock block)
Sets the insertion point to the end of the given block.
Definition Builder.cpp:106
void mlirOpBuilderListenerDestroy(MlirOpBuilderListener listener)
Destroys listener and frees the underlying ListenerT object.
Definition Builder.cpp:185
MlirBlock mlirOpBuilderGetInsertionBlock(MlirOpBuilder builder)
Returns the block that builder is currently inserting into, or a null MlirBlock if no insertion point...
Definition Builder.cpp:162
void mlirOpBuilderSetInsertionPoint(MlirOpBuilder builder, MlirOperation operation)
Sets the insertion point right before the given operation.
Definition Builder.cpp:111
MlirOpBuilderListener mlirOpBuilderListenerCreate(MlirNotifyOperationInserted opCb, MlirNotifyBlockInserted blockCb, void *userData)
Creates a new OpBuilder::Listener that calls opCb whenever an operation is inserted and blockCb whene...
Definition Builder.cpp:178
MlirContext mlirOpBuilderGetContext(MlirOpBuilder builder)
Returns the MLIR context associated with builder.
Definition Builder.cpp:95
MlirOperation mlirOpBuilderInsert(MlirOpBuilder builder, MlirOperation op)
Inserts op at the current insertion point of builder and returns it.
Definition Builder.cpp:167
void mlirOpBuilderSetInsertionPointAfterValue(MlirOpBuilder builder, MlirValue value)
Sets the insertion point right after the given value is defined.
Definition Builder.cpp:121
void(* MlirNotifyOperationInserted)(MlirOperation, MlirOpBuilderInsertPoint, void *)
Callback type for listening to operation insertions in an mlir::OpBuilder.
Definition Builder.h:50
void(* MlirNotifyBlockInserted)(MlirBlock, MlirRegion, MlirBlock, void *)
Callback type for listening to block insertions in an mlir::OpBuilder.
Definition Builder.h:52
Current insertion point of an mlir::OpBuilder instance represented as a block and an operation within...
Definition Builder.h:41
MlirOperation point
The operation that the builder is inserting before.
Definition Builder.h:45
MlirBlock block
The block that the builder is inserting into.
Definition Builder.h:43