V3Formula::V3Formula(V3NtkHandler* const handler, const uint32_t& constrSize, const uint32_t& maxCard, const V3GateType& gateType, const uint32_t& noPIorFF) : _handler(handler) { assert (handler); assert (constrSize); assert (maxCard); assert (!(noPIorFF & ~3ul)); assert (BV_AND == gateType || BV_OR == gateType || BV_XOR == gateType || BV_XNOR == gateType); // Collect Leaf Candidates V3Ntk* const ntk = handler->getNtk(); assert (ntk); V3NetVec leafId; leafId.clear(); leafId.reserve(ntk->getInputSize() + ntk->getInoutSize() + ntk->getLatchSize()); if (!(1ul & noPIorFF)) { for (uint32_t i = 0; i < ntk->getInputSize(); ++i) if (1 == ntk->getNetWidth(ntk->getInput(i))) leafId.push_back(ntk->getInput(i)); for (uint32_t i = 0; i < ntk->getInoutSize(); ++i) if (1 == ntk->getNetWidth(ntk->getInout(i))) leafId.push_back(ntk->getInout(i)); } if (!(2ul & noPIorFF)) { for (uint32_t i = 0; i < ntk->getLatchSize(); ++i) if (1 == ntk->getNetWidth(ntk->getLatch(i))) leafId.push_back(ntk->getLatch(i)); } V3UI32Vec constrId; constrId.clear(); constrId.reserve(constrSize); _formula.clear(); // Create Constraints for (uint32_t i = 0; i < constrSize; ++i) { const uint32_t startId = _formula.size(); // Create Leaf Nodes for (uint32_t j = 0; j < maxCard; ++j) { if (j && !(rand() % maxCard)) break; const V3NetId id = (rand() % 5) ? leafId[rand() % leafId.size()] : ~leafId[rand() % leafId.size()]; _formula.push_back(make_pair(V3_PI, V3InputVec())); _formula.back().second.push_back(V3NetType(id)); } assert (startId < _formula.size()); // Link Leaf Nodes with the Specified GateType for (uint32_t j = 0, k = _formula.size() - startId; j < k; ++j) { if (!j) constrId.push_back(startId + j); else { _formula.push_back(make_pair(gateType, V3InputVec())); _formula.back().second.push_back(constrId.back()); _formula.back().second.push_back(startId + j); constrId.back() = _formula.size() - 1; } } assert ((1 + i) == constrId.size()); } // Combine Constraints for (uint32_t i = 0; i < constrId.size(); ++i) { if (!i) _rootId = constrId[i]; else { _formula.push_back(make_pair(BV_AND, V3InputVec())); _formula.back().second.push_back(_rootId); _formula.back().second.push_back(constrId[i]); _rootId = _formula.size() - 1; } } }
// Constructor for Random Formula V3Formula::V3Formula(V3NtkHandler* const handler, const V3SimTraceVec& cexTrace, const double& strength) : _handler(handler) { assert (handler); assert (cexTrace.size()); assert (strength > 0 && strength <= 1.00); V3UI32Vec constrId; constrId.clear(); constrId.reserve(cexTrace.size()); _formula.clear(); // Create Constraints V3Ntk* const ntk = handler->getNtk(); assert (ntk); for (uint32_t i = 0; i < cexTrace.size(); ++i) { const uint32_t startId = _formula.size(), end = 1 + (uint32_t)(strength * ntk->getLatchSize()); assert (cexTrace[i].size()); assert (ntk->getLatchSize() == cexTrace[i].size()); for (uint32_t j = 0; j < end; ++j) { const uint32_t index = rand() % cexTrace[i].size(); assert (1 == ntk->getNetWidth(ntk->getLatch(index))); const V3NetId id = ('0' == cexTrace[i][index][0]) ? ~(ntk->getLatch(index)) : ntk->getLatch(index); _formula.push_back(make_pair(V3_PI, V3InputVec())); _formula.back().second.push_back(V3NetType(id)); } assert (startId <= _formula.size()); // Conjunction of Leaf Nodes for (uint32_t j = 0, k = _formula.size() - startId; j < k; ++j) { if (!j) constrId.push_back(startId + j); else { _formula.push_back(make_pair(BV_AND, V3InputVec())); _formula.back().second.push_back(constrId.back()); _formula.back().second.push_back(startId + j); constrId.back() = _formula.size() - 1; } } } // Disjunction of Constraints for (uint32_t i = 0; i < constrId.size(); ++i) { if (!i) _rootId = constrId[i]; else { _formula.push_back(make_pair(BV_OR, V3InputVec())); _formula.back().second.push_back(_rootId); _formula.back().second.push_back(constrId[i]); _rootId = _formula.size() - 1; } } }