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, OpBuilder::InsertPoint previous) final {
33 .block = wrap(previous.getBlock()), .point = wrap(&*previous.getPoint())
34 };
35 opInsertedCb(wrap(op), i, userData);
36 }
37
38 void notifyBlockInserted(Block *block, Region *previous, Region::iterator previousIt) final {
39 blockInsertedCb(wrap(block), wrap(previous), wrap(&*previousIt), userData);
40 }
41
42private:
43 MlirNotifyOperationInserted opInsertedCb;
44 MlirNotifyBlockInserted blockInsertedCb;
45 void *userData = nullptr;
46};
47
48} // namespace
49
50//===----------------------------------------------------------------------===//
51// MlirOpBuilder
52//===----------------------------------------------------------------------===//
53
54MlirOpBuilder mlirOpBuilderCreate(MlirContext ctx) {
55 return MlirOpBuilder {.ptr = new OpBuilderT(unwrap(ctx))};
56}
57
58MlirOpBuilder mlirOpBuilderCreateWithListener(MlirContext ctx, MlirOpBuilderListener listener) {
59 auto *l = reinterpret_cast<ListenerT *>(listener.ptr);
60 return MlirOpBuilder {.ptr = new OpBuilderT(unwrap(ctx), l)};
61}
62
63void mlirOpBuilderDestroy(MlirOpBuilder builder) {
64 delete reinterpret_cast<OpBuilderT *>(builder.ptr);
65}
66
67MlirContext mlirOpBuilderGetContext(MlirOpBuilder builder) {
68 return wrap(unwrap(builder)->getContext());
69}
70
71void mlirOpBuilderSetInsertionPointToStart(MlirOpBuilder builder, MlirBlock block) {
72 unwrap(builder)->setInsertionPointToStart(unwrap(block));
73}
74
75MlirOperation mlirOpBuilderGetInsertionPoint(MlirOpBuilder builder) {
76 auto it = unwrap(builder)->getInsertionPoint();
77 auto *blk = unwrap(builder)->getInsertionBlock();
78 if (!blk) {
79 return MlirOperation {nullptr};
80 }
81
82 return wrap(it != blk->end() ? &*it : nullptr);
83}
84
86MlirBlock mlirOpBuilderGetInsertionBlock(MlirOpBuilder builder) {
87 return wrap(unwrap(builder)->getInsertionBlock());
88}
89
90//===----------------------------------------------------------------------===//
91// MlirOpBuilderListener
92//===----------------------------------------------------------------------===//
93
94MlirOpBuilderListener mlirOpBuilderListenerCreate(
95 MlirNotifyOperationInserted opCb, MlirNotifyBlockInserted blockCb, void *userData
96) {
97 return MlirOpBuilderListener {.ptr = new ListenerT(opCb, blockCb, userData)};
98}
99
100void mlirOpBuilderListenerDestroy(MlirOpBuilderListener listener) {
101 delete reinterpret_cast<ListenerT *>(listener.ptr);
102}
void mlirOpBuilderDestroy(MlirOpBuilder builder)
Destroys the given builder.
Definition Builder.cpp:63
MlirOpBuilder mlirOpBuilderCreate(MlirContext ctx)
Definition Builder.cpp:54
MlirOpBuilder mlirOpBuilderCreateWithListener(MlirContext ctx, MlirOpBuilderListener listener)
Definition Builder.cpp:58
void mlirOpBuilderSetInsertionPointToStart(MlirOpBuilder builder, MlirBlock block)
Sets the insertion point to the beginning of the given block.
Definition Builder.cpp:71
MlirOperation mlirOpBuilderGetInsertionPoint(MlirOpBuilder builder)
Returns the current insertion point in the builder.
Definition Builder.cpp:75
OpBuilder OpBuilderT
Definition Builder.cpp:22
void mlirOpBuilderListenerDestroy(MlirOpBuilderListener listener)
Destroys the given listener.
Definition Builder.cpp:100
MlirBlock mlirOpBuilderGetInsertionBlock(MlirOpBuilder builder)
Returns the current insertion block in the builder.
Definition Builder.cpp:86
MlirOpBuilderListener mlirOpBuilderListenerCreate(MlirNotifyOperationInserted opCb, MlirNotifyBlockInserted blockCb, void *userData)
Creates a new mlir::OpBuilder::Listener.
Definition Builder.cpp:94
MlirContext mlirOpBuilderGetContext(MlirOpBuilder builder)
Returns the context.
Definition Builder.cpp:67
void(* MlirNotifyOperationInserted)(MlirOperation, MlirOpBuilderInsertPoint, void *)
Definition Builder.h:42
void(* MlirNotifyBlockInserted)(MlirBlock, MlirRegion, MlirBlock, void *)
Definition Builder.h:43