ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
resCore.c
Go to the documentation of this file.
1
20
21#include "base/abc/abc.h"
22#include "resInt.h"
23#include "bool/kit/kit.h"
24#include "sat/bsat/satStore.h"
25
27
28
32
33typedef struct Res_Man_t_ Res_Man_t;
35{
36 // general parameters
38 // specialized manager
39 Res_Win_t * pWin; // windowing manager
40 Abc_Ntk_t * pAig; // the strashed window
41 Res_Sim_t * pSim; // simulation manager
42 Sto_Man_t * pCnf; // the CNF of the SAT problem
43 Int_Man_t * pMan; // interpolation manager;
44 Vec_Int_t * vMem; // memory for intermediate SOPs
45 Vec_Vec_t * vResubs; // resubstitution candidates of the AIG
46 Vec_Vec_t * vResubsW; // resubstitution candidates of the window
47 Vec_Vec_t * vLevels; // levelized structure for updating
48 // statistics
49 int nWins; // the number of windows tried
50 int nWinNodes; // the total number of window nodes
51 int nDivNodes; // the total number of divisors
52 int nWinsTriv; // the total number of trivial windows
53 int nWinsUsed; // the total number of useful windows (with at least one candidate)
54 int nConstsUsed; // the total number of constant nodes under ODC
55 int nCandSets; // the total number of candidates
56 int nProvedSets; // the total number of proved groups
57 int nSimEmpty; // the empty simulation info
58 int nTotalNets; // the total number of nets
59 int nTotalNodes; // the total number of nodess
60 int nTotalNets2; // the total number of nets
61 int nTotalNodes2; // the total number of nodess
62 // runtime
63 abctime timeWin; // windowing
64 abctime timeDiv; // divisors
65 abctime timeAig; // strashing
66 abctime timeSim; // simulation
67 abctime timeCand; // resubstitution candidates
68 abctime timeSatTotal; // SAT solving total
69 abctime timeSatSat; // SAT solving (sat calls)
70 abctime timeSatUnsat; // SAT solving (unsat calls)
71 abctime timeSatSim; // SAT solving (simulation)
72 abctime timeInt; // interpolation
73 abctime timeUpd; // updating
74 abctime timeTotal; // total runtime
75};
76
77extern Hop_Obj_t * Kit_GraphToHop( Hop_Man_t * pMan, Kit_Graph_t * pGraph );
78
79extern abctime s_ResynTime;
80
84
97{
98 Res_Man_t * p;
99 p = ABC_ALLOC( Res_Man_t, 1 );
100 memset( p, 0, sizeof(Res_Man_t) );
101 assert( pPars->nWindow > 0 && pPars->nWindow < 100 );
102 assert( pPars->nCands > 0 && pPars->nCands < 100 );
103 p->pPars = pPars;
104 p->pWin = Res_WinAlloc();
105 p->pSim = Res_SimAlloc( pPars->nSimWords );
106 p->pMan = Int_ManAlloc();
107 p->vMem = Vec_IntAlloc( 0 );
108 p->vResubs = Vec_VecStart( pPars->nCands );
109 p->vResubsW = Vec_VecStart( pPars->nCands );
110 p->vLevels = Vec_VecStart( 32 );
111 return p;
112}
113
126{
127 if ( p->pPars->fVerbose )
128 {
129 printf( "Reduction in nodes = %5d. (%.2f %%) ",
130 p->nTotalNodes-p->nTotalNodes2,
131 100.0*(p->nTotalNodes-p->nTotalNodes2)/p->nTotalNodes );
132 printf( "Reduction in edges = %5d. (%.2f %%) ",
133 p->nTotalNets-p->nTotalNets2,
134 100.0*(p->nTotalNets-p->nTotalNets2)/p->nTotalNets );
135 printf( "\n" );
136
137 printf( "Winds = %d. ", p->nWins );
138 printf( "Nodes = %d. (Ave = %5.1f) ", p->nWinNodes, 1.0*p->nWinNodes/p->nWins );
139 printf( "Divs = %d. (Ave = %5.1f) ", p->nDivNodes, 1.0*p->nDivNodes/p->nWins );
140 printf( "\n" );
141 printf( "WinsTriv = %d. ", p->nWinsTriv );
142 printf( "SimsEmpt = %d. ", p->nSimEmpty );
143 printf( "Const = %d. ", p->nConstsUsed );
144 printf( "WindUsed = %d. ", p->nWinsUsed );
145 printf( "Cands = %d. ", p->nCandSets );
146 printf( "Proved = %d.", p->nProvedSets );
147 printf( "\n" );
148
149 ABC_PRTP( "Windowing ", p->timeWin, p->timeTotal );
150 ABC_PRTP( "Divisors ", p->timeDiv, p->timeTotal );
151 ABC_PRTP( "Strashing ", p->timeAig, p->timeTotal );
152 ABC_PRTP( "Simulation ", p->timeSim, p->timeTotal );
153 ABC_PRTP( "Candidates ", p->timeCand, p->timeTotal );
154 ABC_PRTP( "SAT solver ", p->timeSatTotal, p->timeTotal );
155 ABC_PRTP( " sat ", p->timeSatSat, p->timeTotal );
156 ABC_PRTP( " unsat ", p->timeSatUnsat, p->timeTotal );
157 ABC_PRTP( " simul ", p->timeSatSim, p->timeTotal );
158 ABC_PRTP( "Interpol ", p->timeInt, p->timeTotal );
159 ABC_PRTP( "Undating ", p->timeUpd, p->timeTotal );
160 ABC_PRTP( "TOTAL ", p->timeTotal, p->timeTotal );
161 }
162 Res_WinFree( p->pWin );
163 if ( p->pAig ) Abc_NtkDelete( p->pAig );
164 Res_SimFree( p->pSim );
165 if ( p->pCnf ) Sto_ManFree( p->pCnf );
166 Int_ManFree( p->pMan );
167 Vec_IntFree( p->vMem );
168 Vec_VecFree( p->vResubs );
169 Vec_VecFree( p->vResubsW );
170 Vec_VecFree( p->vLevels );
171 ABC_FREE( p );
172}
173
185void Res_UpdateNetwork( Abc_Obj_t * pObj, Vec_Ptr_t * vFanins, Hop_Obj_t * pFunc, Vec_Vec_t * vLevels )
186{
187 Abc_Obj_t * pObjNew, * pFanin;
188 int k;
189
190 // create the new node
191 pObjNew = Abc_NtkCreateNode( pObj->pNtk );
192 pObjNew->pData = pFunc;
193 Vec_PtrForEachEntry( Abc_Obj_t *, vFanins, pFanin, k )
194 Abc_ObjAddFanin( pObjNew, pFanin );
195 // replace the old node by the new node
196//printf( "Replacing node " ); Abc_ObjPrint( stdout, pObj );
197//printf( "Inserting node " ); Abc_ObjPrint( stdout, pObjNew );
198 // update the level of the node
199 Abc_NtkUpdate( pObj, pObjNew, vLevels );
200}
201
214{
215 ProgressBar * pProgress;
216 Res_Man_t * p;
217 Abc_Obj_t * pObj;
218 Hop_Obj_t * pFunc;
219 Kit_Graph_t * pGraph;
220 Vec_Ptr_t * vFanins;
221 unsigned * puTruth;
222 int i, k, RetValue, nNodesOld, nFanins, nFaninsMax;
223 abctime clk, clkTotal = Abc_Clock();
224
225 // start the manager
226 p = Res_ManAlloc( pPars );
227 p->nTotalNets = Abc_NtkGetTotalFanins(pNtk);
228 p->nTotalNodes = Abc_NtkNodeNum(pNtk);
229 nFaninsMax = Abc_NtkGetFaninMax(pNtk);
230 if ( nFaninsMax > 8 )
231 nFaninsMax = 8;
232
233 // perform the network sweep
234 Abc_NtkSweep( pNtk, 0 );
235
236 // convert into the AIG
237 if ( !Abc_NtkToAig(pNtk) )
238 {
239 fprintf( stdout, "Converting to BDD has failed.\n" );
240 Res_ManFree( p );
241 return 0;
242 }
243 assert( Abc_NtkHasAig(pNtk) );
244
245 // set the number of levels
246 Abc_NtkLevel( pNtk );
247 Abc_NtkStartReverseLevels( pNtk, pPars->nGrowthLevel );
248
249 // try resynthesizing nodes in the topological order
250 nNodesOld = Abc_NtkObjNumMax(pNtk);
251 pProgress = Extra_ProgressBarStart( stdout, nNodesOld );
252 Abc_NtkForEachObj( pNtk, pObj, i )
253 {
254 Extra_ProgressBarUpdate( pProgress, i, NULL );
255 if ( !Abc_ObjIsNode(pObj) )
256 continue;
257 if ( Abc_ObjFaninNum(pObj) > 8 )
258 continue;
259 if ( pObj->Id > nNodesOld )
260 break;
261
262 // create the window for this node
263clk = Abc_Clock();
264 RetValue = Res_WinCompute( pObj, p->pPars->nWindow/10, p->pPars->nWindow%10, p->pWin );
265p->timeWin += Abc_Clock() - clk;
266 if ( !RetValue )
267 continue;
268 p->nWinsTriv += Res_WinIsTrivial( p->pWin );
269
270 if ( p->pPars->fVeryVerbose )
271 {
272 printf( "%5d (lev=%2d) : ", pObj->Id, pObj->Level );
273 printf( "Win = %3d/%3d/%4d/%3d ",
274 Vec_PtrSize(p->pWin->vLeaves),
275 Vec_PtrSize(p->pWin->vBranches),
276 Vec_PtrSize(p->pWin->vNodes),
277 Vec_PtrSize(p->pWin->vRoots) );
278 }
279
280 // collect the divisors
281clk = Abc_Clock();
282 Res_WinDivisors( p->pWin, Abc_ObjRequiredLevel(pObj) - 1 );
283p->timeDiv += Abc_Clock() - clk;
284
285 p->nWins++;
286 p->nWinNodes += Vec_PtrSize(p->pWin->vNodes);
287 p->nDivNodes += Vec_PtrSize( p->pWin->vDivs);
288
289 if ( p->pPars->fVeryVerbose )
290 {
291 printf( "D = %3d ", Vec_PtrSize(p->pWin->vDivs) );
292 printf( "D+ = %3d ", p->pWin->nDivsPlus );
293 }
294
295 // create the AIG for the window
296clk = Abc_Clock();
297 if ( p->pAig ) Abc_NtkDelete( p->pAig );
298 p->pAig = Res_WndStrash( p->pWin );
299p->timeAig += Abc_Clock() - clk;
300
301 if ( p->pPars->fVeryVerbose )
302 {
303 printf( "AIG = %4d ", Abc_NtkNodeNum(p->pAig) );
304 printf( "\n" );
305 }
306
307 // prepare simulation info
308clk = Abc_Clock();
309 RetValue = Res_SimPrepare( p->pSim, p->pAig, Vec_PtrSize(p->pWin->vLeaves), 0 ); //p->pPars->fVerbose );
310p->timeSim += Abc_Clock() - clk;
311 if ( !RetValue )
312 {
313 p->nSimEmpty++;
314 continue;
315 }
316
317 // consider the case of constant node
318 if ( p->pSim->fConst0 || p->pSim->fConst1 )
319 {
320 p->nConstsUsed++;
321
322 pFunc = p->pSim->fConst1? Hop_ManConst1((Hop_Man_t *)pNtk->pManFunc) : Hop_ManConst0((Hop_Man_t *)pNtk->pManFunc);
323 vFanins = Vec_VecEntry( p->vResubsW, 0 );
324 Vec_PtrClear( vFanins );
325 Res_UpdateNetwork( pObj, vFanins, pFunc, p->vLevels );
326 continue;
327 }
328
329// printf( " " );
330
331 // find resub candidates for the node
332clk = Abc_Clock();
333 if ( p->pPars->fArea )
334 RetValue = Res_FilterCandidates( p->pWin, p->pAig, p->pSim, p->vResubs, p->vResubsW, nFaninsMax, 1 );
335 else
336 RetValue = Res_FilterCandidates( p->pWin, p->pAig, p->pSim, p->vResubs, p->vResubsW, nFaninsMax, 0 );
337p->timeCand += Abc_Clock() - clk;
338 p->nCandSets += RetValue;
339 if ( RetValue == 0 )
340 continue;
341
342// printf( "%d(%d) ", Vec_PtrSize(p->pWin->vDivs), RetValue );
343
344 p->nWinsUsed++;
345
346 // iterate through candidate resubstitutions
347 Vec_VecForEachLevel( p->vResubs, vFanins, k )
348 {
349 if ( Vec_PtrSize(vFanins) == 0 )
350 break;
351
352 // solve the SAT problem and get clauses
353clk = Abc_Clock();
354 if ( p->pCnf ) Sto_ManFree( p->pCnf );
355 p->pCnf = (Sto_Man_t *)Res_SatProveUnsat( p->pAig, vFanins );
356 if ( p->pCnf == NULL )
357 {
358p->timeSatSat += Abc_Clock() - clk;
359// printf( " Sat\n" );
360// printf( "-" );
361 continue;
362 }
363p->timeSatUnsat += Abc_Clock() - clk;
364// printf( "+" );
365
366 p->nProvedSets++;
367// printf( " Unsat\n" );
368// continue;
369// printf( "Proved %d.\n", k );
370
371 // write it into a file
372// Sto_ManDumpClauses( p->pCnf, "trace.cnf" );
373
374 // interpolate the problem if it was UNSAT
375clk = Abc_Clock();
376 nFanins = Int_ManInterpolate( p->pMan, p->pCnf, 0, &puTruth );
377p->timeInt += Abc_Clock() - clk;
378 if ( nFanins != Vec_PtrSize(vFanins) - 2 )
379 continue;
380 assert( puTruth );
381// Extra_PrintBinary( stdout, puTruth, 1 << nFanins ); printf( "\n" );
382
383 // transform interpolant into the AIG
384 pGraph = Kit_TruthToGraph( puTruth, nFanins, p->vMem );
385
386 // derive the AIG for the decomposition tree
387 pFunc = Kit_GraphToHop( (Hop_Man_t *)pNtk->pManFunc, pGraph );
388 Kit_GraphFree( pGraph );
389
390 // update the network
391clk = Abc_Clock();
392 Res_UpdateNetwork( pObj, Vec_VecEntry(p->vResubsW, k), pFunc, p->vLevels );
393p->timeUpd += Abc_Clock() - clk;
394 break;
395 }
396// printf( "\n" );
397 }
398 Extra_ProgressBarStop( pProgress );
400
401p->timeSatSim += p->pSim->timeSat;
402p->timeSatTotal = p->timeSatSat + p->timeSatUnsat + p->timeSatSim;
403
404 p->nTotalNets2 = Abc_NtkGetTotalFanins(pNtk);
405 p->nTotalNodes2 = Abc_NtkNodeNum(pNtk);
406
407 // quit resubstitution manager
408p->timeTotal = Abc_Clock() - clkTotal;
409 Res_ManFree( p );
410
411s_ResynTime += Abc_Clock() - clkTotal;
412 // check the resulting network
413 if ( !Abc_NtkCheck( pNtk ) )
414 {
415 fprintf( stdout, "Abc_NtkResynthesize(): Network check has failed.\n" );
416 return 0;
417 }
418 return 1;
419}
420
424
425
427
abctime s_ResynTime
Definition abcPrint.c:50
ABC_DLL int Abc_NtkSweep(Abc_Ntk_t *pNtk, int fVerbose)
Definition abcSweep.c:692
struct Abc_Obj_t_ Abc_Obj_t
Definition abc.h:116
ABC_DLL int Abc_NtkGetFaninMax(Abc_Ntk_t *pNtk)
Definition abcUtil.c:486
ABC_DLL void Abc_ObjAddFanin(Abc_Obj_t *pObj, Abc_Obj_t *pFanin)
Definition abcFanio.c:84
ABC_DLL int Abc_ObjRequiredLevel(Abc_Obj_t *pObj)
Definition abcTiming.c:1214
ABC_DLL int Abc_NtkCheck(Abc_Ntk_t *pNtk)
FUNCTION DEFINITIONS ///.
Definition abcCheck.c:64
#define Abc_NtkForEachObj(pNtk, pObj, i)
ITERATORS ///.
Definition abc.h:449
ABC_DLL void Abc_NtkUpdate(Abc_Obj_t *pObj, Abc_Obj_t *pObjNew, Vec_Vec_t *vLevels)
Definition abcTiming.c:1423
struct Abc_Ntk_t_ Abc_Ntk_t
Definition abc.h:115
ABC_DLL void Abc_NtkStopReverseLevels(Abc_Ntk_t *pNtk)
Definition abcTiming.c:1302
ABC_DLL int Abc_NtkLevel(Abc_Ntk_t *pNtk)
Definition abcDfs.c:1449
ABC_DLL void Abc_NtkStartReverseLevels(Abc_Ntk_t *pNtk, int nMaxLevelIncrease)
Definition abcTiming.c:1274
ABC_DLL int Abc_NtkToAig(Abc_Ntk_t *pNtk)
Definition abcFunc.c:1333
ABC_DLL void Abc_NtkDelete(Abc_Ntk_t *pNtk)
Definition abcNtk.c:1421
ABC_DLL int Abc_NtkGetTotalFanins(Abc_Ntk_t *pNtk)
Definition abcUtil.c:520
ABC_INT64_T abctime
Definition abc_global.h:332
#define ABC_ALLOC(type, num)
Definition abc_global.h:264
#define ABC_PRTP(a, t, T)
Definition abc_global.h:258
#define ABC_FREE(obj)
Definition abc_global.h:267
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Definition bblif.c:37
ABC_NAMESPACE_IMPL_START typedef char ProgressBar
Definition bbrNtbdd.c:27
Cube * p
Definition exorList.c:222
void Extra_ProgressBarStop(ProgressBar *p)
ProgressBar * Extra_ProgressBarStart(FILE *pFile, int nItemsTotal)
FUNCTION DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Hop_Man_t_ Hop_Man_t
INCLUDES ///.
Definition hop.h:49
struct Hop_Obj_t_ Hop_Obj_t
Definition hop.h:50
struct Kit_Graph_t_ Kit_Graph_t
Definition kit.h:88
void Kit_GraphFree(Kit_Graph_t *pGraph)
Definition kitGraph.c:132
Kit_Graph_t * Kit_TruthToGraph(unsigned *pTruth, int nVars, Vec_Int_t *vMemory)
Definition kitGraph.c:356
typedefABC_NAMESPACE_IMPL_START struct Res_Man_t_ Res_Man_t
DECLARATIONS ///.
Definition resCore.c:33
void Res_ManFree(Res_Man_t *p)
Definition resCore.c:125
int Abc_NtkResynthesize(Abc_Ntk_t *pNtk, Res_Par_t *pPars)
MACRO DEFINITIONS ///.
Definition resCore.c:213
Hop_Obj_t * Kit_GraphToHop(Hop_Man_t *pMan, Kit_Graph_t *pGraph)
Definition kitHop.c:261
Res_Man_t * Res_ManAlloc(Res_Par_t *pPars)
FUNCTION DEFINITIONS ///.
Definition resCore.c:96
void Res_UpdateNetwork(Abc_Obj_t *pObj, Vec_Ptr_t *vFanins, Hop_Obj_t *pFunc, Vec_Vec_t *vLevels)
Definition resCore.c:185
void Res_WinDivisors(Res_Win_t *p, int nLevDivMax)
FUNCTION DEFINITIONS ///.
Definition resDivs.c:48
int Res_FilterCandidates(Res_Win_t *pWin, Abc_Ntk_t *pAig, Res_Sim_t *pSim, Vec_Vec_t *vResubs, Vec_Vec_t *vResubsW, int nFaninsMax, int fArea)
FUNCTION DEFINITIONS ///.
Definition resFilter.c:49
void Res_SimFree(Res_Sim_t *p)
Definition resSim.c:127
struct Res_Sim_t_ Res_Sim_t
Definition resInt.h:69
int Res_SimPrepare(Res_Sim_t *p, Abc_Ntk_t *pAig, int nTruePis, int fVerbose)
Definition resSim.c:731
typedefABC_NAMESPACE_HEADER_START struct Res_Win_t_ Res_Win_t
INCLUDES ///.
Definition resInt.h:44
void * Res_SatProveUnsat(Abc_Ntk_t *pAig, Vec_Ptr_t *vFanins)
FUNCTION DEFINITIONS ///.
Definition resSat.c:52
int Res_WinIsTrivial(Res_Win_t *p)
Definition resWin.c:435
Abc_Ntk_t * Res_WndStrash(Res_Win_t *p)
FUNCTION DEFINITIONS ///.
Definition resStrash.c:49
int Res_WinCompute(Abc_Obj_t *pNode, int nWinTfiMax, int nWinTfoMax, Res_Win_t *p)
Definition resWin.c:451
void Res_WinFree(Res_Win_t *p)
Definition resWin.c:76
Res_Win_t * Res_WinAlloc()
DECLARATIONS ///.
Definition resWin.c:46
Res_Sim_t * Res_SimAlloc(int nWords)
DECLARATIONS ///.
Definition resSim.c:46
typedefABC_NAMESPACE_HEADER_START struct Res_Par_t_ Res_Par_t
INCLUDES ///.
Definition res.h:42
void Int_ManFree(Int_Man_t *p)
Definition satInter.c:273
Int_Man_t * Int_ManAlloc()
FUNCTION DEFINITIONS ///.
Definition satInter.c:107
int Int_ManInterpolate(Int_Man_t *p, Sto_Man_t *pCnf, int fVerbose, unsigned **ppResult)
Definition satInter.c:1005
void Sto_ManFree(Sto_Man_t *p)
Definition satStore.c:143
struct Sto_Man_t_ Sto_Man_t
Definition satStore.h:81
struct Int_Man_t_ Int_Man_t
Definition satStore.h:123
void * pManFunc
Definition abc.h:191
void * pData
Definition abc.h:145
Abc_Ntk_t * pNtk
Definition abc.h:130
int Id
Definition abc.h:132
unsigned Level
Definition abc.h:142
Res_Win_t * pWin
Definition resCore.c:39
int nTotalNodes
Definition resCore.c:59
abctime timeAig
Definition resCore.c:65
int nDivNodes
Definition resCore.c:51
abctime timeTotal
Definition resCore.c:74
int nWinNodes
Definition resCore.c:50
Vec_Vec_t * vLevels
Definition resCore.c:47
int nProvedSets
Definition resCore.c:56
abctime timeInt
Definition resCore.c:72
int nWins
Definition resCore.c:49
abctime timeSatUnsat
Definition resCore.c:70
abctime timeCand
Definition resCore.c:67
Vec_Vec_t * vResubs
Definition resCore.c:45
int nTotalNets2
Definition resCore.c:60
abctime timeSim
Definition resCore.c:66
Int_Man_t * pMan
Definition resCore.c:43
abctime timeUpd
Definition resCore.c:73
abctime timeDiv
Definition resCore.c:64
int nWinsTriv
Definition resCore.c:52
Res_Par_t * pPars
Definition resCore.c:37
int nWinsUsed
Definition resCore.c:53
Vec_Int_t * vMem
Definition resCore.c:44
abctime timeWin
Definition resCore.c:63
int nSimEmpty
Definition resCore.c:57
abctime timeSatTotal
Definition resCore.c:68
int nCandSets
Definition resCore.c:55
int nConstsUsed
Definition resCore.c:54
Vec_Vec_t * vResubsW
Definition resCore.c:46
abctime timeSatSim
Definition resCore.c:71
abctime timeSatSat
Definition resCore.c:69
Sto_Man_t * pCnf
Definition resCore.c:42
int nTotalNodes2
Definition resCore.c:61
Res_Sim_t * pSim
Definition resCore.c:41
int nTotalNets
Definition resCore.c:58
Abc_Ntk_t * pAig
Definition resCore.c:40
#define assert(ex)
Definition util_old.h:213
char * memset()
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
Definition vecPtr.h:42
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.
Definition vecPtr.h:55
#define Vec_VecForEachLevel(vGlob, vVec, i)
MACRO DEFINITIONS ///.
Definition vecVec.h:55
typedefABC_NAMESPACE_HEADER_START struct Vec_Vec_t_ Vec_Vec_t
INCLUDES ///.
Definition vecVec.h:42