P4C
The P4 Compiler
Loading...
Searching...
No Matches
v1_converters.h
1
18
19#ifndef BF_P4C_ARCH_FROMV1_0_V1_CONVERTERS_H_
20#define BF_P4C_ARCH_FROMV1_0_V1_CONVERTERS_H_
21
22#include <cmath>
23
24#include "frontends/p4/cloner.h"
25#include "frontends/p4/coreLibrary.h"
26#include "ir/ir.h"
27#include "lib/safe_vector.h"
28#include "v1_program_structure.h"
29
30namespace BFN {
31
32namespace V1 {
33
34class ExpressionConverter : public Transform {
35 protected:
36 ProgramStructure *structure;
37
38 public:
39 explicit ExpressionConverter(ProgramStructure *structure) : structure(structure) {
40 CHECK_NULL(structure);
41 }
42 const IR::Expression *convert(const IR::Node *node) {
43 auto result = node->apply(*this);
44 return result->to<IR::Expression>();
45 }
46};
47
48class StatementConverter : public Transform {
49 protected:
50 ProgramStructure *structure;
51
52 public:
53 explicit StatementConverter(ProgramStructure *structure) : structure(structure) {
54 CHECK_NULL(structure);
55 }
56 const IR::Statement *convert(const IR::Node *node) {
57 auto result = node->apply(*this);
58 return result->to<IR::Statement>();
59 }
60};
61
62class ControlConverter : public Transform {
63 protected:
64 ProgramStructure *structure;
66 template <typename T>
67 const IR::Node *substitute(T *s) {
68 auto *orig = getOriginal<T>();
69 if (structure->_map.count(orig)) {
70 auto result = structure->_map.at(orig);
71 return result;
72 }
73 return s;
74 }
75
76 public:
77 explicit ControlConverter(ProgramStructure *structure) : structure(structure) {
78 CHECK_NULL(structure);
79 }
80
81 const IR::Node *postorder(IR::Declaration_Instance *node) override {
82 return substitute<IR::Declaration_Instance>(node);
83 }
84
85 const IR::Node *postorder(IR::MethodCallStatement *node) override {
86 return substitute<IR::MethodCallStatement>(node);
87 }
88
89 const IR::Node *postorder(IR::Property *node) override {
90 return substitute<IR::Property>(node);
91 }
92
93 const IR::Node *postorder(IR::BFN::TnaControl *node) override;
94
95 const IR::P4Control *convert(const IR::Node *node) {
96 auto conv = node->apply(*this);
97 auto result = conv->to<IR::P4Control>();
98 BUG_CHECK(result != nullptr, "Conversion of %1% did not produce a control", node);
99 return result;
100 }
101};
102
103class IngressControlConverter : public ControlConverter {
104 public:
105 explicit IngressControlConverter(ProgramStructure *structure) : ControlConverter(structure) {
106 CHECK_NULL(structure);
107 }
108 const IR::Node *preorder(IR::P4Control *node) override;
109};
110
111class EgressControlConverter : public ControlConverter {
112 public:
113 explicit EgressControlConverter(ProgramStructure *structure) : ControlConverter(structure) {
114 CHECK_NULL(structure);
115 }
116 const IR::Node *preorder(IR::P4Control *node) override;
117};
118
119class IngressDeparserConverter : public ControlConverter {
120 public:
121 explicit IngressDeparserConverter(ProgramStructure *structure) : ControlConverter(structure) {
122 CHECK_NULL(structure);
123 }
124 const IR::Node *preorder(IR::P4Control *node) override;
125};
126
127class EgressDeparserConverter : public ControlConverter {
128 public:
129 explicit EgressDeparserConverter(ProgramStructure *structure) : ControlConverter(structure) {
130 CHECK_NULL(structure);
131 }
132 const IR::Node *preorder(IR::P4Control *node) override;
133};
134
136
137class ParserConverter : public Transform {
138 protected:
139 ProgramStructure *structure;
141 template <typename T>
142 const IR::Node *substitute(T *s) {
143 auto *orig = getOriginal<T>();
144 if (structure->_map.count(orig)) {
145 auto result = structure->_map.at(orig);
146 return result;
147 }
148 return s;
149 }
150
151 public:
152 explicit ParserConverter(ProgramStructure *structure) : structure(structure) {
153 CHECK_NULL(structure);
154 }
155
156 const IR::Node *postorder(IR::AssignmentStatement *node) {
157 return substitute<IR::AssignmentStatement>(node);
158 }
159
160 const IR::Node *postorder(IR::SelectExpression *node) {
161 return substitute<IR::SelectExpression>(node);
162 }
163
164 const IR::Node *postorder(IR::Member *node) { return substitute<IR::Member>(node); }
165
166 const IR::P4Parser *convert(const IR::Node *node) {
167 auto conv = node->apply(*this);
168 auto result = conv->to<IR::P4Parser>();
169 BUG_CHECK(result != nullptr, "Conversion of %1% did not produce a parser", node);
170 return result;
171 }
172};
173
174class IngressParserConverter : public ParserConverter {
175 public:
176 explicit IngressParserConverter(ProgramStructure *structure) : ParserConverter(structure) {
177 CHECK_NULL(structure);
178 }
179 const IR::Node *postorder(IR::P4Parser *node) override;
180};
181
182class EgressParserConverter : public ParserConverter {
183 public:
184 explicit EgressParserConverter(ProgramStructure *structure) : ParserConverter(structure) {
185 CHECK_NULL(structure);
186 }
187 const IR::Node *postorder(IR::Declaration_Variable *node) override;
188 const IR::Node *postorder(IR::P4Parser *node) override;
189};
190
192
193class ExternConverter : public Transform {
194 protected:
195 ProgramStructure *structure;
196
197 public:
198 explicit ExternConverter(ProgramStructure *structure) : structure(structure) {
199 CHECK_NULL(structure);
200 }
201 const IR::Node *postorder(IR::Member *node) override;
202 const IR::Declaration_Instance *convertExternInstance(const IR::Node *node) {
203 auto conv = node->apply(*this);
204 auto result = conv->to<IR::Declaration_Instance>();
205 BUG_CHECK(result != nullptr, "Conversion of %1% did not produce an extern instance", node);
206 return result;
207 }
208 const IR::MethodCallExpression *convertExternCall(const IR::Node *node) {
209 auto conv = node->apply(*this);
210 auto result = conv->to<IR::MethodCallExpression>();
211 BUG_CHECK(result != nullptr, "Conversion of %1% did not produce an extern method call",
212 node);
213 return result;
214 }
215
216 const IR::Statement *convertExternFunction(const IR::Node *node) {
217 auto conv = node->apply(*this);
218 auto result = conv->to<IR::Statement>();
219 BUG_CHECK(result != nullptr, "Conversion of %1% did not produce an extern method call",
220 node);
221 return result;
222 }
223
224 const IR::Node *convert(const IR::Node *node) {
225 auto conv = node->apply(*this);
226 return conv;
227 }
228};
229
230class MeterConverter : public ExternConverter {
231 const P4::ReferenceMap *refMap;
232 bool direct;
233
234 public:
235 explicit MeterConverter(ProgramStructure *structure, const P4::ReferenceMap *rm, bool direct)
236 : ExternConverter(structure), refMap(rm), direct(direct) {
237 CHECK_NULL(structure);
238 }
239 const IR::Node *postorder(IR::MethodCallStatement *node) override;
240 const IR::Expression *cast_if_needed(const IR::Expression *expr, int srcWidth, int dstWidth);
241};
242
243class RegisterConverter : public ExternConverter {
244 public:
245 explicit RegisterConverter(ProgramStructure *structure) : ExternConverter(structure) {
246 CHECK_NULL(structure);
247 }
248 const IR::Node *postorder(IR::MethodCallStatement *node) override;
249};
250
252
253class TypeNameExpressionConverter : public ExpressionConverter {
254 // mapping enum name from v1model to tofino
255 ordered_map<cstring, cstring> enumsToTranslate = {
256 {"HashAlgorithm"_cs, "HashAlgorithm_t"_cs},
257 {"CounterType"_cs, "CounterType_t"_cs},
258 {"MeterType"_cs, "MeterType_t"_cs},
259 {"CloneType"_cs, nullptr}, // tofino has no mapping for CloneType
260 };
261 ordered_map<cstring, cstring> fieldsToTranslate = {
262 {"crc16"_cs, "CRC16"_cs},
263 {"csum16"_cs, "CSUM16"_cs},
264 {"packets"_cs, "PACKETS"_cs},
265 {"bytes"_cs, "BYTES"_cs},
266 {"packets_and_bytes"_cs, "PACKETS_AND_BYTES"_cs},
267 {"crc32"_cs, "CRC32"_cs},
268 {"identity"_cs, "IDENTITY"_cs},
269 {"random"_cs, "RANDOM"_cs}};
270
271 public:
272 explicit TypeNameExpressionConverter(ProgramStructure *structure)
273 : ExpressionConverter(structure) {
274 CHECK_NULL(structure);
275 }
276 const IR::Node *postorder(IR::Type_Name *node) override;
277 const IR::Node *postorder(IR::TypeNameExpression *node) override;
278 const IR::Node *postorder(IR::Member *node) override;
279};
280
281class PathExpressionConverter : public ExpressionConverter {
282 public:
283 explicit PathExpressionConverter(ProgramStructure *structure) : ExpressionConverter(structure) {
284 CHECK_NULL(structure);
285 }
286 const IR::Node *postorder(IR::Member *node) override;
287 const IR::Node *postorder(IR::AssignmentStatement *node) override;
288};
289
291
292class ParserPriorityConverter : public StatementConverter {
293 public:
294 explicit ParserPriorityConverter(ProgramStructure *structure) : StatementConverter(structure) {
295 CHECK_NULL(structure);
296 }
297 const IR::Node *postorder(IR::AssignmentStatement *node) override;
298};
299
300} // namespace V1
301
302} // namespace BFN
303
304#endif /* BF_P4C_ARCH_FROMV1_0_V1_CONVERTERS_H_ */
const IR::Node * preorder(IR::P4Control *node) override
Definition v1_converters.cpp:151
const IR::Node * preorder(IR::P4Control *node) override
Definition v1_converters.cpp:304
const IR::Node * postorder(IR::Member *node) override
map path expression
Definition v1_converters.cpp:576
Definition cloner.h:26
Definition node.h:94
Class used to encode maps from paths to declarations.
Definition referenceMap.h:66
Definition ordered_map.h:32
The namespace encapsulating Barefoot/Intel-specific stuff.
Definition add_t2na_meta.cpp:21
Definition v1_program_structure.h:36
T * to() noexcept
Definition rtti.h:226