mirror of https://github.com/YosysHQ/abc.git
423 lines
10 KiB
C
423 lines
10 KiB
C
/**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
|
|
|