1 /**CFile****************************************************************
2 
3   FileName    [ifLibBox.c]
4 
5   SystemName  [ABC: Logic synthesis and verification system.]
6 
7   PackageName [FPGA mapping based on priority cuts.]
8 
9   Synopsis    [Box library.]
10 
11   Author      [Alan Mishchenko]
12 
13   Affiliation [UC Berkeley]
14 
15   Date        [Ver. 1.0. Started - November 21, 2006.]
16 
17   Revision    [$Id: ifLibBox.c,v 1.00 2006/11/21 00:00:00 alanmi Exp $]
18 
19 ***********************************************************************/
20 
21 #include "if.h"
22 #include "misc/extra/extra.h"
23 #include "base/main/main.h"
24 
25 ABC_NAMESPACE_IMPL_START
26 
27 ////////////////////////////////////////////////////////////////////////
28 ///                        DECLARATIONS                              ///
29 ////////////////////////////////////////////////////////////////////////
30 
31 #define If_LibBoxForEachBox( p, pBox, i )     \
32     Vec_PtrForEachEntry( If_Box_t *, p->vBoxes, pBox, i ) if ( pBox == NULL ) {} else
33 
34 ////////////////////////////////////////////////////////////////////////
35 ///                     FUNCTION DEFINITIONS                         ///
36 ////////////////////////////////////////////////////////////////////////
37 
38 /**Function*************************************************************
39 
40   Synopsis    []
41 
42   Description []
43 
44   SideEffects []
45 
46   SeeAlso     []
47 
48 ***********************************************************************/
If_BoxStart(char * pName,int Id,int nPis,int nPos,int fSeq,int fBlack,int fOuter)49 If_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 }
If_BoxDup(If_Box_t * p)63 If_Box_t * If_BoxDup( If_Box_t * p )
64 {
65     If_Box_t * pNew = NULL;
66     return pNew;
67 }
If_BoxFree(If_Box_t * p)68 void If_BoxFree( If_Box_t * p )
69 {
70     ABC_FREE( p->pDelays );
71     ABC_FREE( p->pName );
72     ABC_FREE( p );
73 }
74 
75 /**Function*************************************************************
76 
77   Synopsis    []
78 
79   Description []
80 
81   SideEffects []
82 
83   SeeAlso     []
84 
85 ***********************************************************************/
If_LibBoxStart()86 If_LibBox_t * If_LibBoxStart()
87 {
88     If_LibBox_t * p;
89     p = ABC_CALLOC( If_LibBox_t, 1 );
90     p->vBoxes = Vec_PtrAlloc( 100 );
91     return p;
92 }
If_LibBoxDup(If_Box_t * p)93 If_LibBox_t * If_LibBoxDup( If_Box_t * p )
94 {
95     If_LibBox_t * pNew = NULL;
96     return pNew;
97 }
If_LibBoxFree(If_LibBox_t * p)98 void If_LibBoxFree( If_LibBox_t * p )
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 
110 /**Function*************************************************************
111 
112   Synopsis    []
113 
114   Description []
115 
116   SideEffects []
117 
118   SeeAlso     []
119 
120 ***********************************************************************/
If_LibBoxReadBox(If_LibBox_t * p,int Id)121 If_Box_t * If_LibBoxReadBox( If_LibBox_t * p, int Id )
122 {
123     return (If_Box_t *)Vec_PtrEntry( p->vBoxes, Id );
124 }
If_LibBoxFindBox(If_LibBox_t * p,char * pName)125 If_Box_t * If_LibBoxFindBox( If_LibBox_t * p, char * pName )
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 }
If_LibBoxAdd(If_LibBox_t * p,If_Box_t * pBox)136 void If_LibBoxAdd( If_LibBox_t * p, If_Box_t * pBox )
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 }
If_LibBoxNum(If_LibBox_t * p)144 int If_LibBoxNum( If_LibBox_t * p )
145 {
146     return p->nBoxes;
147 }
148 
149 /**Function*************************************************************
150 
151   Synopsis    []
152 
153   Description []
154 
155   SideEffects []
156 
157   SeeAlso     []
158 
159 ***********************************************************************/
If_LibBoxRead2(char * pFileName)160 If_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 
244 /**Function*************************************************************
245 
246   Synopsis    []
247 
248   Description []
249 
250   SideEffects []
251 
252   SeeAlso     []
253 
254 ***********************************************************************/
If_LibBoxGetToken(FILE * pFile)255 char * 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 }
If_LibBoxRead(char * pFileName)278 If_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 }
If_LibBoxPrint(FILE * pFile,If_LibBox_t * p)339 void 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++, printf("\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 }
If_LibBoxWrite(char * pFileName,If_LibBox_t * p)356 void 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 }
368 
369 /**Function*************************************************************
370 
371   Synopsis    []
372 
373   Description []
374 
375   SideEffects []
376 
377   SeeAlso     []
378 
379 ***********************************************************************/
If_LibBoxLoad(char * pFileName)380 int If_LibBoxLoad( char * pFileName )
381 {
382     FILE * pFile;
383     If_LibBox_t * pLib;
384     char * pFileNameOther;
385     // check if library can be read
386     pFileNameOther = Extra_FileNameGenericAppend( pFileName, ".cdl" );
387     pFile = fopen( pFileNameOther, "r" );
388     if ( pFile == NULL )
389         return 0;
390     fclose( pFile );
391     // read library
392     pLib = If_LibBoxRead2( pFileNameOther );
393     // replace the current library
394     If_LibBoxFree( (If_LibBox_t *)Abc_FrameReadLibBox() );
395     Abc_FrameSetLibBox( pLib );
396     return 1;
397 }
398 
399 
400 ////////////////////////////////////////////////////////////////////////
401 ///                       END OF FILE                                ///
402 ////////////////////////////////////////////////////////////////////////
403 
404 
405 ABC_NAMESPACE_IMPL_END
406 
407