88 if ( Aig_IsComplement(pObj) || !Aig_ObjIsNode(pObj) )
90 Vec_PtrPushUnique( vSuper, Aig_Not(pObj) );
112 assert( !Aig_IsComplement(pObj) );
113 assert( Aig_ObjIsAnd(pObj) );
114 vSuper = Vec_PtrAlloc( 4 );
138 if ( Vec_PtrFind( vSuper, pObj2 ) == -1 )
140 vUnique = Vec_PtrAlloc( 100 );
142 if ( Vec_PtrFind( vSuper2, pObj ) == -1 )
143 Vec_PtrPush( vUnique, pObj );
160 Vec_Ptr_t * vSuper, * vSuper2 = NULL, * vUnique;
162 int i, nFlops, RetValue;
163 assert( iOut >= 0 && iOut < Saig_ManPoNum(
p) );
166 pObj = Aig_ObjChild0( Aig_ManCo(
p, iOut) );
167 if ( pObj == Aig_ManConst0(
p) )
169 vUnique = Vec_PtrStart( 1 );
170 Vec_PtrWriteEntry( vUnique, 0, Aig_ManConst1(
p) );
172 *pvCons = Vec_PtrAlloc( 0 );
175 if ( Aig_IsComplement(pObj) || !Aig_ObjIsNode(pObj) )
177 printf(
"The output is not an AND.\n" );
181 assert( Vec_PtrSize(vSuper) >= 2 );
184 nFlops += Saig_ObjIsLo(
p, Aig_Regular(pObj) );
187 printf(
"There is no flop outputs.\n" );
188 Vec_PtrFree( vSuper );
195 pFlop = Aig_Regular( pObj );
196 if ( !Saig_ObjIsLo(
p, pFlop) )
198 pFlop = Saig_ObjLoToLi(
p, pFlop );
199 pObj2 = Aig_ObjChild0( pFlop );
200 if ( !Aig_IsComplement(pObj2) || !Aig_ObjIsNode(Aig_Regular(pObj2)) )
205 if ( vUnique != NULL )
209 if ( Aig_IsComplement(pObj) )
211 printf(
"Special flop input is complemented.\n" );
212 Vec_PtrFreeP( &vUnique );
213 Vec_PtrFree( vSuper2 );
216 if ( Vec_PtrFind( vSuper2, pObj ) == -1 )
218 printf(
"Cannot find special flop about the inputs of OR gate.\n" );
219 Vec_PtrFreeP( &vUnique );
220 Vec_PtrFree( vSuper2 );
224 Vec_PtrRemove( vSuper2, pObj );
227 Vec_PtrFree( vSuper2 );
229 Vec_PtrFree( vSuper );
230 if ( vUnique == NULL )
232 printf(
"There is no structural constraints.\n" );
237 printf(
"Output %d : Structural analysis found %d original properties and %d constraints.\n",
238 iOut, Vec_PtrSize(vUnique), Vec_PtrSize(vSuper2) );
240 RetValue = Vec_PtrSize(vSuper2);
263 int Diff = Aig_ObjToLit(*pp1) - Aig_ObjToLit(*pp2);
290 vOutsAll = Vec_PtrAlloc( Saig_ManPoNum(pAig) );
291 vConsAll = Vec_PtrAlloc( Saig_ManPoNum(pAig) );
297 Vec_PtrFreeP( &vOuts );
298 Vec_PtrFreeP( &vCons );
305 Vec_PtrPush( vOutsAll, vOuts );
306 Vec_PtrPush( vConsAll, vCons );
309 vCons0 = (
Vec_Ptr_t *)Vec_PtrEntry( vConsAll, 0 );
311 if ( Vec_PtrSize(vCons) )
316 vOuts = (
Vec_Ptr_t *)Vec_PtrEntry( vOutsAll, i );
317 if ( Vec_PtrSize(vOuts) == 1 && (
Aig_Obj_t *)Vec_PtrEntry( vOuts, 0 ) == Aig_ManConst1(pAig) )
319 if ( !Vec_PtrEqual(vCons0, vCons) )
322 if ( i < Vec_PtrSize(vConsAll) )
324 printf(
"Collected constraints are not compatible.\n" );
332 pAigNew->pName = Abc_UtilStrsav( pAig->pName );
334 Aig_ManConst1(pAig)->pData = Aig_ManConst1( pAigNew );
340 pObj->
pData =
Aig_And( pAigNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) );
345 pMiter = Aig_ManConst1( pAigNew );
347 pMiter =
Aig_And( pAigNew, pMiter, Aig_Not(Aig_ObjRealCopy(pObj)) );
351 pAigNew->nConstrs = Vec_PtrSize(vCons0);
382 Aig_Obj_t * pMiter, * pFlopOut, * pFlopIn, * pObj;
384 assert( Saig_ManRegNum(pAig) > 0 );
387 pAigNew->pName = Abc_UtilStrsav( pAig->pName );
389 Aig_ManConst1(pAig)->pData = Aig_ManConst1( pAigNew );
395 pObj->
pData =
Aig_And( pAigNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) );
398 pMiter = Aig_ManConst0( pAigNew );
401 assert( Entry > 0 && Entry < Saig_ManPoNum(pAig) );
402 pObj = Aig_ManCo( pAig, Entry );
403 pMiter =
Aig_Or( pAigNew, pMiter, Aig_ObjChild0Copy(pObj) );
407 pFlopIn =
Aig_Or( pAigNew, pMiter, pFlopOut );
412 pMiter =
Aig_And( pAigNew, Aig_ObjChild0Copy(pObj), Aig_Not(pFlopIn) );
447 vConstrs = Vec_IntStartNatural( Saig_ManPoNum(pAig1) );
448 Vec_IntRemove( vConstrs, 0 );
451 Vec_IntFree( vConstrs );
473 Vec_PtrFreeP( &vOuts );
474 Vec_PtrFreeP( &vCons );
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
int Aig_ManSeqCleanup(Aig_Man_t *p)
void Aig_ManSetRegNum(Aig_Man_t *p, int nRegs)
Aig_Man_t * Aig_ManDupDfs(Aig_Man_t *p)
void Aig_ManStop(Aig_Man_t *p)
#define Aig_ManForEachCi(p, pObj, i)
ITERATORS ///.
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)
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
void Ioa_WriteAiger(Aig_Man_t *pMan, char *pFileName, int fWriteSymbols, int fCompact)
ABC_NAMESPACE_IMPL_START void Saig_DetectConstrCollectSuper_rec(Aig_Obj_t *pObj, Vec_Ptr_t *vSuper)
DECLARATIONS ///.
void Saig_ManFoldConstrTest(Aig_Man_t *pAig)
Aig_Man_t * Saig_ManDupUnfoldConstrs(Aig_Man_t *pAig)
int Saig_ManDupCompare(Aig_Obj_t **pp1, Aig_Obj_t **pp2)
Vec_Ptr_t * Saig_DetectConstrCollectSuper(Aig_Obj_t *pObj)
int Saig_ManDetectConstrTest(Aig_Man_t *p)
int Saig_ManDetectConstr(Aig_Man_t *p, int iOut, Vec_Ptr_t **pvOuts, Vec_Ptr_t **pvCons)
Aig_Man_t * Saig_ManDupFoldConstrs(Aig_Man_t *pAig, Vec_Int_t *vConstrs)
Vec_Ptr_t * Saig_ManDetectConstrCheckCont(Vec_Ptr_t *vSuper, Vec_Ptr_t *vSuper2)
#define Saig_ManForEachLi(p, pObj, i)
#define Saig_ManForEachPo(p, pObj, i)
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Vec_t_ Vec_Vec_t
INCLUDES ///.