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"
24template <
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,
37 DomainSubfieldOp, ObjectAnyRefCastOp,
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, AsResetPrimOp,
49 AsClockPrimOp, CvtPrimOp, NegPrimOp, NotPrimOp, AndRPrimOp,
50 OrRPrimOp, XorRPrimOp,
52 IsXIntrinsicOp, PlusArgsValueIntrinsicOp, PlusArgsTestIntrinsicOp,
53 SizeOfIntrinsicOp, ClockGateIntrinsicOp, ClockInverterIntrinsicOp,
54 ClockDividerIntrinsicOp, LTLAndIntrinsicOp, LTLOrIntrinsicOp,
55 LTLIntersectIntrinsicOp, LTLDelayIntrinsicOp, LTLConcatIntrinsicOp,
56 LTLRepeatIntrinsicOp, LTLGoToRepeatIntrinsicOp,
57 LTLNonConsecutiveRepeatIntrinsicOp, LTLNotIntrinsicOp,
58 LTLImplicationIntrinsicOp, LTLUntilIntrinsicOp,
59 LTLEventuallyIntrinsicOp, LTLPastIntrinsicOp, LTLClockIntrinsicOp,
60 Mux2CellIntrinsicOp, Mux4CellIntrinsicOp, HasBeenResetIntrinsicOp,
62 BitsPrimOp, HeadPrimOp, MuxPrimOp, PadPrimOp, ShlPrimOp, ShrPrimOp,
63 TailPrimOp, VerbatimExprOp, HWStructCastOp, BitCastOp, RefSendOp,
64 RefResolveOp, RefSubOp, RWProbeOp, XMRRefOp, XMRDerefOp,
67 UninferredResetCastOp, ConstCastOp, RefCastOp,
69 StringConstantOp, FIntegerConstantOp, BoolConstantOp,
70 DoubleConstantOp, ListCreateOp, ListConcatOp, UnresolvedPathOp,
71 PathOp, IntegerAddOp, IntegerMulOp, IntegerShrOp, StringConcatOp,
72 PropEqOp, BoolAndOp, BoolOrOp, BoolXorOp, UnknownValueOp,
74 TimeOp, HierarchicalModuleNameOp>([&](
auto expr) -> ResultType {
75 return thisCast->visitExpr(expr, args...);
77 .Default([&](
auto expr) -> ResultType {
78 return thisCast->visitInvalidExpr(op, args...);
84 op->emitOpError(
"unknown FIRRTL expression");
106#define HANDLE(OPTYPE, OPKIND) \
107 ResultType visitExpr(OPTYPE op, ExtraArgs... args) { \
108 return static_cast<ConcreteType *>(this)->visit##OPKIND##Expr(op, \
175 HANDLE(PlusArgsValueIntrinsicOp, Unhandled);
176 HANDLE(PlusArgsTestIntrinsicOp, Unhandled);
179 HANDLE(ClockInverterIntrinsicOp, Unhandled);
180 HANDLE(ClockDividerIntrinsicOp, Unhandled);
183 HANDLE(LTLIntersectIntrinsicOp, Unhandled);
187 HANDLE(LTLGoToRepeatIntrinsicOp, Unhandled);
188 HANDLE(LTLNonConsecutiveRepeatIntrinsicOp, Unhandled);
190 HANDLE(LTLImplicationIntrinsicOp, Unhandled);
192 HANDLE(LTLEventuallyIntrinsicOp, Unhandled);
197 HANDLE(HasBeenResetIntrinsicOp, Unhandled);
219 HANDLE(UninferredResetCastOp, Unhandled);
245 HANDLE(HierarchicalModuleNameOp, Unhandled);
250template <
typename ConcreteType,
typename ResultType = void,
251 typename... ExtraArgs>
255 auto *thisCast =
static_cast<ConcreteType *
>(
this);
256 return TypeSwitch<Operation *, ResultType>(op)
257 .template Case<AttachOp, ConnectOp, MatchingConnectOp, RefDefineOp,
258 DomainDefineOp, ForceOp, PrintFOp, FPrintFOp, FFlushOp,
259 SkipOp, StopOp, WhenOp, AssertOp, AssumeOp, CoverOp,
260 PropAssignOp, RefForceOp, RefForceInitialOp,
261 RefReleaseOp, RefReleaseInitialOp, FPGAProbeIntrinsicOp,
262 VerifAssertIntrinsicOp, VerifAssumeIntrinsicOp,
263 UnclockedAssumeIntrinsicOp, VerifCoverIntrinsicOp,
264 VerifRequireIntrinsicOp, VerifEnsureIntrinsicOp,
265 LayerBlockOp, MatchOp, ViewIntrinsicOp, BindOp>(
266 [&](
auto opNode) -> ResultType {
267 return thisCast->visitStmt(opNode, args...);
269 .Default([&](
auto expr) -> ResultType {
270 return thisCast->visitInvalidStmt(op, args...);
276 op->emitOpError(
"unknown firrtl stmt");
286#define HANDLE(OPTYPE) \
287 ResultType visitStmt(OPTYPE op, ExtraArgs... args) { \
288 return static_cast<ConcreteType *>(this)->visitUnhandledStmt(op, args...); \
327template <
typename ConcreteType,
typename ResultType = void,
328 typename... ExtraArgs>
332 auto *thisCast =
static_cast<ConcreteType *
>(
this);
333 return TypeSwitch<Operation *, ResultType>(op)
334 .template Case<InstanceOp, InstanceChoiceOp, ObjectOp, MemOp, NodeOp,
335 RegOp, RegResetOp, WireOp, VerbatimWireOp, ContractOp,
336 DomainCreateOp>([&](
auto opNode) -> ResultType {
337 return thisCast->visitDecl(opNode, args...);
339 .Default([&](
auto expr) -> ResultType {
340 return thisCast->visitInvalidDecl(op, args...);
346 op->emitOpError(
"unknown firrtl decl");
356#define HANDLE(OPTYPE) \
357 ResultType visitDecl(OPTYPE op, ExtraArgs... args) { \
358 return static_cast<ConcreteType *>(this)->visitUnhandledDecl(op, args...); \
377template <
typename ConcreteType,
typename ResultType = void,
378 typename... ExtraArgs>
382 auto *thisCast =
static_cast<ConcreteType *
>(
this);
383 return TypeSwitch<Operation *, ResultType>(op)
384 .template Case<GenericIntrinsicOp, DPICallIntrinsicOp>(
385 [&](
auto expr) -> ResultType {
386 return thisCast->visitStmtExpr(expr, args...);
388 .Default([&](
auto expr) -> ResultType {
389 return thisCast->visitInvalidStmtExpr(op, args...);
395 op->emitOpError(
"unknown FIRRTL stmt expression");
405#define HANDLE(OPTYPE, OPKIND) \
406 ResultType visitStmtExpr(OPTYPE op, ExtraArgs... args) { \
407 return static_cast<ConcreteType *>(this)->visit##OPKIND##StmtExpr( \
424template <
typename ConcreteType,
typename ResultType = void,
425 typename... ExtraArgs>
427 :
public ExprVisitor<ConcreteType, ResultType, ExtraArgs...>,
428 public StmtVisitor<ConcreteType, ResultType, ExtraArgs...>,
429 public DeclVisitor<ConcreteType, ResultType, ExtraArgs...>,
448 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(UnknownValueOp, Unhandled)
HANDLE(LTLUntilIntrinsicOp, Unhandled)
HANDLE(DoubleConstantOp, Unhandled)
HANDLE(LTLNotIntrinsicOp, Unhandled)
HANDLE(PadPrimOp, Unhandled)
HANDLE(SubPrimOp, Binary)
HANDLE(ElementwiseXorPrimOp, Unhandled)
HANDLE(UnsafeDomainCastOp, Unhandled)
HANDLE(ClockDividerIntrinsicOp, Unhandled)
HANDLE(LTLPastIntrinsicOp, Unhandled)
HANDLE(AddPrimOp, Binary)
HANDLE(BitsPrimOp, Unhandled)
HANDLE(RWProbeOp, Unhandled)
HANDLE(LTLAndIntrinsicOp, Unhandled)
HANDLE(OpenSubfieldOp, Unhandled)
HANDLE(BoolConstantOp, Unhandled)
HANDLE(CatPrimOp, Unhandled)
HANDLE(AndRPrimOp, Unary)
HANDLE(HeadPrimOp, Unhandled)
HANDLE(ClockInverterIntrinsicOp, Unhandled)
HANDLE(LTLGoToRepeatIntrinsicOp, Unhandled)
HANDLE(LTLNonConsecutiveRepeatIntrinsicOp, Unhandled)
HANDLE(BitCastOp, Unhandled)
HANDLE(PropEqOp, Unhandled)
HANDLE(SubindexOp, Unhandled)
HANDLE(HasBeenResetIntrinsicOp, Unhandled)
HANDLE(SubfieldOp, Unhandled)
HANDLE(DShrPrimOp, Binary)
HANDLE(AsUIntPrimOp, Unary)
HANDLE(LTLDelayIntrinsicOp, Unhandled)
HANDLE(RefCastOp, Unhandled)
HANDLE(BoolAndOp, Unhandled)
HANDLE(ElementwiseOrPrimOp, Unhandled)
HANDLE(MultibitMuxOp, Unhandled)
HANDLE(XorRPrimOp, Unary)
HANDLE(ConstCastOp, Unhandled)
HANDLE(StringConcatOp, 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(TimeOp, 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(FIntegerConstantOp, Unhandled)
HANDLE(HWStructCastOp, Unhandled)
HANDLE(DomainSubfieldOp, Unhandled)
HANDLE(ClockGateIntrinsicOp, Unhandled)
HANDLE(OpenSubindexOp, Unhandled)
HANDLE(ObjectSubfieldOp, Unhandled)
HANDLE(InvalidValueOp, Unhandled)
HANDLE(SubaccessOp, Unhandled)
HANDLE(HierarchicalModuleNameOp, 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(BoolXorOp, 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(BoolOrOp, Unhandled)
HANDLE(NEQPrimOp, Binary)
HANDLE(SubtagOp, Unhandled)
HANDLE(VerbatimExprOp, Unhandled)
HANDLE(IsTagOp, Unhandled)
HANDLE(AsResetPrimOp, Unary)
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(VerifEnsureIntrinsicOp)
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(VerifRequireIntrinsicOp)
HANDLE(VerifAssumeIntrinsicOp)
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.