/// <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); }
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); }
/// <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); }
/// <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)); }