ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
abcQbf.c File Reference
#include "base/abc/abc.h"
#include "sat/cnf/cnf.h"
Include dependency graph for abcQbf.c:

Go to the source code of this file.

Functions

int Abc_NtkDSat (Abc_Ntk_t *pNtk, ABC_INT64_T nConfLimit, ABC_INT64_T nInsLimit, int nLearnedStart, int nLearnedDelta, int nLearnedPerce, int fAlignPol, int fAndOuts, int fNewSolver, int fVerbose)
 
void Abc_NtkQbf (Abc_Ntk_t *pNtk, int nPars, int nItersMax, int fDumpCnf, int fVerbose)
 FUNCTION DEFINITIONS ///.
 

Function Documentation

◆ Abc_NtkDSat()

int Abc_NtkDSat ( Abc_Ntk_t * pNtk,
ABC_INT64_T nConfLimit,
ABC_INT64_T nInsLimit,
int nLearnedStart,
int nLearnedDelta,
int nLearnedPerce,
int fAlignPol,
int fAndOuts,
int fNewSolver,
int fVerbose )
extern

Function*************************************************************

Synopsis [Solves combinational miter using a SAT solver.]

Description []

SideEffects []

SeeAlso []

Definition at line 1915 of file abcDar.c.

1916{
1917 Aig_Man_t * pMan;
1918 int RetValue;//, clk = Abc_Clock();
1919 assert( Abc_NtkIsStrash(pNtk) );
1920 assert( Abc_NtkLatchNum(pNtk) == 0 );
1921// assert( Abc_NtkPoNum(pNtk) == 1 );
1922 pMan = Abc_NtkToDar( pNtk, 0, 0 );
1923 RetValue = Fra_FraigSat( pMan, nConfLimit, nInsLimit, nLearnedStart, nLearnedDelta, nLearnedPerce, fAlignPol, fAndOuts, fNewSolver, fVerbose );
1924 pNtk->pModel = (int *)pMan->pData, pMan->pData = NULL;
1925 Aig_ManStop( pMan );
1926 return RetValue;
1927}
Aig_Man_t * Abc_NtkToDar(Abc_Ntk_t *pNtk, int fExors, int fRegisters)
DECLARATIONS ///.
Definition abcDar.c:237
void Aig_ManStop(Aig_Man_t *p)
Definition aigMan.c:187
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
Definition aig.h:50
int Fra_FraigSat(Aig_Man_t *pMan, ABC_INT64_T nConfLimit, ABC_INT64_T nInsLimit, int nLearnedStart, int nLearnedDelta, int nLearnedPerce, int fFlipBits, int fAndOuts, int fNewSolver, int fVerbose)
ITERATORS ///.
Definition fraCec.c:47
int * pModel
Definition abc.h:198
#define assert(ex)
Definition util_old.h:213
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Abc_NtkQbf()

void Abc_NtkQbf ( Abc_Ntk_t * pNtk,
int nPars,
int nItersMax,
int fDumpCnf,
int fVerbose )

FUNCTION DEFINITIONS ///.

Function*************************************************************

Synopsis [Solve the QBF problem EpAx[M(p,x)].]

Description [Variables p go first, followed by variable x. The number of parameters is nPars. The miter is in pNtk. The miter expresses EQUALITY of the implementation and spec.]

SideEffects []

SeeAlso []

Definition at line 64 of file abcQbf.c.

