//************************* FUNCTION CompareTermBuckets ************************ TermPair CompareTermBuckets(TermBuckets buckets) { /* * Receives: the inputted minterms for the expression to minimze * Task: Get the minimized expression of minterms * Returns: the essential primes as a BoolExpr */ // Create a UsedTermRef, which is used to check if a term // has already been "checked" auto used_term_ref = MakeUsedTermRef(buckets); int num_buckets = buckets.size(); BoolExpr new_terms; // Compare each bucket with the one below it (except for the last bucket) for (int bucket_a = 0; bucket_a < num_buckets - 1; ++bucket_a) { int bucket_b = bucket_a + 1; int bucket_a_size = buckets[bucket_a].size(); int bucket_b_size = buckets[bucket_b].size(); // Don't try to compare two buckets if one of them is empty if (!(bucket_a_size && bucket_b_size)) { continue; } for (int a_term = 0; a_term < bucket_a_size; ++a_term) { for (int b_term = 0; b_term < bucket_b_size; ++b_term) { bool both_terms_checked = (used_term_ref[bucket_a][a_term] && used_term_ref[bucket_b][b_term]); int set_diff = SetDifference(buckets[bucket_a][a_term], buckets[bucket_b][b_term]); if (!both_terms_checked && set_diff == 1) { // Set the used references for a and b used_term_ref[bucket_a][a_term] = true; used_term_ref[bucket_b][b_term] = true; auto new_term = CombineTerms(buckets[bucket_a][a_term], buckets[bucket_b][b_term]); new_terms.push_back(new_term); } } } } // Get the unused terms auto unused_terms = GetUnusedTerms(buckets, used_term_ref); return std::make_pair(new_terms, unused_terms); }
sft_generic_set<IType> &sft_generic_set<IType>::operator-=(sft_generic_set<IType> &other) { sft_generic_set<IType> tmp = SetDifference(*this, other); *this = tmp; return *this; }
sft_generic_set<IType> sft_generic_set<IType>::operator-(sft_generic_set<IType> &other) { sft_generic_set<IType> ret = SetDifference(*this, other); return ret; }