1#ifndef BACKENDS_P4TOOLS_COMMON_LIB_TRACE_EVENT_TYPES_H_
2#define BACKENDS_P4TOOLS_COMMON_LIB_TRACE_EVENT_TYPES_H_
8#include "backends/p4tools/common/lib/model.h"
9#include "backends/p4tools/common/lib/symbolic_env.h"
10#include "backends/p4tools/common/lib/trace_event.h"
12#include "ir/visitor.h"
13#include "lib/cstring.h"
23class Generic :
public TraceEvent {
28 void print(std::ostream &os)
const override;
31 explicit Generic(
cstring label);
32 ~Generic()
override =
default;
33 Generic(
const Generic &) =
default;
34 Generic(Generic &&) =
default;
35 Generic &operator=(
const Generic &) =
default;
36 Generic &operator=(Generic &&) =
default;
38 DECLARE_TYPEINFO(Generic, TraceEvent);
47class GenericDescription :
public Generic {
51 void print(std::ostream &os)
const override;
56 DECLARE_TYPEINFO(GenericDescription, Generic);
64class Expression :
public Generic {
66 const IR::Expression *value;
69 [[nodiscard]]
const Expression *
subst(
const SymbolicEnv &env)
const override;
71 [[nodiscard]]
const Expression *
evaluate(
const Model &model,
bool doComplete)
const override;
73 explicit Expression(
const IR::Expression *value,
cstring label);
74 ~Expression()
override =
default;
75 Expression(
const Expression &) =
default;
76 Expression(Expression &&) =
default;
77 Expression &operator=(
const Expression &) =
default;
78 Expression &operator=(Expression &&) =
default;
81 void print(std::ostream &os)
const override;
83 DECLARE_TYPEINFO(Expression, Generic);
91class MethodCall :
public TraceEvent {
93 const IR::MethodCallExpression *call;
96 explicit MethodCall(
const IR::MethodCallExpression *call);
97 ~MethodCall()
override =
default;
98 MethodCall(
const MethodCall &) =
default;
99 MethodCall(MethodCall &&) =
default;
100 MethodCall &operator=(
const MethodCall &) =
default;
101 MethodCall &operator=(MethodCall &&) =
default;
104 void print(std::ostream &os)
const override;
106 DECLARE_TYPEINFO(MethodCall, TraceEvent);
114class IfStatementCondition :
public TraceEvent {
116 const IR::Expression *preEvalCond =
nullptr;
117 const IR::Expression *postEvalCond;
119 void setPreEvalCond(
const IR::Expression *cond);
122 [[nodiscard]]
const IfStatementCondition *
subst(
const SymbolicEnv &env)
const override;
123 const IfStatementCondition *
apply(
Transform &visitor)
const override;
124 [[nodiscard]]
const IfStatementCondition *
evaluate(
const Model &model,
125 bool doComplete)
const override;
127 explicit IfStatementCondition(
const IR::Expression *cond);
130 void print(std::ostream &os)
const override;
132 DECLARE_TYPEINFO(IfStatementCondition, TraceEvent);
140class AssignmentStatement :
public TraceEvent {
142 const IR::AssignmentStatement &stmt;
145 [[nodiscard]]
const AssignmentStatement *
subst(
const SymbolicEnv &env)
const override;
146 const AssignmentStatement *
apply(
Transform &visitor)
const override;
147 [[nodiscard]]
const AssignmentStatement *
evaluate(
const Model &model,
148 bool doComplete)
const override;
150 explicit AssignmentStatement(
const IR::AssignmentStatement &stmt);
153 void print(std::ostream &os)
const override;
155 DECLARE_TYPEINFO(AssignmentStatement, TraceEvent);
164class ExtractSuccess :
public TraceEvent {
168 const IR::Expression *extractedHeader;
174 const IR::Expression *condition;
177 std::vector<std::pair<IR::StateVariable, const IR::Expression *>> fields;
180 [[nodiscard]]
const ExtractSuccess *
subst(
const SymbolicEnv &env)
const override;
182 [[nodiscard]]
const ExtractSuccess *
evaluate(
const Model &model,
183 bool doComplete)
const override;
192 [[nodiscard]]
const std::vector<std::pair<IR::StateVariable, const IR::Expression *>> &
195 ExtractSuccess(
const IR::Expression *extractedHeader,
int offset,
196 const IR::Expression *condition,
197 std::vector<std::pair<IR::StateVariable, const IR::Expression *>> fields);
198 ExtractSuccess(
const ExtractSuccess &) =
default;
199 ExtractSuccess(ExtractSuccess &&) =
default;
200 ExtractSuccess &operator=(
const ExtractSuccess &) =
default;
201 ExtractSuccess &operator=(ExtractSuccess &&) =
default;
202 ~ExtractSuccess()
override =
default;
205 void print(std::ostream &os)
const override;
207 DECLARE_TYPEINFO(ExtractSuccess, TraceEvent);
216class ExtractFailure :
public TraceEvent {
220 const IR::Expression *extractedHeader;
226 const IR::Expression *condition;
229 ExtractFailure(
const IR::Expression *extractedHeader,
int offset,
230 const IR::Expression *condition);
232 ExtractFailure(
const ExtractFailure &) =
default;
233 ExtractFailure(ExtractFailure &&) =
default;
234 ExtractFailure &operator=(
const ExtractFailure &) =
default;
235 ExtractFailure &operator=(ExtractFailure &&) =
default;
236 ~ExtractFailure()
override =
default;
239 void print(std::ostream &os)
const override;
241 DECLARE_TYPEINFO(ExtractFailure, TraceEvent);
249class Emit :
public TraceEvent {
252 const IR::HeaderExpression *emitHeader;
257 [[nodiscard]]
const Emit *
evaluate(
const Model &model,
bool doComplete)
const override;
259 explicit Emit(
const IR::HeaderExpression *emitHeader);
260 ~Emit()
override =
default;
261 Emit(
const Emit &) =
default;
262 Emit(Emit &&) =
default;
263 Emit &operator=(
const Emit &) =
default;
264 Emit &operator=(Emit &&) =
default;
267 void print(std::ostream &os)
const override;
269 DECLARE_TYPEINFO(Emit, TraceEvent);
277class Packet :
public TraceEvent {
302 const IR::Expression *packetValue;
305 void print(std::ostream &os)
const override;
317class ParserStart :
public TraceEvent {
319 const IR::P4Parser *parser;
322 explicit ParserStart(
const IR::P4Parser *parser);
323 ~ParserStart()
override =
default;
324 ParserStart(
const ParserStart &) =
default;
325 ParserStart(ParserStart &&) =
default;
326 ParserStart &operator=(
const ParserStart &) =
default;
327 ParserStart &operator=(ParserStart &&) =
default;
330 void print(std::ostream &os)
const override;
332 DECLARE_TYPEINFO(ParserStart, TraceEvent);
340class ParserState :
public TraceEvent {
342 const IR::ParserState *state;
345 explicit ParserState(
const IR::ParserState *state);
346 ~ParserState()
override =
default;
347 ParserState(
const ParserState &) =
default;
348 ParserState(ParserState &&) =
default;
349 ParserState &operator=(
const ParserState &) =
default;
350 ParserState &operator=(ParserState &&) =
default;
356 void print(std::ostream &os)
const override;
358 DECLARE_TYPEINFO(ParserState, TraceEvent);