7#ifndef BACKENDS_P4TOOLS_COMMON_LIB_TRACE_EVENT_TYPES_H_
8#define BACKENDS_P4TOOLS_COMMON_LIB_TRACE_EVENT_TYPES_H_
14#include "backends/p4tools/common/lib/model.h"
15#include "backends/p4tools/common/lib/symbolic_env.h"
16#include "backends/p4tools/common/lib/trace_event.h"
18#include "ir/visitor.h"
19#include "lib/cstring.h"
29class Generic :
public TraceEvent {
34 void print(std::ostream &os)
const override;
37 explicit Generic(
cstring label);
38 ~Generic()
override =
default;
39 Generic(
const Generic &) =
default;
40 Generic(Generic &&) =
default;
41 Generic &operator=(
const Generic &) =
default;
42 Generic &operator=(Generic &&) =
default;
44 DECLARE_TYPEINFO(Generic, TraceEvent);
53class GenericDescription :
public Generic {
57 void print(std::ostream &os)
const override;
62 DECLARE_TYPEINFO(GenericDescription, Generic);
70class Expression :
public Generic {
72 const IR::Expression *value;
75 [[nodiscard]]
const Expression *
subst(
const SymbolicEnv &env)
const override;
77 [[nodiscard]]
const Expression *
evaluate(
const Model &model,
bool doComplete)
const override;
79 explicit Expression(
const IR::Expression *value,
cstring label);
80 ~Expression()
override =
default;
81 Expression(
const Expression &) =
default;
82 Expression(Expression &&) =
default;
83 Expression &operator=(
const Expression &) =
default;
84 Expression &operator=(Expression &&) =
default;
87 void print(std::ostream &os)
const override;
89 DECLARE_TYPEINFO(Expression, Generic);
97class MethodCall :
public TraceEvent {
99 const IR::MethodCallExpression *call;
102 explicit MethodCall(
const IR::MethodCallExpression *call);
103 ~MethodCall()
override =
default;
104 MethodCall(
const MethodCall &) =
default;
105 MethodCall(MethodCall &&) =
default;
106 MethodCall &operator=(
const MethodCall &) =
default;
107 MethodCall &operator=(MethodCall &&) =
default;
110 void print(std::ostream &os)
const override;
112 DECLARE_TYPEINFO(MethodCall, TraceEvent);
120class IfStatementCondition :
public TraceEvent {
122 const IR::Expression *preEvalCond =
nullptr;
123 const IR::Expression *postEvalCond;
125 void setPreEvalCond(
const IR::Expression *cond);
128 [[nodiscard]]
const IfStatementCondition *
subst(
const SymbolicEnv &env)
const override;
129 const IfStatementCondition *
apply(
Transform &visitor)
const override;
130 [[nodiscard]]
const IfStatementCondition *
evaluate(
const Model &model,
131 bool doComplete)
const override;
133 explicit IfStatementCondition(
const IR::Expression *cond);
136 void print(std::ostream &os)
const override;
138 DECLARE_TYPEINFO(IfStatementCondition, TraceEvent);
146class AssignmentStatement :
public TraceEvent {
148 const IR::AssignmentStatement &stmt;
151 [[nodiscard]]
const AssignmentStatement *
subst(
const SymbolicEnv &env)
const override;
152 const AssignmentStatement *
apply(
Transform &visitor)
const override;
153 [[nodiscard]]
const AssignmentStatement *
evaluate(
const Model &model,
154 bool doComplete)
const override;
156 explicit AssignmentStatement(
const IR::AssignmentStatement &stmt);
159 void print(std::ostream &os)
const override;
161 DECLARE_TYPEINFO(AssignmentStatement, TraceEvent);
170class ExtractSuccess :
public TraceEvent {
174 const IR::Expression *extractedHeader;
180 const IR::Expression *condition;
183 std::vector<std::pair<IR::StateVariable, const IR::Expression *>> fields;
186 [[nodiscard]]
const ExtractSuccess *
subst(
const SymbolicEnv &env)
const override;
188 [[nodiscard]]
const ExtractSuccess *
evaluate(
const Model &model,
189 bool doComplete)
const override;
198 [[nodiscard]]
const std::vector<std::pair<IR::StateVariable, const IR::Expression *>> &
201 ExtractSuccess(
const IR::Expression *extractedHeader,
int offset,
202 const IR::Expression *condition,
203 std::vector<std::pair<IR::StateVariable, const IR::Expression *>> fields);
204 ExtractSuccess(
const ExtractSuccess &) =
default;
205 ExtractSuccess(ExtractSuccess &&) =
default;
206 ExtractSuccess &operator=(
const ExtractSuccess &) =
default;
207 ExtractSuccess &operator=(ExtractSuccess &&) =
default;
208 ~ExtractSuccess()
override =
default;
211 void print(std::ostream &os)
const override;
213 DECLARE_TYPEINFO(ExtractSuccess, TraceEvent);
222class ExtractFailure :
public TraceEvent {
226 const IR::Expression *extractedHeader;
232 const IR::Expression *condition;
235 ExtractFailure(
const IR::Expression *extractedHeader,
int offset,
236 const IR::Expression *condition);
238 ExtractFailure(
const ExtractFailure &) =
default;
239 ExtractFailure(ExtractFailure &&) =
default;
240 ExtractFailure &operator=(
const ExtractFailure &) =
default;
241 ExtractFailure &operator=(ExtractFailure &&) =
default;
242 ~ExtractFailure()
override =
default;
245 void print(std::ostream &os)
const override;
247 DECLARE_TYPEINFO(ExtractFailure, TraceEvent);
255class Emit :
public TraceEvent {
258 const IR::HeaderExpression *emitHeader;
263 [[nodiscard]]
const Emit *
evaluate(
const Model &model,
bool doComplete)
const override;
265 explicit Emit(
const IR::HeaderExpression *emitHeader);
266 ~Emit()
override =
default;
267 Emit(
const Emit &) =
default;
268 Emit(Emit &&) =
default;
269 Emit &operator=(
const Emit &) =
default;
270 Emit &operator=(Emit &&) =
default;
273 void print(std::ostream &os)
const override;
275 DECLARE_TYPEINFO(Emit, TraceEvent);
283class Packet :
public TraceEvent {
308 const IR::Expression *packetValue;
311 void print(std::ostream &os)
const override;
323class ParserStart :
public TraceEvent {
325 const IR::P4Parser *parser;
328 explicit ParserStart(
const IR::P4Parser *parser);
329 ~ParserStart()
override =
default;
330 ParserStart(
const ParserStart &) =
default;
331 ParserStart(ParserStart &&) =
default;
332 ParserStart &operator=(
const ParserStart &) =
default;
333 ParserStart &operator=(ParserStart &&) =
default;
336 void print(std::ostream &os)
const override;
338 DECLARE_TYPEINFO(ParserStart, TraceEvent);
346class ParserState :
public TraceEvent {
348 const IR::ParserState *state;
351 explicit ParserState(
const IR::ParserState *state);
352 ~ParserState()
override =
default;
353 ParserState(
const ParserState &) =
default;
354 ParserState(ParserState &&) =
default;
355 ParserState &operator=(
const ParserState &) =
default;
356 ParserState &operator=(ParserState &&) =
default;
362 void print(std::ostream &os)
const override;
364 DECLARE_TYPEINFO(ParserState, TraceEvent);