diff --git a/include/Analysis/QoREstimation.h b/include/Analysis/Utils.h similarity index 55% rename from include/Analysis/QoREstimation.h rename to include/Analysis/Utils.h index 5900b7f..00a204c 100644 --- a/include/Analysis/QoREstimation.h +++ b/include/Analysis/Utils.h @@ -2,27 +2,22 @@ // //===----------------------------------------------------------------------===// -#ifndef SCALEHLS_ANALYSIS_QORESTIMATION_H -#define SCALEHLS_ANALYSIS_QORESTIMATION_H +#ifndef SCALEHLS_ANALYSIS_UTILS_H +#define SCALEHLS_ANALYSIS_UTILS_H -#include "Dialect/HLSCpp/Visitor.h" -#include "INIReader.h" -#include "mlir/Analysis/AffineAnalysis.h" -#include "mlir/Dialect/Affine/IR/AffineOps.h" -#include "mlir/Pass/Pass.h" -#include "mlir/Transforms/LoopUtils.h" -#include "llvm/ADT/TypeSwitch.h" +#include "Dialect/HLSCpp/HLSCpp.h" +#include "mlir/IR/Operation.h" namespace mlir { namespace scalehls { //===----------------------------------------------------------------------===// -// HLSCppToolBase Class Declaration and Definition +// HLSCppAnalysisBase Class //===----------------------------------------------------------------------===// -class HLSCppToolBase { +class HLSCppAnalysisBase { public: - explicit HLSCppToolBase(OpBuilder builder) : builder(builder) {} + explicit HLSCppAnalysisBase(OpBuilder builder) : builder(builder) {} OpBuilder builder; @@ -56,14 +51,14 @@ public: } /// Get partition information methods. - StringRef getPartitionType(ArrayOp op, unsigned dim) { + StringRef getPartitionType(hlscpp::ArrayOp op, unsigned dim) { if (auto attr = op.partition_type()[dim].cast()) return attr.getValue(); else return ""; } - unsigned getPartitionFactor(ArrayOp op, unsigned dim) { + unsigned getPartitionFactor(hlscpp::ArrayOp op, unsigned dim) { if (auto attr = op.partition_factor()[dim].cast()) return attr.getUInt(); else @@ -95,7 +90,7 @@ public: }; //===----------------------------------------------------------------------===// -// HLSCppEstimator Class Declaration +// Common Used Type Declarations //===----------------------------------------------------------------------===// // Profiled latency map. @@ -128,65 +123,7 @@ using PortsMap = DenseMap; // For storing PortsMap indexed by the scheduling level. using PortsMapDict = DenseMap; -class HLSCppEstimator - : public HLSCppVisitorBase, unsigned>, - public HLSCppToolBase { -public: - explicit HLSCppEstimator(FuncOp &func, LatencyMap &latencyMap) - : HLSCppToolBase(OpBuilder(func)), func(func), latencyMap(latencyMap) { - getFuncMemRefDepends(); - } - - void getFuncMemRefDepends(); - using HLSCppVisitorBase::visitOp; - Optional visitUnhandledOp(Operation *op, unsigned begin) { - // Default latency of any unhandled operation is 1. - setScheduleValue(op, begin, begin + 1); - return begin + 1; - } - - int32_t getPartitionIndex(Operation *op); - unsigned getLoadStoreSchedule(Operation *op, unsigned begin); - Optional visitOp(AffineLoadOp op, unsigned begin) { - return getLoadStoreSchedule(op, begin); - } - Optional visitOp(AffineStoreOp op, unsigned begin) { - return getLoadStoreSchedule(op, begin); - } - - unsigned getOpMinII(AffineForOp forOp); - unsigned getResMinII(LoadStoresMap &map); - unsigned getDepMinII(AffineForOp forOp, LoadStoresMap &map); - Optional visitOp(AffineForOp op, unsigned begin); - - Optional visitOp(AffineIfOp op, unsigned begin); - Optional visitOp(ReturnOp op, unsigned begin); - Optional visitOp(ArrayOp op, unsigned begin); - - /// Handle operations with profiled latency. -#define HANDLE(OPTYPE, KEYNAME) \ - Optional visitOp(OPTYPE op, unsigned begin) { \ - auto end = begin + latencyMap[KEYNAME] + 1; \ - setScheduleValue(op, begin, end); \ - return end; \ - } - HANDLE(AddFOp, "fadd"); - HANDLE(MulFOp, "fmul"); - HANDLE(DivFOp, "fdiv"); - HANDLE(CmpFOp, "fcmp"); - HANDLE(SelectOp, "fselect"); -#undef HANDLE - - Optional estimateBlock(Block &block, unsigned begin); - void estimateFunc(); - - FuncOp &func; - DependsMap dependsMap; - PortsMapDict portsMapDict; - LatencyMap &latencyMap; -}; - } // namespace scalehls } // namespace mlir -#endif // SCALEHLS_ANALYSIS_QORESTIMATION_H +#endif // SCALEHLS_ANALYSIS_UTILS_H diff --git a/include/Dialect/HLSCpp/Visitor.h b/include/Dialect/HLSCpp/Visitor.h index 6e040be..55359c4 100644 --- a/include/Dialect/HLSCpp/Visitor.h +++ b/include/Dialect/HLSCpp/Visitor.h @@ -9,6 +9,7 @@ #include "mlir/Dialect/Affine/IR/AffineOps.h" #include "mlir/Dialect/SCF/SCF.h" #include "mlir/Dialect/StandardOps/IR/Ops.h" +#include "llvm/ADT/TypeSwitch.h" namespace mlir { namespace scalehls { diff --git a/include/Dialect/HLSKernel/HLSKernel.h b/include/Dialect/HLSKernel/HLSKernel.h index bc747c0..a6c76f4 100644 --- a/include/Dialect/HLSKernel/HLSKernel.h +++ b/include/Dialect/HLSKernel/HLSKernel.h @@ -8,7 +8,6 @@ #include "mlir/Dialect/Affine/IR/AffineOps.h" #include "mlir/IR/Builders.h" #include "mlir/IR/Dialect.h" -#include "mlir/IR/Function.h" namespace mlir { namespace scalehls { diff --git a/include/Dialect/HLSKernel/Visitor.h b/include/Dialect/HLSKernel/Visitor.h index 0ddcf16..11c6fa1 100644 --- a/include/Dialect/HLSKernel/Visitor.h +++ b/include/Dialect/HLSKernel/Visitor.h @@ -7,6 +7,7 @@ #include "Dialect/HLSKernel/HLSKernel.h" #include "mlir/Dialect/StandardOps/IR/Ops.h" +#include "llvm/ADT/TypeSwitch.h" namespace mlir { namespace scalehls { diff --git a/lib/Analysis/QoREstimation.cpp b/lib/Analysis/QoREstimation.cpp index 7074f93..d9d7cbe 100644 --- a/lib/Analysis/QoREstimation.cpp +++ b/lib/Analysis/QoREstimation.cpp @@ -2,16 +2,16 @@ // //===----------------------------------------------------------------------===// -#include "Analysis/QoREstimation.h" #include "Analysis/Passes.h" -#include "Dialect/HLSCpp/HLSCpp.h" +#include "Analysis/Utils.h" +#include "Dialect/HLSCpp/Visitor.h" +#include "INIReader.h" +#include "mlir/Analysis/AffineAnalysis.h" #include "mlir/Analysis/AffineStructures.h" #include "mlir/Analysis/LoopAnalysis.h" #include "mlir/Analysis/Utils.h" +#include "mlir/Dialect/Affine/IR/AffineOps.h" #include "mlir/Dialect/Affine/IR/AffineValueMap.h" -#include "mlir/IR/Block.h" -#include "mlir/IR/Operation.h" -#include "mlir/IR/PatternMatch.h" using namespace std; using namespace mlir; @@ -19,7 +19,72 @@ using namespace scalehls; using namespace hlscpp; //===----------------------------------------------------------------------===// -// Helpers +// HLSCppEstimator Class Delaration +//===----------------------------------------------------------------------===// + +namespace { +class HLSCppEstimator + : public HLSCppVisitorBase, unsigned>, + public HLSCppAnalysisBase { +public: + explicit HLSCppEstimator(FuncOp &func, LatencyMap &latencyMap) + : HLSCppAnalysisBase(OpBuilder(func)), func(func), + latencyMap(latencyMap) { + getFuncMemRefDepends(); + } + + void getFuncMemRefDepends(); + using HLSCppVisitorBase::visitOp; + Optional visitUnhandledOp(Operation *op, unsigned begin) { + // Default latency of any unhandled operation is 1. + setScheduleValue(op, begin, begin + 1); + return begin + 1; + } + + int32_t getPartitionIndex(Operation *op); + unsigned getLoadStoreSchedule(Operation *op, unsigned begin); + Optional visitOp(AffineLoadOp op, unsigned begin) { + return getLoadStoreSchedule(op, begin); + } + Optional visitOp(AffineStoreOp op, unsigned begin) { + return getLoadStoreSchedule(op, begin); + } + + unsigned getOpMinII(AffineForOp forOp); + unsigned getResMinII(LoadStoresMap &map); + unsigned getDepMinII(AffineForOp forOp, LoadStoresMap &map); + Optional visitOp(AffineForOp op, unsigned begin); + + Optional visitOp(AffineIfOp op, unsigned begin); + Optional visitOp(ReturnOp op, unsigned begin); + Optional visitOp(ArrayOp op, unsigned begin); + + /// Handle operations with profiled latency. +#define HANDLE(OPTYPE, KEYNAME) \ + Optional visitOp(OPTYPE op, unsigned begin) { \ + auto end = begin + latencyMap[KEYNAME] + 1; \ + setScheduleValue(op, begin, end); \ + return end; \ + } + HANDLE(AddFOp, "fadd"); + HANDLE(MulFOp, "fmul"); + HANDLE(DivFOp, "fdiv"); + HANDLE(CmpFOp, "fcmp"); + HANDLE(SelectOp, "fselect"); +#undef HANDLE + + Optional estimateBlock(Block &block, unsigned begin); + void estimateFunc(); + + FuncOp &func; + DependsMap dependsMap; + PortsMapDict portsMapDict; + LatencyMap &latencyMap; +}; +} // namespace + +//===----------------------------------------------------------------------===// +// Helper methods //===----------------------------------------------------------------------===// // Check if the lhsOp and rhsOp is at the same scheduling level. In this check, @@ -123,7 +188,7 @@ static void getLoadStoresMap(Block &block, LoadStoresMap &map) { } //===----------------------------------------------------------------------===// -// MemRef Dependency Collection Methods +// HLSCppEstimator Class Definition //===----------------------------------------------------------------------===// /// Collect all dependencies detected in the function. diff --git a/lib/Conversion/ConvertToHLSCpp.cpp b/lib/Conversion/ConvertToHLSCpp.cpp index a5188a9..f771bc3 100644 --- a/lib/Conversion/ConvertToHLSCpp.cpp +++ b/lib/Conversion/ConvertToHLSCpp.cpp @@ -5,7 +5,6 @@ #include "Conversion/Passes.h" #include "Dialect/HLSCpp/HLSCpp.h" #include "mlir/Dialect/StandardOps/IR/Ops.h" -#include "mlir/Pass/Pass.h" using namespace mlir; using namespace scalehls; diff --git a/lib/Conversion/HLSKernelToAffine.cpp b/lib/Conversion/HLSKernelToAffine.cpp index 990056f..f633d39 100644 --- a/lib/Conversion/HLSKernelToAffine.cpp +++ b/lib/Conversion/HLSKernelToAffine.cpp @@ -8,8 +8,6 @@ #include "mlir/Dialect/Affine/IR/AffineOps.h" #include "mlir/Dialect/StandardOps/IR/Ops.h" #include "mlir/IR/IntegerSet.h" -#include "mlir/Pass/Pass.h" -#include "llvm/ADT/TypeSwitch.h" using namespace mlir; using namespace scalehls; diff --git a/lib/Dialect/HLSCpp/HLSCpp.cpp b/lib/Dialect/HLSCpp/HLSCpp.cpp index 5396a7e..972abfc 100644 --- a/lib/Dialect/HLSCpp/HLSCpp.cpp +++ b/lib/Dialect/HLSCpp/HLSCpp.cpp @@ -3,7 +3,6 @@ //===----------------------------------------------------------------------===// #include "Dialect/HLSCpp/HLSCpp.h" -#include "mlir/IR/StandardTypes.h" using namespace mlir; using namespace scalehls; diff --git a/lib/Dialect/HLSKernel/HLSKernel.cpp b/lib/Dialect/HLSKernel/HLSKernel.cpp index c4ed6b3..bca80a7 100644 --- a/lib/Dialect/HLSKernel/HLSKernel.cpp +++ b/lib/Dialect/HLSKernel/HLSKernel.cpp @@ -3,7 +3,6 @@ //===----------------------------------------------------------------------===// #include "Dialect/HLSKernel/HLSKernel.h" -#include "mlir/IR/StandardTypes.h" using namespace mlir; using namespace scalehls; diff --git a/lib/EmitHLSCpp/EmitHLSCpp.cpp b/lib/EmitHLSCpp/EmitHLSCpp.cpp index 35045a3..9096f95 100644 --- a/lib/EmitHLSCpp/EmitHLSCpp.cpp +++ b/lib/EmitHLSCpp/EmitHLSCpp.cpp @@ -3,21 +3,14 @@ //===----------------------------------------------------------------------===// #include "EmitHLSCpp.h" -#include "Dialect/HLSCpp/HLSCpp.h" #include "Dialect/HLSCpp/Visitor.h" #include "mlir/Dialect/Affine/IR/AffineOps.h" #include "mlir/Dialect/Affine/IR/AffineValueMap.h" #include "mlir/Dialect/SCF/SCF.h" #include "mlir/Dialect/StandardOps/IR/Ops.h" #include "mlir/IR/AffineExprVisitor.h" -#include "mlir/IR/Function.h" #include "mlir/IR/IntegerSet.h" -#include "mlir/IR/Module.h" -#include "mlir/IR/StandardTypes.h" -#include "mlir/Support/LLVM.h" #include "mlir/Translation.h" -#include "llvm/ADT/StringSet.h" -#include "llvm/ADT/TypeSwitch.h" #include "llvm/Support/raw_ostream.h" using namespace std; diff --git a/lib/Transforms/AffineLoopPerfection.cpp b/lib/Transforms/AffineLoopPerfection.cpp index 927a158..936bd03 100644 --- a/lib/Transforms/AffineLoopPerfection.cpp +++ b/lib/Transforms/AffineLoopPerfection.cpp @@ -4,9 +4,7 @@ #include "Transforms/Passes.h" #include "mlir/Dialect/Affine/IR/AffineOps.h" -#include "mlir/IR/Builders.h" #include "mlir/IR/IntegerSet.h" -#include "mlir/Transforms/LoopUtils.h" using namespace std; using namespace mlir; diff --git a/lib/Transforms/ArrayPartition.cpp b/lib/Transforms/ArrayPartition.cpp index ca7dac2..025aa3c 100644 --- a/lib/Transforms/ArrayPartition.cpp +++ b/lib/Transforms/ArrayPartition.cpp @@ -2,16 +2,14 @@ // //===----------------------------------------------------------------------===// -#include "Analysis/QoREstimation.h" +#include "Analysis/Utils.h" #include "Transforms/Passes.h" #include "mlir/Dialect/Affine/IR/AffineOps.h" -#include "mlir/Dialect/Affine/Passes.h" -#include "mlir/IR/Builders.h" -#include "mlir/Transforms/LoopUtils.h" using namespace std; using namespace mlir; using namespace scalehls; +using namespace hlscpp; namespace { struct ArrayPartition : public ArrayPartitionBase { @@ -122,13 +120,13 @@ void ArrayPartition::runOnOperation() { // Collect memory access information. LoadStoresMap loadMap; outermost.walk([&](mlir::AffineLoadOp loadOp) { - auto arrayOp = cast(loadOp.getMemRef().getDefiningOp()); + auto arrayOp = loadOp.getMemRef().getDefiningOp(); loadMap[arrayOp].push_back(loadOp); }); LoadStoresMap storeMap; outermost.walk([&](mlir::AffineStoreOp storeOp) { - auto arrayOp = cast(storeOp.getMemRef().getDefiningOp()); + auto arrayOp = storeOp.getMemRef().getDefiningOp(); storeMap[arrayOp].push_back(storeOp); }); diff --git a/lib/Transforms/HLSKernelBufferize.cpp b/lib/Transforms/HLSKernelBufferize.cpp index ecb528b..f91dea5 100644 --- a/lib/Transforms/HLSKernelBufferize.cpp +++ b/lib/Transforms/HLSKernelBufferize.cpp @@ -4,7 +4,6 @@ #include "Dialect/HLSKernel/HLSKernel.h" #include "Transforms/Passes.h" -#include "mlir/IR/Builders.h" using namespace std; using namespace mlir; diff --git a/lib/Transforms/LegalizeDataflow.cpp b/lib/Transforms/LegalizeDataflow.cpp index b56b889..3070501 100644 --- a/lib/Transforms/LegalizeDataflow.cpp +++ b/lib/Transforms/LegalizeDataflow.cpp @@ -4,7 +4,6 @@ #include "Dialect/HLSKernel/HLSKernel.h" #include "Transforms/Passes.h" -#include "mlir/IR/Builders.h" using namespace std; using namespace mlir; diff --git a/lib/Transforms/LoopPipelining.cpp b/lib/Transforms/LoopPipelining.cpp index e0ec5fe..1211f75 100644 --- a/lib/Transforms/LoopPipelining.cpp +++ b/lib/Transforms/LoopPipelining.cpp @@ -4,8 +4,6 @@ #include "Transforms/Passes.h" #include "mlir/Dialect/Affine/IR/AffineOps.h" -#include "mlir/Dialect/Affine/Passes.h" -#include "mlir/IR/Builders.h" #include "mlir/Transforms/GreedyPatternRewriteDriver.h" #include "mlir/Transforms/LoopUtils.h" diff --git a/lib/Transforms/PartialAffineLoopTile.cpp b/lib/Transforms/PartialAffineLoopTile.cpp index b6ebf9e..40bec16 100644 --- a/lib/Transforms/PartialAffineLoopTile.cpp +++ b/lib/Transforms/PartialAffineLoopTile.cpp @@ -4,8 +4,6 @@ #include "Transforms/Passes.h" #include "mlir/Dialect/Affine/IR/AffineOps.h" -#include "mlir/Dialect/Affine/Passes.h" -#include "mlir/IR/Builders.h" #include "mlir/Transforms/LoopUtils.h" using namespace std; diff --git a/lib/Transforms/PragmaDSE.cpp b/lib/Transforms/PragmaDSE.cpp index 1b5e22e..9b65198 100644 --- a/lib/Transforms/PragmaDSE.cpp +++ b/lib/Transforms/PragmaDSE.cpp @@ -2,7 +2,7 @@ // //===----------------------------------------------------------------------===// -#include "Analysis/QoREstimation.h" +#include "Analysis/Utils.h" #include "Dialect/HLSCpp/HLSCpp.h" #include "Transforms/Passes.h" diff --git a/lib/Transforms/RemoveVarLoopBound.cpp b/lib/Transforms/RemoveVarLoopBound.cpp index 573f5b1..a05d7cc 100644 --- a/lib/Transforms/RemoveVarLoopBound.cpp +++ b/lib/Transforms/RemoveVarLoopBound.cpp @@ -4,8 +4,6 @@ #include "Transforms/Passes.h" #include "mlir/Dialect/Affine/IR/AffineOps.h" -#include "mlir/Dialect/Affine/Passes.h" -#include "mlir/IR/Builders.h" #include "mlir/IR/IntegerSet.h" #include "mlir/Transforms/LoopUtils.h" diff --git a/lib/Transforms/SplitFunction.cpp b/lib/Transforms/SplitFunction.cpp index 55ba4a4..6eca605 100644 --- a/lib/Transforms/SplitFunction.cpp +++ b/lib/Transforms/SplitFunction.cpp @@ -4,7 +4,6 @@ #include "Dialect/HLSKernel/HLSKernel.h" #include "Transforms/Passes.h" -#include "mlir/IR/Builders.h" using namespace std; using namespace mlir; diff --git a/tools/benchmark-gen/benchmark-gen.cpp b/tools/benchmark-gen/benchmark-gen.cpp index 1c2f8f1..25e1eac 100644 --- a/tools/benchmark-gen/benchmark-gen.cpp +++ b/tools/benchmark-gen/benchmark-gen.cpp @@ -5,18 +5,10 @@ #include "Analysis/Passes.h" #include "Dialect/HLSKernel/HLSKernel.h" #include "INIReader.h" -#include "Transforms/Passes.h" #include "mlir/IR/Dialect.h" #include "mlir/IR/MLIRContext.h" -#include "mlir/IR/Types.h" -#include "mlir/InitAllDialects.h" -#include "mlir/InitAllPasses.h" -#include "mlir/Pass/Pass.h" -#include "mlir/Pass/PassManager.h" #include "mlir/Support/FileUtilities.h" #include "llvm/Support/CommandLine.h" -#include "llvm/Support/InitLLVM.h" -#include "llvm/Support/SourceMgr.h" #include "llvm/Support/ToolOutputFile.h" #include @@ -384,12 +376,6 @@ static LogicalResult processBenchmarkGen(raw_ostream &os) { } int main(int argc, char **argv) { - llvm::InitLLVM y(argc, argv); - - // Register any pass manager command line options. - mlir::registerPassManagerCLOptions(); - mlir::PassPipelineCLParser passPipeline("", "Compiler passes to run"); - // Parse pass names in main to ensure static initialization completed. llvm::cl::ParseCommandLineOptions(argc, argv, "MLIR modular optimizer driver\n");