Skip to content

Commit 5b19aac

Browse files
committed
Example of how we can emit the buffer_map in cpp
1 parent 3fca2a4 commit 5b19aac

File tree

2 files changed

+46
-11
lines changed

2 files changed

+46
-11
lines changed

mlir/lib/Target/Cpp/TranslateToCpp.cpp

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "mlir/Dialect/ControlFlow/IR/ControlFlowOps.h"
1010
#include "mlir/Dialect/EmitC/IR/EmitC.h"
1111
#include "mlir/Dialect/Func/IR/FuncOps.h"
12+
#include "mlir/IR/Attributes.h"
1213
#include "mlir/IR/BuiltinOps.h"
1314
#include "mlir/IR/BuiltinTypes.h"
1415
#include "mlir/IR/Dialect.h"
@@ -24,6 +25,7 @@
2425
#include "llvm/ADT/TypeSwitch.h"
2526
#include "llvm/Support/Debug.h"
2627
#include "llvm/Support/FormatVariadic.h"
28+
#include "llvm/Support/LogicalResult.h"
2729
#include <stack>
2830
#include <utility>
2931

@@ -1038,6 +1040,28 @@ static LogicalResult printOperation(CppEmitter &emitter,
10381040
return success();
10391041
}
10401042

1043+
static LogicalResult printOperation(CppEmitter &emitter,
1044+
BufferMapOp bufferMapOp) {
1045+
raw_indented_ostream &os = emitter.ostream();
1046+
os << "const std::map<std::string, char*> _buffer_map {\n";
1047+
os.indent();
1048+
auto buf = bufferMapOp.getFields();
1049+
for (auto field : *buf) {
1050+
os << "{ \"" << field << "\", reinterpret_cast<char*>(&" << field
1051+
<< ") },\n";
1052+
}
1053+
os.unindent();
1054+
os << "};\n";
1055+
1056+
os << "char* getBufferForName(const std::string& name) const {\n";
1057+
os.indent();
1058+
os << "auto it = _buffer_map.find(name);\n";
1059+
os << "return (it == _buffer_map.end()) ? nullptr : it->second;\n";
1060+
os.unindent();
1061+
os << "}\n";
1062+
return success();
1063+
}
1064+
10411065
static LogicalResult printOperation(CppEmitter &emitter, FileOp file) {
10421066
if (!emitter.shouldEmitFile(file))
10431067
return success();
@@ -1645,17 +1669,17 @@ LogicalResult CppEmitter::emitOperation(Operation &op, bool trailingSemicolon) {
16451669
.Case<emitc::AddOp, emitc::ApplyOp, emitc::AssignOp,
16461670
emitc::BitwiseAndOp, emitc::BitwiseLeftShiftOp,
16471671
emitc::BitwiseNotOp, emitc::BitwiseOrOp,
1648-
emitc::BitwiseRightShiftOp, emitc::BitwiseXorOp, emitc::CallOp,
1649-
emitc::CallOpaqueOp, emitc::CastOp, emitc::ClassOp,
1650-
emitc::CmpOp, emitc::ConditionalOp, emitc::ConstantOp,
1651-
emitc::DeclareFuncOp, emitc::DivOp, emitc::ExpressionOp,
1652-
emitc::FieldOp, emitc::FileOp, emitc::ForOp, emitc::FuncOp,
1653-
emitc::GetFieldOp, emitc::GlobalOp, emitc::IfOp,
1654-
emitc::IncludeOp, emitc::LoadOp, emitc::LogicalAndOp,
1655-
emitc::LogicalNotOp, emitc::LogicalOrOp, emitc::MulOp,
1656-
emitc::RemOp, emitc::ReturnOp, emitc::SubOp, emitc::SwitchOp,
1657-
emitc::UnaryMinusOp, emitc::UnaryPlusOp, emitc::VariableOp,
1658-
emitc::VerbatimOp>(
1672+
emitc::BitwiseRightShiftOp, emitc::BitwiseXorOp,
1673+
emitc::BufferMapOp, emitc::CallOp, emitc::CallOpaqueOp,
1674+
emitc::CastOp, emitc::ClassOp, emitc::CmpOp,
1675+
emitc::ConditionalOp, emitc::ConstantOp, emitc::DeclareFuncOp,
1676+
emitc::DivOp, emitc::ExpressionOp, emitc::FieldOp,
1677+
emitc::FileOp, emitc::ForOp, emitc::FuncOp, emitc::GetFieldOp,
1678+
emitc::GlobalOp, emitc::IfOp, emitc::IncludeOp, emitc::LoadOp,
1679+
emitc::LogicalAndOp, emitc::LogicalNotOp, emitc::LogicalOrOp,
1680+
emitc::MulOp, emitc::RemOp, emitc::ReturnOp, emitc::SubOp,
1681+
emitc::SwitchOp, emitc::UnaryMinusOp, emitc::UnaryPlusOp,
1682+
emitc::VariableOp, emitc::VerbatimOp>(
16591683

16601684
[&](auto op) { return printOperation(*this, op); })
16611685
// Func ops.

mlir/test/mlir-translate/emitc_classops.mlir

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
emitc.class @modelClass {
44
emitc.field @fieldName0 : !emitc.array<1xf32>
55
emitc.field @fieldName1 : !emitc.array<1xf32>
6+
emitc.buffer_map ["another_feature", "some_feature", "output_0"]
67
emitc.func @execute() {
78
%0 = "emitc.constant"() <{value = 0 : index}> : () -> !emitc.size_t
89
%1 = get_field @fieldName0 : !emitc.array<1xf32>
@@ -16,6 +17,16 @@ emitc.class @modelClass {
1617
// CHECK-NEXT: public:
1718
// CHECK-NEXT: float[1] fieldName0;
1819
// CHECK-NEXT: float[1] fieldName1;
20+
// CHECK-NEXT: const std::map<std::string, char*> _buffer_map {
21+
// CHECK-NEXT: { ""another_feature"", reinterpret_cast<char*>(&"another_feature") },
22+
// CHECK-NEXT: { ""some_feature"", reinterpret_cast<char*>(&"some_feature") },
23+
// CHECK-NEXT: { ""output_0"", reinterpret_cast<char*>(&"output_0") },
24+
// CHECK-NEXT: };
25+
// CHECK-NEXT: char* getBufferForName(const std::string& name) const {
26+
// CHECK-NEXT: auto it = _buffer_map.find(name);
27+
// CHECK-NEXT: return (it == _buffer_map.end()) ? nullptr : it->second;
28+
// CHECK-NEXT: }
29+
// CHECK-EMPTY:
1930
// CHECK-NEXT: void execute() {
2031
// CHECK-NEXT: size_t v1 = 0;
2132
// CHECK-NEXT: float[1] v2 = fieldName0;

0 commit comments

Comments
 (0)