CIRCT  19.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, 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 
140  // Type declarations.
141  HANDLE(InterfaceOp, Unhandled);
142  HANDLE(InterfaceInstanceOp, Unhandled);
143  HANDLE(InterfaceSignalOp, Unhandled);
144  HANDLE(InterfaceModportOp, Unhandled);
145  HANDLE(GetModportOp, Unhandled);
146  HANDLE(AssignInterfaceSignalOp, Unhandled);
147  HANDLE(ReadInterfaceSignalOp, Unhandled);
148  HANDLE(MacroDefOp, Unhandled);
149  HANDLE(MacroDeclOp, Unhandled);
150  HANDLE(FuncDPIImportOp, Unhandled);
151  HANDLE(FuncOp, Unhandled);
152 
153  // Verification statements.
154  HANDLE(AssertOp, Unhandled);
155  HANDLE(AssumeOp, Unhandled);
156  HANDLE(CoverOp, Unhandled);
157  HANDLE(AssertConcurrentOp, Unhandled);
158  HANDLE(AssumeConcurrentOp, Unhandled);
159  HANDLE(CoverConcurrentOp, Unhandled);
160  HANDLE(AssertPropertyOp, Unhandled);
161  HANDLE(AssumePropertyOp, Unhandled);
162  HANDLE(CoverPropertyOp, Unhandled);
163 
164  // Bind statements.
165  HANDLE(BindOp, Unhandled);
166 
167  // Simulator control tasks
168  HANDLE(StopOp, Unhandled);
169  HANDLE(FinishOp, Unhandled);
170  HANDLE(ExitOp, Unhandled);
171 
172  // Severity message tasks
173  HANDLE(FatalOp, Unhandled);
174  HANDLE(ErrorOp, Unhandled);
175  HANDLE(WarningOp, Unhandled);
176  HANDLE(InfoOp, Unhandled);
177 
178  // Memory loading tasks
179  HANDLE(ReadMemOp, Unhandled);
180 
181  // Generate statements
182  HANDLE(GenerateOp, Unhandled);
183  HANDLE(GenerateCaseOp, Unhandled);
184 
185  // For loop.
186  HANDLE(ForOp, Unhandled);
187 
188  // Sampled Value Functions
189  HANDLE(SampledOp, Unhandled);
190 #undef HANDLE
191 };
192 
193 } // namespace sv
194 } // namespace circt
195 
196 #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(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