31#define SIM_READ_SYMMS(pNode) ((Vec_Int_t *)pNode->pCopy)
32#define SIM_SET_SYMMS(pNode,vVect) (pNode->pCopy = (Abc_Obj_t *)(vVect))
34static void Sim_SymmsStructComputeOne(
Abc_Ntk_t * pNtk,
Abc_Obj_t * pNode,
int * pMap );
39static int Sim_SymmsIsCompatibleWithNodes(
Abc_Ntk_t * pNtk,
unsigned uSymm,
Vec_Ptr_t * vNodesOther,
int * pMap );
40static int Sim_SymmsIsCompatibleWithGroup(
unsigned uSymm,
Vec_Ptr_t * vNodesPi,
int * pMap );
41static void Sim_SymmsPrint(
Vec_Int_t * vSymms );
42static void Sim_SymmsTrans(
Vec_Int_t * vSymms );
44static int * Sim_SymmsCreateMap(
Abc_Ntk_t * pNtk );
67 assert( Abc_NtkCiNum(pNtk) + 10 < (1<<16) );
75 pMap = Sim_SymmsCreateMap( pNtk );
82 Sim_SymmsStructComputeOne( pNtk, pTemp, pMap );
88 pTemp = Abc_ObjFanin0(pTemp);
89 if ( Abc_ObjIsCi(pTemp) || Abc_AigNodeIsConst(pTemp) )
101 Vec_PtrFree( vNodes );
118 Vec_Ptr_t * vNodes, * vNodesPi0, * vNodesPi1, * vNodesOther;
124 vNodes = Vec_PtrAlloc( 10 );
125 vNodesPi0 = Vec_PtrAlloc( 10 );
126 vNodesPi1 = Vec_PtrAlloc( 10 );
127 vNodesOther = Vec_PtrAlloc( 10 );
130 Sim_SymmsBalanceCollect_rec( pNode, vNodes );
133 Sim_SymmsPartitionNodes( vNodes, vNodesPi0, vNodesPi1, vNodesOther );
136 vSymms = Vec_IntAlloc( 10 );
138 Sim_SymmsAppendFromGroup( pNtk, vNodesPi0, vNodesOther, vSymms, pMap );
139 Sim_SymmsAppendFromGroup( pNtk, vNodesPi1, vNodesOther, vSymms, pMap );
141 for ( i = 0; i < vNodesOther->nSize; i++ )
143 pTemp = Abc_ObjRegular((
Abc_Obj_t *)vNodesOther->pArray[i]);
144 Sim_SymmsAppendFromNode( pNtk,
SIM_READ_SYMMS(pTemp), vNodesOther, vNodesPi0, vNodesPi1, vSymms, pMap );
146 Vec_PtrFree( vNodes );
147 Vec_PtrFree( vNodesPi0 );
148 Vec_PtrFree( vNodesPi1 );
149 Vec_PtrFree( vNodesOther );
170 if ( Abc_ObjIsComplement(pNode) )
172 Vec_PtrPushUnique( vNodes, pNode );
176 if ( Abc_ObjIsCi(pNode) )
178 Vec_PtrPushUnique( vNodes, pNode );
182 Sim_SymmsBalanceCollect_rec( Abc_ObjChild0(pNode), vNodes );
183 Sim_SymmsBalanceCollect_rec( Abc_ObjChild1(pNode), vNodes );
204 if ( !Abc_ObjIsCi(Abc_ObjRegular(pNode)) )
205 Vec_PtrPush( vNodesOther, pNode );
206 else if ( Abc_ObjIsComplement(pNode) )
207 Vec_PtrPush( vNodesPis0, pNode );
209 Vec_PtrPush( vNodesPis1, pNode );
230 if ( vNodesPi->nSize == 0 )
234 for ( i = 0; i < vNodesPi->nSize; i++ )
235 for ( k = i+1; k < vNodesPi->nSize; k++ )
238 pNode1 = Abc_ObjRegular((
Abc_Obj_t *)vNodesPi->pArray[i]);
239 pNode2 = Abc_ObjRegular((
Abc_Obj_t *)vNodesPi->pArray[k]);
240 assert( pMap[pNode1->
Id] != pMap[pNode2->
Id] );
244 if ( pMap[pNode1->
Id] < pMap[pNode2->
Id] )
245 uSymm = ((pMap[pNode1->
Id] << 16) | pMap[pNode2->
Id]);
247 uSymm = ((pMap[pNode2->
Id] << 16) | pMap[pNode1->
Id]);
249 if ( Sim_SymmsIsCompatibleWithNodes( pNtk, uSymm, vNodesOther, pMap ) )
250 Vec_IntPushUnique( vSymms, (
int)uSymm );
271 if ( vSymms0->nSize == 0 )
275 for ( i = 0; i < vSymms0->nSize; i++ )
277 uSymm = (unsigned)vSymms0->pArray[i];
279 if ( Sim_SymmsIsCompatibleWithNodes( pNtk, uSymm, vNodesOther, pMap ) &&
280 Sim_SymmsIsCompatibleWithGroup( uSymm, vNodesPi0, pMap ) &&
281 Sim_SymmsIsCompatibleWithGroup( uSymm, vNodesPi1, pMap ) )
282 Vec_IntPushUnique( vSymms, (
int)uSymm );
297int Sim_SymmsIsCompatibleWithNodes(
Abc_Ntk_t * pNtk,
unsigned uSymm,
Vec_Ptr_t * vNodesOther,
int * pMap )
301 int i, s, Ind1, Ind2, fIsVar1, fIsVar2;
303 if ( vNodesOther->nSize == 0 )
307 Ind1 = (uSymm & 0xffff);
308 Ind2 = (uSymm >> 16);
314 for ( i = 0; i < vNodesOther->nSize; i++ )
316 pNode = Abc_ObjRegular((
Abc_Obj_t *)vNodesOther->pArray[i]);
320 if ( !fIsVar1 && !fIsVar2 )
322 if ( fIsVar1 ^ fIsVar2 )
327 for ( s = 0; s < vSymmsNode->nSize; s++ )
328 if ( uSymm == (
unsigned)vSymmsNode->pArray[s] )
330 if ( s == vSymmsNode->nSize )
347int Sim_SymmsIsCompatibleWithGroup(
unsigned uSymm,
Vec_Ptr_t * vNodesPi,
int * pMap )
350 int i, Ind1, Ind2, fHasVar1, fHasVar2;
352 if ( vNodesPi->nSize == 0 )
356 Ind1 = (uSymm & 0xffff);
357 Ind2 = (uSymm >> 16);
360 fHasVar1 = fHasVar2 = 0;
361 for ( i = 0; i < vNodesPi->nSize; i++ )
363 pNode = Abc_ObjRegular((
Abc_Obj_t *)vNodesPi->pArray[i]);
364 if ( pMap[pNode->
Id] == Ind1 )
366 else if ( pMap[pNode->
Id] == Ind2 )
369 return fHasVar1 == fHasVar2;
387 unsigned uSymm, uSymma, uSymmr;
393 for ( i = 0; i < vSymms->nSize; i++ )
395 uSymm = (unsigned)vSymms->pArray[i];
396 Ind1 = (uSymm & 0xffff);
397 Ind2 = (uSymm >> 16);
399 for ( k = i+1; k < vSymms->nSize; k++ )
401 uSymma = (unsigned)vSymms->pArray[k];
402 if ( uSymma == uSymm )
404 Ind1a = (uSymma & 0xffff);
405 Ind2a = (uSymma >> 16);
410 uSymmr = ((Ind2 << 16) | Ind2a);
412 uSymmr = ((Ind2a << 16) | Ind2);
413 for ( j = 0; j < vSymms->nSize; j++ )
414 if ( uSymmr == (
unsigned)vSymms->pArray[j] )
416 if ( j == vSymms->nSize )
422 printf(
"Trans = %d.\n", nTrans );
439 int i, Ind1, Ind2, nInputs;
443 for ( i = 0; i < nInputs; i++ )
446 for ( i = 0; i < vSymms->nSize; i++ )
448 uSymm = (unsigned)vSymms->pArray[i];
449 Ind1 = (uSymm & 0xffff);
450 Ind2 = (uSymm >> 16);
472int * Sim_SymmsCreateMap(
Abc_Ntk_t * pNtk )
477 pMap =
ABC_ALLOC(
int, Abc_NtkObjNumMax(pNtk) );
478 for ( i = 0; i < Abc_NtkObjNumMax(pNtk); i++ )
struct Abc_Obj_t_ Abc_Obj_t
#define Abc_NtkForEachCo(pNtk, pCo, i)
ABC_DLL Vec_Ptr_t * Abc_NtkDfs(Abc_Ntk_t *pNtk, int fCollectAll)
struct Abc_Ntk_t_ Abc_Ntk_t
#define Abc_NtkForEachCi(pNtk, pCi, i)
#define ABC_ALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
void Sim_SymmsStructCompute(Abc_Ntk_t *pNtk, Vec_Ptr_t *vMatrs, Vec_Ptr_t *vSuppFun)
FUNCTION DEFINITIONS ///.
#define SIM_SET_SYMMS(pNode, vVect)
#define SIM_READ_SYMMS(pNode)
DECLARATIONS ///.
void Sim_UtilInfoFree(Vec_Ptr_t *p)
Vec_Ptr_t * Sim_ComputeStrSupp(Abc_Ntk_t *pNtk)
FUNCTION DEFINITIONS ///.
#define Sim_SuppStrHasVar(vSupps, pNode, v)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.