Example #1
0
        /// <summary>
        /// Xor function for FDD's, same as a != differ function.
        /// </summary>
        /// <param name="u1">left side of the expression</param>
        /// <param name="u2">right side of the expression</param>
        /// <returns>a new BDD where u1 and u2 are xor'ed</returns>
        public static Bdd Xor(Fdd u1, Fdd u2)
        {
            int u1Size  = Size(u1);
            int u2Size  = Size(u2);
            int MinSize = Min(u1Size, u2Size);
            Bdd result  = new Bdd(false);

            for (int i = 0; i < MinSize; i++)
            {
                result = Kernel.Or(result, Kernel.Xor(new Bdd(u1.Var + i), new Bdd(u2.Var + i)));
            }

            if (u1Size != u2Size)
            {
                if (u1Size > u2Size)        //you reach this state when 2 Fdds does not have the same number
                {                           //of bits. What happens is then the smallest get buffered with 0's
                    for (int i = MinSize; i < u1Size; i++)
                    {
                        result = Kernel.Or(result, Kernel.Xor(new Bdd(u1.Var + i), new Bdd(false)));
                    }
                }
                else
                {
                    for (int i = MinSize; i < u2Size; i++)
                    {
                        result = Kernel.Or(result, Kernel.Xor(new Bdd(false), new Bdd(u2.Var + i)));
                    }
                }
            }

            return(result);
        }
Example #2
0
        public Bdd execute()
        {
            // Calls specific methods from Kernel
            Bdd l      = left.execute();
            Bdd r      = right.execute();
            Bdd result = new Bdd(false);

            switch (op)
            {
            case Kind.DIS:
                result = BDD.Or(l, r);
                break;

            case Kind.CON:
                result = BDD.And(l, r);
                break;

            case Kind.BIMP:
                result = BDD.Equal(l, r);
                break;

            case Kind.NAND:
                result = BDD.Nand(l, r);
                break;

            case Kind.XOR:
                result = BDD.Xor(l, r);
                break;

            case Kind.NOR:
                result = BDD.Nor(l, r);
                break;

            case Kind.NOT:
                result = BDD.Not(r);
                break;
            }
            l.Dispose();                //forced garbage collection
            r.Dispose();

            return(result);
        }
Example #3
0
 /// <summary>
 /// Not equal operator on two Bdds
 /// </summary>
 /// <param name="l">Left Bdd</param>
 /// <param name="r">Right Bdd</param>
 /// <returns>Resulting Bdd</returns>
 public static Bdd operator !=(Bdd l, Bdd r)
 {
     return(Kernel.Xor(l, r));
 }