7#ifndef BACKENDS_P4TOOLS_MODULES_TESTGEN_TARGETS_BMV2_TEST_SPEC_H_
8#define BACKENDS_P4TOOLS_MODULES_TESTGEN_TARGETS_BMV2_TEST_SPEC_H_
17#include "backends/p4tools/common/lib/model.h"
18#include "ir/declaration.h"
20#include "lib/cstring.h"
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"
36class IndexExpression :
public TestObject {
39 const IR::Expression *index;
42 const IR::Expression *value;
45 explicit IndexExpression(
const IR::Expression *index,
const IR::Expression *value);
56 [[nodiscard]]
const IR::Expression *
getIndex()
const;
59 [[nodiscard]]
const IR::Expression *
getValue()
const;
61 [[nodiscard]]
const IndexExpression *
evaluate(
const Model &model,
62 bool doComplete)
const override;
66 DECLARE_TYPEINFO(IndexExpression, TestObject);
73class IndexMap :
public TestObject {
85 void writeToIndex(
const IR::Expression *index,
const IR::Expression *value);
92 [[nodiscard]]
const IR::Expression *
getValueAtIndex(
const IR::Expression *index)
const;
99 [[nodiscard]] std::map<big_int, std::pair<int, const IR::Constant *>>
unravelMap()
const;
101 DECLARE_TYPEINFO(IndexMap, TestObject);
115class Bmv2V1ModelRegisterValue :
public IndexMap {
117 explicit Bmv2V1ModelRegisterValue(
const IR::Expression *
initialValue);
121 [[nodiscard]]
const Bmv2V1ModelRegisterValue *
evaluate(
const Model &model,
122 bool doComplete)
const override;
124 DECLARE_TYPEINFO(Bmv2V1ModelRegisterValue, IndexMap);
131class Bmv2V1ModelMeterValue :
public IndexMap {
137 explicit Bmv2V1ModelMeterValue(
const IR::Expression *
initialValue,
bool isDirect);
141 [[nodiscard]]
const Bmv2V1ModelMeterValue *
evaluate(
const Model &model,
142 bool doComplete)
const override;
147 DECLARE_TYPEINFO(Bmv2V1ModelMeterValue, IndexMap);
153class Bmv2V1ModelActionProfile :
public TestObject {
156 std::vector<std::pair<cstring, std::vector<ActionArg>>> actions;
167 [[nodiscard]]
const std::vector<std::pair<cstring, std::vector<ActionArg>>> *
getActions()
const;
178 [[nodiscard]]
const Bmv2V1ModelActionProfile *
evaluate(
const Model &model,
179 bool doComplete)
const override;
181 DECLARE_TYPEINFO(Bmv2V1ModelActionProfile, TestObject);
187class Bmv2V1ModelActionSelector :
public TestObject {
207 [[nodiscard]]
const Bmv2V1ModelActionSelector *
evaluate(
const Model &model,
208 bool doComplete)
const override;
210 DECLARE_TYPEINFO(Bmv2V1ModelActionSelector, TestObject);
216class Bmv2V1ModelCloneInfo :
public TestObject {
219 const IR::Expression *sessionId;
225 std::reference_wrapper<const ExecutionState> clonedState;
228 std::optional<int> preserveIndex;
231 explicit Bmv2V1ModelCloneInfo(
const IR::Expression *sessionId,
234 std::optional<int> preserveIndex);
238 [[nodiscard]]
const Bmv2V1ModelCloneInfo *
evaluate(
const Model &model,
239 bool doComplete)
const override;
242 [[nodiscard]]
const IR::Expression *
getSessionId()
const;
253 DECLARE_TYPEINFO(Bmv2V1ModelCloneInfo, TestObject);
259class Bmv2V1ModelCloneSpec :
public TestObject {
262 const IR::Expression *sessionId;
265 const IR::Expression *clonePort;
272 explicit Bmv2V1ModelCloneSpec(
const IR::Expression *sessionId,
const IR::Expression *clonePort,
277 [[nodiscard]]
const Bmv2V1ModelCloneSpec *
evaluate(
const Model &model,
278 bool doComplete)
const override;
281 [[nodiscard]]
const IR::Expression *
getSessionId()
const;
284 [[nodiscard]]
const IR::Expression *
getClonePort()
const;
298 DECLARE_TYPEINFO(Bmv2V1ModelCloneSpec, TestObject);
304class MetadataCollection :
public TestObject {
307 std::map<cstring, const IR::Literal *> metadataFields;
310 MetadataCollection();
314 [[nodiscard]]
const MetadataCollection *
evaluate(
const Model & ,
315 bool doComplete)
const override;
318 [[nodiscard]]
const std::map<cstring, const IR::Literal *> &
getMetadataFields()
const;
326 DECLARE_TYPEINFO(MetadataCollection, TestObject);
333class Optional :
public TableMatch {
336 const IR::Expression *value;
342 explicit Optional(
const IR::KeyElement *key,
const IR::Expression *value,
bool addMatch);
344 [[nodiscard]]
const Optional *
evaluate(
const Model &model,
bool doComplete)
const override;
355 DECLARE_TYPEINFO(Optional, TableMatch);
358class Range :
public TableMatch {
361 const IR::Expression *low;
364 const IR::Expression *high;
367 explicit Range(
const IR::KeyElement *key,
const IR::Expression *low,
368 const IR::Expression *high);
370 [[nodiscard]]
const Range *
evaluate(
const Model &model,
bool doComplete)
const override;
382 DECLARE_TYPEINFO(Range, TableMatch);
The Declaration interface, representing objects with names.
Definition declaration.h:17