Пример #1
0
        /// <summary>
        /// Enforces maxvalues by disallowing values normally room for with the size of bits in an fdd
        /// Value is normally expected to be the same as used in the constructor of the fdd.
        /// Note: (powers of 2) -1) does not need to be constrained: 7, 255 etc.
        /// </summary>
        /// <param name="fdd">The fdd to constrain</param>
        /// <param name="value">The values to enforce</param>
        public static Bdd EnforceMaxValue(Fdd fdd, int value)
        {
            Bdd result;

            //Always allow all bits where most significant bit isn't set
            result = Kernel.Not(new Bdd(fdd.Var));

            int start = (int)Math.Pow(2, Size(fdd) - 1);      //lowest number with most significant bit set

            for (int i = start; i <= value; i++)
            {
                result = Kernel.Or(result, Equal(fdd, i));
            }
            return(result);
        }
Пример #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);
        }
Пример #3
0
        /// <summary>
        /// Creates a hard binding sort of like an fdd restrict.
        /// Difference is that the binding will persist no matter
        /// what changes is later added.
        /// </summary>
        /// <param name="fdd">the Fdd to create a binding on</param>
        /// <param name="value">the constant number that is assigned to the Fdd.</param>
        /// <returns></returns>
        public static Bdd Equal(Fdd fdd, int value)
        {
            if (Log2(value) > FddDictionary[fdd.Var])      //value larger than fdd can hold.
            {
                return(new Bdd(false));
            }

            bool[] b = ToBitPattern(value, Size(fdd));

            Bdd result = new Bdd(true);

            for (int i = 0; i < b.Length; i++)
            {
                if (b[i])
                {
                    result = Kernel.And(result, new Bdd(fdd.Var + i));
                }
                else
                {
                    result = Kernel.And(result, Kernel.Not(new Bdd(fdd.Var + i)));
                }
            }
            return(result);
        }
Пример #4
0
 /// <summary>
 /// Not operator on Bdd
 /// </summary>
 /// <param name="r">Bdd</param>
 /// <returns>Resulting Bdd</returns>
 public static Bdd operator !(Bdd r)
 {
     return(Kernel.Not(r));
 }