Branch data Line data Source code
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-2025 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::internal { 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 : 56446596 : static Node getPreRewriteCache(TNode node) 38 : : { 39 : 112893090 : Node cache; 40 [ + + ]: 56446596 : if (node.hasAttribute(pre_rewrite())) { 41 : 37346293 : node.getAttribute(pre_rewrite(), cache); 42 : : } else { 43 : 19100250 : return Node::null(); 44 : : } 45 [ + + ]: 37346293 : if (cache.isNull()) { 46 : 29659413 : return node; 47 : : } else { 48 : 7686913 : return cache; 49 : : } 50 : : } 51 : : 52 : : /** 53 : : * Set the value of the pre-rewrite cache. 54 : : */ 55 : 20903928 : static void setPreRewriteCache(TNode node, TNode cache) 56 : : { 57 [ + - ]: 20903928 : Trace("rewriter") << "setting pre-rewrite of " << node << " to " << cache << std::endl; 58 [ - + ][ - + ]: 20903928 : Assert(!cache.isNull()); [ - - ] 59 [ + + ]: 20903928 : if (node == cache) { 60 : 16519014 : node.setAttribute(pre_rewrite(), Node::null()); 61 : : } else { 62 : 4384915 : node.setAttribute(pre_rewrite(), cache); 63 : : } 64 : 20903928 : } 65 : : 66 : : /** 67 : : * Get the value of the post-rewrite cache. 68 : : * none). 69 : : */ 70 : 185701057 : static Node getPostRewriteCache(TNode node) 71 : : { 72 : 371402762 : Node cache; 73 [ + + ]: 185701057 : if (node.hasAttribute(post_rewrite())) { 74 : 114878307 : node.getAttribute(post_rewrite(), cache); 75 : : } else { 76 : 70822856 : return Node::null(); 77 : : } 78 [ + + ]: 114878307 : if (cache.isNull()) { 79 : 86717389 : return node; 80 : : } else { 81 : 28160975 : return cache; 82 : : } 83 : : } 84 : : 85 : : /** 86 : : * Set the value of the post-rewrite cache. v cannot be a null Node. 87 : : */ 88 : 19037637 : static void setPostRewriteCache(TNode node, TNode cache) 89 : : { 90 [ - + ][ - + ]: 19037637 : Assert(!cache.isNull()); [ - - ] 91 [ + - ]: 19037637 : Trace("rewriter") << "setting rewrite of " << node << " to " << cache << std::endl; 92 [ + + ]: 19037637 : if (node == cache) { 93 : 9181230 : node.setAttribute(post_rewrite(), Node::null()); 94 : : } else { 95 : 9856398 : node.setAttribute(post_rewrite(), cache); 96 : : } 97 : 19037637 : } 98 : : };/* struct RewriteAttribute */ 99 : : 100 : : } // namespace theory 101 : : } // namespace cvc5::internal