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