示例#1
0
  /**
   * Builds a BDD which is true for all the possible assignments to the variable blocks that makes
   * the blocks equal.
   *
   * <p>Compare to fdd_equals/fdd_equ.
   *
   * @param that
   * @return BDD
   */
  public BDD buildEquals(BDDDomain that) {
    if (!this.size().equals(that.size())) {
      throw new BDDException(
          "Size of "
              + this
              + " != size of that "
              + that
              + "( "
              + this.size()
              + " vs "
              + that.size()
              + ")");
    }

    BDDFactory factory = getFactory();
    BDD e = factory.universe();

    int[] this_ivar = this.vars();
    int[] that_ivar = that.vars();

    for (int n = 0; n < this.varNum(); n++) {
      BDD a = factory.ithVar(this_ivar[n]);
      BDD b = factory.ithVar(that_ivar[n]);
      a.biimpWith(b);
      e.andWith(a);
    }

    return e;
  }
示例#2
0
  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;
  }