abcIfMux.c 10.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
/**CFile****************************************************************

  FileName    [abcIf.c]

  SystemName  [ABC: Logic synthesis and verification system.]

  PackageName [Network and node package.]

  Synopsis    [Interface with the FPGA mapping package.]

  Author      [Alan Mishchenko]
  
  Affiliation [UC Berkeley]

  Date        [Ver. 1.0. Started - November 21, 2006.]

  Revision    [$Id: abcIf.c,v 1.00 2006/11/21 00:00:00 alanmi Exp $]

***********************************************************************/

21 22
#include "base/abc/abc.h"
#include "map/if/if.h"
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422

ABC_NAMESPACE_IMPL_START


////////////////////////////////////////////////////////////////////////
///                        DECLARATIONS                              ///
////////////////////////////////////////////////////////////////////////
 
////////////////////////////////////////////////////////////////////////
///                     FUNCTION DEFINITIONS                         ///
////////////////////////////////////////////////////////////////////////

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
static inline int Abc_NtkFuncCof0( int t, int v )
{
    static int s_Truth[3] = { 0xAA, 0xCC, 0xF0 };
    return 0xff & ((t & ~s_Truth[v]) | ((t & ~s_Truth[v]) << (1<<v)));
}

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
static inline int Abc_NtkFuncCof1( int t, int v )
{
    static int s_Truth[3] = { 0xAA, 0xCC, 0xF0 };
    return 0xff & ((t &  s_Truth[v]) | ((t &  s_Truth[v]) >> (1<<v)));
}

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
static inline int Abc_NtkFuncHasVar( int t, int v )
{
    static int s_Truth[3] = { 0xAA, 0xCC, 0xF0 };
    return ((t & s_Truth[v]) >> (1<<v)) != (t & ~s_Truth[v]);
}

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
static inline int Abc_NtkFuncSuppSize( int t )
{
    return Abc_NtkFuncHasVar(t, 0) + Abc_NtkFuncHasVar(t, 1) + Abc_NtkFuncHasVar(t, 2);
}

