20#include "mlir/IR/Dominance.h"
21#include "mlir/IR/ImplicitLocOpBuilder.h"
22#include "mlir/Pass/Pass.h"
23#include "llvm/Support/Debug.h"
27#define DEBUG_TYPE "firrtl-eliminate-wires"
31#define GEN_PASS_DEF_ELIMINATEWIRES
32#include "circt/Dialect/FIRRTL/Passes.h.inc"
37using namespace firrtl;
44struct EliminateWiresPass
45 :
public circt::firrtl::impl::EliminateWiresBase<EliminateWiresPass> {
46 void runOnOperation()
override;
50void EliminateWiresPass::runOnOperation() {
53 auto module = getOperation();
54 auto &dominance = getAnalysis<mlir::DominanceInfo>();
56 std::deque<std::pair<WireOp, MatchingConnectOp>> worklist;
58 for (
auto wire : module.getOps<WireOp>()) {
59 auto type = type_dyn_cast<FIRRTLBaseType>(wire.getResult().getType());
60 if (!type || !type.isPassive()) {
74 for (
auto *user : wire->getUsers()) {
75 if (!dominance.dominates(writer, user)) {
83 worklist.emplace_back(wire, writer);
86 for (
auto [wire, writer] : worklist) {
87 mlir::ImplicitLocOpBuilder builder(wire->getLoc(), writer);
88 auto node = NodeOp::create(builder, writer.getSrc(), wire.getName(),
89 wire.getNameKind(), wire.getAnnotations(),
90 wire.getInnerSymAttr(), wire.getForceable());
91 sv::setSVAttributes(node, sv::getSVAttributes(wire));
92 wire.replaceAllUsesWith(node);
#define CIRCT_DEBUG_SCOPED_PASS_LOGGER(PASS)
MatchingConnectOp getSingleConnectUserOf(Value value)
Scan all the uses of the specified value, checking to see if there is exactly one connect that has th...
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.