diff --git a/include/circt/Dialect/Arc/ArcPasses.h b/include/circt/Dialect/Arc/ArcPasses.h index d8cbb6f0c19a..4d47bcef793e 100644 --- a/include/circt/Dialect/Arc/ArcPasses.h +++ b/include/circt/Dialect/Arc/ArcPasses.h @@ -30,6 +30,7 @@ createAddTapsPass(const AddTapsOptions &options = {}); std::unique_ptr createAllocateStatePass(); std::unique_ptr createArcCanonicalizerPass(); std::unique_ptr createDedupPass(); +std::unique_ptr createDummyAnalysisTesterPass(); std::unique_ptr createFindInitialVectorsPass(); std::unique_ptr createGroupResetsAndEnablesPass(); std::unique_ptr diff --git a/include/circt/Dialect/Arc/ArcPasses.td b/include/circt/Dialect/Arc/ArcPasses.td index 3a44ce80b354..a84519888e00 100644 --- a/include/circt/Dialect/Arc/ArcPasses.td +++ b/include/circt/Dialect/Arc/ArcPasses.td @@ -58,6 +58,24 @@ def Dedup : Pass<"arc-dedup", "mlir::ModuleOp"> { ]; } +def DummyAnalysisTester : Pass<"arc-dummy-analysis-tester", "mlir::ModuleOp"> { + let summary = "A dymmy pass to test analysis passes"; + let constructor = "circt::arc::createDummyAnalysisTesterPass()"; + let dependentDialects = ["arc::ArcDialect"]; + let statistics = [ + Statistic<"moduleCost", "Operation(s)", + "Number of operations in the module">, + Statistic<"packingCost", "Pack operations(s)", + "Number of scalar to vector packking in the module">, + Statistic<"shufflingCost", "Shuffle operation(s)", + "Number of shuffles done to set up the VectorizeOps">, + Statistic<"vectoroizeOpsBodyCost", "VectorizeOps Body Cost", + "Number of operations inside the body of the VectorizeOps">, + Statistic<"allVectorizeOpsCost", "All VectorizeOps Cost", + "Total Cost of all VectorizeOps in the module"> + ]; +} + def FindInitialVectors : Pass<"arc-find-initial-vectors", "mlir::ModuleOp"> { let summary = "Find initial groups of vectorizable ops"; let constructor = "circt::arc::createFindInitialVectorsPass()"; diff --git a/lib/Dialect/Arc/Transforms/CMakeLists.txt b/lib/Dialect/Arc/Transforms/CMakeLists.txt index fc8296c9dc64..ec63f08be71e 100644 --- a/lib/Dialect/Arc/Transforms/CMakeLists.txt +++ b/lib/Dialect/Arc/Transforms/CMakeLists.txt @@ -3,6 +3,7 @@ add_circt_dialect_library(CIRCTArcTransforms AllocateState.cpp ArcCanonicalizer.cpp Dedup.cpp + DummyAnalysisTester.cpp FindInitialVectors.cpp GroupResetsAndEnables.cpp InferMemories.cpp diff --git a/lib/Dialect/Arc/Transforms/DummyAnalysisTester.cpp b/lib/Dialect/Arc/Transforms/DummyAnalysisTester.cpp new file mode 100644 index 000000000000..4b11af425087 --- /dev/null +++ b/lib/Dialect/Arc/Transforms/DummyAnalysisTester.cpp @@ -0,0 +1,73 @@ +//===- DummyAnalysisTester.cpp --------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This is a dummy pass to test the analysis passes it doesn't do any thing. It +// just walks over the ops to compute some statistics, you can add any +// statistics you need to compute. +// +//===----------------------------------------------------------------------===// + +#include "circt/Dialect/Arc/ArcCostModel.h" +#include "circt/Dialect/Arc/ArcPasses.h" +#include "circt/Dialect/HW/HWOps.h" +#include "mlir/IR/MLIRContext.h" +#include "mlir/Pass/Pass.h" + +#define DEBUG_TYPE "arc-dummy-analysis-tester" + +namespace circt { +namespace arc { +#define GEN_PASS_DEF_DUMMYANALYSISTESTER +#include "circt/Dialect/Arc/ArcPasses.h.inc" +} // namespace arc +} // namespace circt + +using namespace circt; +using namespace arc; + +namespace { +struct DummyAnalysisTesterPass + : public arc::impl::DummyAnalysisTesterBase { + void runOnOperation() override; + + // You can add any statistics you need to compute here. + struct StatisticVars { + size_t moduleCost{0}; + size_t packingCost{0}; + size_t shufflingCost{0}; + size_t vectoroizeOpsBodyCost{0}; + size_t allVectorizeOpsCost{0}; + }; + + StatisticVars statVars; +}; +} // namespace + + +void DummyAnalysisTesterPass::runOnOperation() { + for (auto moduleOp : getOperation().getOps()) { + ArcCostModel arcCostModel; + moduleOp.walk([&](Operation *op) { + statVars.moduleCost += arcCostModel.getCost(op); + }); + statVars.packingCost += arcCostModel.getPackingCost(); + statVars.shufflingCost += arcCostModel.getShufflingCost(); + statVars.vectoroizeOpsBodyCost += arcCostModel.getVectorizeOpsBodyCost(); + statVars.allVectorizeOpsCost += arcCostModel.getAllVectorizeOpsCost(); + } + + moduleCost = statVars.moduleCost; + packingCost = statVars.packingCost; + shufflingCost = statVars.shufflingCost; + vectoroizeOpsBodyCost = statVars.vectoroizeOpsBodyCost; + allVectorizeOpsCost = statVars.allVectorizeOpsCost; +} + +std::unique_ptr arc::createDummyAnalysisTesterPass() { + return std::make_unique(); +}