65{
66 Abc_Ntk_t * pNtkVer, * pNtkSyn, * pNtkSyn2, * pNtkTemp;
67 Vec_Int_t * vPiValues;
68 abctime clkTotal = Abc_Clock(), clkS, clkV;
69 int nIters, nInputs, RetValue, fFound = 0;
70
71 assert( Abc_NtkIsStrash(pNtk) );
72 assert( Abc_NtkIsComb(pNtk) );
73 assert( Abc_NtkPoNum(pNtk) == 1 );
74 assert( nPars > 0 && nPars < Abc_NtkPiNum(pNtk) );
75// assert( Abc_NtkPiNum(pNtk)-nPars < 32 );
76 nInputs = Abc_NtkPiNum(pNtk) - nPars;
77
78 if ( fDumpCnf )
79 {
80 // original problem: \exists p \forall x \exists y. M(p,x,y)
81 // negated problem: \forall p \exists x \exists y. !M(p,x,y)
82 extern Aig_Man_t * Abc_NtkToDar( Abc_Ntk_t * pNtk, int fExors, int fRegisters );
83 Aig_Man_t * pMan = Abc_NtkToDar( pNtk, 0, 0 );
84 Cnf_Dat_t * pCnf = Cnf_Derive( pMan, 0 );
85 Vec_Int_t * vVarMap, * vForAlls, * vExists;
86 Aig_Obj_t * pObj;
87 char * pFileName;
88 int i, Entry;
89 // create var map
90 vVarMap = Vec_IntStart( pCnf->nVars );
91 Aig_ManForEachCi( pMan, pObj, i )
92 if ( i < nPars )
93 Vec_IntWriteEntry( vVarMap, pCnf->pVarNums[Aig_ObjId(pObj)], 1 );
94 // create various maps
95 vForAlls = Vec_IntAlloc( nPars );
96 vExists = Vec_IntAlloc( Abc_NtkPiNum(pNtk) - nPars );
97 Vec_IntForEachEntry( vVarMap, Entry, i )
98 if ( Entry )
99 Vec_IntPush( vForAlls, i );
100 else
101 Vec_IntPush( vExists, i );
102 // generate CNF
103 pFileName = Extra_FileNameGenericAppend( pNtk->pSpec, ".qdimacs" );
104 Cnf_DataWriteIntoFile( pCnf, pFileName, 0, vForAlls, vExists );
105 Aig_ManStop( pMan );
106 Cnf_DataFree( pCnf );
107 Vec_IntFree( vForAlls );
108 Vec_IntFree( vExists );
109 Vec_IntFree( vVarMap );
110 printf( "The 2QBF formula was written into file \"%s\".\n", pFileName );
111 return;
112 }
113
114 // initialize the synthesized network with 0000-combination
115 vPiValues = Vec_IntStart( Abc_NtkPiNum(pNtk) );
116
117 // create random init value
118 {
119 int i;
120 srand( time(NULL) );
121 for ( i = nPars; i < Abc_NtkPiNum(pNtk); i++ )
122 Vec_IntWriteEntry( vPiValues, i, rand() & 1 );
123 }
124
125 Abc_NtkVectorClearPars( vPiValues, nPars );
126 pNtkSyn = Abc_NtkMiterCofactor( pNtk, vPiValues );
127 if ( fVerbose )
128 {
129 printf( "Iter %2d : ", 0 );
130 printf( "AIG = %6d ", Abc_NtkNodeNum(pNtkSyn) );
131 Abc_NtkVectorPrintVars( pNtk, vPiValues, nPars );
132 printf( "\n" );
133 }
134
135 // iteratively solve
136 for ( nIters = 0; nIters < nItersMax; nIters++ )
137 {
138 // solve the synthesis instance
139clkS = Abc_Clock();
140// RetValue = Abc_NtkMiterSat( pNtkSyn, 0, 0, 0, NULL, NULL );
141 RetValue = Abc_NtkDSat( pNtkSyn, (ABC_INT64_T)0, (ABC_INT64_T)0, 0, 0, 0, 1, 0, 0, 0 );
142clkS = Abc_Clock() - clkS;
143 if ( RetValue == 0 )
144 Abc_NtkModelToVector( pNtkSyn, vPiValues );
145 if ( RetValue == 1 )
146 {
147 break;
148 }
149 if ( RetValue == -1 )
150 {
151 printf( "Synthesis timed out.\n" );
152 break;
153 }
154 // there is a counter-example
155
156 // construct the verification instance
157 Abc_NtkVectorClearVars( pNtk, vPiValues, nPars );
158 pNtkVer = Abc_NtkMiterCofactor( pNtk, vPiValues );
159 // complement the output
160 Abc_ObjXorFaninC( Abc_NtkPo(pNtkVer,0), 0 );
161
162 // solve the verification instance
163clkV = Abc_Clock();
164 RetValue = Abc_NtkMiterSat( pNtkVer, 0, 0, 0, NULL, NULL );
165clkV = Abc_Clock() - clkV;
166 if ( RetValue == 0 )
167 Abc_NtkModelToVector( pNtkVer, vPiValues );
168 Abc_NtkDelete( pNtkVer );
169 if ( RetValue == 1 )
170 {
171 fFound = 1;
172 break;
173 }
174 if ( RetValue == -1 )
175 {
176 printf( "Verification timed out.\n" );
177 break;
178 }
179 // there is a counter-example
180
181 // create a new synthesis network
182 Abc_NtkVectorClearPars( vPiValues, nPars );
183 pNtkSyn2 = Abc_NtkMiterCofactor( pNtk, vPiValues );
184 // add to the synthesis instance
185 pNtkSyn = Abc_NtkMiterAnd( pNtkTemp = pNtkSyn, pNtkSyn2, 0, 0 );
186 Abc_NtkDelete( pNtkSyn2 );
187 Abc_NtkDelete( pNtkTemp );
188
189 if ( fVerbose )
190 {
191 printf( "Iter %2d : ", nIters+1 );
192 printf( "AIG = %6d ", Abc_NtkNodeNum(pNtkSyn) );
193 Abc_NtkVectorPrintVars( pNtk, vPiValues, nPars );
194 printf( " " );
195 ABC_PRT( "Syn", clkS );
196// ABC_PRT( "Ver", clkV );
197 }
198 }
199 Abc_NtkDelete( pNtkSyn );
200 // report the results
201 if ( fFound )
202 {
203 int nZeros = Vec_IntCountZero( vPiValues );
204 printf( "Parameters: " );
205 Abc_NtkVectorPrintPars( vPiValues, nPars );
206 printf( " Statistics: 0=%d 1=%d\n", nZeros, nPars - nZeros );
207 printf( "Solved after %d iterations. ", nIters );
208 }
209 else if ( nIters == nItersMax )
210 printf( "Quit after %d iterations. ", nItersMax );
211 else
212 printf( "Implementation does not exist. " );
213 ABC_PRT( "Total runtime", Abc_Clock() - clkTotal );
214 Vec_IntFree( vPiValues );
215}
int Abc_NtkDSat(Abc_Ntk_t *pNtk, ABC_INT64_T nConfLimit, ABC_INT64_T nInsLimit, int nLearnedStart, int nLearnedDelta, int nLearnedPerce, int fAlignPol, int fAndOuts, int fNewSolver, int fVerbose)
Definition abcDar.c:1915
ABC_DLL Abc_Ntk_t * Abc_NtkMiterCofactor(Abc_Ntk_t *pNtk, Vec_Int_t *vPiValues)
Definition abcMiter.c:450
struct Abc_Ntk_t_ Abc_Ntk_t
Definition abc.h:115
ABC_DLL int Abc_NtkMiterSat(Abc_Ntk_t *pNtk, ABC_INT64_T nConfLimit, ABC_INT64_T nInsLimit, int fVerbose, ABC_INT64_T *pNumConfs, ABC_INT64_T *pNumInspects)
FUNCTION DEFINITIONS ///.
Definition abcSat.c:58
ABC_DLL Abc_Ntk_t * Abc_NtkMiterAnd(Abc_Ntk_t *pNtk1, Abc_Ntk_t *pNtk2, int fOr, int fCompl2)
Definition abcMiter.c:387
ABC_DLL void Abc_NtkDelete(Abc_Ntk_t *pNtk)
Definition abcNtk.c:1421
ABC_INT64_T abctime
Definition abc_global.h:332
#define ABC_PRT(a, t)
Definition abc_global.h:255
#define Aig_ManForEachCi(p, pObj, i)
ITERATORS ///.
Definition aig.h:393
struct Aig_Obj_t_ Aig_Obj_t
Definition aig.h:51
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Definition bblif.c:37
Cnf_Dat_t * Cnf_Derive(Aig_Man_t *pAig, int nOutputs)
Definition cnfCore.c:165
struct Cnf_Dat_t_ Cnf_Dat_t
Definition cnf.h:52
void Cnf_DataFree(Cnf_Dat_t *p)
Definition cnfMan.c:207
void Cnf_DataWriteIntoFile(Cnf_Dat_t *p, char *pFileName, int fReadable, Vec_Int_t *vForAlls, Vec_Int_t *vExists)
Definition cnfMan.c:387
char * Extra_FileNameGenericAppend(char *pBase, char *pSuffix)
Aig_Man_t * Abc_NtkToDar(Abc_Ntk_t *pNtk, int fExors, int fRegisters)
Definition abcDar.c:237
char * pSpec
Definition abc.h:159
int nVars
Definition cnf.h:59
int * pVarNums
Definition cnf.h:63
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
Definition vecInt.h:54
Here is the call graph for this function: