14 #ifndef CIRCT_CONVERSION_CFTOHANDSHAKE_H_
15 #define CIRCT_CONVERSION_CFTOHANDSHAKE_H_
20 #include "mlir/Transforms/DialectConversion.h"
38 llvm::function_ref<LogicalResult(Region &, ConversionPatternRewriter &)>;
42 MLIRContext *ctx, Region &r);
60 using BlockOps = DenseMap<Block *, std::vector<MergeOpInfo>>;
63 llvm::MapVector<Value, std::vector<Operation *>>;
67 LogicalResult
addMergeOps(ConversionPatternRewriter &rewriter);
68 LogicalResult
addBranchOps(ConversionPatternRewriter &rewriter);
71 template <
typename TSrcTerm,
typename TDstTerm>
74 assert(entryCtrl.getType().isa<NoneType>() &&
75 "Expected NoneType for entry control value");
77 Block *entryBlock = &
r.front();
82 for (
auto retOp : llvm::make_early_inc_range(
r.getOps<TSrcTerm>())) {
83 rewriter.setInsertionPoint(retOp);
84 SmallVector<Value, 8> operands(retOp->getOperands());
85 operands.push_back(entryCtrl);
86 rewriter.replaceOpWithNewOp<TDstTerm>(retOp, operands);
90 DenseMap<Block *, unsigned> numArgsPerBlock;
91 for (
auto &block :
r.getBlocks())
92 numArgsPerBlock[&block] = block.getNumArguments();
103 for (
auto &[block, numArgs] : numArgsPerBlock)
104 if (block->getNumArguments() != numArgs)
111 bool sourceConstants);
117 ConversionPatternRewriter &rewriter);
122 ConversionPatternRewriter &rewriter);
134 ArrayRef<Operation *> memOps, Operation *memOp,
135 int offset, ArrayRef<int> cntrlInd);
165 template <
typename T,
typename... TArgs,
typename... TArgs2>
168 LogicalResult (T::*memberFunc)(ConversionPatternRewriter &, TArgs2...),
171 [&](Region &, ConversionPatternRewriter &rewriter) -> LogicalResult {
172 return (instance.*memberFunc)(rewriter, args...);
174 instance.getContext(), instance.getRegion());
187 template <
typename TSrcTerm,
typename TDstTerm>
189 bool disableTaskPipelining, Value entryCtrl) {
198 hl, &HandshakeLowering::setControlOnlyPath<TSrcTerm, TDstTerm>,
211 if (!disableTaskPipelining) {
242 std::unique_ptr<mlir::OperationPass<mlir::ModuleOp>>
245 std::unique_ptr<mlir::OperationPass<mlir::ModuleOp>>
247 bool disableTaskPipelining =
false);
249 std::unique_ptr<mlir::OperationPass<handshake::FuncOp>>
252 std::unique_ptr<mlir::OperationPass<handshake::FuncOp>>
assert(baseType &&"element must be base type")
llvm::ScopedHashTable< mlir::Value, std::string > ValueMap
Instantiate one of these and use it to build typed backedges.
BlockOps insertMergeOps(ValueMap &mergePairs, BackedgeBuilder &edgeBuilder, ConversionPatternRewriter &rewriter)
MergeOpInfo insertMerge(Block *block, Value val, BackedgeBuilder &edgeBuilder, ConversionPatternRewriter &rewriter)
LogicalResult loopNetworkRewriting(ConversionPatternRewriter &rewriter)
BlockArgument startCtrl
Start point of the control-only network.
DenseMap< Block *, std::vector< MergeOpInfo > > BlockOps
LogicalResult feedForwardRewriting(ConversionPatternRewriter &rewriter)
LogicalResult replaceCallOps(ConversionPatternRewriter &rewriter)
void setMemOpControlInputs(ConversionPatternRewriter &rewriter, ArrayRef< Operation * > memOps, Operation *memOp, int offset, ArrayRef< int > cntrlInd)
MLIRContext * getContext()
LogicalResult addMergeOps(ConversionPatternRewriter &rewriter)
LogicalResult replaceMemoryOps(ConversionPatternRewriter &rewriter, MemRefToMemoryAccessOp &memRefOps)
DenseMap< Block *, std::vector< Value > > BlockValues
LogicalResult connectConstantsToControl(ConversionPatternRewriter &rewriter, bool sourceConstants)
llvm::MapVector< Value, std::vector< Operation * > > MemRefToMemoryAccessOp
LogicalResult runSSAMaximization(ConversionPatternRewriter &rewriter, Value entryCtrl)
DenseMap< Block *, Value > blockEntryControlMap
LogicalResult setControlOnlyPath(ConversionPatternRewriter &rewriter, Value entryCtrl)
DenseMap< Value, Value > ValueMap
HandshakeLowering(Region &r)
Value getBlockEntryControl(Block *block) const
void setBlockEntryControl(Block *block, Value v)
LogicalResult connectToMemory(ConversionPatternRewriter &rewriter, MemRefToMemoryAccessOp memRefOps, bool lsq)
LogicalResult addBranchOps(ConversionPatternRewriter &rewriter)
LogicalResult runPartialLowering(T &instance, LogicalResult(T::*memberFunc)(ConversionPatternRewriter &, TArgs2...), TArgs &...args)
LogicalResult postDataflowConvert(Operation *op)
Lowers the mlir operations into handshake that are not part of the dataflow conversion.
LogicalResult lowerRegion(HandshakeLowering &hl, bool sourceConstants, bool disableTaskPipelining, Value entryCtrl)
llvm::function_ref< LogicalResult(Region &, ConversionPatternRewriter &)> RegionLoweringFunc
void removeBasicBlocks(Region &r)
Remove basic blocks inside the given region.
LogicalResult partiallyLowerRegion(const RegionLoweringFunc &loweringFunc, MLIRContext *ctx, Region &r)
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.
std::unique_ptr< mlir::Pass > createInsertMergeBlocksPass()
mlir::LogicalResult insertMergeBlocks(mlir::Region &r, mlir::ConversionPatternRewriter &rewriter)
Insert additional blocks that serve as counterparts to the blocks that diverged the control flow.
std::unique_ptr< mlir::OperationPass< mlir::ModuleOp > > createCFToHandshakePass(bool sourceConstants=false, bool disableTaskPipelining=false)
std::unique_ptr< mlir::OperationPass< mlir::ModuleOp > > createHandshakeAnalysisPass()
std::unique_ptr< mlir::OperationPass< handshake::FuncOp > > createHandshakeRemoveBlockPass()
std::unique_ptr< mlir::OperationPass< handshake::FuncOp > > createHandshakeCanonicalizePass()
SmallVector< Backedge > dataEdges
std::optional< Backedge > indexEdge