void CNFMgr::scanTerm(const ASTNode& varphi) { CNFInfo* x; //######################################## // step 1, get the info associated with this node //######################################## if (info.find(varphi) == info.end()) { x = new CNFInfo(); info[varphi] = x; } else { x = info[varphi]; } //######################################## // step 2, need two hits because of term ITEs. //######################################## if (sharesPos(*x) == 2) { return; } //######################################## // step 3, set appropriate data fields, always rename // term ITEs //######################################## incrementSharesPos(*x); setIsTerm(*x); //######################################## // step 4, recurse over children //######################################## if (varphi.isAtom()) { return; } else if (varphi.isITE()) { scanFormula(varphi[0], true, false); scanFormula(varphi[0], false, false); scanTerm(varphi[1]); scanTerm(varphi[2]); } else { for (unsigned int i = 0; i < varphi.GetChildren().size(); i++) { scanTerm(varphi[i]); } } }//End of scanterm()
void CNFMgr::convertTermForCNF(const ASTNode& varphi, ClauseList* defs) { CNFInfo* x = info[varphi]; //######################################## // step 1, done if we've already visited //######################################## if (x->termforcnf != NULL) { return; } //######################################## // step 2, ITE's always get renamed //######################################## if (varphi.isITE()) { x->termforcnf = doRenameITE(varphi, defs); reduceMemoryFootprintPos(varphi[0]); reduceMemoryFootprintNeg(varphi[0]); } else if (varphi.isAtom()) { x->termforcnf = ASTNodeToASTNodePtr(varphi); } else { ASTVec psis; ASTVec::const_iterator it = varphi.GetChildren().begin(); for (; it != varphi.GetChildren().end(); it++) { convertTermForCNF(*it, defs); psis.push_back(*(info[*it]->termforcnf)); } ASTNode psi = bm->CreateNode(varphi.GetKind(), psis); psi.SetValueWidth(varphi.GetValueWidth()); psi.SetIndexWidth(varphi.GetIndexWidth()); x->termforcnf = ASTNodeToASTNodePtr(psi); } } //End of convertTermForCNF()