19#include "mlir/IR/ImplicitLocOpBuilder.h"
20#include "mlir/Pass/Pass.h"
21#include "llvm/Support/Debug.h"
23#define DEBUG_TYPE "firrtl-passive-wires"
27#define GEN_PASS_DEF_PASSIVEWIRES
28#include "circt/Dialect/FIRRTL/Passes.h.inc"
33using namespace firrtl;
36 if (
auto type = type_dyn_cast<FIRRTLBaseType>(t))
37 return !type.isPassive();
46struct PassiveWiresPass
47 :
public circt::firrtl::impl::PassiveWiresBase<PassiveWiresPass> {
48 void runOnOperation()
override;
53void PassiveWiresPass::runOnOperation() {
56 auto module = getOperation();
59 SmallVector<Operation *> worklist;
60 module.walk([&](Operation *op) -> WalkResult {
61 if (auto wire = dyn_cast<WireOp>(op)) {
62 if (hasFlip(wire.getType(0)))
63 worklist.push_back(wire);
64 return WalkResult::advance();
66 if (!isa<ConnectOp, MatchingConnectOp>(op))
67 return WalkResult::advance();
69 if (!
hasFlip(op->getOperand(0).getType()))
70 return WalkResult::advance();
72 mlir::ImplicitLocOpBuilder builder(op->getLoc(), op);
74 emitConnect(builder, op->getOperand(0), op->getOperand(1));
76 return WalkResult::advance();
80 while (!worklist.empty()) {
81 auto *op = worklist.back();
83 auto r = op->getResult(0);
86 for (
auto users : r.getUsers())
87 worklist.push_back(users);
89 r.setType(type_cast<FIRRTLBaseType>(r.getType()).getPassiveType());
static bool hasFlip(Type t)
#define CIRCT_DEBUG_SCOPED_PASS_LOGGER(PASS)
void emitConnect(OpBuilder &builder, Location loc, Value lhs, Value rhs)
Emit a connect between two values.
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.