Пример #1
0
        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;
            }
        }
Пример #2
0
        public Implicant(Implicant pImplicant)
        {
            _literals = new Literal[pImplicant.Length];
            Prime = true;

            for (var i = 0; i < pImplicant.Length; i++)
            {
                _literals[i] = pImplicant[i];
            }
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #6
0
 public void SetUp()
 {
     var length = _generator.Next(1, MaxNumLiterals);
     _testImplicant = new Implicant(length);
 }
Пример #7
0
        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);
        }
Пример #8
0
 public void TestCaseImplicantIntersectionDistanceZeroIsEqual()
 {
     var otherImplicant = new Implicant(_testImplicant);
     var intersection = Implicant.Intersect(_testImplicant, otherImplicant, _testImplicant.Length);
     Assert.AreEqual(_testImplicant, intersection);
 }