13 #include "llvm/ADT/SmallSet.h"
14 #include "llvm/Support/Debug.h"
16 #define DEBUG_TYPE "hw-reductions"
19 using namespace circt;
28 void clear() { moduleSizes.clear(); }
32 if (
auto it = moduleSizes.find(module); it != moduleSizes.end())
35 module->walk([&](Operation *op) {
37 if (
auto instOp = dyn_cast<HWInstanceLike>(op))
39 instanceGraph.getReferencedModule<hw::HWModuleLike>(instOp))
40 size += getModuleSize(instModule, instanceGraph);
42 moduleSizes.insert({module, size});
47 llvm::DenseMap<Operation *, uint64_t> moduleSizes;
57 instanceGraph = std::make_unique<InstanceGraph>(op);
62 return moduleSizes.getModuleSize(op, *instanceGraph);
68 op.getPortList(), StringRef(),
74 std::string
getName()
const override {
return "hw-module-externalizer"; }
83 template <
unsigned OpNum>
85 uint64_t
match(Operation *op)
override {
86 if (op->getNumResults() != 1 || op->getNumOperands() < 2 ||
87 OpNum >= op->getNumOperands())
89 auto resultTy = op->getResult(0).getType().dyn_cast<IntegerType>();
90 auto opTy = op->getOperand(OpNum).getType().dyn_cast<IntegerType>();
91 return resultTy && opTy && resultTy == opTy &&
92 op->getResult(0) != op->getOperand(OpNum);
94 LogicalResult
rewrite(Operation *op)
override {
96 ImplicitLocOpBuilder
builder(op->getLoc(), op);
97 auto result = op->getResult(0);
98 auto operand = op->getOperand(OpNum);
100 <<
"Forwarding " << operand <<
" in " << *op <<
"\n");
101 result.replaceAllUsesWith(operand);
106 return (
"hw-operand" + Twine(OpNum) +
"-forwarder").str();
113 uint64_t
match(Operation *op)
override {
114 if (op->getNumResults() == 0 || op->getNumOperands() == 0)
116 return llvm::all_of(op->getResults(), [](Value result) {
117 return result.getType().isa<IntegerType>();
120 LogicalResult
rewrite(Operation *op)
override {
123 for (
auto result : op->getResults()) {
124 auto type = result.getType().cast<IntegerType>();
126 result.replaceAllUsesWith(newOp);
131 std::string
getName()
const override {
return "hw-constantifier"; }
138 void HWReducePatternDialectInterface::populateReducePatterns(
153 mlir::DialectRegistry ®istry) {
154 registry.addExtension(+[](MLIRContext *ctx, HWDialect *dialect) {
assert(baseType &&"element must be base type")
void registerReducePatternDialectInterface(mlir::DialectRegistry ®istry)
Register the Arc Reduction pattern dialect interface to the given registry.
std::map< std::string, std::set< std::string > > InstanceGraph
Iterates over the handshake::FuncOp's in the program to build an instance graph.
void pruneUnusedOps(Operation *initialOp, Reduction &reduction)
Starting at the given op, traverse through it and its operands and erase operations that have no more...
This file defines an intermediate representation for circuits acting as an abstraction for constraint...
mlir::raw_indented_ostream & dbgs()
A sample reduction pattern that replaces integer operations with a constant zero of their type.
uint64_t match(Operation *op) override
Check if the reduction can apply to a specific operation.
std::string getName() const override
Return a human-readable name for this reduction pattern.
LogicalResult rewrite(Operation *op) override
Apply the reduction to a specific operation.
A sample reduction pattern that replaces all uses of an operation with one of its operands.
LogicalResult rewrite(Operation *op) override
Apply the reduction to a specific operation.
uint64_t match(Operation *op) override
Check if the reduction can apply to a specific operation.
std::string getName() const override
Return a human-readable name for this reduction pattern.
A sample reduction pattern that maps hw.module to hw.module.extern.
std::string getName() const override
Return a human-readable name for this reduction pattern.
LogicalResult rewrite(HWModuleOp op) override
std::unique_ptr< InstanceGraph > instanceGraph
void beforeReduction(mlir::ModuleOp op) override
Called before the reduction is applied to a new subset of operations.
uint64_t match(HWModuleOp op) override
ModuleSizeCache moduleSizes
Utility to track the transitive size of modules.
uint64_t getModuleSize(HWModuleLike module, hw::InstanceGraph &instanceGraph)
An abstract reduction pattern.
A dialect interface to provide reduction patterns to a reducer tool.