GCC Code Coverage Report
Directory: . Exec Total Coverage
File: src/theory/rewriter_attributes.h Lines: 30 30 100.0 %
Date: 2021-08-14 Branches: 616 1404 43.9 %

Line Exec Source
1
/******************************************************************************
2
 * Top contributors (to current version):
3
 *   Dejan Jovanovic, Tim King, Morgan Deters
4
 *
5
 * This file is part of the cvc5 project.
6
 *
7
 * Copyright (c) 2009-2021 by the authors listed in the file AUTHORS
8
 * in the top-level source directory and their institutional affiliations.
9
 * All rights reserved.  See the file COPYING in the top-level source
10
 * directory for licensing information.
11
 * ****************************************************************************
12
 *
13
 * Rewriter attributes.
14
 */
15
16
#include "cvc5_private.h"
17
18
#pragma once
19
20
#include "expr/attribute.h"
21
22
namespace cvc5 {
23
namespace theory {
24
25
template <bool pre, theory::TheoryId theoryId>
26
struct RewriteCacheTag {};
27
28
template <theory::TheoryId theoryId>
29
struct RewriteAttibute {
30
31
  typedef expr::Attribute< RewriteCacheTag<true, theoryId>, Node> pre_rewrite;
32
  typedef expr::Attribute< RewriteCacheTag<false, theoryId>, Node> post_rewrite;
33
34
  /**
35
   * Get the value of the pre-rewrite cache.
36
   */
37
39142599
  static Node getPreRewriteCache(TNode node)
38
  {
39
78285198
    Node cache;
40
39142599
    if (node.hasAttribute(pre_rewrite())) {
41
27635939
      node.getAttribute(pre_rewrite(), cache);
42
    } else {
43
11506660
      return Node::null();
44
    }
45
27635939
    if (cache.isNull()) {
46
23333412
      return node;
47
    } else {
48
4302527
      return cache;
49
    }
50
  }
51
52
  /**
53
   * Set the value of the pre-rewrite cache.
54
   */
55
11913230
  static void setPreRewriteCache(TNode node, TNode cache)
56
  {
57
11913230
    Trace("rewriter") << "setting pre-rewrite of " << node << " to " << cache << std::endl;
58
11913230
    Assert(!cache.isNull());
59
11913230
    if (node == cache) {
60
9761794
      node.setAttribute(pre_rewrite(), Node::null());
61
    } else {
62
2151436
      node.setAttribute(pre_rewrite(), cache);
63
    }
64
11913230
  }
65
66
  /**
67
   * Get the value of the post-rewrite cache.
68
   * none).
69
   */
70
105713601
  static Node getPostRewriteCache(TNode node)
71
  {
72
211427202
    Node cache;
73
105713601
    if (node.hasAttribute(post_rewrite())) {
74
56606825
      node.getAttribute(post_rewrite(), cache);
75
    } else {
76
49106776
      return Node::null();
77
    }
78
56606825
    if (cache.isNull()) {
79
46082523
      return node;
80
    } else {
81
10524302
      return cache;
82
    }
83
  }
84
85
  /**
86
   * Set the value of the post-rewrite cache.  v cannot be a null Node.
87
   */
88
11150544
  static void setPostRewriteCache(TNode node, TNode cache)
89
  {
90
11150544
    Assert(!cache.isNull());
91
11150544
    Trace("rewriter") << "setting rewrite of " << node << " to " << cache << std::endl;
92
11150544
    if (node == cache) {
93
5920794
      node.setAttribute(post_rewrite(), Node::null());
94
    } else {
95
5229750
      node.setAttribute(post_rewrite(), cache);
96
    }
97
11150544
  }
98
};/* struct RewriteAttribute */
99
100
}  // namespace theory
101
}  // namespace cvc5