⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bdd.java

📁 一种将c高级语言转化给VHDL的编译器
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
	return l;      if (l.isOne() || r.isOne()) 	return ONE;      if (l.isZero())	return r;      if (r.isZero()) 	return l;      break;    case XOR:      if (l == r) 	return ZERO;      if (l.isZero()) 	return r;      if (r.isZero())	return l;      break;    case NAND:      if (l.isZero() || r.isZero()) 	return ONE;      break;    case NOR:      if (l.isOne() || r.isOne()) 	return ZERO;      break;    case IMPL:      if (l.isZero()) 	return ONE;      if (l.isOne()) 	return r;      if (r.isOne()) 	return l;      break;    }    if (l.isConst() && r.isConst()) {      res = (oprres[op][l.getRoot()<<1 | r.getRoot()] == 1 ? ONE : ZERO);    } else {      //int q_hash = applyHash(l,r,op);      //System.err.println(" apply hash "+q_hash);      entry = applycache.lookup(applyHash(l,r,op));      //System.err.println(" Found "+entry.toApplyCache());            if (entry.a == l && entry.b == r 	  && ((Integer)entry.c).intValue() == op) {	return (BDDNode)entry.res;      }      if (l.getLevel() == r.getLevel()) {	//System.err.println("Level equal");	bddrefstack.push(apply_rec(l.getLow(),r.getLow(),op));	bddrefstack.push(apply_rec(l.getHigh(),r.getHigh(),op));		res = makeNode(l.getLevel(), 		       (BDDNode)bddrefstack.elementAt(bddrefstack.size() - 2),		       (BDDNode)bddrefstack.peek());      } else if (l.getLevel() < r.getLevel()) {	//System.err.println("Level l less than r");	bddrefstack.push(apply_rec(l.getLow(), r, op));	bddrefstack.push(apply_rec(l.getHigh(), r, op));		/*	      System.err.println("Stack");      Iterator stack_iter = bddrefstack.iterator();    // Iterate on refstack      while(stack_iter.hasNext()) {	BDDNode node = (BDDNode) stack_iter.next();	System.err.println("\t "+node);      }	*/	//System.err.println(" peek()  "+ (BDDNode)bddrefstack.peek());	//System.err.println(" trick() "+ (BDDNode)bddrefstack.elementAt(bddrefstack.size() - 2));      	res = makeNode(l.getLevel(), 		       (BDDNode)bddrefstack.elementAt(bddrefstack.size() - 2),		       (BDDNode)bddrefstack.peek());      } else {	//System.err.println("Level l bigger than r");	bddrefstack.push(apply_rec(l, r.getLow(), op));	bddrefstack.push(apply_rec(l, r.getHigh(), op));		res = makeNode(r.getLevel(), 		       (BDDNode)bddrefstack.elementAt(bddrefstack.size() - 2),		       (BDDNode)bddrefstack.peek());      }      bddrefstack.pop();      bddrefstack.pop();      entry.a = l;      entry.b = r;      entry.c = op_integer[op];      entry.res = res;    }    //System.out.println(" apply rec made "+res);    return res;  }  public BDDNode bdd_restrict(BDDNode r, BDDNode var) {    BDDNode res;    int[] varset;    if (r == null || r.getLow() == null) {      new Exception().printStackTrace();      System.out.println("Illegal BDD "+r);      System.exit(-1);    }    if (var == null || var.getLow() == null) {      new Exception().printStackTrace();      System.out.println("Illegal BDD "+var);      System.exit(-1);    }        // check op number ??    if (var.getRoot() < 2) {      return r;    }        varset = set2sintp(var);    /*    for (int i=0; i < varset.length; i++) {      System.out.println(" varset ["+i+"] "+varset[i]);    }    */    // size can change...    //reset refstack -- uh, how do I have a stack that     // I am not pointing to the top?    miscid = (var.getRoot() << 2) | CACHEID_RESTRICT;    res = restrict_rec(r, varset, 0, varset.length);    checkreorder(res);    return res;  }    BDDNode restrict_rec(BDDNode r, int[] lvl, int current, int num) {    BDDCacheData entry;    BDDNode res;    int level;        if (r.getRoot() < 2 || num == 0)       return r;        entry = misccache.lookup(restrHash(r,miscid));    if (entry.a == r && ((Integer)entry.c).intValue() == miscid)       return (BDDNode)entry.res;    level = Math.abs(lvl[current]) - 1;        if (r.getLevel() == level) {      if (lvl[current] > 0) 	res = restrict_rec(r.getHigh(), lvl, current + 1, num - 1);      else	res = restrict_rec(r.getLow(), lvl, current + 1, num - 1);    } else if (r.getLevel() < level) {      bddrefstack.push(restrict_rec(r.getLow(), lvl, current, num));      bddrefstack.push(restrict_rec(r.getHigh(), lvl, current, num));            res = makeNode(r.getLevel(), 		       (BDDNode)bddrefstack.elementAt(bddrefstack.size() - 2),		       (BDDNode)bddrefstack.peek());      bddrefstack.pop();      bddrefstack.pop();    } else {      res = restrict_rec(r, lvl, current + 1, num - 1);    }        entry.a = r;    entry.c = new Integer(miscid);    entry.res = res;          return res;  }     public BDDNode bdd_simplify(BDDNode f, BDDNode d) {    BDDNode res;   if (f == null || f.getLow() == null) {      new Exception().printStackTrace();      System.out.println("Illegal BDD "+f);      System.exit(-1);    }    if (d == null || d.getLow() == null) {      new Exception().printStackTrace();      System.out.println("Illegal BDD "+d);      System.exit(-1);    }        //reset refstack -- uh, how do I have a stack that     // I am not pointing to the top?        res = simplify_rec(f,d);    checkreorder(res);        return res;  }    BDDNode simplify_rec(BDDNode f, BDDNode d) {    BDDCacheData entry;    BDDNode res;    if (d.isZero())       return ZERO;    if (d.isOne())      return f;    if (f.isZero() || f.isOne())      return f;    entry = applycache.lookup(applyHash(f,d,SIMPLIFY));    //System.err.println(" Found "+entry.toApplyCache());        if (entry.a == f && entry.b == d 	&& ((Integer)entry.c).intValue() == SIMPLIFY) {      return (BDDNode)entry.res;    }    if (f.getLevel() == d.getLevel())       if (d.getLow().isZero())	res = simplify_rec(f.getHigh(), d.getHigh());      else if (d.getHigh().isZero())	res = simplify_rec(f.getLow(), d.getLow());      else {	bddrefstack.push(simplify_rec(f.getLow(), d.getLow()));	bddrefstack.push(simplify_rec(f.getHigh(), f.getHigh()));	res = makeNode(f.getLevel(), 		       (BDDNode)bddrefstack.elementAt(bddrefstack.size() - 2),		       (BDDNode)bddrefstack.peek());	bddrefstack.pop();	bddrefstack.pop();      }    else if (f.getLevel() < d.getLevel()) {      bddrefstack.push(simplify_rec(f.getLow(), d ));      bddrefstack.push(simplify_rec(f.getHigh(), d));            res = makeNode(f.getLevel(), 		     (BDDNode)bddrefstack.elementAt(bddrefstack.size() - 2),		     (BDDNode)bddrefstack.peek());      bddrefstack.pop();      bddrefstack.pop();    } else {      bddrefstack.push(simplify_rec(f, d.getLow()));      bddrefstack.push(simplify_rec(f, d.getHigh()));            res = makeNode(d.getLevel(), 		     (BDDNode)bddrefstack.elementAt(bddrefstack.size() - 2),		     (BDDNode)bddrefstack.peek());      bddrefstack.pop();      bddrefstack.pop();    }          entry.a = f;    entry.b = d;    entry.c = op_integer[SIMPLIFY];    entry.res = res;        return res;  }  int[] set2sintp(BDDNode r) {    BDDNode n;    int num;    int result[];    if (r.getRoot() < 2) {      System.out.println(" This is a error in set2sintp -- what??");      System.exit(-1);    }    n = r;    num = 0;    while (n.getRoot() > 1) {      if (n.getHigh().getRoot() >= 1) {	n = n.getHigh();      } else {	n = n.getLow();      }      num++;    }    result = new int[num];    n = r;    num = 0;        while (n.getRoot() > 1) {      if (n.getHigh().getRoot() >= 1) {	result[num++] = n.getLevel() + 1;	n = n.getHigh();      } else {	result[num++] = -(n.getLevel() + 1);	n = n.getLow();      }    }    return result;  }	              void bdd_operator_reset() {    applycache.reset();    //itecache.reset();    //quantcache.reset();    //appexcache.reset();    //replacecache.reset();    misccache.reset();  }  void bdd_reorder_auto() {    System.err.println(" NO auto reording ... ");  }						  void bdd_noderesize() {    BDDNode newnodes[];    BDDNode next_node;    int oldsize = bddnodesize;    int n;    if (bddnodesize >= bddmaxnodesize && bddmaxnodesize > 0) {      System.err.println("No more nodes can be created ...??");      System.exit(-1);    }    bddnodesize = bddnodesize << 1;        if (bddnodesize > oldsize + maxnodeincrease)      bddnodesize = oldsize + maxnodeincrease;       if (bddnodesize > bddmaxnodesize  &&  bddmaxnodesize > 0)      bddnodesize = bddmaxnodesize;    /*    if (resize_handler != NULL)      resize_handler(oldsize, bddnodesize);    */    newnodes = new BDDNode[bddnodesize];    // copy mess over     for (n = 0 ; n < oldsize ; n++) {      bdd_nodes[n].setHash(null); // Nulls now?      newnodes[n] = bdd_nodes[n];    }        bdd_nodes = newnodes;    next_node = new BDDNode(oldsize);    for (n = oldsize; n < bddnodesize - 1; n++)   {      bdd_nodes[n] = next_node;      next_node = new BDDNode(n+1);      bdd_nodes[n].setNext(next_node);    }    bdd_nodes[bddnodesize-1] = next_node;    bdd_nodes[bddnodesize-1].setNext(bddfreepos);    bddfreepos = bdd_nodes[oldsize];  }  void bdd_clrvarblocks() {    // System.err.println(" No bdd_clrvarblocks ");  }  public int getVar(BDDNode node) {      //System.out.println(" size  "+bddlevel2var.length+" level "+node.getLevel());    if (node.getLevel() > 0)       return bddlevel2var[node.getLevel()].getRoot();      else       return -1;  }  public String toString() {    StringBuffer sbuf = new StringBuffer();    for (int i = 0; i < bddnodesize; i++) {      sbuf.append(bdd_nodes[i]);      sbuf.append("\n");    }        // print caches    // print mapping tables?    return sbuf.toString();  }  public String toDot(BDDNode r) {    StringBuffer sbuf = new StringBuffer();        sbuf.append("digraph G {\n");    if (r.isZero() || !r.isConst()) {      sbuf.append("0 [shape=box, label=\"0\", ");      sbuf.append("style=filled, shape=box, height=0.3, width=0.3];\n");    }    if (r.isOne() || !r.isConst()) {      sbuf.append("1 [shape=box, label=\"1\", ");      sbuf.append("style=filled, shape=box, height=0.3, width=0.3];\n");    }    sbuf.append(r.toDot(bddlevel2var));    sbuf.append("}\n");    r.clearMark();        return sbuf.toString();  }           public static void main( String[] args ) {    int i;    BDD my_bdd = new BDD(10,100);    //BDD my_bdd = new BDD(30000,100000);    my_bdd.setVarNum(100);    //System.out.println("my_bdd\n"+my_bdd);    //BDDNode r[] = new BDDNode[10000];    //BDDNode a[] = new BDDNode[10000];    BDDNode b = my_bdd.bdd_ithvar(0);    BDDNode c = my_bdd.bdd_ithvar(1);    BDDNode a = my_bdd.bdd_ithvar(2);    BDDNode d = my_bdd.bdd_ithvar(3);    BDDNode e = my_bdd.bdd_ithvar(4);    BDDNode f = my_bdd.bdd_ithvar(5);        /*    for(i=0; i<10000; i++) {      //my_bdd.setVarNum(4+i);      a[i] = my_bdd.bdd_ithvar(i);    }    */    // add varblock ??    BDDNode tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;    tmp1 = my_bdd.bdd_not(b).incRefCount();    tmp2 = my_bdd.bdd_not(b).incRefCount();    tmp3 = my_bdd.bdd_not(tmp2).incRefCount();    tmp2.decRefCount();    tmp4 = my_bdd.bdd_apply(a,tmp1,AND).incRefCount();    tmp1.decRefCount();    tmp5 = my_bdd.bdd_apply(a,tmp3,AND).incRefCount();    tmp3.decRefCount();    tmp1 = my_bdd.bdd_apply(tmp4,c,OR).incRefCount();    tmp4.decRefCount();    tmp4 = my_bdd.bdd_apply(tmp1,c,OR).incRefCount();    tmp1.decRefCount();    tmp1 = my_bdd.bdd_apply(tmp4,c,OR).incRefCount();    tmp4.decRefCount();    d = my_bdd.bdd_apply(tmp1,tmp5,OR).incRefCount();    tmp1.decRefCount();    tmp5.decRefCount();    tmp1 = my_bdd.bdd_apply(a,b,XOR).incRefCount();    e = my_bdd.bdd_apply(tmp1,c,XOR).incRefCount();    tmp1.decRefCount();    tmp1 = my_bdd.bdd_apply(a,b,AND).incRefCount();    tmp2 = my_bdd.bdd_apply(b,c,AND).incRefCount();    f = my_bdd.bdd_apply(tmp1,tmp2,OR).incRefCount();    tmp1.decRefCount();    tmp2.decRefCount();    tmp1 = my_bdd.bdd_apply(a,c,AND).incRefCount();    f = my_bdd.bdd_apply(f,tmp1,OR).incRefCount();    tmp1.decRefCount();    System.out.println("sum a b c\n"+my_bdd.toDot(f));    System.out.println("carry a b c\n"+my_bdd.toDot(e));      /*      r[i] = my_bdd.bdd_apply(my_bdd.bdd_apply(my_bdd.bdd_apply(my_bdd.bdd_apply(my_bdd.bdd_apply(a[i],my_bdd.bdd_not(b),AND),c,OR),c,OR),c,OR),my_bdd.bdd_apply(a[i],my_bdd.bdd_not(my_bdd.bdd_not(b)),AND),OR).incRefCount();      */      //System.out.println(" r["+i+"] "+r[i].getRoot());    //r = my_bdd.bdd_apply(a,b,AND);        System.out.println("my_bdd\n"+my_bdd.toDot(d));        d = my_bdd.bdd_restrict(d,e);    System.out.println("my_bdd\n"+my_bdd.toDot(d));        d = a;    d = my_bdd.bdd_restrict(d,e);    System.out.println("my_bdd\n"+my_bdd.toDot(d));    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -