LLZK 2.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
29class ListenerT : public OpBuilder::Listener {
30public:
31 ListenerT(MlirNotifyOperationInserted op, MlirNotifyBlockInserted block, void *data)
32 : opInsertedCb(op), blockInsertedCb(block), userData(data) {}
33
36 void notifyOperationInserted(Operation *op, OpBuilder::InsertPoint previous) final {
38 .block = wrap(previous.getBlock()), .point = wrap(&*previous.getPoint())
39 };
40 opInsertedCb(wrap(op), i, userData);
41 }
42
45 void notifyBlockInserted(Block *block, Region *previous, Region::iterator previousIt) final {
46 blockInsertedCb(wrap(block), wrap(previous), wrap(&*previousIt), userData);
47 }
48
49private:
50 MlirNotifyOperationInserted opInsertedCb;
51 MlirNotifyBlockInserted blockInsertedCb;
52 void *userData = nullptr;
53};
54
55} // namespace
56
57//===----------------------------------------------------------------------===//
58// MlirOpBuilder
59//===----------------------------------------------------------------------===//
60
62MlirOpBuilder mlirOpBuilderCreate(MlirContext ctx) {
63 return MlirOpBuilder {.ptr = new OpBuilderT(unwrap(ctx))};
64}
65
68MlirOpBuilder mlirOpBuilderCreateWithListener(MlirContext ctx, MlirOpBuilderListener listener) {
69 auto *l = reinterpret_cast<ListenerT *>(listener.ptr);
70 return MlirOpBuilder {.ptr = new OpBuilderT(unwrap(ctx), l)};
71}
72
74void mlirOpBuilderDestroy(MlirOpBuilder builder) {
75 delete reinterpret_cast<OpBuilderT *>(builder.ptr);
76}
77
79MlirContext mlirOpBuilderGetContext(MlirOpBuilder builder) {
80 return wrap(unwrap(builder)->getContext());
81}
82
85void mlirOpBuilderSetInsertionPointToStart(MlirOpBuilder builder, MlirBlock block) {
86 unwrap(builder)->setInsertionPointToStart(unwrap(block));
87}
88
91MlirOperation mlirOpBuilderGetInsertionPoint(MlirOpBuilder builder) {
92 auto it = unwrap(builder)->getInsertionPoint();
93 auto *blk = unwrap(builder)->getInsertionBlock();
94 if (!blk) {
95 return MlirOperation {nullptr};
96 }
97
98 return wrap(it != blk->end() ? &*it : nullptr);
99}
100
103MlirBlock mlirOpBuilderGetInsertionBlock(MlirOpBuilder builder) {
104 return wrap(unwrap(builder)->getInsertionBlock());
105}
106
108MlirOperation mlirOpBuilderInsert(MlirOpBuilder builder, MlirOperation op) {
109 return wrap(unwrap(builder)->insert(unwrap(op)));
110}
111
112//===----------------------------------------------------------------------===//
113// MlirOpBuilderListener
114//===----------------------------------------------------------------------===//
115
119MlirOpBuilderListener mlirOpBuilderListenerCreate(
120 MlirNotifyOperationInserted opCb, MlirNotifyBlockInserted blockCb, void *userData
121) {
122 return MlirOpBuilderListener {.ptr = new ListenerT(opCb, blockCb, userData)};
123}
124
126void mlirOpBuilderListenerDestroy(MlirOpBuilderListener listener) {
127 delete reinterpret_cast<ListenerT *>(listener.ptr);
128}
void mlirOpBuilderDestroy(MlirOpBuilder builder)
Destroys builder and frees the underlying OpBuilder object.
Definition Builder.cpp:74
MlirOpBuilder mlirOpBuilderCreate(MlirContext ctx)
Creates a new OpBuilder for the given MLIR context.
Definition Builder.cpp:62
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:68
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:85
MlirOperation mlirOpBuilderGetInsertionPoint(MlirOpBuilder builder)
Returns the operation before which new operations will be inserted, or a null MlirOperation if there ...
Definition Builder.cpp:91
OpBuilder OpBuilderT
Definition Builder.cpp:23
void mlirOpBuilderListenerDestroy(MlirOpBuilderListener listener)
Destroys listener and frees the underlying ListenerT object.
Definition Builder.cpp:126
MlirBlock mlirOpBuilderGetInsertionBlock(MlirOpBuilder builder)
Returns the block that builder is currently inserting into, or a null MlirBlock if no insertion point...
Definition Builder.cpp:103
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:119
MlirContext mlirOpBuilderGetContext(MlirOpBuilder builder)
Returns the MLIR context associated with builder.
Definition Builder.cpp:79
MlirOperation mlirOpBuilderInsert(MlirOpBuilder builder, MlirOperation op)
Inserts op at the current insertion point of builder and returns it.
Definition Builder.cpp:108
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