{
int i,j;
int l,p1,p2;
int candidate;
int max_p2_lev;
for(i=0;i<65536;i++){
db[i].level=LEVEL_ALOT;
}
n_fun=0;
db[0].level=0;
db[0].op_type=OP_FALSE;
n_fun++;
db[65535].level=0;
db[65535].op_type=OP_TRUE;
n_fun++;
db[BINARY(0,0,0,0, 0,0,0,0, 1,1,1,1, 1,1,1,1)].level=0;
db[BINARY(0,0,0,0, 0,0,0,0, 1,1,1,1, 1,1,1,1)].op_type=OP_SRC;
db[BINARY(0,0,0,0, 0,0,0,0, 1,1,1,1, 1,1,1,1)].op1=SRC_A;
n_fun++;
db[BINARY(0,0,0,0, 1,1,1,1, 0,0,0,0, 1,1,1,1)].level=0;
db[BINARY(0,0,0,0, 1,1,1,1, 0,0,0,0, 1,1,1,1)].op_type=OP_SRC;
db[BINARY(0,0,0,0, 1,1,1,1, 0,0,0,0, 1,1,1,1)].op1=SRC_B;
n_fun++;
db[BINARY(0,0,1,1, 0,0,1,1, 0,0,1,1, 0,0,1,1)].level=0;
db[BINARY(0,0,1,1, 0,0,1,1, 0,0,1,1, 0,0,1,1)].op_type=OP_SRC;
db[BINARY(0,0,1,1, 0,0,1,1, 0,0,1,1, 0,0,1,1)].op1=SRC_C;
n_fun++;
db[BINARY(0,1,0,1, 0,1,0,1, 0,1,0,1, 0,1,0,1)].level=0;
db[BINARY(0,1,0,1, 0,1,0,1, 0,1,0,1, 0,1,0,1)].op_type=OP_SRC;
db[BINARY(0,1,0,1, 0,1,0,1, 0,1,0,1, 0,1,0,1)].op1=SRC_D;
n_fun++;
#ifdef NEGATEDTOO
db[BINARY(1,1,1,1, 1,1,1,1, 0,0,0,0, 0,0,0,0)].level=0;
db[BINARY(1,1,1,1, 1,1,1,1, 0,0,0,0, 0,0,0,0)].op_type=OP_SRC;
db[BINARY(1,1,1,1, 1,1,1,1, 0,0,0,0, 0,0,0,0)].op1=SRC_AN;
n_fun++;
db[BINARY(1,1,1,1, 0,0,0,0, 1,1,1,1, 0,0,0,0)].level=0;
db[BINARY(1,1,1,1, 0,0,0,0, 1,1,1,1, 0,0,0,0)].op_type=OP_SRC;
db[BINARY(1,1,1,1, 0,0,0,0, 1,1,1,1, 0,0,0,0)].op1=SRC_BN;
n_fun++;
db[BINARY(1,1,0,0, 1,1,0,0, 1,1,0,0, 1,1,0,0)].level=0;
db[BINARY(1,1,0,0, 1,1,0,0, 1,1,0,0, 1,1,0,0)].op_type=OP_SRC;
db[BINARY(1,1,0,0, 1,1,0,0, 1,1,0,0, 1,1,0,0)].op1=SRC_CN;
n_fun++;
db[BINARY(1,0,1,0, 1,0,1,0, 1,0,1,0, 1,0,1,0)].level=0;
db[BINARY(1,0,1,0, 1,0,1,0, 1,0,1,0, 1,0,1,0)].op_type=OP_SRC;
db[BINARY(1,0,1,0, 1,0,1,0, 1,0,1,0, 1,0,1,0)].op1=SRC_DN;
n_fun++;
#endif
for(l=0;l<100;l++){
printf("calculating level %i\n",l);
for(p1=1;p1<65536;p1++){
if(db[p1].level==LEVEL_ALOT) continue;
max_p2_lev=l-db[p1].level-1;
for(p2=p1+1;p2<65536;p2++){
if(db[p2].level>max_p2_lev) continue;
candidate=p1&p2;
if(db[candidate].level==LEVEL_ALOT){
db[candidate].level=db[p1].level+db[p2].level+1;
db[candidate].op_type=OP_AND;
db[candidate].op1=p1;
db[candidate].op2=p2;
n_fun++;
}
candidate=p1|p2;
if(db[candidate].level==LEVEL_ALOT){
db[candidate].level=db[p1].level+db[p2].level+1;
db[candidate].op_type=OP_OR;
db[candidate].op1=p1;
db[candidate].op2=p2;
n_fun++;
}
candidate=p1^p2;
if(db[candidate].level==LEVEL_ALOT){
db[candidate].level=db[p1].level+db[p2].level+1;
db[candidate].op_type=OP_XOR;
db[candidate].op1=p1;
db[candidate].op2=p2;
n_fun++;
}
}
}
printf("num fun=%i\n\n",n_fun);
fflush(stdout);
if(n_fun>=65536) break;
}
for(i=0;i<65536;i++){
if(db[i].level==LEVEL_ALOT) continue;
printf("PREFIX ");
for(j=15;j>=0;j--){
printf("%i",i&(1<<j)?1:0);
if(j%4==0) printf(" ");
if(j%8==0) printf(" ");
}
printf(" : lev %2i: ",db[i].level);
dump_element_prefix(i);
printf("\n");
printf("INFIX ");
for(j=15;j>=0;j--){
printf("%i",i&(1<<j)?1:0);
if(j%4==0) printf(" ");
if(j%8==0) printf(" ");
}
printf(" : lev %2i: ",db[i].level);
dump_element_infix(i);
printf("\n");
}
return 0;
}