P4C
The P4 Compiler
Loading...
Searching...
No Matches
targets/bmv2/test_spec.h
1/*
2 * SPDX-FileCopyrightText: 2022 The P4 Language Consortium
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#ifndef BACKENDS_P4TOOLS_MODULES_TESTGEN_TARGETS_BMV2_TEST_SPEC_H_
8#define BACKENDS_P4TOOLS_MODULES_TESTGEN_TARGETS_BMV2_TEST_SPEC_H_
9
10#include <cstddef>
11#include <functional>
12#include <map>
13#include <optional>
14#include <utility>
15#include <vector>
16
17#include "backends/p4tools/common/lib/model.h"
18#include "ir/declaration.h"
19#include "ir/ir.h"
20#include "lib/cstring.h"
21#include "lib/rtti.h"
22
23#include "backends/p4tools/modules/testgen/lib/execution_state.h"
24#include "backends/p4tools/modules/testgen/lib/test_object.h"
25#include "backends/p4tools/modules/testgen/lib/test_spec.h"
26#include "backends/p4tools/modules/testgen/targets/bmv2/constants.h"
27
29
30/* =========================================================================================
31 * IndexExpression
32 * ========================================================================================= */
36class IndexExpression : public TestObject {
37 private:
39 const IR::Expression *index;
40
42 const IR::Expression *value;
43
44 public:
45 explicit IndexExpression(const IR::Expression *index, const IR::Expression *value);
46
49 [[nodiscard]] const IR::Constant *getEvaluatedIndex() const;
50
53 [[nodiscard]] const IR::Constant *getEvaluatedValue() const;
54
56 [[nodiscard]] const IR::Expression *getIndex() const;
57
59 [[nodiscard]] const IR::Expression *getValue() const;
60
61 [[nodiscard]] const IndexExpression *evaluate(const Model &model,
62 bool doComplete) const override;
63
64 [[nodiscard]] cstring getObjectName() const override;
65
66 DECLARE_TYPEINFO(IndexExpression, TestObject);
67};
68
69/* =========================================================================================
70 * IndexMap
71 * ========================================================================================= */
73class IndexMap : public TestObject {
74 protected:
76 const IR::Expression *initialValue;
77
79 std::vector<IndexExpression> indexConditions;
80
81 public:
82 explicit IndexMap(const IR::Expression *initialValue);
83
85 void writeToIndex(const IR::Expression *index, const IR::Expression *value);
86
88 [[nodiscard]] const IR::Expression *getInitialValue() const;
89
92 [[nodiscard]] const IR::Expression *getValueAtIndex(const IR::Expression *index) const;
93
96 [[nodiscard]] const IR::Constant *getEvaluatedInitialValue() const;
97
99 [[nodiscard]] std::map<big_int, std::pair<int, const IR::Constant *>> unravelMap() const;
100
101 DECLARE_TYPEINFO(IndexMap, TestObject);
102};
103
104/* =========================================================================================
105 * Bmv2V1ModelRegisterValue
106 * ========================================================================================= */
115class Bmv2V1ModelRegisterValue : public IndexMap {
116 public:
117 explicit Bmv2V1ModelRegisterValue(const IR::Expression *initialValue);
118
119 [[nodiscard]] cstring getObjectName() const override;
120
121 [[nodiscard]] const Bmv2V1ModelRegisterValue *evaluate(const Model &model,
122 bool doComplete) const override;
123
124 DECLARE_TYPEINFO(Bmv2V1ModelRegisterValue, IndexMap);
125};
126
127/* =========================================================================================
128 * Bmv2V1ModelMeterValue
129 * ========================================================================================= */
130
131class Bmv2V1ModelMeterValue : public IndexMap {
132 private:
134 bool isDirect;
135
136 public:
137 explicit Bmv2V1ModelMeterValue(const IR::Expression *initialValue, bool isDirect);
138
139 [[nodiscard]] cstring getObjectName() const override;
140
141 [[nodiscard]] const Bmv2V1ModelMeterValue *evaluate(const Model &model,
142 bool doComplete) const override;
143
145 [[nodiscard]] bool isDirectMeter() const;
146
147 DECLARE_TYPEINFO(Bmv2V1ModelMeterValue, IndexMap);
148};
149
150/* =========================================================================================
151 * Bmv2V1ModelActionProfile
152 * ========================================================================================= */
153class Bmv2V1ModelActionProfile : public TestObject {
154 private:
156 std::vector<std::pair<cstring, std::vector<ActionArg>>> actions;
157
159 const IR::IDeclaration *profileDecl;
160
161 public:
162 explicit Bmv2V1ModelActionProfile(const IR::IDeclaration *profileDecl);
163
164 [[nodiscard]] cstring getObjectName() const override;
165
167 [[nodiscard]] const std::vector<std::pair<cstring, std::vector<ActionArg>>> *getActions() const;
168
170 [[nodiscard]] const IR::IDeclaration *getProfileDecl() const;
171
173 [[nodiscard]] size_t getActionMapSize() const;
174
176 void addToActionMap(cstring actionName, std::vector<ActionArg> actionArgs);
177
178 [[nodiscard]] const Bmv2V1ModelActionProfile *evaluate(const Model &model,
179 bool doComplete) const override;
180
181 DECLARE_TYPEINFO(Bmv2V1ModelActionProfile, TestObject);
182};
183
184/* =========================================================================================
185 * ActionSelector
186 * ========================================================================================= */
187class Bmv2V1ModelActionSelector : public TestObject {
188 private:
190 const IR::IDeclaration *selectorDecl;
191
193 const Bmv2V1ModelActionProfile *actionProfile;
194
195 public:
196 explicit Bmv2V1ModelActionSelector(const IR::IDeclaration *selectorDecl,
197 const Bmv2V1ModelActionProfile *actionProfile);
198
199 [[nodiscard]] cstring getObjectName() const override;
200
202 [[nodiscard]] const IR::IDeclaration *getSelectorDecl() const;
203
205 [[nodiscard]] const Bmv2V1ModelActionProfile *getActionProfile() const;
206
207 [[nodiscard]] const Bmv2V1ModelActionSelector *evaluate(const Model &model,
208 bool doComplete) const override;
209
210 DECLARE_TYPEINFO(Bmv2V1ModelActionSelector, TestObject);
211};
212
213/* =========================================================================================
214 * Bmv2V1ModelCloneInfo
215 * ========================================================================================= */
216class Bmv2V1ModelCloneInfo : public TestObject {
217 private:
219 const IR::Expression *sessionId;
220
222 BMv2Constants::CloneType cloneType;
223
225 std::reference_wrapper<const ExecutionState> clonedState;
226
228 std::optional<int> preserveIndex;
229
230 public:
231 explicit Bmv2V1ModelCloneInfo(const IR::Expression *sessionId,
232 BMv2Constants::CloneType cloneType,
233 const ExecutionState &clonedState,
234 std::optional<int> preserveIndex);
235
236 [[nodiscard]] cstring getObjectName() const override;
237
238 [[nodiscard]] const Bmv2V1ModelCloneInfo *evaluate(const Model &model,
239 bool doComplete) const override;
240
242 [[nodiscard]] const IR::Expression *getSessionId() const;
243
245 [[nodiscard]] BMv2Constants::CloneType getCloneType() const;
246
248 [[nodiscard]] std::optional<int> getPreserveIndex() const;
249
251 [[nodiscard]] const ExecutionState &getClonedState() const;
252
253 DECLARE_TYPEINFO(Bmv2V1ModelCloneInfo, TestObject);
254};
255
256/* =========================================================================================
257 * Bmv2V1ModelCloneSpec
258 * ========================================================================================= */
259class Bmv2V1ModelCloneSpec : public TestObject {
260 private:
262 const IR::Expression *sessionId;
263
265 const IR::Expression *clonePort;
266
269 bool isClone;
270
271 public:
272 explicit Bmv2V1ModelCloneSpec(const IR::Expression *sessionId, const IR::Expression *clonePort,
273 bool isClone);
274
275 [[nodiscard]] cstring getObjectName() const override;
276
277 [[nodiscard]] const Bmv2V1ModelCloneSpec *evaluate(const Model &model,
278 bool doComplete) const override;
279
281 [[nodiscard]] const IR::Expression *getSessionId() const;
282
284 [[nodiscard]] const IR::Expression *getClonePort() const;
285
288 [[nodiscard]] bool isClonedPacket() const;
289
292 [[nodiscard]] const IR::Constant *getEvaluatedClonePort() const;
293
296 [[nodiscard]] const IR::Constant *getEvaluatedSessionId() const;
297
298 DECLARE_TYPEINFO(Bmv2V1ModelCloneSpec, TestObject);
299};
300
301/* =========================================================================================
302 * MetadataCollection
303 * ========================================================================================= */
304class MetadataCollection : public TestObject {
305 private:
307 std::map<cstring, const IR::Literal *> metadataFields;
308
309 public:
310 MetadataCollection();
311
312 [[nodiscard]] cstring getObjectName() const override;
313
314 [[nodiscard]] const MetadataCollection *evaluate(const Model & /*model*/,
315 bool doComplete) const override;
316
318 [[nodiscard]] const std::map<cstring, const IR::Literal *> &getMetadataFields() const;
319
321 void addMetaDataField(cstring name, const IR::Literal *metadataField);
322
324 const IR::Literal *getMetadataField(cstring name);
325
326 DECLARE_TYPEINFO(MetadataCollection, TestObject);
327};
328
329/* =========================================================================================
330 * Table Key Match Types
331 * ========================================================================================= */
332
333class Optional : public TableMatch {
334 private:
336 const IR::Expression *value;
337
339 bool addMatch;
340
341 public:
342 explicit Optional(const IR::KeyElement *key, const IR::Expression *value, bool addMatch);
343
344 [[nodiscard]] const Optional *evaluate(const Model &model, bool doComplete) const override;
345
346 [[nodiscard]] cstring getObjectName() const override;
347
350 [[nodiscard]] const IR::Constant *getEvaluatedValue() const;
351
353 [[nodiscard]] bool addAsExactMatch() const;
354
355 DECLARE_TYPEINFO(Optional, TableMatch);
356};
357
358class Range : public TableMatch {
359 private:
361 const IR::Expression *low;
362
364 const IR::Expression *high;
365
366 public:
367 explicit Range(const IR::KeyElement *key, const IR::Expression *low,
368 const IR::Expression *high);
369
370 [[nodiscard]] const Range *evaluate(const Model &model, bool doComplete) const override;
371
372 [[nodiscard]] cstring getObjectName() const override;
373
376 [[nodiscard]] const IR::Constant *getEvaluatedLow() const;
377
380 [[nodiscard]] const IR::Constant *getEvaluatedHigh() const;
381
382 DECLARE_TYPEINFO(Range, TableMatch);
383};
384
385} // namespace P4::P4Tools::P4Testgen::Bmv2
386
387#endif /* BACKENDS_P4TOOLS_MODULES_TESTGEN_TARGETS_BMV2_TEST_SPEC_H_ */
The Declaration interface, representing objects with names.
Definition declaration.h:17
Definition backends/p4tools/common/lib/model.h:24
CloneType
Clone type is derived from v1model.p4.
Definition p4tools/modules/testgen/targets/bmv2/constants.h:40
Definition targets/bmv2/test_spec.h:153
size_t getActionMapSize() const
Definition targets/bmv2/test_spec.cpp:155
const IR::IDeclaration * getProfileDecl() const
Definition targets/bmv2/test_spec.cpp:149
cstring getObjectName() const override
Definition targets/bmv2/test_spec.cpp:147
void addToActionMap(cstring actionName, std::vector< ActionArg > actionArgs)
Add an action (its name) and the arguments to the action map of this profile.
Definition targets/bmv2/test_spec.cpp:151
const std::vector< std::pair< cstring, std::vector< ActionArg > > > * getActions() const
Definition targets/bmv2/test_spec.cpp:140
const Bmv2V1ModelActionProfile * evaluate(const Model &model, bool doComplete) const override
Definition targets/bmv2/test_spec.cpp:157
const Bmv2V1ModelActionSelector * evaluate(const Model &model, bool doComplete) const override
Definition targets/bmv2/test_spec.cpp:190
const Bmv2V1ModelActionProfile * getActionProfile() const
Definition targets/bmv2/test_spec.cpp:186
cstring getObjectName() const override
Definition targets/bmv2/test_spec.cpp:180
const IR::IDeclaration * getSelectorDecl() const
Definition targets/bmv2/test_spec.cpp:184
const Bmv2V1ModelCloneInfo * evaluate(const Model &model, bool doComplete) const override
Definition targets/bmv2/test_spec.cpp:219
cstring getObjectName() const override
Definition targets/bmv2/test_spec.cpp:209
const ExecutionState & getClonedState() const
Definition targets/bmv2/test_spec.cpp:215
const IR::Expression * getSessionId() const
Definition targets/bmv2/test_spec.cpp:213
std::optional< int > getPreserveIndex() const
Definition targets/bmv2/test_spec.cpp:217
BMv2Constants::CloneType getCloneType() const
Definition targets/bmv2/test_spec.cpp:211
const Bmv2V1ModelCloneSpec * evaluate(const Model &model, bool doComplete) const override
Definition targets/bmv2/test_spec.cpp:252
const IR::Constant * getEvaluatedSessionId() const
Definition targets/bmv2/test_spec.cpp:245
bool isClonedPacket() const
Definition targets/bmv2/test_spec.cpp:258
cstring getObjectName() const override
Definition targets/bmv2/test_spec.cpp:232
const IR::Constant * getEvaluatedClonePort() const
Definition targets/bmv2/test_spec.cpp:238
const IR::Expression * getClonePort() const
Definition targets/bmv2/test_spec.cpp:234
const IR::Expression * getSessionId() const
Definition targets/bmv2/test_spec.cpp:236
cstring getObjectName() const override
Definition targets/bmv2/test_spec.cpp:119
const Bmv2V1ModelMeterValue * evaluate(const Model &model, bool doComplete) const override
Definition targets/bmv2/test_spec.cpp:121
bool isDirectMeter() const
Definition targets/bmv2/test_spec.cpp:133
cstring getObjectName() const override
Definition targets/bmv2/test_spec.cpp:98
const Bmv2V1ModelRegisterValue * evaluate(const Model &model, bool doComplete) const override
Definition targets/bmv2/test_spec.cpp:100
const IR::Expression * getIndex() const
Definition targets/bmv2/test_spec.cpp:37
const IR::Constant * getEvaluatedValue() const
Definition targets/bmv2/test_spec.cpp:23
const IR::Constant * getEvaluatedIndex() const
Definition targets/bmv2/test_spec.cpp:30
const IndexExpression * evaluate(const Model &model, bool doComplete) const override
Definition targets/bmv2/test_spec.cpp:43
cstring getObjectName() const override
Definition targets/bmv2/test_spec.cpp:41
const IR::Expression * getValue() const
Definition targets/bmv2/test_spec.cpp:39
std::map< big_int, std::pair< int, const IR::Constant * > > unravelMap() const
Return the "writes" to this index map as a.
Definition targets/bmv2/test_spec.cpp:49
const IR::Constant * getEvaluatedInitialValue() const
Definition targets/bmv2/test_spec.cpp:84
const IR::Expression * initialValue
A new IndexMap always requires an initial value. This can be a constant or taint.
Definition targets/bmv2/test_spec.h:76
const IR::Expression * getValueAtIndex(const IR::Expression *index) const
Definition targets/bmv2/test_spec.cpp:73
const IR::Expression * getInitialValue() const
Definition targets/bmv2/test_spec.cpp:71
void writeToIndex(const IR::Expression *index, const IR::Expression *value)
Write.
Definition targets/bmv2/test_spec.cpp:67
std::vector< IndexExpression > indexConditions
Each element is an API name paired with a match rule.
Definition targets/bmv2/test_spec.h:79
void addMetaDataField(cstring name, const IR::Literal *metadataField)
Add a metadata field to the collection.
Definition targets/bmv2/test_spec.cpp:333
const MetadataCollection * evaluate(const Model &, bool doComplete) const override
Definition targets/bmv2/test_spec.cpp:320
const IR::Literal * getMetadataField(cstring name)
Definition targets/bmv2/test_spec.cpp:329
cstring getObjectName() const override
Definition targets/bmv2/test_spec.cpp:318
const std::map< cstring, const IR::Literal * > & getMetadataFields() const
Definition targets/bmv2/test_spec.cpp:325
cstring getObjectName() const override
Definition targets/bmv2/test_spec.cpp:281
const IR::Constant * getEvaluatedValue() const
Definition targets/bmv2/test_spec.cpp:267
bool addAsExactMatch() const
Definition targets/bmv2/test_spec.cpp:283
const Optional * evaluate(const Model &model, bool doComplete) const override
Definition targets/bmv2/test_spec.cpp:276
cstring getObjectName() const override
Definition targets/bmv2/test_spec.cpp:337
const IR::Constant * getEvaluatedHigh() const
Definition targets/bmv2/test_spec.cpp:297
const IR::Constant * getEvaluatedLow() const
Definition targets/bmv2/test_spec.cpp:288
const Range * evaluate(const Model &model, bool doComplete) const override
Definition targets/bmv2/test_spec.cpp:306
Represents state of execution after having reached a program point.
Definition execution_state.h:40
Definition cstring.h:85
Inja.
Definition targets/bmv2/cmd_stepper.cpp:37