21#ifndef MINI_LUT__mini_lut_h
22#define MINI_LUT__mini_lut_h
39#define MINI_LUT_NULL (0x7FFFFFFF)
40#define MINI_LUT_NULL2 (0x7FFFFFFE)
41#define MINI_LUT_START_SIZE (0x000000FF)
63#define MINI_LUT_ALLOC(type, num) ((type *) malloc(sizeof(type) * (num)))
64#define MINI_LUT_CALLOC(type, num) ((type *) calloc((num), sizeof(type)))
65#define MINI_LUT_FALLOC(type, num) ((type *) memset(malloc(sizeof(type) * (num)), 0xff, sizeof(type) * (num)))
66#define MINI_LUT_FREE(obj) ((obj) ? (free((char *) (obj)), (obj) = 0) : 0)
67#define MINI_LUT_REALLOC(type, obj, num) \
68 ((obj) ? ((type *) realloc((char *)(obj), sizeof(type) * (num))) : \
69 ((type *) malloc(sizeof(type) * (num))))
72static int Mini_LutWordNum(
int LutSize )
74 return LutSize > 5 ? 1 << (LutSize-5) : 1;
78static void Mini_LutGrow(
Mini_Lut_t *
p,
int nCapMin )
80 if (
p->nCap >= nCapMin )
83 p->pTruths =
MINI_LUT_REALLOC(
unsigned,
p->pTruths, nCapMin * Mini_LutWordNum(
p->LutSize) );
88static void Mini_LutPush(
Mini_Lut_t *
p,
int nVars,
int * pVars,
unsigned * pTruth )
90 int i,
nWords = Mini_LutWordNum(
p->LutSize);
91 if (
p->nSize ==
p->nCap )
97 Mini_LutGrow(
p, 2 *
p->nCap );
99 for ( i = 0; i < nVars; i++ )
100 assert( pVars[i] >= 0 && pVars[i] <
p->nSize );
101 for ( i = 0; i < nVars; i++ )
102 p->pArray[
p->LutSize *
p->nSize + i] = pVars[i];
103 for ( ; i <
p->LutSize; i++ )
105 for ( i = 0; i <
nWords; i++ )
106 p->pTruths[
nWords *
p->nSize + i] = pTruth? pTruth[i] : 0;
111static int Mini_LutNodeFanin(
Mini_Lut_t *
p,
int Id,
int k )
113 assert( Id >= 0 && Id < p->nSize );
114 return p->pArray[
p->LutSize*Id+k];
116static unsigned * Mini_LutNodeTruth(
Mini_Lut_t *
p,
int Id )
118 assert( Id >= 0 && Id < p->nSize );
119 return p->pTruths + Id * Mini_LutWordNum(
p->LutSize);
123static int Mini_LutNodeConst0() {
return 0; }
124static int Mini_LutNodeConst1() {
return 1; }
126static int Mini_LutNodeNum(
Mini_Lut_t *
p ) {
return p->nSize; }
127static int Mini_LutNodeIsConst(
Mini_Lut_t *
p,
int Id ) {
assert( Id >= 0 );
return Id == 0 || Id == 1; }
132static int Mini_LutSize(
Mini_Lut_t *
p ) {
return p->LutSize; }
135static int Mini_LutRegNum(
Mini_Lut_t *
p ) {
return p->nRegs; }
136static void Mini_LutSetRegNum(
Mini_Lut_t *
p,
int n ) {
p->nRegs = n; }
139#define Mini_LutForEachPi( p, i ) for (i = 2; i < Mini_LutNodeNum(p); i++) if ( !Mini_LutNodeIsPi(p, i) ) {} else
140#define Mini_LutForEachPo( p, i ) for (i = 2; i < Mini_LutNodeNum(p); i++) if ( !Mini_LutNodeIsPo(p, i) ) {} else
141#define Mini_LutForEachNode( p, i ) for (i = 2; i < Mini_LutNodeNum(p); i++) if ( !Mini_LutNodeIsNode(p, i) ) {} else
144#define Mini_LutForEachFanin( p, i, Fan, k ) for (k = 0; (k < p->LutSize) && (Fan = Mini_LutNodeFanin(p, i, k)) < MINI_LUT_NULL2; k++)
147static Mini_Lut_t * Mini_LutStart(
int LutSize )
150 assert( LutSize >= 2 && LutSize <= 16 );
152 p->LutSize = LutSize;
156 Mini_LutPush(
p, 0, NULL, NULL );
157 Mini_LutPush(
p, 0, NULL, NULL );
158 for ( i = 0; i < Mini_LutWordNum(
p->LutSize); i++ )
160 for ( i = 0; i < Mini_LutWordNum(
p->LutSize); i++ )
161 p->pTruths[Mini_LutWordNum(
p->LutSize) + i] = ~0;
172 int i, nPis, nPos, nNodes;
182 printf(
"PI = %d. PO = %d. LUT = %d. FF = %d.\n", nPis, nPos, nNodes,
p->nRegs );
187 printf(
"MiniLUT statistics: " );
188 Mini_LutPrintStats(
p );
189 printf(
"Printout of nodes:\n" );
190 for ( i = 0; i <
p->nSize; i++ )
192 printf(
"%6d : ", i );
193 if ( Mini_LutNodeIsConst(
p, i) )
194 printf(
"Const%d", i );
195 else if ( Mini_LutNodeIsPi(
p, i) )
197 else if ( Mini_LutNodeIsPo(
p, i) )
199 else if ( Mini_LutNodeIsNode(
p, i) )
201 printf(
"LUT%d Fanins:",
p->LutSize );
203 printf(
" %6d", Fan );
204 while ( k++ <
p->LutSize )
206 printf(
" Function: " );
207 for ( k = 31; k >= 0; k-- )
208 printf(
"%c",
'0' + ((
p->pTruths[i] >> k) & 1) );
212 printf(
"End of printout.\n" );
216static void Mini_LutDump(
Mini_Lut_t *
p,
char * pFileName )
220 pFile = fopen( pFileName,
"wb" );
223 printf(
"Cannot open file for writing \"%s\".\n", pFileName );
226 RetValue = (int)fwrite( &
p->nSize,
sizeof(
int), 1, pFile );
227 RetValue = (int)fwrite( &
p->nRegs,
sizeof(
int), 1, pFile );
228 RetValue = (int)fwrite( &
p->LutSize,
sizeof(
int), 1, pFile );
229 RetValue = (int)fwrite(
p->pArray,
sizeof(
int),
p->nSize *
p->LutSize, pFile );
230 RetValue = (int)fwrite(
p->pTruths,
sizeof(
int),
p->nSize * Mini_LutWordNum(
p->LutSize), pFile );
233static Mini_Lut_t * Mini_LutLoad(
char * pFileName )
238 pFile = fopen( pFileName,
"rb" );
241 printf(
"Cannot open file for reading \"%s\".\n", pFileName );
244 RetValue = (int)fread( &nSize,
sizeof(
int), 1, pFile );
246 p->nSize =
p->nCap = nSize;
247 RetValue = (int)fread( &
p->nRegs,
sizeof(
int), 1, pFile );
248 RetValue = (int)fread( &
p->LutSize,
sizeof(
int), 1, pFile );
251 RetValue = (int)fread(
p->pArray,
sizeof(
int),
p->nCap *
p->LutSize, pFile );
252 RetValue = (int)fread(
p->pTruths,
sizeof(
int),
p->nCap * Mini_LutWordNum(
p->LutSize), pFile );
262 Mini_LutPush(
p, 0, NULL, NULL );
268 Mini_LutPush(
p, 1, &
Var0, NULL );
275static int Mini_LutCreateNode(
Mini_Lut_t *
p,
int nVars,
int * pVars,
unsigned * pTruth )
277 assert( nVars >= 0 && nVars <= p->LutSize );
278 Mini_LutPush(
p, nVars, pVars, pTruth );
289 for ( k = 0; k <
p->LutSize; k++ )
291 iFaninVar = Mini_LutNodeFanin(
p, i, k );
294 if ( iFaninVar >=
p->LutSize * i )
295 printf(
"Fanin %d of LUT node %d is not in a topological order.\n", k, i ), status = 0;
300 iFaninVar = Mini_LutNodeFanin(
p, i, 0 );
301 if ( iFaninVar >=
p->LutSize * i )
302 printf(
"Fanin %d of PO node %d is not in a topological order.\n", k, i ), status = 0;
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
#define MINI_LUT_START_SIZE
#define Mini_LutForEachPo(p, i)
#define Mini_LutForEachFanin(p, i, Fan, k)
#define MINI_LUT_ALLOC(type, num)
MACRO DEFINITIONS ///.
#define MINI_LUT_FREE(obj)
#define Mini_LutForEachPi(p, i)
#define MINI_LUT_NULL
INCLUDES ///.
struct Mini_Lut_t_ Mini_Lut_t
BASIC TYPES ///.
#define Mini_LutForEachNode(p, i)
#define MINI_LUT_REALLOC(type, obj, num)
#define MINI_LUT_CALLOC(type, num)