ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
minilut.h
Go to the documentation of this file.
1
20
21#ifndef MINI_LUT__mini_lut_h
22#define MINI_LUT__mini_lut_h
23
27
28#include <stdio.h>
29#include <stdlib.h>
30#include <string.h>
31#include <assert.h>
32
34
38
39#define MINI_LUT_NULL (0x7FFFFFFF)
40#define MINI_LUT_NULL2 (0x7FFFFFFE)
41#define MINI_LUT_START_SIZE (0x000000FF)
42
46
47typedef struct Mini_Lut_t_ Mini_Lut_t;
49{
50 int nCap;
51 int nSize;
52 int nRegs;
54 int * pArray;
55 unsigned * pTruths;
56};
57
61
62// memory management
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))))
70
71// compute truth table size measured in unsigned's
72static int Mini_LutWordNum( int LutSize )
73{
74 return LutSize > 5 ? 1 << (LutSize-5) : 1;
75}
76
77// internal procedures
78static void Mini_LutGrow( Mini_Lut_t * p, int nCapMin )
79{
80 if ( p->nCap >= nCapMin )
81 return;
82 p->pArray = MINI_LUT_REALLOC( int, p->pArray, nCapMin * p->LutSize );
83 p->pTruths = MINI_LUT_REALLOC( unsigned, p->pTruths, nCapMin * Mini_LutWordNum(p->LutSize) );
84 p->nCap = nCapMin;
85 assert( p->pArray );
86 assert( p->pTruths );
87}
88static void Mini_LutPush( Mini_Lut_t * p, int nVars, int * pVars, unsigned * pTruth )
89{
90 int i, nWords = Mini_LutWordNum(p->LutSize);
91 if ( p->nSize == p->nCap )
92 {
93 assert( p->LutSize*p->nSize < MINI_LUT_NULL/2 );
94 if ( p->nCap < MINI_LUT_START_SIZE )
95 Mini_LutGrow( p, MINI_LUT_START_SIZE );
96 else
97 Mini_LutGrow( p, 2 * p->nCap );
98 }
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++ )
104 p->pArray[p->LutSize * p->nSize + i] = MINI_LUT_NULL;
105 for ( i = 0; i < nWords; i++ )
106 p->pTruths[nWords * p->nSize + i] = pTruth? pTruth[i] : 0;
107 p->nSize++;
108}
109
110// accessing fanins
111static int Mini_LutNodeFanin( Mini_Lut_t * p, int Id, int k )
112{
113 assert( Id >= 0 && Id < p->nSize );
114 return p->pArray[p->LutSize*Id+k];
115}
116static unsigned * Mini_LutNodeTruth( Mini_Lut_t * p, int Id )
117{
118 assert( Id >= 0 && Id < p->nSize );
119 return p->pTruths + Id * Mini_LutWordNum(p->LutSize);
120}
121
122// working with LUTs
123static int Mini_LutNodeConst0() { return 0; }
124static int Mini_LutNodeConst1() { return 1; }
125
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; }
128static int Mini_LutNodeIsPi( Mini_Lut_t * p, int Id ) { assert( Id >= 0 ); return Id > 1 && Mini_LutNodeFanin( p, Id, 0 ) == MINI_LUT_NULL; }
129static int Mini_LutNodeIsPo( Mini_Lut_t * p, int Id ) { assert( Id >= 0 ); return Id > 1 && Mini_LutNodeFanin( p, Id, 0 ) != MINI_LUT_NULL && Mini_LutNodeFanin( p, Id, 1 ) == MINI_LUT_NULL2; }
130static int Mini_LutNodeIsNode( Mini_Lut_t * p, int Id ) { assert( Id >= 0 ); return Id > 1 && Mini_LutNodeFanin( p, Id, 0 ) != MINI_LUT_NULL && Mini_LutNodeFanin( p, Id, 1 ) != MINI_LUT_NULL2; }
131
132static int Mini_LutSize( Mini_Lut_t * p ) { return p->LutSize; }
133
134// working with sequential AIGs
135static int Mini_LutRegNum( Mini_Lut_t * p ) { return p->nRegs; }
136static void Mini_LutSetRegNum( Mini_Lut_t * p, int n ) { p->nRegs = n; }
137
138// iterators through objects
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
142
143// iterator through fanins
144#define Mini_LutForEachFanin( p, i, Fan, k ) for (k = 0; (k < p->LutSize) && (Fan = Mini_LutNodeFanin(p, i, k)) < MINI_LUT_NULL2; k++)
145
146// constructor/destructor
147static Mini_Lut_t * Mini_LutStart( int LutSize )
148{
149 Mini_Lut_t * p; int i;
150 assert( LutSize >= 2 && LutSize <= 16 );
152 p->LutSize = LutSize;
153 p->nCap = MINI_LUT_START_SIZE;
154 p->pArray = MINI_LUT_ALLOC( int, p->nCap * p->LutSize );
155 p->pTruths = MINI_LUT_ALLOC( unsigned, p->nCap * Mini_LutWordNum(p->LutSize) );
156 Mini_LutPush( p, 0, NULL, NULL ); // const0
157 Mini_LutPush( p, 0, NULL, NULL ); // const1
158 for ( i = 0; i < Mini_LutWordNum(p->LutSize); i++ )
159 p->pTruths[i] = 0;
160 for ( i = 0; i < Mini_LutWordNum(p->LutSize); i++ )
161 p->pTruths[Mini_LutWordNum(p->LutSize) + i] = ~0;
162 return p;
163}
164static void Mini_LutStop( Mini_Lut_t * p )
165{
166 MINI_LUT_FREE( p->pArray );
167 MINI_LUT_FREE( p->pTruths );
168 MINI_LUT_FREE( p );
169}
170static void Mini_LutPrintStats( Mini_Lut_t * p )
171{
172 int i, nPis, nPos, nNodes;
173 nPis = 0;
174 Mini_LutForEachPi( p, i )
175 nPis++;
176 nPos = 0;
177 Mini_LutForEachPo( p, i )
178 nPos++;
179 nNodes = 0;
181 nNodes++;
182 printf( "PI = %d. PO = %d. LUT = %d. FF = %d.\n", nPis, nPos, nNodes, p->nRegs );
183}
184static void Mini_LutPrint( Mini_Lut_t * p )
185{
186 int i, k, Fan;
187 printf( "MiniLUT statistics: " );
188 Mini_LutPrintStats( p );
189 printf( "Printout of nodes:\n" );
190 for ( i = 0; i < p->nSize; i++ )
191 {
192 printf( "%6d : ", i );
193 if ( Mini_LutNodeIsConst(p, i) )
194 printf( "Const%d", i );
195 else if ( Mini_LutNodeIsPi(p, i) )
196 printf( "PI" );
197 else if ( Mini_LutNodeIsPo(p, i) )
198 printf( "PO" );
199 else if ( Mini_LutNodeIsNode(p, i) )
200 {
201 printf( "LUT%d Fanins:", p->LutSize );
202 Mini_LutForEachFanin( p, i, Fan, k )
203 printf( " %6d", Fan );
204 while ( k++ < p->LutSize )
205 printf( " " );
206 printf( " Function: " );
207 for ( k = 31; k >= 0; k-- )
208 printf( "%c", '0' + ((p->pTruths[i] >> k) & 1) );
209 }
210 printf( "\n" );
211 }
212 printf( "End of printout.\n" );
213}
214
215// serialization
216static void Mini_LutDump( Mini_Lut_t * p, char * pFileName )
217{
218 FILE * pFile;
219 int RetValue;
220 pFile = fopen( pFileName, "wb" );
221 if ( pFile == NULL )
222 {
223 printf( "Cannot open file for writing \"%s\".\n", pFileName );
224 return;
225 }
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 );
231 fclose( pFile );
232}
233static Mini_Lut_t * Mini_LutLoad( char * pFileName )
234{
235 Mini_Lut_t * p;
236 FILE * pFile;
237 int RetValue, nSize;
238 pFile = fopen( pFileName, "rb" );
239 if ( pFile == NULL )
240 {
241 printf( "Cannot open file for reading \"%s\".\n", pFileName );
242 return NULL;
243 }
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 );
249 p->pArray = MINI_LUT_ALLOC( int, p->nCap * p->LutSize );
250 p->pTruths = MINI_LUT_ALLOC( unsigned, p->nCap * Mini_LutWordNum(p->LutSize) );
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 );
253 fclose( pFile );
254 return p;
255}
256
257
258// creating nodes
259// (constant nodes are created when LUT manager is created)
260static int Mini_LutCreatePi( Mini_Lut_t * p )
261{
262 Mini_LutPush( p, 0, NULL, NULL );
263 return p->nSize - 1;
264}
265static int Mini_LutCreatePo( Mini_Lut_t * p, int Var0 )
266{
267 assert( Var0 >= 0 && Var0 < p->nSize );
268 Mini_LutPush( p, 1, &Var0, NULL );
269 // mark PO by setting its 2nd fanin to the special number
270 p->pArray[p->LutSize*(p->nSize - 1)+1] = MINI_LUT_NULL2;
271 return p->nSize - 1;
272}
273
274// create LUT
275static int Mini_LutCreateNode( Mini_Lut_t * p, int nVars, int * pVars, unsigned * pTruth )
276{
277 assert( nVars >= 0 && nVars <= p->LutSize );
278 Mini_LutPush( p, nVars, pVars, pTruth );
279 return p->nSize - 1;
280}
281
282// procedure to check the topological order during AIG construction
283static int Mini_LutCheck( Mini_Lut_t * p )
284{
285 int status = 1;
286 int i, k, iFaninVar;
288 {
289 for ( k = 0; k < p->LutSize; k++ )
290 {
291 iFaninVar = Mini_LutNodeFanin( p, i, k );
292 if ( iFaninVar == MINI_LUT_NULL )
293 continue;
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;
296 }
297 }
298 Mini_LutForEachPo( p, i )
299 {
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;
303 }
304 return status;
305}
306
307
308
312
314
315#endif
316
320
int nWords
Definition abcNpn.c:127
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
Cube * p
Definition exorList.c:222
#define MINI_LUT_START_SIZE
Definition minilut.h:41
#define Mini_LutForEachPo(p, i)
Definition minilut.h:140
#define Mini_LutForEachFanin(p, i, Fan, k)
Definition minilut.h:144
#define MINI_LUT_ALLOC(type, num)
MACRO DEFINITIONS ///.
Definition minilut.h:63
#define MINI_LUT_NULL2
Definition minilut.h:40
#define MINI_LUT_FREE(obj)
Definition minilut.h:66
#define Mini_LutForEachPi(p, i)
Definition minilut.h:139
#define MINI_LUT_NULL
INCLUDES ///.
Definition minilut.h:39
struct Mini_Lut_t_ Mini_Lut_t
BASIC TYPES ///.
Definition minilut.h:47
#define Mini_LutForEachNode(p, i)
Definition minilut.h:141
#define MINI_LUT_REALLOC(type, obj, num)
Definition minilut.h:67
#define MINI_LUT_CALLOC(type, num)
Definition minilut.h:64
int LutSize
Definition minilut.h:53
int * pArray
Definition minilut.h:54
int nRegs
Definition minilut.h:52
unsigned * pTruths
Definition minilut.h:55
int nSize
Definition minilut.h:51
#define assert(ex)
Definition util_old.h:213
@ Var0
Definition xsatSolver.h:55