CIRCT  20.0.0git
SVVisitors.h
Go to the documentation of this file.
1 //===- SVVisitors.h - SV 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 SV IR.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef CIRCT_DIALECT_SV_SVVISITORS_H
14 #define CIRCT_DIALECT_SV_SVVISITORS_H
15 
16 #include "circt/Dialect/SV/SVOps.h"
17 #include "llvm/ADT/TypeSwitch.h"
18 
19 namespace circt {
20 namespace sv {
21 
22 template <typename ConcreteType, typename ResultType = void,
23  typename... ExtraArgs>
24 class Visitor {
25 public:
26  ResultType dispatchSVVisitor(Operation *op, ExtraArgs... args) {
27  auto *thisCast = static_cast<ConcreteType *>(this);
28  return TypeSwitch<Operation *, ResultType>(op)
29  .template Case<
30  // Expressions
31  ReadInOutOp, ArrayIndexInOutOp, VerbatimExprOp, VerbatimExprSEOp,
32  IndexedPartSelectInOutOp, IndexedPartSelectOp, StructFieldInOutOp,
33  ConstantXOp, ConstantZOp, ConstantStrOp, MacroRefExprOp,
34  MacroRefExprSEOp, UnpackedArrayCreateOp, UnpackedOpenArrayCastOp,
35  // Declarations.
36  RegOp, WireOp, LogicOp, LocalParamOp, XMROp, XMRRefOp,
37  // Control flow.
38  OrderedOutputOp, IfDefOp, IfDefProceduralOp, IfOp, AlwaysOp,
39  AlwaysCombOp, AlwaysFFOp, InitialOp, CaseOp,
40  // Other Statements.
41  AssignOp, BPAssignOp, PAssignOp, ForceOp, ReleaseOp, AliasOp,
42  FWriteOp, SystemFunctionOp, VerbatimOp, MacroRefOp, FuncCallOp,
43  FuncCallProceduralOp, ReturnOp,
44  // Type declarations.
45  InterfaceOp, InterfaceSignalOp, InterfaceModportOp,
46  InterfaceInstanceOp, GetModportOp, AssignInterfaceSignalOp,
47  ReadInterfaceSignalOp, MacroDeclOp, MacroDefOp, FuncOp,
48  FuncDPIImportOp,
49  // Verification statements.
50  AssertOp, AssumeOp, CoverOp, AssertConcurrentOp, AssumeConcurrentOp,
51  CoverConcurrentOp, AssertPropertyOp, AssumePropertyOp,
52  CoverPropertyOp,
53  // Bind Statements
54  BindOp,
55  // Simulator control tasks
56  StopOp, FinishOp, ExitOp,
57  // Severity message tasks
58  FatalOp, ErrorOp, WarningOp, InfoOp,
59  // Memory loading tasks
60  ReadMemOp,
61  // Generate statements
62  GenerateOp, GenerateCaseOp,
63  // For statements
64  ForOp,
65  // Sampled value functiions
66  SampledOp>([&](auto expr) -> ResultType {
67  return thisCast->visitSV(expr, args...);
68  })
69  .Default([&](auto expr) -> ResultType {
70  return thisCast->visitInvalidSV(op, args...);
71  });
72  }
73 
74  /// This callback is invoked on any invalid operations.
75  ResultType visitInvalidSV(Operation *op, ExtraArgs... args) {
76  op->emitOpError("unknown SV node");
77  abort();
78  }
79 
80  /// This callback is invoked on any SV operations that are not handled by the
81  /// concrete visitor.
82  ResultType visitUnhandledSV(Operation *op, ExtraArgs... args) {
83  return ResultType();
84  }
85 
86 #define HANDLE(OPTYPE, OPKIND) \
87  ResultType visitSV(OPTYPE op, ExtraArgs... args) { \
88  return static_cast<ConcreteType *>(this)->visit##OPKIND##SV(op, args...); \
89  }
90 
91  // Declarations
92  HANDLE(RegOp, Unhandled);
93  HANDLE(WireOp, Unhandled);
94  HANDLE(LogicOp, Unhandled);
95  HANDLE(LocalParamOp, Unhandled);
96  HANDLE(XMROp, Unhandled);
97  HANDLE(XMRRefOp, Unhandled);
98 
99  // Expressions
100  HANDLE(ReadInOutOp, Unhandled);
101  HANDLE(ArrayIndexInOutOp, Unhandled);
102  HANDLE(VerbatimExprOp, Unhandled);
103  HANDLE(VerbatimExprSEOp, Unhandled);
104  HANDLE(IndexedPartSelectInOutOp, Unhandled);
105  HANDLE(IndexedPartSelectOp, Unhandled);
106  HANDLE(StructFieldInOutOp, Unhandled);
107  HANDLE(ConstantXOp, Unhandled);
108  HANDLE(ConstantZOp, Unhandled);
109  HANDLE(ConstantStrOp, Unhandled);
110  HANDLE(MacroRefExprOp, Unhandled);
111  HANDLE(MacroRefExprSEOp, Unhandled);
112  HANDLE(UnpackedArrayCreateOp, Unhandled);
113  HANDLE(UnpackedOpenArrayCastOp, Unhandled);
114 
115  // Control flow.
116  HANDLE(OrderedOutputOp, Unhandled);
117  HANDLE(IfDefOp, Unhandled);
118  HANDLE(IfDefProceduralOp, Unhandled);
119  HANDLE(IfOp, Unhandled);
120  HANDLE(AlwaysOp, Unhandled);
121  HANDLE(AlwaysCombOp, Unhandled);
122  HANDLE(AlwaysFFOp, Unhandled);
123  HANDLE(InitialOp, Unhandled);
124  HANDLE(CaseOp, Unhandled);
125 
126  // Other Statements.
127  HANDLE(AssignOp, Unhandled);
128  HANDLE(BPAssignOp, Unhandled);
129  HANDLE(PAssignOp, Unhandled);
130  HANDLE(ForceOp, Unhandled);
131  HANDLE(ReleaseOp, Unhandled);
132  HANDLE(AliasOp, Unhandled);
133  HANDLE(FWriteOp, Unhandled);
134  HANDLE(SystemFunctionOp, Unhandled);
135  HANDLE(FuncCallProceduralOp, Unhandled);
136  HANDLE(FuncCallOp, Unhandled);
137  HANDLE(ReturnOp, Unhandled);
138  HANDLE(VerbatimOp, Unhandled);
139  HANDLE(MacroRefOp, Unhandled);
140 
141  // Type declarations.
142  HANDLE(InterfaceOp, Unhandled);
143  HANDLE(InterfaceInstanceOp, Unhandled);
144  HANDLE(InterfaceSignalOp, Unhandled);
145  HANDLE(InterfaceModportOp, Unhandled);
146  HANDLE(GetModportOp, Unhandled);
147  HANDLE(AssignInterfaceSignalOp, Unhandled);
148  HANDLE(ReadInterfaceSignalOp, Unhandled);
149  HANDLE(MacroDefOp, Unhandled);
150  HANDLE(MacroDeclOp, Unhandled);
151  HANDLE(FuncDPIImportOp, Unhandled);
152  HANDLE(FuncOp, Unhandled);
153 
154  // Verification statements.
155  HANDLE(AssertOp, Unhandled);
156  HANDLE(AssumeOp, Unhandled);
157  HANDLE(CoverOp, Unhandled);
158  HANDLE(AssertConcurrentOp, Unhandled);
159  HANDLE(AssumeConcurrentOp, Unhandled);
160  HANDLE(CoverConcurrentOp, Unhandled);
161  HANDLE(AssertPropertyOp, Unhandled);
162  HANDLE(AssumePropertyOp, Unhandled);
163  HANDLE(CoverPropertyOp, Unhandled);
164 
165  // Bind statements.
166  HANDLE(BindOp, Unhandled);
167 
168  // Simulator control tasks
169  HANDLE(StopOp, Unhandled);
170  HANDLE(FinishOp, Unhandled);
171  HANDLE(ExitOp, Unhandled);
172 
173  // Severity message tasks
174  HANDLE(FatalOp, Unhandled);
175  HANDLE(ErrorOp, Unhandled);
176  HANDLE(WarningOp, Unhandled);
177  HANDLE(InfoOp, Unhandled);
178 
179  // Memory loading tasks
180  HANDLE(ReadMemOp, Unhandled);
181 
182  // Generate statements
183  HANDLE(GenerateOp, Unhandled);
184  HANDLE(GenerateCaseOp, Unhandled);
185 
186  // For loop.
187  HANDLE(ForOp, Unhandled);
188 
189  // Sampled Value Functions
190  HANDLE(SampledOp, Unhandled);
191 #undef HANDLE
192 };
193 
194 } // namespace sv
195 } // namespace circt
196 
197 #endif // CIRCT_DIALECT_SV_SVVISITORS_H
HANDLE(AssumePropertyOp, Unhandled)
HANDLE(BindOp, Unhandled)
HANDLE(ConstantXOp, Unhandled)
HANDLE(InterfaceSignalOp, Unhandled)
HANDLE(ConstantStrOp, Unhandled)
HANDLE(ReadInterfaceSignalOp, Unhandled)
HANDLE(StopOp, Unhandled)
HANDLE(ExitOp, Unhandled)
HANDLE(ForOp, Unhandled)
HANDLE(FinishOp, Unhandled)
HANDLE(XMRRefOp, Unhandled)
HANDLE(FWriteOp, Unhandled)
HANDLE(AssumeOp, Unhandled)
HANDLE(IfDefOp, Unhandled)
HANDLE(AssertOp, Unhandled)
HANDLE(ForceOp, Unhandled)
HANDLE(AssignOp, Unhandled)
HANDLE(CoverOp, Unhandled)
HANDLE(RegOp, Unhandled)
HANDLE(FuncOp, Unhandled)
HANDLE(FuncCallOp, Unhandled)
HANDLE(ReadInOutOp, Unhandled)
ResultType dispatchSVVisitor(Operation *op, ExtraArgs... args)
Definition: SVVisitors.h:26
HANDLE(UnpackedOpenArrayCastOp, Unhandled)
HANDLE(WarningOp, Unhandled)
HANDLE(SampledOp, Unhandled)
HANDLE(VerbatimExprOp, Unhandled)
HANDLE(XMROp, Unhandled)
HANDLE(ReleaseOp, Unhandled)
HANDLE(MacroDeclOp, Unhandled)
HANDLE(IfOp, Unhandled)
HANDLE(InterfaceOp, Unhandled)
HANDLE(AlwaysCombOp, Unhandled)
HANDLE(AlwaysOp, Unhandled)
HANDLE(CoverPropertyOp, Unhandled)
HANDLE(InitialOp, Unhandled)
HANDLE(GenerateCaseOp, Unhandled)
HANDLE(GetModportOp, Unhandled)
HANDLE(InterfaceInstanceOp, Unhandled)
HANDLE(StructFieldInOutOp, Unhandled)
HANDLE(ArrayIndexInOutOp, Unhandled)
HANDLE(FatalOp, Unhandled)
HANDLE(AlwaysFFOp, Unhandled)
HANDLE(AssertPropertyOp, Unhandled)
HANDLE(CoverConcurrentOp, Unhandled)
HANDLE(BPAssignOp, Unhandled)
HANDLE(CaseOp, Unhandled)
HANDLE(InterfaceModportOp, Unhandled)
HANDLE(OrderedOutputOp, Unhandled)
HANDLE(InfoOp, Unhandled)
HANDLE(UnpackedArrayCreateOp, Unhandled)
HANDLE(PAssignOp, Unhandled)
ResultType visitUnhandledSV(Operation *op, ExtraArgs... args)
This callback is invoked on any SV operations that are not handled by the concrete visitor.
Definition: SVVisitors.h:82
ResultType visitInvalidSV(Operation *op, ExtraArgs... args)
This callback is invoked on any invalid operations.
Definition: SVVisitors.h:75
HANDLE(AssignInterfaceSignalOp, Unhandled)
HANDLE(VerbatimOp, Unhandled)
HANDLE(FuncDPIImportOp, Unhandled)
HANDLE(MacroRefOp, Unhandled)
HANDLE(AliasOp, Unhandled)
HANDLE(GenerateOp, Unhandled)
HANDLE(MacroRefExprOp, Unhandled)
HANDLE(WireOp, Unhandled)
HANDLE(ReturnOp, Unhandled)
HANDLE(IndexedPartSelectOp, Unhandled)
HANDLE(IndexedPartSelectInOutOp, Unhandled)
HANDLE(ConstantZOp, Unhandled)
HANDLE(AssumeConcurrentOp, Unhandled)
HANDLE(LocalParamOp, Unhandled)
HANDLE(FuncCallProceduralOp, Unhandled)
HANDLE(ReadMemOp, Unhandled)
HANDLE(MacroRefExprSEOp, Unhandled)
HANDLE(AssertConcurrentOp, Unhandled)
HANDLE(SystemFunctionOp, Unhandled)
HANDLE(ErrorOp, Unhandled)
HANDLE(LogicOp, Unhandled)
HANDLE(IfDefProceduralOp, Unhandled)
HANDLE(VerbatimExprSEOp, Unhandled)
HANDLE(MacroDefOp, Unhandled)
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.
Definition: DebugAnalysis.h:21
Definition: sv.py:1