示例#1
0
//************************* 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;
}