13 #ifndef CIRCT_DIALECT_FIRRTL_FIRRTLVISITORS_H
14 #define CIRCT_DIALECT_FIRRTL_FIRRTLVISITORS_H
17 #include "mlir/IR/BuiltinOps.h"
18 #include "llvm/ADT/TypeSwitch.h"
24 template <
typename ConcreteType,
typename ResultType = void,
25 typename... ExtraArgs>
29 auto *thisCast =
static_cast<ConcreteType *
>(
this);
30 return TypeSwitch<Operation *, ResultType>(op)
33 ConstantOp, SpecialConstantOp, AggregateConstantOp, InvalidValueOp,
34 SubfieldOp, SubindexOp, SubaccessOp, IsTagOp, SubtagOp,
35 BundleCreateOp, VectorCreateOp, FEnumCreateOp, MultibitMuxOp,
36 TagExtractOp, OpenSubfieldOp, OpenSubindexOp, ObjectSubfieldOp,
39 AddPrimOp, SubPrimOp, MulPrimOp, DivPrimOp, RemPrimOp, AndPrimOp,
42 ElementwiseOrPrimOp, ElementwiseAndPrimOp, ElementwiseXorPrimOp,
44 LEQPrimOp, LTPrimOp, GEQPrimOp, GTPrimOp, EQPrimOp, NEQPrimOp,
46 CatPrimOp, DShlPrimOp, DShlwPrimOp, DShrPrimOp,
48 AsSIntPrimOp, AsUIntPrimOp, AsAsyncResetPrimOp, AsClockPrimOp,
49 CvtPrimOp, NegPrimOp, NotPrimOp, AndRPrimOp, OrRPrimOp, XorRPrimOp,
51 IsXIntrinsicOp, PlusArgsValueIntrinsicOp, PlusArgsTestIntrinsicOp,
52 SizeOfIntrinsicOp, ClockGateIntrinsicOp, ClockInverterIntrinsicOp,
53 ClockDividerIntrinsicOp, LTLAndIntrinsicOp, LTLOrIntrinsicOp,
54 LTLIntersectIntrinsicOp, LTLDelayIntrinsicOp, LTLConcatIntrinsicOp,
55 LTLRepeatIntrinsicOp, LTLGoToRepeatIntrinsicOp,
56 LTLNonConsecutiveRepeatIntrinsicOp, LTLNotIntrinsicOp,
57 LTLImplicationIntrinsicOp, LTLUntilIntrinsicOp,
58 LTLEventuallyIntrinsicOp, LTLClockIntrinsicOp, Mux2CellIntrinsicOp,
59 Mux4CellIntrinsicOp, HasBeenResetIntrinsicOp,
61 BitsPrimOp, HeadPrimOp, MuxPrimOp, PadPrimOp, ShlPrimOp, ShrPrimOp,
62 TailPrimOp, VerbatimExprOp, HWStructCastOp, BitCastOp, RefSendOp,
63 RefResolveOp, RefSubOp, RWProbeOp, XMRRefOp, XMRDerefOp,
65 UninferredResetCastOp, ConstCastOp, RefCastOp,
67 StringConstantOp, FIntegerConstantOp, BoolConstantOp,
68 DoubleConstantOp, ListCreateOp, ListConcatOp, UnresolvedPathOp,
69 PathOp, IntegerAddOp, IntegerMulOp, IntegerShrOp>(
70 [&](
auto expr) -> ResultType {
71 return thisCast->visitExpr(expr, args...);
73 .Default([&](
auto expr) -> ResultType {
74 return thisCast->visitInvalidExpr(op, args...);
80 op->emitOpError(
"unknown FIRRTL expression");
102 #define HANDLE(OPTYPE, OPKIND) \
103 ResultType visitExpr(OPTYPE op, ExtraArgs... args) { \
104 return static_cast<ConcreteType *>(this)->visit##OPKIND##Expr(op, \
169 HANDLE(PlusArgsValueIntrinsicOp, Unhandled);
170 HANDLE(PlusArgsTestIntrinsicOp, Unhandled);
173 HANDLE(ClockInverterIntrinsicOp, Unhandled);
174 HANDLE(ClockDividerIntrinsicOp, Unhandled);
177 HANDLE(LTLIntersectIntrinsicOp, Unhandled);
181 HANDLE(LTLGoToRepeatIntrinsicOp, Unhandled);
182 HANDLE(LTLNonConsecutiveRepeatIntrinsicOp, Unhandled);
184 HANDLE(LTLImplicationIntrinsicOp, Unhandled);
186 HANDLE(LTLEventuallyIntrinsicOp, Unhandled);
190 HANDLE(HasBeenResetIntrinsicOp, Unhandled);
211 HANDLE(UninferredResetCastOp, Unhandled);
232 template <
typename ConcreteType,
typename ResultType = void,
233 typename... ExtraArgs>
237 auto *thisCast =
static_cast<ConcreteType *
>(
this);
238 return TypeSwitch<Operation *, ResultType>(op)
239 .template Case<AttachOp, ConnectOp, MatchingConnectOp, RefDefineOp,
240 ForceOp, PrintFOp, SkipOp, StopOp, WhenOp, AssertOp,
241 AssumeOp, CoverOp, PropAssignOp, RefForceOp,
242 RefForceInitialOp, RefReleaseOp, RefReleaseInitialOp,
243 FPGAProbeIntrinsicOp, VerifAssertIntrinsicOp,
244 VerifAssumeIntrinsicOp, UnclockedAssumeIntrinsicOp,
245 VerifCoverIntrinsicOp, LayerBlockOp, MatchOp>(
246 [&](
auto opNode) -> ResultType {
247 return thisCast->visitStmt(opNode, args...);
249 .Default([&](
auto expr) -> ResultType {
250 return thisCast->visitInvalidStmt(op, args...);
256 op->emitOpError(
"unknown firrtl stmt");
266 #define HANDLE(OPTYPE) \
267 ResultType visitStmt(OPTYPE op, ExtraArgs... args) { \
268 return static_cast<ConcreteType *>(this)->visitUnhandledStmt(op, args...); \
300 template <
typename ConcreteType,
typename ResultType = void,
301 typename... ExtraArgs>
305 auto *thisCast =
static_cast<ConcreteType *
>(
this);
306 return TypeSwitch<Operation *, ResultType>(op)
307 .template Case<InstanceOp, InstanceChoiceOp, ObjectOp, MemOp, NodeOp,
308 RegOp, RegResetOp, WireOp, VerbatimWireOp>(
309 [&](
auto opNode) -> ResultType {
310 return thisCast->visitDecl(opNode, args...);
312 .Default([&](
auto expr) -> ResultType {
313 return thisCast->visitInvalidDecl(op, args...);
319 op->emitOpError(
"unknown firrtl decl");
329 #define HANDLE(OPTYPE) \
330 ResultType visitDecl(OPTYPE op, ExtraArgs... args) { \
331 return static_cast<ConcreteType *>(this)->visitUnhandledDecl(op, args...); \
348 template <
typename ConcreteType,
typename ResultType = void,
349 typename... ExtraArgs>
353 auto *thisCast =
static_cast<ConcreteType *
>(
this);
354 return TypeSwitch<Operation *, ResultType>(op)
355 .template Case<GenericIntrinsicOp, DPICallIntrinsicOp>(
356 [&](
auto expr) -> ResultType {
357 return thisCast->visitStmtExpr(expr, args...);
359 .Default([&](
auto expr) -> ResultType {
360 return thisCast->visitInvalidStmtExpr(op, args...);
366 op->emitOpError(
"unknown FIRRTL stmt expression");
376 #define HANDLE(OPTYPE, OPKIND) \
377 ResultType visitStmtExpr(OPTYPE op, ExtraArgs... args) { \
378 return static_cast<ConcreteType *>(this)->visit##OPKIND##StmtExpr( \
395 template <
typename ConcreteType,
typename ResultType = void,
396 typename... ExtraArgs>
398 :
public ExprVisitor<ConcreteType, ResultType, ExtraArgs...>,
399 public StmtVisitor<ConcreteType, ResultType, ExtraArgs...>,
400 public DeclVisitor<ConcreteType, ResultType, ExtraArgs...>,
419 return static_cast<ConcreteType *
>(
this)->
visitInvalidOp(op, args...);
ExprVisitor is a visitor for FIRRTL declaration nodes.
ResultType dispatchDeclVisitor(Operation *op, ExtraArgs... args)
ResultType visitInvalidDecl(Operation *op, ExtraArgs... args)
This callback is invoked on any non-Decl operations.
ResultType visitUnhandledDecl(Operation *op, ExtraArgs... args)
This callback is invoked on any Decl operations that are not handled by the concrete visitor.
ExprVisitor is a visitor for FIRRTL expression nodes.
HANDLE(ListCreateOp, Unhandled)
HANDLE(LTLUntilIntrinsicOp, Unhandled)
HANDLE(DoubleConstantOp, Unhandled)
HANDLE(LTLNotIntrinsicOp, Unhandled)
HANDLE(PadPrimOp, Unhandled)
HANDLE(SubPrimOp, Binary)
HANDLE(ElementwiseXorPrimOp, Unhandled)
HANDLE(ClockDividerIntrinsicOp, Unhandled)
HANDLE(AddPrimOp, Binary)
HANDLE(BitsPrimOp, Unhandled)
HANDLE(RWProbeOp, Unhandled)
HANDLE(LTLAndIntrinsicOp, Unhandled)
HANDLE(OpenSubfieldOp, Unhandled)
HANDLE(BoolConstantOp, Unhandled)
HANDLE(AndRPrimOp, Unary)
HANDLE(HeadPrimOp, Unhandled)
HANDLE(ClockInverterIntrinsicOp, Unhandled)
HANDLE(LTLGoToRepeatIntrinsicOp, Unhandled)
HANDLE(LTLNonConsecutiveRepeatIntrinsicOp, Unhandled)
HANDLE(BitCastOp, Unhandled)
HANDLE(SubindexOp, Unhandled)
HANDLE(HasBeenResetIntrinsicOp, Unhandled)
HANDLE(SubfieldOp, Unhandled)
HANDLE(DShrPrimOp, Binary)
HANDLE(AsUIntPrimOp, Unary)
HANDLE(LTLDelayIntrinsicOp, Unhandled)
HANDLE(RefCastOp, Unhandled)
HANDLE(ElementwiseOrPrimOp, Unhandled)
HANDLE(MultibitMuxOp, Unhandled)
HANDLE(XorRPrimOp, Unary)
HANDLE(ConstCastOp, Unhandled)
HANDLE(Mux4CellIntrinsicOp, Unhandled)
HANDLE(StringConstantOp, Unhandled)
HANDLE(LTLConcatIntrinsicOp, Unhandled)
HANDLE(TagExtractOp, Unhandled)
HANDLE(UninferredResetCastOp, Unhandled)
HANDLE(XorPrimOp, Binary)
HANDLE(MulPrimOp, Binary)
HANDLE(LTLImplicationIntrinsicOp, Unhandled)
HANDLE(ListConcatOp, Unhandled)
ResultType visitInvalidExpr(Operation *op, ExtraArgs... args)
This callback is invoked on any non-expression operations.
ResultType dispatchExprVisitor(Operation *op, ExtraArgs... args)
HANDLE(RefSubOp, Unhandled)
HANDLE(ObjectAnyRefCastOp, Unhandled)
HANDLE(LTLIntersectIntrinsicOp, Unhandled)
HANDLE(RemPrimOp, Binary)
HANDLE(IntegerShrOp, Unhandled)
HANDLE(Mux2CellIntrinsicOp, Unhandled)
HANDLE(MuxPrimOp, Unhandled)
HANDLE(BundleCreateOp, Unhandled)
HANDLE(PlusArgsTestIntrinsicOp, Unhandled)
HANDLE(FEnumCreateOp, Unhandled)
HANDLE(RefSendOp, Unhandled)
HANDLE(XMRDerefOp, Unhandled)
HANDLE(ShrPrimOp, Unhandled)
HANDLE(IntegerAddOp, Unhandled)
HANDLE(UnresolvedPathOp, Unhandled)
HANDLE(PlusArgsValueIntrinsicOp, Unhandled)
HANDLE(LTLOrIntrinsicOp, Unhandled)
HANDLE(LTLRepeatIntrinsicOp, Unhandled)
HANDLE(CatPrimOp, Binary)
HANDLE(FIntegerConstantOp, Unhandled)
HANDLE(HWStructCastOp, Unhandled)
HANDLE(ClockGateIntrinsicOp, Unhandled)
HANDLE(OpenSubindexOp, Unhandled)
HANDLE(ObjectSubfieldOp, Unhandled)
HANDLE(InvalidValueOp, Unhandled)
HANDLE(SubaccessOp, Unhandled)
HANDLE(DShlPrimOp, Binary)
HANDLE(ShlPrimOp, Unhandled)
HANDLE(IsXIntrinsicOp, Unhandled)
HANDLE(RefResolveOp, Unhandled)
HANDLE(XMRRefOp, Unhandled)
HANDLE(TailPrimOp, Unhandled)
HANDLE(IntegerMulOp, Unhandled)
HANDLE(LTLClockIntrinsicOp, Unhandled)
HANDLE(GEQPrimOp, Binary)
HANDLE(ElementwiseAndPrimOp, Unhandled)
ResultType visitUnaryExpr(Operation *op, ExtraArgs... args)
This fallback is invoked on any unary expr that isn't explicitly handled.
HANDLE(SizeOfIntrinsicOp, Unhandled)
ResultType visitUnhandledExpr(Operation *op, ExtraArgs... args)
This callback is invoked on any expression operations that are not handled by the concrete visitor.
HANDLE(LEQPrimOp, Binary)
HANDLE(ConstantOp, Unhandled)
HANDLE(AsAsyncResetPrimOp, Unary)
HANDLE(DShlwPrimOp, Binary)
ResultType visitBinaryExpr(Operation *op, ExtraArgs... args)
This fallback is invoked on any binary expr that isn't explicitly handled.
HANDLE(AggregateConstantOp, Unhandled)
HANDLE(AndPrimOp, Binary)
HANDLE(AsClockPrimOp, Unary)
HANDLE(SpecialConstantOp, Unhandled)
HANDLE(VectorCreateOp, Unhandled)
HANDLE(LTLEventuallyIntrinsicOp, Unhandled)
HANDLE(DivPrimOp, Binary)
HANDLE(NEQPrimOp, Binary)
HANDLE(SubtagOp, Unhandled)
HANDLE(VerbatimExprOp, Unhandled)
HANDLE(IsTagOp, Unhandled)
HANDLE(AsSIntPrimOp, Unary)
HANDLE(PathOp, Unhandled)
FIRRTLVisitor allows you to visit all of the expr/stmt/decls with one class declaration.
ResultType dispatchVisitor(Operation *op, ExtraArgs... args)
This is the main entrypoint for the FIRRTLVisitor.
ResultType visitInvalidOp(Operation *op, ExtraArgs... args)
visitInvalidOp is an override point for non-FIRRTL dialect operations.
ResultType visitUnhandledExpr(Operation *op, ExtraArgs... args)
ResultType visitUnhandledOp(Operation *op, ExtraArgs... args)
visitUnhandledOp is an override point for FIRRTL dialect ops that the concrete visitor didn't bother ...
ResultType visitUnhandledStmt(Operation *op, ExtraArgs... args)
ResultType visitUnhandledDecl(Operation *op, ExtraArgs... args)
ResultType visitUnhandledStmtExpr(Operation *op, ExtraArgs... args)
ResultType visitInvalidDecl(Operation *op, ExtraArgs... args)
ResultType visitInvalidExpr(Operation *op, ExtraArgs... args)
ResultType visitInvalidStmtExpr(Operation *op, ExtraArgs... args)
ResultType visitInvalidStmt(Operation *op, ExtraArgs... args)
StmtExprVisitor is a visitor for FIRRTL operation that has an optional result.
HANDLE(DPICallIntrinsicOp, Unhandled)
ResultType visitUnhandledStmtExpr(Operation *op, ExtraArgs... args)
This callback is invoked on any StmtExpr operations that are not handled by the concrete visitor.
ResultType visitInvalidStmtExpr(Operation *op, ExtraArgs... args)
This callback is invoked on any non-StmtExpr operations.
HANDLE(GenericIntrinsicOp, Unhandled)
ResultType dispatchStmtExprVisitor(Operation *op, ExtraArgs... args)
ExprVisitor is a visitor for FIRRTL statement nodes.
HANDLE(VerifCoverIntrinsicOp)
HANDLE(RefForceInitialOp)
ResultType dispatchStmtVisitor(Operation *op, ExtraArgs... args)
HANDLE(UnclockedAssumeIntrinsicOp)
HANDLE(VerifAssertIntrinsicOp)
ResultType visitUnhandledStmt(Operation *op, ExtraArgs... args)
This callback is invoked on any Stmt operations that are not handled by the concrete visitor.
HANDLE(RefReleaseInitialOp)
HANDLE(FPGAProbeIntrinsicOp)
HANDLE(MatchingConnectOp)
ResultType visitInvalidStmt(Operation *op, ExtraArgs... args)
This callback is invoked on any non-Stmt operations.
HANDLE(VerifAssumeIntrinsicOp)
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.