ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
saigOutDec.c
Go to the documentation of this file.
1
20
21#include "saig.h"
22#include "sat/cnf/cnf.h"
23#include "sat/bsat/satSolver.h"
24
26
27
31
35
47Vec_Ptr_t * Saig_ManFindPrimes( Aig_Man_t * pAig, int nLits, int fVerbose )
48{
49 Cnf_Dat_t * pCnf;
50 sat_solver * pSat;
51 Aig_Obj_t * pObj0, * pObj1, * pRoot, * pMiter;
52 Vec_Ptr_t * vPrimes, * vNodes;
53 Vec_Int_t * vCube, * vMarks;
54 int i0, i1, m, RetValue, Lits[10];
55 int fCompl0, fCompl1, nNodes1, nNodes2;
56 assert( nLits == 1 || nLits == 2 );
57 assert( nLits < 10 );
58
59 // create SAT solver
60 pCnf = Cnf_DeriveSimple( pAig, Aig_ManCoNum(pAig) );
61 pSat = (sat_solver *)Cnf_DataWriteIntoSolver( pCnf, 1, 0 );
62
63 // collect nodes in the property output cone
64 pMiter = Aig_ManCo( pAig, 0 );
65 pRoot = Aig_ObjFanin0( pMiter );
66 vNodes = Aig_ManDfsNodes( pAig, &pRoot, 1 );
67 // sort nodes by level and remove the last few
68
69 // try single nodes
70 vPrimes = Vec_PtrAlloc( 100 );
71 // create assumptions
72 vMarks = Vec_IntStart( Vec_PtrSize(vNodes) );
73 Lits[0] = toLitCond( pCnf->pVarNums[Aig_ObjId(pMiter)], 1 );
74 Vec_PtrForEachEntry( Aig_Obj_t *, vNodes, pObj0, i0 )
75 if ( pObj0 != pRoot )
76 {
77 // create assumptions
78 Lits[1] = toLitCond( pCnf->pVarNums[Aig_ObjId(pObj0)], pObj0->fPhase );
79 // solve the problem
80 RetValue = sat_solver_solve( pSat, Lits, Lits+2, (ABC_INT64_T)0, (ABC_INT64_T)0, (ABC_INT64_T)0, (ABC_INT64_T)0 );
81 if ( RetValue == l_False )
82 {
83 vCube = Vec_IntAlloc( 1 );
84 Vec_IntPush( vCube, toLitCond(Aig_ObjId(pObj0), pObj0->fPhase) );
85 Vec_PtrPush( vPrimes, vCube );
86 if ( fVerbose )
87 printf( "Adding prime %d%c\n", Aig_ObjId(pObj0), pObj0->fPhase?'-':'+' );
88 Vec_IntWriteEntry( vMarks, i0, 1 );
89 }
90 }
91 nNodes1 = Vec_PtrSize(vPrimes);
92 if ( nLits > 1 )
93 {
94 // try adding second literal
95 Vec_PtrForEachEntry( Aig_Obj_t *, vNodes, pObj0, i0 )
96 if ( pObj0 != pRoot )
97 Vec_PtrForEachEntryStart( Aig_Obj_t *, vNodes, pObj1, i1, i0+1 )
98 if ( pObj1 != pRoot )
99 {
100 if ( Vec_IntEntry(vMarks,i0) || Vec_IntEntry(vMarks,i1) )
101 continue;
102 for ( m = 0; m < 3; m++ )
103 {
104 fCompl0 = m & 1;
105 fCompl1 = (m >> 1) & 1;
106 // create assumptions
107 Lits[1] = toLitCond( pCnf->pVarNums[Aig_ObjId(pObj0)], fCompl0 ^ pObj0->fPhase );
108 Lits[2] = toLitCond( pCnf->pVarNums[Aig_ObjId(pObj1)], fCompl1 ^ pObj1->fPhase );
109 // solve the problem
110 RetValue = sat_solver_solve( pSat, Lits, Lits+3, (ABC_INT64_T)0, (ABC_INT64_T)0, (ABC_INT64_T)0, (ABC_INT64_T)0 );
111 if ( RetValue == l_False )
112 {
113 vCube = Vec_IntAlloc( 2 );
114 Vec_IntPush( vCube, toLitCond(Aig_ObjId(pObj0), fCompl0 ^ pObj0->fPhase) );
115 Vec_IntPush( vCube, toLitCond(Aig_ObjId(pObj1), fCompl1 ^ pObj1->fPhase) );
116 Vec_PtrPush( vPrimes, vCube );
117 if ( fVerbose )
118 printf( "Adding prime %d%c %d%c\n",
119 Aig_ObjId(pObj0), (fCompl0 ^ pObj0->fPhase)?'-':'+',
120 Aig_ObjId(pObj1), (fCompl1 ^ pObj1->fPhase)?'-':'+' );
121 break;
122 }
123 }
124 }
125 }
126 nNodes2 = Vec_PtrSize(vPrimes) - nNodes1;
127
128 printf( "Property cone size = %6d 1-lit primes = %5d 2-lit primes = %5d\n",
129 Vec_PtrSize(vNodes), nNodes1, nNodes2 );
130
131 // clean up
132 sat_solver_delete( pSat );
133 Cnf_DataFree( pCnf );
134 Vec_PtrFree( vNodes );
135 Vec_IntFree( vMarks );
136 return vPrimes;
137}
138
150Aig_Man_t * Saig_ManDecPropertyOutput( Aig_Man_t * pAig, int nLits, int fVerbose )
151{
152 Aig_Man_t * pAigNew = NULL;
153 Aig_Obj_t * pObj, * pMiter;
154 Vec_Ptr_t * vPrimes;
155 Vec_Int_t * vCube;
156 int i, k, Lit;
157
158 // compute primes of the comb output function
159 vPrimes = Saig_ManFindPrimes( pAig, nLits, fVerbose );
160
161 // start the new manager
162 pAigNew = Aig_ManStart( Aig_ManNodeNum(pAig) );
163 pAigNew->pName = Abc_UtilStrsav( pAig->pName );
164 pAigNew->nConstrs = pAig->nConstrs;
165 // map the constant node
166 Aig_ManConst1(pAig)->pData = Aig_ManConst1( pAigNew );
167 // create variables for PIs
168 Aig_ManForEachCi( pAig, pObj, i )
169 pObj->pData = Aig_ObjCreateCi( pAigNew );
170 // add internal nodes of this frame
171 Aig_ManForEachNode( pAig, pObj, i )
172 pObj->pData = Aig_And( pAigNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) );
173 // create original POs of the circuit
174 Saig_ManForEachPo( pAig, pObj, i )
175 Aig_ObjCreateCo( pAigNew, Aig_ObjChild0Copy(pObj) );
176 // create prime POs of the circuit
177 if ( vPrimes )
178 Vec_PtrForEachEntry( Vec_Int_t *, vPrimes, vCube, k )
179 {
180 pMiter = Aig_ManConst1( pAigNew );
181 Vec_IntForEachEntry( vCube, Lit, i )
182 {
183 pObj = Aig_NotCond( Aig_ObjCopy(Aig_ManObj(pAig, Abc_Lit2Var(Lit))), Abc_LitIsCompl(Lit) );
184 pMiter = Aig_And( pAigNew, pMiter, pObj );
185 }
186 Aig_ObjCreateCo( pAigNew, pMiter );
187 }
188 // transfer to register outputs
189 Saig_ManForEachLi( pAig, pObj, i )
190 Aig_ObjCreateCo( pAigNew, Aig_ObjChild0Copy(pObj) );
191 Aig_ManCleanup( pAigNew );
192 Aig_ManSetRegNum( pAigNew, Aig_ManRegNum(pAig) );
193
194 Vec_VecFreeP( (Vec_Vec_t **)&vPrimes );
195 return pAigNew;
196}
197
198
202
203
205
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Aig_ManSetRegNum(Aig_Man_t *p, int nRegs)
Definition aigMan.c:438
#define Aig_ManForEachCi(p, pObj, i)
ITERATORS ///.
Definition aig.h:393
Aig_Obj_t * Aig_And(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1)
Definition aigOper.c:104
Aig_Obj_t * Aig_ObjCreateCo(Aig_Man_t *p, Aig_Obj_t *pDriver)
Definition aigObj.c:66
struct Aig_Obj_t_ Aig_Obj_t
Definition aig.h:51
Aig_Man_t * Aig_ManStart(int nNodesMax)
DECLARATIONS ///.
Definition aigMan.c:47
#define Aig_ManForEachNode(p, pObj, i)
Definition aig.h:413
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
Definition aig.h:50
int Aig_ManCleanup(Aig_Man_t *p)
Definition aigMan.c:265
Vec_Ptr_t * Aig_ManDfsNodes(Aig_Man_t *p, Aig_Obj_t **ppNodes, int nNodes)
Definition aigDfs.c:347
Aig_Obj_t * Aig_ObjCreateCi(Aig_Man_t *p)
DECLARATIONS ///.
Definition aigObj.c:45
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Definition bblif.c:37
#define l_False
Definition bmcBmcS.c:36
#define sat_solver
Definition cecSatG2.c:34
#define sat_solver_solve
Definition cecSatG2.c:45
Cnf_Dat_t * Cnf_DeriveSimple(Aig_Man_t *p, int nOutputs)
Definition cnfWrite.c:587
struct Cnf_Dat_t_ Cnf_Dat_t
Definition cnf.h:52
void Cnf_DataFree(Cnf_Dat_t *p)
Definition cnfMan.c:207
void * Cnf_DataWriteIntoSolver(Cnf_Dat_t *p, int nFrames, int fInit)
Definition cnfMan.c:579
Aig_Man_t * Saig_ManDecPropertyOutput(Aig_Man_t *pAig, int nLits, int fVerbose)
Definition saigOutDec.c:150
ABC_NAMESPACE_IMPL_START Vec_Ptr_t * Saig_ManFindPrimes(Aig_Man_t *pAig, int nLits, int fVerbose)
DECLARATIONS ///.
Definition saigOutDec.c:47
#define Saig_ManForEachLi(p, pObj, i)
Definition saig.h:98
#define Saig_ManForEachPo(p, pObj, i)
Definition saig.h:93
void sat_solver_delete(sat_solver *s)
Definition satSolver.c:1341
void * pData
Definition aig.h:87
unsigned int fPhase
Definition aig.h:78
int * pVarNums
Definition cnf.h:63
#define assert(ex)
Definition util_old.h:213
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
Definition vecInt.h:54
#define Vec_PtrForEachEntryStart(Type, vVec, pEntry, i, Start)
Definition vecPtr.h:57
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
typedefABC_NAMESPACE_HEADER_START struct Vec_Vec_t_ Vec_Vec_t
INCLUDES ///.
Definition vecVec.h:42