/************************************************************************* FILE: adder.cc DESCR: BDD implementation of an N bit adder. AUTH: Jorn Lind DATE: feb 1998 *************************************************************************/ #include #include #include #include #include "bddx.h" using namespace std; int N; bdd *ainp; bdd *binp; bdd *co; bdd *xout; /************************************************************************* Adder *************************************************************************/ void build_adder(void) { int n; for (n=0 ; n 0) { xout[n] = ainp[n] ^ binp[n] ^ co[n-1]; co[n] = ainp[n] & binp[n] | ainp[n] & co[n-1] | binp[n] & co[n-1]; } else { xout[n] = ainp[n] ^ binp[n]; co[n] = ainp[n] & binp[n]; } } } int main(int argc, char **argv) { using namespace std ; int method=BDD_REORDER_NONE; int n; if(argc < 2 || argc > 3) { cout << "usage: adder N R\n"; cout << " N number of bits\n"; cout << " R -> enable reordering if R is win2,win2ite,win3,win3ite,sift,siftite\n"; cout << " in this case 'adder' starts with a worst case ordering\n"; exit(1); } N = atoi(argv[1]); if (N <= 0) { cout << "The number of bits must be more than zero\n"; exit(2); } if (argc == 3) { if (strcmp(argv[2], "win2") == 0) method = BDD_REORDER_WIN2; else if (strcmp(argv[2], "win2ite") == 0) method = BDD_REORDER_WIN2ITE; else if (strcmp(argv[2], "win3") == 0) method = BDD_REORDER_WIN3; else if (strcmp(argv[2], "win3ite") == 0) method = BDD_REORDER_WIN3ITE; else if (strcmp(argv[2], "sift") == 0) method = BDD_REORDER_SIFT; else if (strcmp(argv[2], "siftite") == 0) method = BDD_REORDER_SIFTITE; else if (strcmp(argv[2], "rand") == 0) method = BDD_REORDER_RANDOM; } bdd_init(500,1000); bdd_setvarnum(2*N); ainp = new bdd[N]; binp = new bdd[N]; co = new bdd[N]; xout = new bdd[N]; for (n=0 ; n> 1; } return x; } int test_vector(bdd av, bdd bv, int a, int b) { int res = a+b; for (int n=0 ; n> 1; } return 1; } int test_adder(void) { int m = 1 << N; for (int a=0 ; a