CIRCT 20.0.0git
Loading...
Searching...
No Matches
SMTVisitors.h
Go to the documentation of this file.
1//===- SMTVisitors.h - SMT Dialect Visitors ---------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines visitors that make it easier to work with the SMT IR.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef CIRCT_DIALECT_SMT_SMTVISITORS_H
14#define CIRCT_DIALECT_SMT_SMTVISITORS_H
15
17#include "llvm/ADT/TypeSwitch.h"
18
19namespace circt {
20namespace smt {
21
22/// This helps visit SMT nodes.
23template <typename ConcreteType, typename ResultType = void,
24 typename... ExtraArgs>
26public:
27 ResultType dispatchSMTOpVisitor(Operation *op, ExtraArgs... args) {
28 auto *thisCast = static_cast<ConcreteType *>(this);
29 return TypeSwitch<Operation *, ResultType>(op)
30 .template Case<
31 // Constants
32 BoolConstantOp, IntConstantOp, BVConstantOp,
33 // Bit-vector arithmetic
34 BVNegOp, BVAddOp, BVMulOp, BVURemOp, BVSRemOp, BVSModOp, BVShlOp,
35 BVLShrOp, BVAShrOp, BVUDivOp, BVSDivOp,
36 // Bit-vector bitwise
37 BVNotOp, BVAndOp, BVOrOp, BVXOrOp,
38 // Other bit-vector ops
39 ConcatOp, ExtractOp, RepeatOp, BVCmpOp, BV2IntOp,
40 // Int arithmetic
41 IntAddOp, IntMulOp, IntSubOp, IntDivOp, IntModOp, IntCmpOp,
42 Int2BVOp,
43 // Core Ops
44 EqOp, DistinctOp, IteOp,
45 // Variable/symbol declaration
46 DeclareFunOp, ApplyFuncOp,
47 // solver interaction
48 SolverOp, AssertOp, ResetOp, PushOp, PopOp, CheckOp, SetLogicOp,
49 // Boolean logic
50 NotOp, AndOp, OrOp, XOrOp, ImpliesOp,
51 // Arrays
52 ArrayStoreOp, ArraySelectOp, ArrayBroadcastOp,
53 // Quantifiers
54 ForallOp, ExistsOp, YieldOp>([&](auto expr) -> ResultType {
55 return thisCast->visitSMTOp(expr, args...);
56 })
57 .Default([&](auto expr) -> ResultType {
58 return thisCast->visitInvalidSMTOp(op, args...);
59 });
60 }
61
62 /// This callback is invoked on any non-expression operations.
63 ResultType visitInvalidSMTOp(Operation *op, ExtraArgs... args) {
64 op->emitOpError("unknown SMT node");
65 abort();
66 }
67
68 /// This callback is invoked on any SMT operations that are not
69 /// handled by the concrete visitor.
70 ResultType visitUnhandledSMTOp(Operation *op, ExtraArgs... args) {
71 return ResultType();
72 }
73
74#define HANDLE(OPTYPE, OPKIND) \
75 ResultType visitSMTOp(OPTYPE op, ExtraArgs... args) { \
76 return static_cast<ConcreteType *>(this)->visit##OPKIND##SMTOp(op, \
77 args...); \
78 }
79
80 // Constants
81 HANDLE(BoolConstantOp, Unhandled);
82 HANDLE(IntConstantOp, Unhandled);
83 HANDLE(BVConstantOp, Unhandled);
84
85 // Bit-vector arithmetic
86 HANDLE(BVNegOp, Unhandled);
87 HANDLE(BVAddOp, Unhandled);
88 HANDLE(BVMulOp, Unhandled);
89 HANDLE(BVURemOp, Unhandled);
90 HANDLE(BVSRemOp, Unhandled);
91 HANDLE(BVSModOp, Unhandled);
92 HANDLE(BVShlOp, Unhandled);
93 HANDLE(BVLShrOp, Unhandled);
94 HANDLE(BVAShrOp, Unhandled);
95 HANDLE(BVUDivOp, Unhandled);
96 HANDLE(BVSDivOp, Unhandled);
97
98 // Bit-vector bitwise operations
99 HANDLE(BVNotOp, Unhandled);
100 HANDLE(BVAndOp, Unhandled);
101 HANDLE(BVOrOp, Unhandled);
102 HANDLE(BVXOrOp, Unhandled);
103
104 // Other bit-vector operations
105 HANDLE(ConcatOp, Unhandled);
106 HANDLE(ExtractOp, Unhandled);
107 HANDLE(RepeatOp, Unhandled);
108 HANDLE(BVCmpOp, Unhandled);
109 HANDLE(BV2IntOp, Unhandled);
110
111 // Int arithmetic
112 HANDLE(IntAddOp, Unhandled);
113 HANDLE(IntMulOp, Unhandled);
114 HANDLE(IntSubOp, Unhandled);
115 HANDLE(IntDivOp, Unhandled);
116 HANDLE(IntModOp, Unhandled);
117
118 HANDLE(IntCmpOp, Unhandled);
119 HANDLE(Int2BVOp, Unhandled);
120
121 HANDLE(EqOp, Unhandled);
122 HANDLE(DistinctOp, Unhandled);
123 HANDLE(IteOp, Unhandled);
124
125 HANDLE(DeclareFunOp, Unhandled);
126 HANDLE(ApplyFuncOp, Unhandled);
127
128 HANDLE(SolverOp, Unhandled);
129 HANDLE(AssertOp, Unhandled);
130 HANDLE(ResetOp, Unhandled);
131 HANDLE(PushOp, Unhandled);
132 HANDLE(PopOp, Unhandled);
133 HANDLE(CheckOp, Unhandled);
134 HANDLE(SetLogicOp, Unhandled);
135
136 // Boolean logic operations
137 HANDLE(NotOp, Unhandled);
138 HANDLE(AndOp, Unhandled);
139 HANDLE(OrOp, Unhandled);
140 HANDLE(XOrOp, Unhandled);
141 HANDLE(ImpliesOp, Unhandled);
142
143 // Array operations
144 HANDLE(ArrayStoreOp, Unhandled);
145 HANDLE(ArraySelectOp, Unhandled);
146 HANDLE(ArrayBroadcastOp, Unhandled);
147
148 // Quantifier operations
149 HANDLE(ForallOp, Unhandled);
150 HANDLE(ExistsOp, Unhandled);
151 HANDLE(YieldOp, Unhandled);
152
153#undef HANDLE
154};
155
156/// This helps visit SMT types.
157template <typename ConcreteType, typename ResultType = void,
158 typename... ExtraArgs>
160public:
161 ResultType dispatchSMTTypeVisitor(Type type, ExtraArgs... args) {
162 auto *thisCast = static_cast<ConcreteType *>(this);
163 return TypeSwitch<Type, ResultType>(type)
164 .template Case<BoolType, IntType, BitVectorType, ArrayType, SMTFuncType,
165 SortType>([&](auto expr) -> ResultType {
166 return thisCast->visitSMTType(expr, args...);
167 })
168 .Default([&](auto expr) -> ResultType {
169 return thisCast->visitInvalidSMTType(type, args...);
170 });
171 }
172
173 /// This callback is invoked on any non-expression types.
174 ResultType visitInvalidSMTType(Type type, ExtraArgs... args) { abort(); }
175
176 /// This callback is invoked on any SMT type that are not
177 /// handled by the concrete visitor.
178 ResultType visitUnhandledSMTType(Type type, ExtraArgs... args) {
179 return ResultType();
180 }
181
182#define HANDLE(TYPE, KIND) \
183 ResultType visitSMTType(TYPE op, ExtraArgs... args) { \
184 return static_cast<ConcreteType *>(this)->visit##KIND##SMTType(op, \
185 args...); \
186 }
187
188 HANDLE(BoolType, Unhandled);
189 HANDLE(IntegerType, Unhandled);
190 HANDLE(BitVectorType, Unhandled);
191 HANDLE(ArrayType, Unhandled);
192 HANDLE(SMTFuncType, Unhandled);
193 HANDLE(SortType, Unhandled);
194
195#undef HANDLE
196};
197
198} // namespace smt
199} // namespace circt
200
201#endif // CIRCT_DIALECT_SMT_SMTVISITORS_H
This helps visit SMT nodes.
Definition SMTVisitors.h:25
HANDLE(YieldOp, Unhandled)
HANDLE(PushOp, Unhandled)
HANDLE(SetLogicOp, Unhandled)
HANDLE(BVAddOp, Unhandled)
HANDLE(DeclareFunOp, Unhandled)
HANDLE(BVOrOp, Unhandled)
HANDLE(PopOp, Unhandled)
HANDLE(ForallOp, Unhandled)
HANDLE(NotOp, Unhandled)
HANDLE(BVLShrOp, Unhandled)
HANDLE(ResetOp, Unhandled)
ResultType visitUnhandledSMTOp(Operation *op, ExtraArgs... args)
This callback is invoked on any SMT operations that are not handled by the concrete visitor.
Definition SMTVisitors.h:70
HANDLE(BVUDivOp, Unhandled)
HANDLE(BVConstantOp, Unhandled)
ResultType visitInvalidSMTOp(Operation *op, ExtraArgs... args)
This callback is invoked on any non-expression operations.
Definition SMTVisitors.h:63
HANDLE(BVAndOp, Unhandled)
HANDLE(BVMulOp, Unhandled)
HANDLE(IntConstantOp, Unhandled)
HANDLE(IntDivOp, Unhandled)
HANDLE(ApplyFuncOp, Unhandled)
HANDLE(IntModOp, Unhandled)
HANDLE(BVNotOp, Unhandled)
HANDLE(AndOp, Unhandled)
HANDLE(EqOp, Unhandled)
HANDLE(BVShlOp, Unhandled)
HANDLE(SolverOp, Unhandled)
HANDLE(IteOp, Unhandled)
HANDLE(RepeatOp, Unhandled)
HANDLE(OrOp, Unhandled)
HANDLE(BVSRemOp, Unhandled)
HANDLE(IntSubOp, Unhandled)
HANDLE(DistinctOp, Unhandled)
HANDLE(ImpliesOp, Unhandled)
HANDLE(BVAShrOp, Unhandled)
HANDLE(ArraySelectOp, Unhandled)
HANDLE(BVNegOp, Unhandled)
HANDLE(XOrOp, Unhandled)
HANDLE(ArrayBroadcastOp, Unhandled)
HANDLE(BVSDivOp, Unhandled)
HANDLE(ExistsOp, Unhandled)
HANDLE(ArrayStoreOp, Unhandled)
ResultType dispatchSMTOpVisitor(Operation *op, ExtraArgs... args)
Definition SMTVisitors.h:27
HANDLE(IntMulOp, Unhandled)
HANDLE(BVURemOp, Unhandled)
HANDLE(BVXOrOp, Unhandled)
HANDLE(Int2BVOp, Unhandled)
HANDLE(IntAddOp, Unhandled)
HANDLE(ExtractOp, Unhandled)
HANDLE(BVSModOp, Unhandled)
HANDLE(ConcatOp, Unhandled)
HANDLE(IntCmpOp, Unhandled)
HANDLE(BV2IntOp, Unhandled)
HANDLE(AssertOp, Unhandled)
HANDLE(CheckOp, Unhandled)
HANDLE(BVCmpOp, Unhandled)
HANDLE(BoolConstantOp, Unhandled)
This helps visit SMT types.
HANDLE(BitVectorType, Unhandled)
HANDLE(ArrayType, Unhandled)
HANDLE(BoolType, Unhandled)
HANDLE(SMTFuncType, Unhandled)
ResultType visitUnhandledSMTType(Type type, ExtraArgs... args)
This callback is invoked on any SMT type that are not handled by the concrete visitor.
HANDLE(SortType, Unhandled)
ResultType dispatchSMTTypeVisitor(Type type, ExtraArgs... args)
HANDLE(IntegerType, Unhandled)
ResultType visitInvalidSMTType(Type type, ExtraArgs... args)
This callback is invoked on any non-expression types.
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.
Definition smt.py:1