15 #include "mlir/IR/BuiltinOps.h"
16 #include "mlir/IR/Threading.h"
17 #include "llvm/Support/Debug.h"
19 #define DEBUG_TYPE "firrtl-inner-symbol-dce"
22 using namespace circt;
23 using namespace firrtl;
33 assert(InnerSymbolTable::getInnerSymbol(target));
35 if (target.isPort()) {
36 auto mod = cast<FModuleLike>(target.getOp());
37 assert(target.getPort() < mod.getNumPorts());
38 auto base = mod.getPortSymbolAttr(target.getPort());
39 cast<firrtl::FModuleLike>(*mod).setPortSymbolsAttr(
40 target.getPort(), base.erase(target.getField()));
44 auto symOp = cast<InnerSymbolOpInterface>(target.getOp());
45 auto base = symOp.getInnerSymAttr();
46 symOp.setInnerSymbolAttr(base.erase(target.getField()));
50 void runOnOperation()
override;
53 void findInnerRefs(Attribute attr);
54 void insertInnerRef(InnerRefAttr innerRef);
55 void removeInnerSyms(FModuleLike mod);
57 DenseSet<std::pair<StringAttr, StringAttr>>
innerRefs;
63 attr.walk([&](Attribute subAttr) {
64 if (
auto innerRef = dyn_cast<InnerRefAttr>(subAttr))
65 insertInnerRef(innerRef);
71 StringAttr moduleName = innerRef.getModule();
72 StringAttr symName = innerRef.getName();
77 auto [iter, inserted] = innerRefs.insert({moduleName, symName});
82 <<
"::" << symName <<
'\n';);
87 auto moduleName = mod.getModuleNameAttr();
90 InnerSymbolTable::walkSymbols(
91 mod, [&](StringAttr name,
const InnerSymTarget &target) {
92 ++numInnerSymbolsFound;
95 if (innerRefs.contains({moduleName, name}))
99 ++numInnerSymbolsRemoved;
102 <<
"::" << name <<
'\n';);
109 ModuleOp topModule = getOperation();
112 SmallVector<FModuleLike> modules;
113 topModule.walk([&](Operation *op) {
115 for (NamedAttribute namedAttr : op->getAttrs())
116 findInnerRefs(namedAttr.getValue());
119 if (
auto mod = dyn_cast<FModuleLike>(op))
120 modules.push_back(mod);
125 parallelForEach(&getContext(), modules,
126 [&](FModuleLike mod) { removeInnerSyms(mod); });
130 return std::make_unique<InnerSymbolDCEPass>();
assert(baseType &&"element must be base type")
static void dropSymbol(const InnerSymTarget &target)
Drop the specified symbol.
std::unique_ptr< mlir::Pass > createInnerSymbolDCEPass()
This file defines an intermediate representation for circuits acting as an abstraction for constraint...
mlir::raw_indented_ostream & dbgs()
void removeInnerSyms(FModuleLike mod)
Remove all dead inner symbols from the specified module.
void findInnerRefs(Attribute attr)
Find all InnerRefAttrs inside a given Attribute.
void runOnOperation() override
void insertInnerRef(InnerRefAttr innerRef)
Add an InnerRefAttr to the set of all InnerRefAttrs.
DenseSet< std::pair< StringAttr, StringAttr > > innerRefs