P4C
The P4 Compiler
Loading...
Searching...
No Matches
backends/p4tools/common/lib/model.h
1/*
2 * SPDX-FileCopyrightText: 2022 The P4 Language Consortium
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#ifndef BACKENDS_P4TOOLS_COMMON_LIB_MODEL_H_
8#define BACKENDS_P4TOOLS_COMMON_LIB_MODEL_H_
9
10#include <map>
11#include <utility>
12
13#include "ir/ir.h"
14#include "ir/solver.h"
15#include "ir/visitor.h"
16
17namespace P4::P4Tools {
18
21
24class Model {
25 private:
27 SymbolicMapping symbolicMap;
28
29 // A visitor that iterates over an input expression and visits all the variables in the input
30 // expression. These variables correspond to variables that were used for constraints in model
31 // generated by the SMT solver. A variable needs to be
34 class SubstVisitor : public Transform {
35 const Model &self;
36
40 bool doComplete;
41
42 public:
43 const IR::Literal *preorder(IR::StateVariable *var) override;
44 const IR::Literal *preorder(IR::SymbolicVariable *var) override;
45 const IR::Literal *preorder(IR::TaintExpression *var) override;
46
47 explicit SubstVisitor(const Model &model, bool doComplete);
48 };
49
50 public:
51 // Maps an expression to its value in the model.
52 using ExpressionMap = std::map<const IR::Expression *, const IR::Literal *>;
53
55 explicit Model(SymbolicMapping symbolicMap) : symbolicMap(std::move(symbolicMap)) {}
56
57 Model(const Model &) = default;
58 Model(Model &&) = default;
59 Model &operator=(const Model &) = default;
60 Model &operator=(Model &&) = default;
61 ~Model() = default;
62
68 const IR::Literal *evaluate(const IR::Expression *expr, bool doComplete,
69 ExpressionMap *resolvedExpressions = nullptr) const;
70
71 // Evaluates a P4 StructExpression in the context of this model. Recursively calls into
72 // @evaluate and substitutes all members of this list with a Value type.
73 const IR::StructExpression *evaluateStructExpr(
74 const IR::StructExpression *structExpr, bool doComplete,
75 ExpressionMap *resolvedExpressions = nullptr) const;
76
77 // Evaluates a P4 BaseListExpression in the context of this model. Recursively calls into
78 // @evaluate and substitutes all members of this list with a Value type.
79 const IR::BaseListExpression *evaluateListExpr(
80 const IR::BaseListExpression *listExpr, bool doComplete,
81 ExpressionMap *resolvedExpressions = nullptr) const;
82
86 [[nodiscard]] const IR::Expression *get(const IR::SymbolicVariable *var, bool checked) const;
87
91 void set(const IR::SymbolicVariable *var, const IR::Expression *val);
92
94 void mergeMap(const SymbolicMapping &sourceMap);
95
97 [[nodiscard]] const SymbolicMapping &getSymbolicMap() const;
98};
99
100} // namespace P4::P4Tools
101
102#endif /* BACKENDS_P4TOOLS_COMMON_LIB_MODEL_H_ */
Definition backends/p4tools/common/lib/model.h:24
const SymbolicMapping & getSymbolicMap() const
Definition model.cpp:110
Model(SymbolicMapping symbolicMap)
A model is initialized with a symbolic map. Usually, these are derived from the solver.
Definition backends/p4tools/common/lib/model.h:55
void mergeMap(const SymbolicMapping &sourceMap)
Merge a sumbolic map into this model, do NOT override existing values.
Definition model.cpp:112
const IR::Expression * get(const IR::SymbolicVariable *var, bool checked) const
Definition model.cpp:97
const IR::Literal * evaluate(const IR::Expression *expr, bool doComplete, ExpressionMap *resolvedExpressions=nullptr) const
Definition model.cpp:85
void set(const IR::SymbolicVariable *var, const IR::Expression *val)
Definition model.cpp:106
Definition visitor.h:442
Definition common/compiler/compiler_result.cpp:7
P4::flat_map< IR::StateVariable, const IR::Expression * > SymbolicMapType
Symbolic maps map a state variable to a IR::Expression.
Definition backends/p4tools/common/lib/model.h:20
P4::flat_map< const IR::SymbolicVariable *, const IR::Expression *, IR::SymbolicVariableLess > SymbolicMapping
This type maps symbolic variables to their value assigned by the solver.
Definition solver.h:26
STL namespace.
Definition flat_map.h:29