18#include "mlir/Pass/Pass.h"
20#define DEBUG_TYPE "firrtl-annotate-input-only-modules"
24#define GEN_PASS_DEF_ANNOTATEINPUTONLYMODULES
25#include "circt/Dialect/FIRRTL/Passes.h.inc"
30using namespace firrtl;
33struct AnnotateInputOnlyModulesPass
34 :
public circt::firrtl::impl::AnnotateInputOnlyModulesBase<
35 AnnotateInputOnlyModulesPass> {
36 void runOnOperation()
override;
38 LogicalResult initialize(MLIRContext *
context)
override {
40 inlineAnno = DictionaryAttr::getWithSorted(
46 mlir::DictionaryAttr inlineAnno;
51void AnnotateInputOnlyModulesPass::runOnOperation() {
52 auto circuit = getOperation();
54 auto &instanceInfo = getAnalysis<InstanceInfo>();
55 for (
auto module : circuit.getOps<FModuleOp>()) {
57 if (!instanceInfo.anyInstanceInEffectiveDesign(module) || module.isPublic())
61 bool hasHardwareOutputPort =
62 llvm::any_of(module.getPorts(), [&](
auto port) {
63 return port.direction == Direction::Out &&
64 type_isa<FIRRTLBaseType>(port.type);
68 if (hasHardwareOutputPort)
77 LLVM_DEBUG(llvm::dbgs() <<
"Annotating inline annotation "
78 << module.getModuleName() <<
"\n");
81 annos.addAnnotations(ArrayRef<Attribute>{inlineAnno});
82 annos.applyToOperation(module);
89 return markAllAnalysesPreserved();
91 markAnalysesPreserved<igraph::InstanceGraph, InstanceInfo>();
static std::unique_ptr< Context > context
This class provides a read-only projection over the MLIR attributes that represent a set of annotatio...
constexpr const char * inlineAnnoClass
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.