/**Function*************************************************************

  Synopsis    [Precomputes MUXes and functions of less than 3 inputs.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
void Abc_NtkCutCostMuxPrecompute()
{
    int i, Value;
    int CounterM = 0;
    for ( i = 0; i < 256; i++ )
    {
        Value = 0;
        if ( Abc_NtkFuncSuppSize( i ) < 3 )
            Value = 1;
        else
        {
            if ( (Abc_NtkFuncSuppSize(Abc_NtkFuncCof0(i,0)) == 1 && Abc_NtkFuncSuppSize(Abc_NtkFuncCof1(i,0)) == 1) ||
                 (Abc_NtkFuncSuppSize(Abc_NtkFuncCof0(i,1)) == 1 && Abc_NtkFuncSuppSize(Abc_NtkFuncCof1(i,1)) == 1) ||
                 (Abc_NtkFuncSuppSize(Abc_NtkFuncCof0(i,2)) == 1 && Abc_NtkFuncSuppSize(Abc_NtkFuncCof1(i,2)) == 1) )
            {
                 Value = 1;
                 CounterM++;
            }
        }
        printf( "%d, // %3d  0x%02X\n", Value, i, i );
    }
    printf( "Total number of MUXes = %d.\n", CounterM );
}

/**Function*************************************************************

  Synopsis    [Procedure returning the cost of the cut.]

  Description [The number of MUXes needed to implement the function.]
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
int Abc_NtkCutCostMux( If_Cut_t * pCut )
{    
    static char uLookup[256] = {
        1, //   0  0x00
        0, //   1  0x01
        0, //   2  0x02
        1, //   3  0x03
        0, //   4  0x04
        1, //   5  0x05
        0, //   6  0x06
        0, //   7  0x07
        0, //   8  0x08
        0, //   9  0x09
        1, //  10  0x0A
        0, //  11  0x0B
        1, //  12  0x0C
        0, //  13  0x0D
        0, //  14  0x0E
        1, //  15  0x0F
        0, //  16  0x10
        1, //  17  0x11
        0, //  18  0x12
        0, //  19  0x13
        0, //  20  0x14
        0, //  21  0x15
        0, //  22  0x16
        0, //  23  0x17
        0, //  24  0x18
        0, //  25  0x19
        0, //  26  0x1A
        1, //  27  0x1B
        0, //  28  0x1C
        1, //  29  0x1D
        0, //  30  0x1E
        0, //  31  0x1F
        0, //  32  0x20
        0, //  33  0x21
        1, //  34  0x22
        0, //  35  0x23
        0, //  36  0x24
        0, //  37  0x25
        0, //  38  0x26
        1, //  39  0x27
        0, //  40  0x28
        0, //  41  0x29
        0, //  42  0x2A
        0, //  43  0x2B
        0, //  44  0x2C
        0, //  45  0x2D
        1, //  46  0x2E
        0, //  47  0x2F
        1, //  48  0x30
        0, //  49  0x31
        0, //  50  0x32
        1, //  51  0x33
        0, //  52  0x34
        1, //  53  0x35
        0, //  54  0x36
        0, //  55  0x37
        0, //  56  0x38
        0, //  57  0x39
        1, //  58  0x3A
        0, //  59  0x3B
        1, //  60  0x3C
        0, //  61  0x3D
        0, //  62  0x3E
        1, //  63  0x3F
        0, //  64  0x40
        0, //  65  0x41
        0, //  66  0x42
        0, //  67  0x43
        1, //  68  0x44
        0, //  69  0x45
        0, //  70  0x46
        1, //  71  0x47
        0, //  72  0x48
        0, //  73  0x49
        0, //  74  0x4A
        0, //  75  0x4B
        0, //  76  0x4C
        0, //  77  0x4D
        1, //  78  0x4E
        0, //  79  0x4F
        1, //  80  0x50
        0, //  81  0x51
        0, //  82  0x52
        1, //  83  0x53
        0, //  84  0x54
        1, //  85  0x55
        0, //  86  0x56
        0, //  87  0x57
        0, //  88  0x58
        0, //  89  0x59
        1, //  90  0x5A
        0, //  91  0x5B
        1, //  92  0x5C
        0, //  93  0x5D
        0, //  94  0x5E
        1, //  95  0x5F
        0, //  96  0x60
        0, //  97  0x61
        0, //  98  0x62
        0, //  99  0x63
        0, // 100  0x64
        0, // 101  0x65
        1, // 102  0x66
        0, // 103  0x67
        0, // 104  0x68
        0, // 105  0x69
        0, // 106  0x6A
        0, // 107  0x6B
        0, // 108  0x6C
        0, // 109  0x6D
        0, // 110  0x6E
        0, // 111  0x6F
        0, // 112  0x70
        0, // 113  0x71
        1, // 114  0x72
        0, // 115  0x73
        1, // 116  0x74
        0, // 117  0x75
        0, // 118  0x76
        1, // 119  0x77
        0, // 120  0x78
        0, // 121  0x79
        0, // 122  0x7A
        0, // 123  0x7B
        0, // 124  0x7C
        0, // 125  0x7D
        0, // 126  0x7E
        0, // 127  0x7F
        0, // 128  0x80
        0, // 129  0x81
        0, // 130  0x82
        0, // 131  0x83
        0, // 132  0x84
        0, // 133  0x85
        0, // 134  0x86
        0, // 135  0x87
        1, // 136  0x88
        0, // 137  0x89
        0, // 138  0x8A
        1, // 139  0x8B
        0, // 140  0x8C
        1, // 141  0x8D
        0, // 142  0x8E
        0, // 143  0x8F
        0, // 144  0x90
        0, // 145  0x91
        0, // 146  0x92
        0, // 147  0x93
        0, // 148  0x94
        0, // 149  0x95
        0, // 150  0x96
        0, // 151  0x97
        0, // 152  0x98
        1, // 153  0x99
        0, // 154  0x9A
        0, // 155  0x9B
        0, // 156  0x9C
        0, // 157  0x9D
        0, // 158  0x9E
        0, // 159  0x9F
        1, // 160  0xA0
        0, // 161  0xA1
        0, // 162  0xA2
        1, // 163  0xA3
        0, // 164  0xA4
        1, // 165  0xA5
        0, // 166  0xA6
        0, // 167  0xA7
        0, // 168  0xA8
        0, // 169  0xA9
        1, // 170  0xAA
        0, // 171  0xAB
        1, // 172  0xAC
        0, // 173  0xAD
        0, // 174  0xAE
        1, // 175  0xAF
        0, // 176  0xB0
        1, // 177  0xB1
        0, // 178  0xB2
        0, // 179  0xB3
        0, // 180  0xB4
        0, // 181  0xB5
        0, // 182  0xB6
        0, // 183  0xB7
        1, // 184  0xB8
        0, // 185  0xB9
        0, // 186  0xBA
        1, // 187  0xBB
        0, // 188  0xBC
        0, // 189  0xBD
        0, // 190  0xBE
        0, // 191  0xBF
        1, // 192  0xC0
        0, // 193  0xC1
        0, // 194  0xC2
        1, // 195  0xC3
        0, // 196  0xC4
        1, // 197  0xC5
        0, // 198  0xC6
        0, // 199  0xC7
        0, // 200  0xC8
        0, // 201  0xC9
        1, // 202  0xCA
        0, // 203  0xCB
        1, // 204  0xCC
        0, // 205  0xCD
        0, // 206  0xCE
        1, // 207  0xCF
        0, // 208  0xD0
        1, // 209  0xD1
        0, // 210  0xD2
        0, // 211  0xD3
        0, // 212  0xD4
        0, // 213  0xD5
        0, // 214  0xD6
        0, // 215  0xD7
        1, // 216  0xD8
        0, // 217  0xD9
        0, // 218  0xDA
        0, // 219  0xDB
        0, // 220  0xDC
        1, // 221  0xDD
        0, // 222  0xDE
        0, // 223  0xDF
        0, // 224  0xE0
        0, // 225  0xE1
        1, // 226  0xE2
        0, // 227  0xE3
        1, // 228  0xE4
        0, // 229  0xE5
        0, // 230  0xE6
        0, // 231  0xE7
        0, // 232  0xE8
        0, // 233  0xE9
        0, // 234  0xEA
        0, // 235  0xEB
        0, // 236  0xEC
        0, // 237  0xED
        1, // 238  0xEE
        0, // 239  0xEF
        1, // 240  0xF0
        0, // 241  0xF1
        0, // 242  0xF2
        1, // 243  0xF3
        0, // 244  0xF4
        1, // 245  0xF5
        0, // 246  0xF6
        0, // 247  0xF7
        0, // 248  0xF8
        0, // 249  0xF9
        1, // 250  0xFA
        0, // 251  0xFB
        1, // 252  0xFC
        0, // 253  0xFD
        0, // 254  0xFE
        1  // 255  0xFF    
    };
    if ( pCut->nLeaves < 3 )
        return 1;
    if ( pCut->nLeaves == 3 && uLookup[0xff & *If_CutTruth(pCut)] )
        return 1;
    return (1 << pCut->nLeaves) - 1;
}


////////////////////////////////////////////////////////////////////////
///                       END OF FILE                                ///
////////////////////////////////////////////////////////////////////////


ABC_NAMESPACE_IMPL_END