P4C
The P4 Compiler
Loading...
Searching...
No Matches
frontends/p4/fromv1.0/v1model.h
1/*
2Copyright 2013-present Barefoot Networks, Inc.
3
4Licensed under the Apache License, Version 2.0 (the "License");
5you may not use this file except in compliance with the License.
6You may obtain a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10Unless required by applicable law or agreed to in writing, software
11distributed under the License is distributed on an "AS IS" BASIS,
12WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13See the License for the specific language governing permissions and
14limitations under the License.
15*/
16
17#ifndef FRONTENDS_P4_FROMV1_0_V1MODEL_H_
18#define FRONTENDS_P4_FROMV1_0_V1MODEL_H_
19
20#include "frontends/common/model.h"
21#include "frontends/p4/coreLibrary.h"
22#include "frontends/p4/methodInstance.h"
23#include "ir/ir.h"
24#include "lib/cstring.h"
25#include "lib/json.h"
26
27namespace P4::P4V1 {
28
29using namespace P4::literals;
30
31// This should be kept in sync with p4includes/v1model.p4
32// In a perfect world this would be generated automatically from
33// p4includes/v1model.p4
34
36 Parser_Model(Model::Type_Model headersType, Model::Type_Model userMetaType,
37 Model::Type_Model standardMetadataType)
38 : Model::Elem("ParserImpl"_cs),
39 packetParam("packet"_cs, P4::P4CoreLibrary::instance().packetIn, 0),
40 headersParam("hdr"_cs, headersType, 1),
41 metadataParam("meta"_cs, userMetaType, 2),
42 standardMetadataParam("standard_metadata"_cs, standardMetadataType, 3) {}
43 ::P4::Model::Param_Model packetParam;
44 ::P4::Model::Param_Model headersParam;
45 ::P4::Model::Param_Model metadataParam;
46 ::P4::Model::Param_Model standardMetadataParam;
47};
48
50 explicit Deparser_Model(Model::Type_Model headersType)
51 : Model::Elem("DeparserImpl"_cs),
52 packetParam("packet"_cs, P4::P4CoreLibrary::instance().packetOut, 0),
53 headersParam("hdr"_cs, headersType, 1) {}
54 ::P4::Model::Param_Model packetParam;
55 ::P4::Model::Param_Model headersParam;
56};
57
58// Models ingress and egress
60 Control_Model(cstring name, Model::Type_Model headersType, Model::Type_Model metadataType,
61 Model::Type_Model standardMetadataType)
62 : Model::Elem(name),
63 headersParam("hdr"_cs, headersType, 0),
64 metadataParam("meta"_cs, metadataType, 1),
65 standardMetadataParam("standard_metadata"_cs, standardMetadataType, 2) {}
66 ::P4::Model::Param_Model headersParam;
67 ::P4::Model::Param_Model metadataParam;
68 ::P4::Model::Param_Model standardMetadataParam;
69};
70
73 : Model::Elem(name), headersParam("hdr"_cs, headersType, 0) {}
74 ::P4::Model::Param_Model headersParam;
75};
76
79 : ::P4::Model::Enum_Model("CounterType"_cs),
80 packets("packets"_cs),
81 bytes("bytes"_cs),
82 both("packets_and_bytes"_cs) {}
83 ::P4::Model::Elem packets;
86};
87
90 : ::P4::Model::Enum_Model("MeterType"_cs), packets("packets"_cs), bytes("bytes"_cs) {}
91 ::P4::Model::Elem packets;
93};
94
97 : Extern_Model("action_profile"_cs),
98 sizeType(IR::Type_Bits::get(32)),
99 sizeParam("size"_cs) {}
100 const IR::Type *sizeType;
101 ::P4::Model::Elem sizeParam;
102};
103
106 : Extern_Model("action_selector"_cs),
107 sizeType(IR::Type_Bits::get(32)),
108 sizeParam("size"_cs),
109 widthType(IR::Type_Bits::get(32)),
110 algorithmParam("algorithm"_cs) {}
111 const IR::Type *sizeType;
112 ::P4::Model::Elem sizeParam;
113 const IR::Type *widthType;
114 ::P4::Model::Elem algorithmParam;
115};
116
118 Random_Model() : Elem("random"_cs), modify_field_rng_uniform("modify_field_rng_uniform"_cs) {}
119 ::P4::Model::Elem modify_field_rng_uniform;
120};
121
123 public:
124 Truncate() : Extern_Model("truncate"_cs), length_type(IR::Type::Bits::get(32)) {}
125 const IR::Type *length_type;
126};
127
129 explicit CounterOrMeter_Model(cstring name)
130 : Extern_Model(name),
131 sizeParam("size"_cs),
132 typeParam("type"_cs),
133 size_type(IR::Type_Bits::get(32)) {}
134 ::P4::Model::Elem sizeParam;
135 ::P4::Model::Elem typeParam;
136 const IR::Type *size_type;
137 CounterType_Model counterType;
138 MeterType_Model meterType;
139};
140
143 : Extern_Model("register"_cs),
144 sizeParam("size"_cs),
145 read("read"_cs),
146 write("write"_cs),
147 size_type(IR::Type_Bits::get(32)) {}
148 ::P4::Model::Elem sizeParam;
150 ::P4::Model::Elem write;
151 const IR::Type *size_type;
152};
153
155 DigestReceiver_Model() : Elem("digest"_cs), receiverType(IR::Type_Bits::get(32)) {}
156 const IR::Type *receiverType;
157};
158
160 Counter_Model() : CounterOrMeter_Model("counter"_cs), increment("count"_cs) {}
161 ::P4::Model::Elem increment;
162};
163
165 Meter_Model() : CounterOrMeter_Model("meter"_cs), executeMeter("execute_meter"_cs) {}
166 ::P4::Model::Elem executeMeter;
167};
168
170 DirectMeter_Model() : CounterOrMeter_Model("direct_meter"_cs), read("read"_cs) {}
172};
173
175 DirectCounter_Model() : CounterOrMeter_Model("direct_counter"_cs), count("count"_cs) {}
176 ::P4::Model::Elem count;
177};
178
182 dropBit("drop"_cs),
183 recirculate("recirculate_port"_cs),
184 egress_spec("egress_spec"_cs) {}
185 ::P4::Model::Elem dropBit;
186 ::P4::Model::Elem recirculate;
187 ::P4::Model::Elem egress_spec;
188};
189
191 CloneType_Model() : ::P4::Model::Enum_Model("CloneType"_cs), i2e("I2E"_cs), e2e("E2E"_cs) {}
194};
195
198 : ::P4::Model::Enum_Model("HashAlgorithm"_cs),
199 crc32("crc32"_cs),
200 crc32_custom("crc32_custom"_cs),
201 crc16("crc16"_cs),
202 crc16_custom("crc16_custom"_cs),
203 random("random"_cs),
204 identity("identity"_cs),
205 csum16("csum16"_cs),
206 xor16("xor16"_cs) {}
207 ::P4::Model::Elem crc32;
208 ::P4::Model::Elem crc32_custom;
209 ::P4::Model::Elem crc16;
210 ::P4::Model::Elem crc16_custom;
211 ::P4::Model::Elem random;
212 ::P4::Model::Elem identity;
213 ::P4::Model::Elem csum16;
214 ::P4::Model::Elem xor16;
215};
216
218 Hash_Model() : ::P4::Model::Elem("hash"_cs) {}
219};
220
223 : Extern_Model("clone"_cs),
224 clone3("clone_preserving_field_list"_cs),
225
226 sessionType(IR::Type_Bits::get(32)) {}
227 ::P4::Model::Elem clone3;
228 CloneType_Model cloneType;
229 const IR::Type *sessionType;
230};
231
234 : Model::Elem("V1Switch"_cs),
235 parser("p"_cs),
236 verify("vr"_cs),
237 ingress("ig"_cs),
238 egress("eg"_cs),
239 compute("ck"_cs),
240 deparser("dep"_cs) {}
241 ::P4::Model::Elem parser; // names of the package arguments
242 ::P4::Model::Elem verify;
243 ::P4::Model::Elem ingress;
244 ::P4::Model::Elem egress;
245 ::P4::Model::Elem compute;
246 ::P4::Model::Elem deparser;
247};
248
251 : tableImplementation("implementation"_cs),
252 counters("counters"_cs),
253 meters("meters"_cs),
254 size("size"_cs),
255 supportTimeout("support_timeout"_cs) {}
256 ::P4::Model::Elem tableImplementation;
257 ::P4::Model::Elem counters;
258 ::P4::Model::Elem meters;
260 ::P4::Model::Elem supportTimeout;
261 const unsigned defaultTableSize = 1024;
262};
263
264class V1Model : public Model::Model {
265 protected:
266 V1Model()
267 : file("v1model.p4"_cs),
268 standardMetadata("standard_metadata"_cs),
269 // The following 2 are not really docmented in the P4-14 spec.
270 intrinsicMetadata("intrinsic_metadata"_cs),
271 queueingMetadata("queueing_metadata"_cs),
272 headersType("headers"_cs),
273 metadataType("metadata"_cs),
274 standardMetadataType("standard_metadata_t"_cs),
275 parser(headersType, metadataType, standardMetadataType),
276 deparser(headersType),
277 egress("egress"_cs, headersType, metadataType, standardMetadataType),
278 ingress("ingress"_cs, headersType, metadataType, standardMetadataType),
279 sw(),
280 counterOrMeter("$"_cs),
281 counter(),
282 meter(),
283 random(),
284 action_profile(),
285 action_selector(),
286 clone(),
287 resubmit("resubmit_preserving_field_list"_cs),
288 tableAttributes(),
289 rangeMatchType("range"_cs),
290 optionalMatchType("optional"_cs),
291 selectorMatchType("selector"_cs),
292 verify("verifyChecksum"_cs, headersType),
293 compute("computeChecksum"_cs, headersType),
294 digest_receiver(),
295 hash(),
296 algorithm(),
297 registers(),
298 drop("mark_to_drop"_cs),
299 recirculate("recirculate_preserving_field_list"_cs),
300 verify_checksum("verify_checksum"_cs),
301 update_checksum("update_checksum"_cs),
302 verify_checksum_with_payload("verify_checksum_with_payload"_cs),
303 update_checksum_with_payload("update_checksum_with_payload"_cs),
304 log_msg("log_msg"_cs),
305 directMeter(),
306 directCounter() {}
307
308 public:
309 const ::P4::Model::Elem file;
310 const ::P4::Model::Elem standardMetadata;
311 const ::P4::Model::Elem intrinsicMetadata;
312 const ::P4::Model::Elem queueingMetadata;
313 const ::P4::Model::Type_Model headersType;
314 const ::P4::Model::Type_Model metadataType;
315 const StandardMetadataType_Model standardMetadataType;
316 const Parser_Model parser;
317 const Deparser_Model deparser;
318 const Control_Model egress;
319 const Control_Model ingress;
320 const Switch_Model sw;
321 const Truncate truncate;
322 const CounterOrMeter_Model counterOrMeter;
323 const Counter_Model counter;
324 const Meter_Model meter;
325 const Random_Model random;
326 const ActionProfile_Model action_profile;
327 const ActionSelector_Model action_selector;
328 const Cloner_Model clone;
329 const ::P4::Model::Elem resubmit;
330 const TableAttributes_Model tableAttributes;
331 const ::P4::Model::Elem rangeMatchType;
332 const ::P4::Model::Elem optionalMatchType;
333 const ::P4::Model::Elem selectorMatchType;
334 const VerifyUpdate_Model verify;
335 const VerifyUpdate_Model compute;
336 const DigestReceiver_Model digest_receiver;
337 const Hash_Model hash;
338 const Algorithm_Model algorithm;
339 const Register_Model registers;
340 const ::P4::Model::Elem drop;
341 const ::P4::Model::Elem recirculate;
342 const ::P4::Model::Elem verify_checksum;
343 const ::P4::Model::Elem update_checksum;
344 const ::P4::Model::Elem verify_checksum_with_payload;
345 const ::P4::Model::Elem update_checksum_with_payload;
346 const ::P4::Model::Elem log_msg;
347 const DirectMeter_Model directMeter;
348 const DirectCounter_Model directCounter;
349
350 static V1Model instance;
351 // The following match constants appearing in v1model.p4
352 static const char *versionInitial; // 20180101
353 static const char *versionCurrent; // 20200408
354};
355
359 bool preorder(const IR::Declaration_Constant *dc) override {
360 if (dc->name == "__v1model_version") {
361 auto val = dc->initializer->to<IR::Constant>();
362 version = static_cast<unsigned>(val->value);
363 }
364 return false;
365 }
366 bool preorder(const IR::Declaration *) override { return false; }
367
368 public:
369 unsigned version = 0;
370};
371
372} // namespace P4::P4V1
373
374#endif /* FRONTENDS_P4_FROMV1_0_V1MODEL_H_ */
Definition visitor.h:400
Definition frontends/common/model.h:64
Definition frontends/p4/fromv1.0/v1model.h:122
Definition frontends/p4/fromv1.0/v1model.h:264
Definition frontends/p4/fromv1.0/v1model.h:358
Definition cstring.h:85
Definition cstring.h:80
Definition frontends/common/model.h:28
Enum_Model : Type_Model.
Definition frontends/common/model.h:47
Extern_Model : Type_Model.
Definition frontends/common/model.h:52
Param_Model : Elem.
Definition frontends/common/model.h:57
Definition frontends/common/model.h:42
Definition frontends/p4/fromv1.0/v1model.h:95
Definition frontends/p4/fromv1.0/v1model.h:104
Definition frontends/p4/fromv1.0/v1model.h:196
Definition frontends/p4/fromv1.0/v1model.h:190
Definition frontends/p4/fromv1.0/v1model.h:221
Definition frontends/p4/fromv1.0/v1model.h:59
Definition frontends/p4/fromv1.0/v1model.h:159
Definition frontends/p4/fromv1.0/v1model.h:128
Definition frontends/p4/fromv1.0/v1model.h:77
Definition frontends/p4/fromv1.0/v1model.h:49
Definition frontends/p4/fromv1.0/v1model.h:154
Definition frontends/p4/fromv1.0/v1model.h:174
Definition frontends/p4/fromv1.0/v1model.h:169
Definition frontends/p4/fromv1.0/v1model.h:217
Definition frontends/p4/fromv1.0/v1model.h:164
Definition frontends/p4/fromv1.0/v1model.h:88
Definition frontends/p4/fromv1.0/v1model.h:35
Definition frontends/p4/fromv1.0/v1model.h:117
Definition frontends/p4/fromv1.0/v1model.h:141
Definition frontends/p4/fromv1.0/v1model.h:179
Definition frontends/p4/fromv1.0/v1model.h:232
Definition frontends/p4/fromv1.0/v1model.h:249
Definition frontends/p4/fromv1.0/v1model.h:71