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);