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