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,
43  // Type declarations.
44  InterfaceOp, InterfaceSignalOp, InterfaceModportOp,
45  InterfaceInstanceOp, GetModportOp, AssignInterfaceSignalOp,
46  ReadInterfaceSignalOp, MacroDeclOp, MacroDefOp,
47  // Verification statements.
48  AssertOp, AssumeOp, CoverOp, AssertConcurrentOp, AssumeConcurrentOp,
49  CoverConcurrentOp,
50  // Bind Statements
51  BindOp,
52  // Simulator control tasks
53  StopOp, FinishOp, ExitOp,
54  // Severity message tasks
55  FatalOp, ErrorOp, WarningOp, InfoOp,
56  // Memory loading tasks
57  ReadMemOp,
58  // Generate statements
59  GenerateOp, GenerateCaseOp,
60  // For statements
61  ForOp,
62  // Sampled value functiions
63  SampledOp>([&](auto expr) -> ResultType {
64  return thisCast->visitSV(expr, args...);
65  })
66  .Default([&](auto expr) -> ResultType {
67  return thisCast->visitInvalidSV(op, args...);
68  });
69  }
70 
71  /// This callback is invoked on any invalid operations.
72  ResultType visitInvalidSV(Operation *op, ExtraArgs... args) {
73  op->emitOpError("unknown SV node");
74  abort();
75  }
76 
77  /// This callback is invoked on any SV operations that are not handled by the
78  /// concrete visitor.
79  ResultType visitUnhandledSV(Operation *op, ExtraArgs... args) {
80  return ResultType();
81  }
82 
83 #define HANDLE(OPTYPE, OPKIND) \
84  ResultType visitSV(OPTYPE op, ExtraArgs... args) { \
85  return static_cast<ConcreteType *>(this)->visit##OPKIND##SV(op, args...); \
86  }
87 
88  // Declarations
89  HANDLE(RegOp, Unhandled);
90  HANDLE(WireOp, Unhandled);
91  HANDLE(LogicOp, Unhandled);
92  HANDLE(LocalParamOp, Unhandled);
93  HANDLE(XMROp, Unhandled);
94  HANDLE(XMRRefOp, Unhandled);
95 
96  // Expressions
97  HANDLE(ReadInOutOp, Unhandled);
98  HANDLE(ArrayIndexInOutOp, Unhandled);
99  HANDLE(VerbatimExprOp, Unhandled);
100  HANDLE(VerbatimExprSEOp, Unhandled);
101  HANDLE(IndexedPartSelectInOutOp, Unhandled);
102  HANDLE(IndexedPartSelectOp, Unhandled);
103  HANDLE(StructFieldInOutOp, Unhandled);
104  HANDLE(ConstantXOp, Unhandled);
105  HANDLE(ConstantZOp, Unhandled);
106  HANDLE(ConstantStrOp, Unhandled);
107  HANDLE(MacroRefExprOp, Unhandled);
108  HANDLE(MacroRefExprSEOp, Unhandled);
109 
110  // Control flow.
111  HANDLE(OrderedOutputOp, Unhandled);
112  HANDLE(IfDefOp, Unhandled);
113  HANDLE(IfDefProceduralOp, Unhandled);
114  HANDLE(IfOp, Unhandled);
115  HANDLE(AlwaysOp, Unhandled);
116  HANDLE(AlwaysCombOp, Unhandled);
117  HANDLE(AlwaysFFOp, Unhandled);
118  HANDLE(InitialOp, Unhandled);
119  HANDLE(CaseOp, Unhandled);
120 
121  // Other Statements.
122  HANDLE(AssignOp, Unhandled);
123  HANDLE(BPAssignOp, Unhandled);
124  HANDLE(PAssignOp, Unhandled);
125  HANDLE(ForceOp, Unhandled);
126  HANDLE(ReleaseOp, Unhandled);
127  HANDLE(AliasOp, Unhandled);
128  HANDLE(FWriteOp, Unhandled);
129  HANDLE(SystemFunctionOp, Unhandled);
130  HANDLE(VerbatimOp, Unhandled);
131 
132  // Type declarations.
133  HANDLE(InterfaceOp, Unhandled);
134  HANDLE(InterfaceInstanceOp, Unhandled);
135  HANDLE(InterfaceSignalOp, Unhandled);
136  HANDLE(InterfaceModportOp, Unhandled);
137  HANDLE(GetModportOp, Unhandled);
138  HANDLE(AssignInterfaceSignalOp, Unhandled);
139  HANDLE(ReadInterfaceSignalOp, Unhandled);
140  HANDLE(MacroDefOp, Unhandled);
141  HANDLE(MacroDeclOp, Unhandled);
142 
143  // Verification statements.
144  HANDLE(AssertOp, Unhandled);
145  HANDLE(AssumeOp, Unhandled);
146  HANDLE(CoverOp, Unhandled);
147  HANDLE(AssertConcurrentOp, Unhandled);
148  HANDLE(AssumeConcurrentOp, Unhandled);
149  HANDLE(CoverConcurrentOp, Unhandled);
150 
151  // Bind statements.
152  HANDLE(BindOp, Unhandled);
153 
154  // Simulator control tasks
155  HANDLE(StopOp, Unhandled);
156  HANDLE(FinishOp, Unhandled);
157  HANDLE(ExitOp, Unhandled);
158 
159  // Severity message tasks
160  HANDLE(FatalOp, Unhandled);
161  HANDLE(ErrorOp, Unhandled);
162  HANDLE(WarningOp, Unhandled);
163  HANDLE(InfoOp, Unhandled);
164 
165  // Memory loading tasks
166  HANDLE(ReadMemOp, Unhandled);
167 
168  // Generate statements
169  HANDLE(GenerateOp, Unhandled);
170  HANDLE(GenerateCaseOp, Unhandled);
171 
172  // For loop.
173  HANDLE(ForOp, Unhandled);
174 
175  // Sampled Value Functions
176  HANDLE(SampledOp, Unhandled);
177 #undef HANDLE
178 };
179 
180 } // namespace sv
181 } // namespace circt
182 
183 #endif // CIRCT_DIALECT_SV_SVVISITORS_H
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(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(InitialOp, Unhandled)
HANDLE(GenerateCaseOp, Unhandled)
HANDLE(GetModportOp, Unhandled)
HANDLE(InterfaceInstanceOp, Unhandled)
HANDLE(StructFieldInOutOp, Unhandled)
HANDLE(ArrayIndexInOutOp, Unhandled)
HANDLE(FatalOp, Unhandled)
HANDLE(AlwaysFFOp, 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:79
ResultType visitInvalidSV(Operation *op, ExtraArgs... args)
This callback is invoked on any invalid operations.
Definition: SVVisitors.h:72
HANDLE(AssignInterfaceSignalOp, Unhandled)
HANDLE(VerbatimOp, Unhandled)
HANDLE(AliasOp, Unhandled)
HANDLE(GenerateOp, Unhandled)
HANDLE(MacroRefExprOp, Unhandled)
HANDLE(WireOp, Unhandled)
HANDLE(IndexedPartSelectOp, Unhandled)
HANDLE(IndexedPartSelectInOutOp, Unhandled)
HANDLE(ConstantZOp, Unhandled)
HANDLE(AssumeConcurrentOp, Unhandled)
HANDLE(LocalParamOp, 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