74{
76 int iElem, i, nRegCount;
77 int piCopied = 0, liCopied = 0, liCreated = 0, loCopied = 0, loCreated = 0;
78 int poCopied = 0, poCreated = 0;
79 Aig_Obj_t *pObj, *pObjPo, *pObjDriver, *pObjDriverNew, *pObjPendingDriverNew, *pObjPendingAndNextPending;
80 Aig_Obj_t *pPendingFlop, *pObjConseCandFlop, *pObjSafetyInvariantPoDriver;
81
83
84
85 Aig_Obj_t *pObjAnteDisjunction, *pObjConsecDriver, *pObjConsecDriverNew, *pObjCandMonotone, *pObjPrevCandMonotone, *pObjMonotonePropDriver;
88
90
93
94 if( vConsequentCandidatesLocal == NULL )
95 return NULL;
96
97
98
99
100
101
102
105 sprintf(pNewAig->pName,
"%s_%s", pAig->pName,
"monotone");
106 pNewAig->pSpec = NULL;
107
108
109
110
111 pObj = Aig_ManConst1( pAig );
112 pObj->
pData = Aig_ManConst1( pNewAig );
113
114
115
116
118 {
119 piCopied++;
121 }
122
123
124
125
127 {
128 loCopied++;
130 }
131
132
133
134
135 loCreated++;
137
138
139
140
141 vConseCandFlopOutput = Vec_PtrAlloc(Vec_IntSize(vConsequentCandidatesLocal));
143 {
144 loCreated++;
146 Vec_PtrPush( vConseCandFlopOutput, pObjConseCandFlop );
147 }
148
149 nRegCount = loCreated + loCopied;
150
151
152
153
155 {
156 pObj->
pData =
Aig_And( pNewAig, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) );
157 }
158
159
160
161
162
164 {
166 pObjDriver = Aig_NotCond((
Aig_Obj_t *)Aig_ObjFanin0(pObjPo), Aig_ObjFaninC0(pObjPo));
167 pObjDriverNew = !Aig_IsComplement(pObjDriver)?
168 (
Aig_Obj_t *)(Aig_Regular(pObjDriver)->pData) :
169 Aig_Not((
Aig_Obj_t *)(Aig_Regular(pObjDriver)->pData));
170 pObjSafetyInvariantPoDriver = pObjDriverNew;
171 }
172 else
173 pObjSafetyInvariantPoDriver = Aig_ManConst1(pNewAig);
174
175 pObjPo = Aig_ManCo( pAig, pendingSignalIndexLocal );
176 pObjDriver = Aig_NotCond((
Aig_Obj_t *)Aig_ObjFanin0(pObjPo), Aig_ObjFaninC0(pObjPo));
177 pObjPendingDriverNew = !Aig_IsComplement(pObjDriver)?
178 (
Aig_Obj_t *)(Aig_Regular(pObjDriver)->pData) :
179 Aig_Not((
Aig_Obj_t *)(Aig_Regular(pObjDriver)->pData));
180
181 pObjPendingAndNextPending =
Aig_And( pNewAig, pObjPendingDriverNew, pPendingFlop );
182
183 pObjAnteDisjunction = Aig_Not(Aig_ManConst1( pNewAig ));
184 if( vAntecedentsLocal )
185 {
187 {
188 pObjPo = Aig_ManCo( pAig, iElem );
189 pObjDriver = Aig_NotCond((
Aig_Obj_t *)Aig_ObjFanin0(pObjPo), Aig_ObjFaninC0(pObjPo));
190 pObjDriverNew = !Aig_IsComplement(pObjDriver)?
191 (
Aig_Obj_t *)(Aig_Regular(pObjDriver)->pData) :
192 Aig_Not((
Aig_Obj_t *)(Aig_Regular(pObjDriver)->pData));
193
194 pObjAnteDisjunction =
Aig_Or( pNewAig, pObjDriverNew, pObjAnteDisjunction );
195 }
196 }
197
198 vCandMonotoneProp = Vec_PtrAlloc( Vec_IntSize(vConsequentCandidatesLocal) );
199 vCandMonotoneFlopInput = Vec_PtrAlloc( Vec_IntSize(vConsequentCandidatesLocal) );
201 {
202 pObjPo = Aig_ManCo( pAig, iElem );
203 pObjConsecDriver = Aig_NotCond((
Aig_Obj_t *)Aig_ObjFanin0(pObjPo), Aig_ObjFaninC0(pObjPo));
204 pObjConsecDriverNew = !Aig_IsComplement(pObjConsecDriver)?
205 (
Aig_Obj_t *)(Aig_Regular(pObjConsecDriver)->pData) :
206 Aig_Not((
Aig_Obj_t *)(Aig_Regular(pObjConsecDriver)->pData));
207
208 pObjCandMonotone =
Aig_Or( pNewAig, pObjConsecDriverNew, pObjAnteDisjunction );
209 pObjPrevCandMonotone = (
Aig_Obj_t *)(Vec_PtrEntry( vConseCandFlopOutput, i ));
210 pObjMonotonePropDriver =
Aig_Or( pNewAig, Aig_Not(
Aig_And( pNewAig, pObjPendingAndNextPending, pObjPrevCandMonotone ) ),
211 pObjCandMonotone );
212
213
214 pObjMonotonePropDriver =
Aig_And( pNewAig, pObjMonotonePropDriver, pObjSafetyInvariantPoDriver );
215
216 Vec_PtrPush( vCandMonotoneFlopInput, pObjCandMonotone );
217 Vec_PtrPush( vCandMonotoneProp, pObjMonotonePropDriver );
218 }
219
220
221
222
224 {
225 poCopied++;
227 }
228
229 *startMonotonePropPo = i;
231 {
232 poCreated++;
234 }
235
236
237
238
239
241 {
242 liCopied++;
244 }
245
246
247
248
249
250 liCreated++;
252
253
254
255
256
258 {
259 liCreated++;
261 }
262
265
267 assert( loCopied + loCreated == liCopied + liCreated );
268
269 Vec_PtrFree(vConseCandFlopOutput);
270 Vec_PtrFree(vCandMonotoneProp);
271 Vec_PtrFree(vCandMonotoneFlopInput);
272 return pNewAig;
273}
void Aig_ManSetRegNum(Aig_Man_t *p, int nRegs)
Aig_Obj_t * Aig_And(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1)
Aig_Obj_t * Aig_ObjCreateCo(Aig_Man_t *p, Aig_Obj_t *pDriver)
struct Aig_Obj_t_ Aig_Obj_t
Aig_Man_t * Aig_ManStart(int nNodesMax)
DECLARATIONS ///.
#define Aig_ManForEachNode(p, pObj, i)
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
int Aig_ManCleanup(Aig_Man_t *p)
Aig_Obj_t * Aig_ObjCreateCi(Aig_Man_t *p)
DECLARATIONS ///.
Aig_Obj_t * Aig_Or(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1)
ABC_DLL int Aig_ManCheck(Aig_Man_t *p)
FUNCTION DECLARATIONS ///.
#define Saig_ManForEachLi(p, pObj, i)
#define Saig_ManForEachPo(p, pObj, i)
#define Saig_ManForEachLo(p, pObj, i)
#define Saig_ManForEachPi(p, pObj, i)
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.