13#ifndef CIRCT_DIALECT_HW_HWVISITORS_H
14#define CIRCT_DIALECT_HW_HWVISITORS_H
17#include "llvm/ADT/TypeSwitch.h"
23template <
typename ConcreteType,
typename ResultType = void,
24 typename... ExtraArgs>
28 auto *thisCast =
static_cast<ConcreteType *
>(
this);
29 return TypeSwitch<Operation *, ResultType>(op)
30 .template Case<ConstantOp, AggregateConstantOp,
32 ArraySliceOp, ArrayCreateOp, ArrayConcatOp, ArrayGetOp,
35 StructCreateOp, StructExtractOp, StructInjectOp,
37 UnionCreateOp, UnionExtractOp,
39 BitcastOp, ParamValueOp,
41 EnumConstantOp, EnumCmpOp>([&](
auto expr) -> ResultType {
42 return thisCast->visitTypeOp(expr, args...);
44 .Default([&](
auto expr) -> ResultType {
45 return thisCast->visitInvalidTypeOp(op, args...);
51 op->emitOpError(
"unknown HW combinational node");
61#define HANDLE(OPTYPE, OPKIND) \
62 ResultType visitTypeOp(OPTYPE op, ExtraArgs... args) { \
63 return static_cast<ConcreteType *>(this)->visit##OPKIND##TypeOp(op, \
61#define HANDLE(OPTYPE, OPKIND) \ …
68 HANDLE(AggregateConstantOp, Unhandled);
87template <
typename ConcreteType,
typename ResultType = void,
88 typename... ExtraArgs>
92 auto *thisCast =
static_cast<ConcreteType *
>(
this);
93 return TypeSwitch<Operation *, ResultType>(op)
94 .template Case<OutputOp, InstanceOp, InstanceChoiceOp, TypeScopeOp,
95 TypedeclOp>([&](
auto expr) -> ResultType {
96 return thisCast->visitStmt(expr, args...);
98 .Default([&](
auto expr) -> ResultType {
99 return thisCast->visitInvalidStmt(op, args...);
105 op->emitOpError(
"unknown hw statement");
125#define HANDLE(OPTYPE, OPKIND) \
126 ResultType visitStmt(OPTYPE op, ExtraArgs... args) { \
127 return static_cast<ConcreteType *>(this)->visit##OPKIND##Stmt(op, \
This helps visit TypeOp nodes.
ResultType visitInvalidStmt(Operation *op, ExtraArgs... args)
This callback is invoked on any non-expression operations.
ResultType visitUnaryTypeOp(Operation *op, ExtraArgs... args)
HANDLE(InstanceOp, Unhandled)
HANDLE(TypeScopeOp, Unhandled)
ResultType visitUnhandledTypeOp(Operation *op, ExtraArgs... args)
This callback is invoked on any combinational operations that are not handled by the concrete visitor...
HANDLE(TypedeclOp, Unhandled)
HANDLE(OutputOp, Unhandled)
HANDLE(InstanceChoiceOp, Unhandled)
ResultType visitBinaryTypeOp(Operation *op, ExtraArgs... args)
This fallback is invoked on any binary node that isn't explicitly handled.
ResultType dispatchStmtVisitor(Operation *op, ExtraArgs... args)
This helps visit TypeOp nodes.
HANDLE(EnumCmpOp, Unhandled)
HANDLE(ParamValueOp, Unhandled)
HANDLE(AggregateConstantOp, Unhandled)
HANDLE(ConstantOp, Unhandled)
HANDLE(UnionExtractOp, Unhandled)
ResultType dispatchTypeOpVisitor(Operation *op, ExtraArgs... args)
HANDLE(ArrayGetOp, Unhandled)
HANDLE(ArraySliceOp, Unhandled)
HANDLE(StructExtractOp, Unhandled)
HANDLE(ArrayConcatOp, Unhandled)
HANDLE(ArrayInjectOp, Unhandled)
HANDLE(StructCreateOp, Unhandled)
HANDLE(StructInjectOp, Unhandled)
HANDLE(ArrayCreateOp, Unhandled)
ResultType visitUnhandledTypeOp(Operation *op, ExtraArgs... args)
This callback is invoked on any combinational operations that are not handled by the concrete visitor...
ResultType visitInvalidTypeOp(Operation *op, ExtraArgs... args)
This callback is invoked on any non-expression operations.
HANDLE(UnionCreateOp, Unhandled)
HANDLE(BitcastOp, Unhandled)
HANDLE(EnumConstantOp, Unhandled)
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.