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