1#ifndef BACKENDS_P4TOOLS_MODULES_TESTGEN_TARGETS_BMV2_TEST_SPEC_H_
2#define BACKENDS_P4TOOLS_MODULES_TESTGEN_TARGETS_BMV2_TEST_SPEC_H_
11#include "backends/p4tools/common/lib/model.h"
12#include "ir/declaration.h"
14#include "lib/cstring.h"
17#include "backends/p4tools/modules/testgen/lib/execution_state.h"
18#include "backends/p4tools/modules/testgen/lib/test_object.h"
19#include "backends/p4tools/modules/testgen/lib/test_spec.h"
20#include "backends/p4tools/modules/testgen/targets/bmv2/constants.h"
30class IndexExpression :
public TestObject {
33 const IR::Expression *index;
36 const IR::Expression *value;
39 explicit IndexExpression(
const IR::Expression *index,
const IR::Expression *value);
50 [[nodiscard]]
const IR::Expression *
getIndex()
const;
53 [[nodiscard]]
const IR::Expression *
getValue()
const;
55 [[nodiscard]]
const IndexExpression *
evaluate(
const Model &model,
56 bool doComplete)
const override;
60 DECLARE_TYPEINFO(IndexExpression, TestObject);
67class IndexMap :
public TestObject {
79 void writeToIndex(
const IR::Expression *index,
const IR::Expression *value);
86 [[nodiscard]]
const IR::Expression *
getValueAtIndex(
const IR::Expression *index)
const;
93 [[nodiscard]] std::map<big_int, std::pair<int, const IR::Constant *>>
unravelMap()
const;
95 DECLARE_TYPEINFO(IndexMap, TestObject);
109class Bmv2V1ModelRegisterValue :
public IndexMap {
111 explicit Bmv2V1ModelRegisterValue(
const IR::Expression *
initialValue);
115 [[nodiscard]]
const Bmv2V1ModelRegisterValue *
evaluate(
const Model &model,
116 bool doComplete)
const override;
118 DECLARE_TYPEINFO(Bmv2V1ModelRegisterValue, IndexMap);
125class Bmv2V1ModelMeterValue :
public IndexMap {
131 explicit Bmv2V1ModelMeterValue(
const IR::Expression *
initialValue,
bool isDirect);
135 [[nodiscard]]
const Bmv2V1ModelMeterValue *
evaluate(
const Model &model,
136 bool doComplete)
const override;
141 DECLARE_TYPEINFO(Bmv2V1ModelMeterValue, IndexMap);
147class Bmv2V1ModelActionProfile :
public TestObject {
150 std::vector<std::pair<cstring, std::vector<ActionArg>>> actions;
161 [[nodiscard]]
const std::vector<std::pair<cstring, std::vector<ActionArg>>> *
getActions()
const;
172 [[nodiscard]]
const Bmv2V1ModelActionProfile *
evaluate(
const Model &model,
173 bool doComplete)
const override;
175 DECLARE_TYPEINFO(Bmv2V1ModelActionProfile, TestObject);
181class Bmv2V1ModelActionSelector :
public TestObject {
201 [[nodiscard]]
const Bmv2V1ModelActionSelector *
evaluate(
const Model &model,
202 bool doComplete)
const override;
204 DECLARE_TYPEINFO(Bmv2V1ModelActionSelector, TestObject);
210class Bmv2V1ModelCloneInfo :
public TestObject {
213 const IR::Expression *sessionId;
219 std::reference_wrapper<const ExecutionState> clonedState;
222 std::optional<int> preserveIndex;
225 explicit Bmv2V1ModelCloneInfo(
const IR::Expression *sessionId,
228 std::optional<int> preserveIndex);
232 [[nodiscard]]
const Bmv2V1ModelCloneInfo *
evaluate(
const Model &model,
233 bool doComplete)
const override;
236 [[nodiscard]]
const IR::Expression *
getSessionId()
const;
247 DECLARE_TYPEINFO(Bmv2V1ModelCloneInfo, TestObject);
253class Bmv2V1ModelCloneSpec :
public TestObject {
256 const IR::Expression *sessionId;
259 const IR::Expression *clonePort;
266 explicit Bmv2V1ModelCloneSpec(
const IR::Expression *sessionId,
const IR::Expression *clonePort,
271 [[nodiscard]]
const Bmv2V1ModelCloneSpec *
evaluate(
const Model &model,
272 bool doComplete)
const override;
275 [[nodiscard]]
const IR::Expression *
getSessionId()
const;
278 [[nodiscard]]
const IR::Expression *
getClonePort()
const;
292 DECLARE_TYPEINFO(Bmv2V1ModelCloneSpec, TestObject);
298class MetadataCollection :
public TestObject {
301 std::map<cstring, const IR::Literal *> metadataFields;
304 MetadataCollection();
308 [[nodiscard]]
const MetadataCollection *
evaluate(
const Model & ,
309 bool doComplete)
const override;
312 [[nodiscard]]
const std::map<cstring, const IR::Literal *> &
getMetadataFields()
const;
320 DECLARE_TYPEINFO(MetadataCollection, TestObject);
327class Optional :
public TableMatch {
330 const IR::Expression *value;
336 explicit Optional(
const IR::KeyElement *key,
const IR::Expression *value,
bool addMatch);
338 [[nodiscard]]
const Optional *
evaluate(
const Model &model,
bool doComplete)
const override;
349 DECLARE_TYPEINFO(Optional, TableMatch);
352class Range :
public TableMatch {
355 const IR::Expression *low;
358 const IR::Expression *high;
361 explicit Range(
const IR::KeyElement *key,
const IR::Expression *low,
362 const IR::Expression *high);
364 [[nodiscard]]
const Range *
evaluate(
const Model &model,
bool doComplete)
const override;
376 DECLARE_TYPEINFO(Range, TableMatch);
The Declaration interface, representing objects with names.
Definition declaration.h:26