/**CFile**************************************************************** FileName [acecSt.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [CEC for arithmetic circuits.] Synopsis [Core procedures.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - June 20, 2005.] Revision [$Id: acecSt.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] ***********************************************************************/ #include "acecInt.h" #include "misc/vec/vecWec.h" #include "misc/extra/extra.h" #include "aig/aig/aig.h" #include "opt/dar/dar.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// int Npn3Table[256][2] = { {0x00, 0}, // 0x00 = 0 {0x01, 1}, // 0x01 = 1 {0x01, 1}, // 0x02 = 2 {0x03, 2}, // 0x03 = 3 {0x01, 1}, // 0x04 = 4 {0x03, 2}, // 0x05 = 5 {0x06, 3}, // 0x06 = 6 {0x07, 4}, // 0x07 = 7 {0x01, 1}, // 0x08 = 8 {0x06, 3}, // 0x09 = 9 {0x03, 2}, // 0x0A = 10 {0x07, 4}, // 0x0B = 11 {0x03, 2}, // 0x0C = 12 {0x07, 4}, // 0x0D = 13 {0x07, 4}, // 0x0E = 14 {0x0F, 5}, // 0x0F = 15 {0x01, 1}, // 0x10 = 16 {0x03, 2}, // 0x11 = 17 {0x06, 3}, // 0x12 = 18 {0x07, 4}, // 0x13 = 19 {0x06, 3}, // 0x14 = 20 {0x07, 4}, // 0x15 = 21 {0x16, 6}, // 0x16 = 22 {0x17, 7}, // 0x17 = 23 {0x18, 8}, // 0x18 = 24 {0x19, 9}, // 0x19 = 25 {0x19, 9}, // 0x1A = 26 {0x1B, 10}, // 0x1B = 27 {0x19, 9}, // 0x1C = 28 {0x1B, 10}, // 0x1D = 29 {0x1E, 11}, // 0x1E = 30 {0x07, 4}, // 0x1F = 31 {0x01, 1}, // 0x20 = 32 {0x06, 3}, // 0x21 = 33 {0x03, 2}, // 0x22 = 34 {0x07, 4}, // 0x23 = 35 {0x18, 8}, // 0x24 = 36 {0x19, 9}, // 0x25 = 37 {0x19, 9}, // 0x26 = 38 {0x1B, 10}, // 0x27 = 39 {0x06, 3}, // 0x28 = 40 {0x16, 6}, // 0x29 = 41 {0x07, 4}, // 0x2A = 42 {0x17, 7}, // 0x2B = 43 {0x19, 9}, // 0x2C = 44 {0x1E, 11}, // 0x2D = 45 {0x1B, 10}, // 0x2E = 46 {0x07, 4}, // 0x2F = 47 {0x03, 2}, // 0x30 = 48 {0x07, 4}, // 0x31 = 49 {0x07, 4}, // 0x32 = 50 {0x0F, 5}, // 0x33 = 51 {0x19, 9}, // 0x34 = 52 {0x1B, 10}, // 0x35 = 53 {0x1E, 11}, // 0x36 = 54 {0x07, 4}, // 0x37 = 55 {0x19, 9}, // 0x38 = 56 {0x1E, 11}, // 0x39 = 57 {0x1B, 10}, // 0x3A = 58 {0x07, 4}, // 0x3B = 59 {0x3C, 12}, // 0x3C = 60 {0x19, 9}, // 0x3D = 61 {0x19, 9}, // 0x3E = 62 {0x03, 2}, // 0x3F = 63 {0x01, 1}, // 0x40 = 64 {0x06, 3}, // 0x41 = 65 {0x18, 8}, // 0x42 = 66 {0x19, 9}, // 0x43 = 67 {0x03, 2}, // 0x44 = 68 {0x07, 4}, // 0x45 = 69 {0x19, 9}, // 0x46 = 70 {0x1B, 10}, // 0x47 = 71 {0x06, 3}, // 0x48 = 72 {0x16, 6}, // 0x49 = 73 {0x19, 9}, // 0x4A = 74 {0x1E, 11}, // 0x4B = 75 {0x07, 4}, // 0x4C = 76 {0x17, 7}, // 0x4D = 77 {0x1B, 10}, // 0x4E = 78 {0x07, 4}, // 0x4F = 79 {0x03, 2}, // 0x50 = 80 {0x07, 4}, // 0x51 = 81 {0x19, 9}, // 0x52 = 82 {0x1B, 10}, // 0x53 = 83 {0x07, 4}, // 0x54 = 84 {0x0F, 5}, // 0x55 = 85 {0x1E, 11}, // 0x56 = 86 {0x07, 4}, // 0x57 = 87 {0x19, 9}, // 0x58 = 88 {0x1E, 11}, // 0x59 = 89 {0x3C, 12}, // 0x5A = 90 {0x19, 9}, // 0x5B = 91 {0x1B, 10}, // 0x5C = 92 {0x07, 4}, // 0x5D = 93 {0x19, 9}, // 0x5E = 94 {0x03, 2}, // 0x5F = 95 {0x06, 3}, // 0x60 = 96 {0x16, 6}, // 0x61 = 97 {0x19, 9}, // 0x62 = 98 {0x1E, 11}, // 0x63 = 99 {0x19, 9}, // 0x64 = 100 {0x1E, 11}, // 0x65 = 101 {0x3C, 12}, // 0x66 = 102 {0x19, 9}, // 0x67 = 103 {0x16, 6}, // 0x68 = 104 {0x69, 13}, // 0x69 = 105 {0x1E, 11}, // 0x6A = 106 {0x16, 6}, // 0x6B = 107 {0x1E, 11}, // 0x6C = 108 {0x16, 6}, // 0x6D = 109 {0x19, 9}, // 0x6E = 110 {0x06, 3}, // 0x6F = 111 {0x07, 4}, // 0x70 = 112 {0x17, 7}, // 0x71 = 113 {0x1B, 10}, // 0x72 = 114 {0x07, 4}, // 0x73 = 115 {0x1B, 10}, // 0x74 = 116 {0x07, 4}, // 0x75 = 117 {0x19, 9}, // 0x76 = 118 {0x03, 2}, // 0x77 = 119 {0x1E, 11}, // 0x78 = 120 {0x16, 6}, // 0x79 = 121 {0x19, 9}, // 0x7A = 122 {0x06, 3}, // 0x7B = 123 {0x19, 9}, // 0x7C = 124 {0x06, 3}, // 0x7D = 125 {0x18, 8}, // 0x7E = 126 {0x01, 1}, // 0x7F = 127 {0x01, 1}, // 0x80 = 128 {0x18, 8}, // 0x81 = 129 {0x06, 3}, // 0x82 = 130 {0x19, 9}, // 0x83 = 131 {0x06, 3}, // 0x84 = 132 {0x19, 9}, // 0x85 = 133 {0x16, 6}, // 0x86 = 134 {0x1E, 11}, // 0x87 = 135 {0x03, 2}, // 0x88 = 136 {0x19, 9}, // 0x89 = 137 {0x07, 4}, // 0x8A = 138 {0x1B, 10}, // 0x8B = 139 {0x07, 4}, // 0x8C = 140 {0x1B, 10}, // 0x8D = 141 {0x17, 7}, // 0x8E = 142 {0x07, 4}, // 0x8F = 143 {0x06, 3}, // 0x90 = 144 {0x19, 9}, // 0x91 = 145 {0x16, 6}, // 0x92 = 146 {0x1E, 11}, // 0x93 = 147 {0x16, 6}, // 0x94 = 148 {0x1E, 11}, // 0x95 = 149 {0x69, 13}, // 0x96 = 150 {0x16, 6}, // 0x97 = 151 {0x19, 9}, // 0x98 = 152 {0x3C, 12}, // 0x99 = 153 {0x1E, 11}, // 0x9A = 154 {0x19, 9}, // 0x9B = 155 {0x1E, 11}, // 0x9C = 156 {0x19, 9}, // 0x9D = 157 {0x16, 6}, // 0x9E = 158 {0x06, 3}, // 0x9F = 159 {0x03, 2}, // 0xA0 = 160 {0x19, 9}, // 0xA1 = 161 {0x07, 4}, // 0xA2 = 162 {0x1B, 10}, // 0xA3 = 163 {0x19, 9}, // 0xA4 = 164 {0x3C, 12}, // 0xA5 = 165 {0x1E, 11}, // 0xA6 = 166 {0x19, 9}, // 0xA7 = 167 {0x07, 4}, // 0xA8 = 168 {0x1E, 11}, // 0xA9 = 169 {0x0F, 5}, // 0xAA = 170 {0x07, 4}, // 0xAB = 171 {0x1B, 10}, // 0xAC = 172 {0x19, 9}, // 0xAD = 173 {0x07, 4}, // 0xAE = 174 {0x03, 2}, // 0xAF = 175 {0x07, 4}, // 0xB0 = 176 {0x1B, 10}, // 0xB1 = 177 {0x17, 7}, // 0xB2 = 178 {0x07, 4}, // 0xB3 = 179 {0x1E, 11}, // 0xB4 = 180 {0x19, 9}, // 0xB5 = 181 {0x16, 6}, // 0xB6 = 182 {0x06, 3}, // 0xB7 = 183 {0x1B, 10}, // 0xB8 = 184 {0x19, 9}, // 0xB9 = 185 {0x07, 4}, // 0xBA = 186 {0x03, 2}, // 0xBB = 187 {0x19, 9}, // 0xBC = 188 {0x18, 8}, // 0xBD = 189 {0x06, 3}, // 0xBE = 190 {0x01, 1}, // 0xBF = 191 {0x03, 2}, // 0xC0 = 192 {0x19, 9}, // 0xC1 = 193 {0x19, 9}, // 0xC2 = 194 {0x3C, 12}, // 0xC3 = 195 {0x07, 4}, // 0xC4 = 196 {0x1B, 10}, // 0xC5 = 197 {0x1E, 11}, // 0xC6 = 198 {0x19, 9}, // 0xC7 = 199 {0x07, 4}, // 0xC8 = 200 {0x1E, 11}, // 0xC9 = 201 {0x1B, 10}, // 0xCA = 202 {0x19, 9}, // 0xCB = 203 {0x0F, 5}, // 0xCC = 204 {0x07, 4}, // 0xCD = 205 {0x07, 4}, // 0xCE = 206 {0x03, 2}, // 0xCF = 207 {0x07, 4}, // 0xD0 = 208 {0x1B, 10}, // 0xD1 = 209 {0x1E, 11}, // 0xD2 = 210 {0x19, 9}, // 0xD3 = 211 {0x17, 7}, // 0xD4 = 212 {0x07, 4}, // 0xD5 = 213 {0x16, 6}, // 0xD6 = 214 {0x06, 3}, // 0xD7 = 215 {0x1B, 10}, // 0xD8 = 216 {0x19, 9}, // 0xD9 = 217 {0x19, 9}, // 0xDA = 218 {0x18, 8}, // 0xDB = 219 {0x07, 4}, // 0xDC = 220 {0x03, 2}, // 0xDD = 221 {0x06, 3}, // 0xDE = 222 {0x01, 1}, // 0xDF = 223 {0x07, 4}, // 0xE0 = 224 {0x1E, 11}, // 0xE1 = 225 {0x1B, 10}, // 0xE2 = 226 {0x19, 9}, // 0xE3 = 227 {0x1B, 10}, // 0xE4 = 228 {0x19, 9}, // 0xE5 = 229 {0x19, 9}, // 0xE6 = 230 {0x18, 8}, // 0xE7 = 231 {0x17, 7}, // 0xE8 = 232 {0x16, 6}, // 0xE9 = 233 {0x07, 4}, // 0xEA = 234 {0x06, 3}, // 0xEB = 235 {0x07, 4}, // 0xEC = 236 {0x06, 3}, // 0xED = 237 {0x03, 2}, // 0xEE = 238 {0x01, 1}, // 0xEF = 239 {0x0F, 5}, // 0xF0 = 240 {0x07, 4}, // 0xF1 = 241 {0x07, 4}, // 0xF2 = 242 {0x03, 2}, // 0xF3 = 243 {0x07, 4}, // 0xF4 = 244 {0x03, 2}, // 0xF5 = 245 {0x06, 3}, // 0xF6 = 246 {0x01, 1}, // 0xF7 = 247 {0x07, 4}, // 0xF8 = 248 {0x06, 3}, // 0xF9 = 249 {0x03, 2}, // 0xFA = 250 {0x01, 1}, // 0xFB = 251 {0x03, 2}, // 0xFC = 252 {0x01, 1}, // 0xFD = 253 {0x01, 1}, // 0xFE = 254 {0x00, 0} // 0xFF = 255 }; //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [Collect non-XOR inputs.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Acec_GenerateNpnTable() { int Table[256], Classes[16], Map[256]; int i, k, nClasses = 0; for ( i = 0; i < 256; i++ ) Table[i] = Extra_TruthCanonNPN( i, 3 ); for ( i = 0; i < 256; i++ ) { printf( "{" ); Extra_PrintHex( stdout, (unsigned *)&Table[i], 3 ); printf( ", " ); // find the class for ( k = 0; k < nClasses; k++ ) if ( Table[i] == Classes[k] ) break; if ( k == nClasses ) Classes[nClasses++] = Table[i]; Map[i] = k; // print printf( "%2d}, // ", k ); Extra_PrintHex( stdout, (unsigned *)&i, 3 ); printf( " = %3d\n", i ); } } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Acec_StatsCollect( Gia_Man_t * p, int fVerbose ) { extern int Dar_LibReturnClass( unsigned uTruth ); extern char ** Kit_DsdNpn4ClassNames(); char ** pNames = Kit_DsdNpn4ClassNames(); int Map[256] = {0}; Vec_Wrd_t * vTruths = Vec_WrdStart( Gia_ManObjNum(p) ); Vec_Wrd_t * vTemp = Vec_WrdStart( Gia_ManObjNum(p) ); word Truth, TruthF; int iTruth, iTruthF; int iFan, iLut, i, k, Class; assert( Gia_ManHasMapping(p) ); assert( Gia_ManLutSizeMax(p) < 4 ); // collect truth tables Gia_ManForEachLut( p, iLut ) { Truth = Gia_ObjComputeTruthTable6Lut( p, iLut, vTemp ); Vec_WrdWriteEntry( vTruths, iLut, Truth ); } Vec_WrdFree( vTemp ); // collect pairs Gia_ManForEachLut( p, iLut ) { Truth = Vec_WrdEntry( vTruths, iLut ) & 0xFF; iTruth = Npn3Table[Truth][1]; assert( iTruth < 15 ); Gia_LutForEachFanin( p, iLut, iFan, k ) { TruthF = Vec_WrdEntry( vTruths, iFan ) & 0xFF; iTruthF = Npn3Table[TruthF][1]; assert( iTruthF < 15 ); Map[(iTruthF << 4) + iTruth]++; } } Gia_ManForEachCoDriverId( p, iFan, k ) { TruthF = Vec_WrdEntry( vTruths, iFan ); iTruthF = Npn3Table[TruthF & 0xFF][1]; assert( iTruthF < 15 ); Map[(iTruthF << 4)]++; } Vec_WrdFree( vTruths ); // print statistics printf( "fi / fo" ); for ( i = 0; i < 14; i++ ) printf( "%6d ", i ); printf( "\n" ); for ( i = 0; i < 14; i++ ) { printf( "%6d ", i ); for ( k = 0; k < 14; k++ ) if ( Map[(i << 4) | k] ) printf( "%6d ", Map[(i << 4) | k] ); else printf( "%6s ", "." ); printf( "\n" ); } // print class formulas printf( "\nClasses:\n" ); for ( i = 0; i < 14; i++ ) { for ( k = 0; k < 256; k++ ) if ( Npn3Table[k][1] == i ) break; assert( k < 256 ); Class = Dar_LibReturnClass( (Npn3Table[k][0] << 8) | Npn3Table[k][0] ); printf( "%2d : %s\n", i, pNames[Class] ); } } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END