blob: 035345b612ce82f38e40fd474d0c18ca076df970 [file] [log] [blame]
/**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 $]
***********************************************************************/
#include "base/abc/abc.h"
#include "map/if/if.h"
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_Man_t * p, 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(p, pCut)] )
return 1;
return (1 << pCut->nLeaves) - 1;
}
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////
ABC_NAMESPACE_IMPL_END