1 /**CFile****************************************************************
2 
3   FileName    [abcLib.c]
4 
5   SystemName  [ABC: Logic synthesis and verification system.]
6 
7   PackageName [Network and node package.]
8 
9   Synopsis    [Functions to manipulate verilog libraries.]
10 
11   Author      [Alan Mishchenko]
12 
13   Affiliation [UC Berkeley]
14 
15   Date        [Ver. 1.0. Started - June 20, 2005.]
16 
17   Revision    [$Id: abcLib.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
18 
19 ***********************************************************************/
20 
21 #include "abc.h"
22 
23 ABC_NAMESPACE_IMPL_START
24 
25 
26 ////////////////////////////////////////////////////////////////////////
27 ///                        DECLARATIONS                              ///
28 ////////////////////////////////////////////////////////////////////////
29 
30 ////////////////////////////////////////////////////////////////////////
31 ///                     FUNCTION DEFINITIONS                         ///
32 ////////////////////////////////////////////////////////////////////////
33 
34 /**Function*************************************************************
35 
36   Synopsis    [Create the library.]
37 
38   Description []
39 
40   SideEffects []
41 
42   SeeAlso     []
43 
44 ***********************************************************************/
Abc_DesCreate(char * pName)45 Abc_Des_t * Abc_DesCreate( char * pName )
46 {
47     Abc_Des_t * p;
48     p = ABC_ALLOC( Abc_Des_t, 1 );
49     memset( p, 0, sizeof(Abc_Des_t) );
50     p->pName    = Abc_UtilStrsav( pName );
51     p->tModules = st__init_table( strcmp, st__strhash );
52     p->vTops    = Vec_PtrAlloc( 100 );
53     p->vModules = Vec_PtrAlloc( 100 );
54     p->pManFunc = Hop_ManStart();
55     p->pLibrary = NULL;
56     return p;
57 }
58 
59 /**Function*************************************************************
60 
61   Synopsis    [Removes all pointers to the manager.]
62 
63   Description []
64 
65   SideEffects []
66 
67   SeeAlso     []
68 
69 ***********************************************************************/
Abc_DesCleanManPointer(Abc_Des_t * p,void * pMan)70 void Abc_DesCleanManPointer( Abc_Des_t * p, void * pMan )
71 {
72     Abc_Ntk_t * pTemp;
73     int i;
74     if ( p == NULL )
75         return;
76     if ( p->pManFunc == pMan )
77         p->pManFunc = NULL;
78     Vec_PtrForEachEntry( Abc_Ntk_t *, p->vModules, pTemp, i )
79         if ( pTemp->pManFunc == pMan )
80             pTemp->pManFunc = NULL;
81 }
82 
83 /**Function*************************************************************
84 
85   Synopsis    [Frees the library.]
86 
87   Description []
88 
89   SideEffects []
90 
91   SeeAlso     []
92 
93 ***********************************************************************/
Abc_DesFree(Abc_Des_t * p,Abc_Ntk_t * pNtkSave)94 void Abc_DesFree( Abc_Des_t * p, Abc_Ntk_t * pNtkSave )
95 {
96     Abc_Ntk_t * pNtk;
97     int i;
98     if ( p->pName )
99         ABC_FREE( p->pName );
100     if ( p->pManFunc )
101         Hop_ManStop( (Hop_Man_t *)p->pManFunc );
102     if ( p->tModules )
103         st__free_table( p->tModules );
104     if ( p->vModules )
105     {
106         Vec_PtrForEachEntry( Abc_Ntk_t *, p->vModules, pNtk, i )
107         {
108             if ( pNtk == pNtkSave )
109                 continue;
110             pNtk->pDesign = NULL;
111             if ( (pNtkSave && pNtk->pManFunc == pNtkSave->pManFunc) || (pNtk->pManFunc == p->pManFunc) )
112                 pNtk->pManFunc = NULL;
113             Abc_NtkDelete( pNtk );
114         }
115         Vec_PtrFree( p->vModules );
116     }
117     if ( p->vTops )
118         Vec_PtrFree( p->vTops );
119     ABC_FREE( p );
120 }
121 
122 /**Function*************************************************************
123 
124   Synopsis    [Duplicated the library.]
125 
126   Description []
127 
128   SideEffects []
129 
130   SeeAlso     []
131 
132 ***********************************************************************/
Abc_DesDup(Abc_Des_t * p)133 Abc_Des_t * Abc_DesDup( Abc_Des_t * p )
134 {
135     Abc_Des_t * pNew;
136     Abc_Ntk_t * pTemp;
137     Abc_Obj_t * pObj;
138     int i, k;
139     pNew = Abc_DesCreate( p->pName );
140     Vec_PtrForEachEntry( Abc_Ntk_t *, p->vModules, pTemp, i )
141         Abc_DesAddModel( pNew, Abc_NtkDup(pTemp) );
142     Vec_PtrForEachEntry( Abc_Ntk_t *, p->vTops, pTemp, i )
143         Vec_PtrPush( pNew->vTops, pTemp->pCopy );
144     Vec_PtrForEachEntry( Abc_Ntk_t *, p->vModules, pTemp, i )
145         pTemp->pCopy->pAltView = pTemp->pAltView ? pTemp->pAltView->pCopy : NULL;
146     // update box models
147     Vec_PtrForEachEntry( Abc_Ntk_t *, p->vModules, pTemp, i )
148         Abc_NtkForEachBox( pTemp, pObj, k )
149             if ( Abc_ObjIsWhitebox(pObj) || Abc_ObjIsBlackbox(pObj) )
150                 pObj->pCopy->pData = Abc_ObjModel(pObj)->pCopy;
151     return pNew;
152 }
153 
154 /**Function*************************************************************
155 
156   Synopsis    [Frees the library.]
157 
158   Description []
159 
160   SideEffects []
161 
162   SeeAlso     []
163 
164 ***********************************************************************/
Abc_DesDupBlackboxes(Abc_Des_t * p,Abc_Ntk_t * pNtkSave)165 Abc_Des_t * Abc_DesDupBlackboxes( Abc_Des_t * p, Abc_Ntk_t * pNtkSave )
166 {
167     Abc_Des_t * pNew;
168     Abc_Ntk_t * pNtkTemp;
169     int i;
170     assert( Vec_PtrSize(p->vTops) > 0 );
171     assert( Vec_PtrSize(p->vModules) > 1 );
172     pNew = Abc_DesCreate( p->pName );
173 //    pNew->pManFunc = pNtkSave->pManFunc;
174     Vec_PtrPush( pNew->vTops, pNtkSave );
175     Vec_PtrPush( pNew->vModules, pNtkSave );
176     Vec_PtrForEachEntry( Abc_Ntk_t *, p->vModules, pNtkTemp, i )
177         if ( Abc_NtkHasBlackbox( pNtkTemp ) )
178             Vec_PtrPush( pNew->vModules, Abc_NtkDup(pNtkTemp) );
179     return pNew;
180 }
181 
182 
183 /**Function*************************************************************
184 
185   Synopsis    [Prints the library.]
186 
187   Description []
188 
189   SideEffects []
190 
191   SeeAlso     []
192 
193 ***********************************************************************/
Abc_DesPrint(Abc_Des_t * p)194 void Abc_DesPrint( Abc_Des_t * p )
195 {
196     Abc_Ntk_t * pNtk;
197     Abc_Obj_t * pObj;
198     int i, k;
199     printf( "Models of design %s:\n", p->pName );
200     Vec_PtrForEachEntry( Abc_Ntk_t *, p->vModules, pNtk, i )
201     {
202         printf( "%2d : %20s   ", i+1, pNtk->pName );
203         printf( "nd = %6d   lat = %6d   whitebox = %3d   blackbox = %3d\n",
204             Abc_NtkNodeNum(pNtk), Abc_NtkLatchNum(pNtk),
205             Abc_NtkWhiteboxNum(pNtk), Abc_NtkBlackboxNum(pNtk) );
206         if ( Abc_NtkBlackboxNum(pNtk) == 0 )
207             continue;
208         Abc_NtkForEachWhitebox( pNtk, pObj, k )
209             printf( "     %20s (whitebox)\n", Abc_NtkName((Abc_Ntk_t *)pObj->pData) );
210         Abc_NtkForEachBlackbox( pNtk, pObj, k )
211             printf( "     %20s (blackbox)\n", Abc_NtkName((Abc_Ntk_t *)pObj->pData) );
212     }
213 }
214 
215 /**Function*************************************************************
216 
217   Synopsis    [Create the library.]
218 
219   Description []
220 
221   SideEffects []
222 
223   SeeAlso     []
224 
225 ***********************************************************************/
Abc_DesAddModel(Abc_Des_t * p,Abc_Ntk_t * pNtk)226 int Abc_DesAddModel( Abc_Des_t * p, Abc_Ntk_t * pNtk )
227 {
228     if ( st__is_member( p->tModules, (char *)pNtk->pName ) )
229         return 0;
230     st__insert( p->tModules, (char *)pNtk->pName, (char *)pNtk );
231     assert( pNtk->Id == 0 );
232     pNtk->Id = Vec_PtrSize(p->vModules);
233     Vec_PtrPush( p->vModules, pNtk );
234     pNtk->pDesign = p;
235     return 1;
236 }
237 
238 /**Function*************************************************************
239 
240   Synopsis    [Create the library.]
241 
242   Description []
243 
244   SideEffects []
245 
246   SeeAlso     []
247 
248 ***********************************************************************/
Abc_DesFindModelByName(Abc_Des_t * p,char * pName)249 Abc_Ntk_t * Abc_DesFindModelByName( Abc_Des_t * p, char * pName )
250 {
251     Abc_Ntk_t * pNtk;
252     if ( ! st__is_member( p->tModules, (char *)pName ) )
253         return NULL;
254     st__lookup( p->tModules, (char *)pName, (char **)&pNtk );
255     return pNtk;
256 }
257 
258 /**Function*************************************************************
259 
260   Synopsis    [Frees the library.]
261 
262   Description []
263 
264   SideEffects []
265 
266   SeeAlso     []
267 
268 ***********************************************************************/
Abc_DesDeriveRoot(Abc_Des_t * p)269 Abc_Ntk_t * Abc_DesDeriveRoot( Abc_Des_t * p )
270 {
271     Abc_Ntk_t * pNtk;
272     if ( Vec_PtrSize(p->vModules) > 1 )
273     {
274         printf( "The design includes more than one module and is currently not used.\n" );
275         return NULL;
276     }
277     pNtk = (Abc_Ntk_t *)Vec_PtrEntry( p->vModules, 0 );  Vec_PtrClear( p->vModules );
278     pNtk->pManFunc = p->pManFunc;           p->pManFunc = NULL;
279     return pNtk;
280 }
281 
282 /**Function*************************************************************
283 
284   Synopsis    [Detects the top-level models.]
285 
286   Description []
287 
288   SideEffects []
289 
290   SeeAlso     []
291 
292 ***********************************************************************/
Abc_DesFindTopLevelModels(Abc_Des_t * p)293 int Abc_DesFindTopLevelModels( Abc_Des_t * p )
294 {
295     Abc_Ntk_t * pNtk, * pNtkBox;
296     Abc_Obj_t * pObj;
297     int i, k;
298     assert( Vec_PtrSize( p->vModules ) > 0 );
299     // clear the models
300     Vec_PtrForEachEntry( Abc_Ntk_t *, p->vModules, pNtk, i )
301         pNtk->fHieVisited = 0;
302     // mark all the models reachable from other models
303     Vec_PtrForEachEntry( Abc_Ntk_t *, p->vModules, pNtk, i )
304     {
305         Abc_NtkForEachBox( pNtk, pObj, k )
306         {
307             if ( Abc_ObjIsLatch(pObj) )
308                 continue;
309             if ( pObj->pData == NULL )
310                 continue;
311             pNtkBox = (Abc_Ntk_t *)pObj->pData;
312             pNtkBox->fHieVisited = 1;
313         }
314     }
315     // collect the models that are not marked
316     Vec_PtrClear( p->vTops );
317     Vec_PtrForEachEntry( Abc_Ntk_t *, p->vModules, pNtk, i )
318     {
319         if ( pNtk->fHieVisited == 0 )
320             Vec_PtrPush( p->vTops, pNtk );
321         else
322             pNtk->fHieVisited = 0;
323     }
324     return Vec_PtrSize( p->vTops );
325 }
326 
327 
328 /**Function*************************************************************
329 
330   Synopsis    [Derive the AIG of the logic in the netlist.]
331 
332   Description []
333 
334   SideEffects []
335 
336   SeeAlso     []
337 
338 ***********************************************************************/
Abc_NodeStrashUsingNetwork_rec(Abc_Ntk_t * pNtkAig,Abc_Obj_t * pObj)339 void Abc_NodeStrashUsingNetwork_rec( Abc_Ntk_t * pNtkAig, Abc_Obj_t * pObj )
340 {
341     Abc_Obj_t * pFanin;
342     int i;
343     assert( !Abc_ObjIsNet(pObj) );
344     if ( pObj->pCopy )
345         return;
346     // call for the fanins
347     Abc_ObjForEachFanin( pObj, pFanin, i )
348         Abc_NodeStrashUsingNetwork_rec( pNtkAig, Abc_ObjFanin0Ntk(Abc_ObjFanin0(pObj)) );
349     // compute for the node
350     pObj->pCopy = Abc_NodeStrash( pNtkAig, pObj, 0 );
351     // set for the fanout net
352     Abc_ObjFanout0(pObj)->pCopy = pObj->pCopy;
353 }
354 
355 /**Function*************************************************************
356 
357   Synopsis    [Derive the AIG of the logic in the netlist.]
358 
359   Description []
360 
361   SideEffects []
362 
363   SeeAlso     []
364 
365 ***********************************************************************/
Abc_NodeStrashUsingNetwork(Abc_Ntk_t * pNtkAig,Abc_Obj_t * pBox)366 void Abc_NodeStrashUsingNetwork( Abc_Ntk_t * pNtkAig, Abc_Obj_t * pBox )
367 {
368     Abc_Ntk_t * pNtkGate;
369     Abc_Obj_t * pObj;
370     unsigned * pPolarity;
371     int i, fCompl;
372     assert( Abc_ObjIsBox(pBox) );
373     pNtkGate = (Abc_Ntk_t *)pBox->pData;
374     pPolarity = (unsigned *)pBox->pNext;
375     assert( Abc_NtkIsNetlist(pNtkGate) );
376     assert( Abc_NtkLatchNum(pNtkGate) == 0 );
377     Abc_NtkCleanCopy( pNtkGate );
378     // set the PI values
379     Abc_NtkForEachPi( pNtkGate, pObj, i )
380     {
381         fCompl = (pPolarity && Abc_InfoHasBit(pPolarity, i));
382         pObj->pCopy = Abc_ObjNotCond( Abc_ObjFanin(pBox,i)->pCopy, fCompl );
383         Abc_ObjFanout0(pObj)->pCopy = pObj->pCopy;
384     }
385     // build recursively and set the PO values
386     Abc_NtkForEachPo( pNtkGate, pObj, i )
387     {
388         Abc_NodeStrashUsingNetwork_rec( pNtkAig, Abc_ObjFanin0Ntk(Abc_ObjFanin0(pObj)) );
389         Abc_ObjFanout(pBox,i)->pCopy = Abc_ObjFanin0(pObj)->pCopy;
390     }
391 //printf( "processing %d\n", pBox->Id );
392 }
393 
394 ////////////////////////////////////////////////////////////////////////
395 ///                       END OF FILE                                ///
396 ////////////////////////////////////////////////////////////////////////
397 
398 
399 ABC_NAMESPACE_IMPL_END
400 
401