summaryrefslogtreecommitdiffstats
path: root/src/aig/gia/giaSimBase.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2021-09-26 11:12:17 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2021-09-26 11:12:17 -0700
commit2ce1ce8bed69623de58d9394e22a3a8812096561 (patch)
tree2847ac05aa528f00aeb6c34af8a6eec4f0e7ee98 /src/aig/gia/giaSimBase.c
parent787dbb9433e2757d087db55217194bad4773c0de (diff)
downloadabc-2ce1ce8bed69623de58d9394e22a3a8812096561.tar.gz
abc-2ce1ce8bed69623de58d9394e22a3a8812096561.tar.bz2
abc-2ce1ce8bed69623de58d9394e22a3a8812096561.zip
Various changes.
Diffstat (limited to 'src/aig/gia/giaSimBase.c')
-rw-r--r--src/aig/gia/giaSimBase.c60
1 files changed, 56 insertions, 4 deletions
diff --git a/src/aig/gia/giaSimBase.c b/src/aig/gia/giaSimBase.c
index b329ca0b..bfafdcfd 100644
--- a/src/aig/gia/giaSimBase.c
+++ b/src/aig/gia/giaSimBase.c
@@ -177,15 +177,19 @@ static inline void Gia_ManSimPatSimAnd3( Gia_Man_t * p, int i, Gia_Obj_t * pObj,
pSimsC1[w] |= (pSims2[w] | (pSims1[w] ^ Diff1)) & pSimsC2[w];
}
}
-Vec_Wrd_t * Gia_ManSimPatSimIn( Gia_Man_t * pGia, Vec_Wrd_t * vSims, int fIns )
+Vec_Wrd_t * Gia_ManSimPatSimIn( Gia_Man_t * pGia, Vec_Wrd_t * vSims, int fIns, Vec_Int_t * vAnds )
{
Gia_Obj_t * pObj;
int i, Id, nWords = Vec_WrdSize(vSims) / Gia_ManObjNum(pGia);
Vec_Wrd_t * vSimsCi = fIns ? Vec_WrdStart( Gia_ManCiNum(pGia) * nWords ) : NULL;
Vec_Wrd_t * vSimsC = Vec_WrdStart( Vec_WrdSize(vSims) );
assert( Vec_WrdSize(vSims) % Gia_ManObjNum(pGia) == 0 );
- Gia_ManForEachCoDriverId( pGia, Id, i )
- memset( Vec_WrdEntryP(vSimsC, Id*nWords), 0xFF, sizeof(word)*nWords );
+ if ( vAnds )
+ Vec_IntForEachEntry( vAnds, Id, i )
+ memset( Vec_WrdEntryP(vSimsC, Id*nWords), 0xFF, sizeof(word)*nWords );
+ else
+ Gia_ManForEachCoDriverId( pGia, Id, i )
+ memset( Vec_WrdEntryP(vSimsC, Id*nWords), 0xFF, sizeof(word)*nWords );
Gia_ManForEachAndReverse( pGia, pObj, i )
Gia_ManSimPatSimAnd3( pGia, i, pObj, nWords, vSims, vSimsC );
if ( !fIns )
@@ -200,7 +204,7 @@ void Gia_ManSimPatSimInTest( Gia_Man_t * pGia )
int nWords = 10;
Vec_Wrd_t * vSimsCi = Vec_WrdStartRandom( Gia_ManCiNum(pGia) * nWords );
Vec_Wrd_t * vSims = Gia_ManSimPatSimOut( pGia, vSimsCi, 0 );
- Vec_Wrd_t * vSims2 = Gia_ManSimPatSimIn( pGia, vSims, 0 );
+ Vec_Wrd_t * vSims2 = Gia_ManSimPatSimIn( pGia, vSims, 0, NULL );
int nOnes = Abc_TtCountOnesVec( Vec_WrdArray(vSims2), Vec_WrdSize(vSims2) );
int nTotal = 64*nWords*Gia_ManCandNum(pGia);
printf( "Ratio = %6.2f %%\n", 100.0*nOnes/nTotal );
@@ -208,6 +212,54 @@ void Gia_ManSimPatSimInTest( Gia_Man_t * pGia )
Vec_WrdFree( vSims2 );
Vec_WrdFree( vSimsCi );
}
+static inline void Gia_ManSimPatSimAnd4( Gia_Man_t * p, int i, Gia_Obj_t * pObj, int nWords, Vec_Wrd_t * vSims, Vec_Wrd_t * vSimsC )
+{
+ word pComps[2] = { ~(word)0, 0 };
+ word Diff0 = pComps[Gia_ObjFaninC0(pObj)];
+ word Diff1 = pComps[Gia_ObjFaninC1(pObj)];
+ word * pSims0 = Vec_WrdArray(vSims) + nWords*Gia_ObjFaninId0(pObj, i);
+ word * pSims1 = Vec_WrdArray(vSims) + nWords*Gia_ObjFaninId1(pObj, i);
+ word * pSimsC0 = Vec_WrdArray(vSimsC) + nWords*Gia_ObjFaninId0(pObj, i);
+ word * pSimsC1 = Vec_WrdArray(vSimsC) + nWords*Gia_ObjFaninId1(pObj, i);
+ word * pSimsC2 = Vec_WrdArray(vSimsC) + nWords*i; int w;
+ if ( Gia_ObjIsXor(pObj) )
+ for ( w = 0; w < nWords; w++ )
+ pSimsC2[w] = pSimsC0[w] & pSimsC1[w];
+ else
+ for ( w = 0; w < nWords; w++ )
+ pSimsC2[w] = (pSimsC0[w] & pSimsC1[w]) | ((pSims0[w] ^ Diff0) & pSimsC0[w]) | ((pSims1[w] ^ Diff1) & pSimsC1[w]);
+}
+Vec_Wrd_t * Gia_ManSimPatSimC( Gia_Man_t * pGia, Vec_Wrd_t * vSims, Vec_Wrd_t * vSimsCiC )
+{
+ Gia_Obj_t * pObj;
+ int i, Id, nWords = Vec_WrdSize(vSims) / Gia_ManObjNum(pGia);
+ Vec_Wrd_t * vSimsC = Vec_WrdStart( Vec_WrdSize(vSims) );
+ assert( Vec_WrdSize(vSims) % Gia_ManObjNum(pGia) == 0 );
+ memset( Vec_WrdEntryP(vSimsC, 0), 0xFF, sizeof(word)*nWords );
+ Gia_ManForEachCiId( pGia, Id, i )
+ memmove( Vec_WrdEntryP(vSimsC, Id*nWords), Vec_WrdEntryP(vSimsCiC, i*nWords), sizeof(word)*nWords );
+ Gia_ManForEachAnd( pGia, pObj, i )
+ Gia_ManSimPatSimAnd4( pGia, i, pObj, nWords, vSims, vSimsC );
+ return vSimsC;
+}
+void Gia_ManSimPatSimCTest( Gia_Man_t * pGia )
+{
+ int nWords = 10;
+ Vec_Wrd_t * vSimsCi = Vec_WrdStartRandom( Gia_ManCiNum(pGia) * nWords );
+ Vec_Wrd_t * vSims = Gia_ManSimPatSimOut( pGia, vSimsCi, 0 );
+ Vec_Wrd_t * vSims2 = Gia_ManSimPatSimIn( pGia, vSims, 0, NULL );
+ Vec_Wrd_t * vSimsCi2 = Gia_ManSimPatSimIn( pGia, vSims, 1, NULL );
+ Vec_Wrd_t * vSims3 = Gia_ManSimPatSimC( pGia, vSims, vSimsCi2 );
+ int nOnes2 = Abc_TtCountOnesVec( Vec_WrdArray(vSims2), Vec_WrdSize(vSims2) );
+ int nOnes3 = Abc_TtCountOnesVec( Vec_WrdArray(vSims3), Vec_WrdSize(vSims3) );
+ int nTotal = 64*nWords*Gia_ManCandNum(pGia);
+ printf( "Ratio = %6.2f %% Ratio = %6.2f %%\n", 100.0*nOnes2/nTotal, 100.0*nOnes3/nTotal );
+ Vec_WrdFree( vSims );
+ Vec_WrdFree( vSims2 );
+ Vec_WrdFree( vSims3 );
+ Vec_WrdFree( vSimsCi );
+ Vec_WrdFree( vSimsCi2 );
+}
void Gia_ManSimPatResim( Gia_Man_t * pGia, Vec_Int_t * vObjs, int nWords, Vec_Wrd_t * vSims )
{
Gia_Obj_t * pObj; int i;