SASC-NG
DVBSoftCAM

logic.c

Go to the documentation of this file.
00001 /* logic -- synthetize logic functions with 4 inputs
00002  *
00003  * Copyright (C) 2003-2004  fatih89r
00004  *
00005  * This program is free software; you can redistribute it and/or modify
00006  * it under the terms of the GNU General Public License as published by
00007  * the Free Software Foundation; either version 2 of the License, or
00008  * (at your option) any later version.
00009  *
00010  * This program is distributed in the hope that it will be useful,
00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013  * GNU General Public License for more details.
00014  *
00015  * You should have received a copy of the GNU General Public License
00016  * along with this program; if not, write to the Free Software
00017  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00018  */
00019 
00020 
00021 
00022 
00023 /* Can we use negated inputs? */
00024 #define noNEGATEDTOO
00025 
00026 
00027 #include <stdio.h>
00028 
00029 
00030 /*
00031  * abcd
00032  */
00033 
00034 #define BINARY(b15,b14,b13,b12,b11,b10,b9,b8,b7,b6,b5,b4,b3,b2,b1,b0) \
00035   ((b15)<<15)|((b14)<<14)|((b13)<<13)|((b12)<<12)| \
00036   ((b11)<<11)|((b10)<<10)|((b9) << 9)|((b8) << 8)| \
00037   ((b7) << 7)|((b6) << 6)|((b5) << 5)|((b4) << 4)| \
00038   ((b3) << 3)|((b2) << 2)|((b1) << 1)|((b0) << 0)
00039 
00040 struct fun{
00041   int level;
00042   int op_type;
00043   int op1;
00044   int op2;
00045 };
00046 
00047 struct fun db[65536];
00048 int n_fun;
00049 
00050 #define LEVEL_ALOT 1000000
00051 
00052 #define OP_FALSE 0
00053 #define OP_TRUE  1
00054 #define OP_SRC   2
00055 #define OP_AND   3
00056 #define OP_OR    4
00057 #define OP_XOR   5
00058 
00059 #define SRC_A 10
00060 #define SRC_B 20
00061 #define SRC_C 30
00062 #define SRC_D 40
00063 #define SRC_AN 11
00064 #define SRC_BN 21
00065 #define SRC_CN 31
00066 #define SRC_DN 41
00067 
00068 void dump_element_prefix(int);
00069 void dump_element_infix(int);
00070 
00071 int main(void){
00072   int i,j;
00073   int l,p1,p2;
00074   int candidate;
00075   int max_p2_lev;
00076   
00077   for(i=0;i<65536;i++){
00078     db[i].level=LEVEL_ALOT;
00079   }
00080   n_fun=0;
00081 
00082   db[0].level=0;
00083   db[0].op_type=OP_FALSE;
00084   n_fun++;
00085 
00086   db[65535].level=0;
00087   db[65535].op_type=OP_TRUE;
00088   n_fun++;
00089 
00090   db[BINARY(0,0,0,0, 0,0,0,0,  1,1,1,1, 1,1,1,1)].level=0;
00091   db[BINARY(0,0,0,0, 0,0,0,0,  1,1,1,1, 1,1,1,1)].op_type=OP_SRC;
00092   db[BINARY(0,0,0,0, 0,0,0,0,  1,1,1,1, 1,1,1,1)].op1=SRC_A;
00093   n_fun++;
00094 
00095   db[BINARY(0,0,0,0, 1,1,1,1,  0,0,0,0, 1,1,1,1)].level=0;
00096   db[BINARY(0,0,0,0, 1,1,1,1,  0,0,0,0, 1,1,1,1)].op_type=OP_SRC;
00097   db[BINARY(0,0,0,0, 1,1,1,1,  0,0,0,0, 1,1,1,1)].op1=SRC_B;
00098   n_fun++;
00099 
00100   db[BINARY(0,0,1,1, 0,0,1,1,  0,0,1,1, 0,0,1,1)].level=0;
00101   db[BINARY(0,0,1,1, 0,0,1,1,  0,0,1,1, 0,0,1,1)].op_type=OP_SRC;
00102   db[BINARY(0,0,1,1, 0,0,1,1,  0,0,1,1, 0,0,1,1)].op1=SRC_C;
00103   n_fun++;
00104 
00105   db[BINARY(0,1,0,1, 0,1,0,1,  0,1,0,1, 0,1,0,1)].level=0;
00106   db[BINARY(0,1,0,1, 0,1,0,1,  0,1,0,1, 0,1,0,1)].op_type=OP_SRC;
00107   db[BINARY(0,1,0,1, 0,1,0,1,  0,1,0,1, 0,1,0,1)].op1=SRC_D;
00108   n_fun++;
00109 #ifdef NEGATEDTOO
00110   db[BINARY(1,1,1,1, 1,1,1,1,  0,0,0,0, 0,0,0,0)].level=0;
00111   db[BINARY(1,1,1,1, 1,1,1,1,  0,0,0,0, 0,0,0,0)].op_type=OP_SRC;
00112   db[BINARY(1,1,1,1, 1,1,1,1,  0,0,0,0, 0,0,0,0)].op1=SRC_AN;
00113   n_fun++;
00114 
00115   db[BINARY(1,1,1,1, 0,0,0,0,  1,1,1,1, 0,0,0,0)].level=0;
00116   db[BINARY(1,1,1,1, 0,0,0,0,  1,1,1,1, 0,0,0,0)].op_type=OP_SRC;
00117   db[BINARY(1,1,1,1, 0,0,0,0,  1,1,1,1, 0,0,0,0)].op1=SRC_BN;
00118   n_fun++;
00119 
00120   db[BINARY(1,1,0,0, 1,1,0,0,  1,1,0,0, 1,1,0,0)].level=0;
00121   db[BINARY(1,1,0,0, 1,1,0,0,  1,1,0,0, 1,1,0,0)].op_type=OP_SRC;
00122   db[BINARY(1,1,0,0, 1,1,0,0,  1,1,0,0, 1,1,0,0)].op1=SRC_CN;
00123   n_fun++;
00124 
00125   db[BINARY(1,0,1,0, 1,0,1,0,  1,0,1,0, 1,0,1,0)].level=0;
00126   db[BINARY(1,0,1,0, 1,0,1,0,  1,0,1,0, 1,0,1,0)].op_type=OP_SRC;
00127   db[BINARY(1,0,1,0, 1,0,1,0,  1,0,1,0, 1,0,1,0)].op1=SRC_DN;
00128   n_fun++;
00129 #endif
00130 
00131   for(l=0;l<100;l++){
00132     printf("calculating level %i\n",l);
00133     for(p1=1;p1<65536;p1++){
00134       if(db[p1].level==LEVEL_ALOT) continue;
00135       max_p2_lev=l-db[p1].level-1;
00136       for(p2=p1+1;p2<65536;p2++){
00137         if(db[p2].level>max_p2_lev) continue;
00138 
00139         candidate=p1&p2;
00140         if(db[candidate].level==LEVEL_ALOT){
00141           //found new
00142           db[candidate].level=db[p1].level+db[p2].level+1;
00143           db[candidate].op_type=OP_AND;
00144           db[candidate].op1=p1;
00145           db[candidate].op2=p2;
00146           n_fun++;
00147         }
00148 
00149         candidate=p1|p2;
00150         if(db[candidate].level==LEVEL_ALOT){
00151           //found new
00152           db[candidate].level=db[p1].level+db[p2].level+1;
00153           db[candidate].op_type=OP_OR;
00154           db[candidate].op1=p1;
00155           db[candidate].op2=p2;
00156           n_fun++;
00157         }
00158 
00159         candidate=p1^p2;
00160         if(db[candidate].level==LEVEL_ALOT){
00161           //found new
00162           db[candidate].level=db[p1].level+db[p2].level+1;
00163           db[candidate].op_type=OP_XOR;
00164           db[candidate].op1=p1;
00165           db[candidate].op2=p2;
00166           n_fun++;
00167         }
00168 
00169       }
00170     }
00171     printf("num fun=%i\n\n",n_fun);
00172     fflush(stdout);
00173     if(n_fun>=65536) break;
00174   }
00175 
00176 
00177   for(i=0;i<65536;i++){
00178     if(db[i].level==LEVEL_ALOT) continue;
00179 
00180     printf("PREFIX ");
00181     for(j=15;j>=0;j--){
00182       printf("%i",i&(1<<j)?1:0);
00183       if(j%4==0) printf(" ");
00184       if(j%8==0) printf(" ");
00185     }
00186     printf(" : lev %2i: ",db[i].level);
00187     dump_element_prefix(i);
00188     printf("\n");
00189 
00190     printf("INFIX  ");
00191     for(j=15;j>=0;j--){
00192       printf("%i",i&(1<<j)?1:0);
00193       if(j%4==0) printf(" ");
00194       if(j%8==0) printf(" ");
00195     }
00196     printf(" : lev %2i: ",db[i].level);
00197     dump_element_infix(i);
00198     printf("\n");
00199   }
00200   
00201   return 0;
00202 }
00203 
00204 void dump_element_prefix(int e){
00205   if(db[e].level==LEVEL_ALOT){
00206     printf("PANIC!\n");
00207     return;
00208   };
00209   switch(db[e].op_type){
00210   case OP_FALSE:
00211     printf("0");
00212     break;
00213   case OP_TRUE:
00214     printf("1");
00215     break;
00216   case OP_SRC:
00217     switch(db[e].op1){
00218     case SRC_A:
00219       printf("a");
00220       break;
00221     case SRC_B:
00222       printf("b");
00223       break;
00224     case SRC_C:
00225       printf("c");
00226       break;
00227     case SRC_D:
00228       printf("d");
00229       break;
00230     case SRC_AN:
00231       printf("an");
00232       break;
00233     case SRC_BN:
00234       printf("bn");
00235       break;
00236     case SRC_CN:
00237       printf("cn");
00238       break;
00239     case SRC_DN:
00240       printf("dn");
00241       break;
00242     }
00243     break;
00244   case OP_AND:
00245     printf("FFAND(");
00246     dump_element_prefix(db[e].op1);
00247     printf(",");
00248     dump_element_prefix(db[e].op2);
00249     printf(")");
00250     break;
00251   case OP_OR:
00252     printf("FFOR(");
00253     dump_element_prefix(db[e].op1);
00254     printf(",");
00255     dump_element_prefix(db[e].op2);
00256     printf(")");
00257     break;
00258   case OP_XOR:
00259     printf("FFXOR(");
00260     dump_element_prefix(db[e].op1);
00261     printf(",");
00262     dump_element_prefix(db[e].op2);
00263     printf(")");
00264     break;
00265   }
00266 }
00267 
00268 void dump_element_infix(int e){
00269   if(db[e].level==LEVEL_ALOT){
00270     printf("PANIC!\n");
00271     return;
00272   };
00273   switch(db[e].op_type){
00274   case OP_FALSE:
00275     printf("0");
00276     break;
00277   case OP_TRUE:
00278     printf("1");
00279     break;
00280   case OP_SRC:
00281     switch(db[e].op1){
00282     case SRC_A:
00283       printf("a");
00284       break;
00285     case SRC_B:
00286       printf("b");
00287       break;
00288     case SRC_C:
00289       printf("c");
00290       break;
00291     case SRC_D:
00292       printf("d");
00293       break;
00294     case SRC_AN:
00295       printf("an");
00296       break;
00297     case SRC_BN:
00298       printf("bn");
00299       break;
00300     case SRC_CN:
00301       printf("cn");
00302       break;
00303     case SRC_DN:
00304       printf("dn");
00305       break;
00306     }
00307     break;
00308   case OP_AND:
00309     printf("( ");
00310     dump_element_infix(db[e].op1);
00311     printf("&");
00312     dump_element_infix(db[e].op2);
00313     printf(" )");
00314     break;
00315   case OP_OR:
00316     printf("( ");
00317     dump_element_infix(db[e].op1);
00318     printf("|");
00319     dump_element_infix(db[e].op2);
00320     printf(" )");
00321     break;
00322   case OP_XOR:
00323     printf("( ");
00324     dump_element_infix(db[e].op1);
00325     printf("^");
00326     dump_element_infix(db[e].op2);
00327     printf(" )");
00328     break;
00329   }
00330 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines