Branch data Line data Source code
1 : : /****************************************************************************** 2 : : * Top contributors (to current version): 3 : : * Andrew Reynolds, Aina Niemetz, Mathias Preiner 4 : : * 5 : : * This file is part of the cvc5 project. 6 : : * 7 : : * Copyright (c) 2009-2024 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 : : * Term context node utility. 14 : : */ 15 : : 16 : : #include "expr/term_context_node.h" 17 : : 18 : : #include "expr/term_context.h" 19 : : #include "util/rational.h" 20 : : 21 : : using namespace cvc5::internal::kind; 22 : : 23 : : namespace cvc5::internal { 24 : : 25 : 0 : TCtxNode::TCtxNode(Node n, const TermContext* tctx) 26 : 0 : : d_node(n), d_val(tctx->initialValue()), d_tctx(tctx) 27 : : { 28 : 0 : } 29 : : 30 : 0 : TCtxNode::TCtxNode(Node n, uint32_t val, const TermContext* tctx) 31 : 0 : : d_node(n), d_val(val), d_tctx(tctx) 32 : : { 33 : 0 : } 34 : : 35 : 0 : size_t TCtxNode::getNumChildren() const { return d_node.getNumChildren(); } 36 : : 37 : 0 : TCtxNode TCtxNode::getChild(size_t i) const 38 : : { 39 : 0 : Assert(i < d_node.getNumChildren()); 40 : : // we are still computing the same term context, with the given child, where 41 : : // the hash has been updated based on the kind, node, current value and child 42 : : // index. 43 : 0 : return TCtxNode(d_node[i], d_tctx->computeValue(d_node, d_val, i), d_tctx); 44 : : } 45 : : 46 : 0 : Node TCtxNode::getNode() const { return d_node; } 47 : : 48 : 0 : uint32_t TCtxNode::getContextId() const { return d_val; } 49 : : 50 : 0 : const TermContext* TCtxNode::getTermContext() const { return d_tctx; } 51 : : 52 : 0 : Node TCtxNode::getNodeHash() const { return computeNodeHash(d_node, d_val); } 53 : : 54 : 1734710 : Node TCtxNode::computeNodeHash(Node n, uint32_t val) 55 : : { 56 : 1734710 : NodeManager* nm = NodeManager::currentNM(); 57 : 1734710 : return nm->mkNode(Kind::SEXPR, n, nm->mkConstInt(Rational(val))); 58 : : } 59 : : 60 : 0 : Node TCtxNode::decomposeNodeHash(Node h, uint32_t& val) 61 : : { 62 : 0 : if (h.getKind() != Kind::SEXPR || h.getNumChildren() != 2) 63 : : { 64 : 0 : Assert(false) << "TermContext::decomposeNodeHash: unexpected node " << h; 65 : : return Node::null(); 66 : : } 67 : 0 : Node ival = h[1]; 68 : 0 : if (!ival.isConst() || !ival.getType().isInteger() 69 : 0 : || !ival.getConst<Rational>().getNumerator().fitsUnsignedInt()) 70 : : { 71 : 0 : Assert(false) << "TermContext::decomposeNodeHash: unexpected term context " 72 : 0 : "integer in hash " 73 : : << h; 74 : : return Node::null(); 75 : : } 76 : 0 : val = ival.getConst<Rational>().getNumerator().toUnsignedInt(); 77 : 0 : return h[0]; 78 : : } 79 : : 80 : : } // namespace cvc5::internal