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"
37 return !type.isPassive();
46struct PassiveWiresPass
47 :
public circt::firrtl::impl::PassiveWiresBase<PassiveWiresPass> {
48 void runOnOperation()
override;
53void PassiveWiresPass::runOnOperation() {
56 auto module = getOperation();
60 SmallVector<Operation *> worklist;
61 module.walk([&](Operation *op) -> WalkResult {
62 if (auto wire = dyn_cast<WireOp>(op)) {
63 if (hasFlip(wire.getType(0)))
64 worklist.push_back(wire);
65 return WalkResult::advance();
67 if (!isa<ConnectOp, MatchingConnectOp>(op))
68 return WalkResult::advance();
70 if (!
hasFlip(op->getOperand(0).getType()))
71 return WalkResult::advance();
73 mlir::ImplicitLocOpBuilder builder(op->getLoc(), op);
75 emitConnect(builder, op->getOperand(0), op->getOperand(1));
78 return WalkResult::advance();
82 while (!worklist.empty()) {
83 auto *op = worklist.back();
85 auto r = op->getResult(0);
88 for (
auto *users : r.getUsers())
89 worklist.push_back(users);
96 markAllAnalysesPreserved();
static bool hasFlip(Type t)
#define CIRCT_DEBUG_SCOPED_PASS_LOGGER(PASS)
BaseTy type_cast(Type type)
void emitConnect(OpBuilder &builder, Location loc, Value lhs, Value rhs, bool warnOnTruncation=false)
Emit a connect between two values.
BaseTy type_dyn_cast(Type type)
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.