|
SASC
DVBSoftCAM
|
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 }