summaryrefslogtreecommitdiff
path: root/src/preprocessing/preprocessing_pass_context.h
blob: 3eb0f10b59286643769bf4bf3d3138d2d1e55cb3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/*********************                                                        */
/*! \file preprocessing_pass_context.h
 ** \verbatim
 ** Top contributors (to current version):
 **   Justin Xu, Andres Noetzli, Aina Niemetz
 ** This file is part of the CVC4 project.
 ** Copyright (c) 2009-2018 by the authors listed in the file AUTHORS
 ** in the top-level source directory) and their institutional affiliations.
 ** All rights reserved.  See the file COPYING in the top-level source
 ** directory for licensing information.\endverbatim
 **
 ** \brief The preprocessing pass context for passes
 **
 ** Implementation of the preprocessing pass context for passes. This context
 ** allows preprocessing passes to retrieve information besides the assertions
 ** from the solver and interact with it without getting full access.
 **/

#include "cvc4_private.h"

#ifndef __CVC4__PREPROCESSING__PREPROCESSING_PASS_CONTEXT_H
#define __CVC4__PREPROCESSING__PREPROCESSING_PASS_CONTEXT_H

#include "context/cdo.h"
#include "context/context.h"
#include "decision/decision_engine.h"
#include "preprocessing/util/ite_utilities.h"
#include "smt/smt_engine.h"
#include "smt/term_formula_removal.h"
#include "theory/booleans/circuit_propagator.h"
#include "theory/theory_engine.h"
#include "util/resource_manager.h"

namespace CVC4 {
namespace preprocessing {

class PreprocessingPassContext
{
 public:
  PreprocessingPassContext(
      SmtEngine* smt,
      ResourceManager* resourceManager,
      RemoveTermFormulas* iteRemover,
      theory::booleans::CircuitPropagator* circuitPropagator);

  SmtEngine* getSmt() { return d_smt; }
  TheoryEngine* getTheoryEngine() { return d_smt->d_theoryEngine; }
  DecisionEngine* getDecisionEngine() { return d_smt->d_decisionEngine; }
  prop::PropEngine* getPropEngine() { return d_smt->d_propEngine; }
  context::Context* getUserContext() { return d_smt->d_userContext; }
  context::Context* getDecisionContext() { return d_smt->d_context; }
  RemoveTermFormulas* getIteRemover() { return d_iteRemover; }

  theory::booleans::CircuitPropagator* getCircuitPropagator()
  {
    return d_circuitPropagator;
  }

  context::CDHashSet<Node, NodeHashFunction>& getSymsInAssertions()
  {
    return d_symsInAssertions;
  }

  void spendResource(unsigned amount)
  {
    d_resourceManager->spendResource(amount);
  }

  const LogicInfo& getLogicInfo() { return d_smt->d_logic; }

  /* Widen the logic to include the given theory. */
  void widenLogic(theory::TheoryId id);

  unsigned getSubstitutionsIndex() const { return d_substitutionsIndex.get(); }

  void setSubstitutionsIndex(unsigned i) { d_substitutionsIndex = i; }

  /** Gets a reference to the top-level substitution map */
  theory::SubstitutionMap& getTopLevelSubstitutions()
  {
    return d_topLevelSubstitutions;
  }

  /* Enable Integers. */
  void enableIntegers();

  /** Record symbols in assertions
   *
   * This method is called when a set of assertions is finalized. It adds
   * the symbols to d_symsInAssertions that occur in assertions.
   */
  void recordSymbolsInAssertions(const std::vector<Node>& assertions);

 private:
  /** Pointer to the SmtEngine that this context was created in. */
  SmtEngine* d_smt;

  /** Pointer to the ResourceManager for this context. */
  ResourceManager* d_resourceManager;

  /** Instance of the ITE remover */
  RemoveTermFormulas* d_iteRemover;

  /* Index for where to store substitutions */
  context::CDO<unsigned> d_substitutionsIndex;

  /* The top level substitutions */
  theory::SubstitutionMap d_topLevelSubstitutions;

  /** Instance of the circuit propagator */
  theory::booleans::CircuitPropagator* d_circuitPropagator;

  /**
   * The (user-context-dependent) set of symbols that occur in at least one
   * assertion in the current user context.
   */
  context::CDHashSet<Node, NodeHashFunction> d_symsInAssertions;

};  // class PreprocessingPassContext

}  // namespace preprocessing
}  // namespace CVC4

#endif /* __CVC4__PREPROCESSING__PREPROCESSING_PASS_CONTEXT_H */
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback