#pragma once #include "mlir/IR/Operation.h" #include "mlir/Support/LogicalResult.h" #include "llvm/ADT/SmallVector.h" #include #include "src/Accelerators/PIM/Common/IR/AddressAnalysis.hpp" namespace onnx_mlir { enum class CompiledCoreOpKind : uint8_t { Load, Store, Lmv, VMV, Receive, Send, Wait, Sync, Concat, Vmm, VVAdd, VVSub, VVMul, VVMax, VVDMul, VAvg, VRelu, VTanh, VSigm, VSoftmax }; struct CompiledCoreNode { enum class Kind : uint8_t { Op, Loop, If, IndexSwitch }; Kind kind = Kind::Op; mlir::Operation* op = nullptr; CompiledCoreOpKind opKind = CompiledCoreOpKind::Load; CompiledIndexExpr lowerBound; CompiledIndexExpr upperBound; CompiledIndexExpr step; CompiledIndexExpr condition; std::unique_ptr> loopBody; std::unique_ptr> thenBody; std::unique_ptr> elseBody; llvm::SmallVector caseValues; llvm::SmallVector>> caseBodies; std::unique_ptr> defaultBody; }; struct CompiledCoreProgram { llvm::SmallVector nodes; }; mlir::LogicalResult compileCoreProgram(mlir::Operation* coreLikeOp, CompiledCoreProgram& program); } // namespace onnx_mlir