picceler
Loading...
Searching...
No Matches
mlir_gen.h
Go to the documentation of this file.
1#pragma once
2
3#include <mlir/IR/MLIRContext.h>
4#include <unordered_map>
5#include <string>
6#include <vector>
7
8#include "mlir/IR/Builders.h"
9#include "mlir/IR/BuiltinOps.h"
10#include "mlir/IR/Dialect.h"
11#include "mlir/Pass/PassManager.h"
12
13#include "dialect.h"
14#include "types.h"
15#include "parser.h"
16
17namespace picceler {
18
23class MLIRGen {
24public:
25 using GeneratorFunction = std::function<mlir::Value(mlir::Location, const std::vector<mlir::Value> &)>;
26 using VariableTable = std::unordered_map<std::string, mlir::Value>;
27 using NamedVariableTable = std::pair<std::string, VariableTable>;
28
29public:
30 MLIRGen() = delete;
31 MLIRGen(mlir::MLIRContext *context);
32 MLIRGen(const MLIRGen &) = default;
33 MLIRGen &operator=(const MLIRGen &) = default;
34 MLIRGen(MLIRGen &&) = default;
35 MLIRGen &operator=(MLIRGen &&) = default;
36 ~MLIRGen() noexcept;
37
44 mlir::ModuleOp generate(ModuleNode *root, const std::string &sourceFile);
45
46private:
52 void declareUserFunctions(mlir::ModuleOp module, ModuleNode *root);
53
59 void defineUserFunctions(mlir::ModuleOp module, ModuleNode *root);
60
66 std::vector<mlir::Type> getFunctionArgTypes(FunctionNode *funcNode);
67
73 Result<mlir::Value> lookupVariable(const std::string &name) const;
74
80 void declareVariable(const std::string &name, mlir::Value value);
81
86 void enterScope(const std::string &name);
87
91 void exitScope() noexcept;
92
97 void emitStatement(ASTNode *node);
98
103 mlir::Value emitKernel(KernelNode *node);
104 mlir::Value emitExpression(ASTNode *node);
105 mlir::Value emitAssignment(AssignmentNode *node);
106 mlir::Value emitCall(CallNode *node);
107 mlir::Value emitVariable(VariableNode *node);
108 mlir::Value emitString(StringNode *node);
109 mlir::Value emitNumber(NumberNode *node);
110 mlir::Value emitBinaryOp(BinaryOpNode *node);
111 void emitIf(IfNode *node);
112 mlir::Value emitCallExpression(CallNode *node, const std::vector<mlir::Value> &args);
113
117
121 void registerBuiltinFunctions();
122
123private:
124 mlir::MLIRContext *_context;
125 mlir::OpBuilder _builder;
126 std::vector<NamedVariableTable> _scopedVariableTable;
127 std::unordered_map<std::string, GeneratorFunction> _functionTable;
128 std::string _sourceFile;
129};
130
131} // namespace picceler
Abstract Syntax Tree (AST) node base class.
Definition ast.h:20
AST node for assignment statements.
Definition ast.h:136
AST node for binary operations (arithmetic and relational).
Definition ast.h:190
AST node for function calls.
Definition ast.h:154
AST node for function definitions.
Definition ast.h:63
AST node for if conditional statements.
Definition ast.h:210
AST node for kernel definitions.
Definition ast.h:174
std::pair< std::string, VariableTable > NamedVariableTable
Definition mlir_gen.h:27
MLIRGen & operator=(const MLIRGen &)=default
MLIRGen(const MLIRGen &)=default
~MLIRGen() noexcept
Definition mlir_gen.cpp:115
std::function< mlir::Value(mlir::Location, const std::vector< mlir::Value > &)> GeneratorFunction
Definition mlir_gen.h:25
mlir::ModuleOp generate(ModuleNode *root, const std::string &sourceFile)
Generates MLIR code from the given AST root node.
Definition mlir_gen.cpp:193
MLIRGen(MLIRGen &&)=default
MLIRGen & operator=(MLIRGen &&)=default
std::unordered_map< std::string, mlir::Value > VariableTable
Definition mlir_gen.h:26
AST node for the entire module.
Definition ast.h:43
AST node for numeric literals.
Definition ast.h:121
AST node for string literals.
Definition ast.h:106
AST node for variable references.
Definition ast.h:88
Picceler MLIR dialect declarations.
Definition ast.h:11
std::expected< T, CompileError > Result
A type alias for the result of a compilation operation.
Definition error.h:59
Picceler MLIR type declarations, it includes piccelerTypes.h.inc, which is generated by MLIR TableGen...