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,
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 
113  // Control flow.
114  HANDLE(OrderedOutputOp, Unhandled);
115  HANDLE(IfDefOp, Unhandled);
116  HANDLE(IfDefProceduralOp, Unhandled);
117  HANDLE(IfOp, Unhandled);
118  HANDLE(AlwaysOp, Unhandled);
119  HANDLE(AlwaysCombOp, Unhandled);
120  HANDLE(AlwaysFFOp, Unhandled);
121  HANDLE(InitialOp, Unhandled);
122  HANDLE(CaseOp, Unhandled);
123 
124  // Other Statements.
125  HANDLE(AssignOp, Unhandled);
126  HANDLE(BPAssignOp, Unhandled);
127  HANDLE(PAssignOp, Unhandled);
128  HANDLE(ForceOp, Unhandled);
129  HANDLE(ReleaseOp, Unhandled);
130  HANDLE(AliasOp, Unhandled);
131  HANDLE(FWriteOp, Unhandled);
132  HANDLE(SystemFunctionOp, Unhandled);
133  HANDLE(FuncCallProceduralOp, Unhandled);
134  HANDLE(FuncCallOp, Unhandled);
135  HANDLE(ReturnOp, Unhandled);
136  HANDLE(VerbatimOp, Unhandled);
137 
138  // Type declarations.
139  HANDLE(InterfaceOp, Unhandled);
140  HANDLE(InterfaceInstanceOp, Unhandled);
141  HANDLE(InterfaceSignalOp, Unhandled);
142  HANDLE(InterfaceModportOp, Unhandled);
143  HANDLE(GetModportOp, Unhandled);
144  HANDLE(AssignInterfaceSignalOp, Unhandled);
145  HANDLE(ReadInterfaceSignalOp, Unhandled);
146  HANDLE(MacroDefOp, Unhandled);
147  HANDLE(MacroDeclOp, Unhandled);
148  HANDLE(FuncDPIImportOp, Unhandled);
149  HANDLE(FuncOp, Unhandled);
150 
151  // Verification statements.
152  HANDLE(AssertOp, Unhandled);
153  HANDLE(AssumeOp, Unhandled);
154  HANDLE(CoverOp, Unhandled);
155  HANDLE(AssertConcurrentOp, Unhandled);
156  HANDLE(AssumeConcurrentOp, Unhandled);
157  HANDLE(CoverConcurrentOp, Unhandled);
158  HANDLE(AssertPropertyOp, Unhandled);
159  HANDLE(AssumePropertyOp, Unhandled);
160  HANDLE(CoverPropertyOp, Unhandled);
161 
162  // Bind statements.
163  HANDLE(BindOp, Unhandled);
164 
165  // Simulator control tasks
166  HANDLE(StopOp, Unhandled);
167  HANDLE(FinishOp, Unhandled);
168  HANDLE(ExitOp, Unhandled);
169 
170  // Severity message tasks
171  HANDLE(FatalOp, Unhandled);
172  HANDLE(ErrorOp, Unhandled);
173  HANDLE(WarningOp, Unhandled);
174  HANDLE(InfoOp, Unhandled);
175 
176  // Memory loading tasks
177  HANDLE(ReadMemOp, Unhandled);
178 
179  // Generate statements
180  HANDLE(GenerateOp, Unhandled);
181  HANDLE(GenerateCaseOp, Unhandled);
182 
183  // For loop.
184  HANDLE(ForOp, Unhandled);
185 
186  // Sampled Value Functions
187  HANDLE(SampledOp, Unhandled);
188 #undef HANDLE
189 };
190 
191 } // namespace sv
192 } // namespace circt
193 
194 #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(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(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