ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
ifLibBox.c
Go to the documentation of this file.
1
20
21#include "if.h"
22#include "misc/extra/extra.h"
23#include "base/main/main.h"
24
26
30
31#define If_LibBoxForEachBox( p, pBox, i ) \
32 Vec_PtrForEachEntry( If_Box_t *, p->vBoxes, pBox, i ) if ( pBox == NULL ) {} else
33
37
49If_Box_t * If_BoxStart( char * pName, int Id, int nPis, int nPos, int fSeq, int fBlack, int fOuter )
50{
51 If_Box_t * p;
52 p = ABC_CALLOC( If_Box_t, 1 );
53 p->pName = pName; // consumes memory
54 p->Id = Id;
55 p->fSeq = (char)fSeq;
56 p->fBlack = (char)fBlack;
57 p->fOuter = (char)fOuter;
58 p->nPis = nPis;
59 p->nPos = nPos;
60 p->pDelays = ABC_CALLOC( int, nPis * nPos );
61 return p;
62}
64{
65 If_Box_t * pNew = NULL;
66 return pNew;
67}
69{
70 ABC_FREE( p->pDelays );
71 ABC_FREE( p->pName );
72 ABC_FREE( p );
73}
74
87{
88 If_LibBox_t * p;
89 p = ABC_CALLOC( If_LibBox_t, 1 );
90 p->vBoxes = Vec_PtrAlloc( 100 );
91 return p;
92}
94{
95 If_LibBox_t * pNew = NULL;
96 return pNew;
97}
99{
100 If_Box_t * pBox;
101 int i;
102 if ( p == NULL )
103 return;
104 If_LibBoxForEachBox( p, pBox, i )
105 If_BoxFree( pBox );
106 Vec_PtrFree( p->vBoxes );
107 ABC_FREE( p );
108}
109
122{
123 return (If_Box_t *)Vec_PtrEntry( p->vBoxes, Id );
124}
126{
127 If_Box_t * pBox;
128 int i;
129 if ( p == NULL )
130 return NULL;
131 If_LibBoxForEachBox( p, pBox, i )
132 if ( !strcmp(pBox->pName, pName) )
133 return pBox;
134 return NULL;
135}
137{
138 if ( pBox->Id >= Vec_PtrSize(p->vBoxes) )
139 Vec_PtrFillExtra( p->vBoxes, 2 * pBox->Id + 10, NULL );
140 assert( Vec_PtrEntry( p->vBoxes, pBox->Id ) == NULL );
141 Vec_PtrWriteEntry( p->vBoxes, pBox->Id, pBox );
142 p->nBoxes++;
143}
145{
146 return p->nBoxes;
147}
148
160If_LibBox_t * If_LibBoxRead2( char * pFileName )
161{
162 int nSize = 100000;
163 char * pBuffer;
164 FILE * pFile;
165 If_LibBox_t * p = NULL;
166 If_Box_t * pBox = NULL;
167 char * pToken, * pName;
168 int fSeq, fBlack, fOuter;
169 int i, Id, nPis, nPos;
170 pFile = fopen( pFileName, "rb" );
171 if ( pFile == NULL )
172 {
173 printf( "Cannot open file \"%s\".\n", pFileName );
174 return NULL;
175 }
176 // read lines
177 nPis = nPos = 0;
178 pBuffer = ABC_ALLOC( char, nSize );
179 while ( fgets( pBuffer, nSize, pFile ) )
180 {
181 pToken = strtok( pBuffer, " \n\r\t" );
182 if ( pToken == NULL )
183 continue;
184 if ( pToken[0] == '.' )
185 {
186 if ( !strcmp(pToken, ".box") )
187 {
188 // save ID
189 pToken = strtok( NULL, " \n\r\t" );
190 Id = atoi( pToken );
191 // save name
192 pToken = strtok( NULL, " \n\r\t" );
193 pName = Abc_UtilStrsav(pToken);
194 // save PIs
195 pToken = strtok( NULL, " \n\r\t" );
196 nPis = atoi( pToken );
197 // save POs
198 pToken = strtok( NULL, " \n\r\t" );
199 nPos = atoi( pToken );
200 // save attributes
201 fSeq = fBlack = fOuter = 0;
202 pToken = strtok( NULL, " \n\r\t" );
203 while ( pToken )
204 {
205 if ( !strcmp(pToken, "seq") )
206 fSeq = 1;
207 else if ( !strcmp(pToken, "black") )
208 fBlack = 1;
209 else if ( !strcmp(pToken, "outer") )
210 fOuter = 1;
211 else assert( !strcmp(pToken, "comb") || !strcmp(pToken, "white") || !strcmp(pToken, "inner") );
212 pToken = strtok( NULL, " \n\r\t" );
213 }
214 // create library
215 if ( p == NULL )
216 p = If_LibBoxStart();
217 // create box
218 pBox = If_BoxStart( pName, Id, nPis, nPos, fSeq, fBlack, fOuter );
219 If_LibBoxAdd( p, pBox );
220 }
221 continue;
222 }
223 // read the table
224 assert( nPis > 0 && nPos > 0 );
225 for ( i = 0; i < nPis * nPos; i++ )
226 {
227 while ( pToken == NULL )
228 {
229 if ( fgets( pBuffer, nSize, pFile ) == NULL )
230 { printf( "The table does not have enough entries.\n" ); fflush(stdout); assert( 0 ); }
231 pToken = strtok( pBuffer, " \n\r\t" );
232 }
233 pBox->pDelays[i] = (pToken[0] == '-') ? -1 : atoi(pToken);
234 pToken = strtok( NULL, " \n\r\t" );
235 }
236 pBox = NULL;
237 }
238 ABC_FREE( pBuffer );
239 fclose( pFile );
240 return p;
241}
242
243
255char * If_LibBoxGetToken( FILE * pFile )
256{
257 static char pBuffer[1000];
258 int c; char * pTemp = pBuffer;
259 while ( (c = fgetc(pFile)) != EOF )
260 {
261 if ( c == '#' )
262 {
263 while ( (c = fgetc(pFile)) != EOF )
264 if ( c == '\n' )
265 break;
266 }
267 if ( c == ' ' || c == '\t' || c == '\n' || c == '\r' )
268 {
269 if ( pTemp > pBuffer )
270 break;
271 continue;
272 }
273 *pTemp++ = c;
274 }
275 *pTemp = 0;
276 return pTemp > pBuffer ? pBuffer : NULL;
277}
278If_LibBox_t * If_LibBoxRead( char * pFileName )
279{
280 FILE * pFile;
281 If_LibBox_t * p;
282 If_Box_t * pBox;
283 char * pToken, * pName;
284 int i, Id, fBlack, nPis, nPos;
285 pFile = fopen( pFileName, "rb" );
286 if ( pFile == NULL )
287 {
288 printf( "Cannot open file \"%s\".\n", pFileName );
289 return NULL;
290 }
291 // get the library name
292 pToken = If_LibBoxGetToken( pFile );
293 if ( pToken == NULL )
294 {
295 fclose( pFile );
296 printf( "Cannot read library name from file \"%s\".\n", pFileName );
297 return NULL;
298 }
299 if ( pToken[0] == '.' )
300 {
301 fclose( pFile );
302 printf( "Wrong box format. Please try \"read_box -e\".\n" );
303 return NULL;
304 }
305
306 // create library
307 p = If_LibBoxStart();
308 while ( pToken )
309 {
310 // save name
311 pName = Abc_UtilStrsav(pToken);
312 // save ID
313 pToken = If_LibBoxGetToken( pFile );
314 Id = atoi( pToken );
315 // save white/black
316 pToken = If_LibBoxGetToken( pFile );
317 fBlack = !atoi( pToken );
318 // save PIs
319 pToken = If_LibBoxGetToken( pFile );
320 nPis = atoi( pToken );
321 // save POs
322 pToken = If_LibBoxGetToken( pFile );
323 nPos = atoi( pToken );
324 // create box
325 pBox = If_BoxStart( pName, Id, nPis, nPos, 0, fBlack, 0 );
326 If_LibBoxAdd( p, pBox );
327 // read the table
328 for ( i = 0; i < nPis * nPos; i++ )
329 {
330 pToken = If_LibBoxGetToken( pFile );
331 pBox->pDelays[i] = (pToken[0] == '-') ? -ABC_INFINITY : atoi(pToken);
332 }
333 // extract next name
334 pToken = If_LibBoxGetToken( pFile );
335 }
336 fclose( pFile );
337 return p;
338}
339void If_LibBoxPrint( FILE * pFile, If_LibBox_t * p )
340{
341 If_Box_t * pBox;
342 int i, j, k;
343 fprintf( pFile, "# Box library written by ABC on %s.\n", Extra_TimeStamp() );
344 fprintf( pFile, "# <Name> <ID> <Type> <I> <O>\n" );
345 If_LibBoxForEachBox( p, pBox, i )
346 {
347 fprintf( pFile, "%s %d %d %d %d\n", pBox->pName, pBox->Id, !pBox->fBlack, pBox->nPis, pBox->nPos );
348 for ( j = 0; j < pBox->nPos; j++, fprintf(pFile, "\n") )
349 for ( k = 0; k < pBox->nPis; k++ )
350 if ( pBox->pDelays[j * pBox->nPis + k] == -ABC_INFINITY )
351 fprintf( pFile, " - " );
352 else
353 fprintf( pFile, "%5d ", pBox->pDelays[j * pBox->nPis + k] );
354 }
355}
356void If_LibBoxWrite( char * pFileName, If_LibBox_t * p )
357{
358 FILE * pFile;
359 pFile = fopen( pFileName, "wb" );
360 if ( pFile == NULL )
361 {
362 printf( "Cannot open file \"%s\".\n", pFileName );
363 return;
364 }
365 If_LibBoxPrint( pFile, p );
366 fclose( pFile );
367 printf( "Finished writing box library into file \"%s\".\n", pFileName );
368}
369
381int If_LibBoxLoad( char * pFileName )
382{
383 FILE * pFile;
384 If_LibBox_t * pLib;
385 char * pFileNameOther;
386 // check if library can be read
387 pFileNameOther = Extra_FileNameGenericAppend( pFileName, ".cdl" );
388 pFile = fopen( pFileNameOther, "r" );
389 if ( pFile == NULL )
390 return 0;
391 fclose( pFile );
392 // read library
393 pLib = If_LibBoxRead2( pFileNameOther );
394 // replace the current library
396 Abc_FrameSetLibBox( pLib );
397 return 1;
398}
399
400
404
405
407
#define ABC_ALLOC(type, num)
Definition abc_global.h:264
#define ABC_INFINITY
MACRO DEFINITIONS ///.
Definition abc_global.h:250
#define ABC_CALLOC(type, num)
Definition abc_global.h:265
#define ABC_FREE(obj)
Definition abc_global.h:267
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
ABC_DLL void Abc_FrameSetLibBox(void *pLib)
Definition mainFrame.c:94
ABC_DLL void * Abc_FrameReadLibBox()
Definition mainFrame.c:58
Cube * p
Definition exorList.c:222
char * Extra_TimeStamp()
char * Extra_FileNameGenericAppend(char *pBase, char *pSuffix)
If_LibBox_t * If_LibBoxRead2(char *pFileName)
Definition ifLibBox.c:160
void If_LibBoxPrint(FILE *pFile, If_LibBox_t *p)
Definition ifLibBox.c:339
char * If_LibBoxGetToken(FILE *pFile)
Definition ifLibBox.c:255
If_Box_t * If_LibBoxReadBox(If_LibBox_t *p, int Id)
Definition ifLibBox.c:121
#define If_LibBoxForEachBox(p, pBox, i)
DECLARATIONS ///.
Definition ifLibBox.c:31
void If_LibBoxWrite(char *pFileName, If_LibBox_t *p)
Definition ifLibBox.c:356
If_LibBox_t * If_LibBoxRead(char *pFileName)
Definition ifLibBox.c:278
If_Box_t * If_BoxStart(char *pName, int Id, int nPis, int nPos, int fSeq, int fBlack, int fOuter)
FUNCTION DEFINITIONS ///.
Definition ifLibBox.c:49
int If_LibBoxNum(If_LibBox_t *p)
Definition ifLibBox.c:144
void If_LibBoxAdd(If_LibBox_t *p, If_Box_t *pBox)
Definition ifLibBox.c:136
If_Box_t * If_LibBoxFindBox(If_LibBox_t *p, char *pName)
Definition ifLibBox.c:125
If_Box_t * If_BoxDup(If_Box_t *p)
Definition ifLibBox.c:63
void If_BoxFree(If_Box_t *p)
Definition ifLibBox.c:68
If_LibBox_t * If_LibBoxDup(If_Box_t *p)
Definition ifLibBox.c:93
void If_LibBoxFree(If_LibBox_t *p)
Definition ifLibBox.c:98
If_LibBox_t * If_LibBoxStart()
Definition ifLibBox.c:86
int If_LibBoxLoad(char *pFileName)
Definition ifLibBox.c:381
struct If_LibBox_t_ If_LibBox_t
Definition if.h:83
struct If_Box_t_ If_Box_t
Definition if.h:364
int Id
Definition if.h:372
int nPos
Definition if.h:374
int nPis
Definition if.h:373
char fBlack
Definition if.h:369
int * pDelays
Definition if.h:375
char * pName
Definition if.h:367
#define assert(ex)
Definition util_old.h:213
int strcmp()
char * strtok()