public static Implicant Intersect(Implicant p0, Implicant p1, int pNumLiterals) { var intersectImplicant = new Implicant(pNumLiterals); var distance = 0; for (var i = 0; i < p0.Length; i++) { if (p0[i] == p1[i]) { intersectImplicant[i] = p0[i]; } else { intersectImplicant[i] = Literal.DontCare; distance++; } } if (distance > 1) { return null; } else { p0.Prime = false; p1.Prime = false; return intersectImplicant; } }
public Implicant(Implicant pImplicant) { _literals = new Literal[pImplicant.Length]; Prime = true; for (var i = 0; i < pImplicant.Length; i++) { _literals[i] = pImplicant[i]; } }
public void TestCaseImplicantCopyConstructorWorks() { var identical = true; var copyImplicant = new Implicant(_testImplicant); for (var i = 0; i < _testImplicant.Length; i++) { if (copyImplicant[i] != _testImplicant[i]) { identical = false; } } Assert.True(identical); }
public void TestCaseImplicantIntersectionDistanceOneIsCorrect( [Random(0, MaxNumLiterals, RepeatCount)] int pIndex) { var distance1Implicant = new Implicant(_testImplicant); var length = _testImplicant.Length; var index = pIndex % length; switch (_testImplicant[index]) { case Literal.Positive: distance1Implicant[index] = Literal.Negative; break; case Literal.Negative: distance1Implicant[index] = Literal.Positive; break; case Literal.DontCare: break; default: throw new ArgumentOutOfRangeException(); } var intersectionImplicant = Implicant.Intersect(distance1Implicant, _testImplicant, length); var differentDontCares = 0; var correctIntersection = true; for (var i = 0; i < length; i++) { if (_testImplicant[i] == intersectionImplicant[i]) continue; if (intersectionImplicant[i] == Literal.DontCare) { differentDontCares++; } else { correctIntersection = false; } } if (differentDontCares > 1) { correctIntersection = false; } Assert.True(correctIntersection); }
public void TestCaseImplicantTablePrimeImplicants() { var expectedPrimeImplicant = new Implicant(new[] {Literal.DontCare, Literal.DontCare, Literal.DontCare}); var implicantTable = new ImplicantTable(new List<Implicant>() { new Implicant(new[] { Literal.Negative, Literal.Negative, Literal.Negative}), new Implicant(new[] { Literal.Negative, Literal.Negative, Literal.Positive}), new Implicant(new[] { Literal.Negative, Literal.Positive, Literal.Negative}), new Implicant(new[] { Literal.Negative, Literal.Positive, Literal.Positive}), new Implicant(new[] { Literal.Positive, Literal.Negative, Literal.Negative}), new Implicant(new[] { Literal.Positive, Literal.Negative, Literal.Positive}), new Implicant(new[] { Literal.Positive, Literal.Positive, Literal.Negative}), new Implicant(new[] { Literal.Positive, Literal.Positive, Literal.Positive}) }); var primeImplicants = implicantTable.GetPrimeImplicants(); var primeImplicant = primeImplicants[0]; Assert.AreEqual(expectedPrimeImplicant, primeImplicant); }
public void SetUp() { var length = _generator.Next(1, MaxNumLiterals); _testImplicant = new Implicant(length); }
public void TestImplicantIntersectionDistanceGreaterThanOneIsNull( [Random(0, MaxNumLiterals, RepeatCount)] int pIndex1, [Random(0, MaxNumLiterals, RepeatCount)] int pIndex2) { var distance2Implicant = new Implicant(_testImplicant); var length = _testImplicant.Length; var index1 = pIndex1 % length; var index2 = pIndex2 % length; if (index1 == index2) return; switch (_testImplicant[index1]) { case Literal.Positive: distance2Implicant[index1] = Literal.Negative; break; case Literal.Negative: distance2Implicant[index1] = Literal.Positive; break; case Literal.DontCare: break; default: throw new ArgumentOutOfRangeException(); } switch (_testImplicant[index2]) { case Literal.Positive: distance2Implicant[index2] = Literal.Negative; break; case Literal.Negative: distance2Implicant[index2] = Literal.Positive; break; case Literal.DontCare: break; default: throw new ArgumentOutOfRangeException(); } var intersectionImplicant = Implicant.Intersect(distance2Implicant, _testImplicant, length); Assert.Null(intersectionImplicant); }
public void TestCaseImplicantIntersectionDistanceZeroIsEqual() { var otherImplicant = new Implicant(_testImplicant); var intersection = Implicant.Intersect(_testImplicant, otherImplicant, _testImplicant.Length); Assert.AreEqual(_testImplicant, intersection); }