1#ifndef BACKENDS_P4TOOLS_COMMON_LIB_MODEL_H_
2#define BACKENDS_P4TOOLS_COMMON_LIB_MODEL_H_
8#include <boost/container/flat_map.hpp>
12#include "ir/visitor.h"
17using SymbolicMapType = boost::container::flat_map<IR::StateVariable, const IR::Expression *>;
24 SymbolicMapping symbolicMap;
40 const IR::Literal *preorder(IR::StateVariable *var)
override;
41 const IR::Literal *preorder(IR::SymbolicVariable *var)
override;
42 const IR::Literal *preorder(IR::TaintExpression *var)
override;
44 explicit SubstVisitor(
const Model &model,
bool doComplete);
49 using ExpressionMap = std::map<const IR::Expression *, const IR::Literal *>;
52 explicit Model(SymbolicMapping symbolicMap) : symbolicMap(
std::move(symbolicMap)) {}
65 const IR::Literal *
evaluate(
const IR::Expression *expr,
bool doComplete,
66 ExpressionMap *resolvedExpressions =
nullptr)
const;
70 const IR::StructExpression *evaluateStructExpr(
71 const IR::StructExpression *structExpr,
bool doComplete,
72 ExpressionMap *resolvedExpressions =
nullptr)
const;
76 const IR::BaseListExpression *evaluateListExpr(
77 const IR::BaseListExpression *listExpr,
bool doComplete,
78 ExpressionMap *resolvedExpressions =
nullptr)
const;
83 [[nodiscard]]
const IR::Expression *
get(
const IR::SymbolicVariable *var,
bool checked)
const;
88 void set(
const IR::SymbolicVariable *var,
const IR::Expression *val);
91 void mergeMap(
const SymbolicMapping &sourceMap);