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>()) {
58 if (!instanceInfo.anyInstanceInEffectiveDesign(module) ||
59 module.isPublic() || !module.getLayers().empty())
63 bool hasHardwareOutputPort =
64 llvm::any_of(module.getPorts(), [&](
auto port) {
65 return port.direction == Direction::Out &&
66 type_isa<FIRRTLBaseType>(port.type);
70 if (hasHardwareOutputPort)
79 LLVM_DEBUG(llvm::dbgs() <<
"Annotating inline annotation "
80 << module.getModuleName() <<
"\n");
83 annos.addAnnotations(ArrayRef<Attribute>{inlineAnno});
84 annos.applyToOperation(module);
91 return markAllAnalysesPreserved();
93 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.