0 | {--
 1 | Copyright (C) 2025  Joel Berkeley
 2 |
 3 | This program is free software: you can redistribute it and/or modify
 4 | it under the terms of the GNU Affero General Public License as published
 5 | by the Free Software Foundation, either version 3 of the License, or
 6 | (at your option) any later version.
 7 |
 8 | This program is distributed in the hope that it will be useful,
 9 | but WITHOUT ANY WARRANTY; without even the implied warranty of
10 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 | GNU Affero General Public License for more details.
12 |
13 | You should have received a copy of the GNU Affero General Public License
14 | along with this program.  If not, see <https://www.gnu.org/licenses/>.
15 | --}
16 | ||| For internal spidr use only.
17 | module Compiler.MLIR.IR.Builders
18 |
19 | import Compiler.MLIR.IR.Block
20 | import Compiler.MLIR.IR.BuiltinTypes
21 | import Compiler.MLIR.IR.MLIRContext
22 | import Compiler.MLIR.IR.Operation
23 | import Compiler.MLIR.IR.Types
24 | import Compiler.FFI
25 |
26 | ffi : String -> String
27 | ffi = libxla "c/mlir/IR/Builders.h"
28 |
29 | public export
30 | data OpBuilder = MkOpBuilder GCAnyPtr
31 |
32 | %foreign (ffi "OpBuilder_delete")
33 | prim__deleteOpBuilder : AnyPtr -> PrimIO ()
34 |
35 | %foreign (ffi "OpBuilder_atBlockEnd")
36 | prim__opBuilderAtBlockEnd : AnyPtr -> PrimIO AnyPtr
37 |
38 | export
39 | atBlockEnd : HasIO io => Block -> io OpBuilder
40 | atBlockEnd (MkBlock block) = do
41 |   builder <- primIO $ prim__opBuilderAtBlockEnd block
42 |   builder <- onCollectAny' builder (primIO . prim__deleteOpBuilder)
43 |   pure (MkOpBuilder builder)
44 |