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;
191 ExtractSuccess(
const IR::Expression *extractedHeader,
int offset,
192 const IR::Expression *condition,
193 std::vector<std::pair<IR::StateVariable, const IR::Expression *>> fields);
194 ExtractSuccess(
const ExtractSuccess &) =
default;
195 ExtractSuccess(ExtractSuccess &&) =
default;
196 ExtractSuccess &operator=(
const ExtractSuccess &) =
default;
197 ExtractSuccess &operator=(ExtractSuccess &&) =
default;
198 ~ExtractSuccess()
override =
default;
201 void print(std::ostream &os)
const override;
203 DECLARE_TYPEINFO(ExtractSuccess, TraceEvent);
212class ExtractFailure :
public TraceEvent {
216 const IR::Expression *extractedHeader;
222 const IR::Expression *condition;
225 ExtractFailure(
const IR::Expression *extractedHeader,
int offset,
226 const IR::Expression *condition);
228 ExtractFailure(
const ExtractFailure &) =
default;
229 ExtractFailure(ExtractFailure &&) =
default;
230 ExtractFailure &operator=(
const ExtractFailure &) =
default;
231 ExtractFailure &operator=(ExtractFailure &&) =
default;
232 ~ExtractFailure()
override =
default;
235 void print(std::ostream &os)
const override;
237 DECLARE_TYPEINFO(ExtractFailure, TraceEvent);
245class Emit :
public TraceEvent {
248 const IR::HeaderExpression *emitHeader;
253 [[nodiscard]]
const Emit *
evaluate(
const Model &model,
bool doComplete)
const override;
255 explicit Emit(
const IR::HeaderExpression *emitHeader);
256 ~Emit()
override =
default;
257 Emit(
const Emit &) =
default;
258 Emit(Emit &&) =
default;
259 Emit &operator=(
const Emit &) =
default;
260 Emit &operator=(Emit &&) =
default;
263 void print(std::ostream &os)
const override;
265 DECLARE_TYPEINFO(Emit, TraceEvent);
273class Packet :
public TraceEvent {
298 const IR::Expression *packetValue;
301 void print(std::ostream &os)
const override;
313class ParserStart :
public TraceEvent {
315 const IR::P4Parser *parser;
318 explicit ParserStart(
const IR::P4Parser *parser);
319 ~ParserStart()
override =
default;
320 ParserStart(
const ParserStart &) =
default;
321 ParserStart(ParserStart &&) =
default;
322 ParserStart &operator=(
const ParserStart &) =
default;
323 ParserStart &operator=(ParserStart &&) =
default;
326 void print(std::ostream &os)
const override;
328 DECLARE_TYPEINFO(ParserStart, TraceEvent);
336class ParserState :
public TraceEvent {
338 const IR::ParserState *state;
341 explicit ParserState(
const IR::ParserState *state);
342 ~ParserState()
override =
default;
343 ParserState(
const ParserState &) =
default;
344 ParserState(ParserState &&) =
default;
345 ParserState &operator=(
const ParserState &) =
default;
346 ParserState &operator=(ParserState &&) =
default;
352 void print(std::ostream &os)
const override;
354 DECLARE_TYPEINFO(ParserState, TraceEvent);