P4C
The P4 Compiler
Loading...
Searching...
No Matches
abstract_execution_state.h
1/*
2 * SPDX-FileCopyrightText: 2023 The P4 Language Consortium
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#ifndef BACKENDS_P4TOOLS_COMMON_CORE_ABSTRACT_EXECUTION_STATE_H_
8#define BACKENDS_P4TOOLS_COMMON_CORE_ABSTRACT_EXECUTION_STATE_H_
9
10#include "backends/p4tools/common/core/target.h"
11#include "backends/p4tools/common/lib/namespace_context.h"
12#include "backends/p4tools/common/lib/symbolic_env.h"
13#include "ir/ir.h"
14
15namespace P4::P4Tools {
16
19 protected:
23
26
27 /* =========================================================================================
28 * Constructors
29 * ========================================================================================= */
32
35
38
39 public:
41 explicit AbstractExecutionState(const IR::P4Program *program);
42 virtual ~AbstractExecutionState() = default;
44
47 [[nodiscard]] virtual AbstractExecutionState &clone() const = 0;
48
50
51 /* =========================================================================================
52 * Accessors
53 * ========================================================================================= */
54 public:
56 [[nodiscard]] virtual const IR::Expression *get(const IR::StateVariable &var) const = 0;
57
60 virtual void set(const IR::StateVariable &var, const IR::Expression *value) = 0;
61
63 [[nodiscard]] bool exists(const IR::StateVariable &var) const;
64
66 [[nodiscard]] const SymbolicEnv &getSymbolicEnv() const;
67
69 void printSymbolicEnv(std::ostream &out = std::cout) const;
70
71 public:
73 [[nodiscard]] const IR::IDeclaration *findDecl(const IR::Path *path) const;
74
76 [[nodiscard]] const IR::IDeclaration *findDecl(const IR::PathExpression *pathExpr) const;
77
79 [[nodiscard]] const IR::Type *resolveType(const IR::Type *type) const;
80
82 [[nodiscard]] const NamespaceContext *getNamespaceContext() const;
83
86
88 void pushNamespace(const IR::INamespace *ns);
89
91 void popNamespace();
92
93 /* =========================================================================================
94 * General utilities involving ExecutionState.
95 * ========================================================================================= */
96 protected:
100 const IR::Expression *convertToComplexExpression(const IR::StateVariable &parent) const;
101
106 static std::vector<const IR::Expression *> flattenComplexExpression(
107 const IR::Expression *inputExpression, std::vector<const IR::Expression *> &flatValids);
108
109 public:
115 [[nodiscard]] std::vector<IR::StateVariable> getFlatFields(
116 const IR::StateVariable &parent,
117 std::vector<IR::StateVariable> *validVector = nullptr) const;
118
121 void initializeStructLike(const Target &target, const IR::StateVariable &targetVar,
122 bool forceTaint);
123
126 void assignStructLike(const IR::StateVariable &left, const IR::Expression *right);
127
129 void setStructLike(const IR::StateVariable &targetVar, const IR::StateVariable &sourceVar);
130
133 void declareVariable(const Target &target, const IR::Declaration_Variable &declVar);
134
137 void copyIn(const Target &target, const IR::Parameter *internalParam,
138 cstring externalParamName);
139
142 void copyOut(const IR::Parameter *internalParam, cstring externalParamName);
143
146 void initializeBlockParams(const Target &target, const IR::Type_Declaration *typeDecl,
147 const std::vector<cstring> *blockParams);
148
151 const IR::P4Table *findTable(const IR::Member *member) const;
152
153 // Try to extract and @return the IR::P4Action from the action call.
156 [[nodiscard]] const IR::P4Action *getP4Action(const IR::MethodCallExpression *actionExpr) const;
157};
158
159} // namespace P4::P4Tools
160
161#endif /* BACKENDS_P4TOOLS_COMMON_CORE_ABSTRACT_EXECUTION_STATE_H_ */
The Declaration interface, representing objects with names.
Definition declaration.h:17
void pushNamespace(const IR::INamespace *ns)
Enters a namespace of declarations.
Definition abstract_execution_state.cpp:71
void copyIn(const Target &target, const IR::Parameter *internalParam, cstring externalParamName)
Definition abstract_execution_state.cpp:290
void initializeStructLike(const Target &target, const IR::StateVariable &targetVar, bool forceTaint)
Definition abstract_execution_state.cpp:174
void declareVariable(const Target &target, const IR::Declaration_Variable &declVar)
Definition abstract_execution_state.cpp:255
virtual void set(const IR::StateVariable &var, const IR::Expression *value)=0
const IR::P4Action * getP4Action(const IR::MethodCallExpression *actionExpr) const
Definition abstract_execution_state.cpp:376
const IR::Expression * convertToComplexExpression(const IR::StateVariable &parent) const
Definition abstract_execution_state.cpp:81
const IR::P4Table * findTable(const IR::Member *member) const
Definition abstract_execution_state.cpp:384
const NamespaceContext * getNamespaceContext() const
Definition abstract_execution_state.cpp:65
SymbolicEnv env
The symbolic environment. Maps program variables to their symbolic values.
Definition abstract_execution_state.h:25
virtual const IR::Expression * get(const IR::StateVariable &var) const =0
const IR::IDeclaration * findDecl(const IR::Path *path) const
Looks up a declaration from a path. A BUG occurs if no declaration is found.
Definition abstract_execution_state.cpp:45
void assignStructLike(const IR::StateVariable &left, const IR::Expression *right)
Definition abstract_execution_state.cpp:187
void initializeBlockParams(const Target &target, const IR::Type_Declaration *typeDecl, const std::vector< cstring > *blockParams)
Definition abstract_execution_state.cpp:344
const SymbolicEnv & getSymbolicEnv() const
Definition abstract_execution_state.cpp:29
bool exists(const IR::StateVariable &var) const
Checks whether the given variable exists in the symbolic environment of this state.
Definition abstract_execution_state.cpp:27
void printSymbolicEnv(std::ostream &out=std::cout) const
Produce a formatted output of the current symbolic environment.
Definition abstract_execution_state.cpp:31
virtual AbstractExecutionState & clone() const =0
static std::vector< const IR::Expression * > flattenComplexExpression(const IR::Expression *inputExpression, std::vector< const IR::Expression * > &flatValids)
Definition abstract_execution_state.cpp:122
const NamespaceContext * namespaces
Definition abstract_execution_state.h:22
AbstractExecutionState(const AbstractExecutionState &)=default
Execution state needs to be explicitly copied using the clone call..
AbstractExecutionState & operator=(const AbstractExecutionState &)=default
Do not accidentally copy-assign the execution state.
void setStructLike(const IR::StateVariable &targetVar, const IR::StateVariable &sourceVar)
Set the members of struct-like @target with the values of struct-like @source.
Definition abstract_execution_state.cpp:233
const IR::Type * resolveType(const IR::Type *type) const
Resolves a Type in the current environment.
Definition abstract_execution_state.cpp:53
std::vector< IR::StateVariable > getFlatFields(const IR::StateVariable &parent, std::vector< IR::StateVariable > *validVector=nullptr) const
Definition abstract_execution_state.cpp:144
AbstractExecutionState()
Used for debugging and testing.
Definition abstract_execution_state.cpp:21
void popNamespace()
Exists a namespace of declarations.
Definition abstract_execution_state.cpp:75
void copyOut(const IR::Parameter *internalParam, cstring externalParamName)
Definition abstract_execution_state.cpp:320
void setNamespaceContext(const NamespaceContext *namespaces)
Replaces the namespace context in the current state with the given context.
Definition abstract_execution_state.cpp:67
Represents a stack of namespaces.
Definition namespace_context.h:20
Definition symbolic_env.h:18
Definition p4tools/common/core/target.h:25
Definition cstring.h:85
Definition common/compiler/compiler_result.cpp:7