GCC Code Coverage Report
Directory: . Exec Total Coverage
File: src/theory/rewriter_attributes.h Lines: 30 30 100.0 %
Date: 2021-08-01 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
40017191
  static Node getPreRewriteCache(TNode node)
38
  {
39
80034382
    Node cache;
40
40017191
    if (node.hasAttribute(pre_rewrite())) {
41
28223552
      node.getAttribute(pre_rewrite(), cache);
42
    } else {
43
11793639
      return Node::null();
44
    }
45
28223552
    if (cache.isNull()) {
46
23822451
      return node;
47
    } else {
48
4401101
      return cache;
49
    }
50
  }
51
52
  /**
53
   * Set the value of the pre-rewrite cache.
54
   */
55
12196935
  static void setPreRewriteCache(TNode node, TNode cache)
56
  {
57
12196935
    Trace("rewriter") << "setting pre-rewrite of " << node << " to " << cache << std::endl;
58
12196935
    Assert(!cache.isNull());
59
12196935
    if (node == cache) {
60
9920477
      node.setAttribute(pre_rewrite(), Node::null());
61
    } else {
62
2276458
      node.setAttribute(pre_rewrite(), cache);
63
    }
64
12196935
  }
65
66
  /**
67
   * Get the value of the post-rewrite cache.
68
   * none).
69
   */
70
106970486
  static Node getPostRewriteCache(TNode node)
71
  {
72
213940972
    Node cache;
73
106970486
    if (node.hasAttribute(post_rewrite())) {
74
56705167
      node.getAttribute(post_rewrite(), cache);
75
    } else {
76
50265319
      return Node::null();
77
    }
78
56705167
    if (cache.isNull()) {
79
46475091
      return node;
80
    } else {
81
10230076
      return cache;
82
    }
83
  }
84
85
  /**
86
   * Set the value of the post-rewrite cache.  v cannot be a null Node.
87
   */
88
11422204
  static void setPostRewriteCache(TNode node, TNode cache)
89
  {
90
11422204
    Assert(!cache.isNull());
91
11422204
    Trace("rewriter") << "setting rewrite of " << node << " to " << cache << std::endl;
92
11422204
    if (node == cache) {
93
6018464
      node.setAttribute(post_rewrite(), Node::null());
94
    } else {
95
5403740
      node.setAttribute(post_rewrite(), cache);
96
    }
97
11422204
  }
98
};/* struct RewriteAttribute */
99
100
}  // namespace theory
101
}  // namespace cvc5