18#include "mlir/IR/Builders.h"
19#include "mlir/IR/Threading.h"
20#include "mlir/Pass/Pass.h"
21#include "llvm/Support/Debug.h"
23#define DEBUG_TYPE "lower-seq-firmem"
33#define GEN_PASS_DEF_LOWERFIRMEM
34#include "circt/Conversion/Passes.h.inc"
36struct LowerFirMemPass :
public impl::LowerFirMemBase<LowerFirMemPass> {
37 void runOnOperation()
override;
41void LowerFirMemPass::runOnOperation() {
42 auto circuit = getOperation();
44 auto modules = llvm::to_vector(circuit.getOps<HWModuleOp>());
45 LLVM_DEBUG(llvm::dbgs() <<
"Lowering memories in " << modules.size()
48 FirMemLowering lowering(circuit);
51 auto uniqueMems = lowering.collectMemories(modules);
52 LLVM_DEBUG(llvm::dbgs() <<
"Found " << uniqueMems.size()
53 <<
" unique memory congiurations\n");
54 if (uniqueMems.empty()) {
55 markAllAnalysesPreserved();
61 MapVector<HWModuleOp, SmallVector<FirMemLowering::MemoryConfig>> memsByModule;
62 for (
auto &[config, memOps] : uniqueMems) {
64 auto genOp = lowering.createMemoryModule(config, memOps);
67 for (
auto memOp : memOps) {
68 auto parent = memOp->getParentOfType<HWModuleOp>();
69 memsByModule[parent].emplace_back(&config, genOp, memOp);
74 mlir::parallelForEach(&getContext(), memsByModule, [&](
auto pair) {
75 lowering.lowerMemoriesInModule(pair.first, pair.second);
84 return std::make_unique<LowerFirMemPass>();
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.
std::unique_ptr< mlir::Pass > createLowerFirMemPass()