public BDD buildAdd(BDDDomain that, int bits, long value) { if (bits > this.varNum() || bits > that.varNum()) throw new BDDException( "Number of bits requested (" + bits + ") is larger than domain sizes " + this.varNum() + "," + that.varNum()); BDDFactory bdd = getFactory(); if (value == 0L) { BDD result = bdd.universe(); int n; for (n = 0; n < bits; n++) { BDD b = bdd.ithVar(this.ivar[n]); b.biimpWith(bdd.ithVar(that.ivar[n])); result.andWith(b); } for (; n < Math.max(this.varNum(), that.varNum()); n++) { BDD b = (n < this.varNum()) ? bdd.nithVar(this.ivar[n]) : bdd.one(); b.andWith((n < that.varNum()) ? bdd.nithVar(that.ivar[n]) : bdd.one()); result.andWith(b); } return result; } int[] vars = new int[bits]; System.arraycopy(this.ivar, 0, vars, 0, vars.length); BDDBitVector y = bdd.buildVector(vars); BDDBitVector v = bdd.constantVector(bits, value); BDDBitVector z = y.add(v); int[] thatvars = new int[bits]; System.arraycopy(that.ivar, 0, thatvars, 0, thatvars.length); BDDBitVector x = bdd.buildVector(thatvars); BDD result = bdd.one(); int n; for (n = 0; n < x.size(); n++) { BDD b = x.bitvec[n].biimp(z.bitvec[n]); result.andWith(b); } for (; n < Math.max(this.varNum(), that.varNum()); n++) { BDD b = (n < this.varNum()) ? bdd.nithVar(this.ivar[n]) : bdd.one(); b.andWith((n < that.varNum()) ? bdd.nithVar(that.ivar[n]) : bdd.one()); result.andWith(b); } x.free(); y.free(); z.free(); v.free(); return result; }
public static void main(String[] args) { BDDFactory bdd = init(1000000, 100000); System.out.println("One: " + CUDDFactory.one); System.out.println("Zero: " + CUDDFactory.zero); BDDDomain[] doms = bdd.extDomain(new int[] {50, 10, 15, 20, 15}); BDD b = bdd.one(); for (int i = 0; i < doms.length - 1; ++i) { b.andWith(doms[i].ithVar(i)); } for (int i = 0; i < bdd.numberOfDomains(); ++i) { BDDDomain d = bdd.getDomain(i); int[] ivar = d.vars(); System.out.print("Domain #" + i + ":"); for (int j = 0; j < ivar.length; ++j) { System.out.print(' '); System.out.print(j); System.out.print(':'); System.out.print(ivar[j]); } System.out.println(); } BDDPairing p = bdd.makePair(doms[2], doms[doms.length - 1]); System.out.println("Pairing: " + p); System.out.println("Before replace(): " + b); BDD c = b.replace(p); System.out.println("After replace(): " + c); c.printDot(); }