ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
giaSim.c File Reference
#include "gia.h"
#include "misc/util/utilTruth.h"
Include dependency graph for giaSim.c:

Go to the source code of this file.

Functions

unsigned * Gia_SimDataExt (Gia_ManSim_t *p, int i)
 
unsigned * Gia_SimDataCiExt (Gia_ManSim_t *p, int i)
 
unsigned * Gia_SimDataCoExt (Gia_ManSim_t *p, int i)
 
void Gia_ManSimCollect_rec (Gia_Man_t *pGia, Gia_Obj_t *pObj, Vec_Int_t *vVec)
 FUNCTION DEFINITIONS ///.
 
void Gia_ManSimCollect (Gia_Man_t *pGia, Gia_Obj_t *pObj, Vec_Int_t *vVec)
 
Vec_Int_tGia_ManSimDeriveResets (Gia_Man_t *pGia)
 
void Gia_ManSimSetDefaultParams (Gia_ParSim_t *p)
 
void Gia_ManSimDelete (Gia_ManSim_t *p)
 
Gia_ManSim_tGia_ManSimCreate (Gia_Man_t *pAig, Gia_ParSim_t *pPars)
 
void Gia_ManSimInfoInit (Gia_ManSim_t *p)
 
void Gia_ManSimInfoTransfer (Gia_ManSim_t *p)
 
void Gia_ManSimulateRound (Gia_ManSim_t *p)
 
Abc_Cex_tGia_ManGenerateCounter (Gia_Man_t *pAig, int iFrame, int iOut, int nWords, int iPat, Vec_Int_t *vCis2Ids)
 
void Gia_ManResetRandom (Gia_ParSim_t *pPars)
 
int Gia_ManSimSimulate (Gia_Man_t *pAig, Gia_ParSim_t *pPars)
 
Vec_Int_tGia_ManSimReadFile (char *pFileIn)
 
int Gia_ManSimWriteFile (char *pFileOut, Vec_Int_t *vPat, int nOuts)
 
Vec_Int_tGia_ManSimSimulateOne (Gia_Man_t *p, Vec_Int_t *vPat)
 
void Gia_ManSimSimulatePattern (Gia_Man_t *p, char *pFileIn, char *pFileOut)
 
void Gia_ManBuiltInSimStart (Gia_Man_t *p, int nWords, int nObjs)
 
void Gia_ManBuiltInSimPerformInt (Gia_Man_t *p, int iObj)
 
void Gia_ManBuiltInSimPerform (Gia_Man_t *p, int iObj)
 
void Gia_ManBuiltInSimResimulateCone_rec (Gia_Man_t *p, int iObj)
 
void Gia_ManBuiltInSimResimulateCone (Gia_Man_t *p, int iLit0, int iLit1)
 
void Gia_ManBuiltInSimResimulate (Gia_Man_t *p)
 
int Gia_ManBuiltInSimCheckOver (Gia_Man_t *p, int iLit0, int iLit1)
 
int Gia_ManBuiltInSimCheckEqual (Gia_Man_t *p, int iLit0, int iLit1)
 
int Gia_ManBuiltInSimPack (Gia_Man_t *p, Vec_Int_t *vPat)
 
int Gia_ManBuiltInSimAddPat (Gia_Man_t *p, Vec_Int_t *vPat)
 
int Gia_ManObjCheckSat_rec (Gia_Man_t *p, int iLit, Vec_Int_t *vObjs)
 
int Gia_ManObjCheckOverlap1 (Gia_Man_t *p, int iLit0, int iLit1, Vec_Int_t *vObjs)
 
int Gia_ManObjCheckOverlap (Gia_Man_t *p, int iLit0, int iLit1, Vec_Int_t *vObjs)
 
void Gia_ManIncrSimUpdate (Gia_Man_t *p)
 
void Gia_ManIncrSimStart (Gia_Man_t *p, int nWords, int nObjs)
 
void Gia_ManIncrSimStop (Gia_Man_t *p)
 
void Gia_ManIncrSimSet (Gia_Man_t *p, Vec_Int_t *vObjLits)
 
void Gia_ManIncrSimCone_rec (Gia_Man_t *p, int iObj)
 
int Gia_ManIncrSimCheckOver (Gia_Man_t *p, int iLit0, int iLit1)
 
int Gia_ManIncrSimCheckEqual (Gia_Man_t *p, int iLit0, int iLit1)
 
void Gia_ManSimOneBit (Gia_Man_t *p, Vec_Int_t *vValues)
 
void Gia_ManSimOneBitTest2 (Gia_Man_t *p)
 
void Gia_ManSimOneBitTest3 (Gia_Man_t *p)
 
void Gia_ManSimOneBitTest (Gia_Man_t *p)
 

Function Documentation

◆ Gia_ManBuiltInSimAddPat()

int Gia_ManBuiltInSimAddPat ( Gia_Man_t * p,
Vec_Int_t * vPat )

Definition at line 963 of file giaSim.c.

964{
965 int Period = 0xF;
966 int fOverflow = p->iPatsPi == 64 * p->nSimWords && p->nSimWords == p->nSimWordsMax;
967 int k, iLit, iPat = Gia_ManBuiltInSimPack( p, vPat );
968 if ( iPat == -1 )
969 {
970 if ( fOverflow )
971 {
972 if ( (p->iPastPiMax & Period) == 0 )
974 iPat = p->iPastPiMax;
975 //if ( p->iPastPiMax == 64 * p->nSimWordsMax - 1 )
976 // printf( "Completed the cycle.\n" );
977 p->iPastPiMax = p->iPastPiMax == 64 * p->nSimWordsMax - 1 ? 0 : p->iPastPiMax + 1;
978 }
979 else
980 {
981 if ( p->iPatsPi && (p->iPatsPi & Period) == 0 )
983 if ( p->iPatsPi == 64 * p->nSimWords )
984 {
985 Vec_Wrd_t * vTemp = Vec_WrdAlloc( 2 * Vec_WrdSize(p->vSims) );
986 word Data; int w, Count = 0, iObj = 0;
987 Vec_WrdForEachEntry( p->vSims, Data, w )
988 {
989 Vec_WrdPush( vTemp, Data );
990 if ( ++Count == p->nSimWords )
991 {
992 Gia_Obj_t * pObj = Gia_ManObj(p, iObj++);
993 if ( Gia_ObjIsCi(pObj) )
994 Vec_WrdPush( vTemp, Gia_ManRandomW(0) ); // Vec_WrdPush( vTemp, 0 );
995 else if ( Gia_ObjIsAnd(pObj) )
996 Vec_WrdPush( vTemp, pObj->fPhase ? ~(word)0 : 0 );
997 else
998 Vec_WrdPush( vTemp, 0 );
999 Count = 0;
1000 }
1001 }
1002 assert( iObj == Gia_ManObjNum(p) );
1003 Vec_WrdFree( p->vSims );
1004 p->vSims = vTemp;
1005
1006 vTemp = Vec_WrdAlloc( 2 * Vec_WrdSize(p->vSimsPi) );
1007 Count = 0;
1008 Vec_WrdForEachEntry( p->vSimsPi, Data, w )
1009 {
1010 Vec_WrdPush( vTemp, Data );
1011 if ( ++Count == p->nSimWords )
1012 {
1013 Vec_WrdPush( vTemp, 0 );
1014 Count = 0;
1015 }
1016 }
1017 Vec_WrdFree( p->vSimsPi );
1018 p->vSimsPi = vTemp;
1019
1020 // update the word count
1021 p->nSimWords++;
1022 assert( Vec_WrdSize(p->vSims) == p->nSimWords * Gia_ManObjNum(p) );
1023 assert( Vec_WrdSize(p->vSimsPi) == p->nSimWords * Gia_ManCiNum(p) );
1024 //printf( "Resizing to %d words.\n", p->nSimWords );
1025 }
1026 iPat = p->iPatsPi++;
1027 }
1028 }
1029 assert( iPat >= 0 && iPat < p->iPatsPi );
1030 // add literals
1031 if ( fOverflow )
1032 {
1033 int iVar;
1034 Vec_IntForEachEntry( &p->vSuppVars, iVar, k )
1035 if ( Abc_TtGetBit(Gia_ManBuiltInDataPi(p, iVar), iPat) )
1036 Abc_TtXorBit(Gia_ManBuiltInDataPi(p, iVar), iPat);
1037 Vec_IntForEachEntry( vPat, iLit, k )
1038 {
1039 if ( Abc_TtGetBit(Gia_ManBuiltInData(p, 1+Abc_Lit2Var(iLit)), iPat) == Abc_LitIsCompl(iLit) )
1040 Abc_TtXorBit(Gia_ManBuiltInData(p, 1+Abc_Lit2Var(iLit)), iPat);
1041 Abc_TtXorBit(Gia_ManBuiltInDataPi(p, Abc_Lit2Var(iLit)), iPat);
1042 }
1043 }
1044 else
1045 {
1046 Vec_IntForEachEntry( vPat, iLit, k )
1047 {
1048 if ( Abc_TtGetBit(Gia_ManBuiltInDataPi(p, Abc_Lit2Var(iLit)), iPat) )
1049 assert( Abc_TtGetBit(Gia_ManBuiltInData(p, 1+Abc_Lit2Var(iLit)), iPat) != Abc_LitIsCompl(iLit) );
1050 else
1051 {
1052 if ( Abc_TtGetBit(Gia_ManBuiltInData(p, 1+Abc_Lit2Var(iLit)), iPat) == Abc_LitIsCompl(iLit) )
1053 Abc_TtXorBit(Gia_ManBuiltInData(p, 1+Abc_Lit2Var(iLit)), iPat);
1054 Abc_TtXorBit(Gia_ManBuiltInDataPi(p, Abc_Lit2Var(iLit)), iPat);
1055 }
1056 }
1057 }
1058 return 1;
1059}
Cube * p
Definition exorList.c:222
int Gia_ManBuiltInSimPack(Gia_Man_t *p, Vec_Int_t *vPat)
Definition giaSim.c:946
void Gia_ManBuiltInSimResimulate(Gia_Man_t *p)
Definition giaSim.c:852
word Gia_ManRandomW(int fReset)
Definition giaUtil.c:67
struct Gia_Obj_t_ Gia_Obj_t
Definition gia.h:76
unsigned __int64 word
DECLARATIONS ///.
Definition kitPerm.c:36
unsigned fPhase
Definition gia.h:87
#define assert(ex)
Definition util_old.h:213
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
Definition vecInt.h:54
#define Vec_WrdForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
Definition vecWrd.h:54
typedefABC_NAMESPACE_HEADER_START struct Vec_Wrd_t_ Vec_Wrd_t
INCLUDES ///.
Definition vecWrd.h:42
Here is the call graph for this function:

◆ Gia_ManBuiltInSimCheckEqual()

int Gia_ManBuiltInSimCheckEqual ( Gia_Man_t * p,
int iLit0,
int iLit1 )

Definition at line 902 of file giaSim.c.

903{
904 word * pInfo0 = Gia_ManBuiltInData( p, Abc_Lit2Var(iLit0) );
905 word * pInfo1 = Gia_ManBuiltInData( p, Abc_Lit2Var(iLit1) ); int w;
906 assert( p->fBuiltInSim || p->fIncrSim );
907
908// printf( "%d %d\n", Abc_LitIsCompl(iLit0), Abc_LitIsCompl(iLit1) );
909// Extra_PrintBinary( stdout, pInfo0, 64*p->nSimWords ); printf( "\n" );
910// Extra_PrintBinary( stdout, pInfo1, 64*p->nSimWords ); printf( "\n" );
911// printf( "\n" );
912
913 if ( Abc_LitIsCompl(iLit0) )
914 {
915 if ( Abc_LitIsCompl(iLit1) )
916 {
917 for ( w = 0; w < p->nSimWords; w++ )
918 if ( ~pInfo0[w] != ~pInfo1[w] )
919 return 0;
920 }
921 else
922 {
923 for ( w = 0; w < p->nSimWords; w++ )
924 if ( ~pInfo0[w] != pInfo1[w] )
925 return 0;
926 }
927 }
928 else
929 {
930 if ( Abc_LitIsCompl(iLit1) )
931 {
932 for ( w = 0; w < p->nSimWords; w++ )
933 if ( pInfo0[w] != ~pInfo1[w] )
934 return 0;
935 }
936 else
937 {
938 for ( w = 0; w < p->nSimWords; w++ )
939 if ( pInfo0[w] != pInfo1[w] )
940 return 0;
941 }
942 }
943 return 1;
944}
Here is the caller graph for this function:

◆ Gia_ManBuiltInSimCheckOver()

int Gia_ManBuiltInSimCheckOver ( Gia_Man_t * p,
int iLit0,
int iLit1 )

Definition at line 859 of file giaSim.c.

860{
861 word * pInfo0 = Gia_ManBuiltInData( p, Abc_Lit2Var(iLit0) );
862 word * pInfo1 = Gia_ManBuiltInData( p, Abc_Lit2Var(iLit1) ); int w;
863 assert( p->fBuiltInSim || p->fIncrSim );
864
865// printf( "%d %d\n", Abc_LitIsCompl(iLit0), Abc_LitIsCompl(iLit1) );
866// Extra_PrintBinary( stdout, pInfo0, 64*p->nSimWords ); printf( "\n" );
867// Extra_PrintBinary( stdout, pInfo1, 64*p->nSimWords ); printf( "\n" );
868// printf( "\n" );
869
870 if ( Abc_LitIsCompl(iLit0) )
871 {
872 if ( Abc_LitIsCompl(iLit1) )
873 {
874 for ( w = 0; w < p->nSimWords; w++ )
875 if ( ~pInfo0[w] & ~pInfo1[w] )
876 return 1;
877 }
878 else
879 {
880 for ( w = 0; w < p->nSimWords; w++ )
881 if ( ~pInfo0[w] & pInfo1[w] )
882 return 1;
883 }
884 }
885 else
886 {
887 if ( Abc_LitIsCompl(iLit1) )
888 {
889 for ( w = 0; w < p->nSimWords; w++ )
890 if ( pInfo0[w] & ~pInfo1[w] )
891 return 1;
892 }
893 else
894 {
895 for ( w = 0; w < p->nSimWords; w++ )
896 if ( pInfo0[w] & pInfo1[w] )
897 return 1;
898 }
899 }
900 return 0;
901}
Here is the caller graph for this function:

◆ Gia_ManBuiltInSimPack()

int Gia_ManBuiltInSimPack ( Gia_Man_t * p,
Vec_Int_t * vPat )

Definition at line 946 of file giaSim.c.

947{
948 int i, k, iLit;
949 assert( Vec_IntSize(vPat) > 0 );
950 //printf( "%d ", Vec_IntSize(vPat) );
951 for ( i = 0; i < p->iPatsPi; i++ )
952 {
953 Vec_IntForEachEntry( vPat, iLit, k )
954 if ( Abc_TtGetBit(Gia_ManBuiltInDataPi(p, Abc_Lit2Var(iLit)), i) &&
955 Abc_TtGetBit(Gia_ManBuiltInData(p, 1+Abc_Lit2Var(iLit)), i) == Abc_LitIsCompl(iLit) )
956 break;
957 if ( k == Vec_IntSize(vPat) )
958 return i; // success
959 }
960 return -1; // failure
961}
Here is the caller graph for this function:

◆ Gia_ManBuiltInSimPerform()

void Gia_ManBuiltInSimPerform ( Gia_Man_t * p,
int iObj )

Definition at line 824 of file giaSim.c.

825{
826 int w;
827 for ( w = 0; w < p->nSimWords; w++ )
828 Vec_WrdPush( p->vSims, 0 );
830}
void Gia_ManBuiltInSimPerformInt(Gia_Man_t *p, int iObj)
Definition giaSim.c:797
Here is the call graph for this function:

◆ Gia_ManBuiltInSimPerformInt()

void Gia_ManBuiltInSimPerformInt ( Gia_Man_t * p,
int iObj )

Definition at line 797 of file giaSim.c.

798{
799 Gia_Obj_t * pObj = Gia_ManObj( p, iObj ); int w;
800 word * pInfo = Gia_ManBuiltInData( p, iObj );
801 word * pInfo0 = Gia_ManBuiltInData( p, Gia_ObjFaninId0(pObj, iObj) );
802 word * pInfo1 = Gia_ManBuiltInData( p, Gia_ObjFaninId1(pObj, iObj) );
803 assert( p->fBuiltInSim || p->fIncrSim );
804 if ( Gia_ObjFaninC0(pObj) )
805 {
806 if ( Gia_ObjFaninC1(pObj) )
807 for ( w = 0; w < p->nSimWords; w++ )
808 pInfo[w] = ~(pInfo0[w] | pInfo1[w]);
809 else
810 for ( w = 0; w < p->nSimWords; w++ )
811 pInfo[w] = ~pInfo0[w] & pInfo1[w];
812 }
813 else
814 {
815 if ( Gia_ObjFaninC1(pObj) )
816 for ( w = 0; w < p->nSimWords; w++ )
817 pInfo[w] = pInfo0[w] & ~pInfo1[w];
818 else
819 for ( w = 0; w < p->nSimWords; w++ )
820 pInfo[w] = pInfo0[w] & pInfo1[w];
821 }
822 assert( Vec_WrdSize(p->vSims) == Gia_ManObjNum(p) * p->nSimWords );
823}
Here is the caller graph for this function:

◆ Gia_ManBuiltInSimResimulate()

void Gia_ManBuiltInSimResimulate ( Gia_Man_t * p)

Definition at line 852 of file giaSim.c.

853{
854 Gia_Obj_t * pObj; int iObj;
855 Gia_ManForEachAnd( p, pObj, iObj )
857}
#define Gia_ManForEachAnd(p, pObj, i)
Definition gia.h:1214
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Gia_ManBuiltInSimResimulateCone()

void Gia_ManBuiltInSimResimulateCone ( Gia_Man_t * p,
int iLit0,
int iLit1 )

Definition at line 846 of file giaSim.c.

847{
849 Gia_ManBuiltInSimResimulateCone_rec( p, Abc_Lit2Var(iLit0) );
850 Gia_ManBuiltInSimResimulateCone_rec( p, Abc_Lit2Var(iLit1) );
851}
void Gia_ManBuiltInSimResimulateCone_rec(Gia_Man_t *p, int iObj)
Definition giaSim.c:832
void Gia_ManIncrementTravId(Gia_Man_t *p)
Definition giaUtil.c:190
Here is the call graph for this function:

◆ Gia_ManBuiltInSimResimulateCone_rec()

void Gia_ManBuiltInSimResimulateCone_rec ( Gia_Man_t * p,
int iObj )

Definition at line 832 of file giaSim.c.

833{
834 Gia_Obj_t * pObj;
835 if ( Gia_ObjIsTravIdCurrentId(p, iObj) )
836 return;
837 Gia_ObjSetTravIdCurrentId(p, iObj);
838 pObj = Gia_ManObj( p, iObj );
839 if ( Gia_ObjIsCi(pObj) )
840 return;
841 assert( Gia_ObjIsAnd(pObj) );
842 Gia_ManBuiltInSimResimulateCone_rec( p, Gia_ObjFaninId0(pObj, iObj) );
843 Gia_ManBuiltInSimResimulateCone_rec( p, Gia_ObjFaninId1(pObj, iObj) );
845}
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Gia_ManBuiltInSimStart()

void Gia_ManBuiltInSimStart ( Gia_Man_t * p,
int nWords,
int nObjs )

Definition at line 776 of file giaSim.c.

777{
778 int i, k;
779 assert( !p->fBuiltInSim );
780 assert( Gia_ManAndNum(p) == 0 );
781 p->fBuiltInSim = 1;
782 p->iPatsPi = 0;
783 p->iPastPiMax = 0;
784 p->nSimWords = nWords;
785 p->nSimWordsMax = 8;
786 Gia_ManRandomW( 1 );
787 // init PI care info
788 p->vSimsPi = Vec_WrdAlloc( p->nSimWords * Gia_ManCiNum(p) );
789 Vec_WrdFill( p->vSimsPi, p->nSimWords * Gia_ManCiNum(p), 0 );
790 // init object sim info
791 p->vSims = Vec_WrdAlloc( p->nSimWords * nObjs );
792 Vec_WrdFill( p->vSims, p->nSimWords, 0 );
793 for ( i = 0; i < Gia_ManCiNum(p); i++ )
794 for ( k = 0; k < p->nSimWords; k++ )
795 Vec_WrdPush( p->vSims, Gia_ManRandomW(0) );
796}
int nWords
Definition abcNpn.c:127
Here is the call graph for this function:

◆ Gia_ManGenerateCounter()

Abc_Cex_t * Gia_ManGenerateCounter ( Gia_Man_t * pAig,
int iFrame,
int iOut,
int nWords,
int iPat,
Vec_Int_t * vCis2Ids )

Function*************************************************************

Synopsis [Returns the counter-example.]

Description []

SideEffects []

SeeAlso []

Definition at line 543 of file giaSim.c.

544{
545 Abc_Cex_t * p;
546 unsigned * pData;
547 int f, i, w, iPioId, Counter;
548 p = Abc_CexAlloc( Gia_ManRegNum(pAig), Gia_ManPiNum(pAig), iFrame+1 );
549 p->iFrame = iFrame;
550 p->iPo = iOut;
551 // fill in the binary data
552 Counter = p->nRegs;
553 pData = ABC_ALLOC( unsigned, nWords );
554 for ( f = 0; f <= iFrame; f++, Counter += p->nPis )
555 for ( i = 0; i < Gia_ManPiNum(pAig); i++ )
556 {
557 iPioId = Vec_IntEntry( vCis2Ids, i );
558 if ( iPioId >= p->nPis )
559 continue;
560 for ( w = nWords-1; w >= 0; w-- )
561 pData[w] = Gia_ManRandom( 0 );
562 if ( Abc_InfoHasBit( pData, iPat ) )
563 Abc_InfoSetBit( p->pData, Counter + iPioId );
564 }
565 ABC_FREE( pData );
566 return p;
567}
#define ABC_ALLOC(type, num)
Definition abc_global.h:264
#define ABC_FREE(obj)
Definition abc_global.h:267
unsigned Gia_ManRandom(int fReset)
FUNCTION DEFINITIONS ///.
Definition giaUtil.c:49
ABC_NAMESPACE_IMPL_START Abc_Cex_t * Abc_CexAlloc(int nRegs, int nRealPis, int nFrames)
DECLARATIONS ///.
Definition utilCex.c:51
typedefABC_NAMESPACE_HEADER_START struct Abc_Cex_t_ Abc_Cex_t
INCLUDES ///.
Definition utilCex.h:39
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Gia_ManIncrSimCheckEqual()

int Gia_ManIncrSimCheckEqual ( Gia_Man_t * p,
int iLit0,
int iLit1 )

Definition at line 1214 of file giaSim.c.

1215{
1216 assert( iLit0 > 1 && iLit1 > 1 );
1218 Gia_ManIncrSimCone_rec( p, Abc_Lit2Var(iLit0) );
1219 Gia_ManIncrSimCone_rec( p, Abc_Lit2Var(iLit1) );
1220// return 1; // disable
1221 return Gia_ManBuiltInSimCheckEqual( p, iLit0, iLit1 );
1222}
void Gia_ManIncrSimCone_rec(Gia_Man_t *p, int iObj)
Definition giaSim.c:1191
int Gia_ManBuiltInSimCheckEqual(Gia_Man_t *p, int iLit0, int iLit1)
Definition giaSim.c:902
void Gia_ManIncrSimUpdate(Gia_Man_t *p)
Definition giaSim.c:1131
Here is the call graph for this function:

◆ Gia_ManIncrSimCheckOver()

int Gia_ManIncrSimCheckOver ( Gia_Man_t * p,
int iLit0,
int iLit1 )

Definition at line 1205 of file giaSim.c.

1206{
1207 assert( iLit0 > 1 && iLit1 > 1 );
1209 Gia_ManIncrSimCone_rec( p, Abc_Lit2Var(iLit0) );
1210 Gia_ManIncrSimCone_rec( p, Abc_Lit2Var(iLit1) );
1211// return 0; // disable
1212 return Gia_ManBuiltInSimCheckOver( p, iLit0, iLit1 );
1213}
int Gia_ManBuiltInSimCheckOver(Gia_Man_t *p, int iLit0, int iLit1)
Definition giaSim.c:859
Here is the call graph for this function:

◆ Gia_ManIncrSimCone_rec()

void Gia_ManIncrSimCone_rec ( Gia_Man_t * p,
int iObj )

Definition at line 1191 of file giaSim.c.

1192{
1193 Gia_Obj_t * pObj = Gia_ManObj( p, iObj );
1194 if ( Gia_ObjIsCi(pObj) )
1195 return;
1196 if ( Vec_IntEntry(p->vTimeStamps, iObj) == p->iTimeStamp )
1197 return;
1198 assert( Vec_IntEntry(p->vTimeStamps, iObj) < p->iTimeStamp );
1199 Vec_IntWriteEntry( p->vTimeStamps, iObj, p->iTimeStamp );
1200 assert( Gia_ObjIsAnd(pObj) );
1201 Gia_ManIncrSimCone_rec( p, Gia_ObjFaninId0(pObj, iObj) );
1202 Gia_ManIncrSimCone_rec( p, Gia_ObjFaninId1(pObj, iObj) );
1204}
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Gia_ManIncrSimSet()

void Gia_ManIncrSimSet ( Gia_Man_t * p,
Vec_Int_t * vObjLits )

Definition at line 1174 of file giaSim.c.

1175{
1176 int i, iLit;
1177 assert( Vec_IntSize(vObjLits) > 0 );
1178 p->iTimeStamp++;
1179 Vec_IntForEachEntry( vObjLits, iLit, i )
1180 {
1181 word * pSims = Gia_ManBuiltInData( p, Abc_Lit2Var(iLit) );
1182 if ( Gia_ObjIsAnd(Gia_ManObj(p, Abc_Lit2Var(iLit))) )
1183 continue;
1184 //assert( Vec_IntEntry(p->vTimeStamps, Abc_Lit2Var(iLit)) == p->iTimeStamp-1 );
1185 Vec_IntWriteEntry(p->vTimeStamps, Abc_Lit2Var(iLit), p->iTimeStamp);
1186 if ( Abc_TtGetBit(pSims, p->iPatsPi) == Abc_LitIsCompl(iLit) )
1187 Abc_TtXorBit(pSims, p->iPatsPi);
1188 }
1189 p->iPatsPi = (p->iPatsPi == p->nSimWords * 64 - 1) ? 0 : p->iPatsPi + 1;
1190}

◆ Gia_ManIncrSimStart()

void Gia_ManIncrSimStart ( Gia_Man_t * p,
int nWords,
int nObjs )

Definition at line 1150 of file giaSim.c.

1151{
1152 assert( !p->fIncrSim );
1153 p->fIncrSim = 1;
1154 p->iPatsPi = 0;
1155 p->nSimWords = nWords;
1156 // init time stamps
1157 p->iTimeStamp = 1;
1158 p->vTimeStamps = Vec_IntAlloc( p->nSimWords );
1159 // init object sim info
1160 p->iNextPi = 0;
1161 p->vSims = Vec_WrdAlloc( p->nSimWords * nObjs );
1162 Gia_ManRandomW( 1 );
1163}
Here is the call graph for this function:

◆ Gia_ManIncrSimStop()

void Gia_ManIncrSimStop ( Gia_Man_t * p)

Definition at line 1164 of file giaSim.c.

1165{
1166 assert( p->fIncrSim );
1167 p->fIncrSim = 0;
1168 p->iPatsPi = 0;
1169 p->nSimWords = 0;
1170 p->iTimeStamp = 1;
1171 Vec_IntFreeP( &p->vTimeStamps );
1172 Vec_WrdFreeP( &p->vSims );
1173}

◆ Gia_ManIncrSimUpdate()

void Gia_ManIncrSimUpdate ( Gia_Man_t * p)

Function*************************************************************

Synopsis [Bit-parallel simulation during AIG construction.]

Description []

SideEffects []

SeeAlso []

Definition at line 1131 of file giaSim.c.

1132{
1133 int i, k;
1134 // extend timestamp info
1135 assert( Vec_IntSize(p->vTimeStamps) <= Gia_ManObjNum(p) );
1136 Vec_IntFillExtra( p->vTimeStamps, Gia_ManObjNum(p), 0 );
1137 // extend simulation info
1138 assert( Vec_WrdSize(p->vSims) <= Gia_ManObjNum(p) * p->nSimWords );
1139 Vec_WrdFillExtra( p->vSims, Gia_ManObjNum(p) * p->nSimWords, 0 );
1140 // extend PI info
1141 assert( p->iNextPi <= Gia_ManCiNum(p) );
1142 for ( i = p->iNextPi; i < Gia_ManCiNum(p); i++ )
1143 {
1144 word * pSims = Gia_ManBuiltInData( p, Gia_ManCiIdToId(p, i) );
1145 for ( k = 0; k < p->nSimWords; k++ )
1146 pSims[k] = Gia_ManRandomW(0);
1147 }
1148 p->iNextPi = Gia_ManCiNum(p);
1149}
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Gia_ManObjCheckOverlap()

int Gia_ManObjCheckOverlap ( Gia_Man_t * p,
int iLit0,
int iLit1,
Vec_Int_t * vObjs )

Definition at line 1109 of file giaSim.c.

1110{
1111 if ( Gia_ManObjCheckOverlap1( p, iLit0, iLit1, vObjs ) )
1112 return 1;
1113 return Gia_ManObjCheckOverlap1( p, iLit1, iLit0, vObjs );
1114}
int Gia_ManObjCheckOverlap1(Gia_Man_t *p, int iLit0, int iLit1, Vec_Int_t *vObjs)
Definition giaSim.c:1095
Here is the call graph for this function:

◆ Gia_ManObjCheckOverlap1()

int Gia_ManObjCheckOverlap1 ( Gia_Man_t * p,
int iLit0,
int iLit1,
Vec_Int_t * vObjs )

Definition at line 1095 of file giaSim.c.

1096{
1097 Gia_Obj_t * pObj;
1098 int i, Res0, Res1 = 0;
1099// Gia_ManForEachObj( p, pObj, i )
1100// assert( pObj->fMark0 == 0 && pObj->fMark1 == 0 );
1101 Vec_IntClear( vObjs );
1102 Res0 = Gia_ManObjCheckSat_rec( p, iLit0, vObjs );
1103 if ( Res0 )
1104 Res1 = Gia_ManObjCheckSat_rec( p, iLit1, vObjs );
1105 Gia_ManForEachObjVec( vObjs, p, pObj, i )
1106 pObj->fMark0 = pObj->fMark1 = 0;
1107 return Res0 && Res1;
1108}
int Gia_ManObjCheckSat_rec(Gia_Man_t *p, int iLit, Vec_Int_t *vObjs)
Definition giaSim.c:1072
#define Gia_ManForEachObjVec(vVec, p, pObj, i)
Definition gia.h:1194
unsigned fMark1
Definition gia.h:86
unsigned fMark0
Definition gia.h:81
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Gia_ManObjCheckSat_rec()

int Gia_ManObjCheckSat_rec ( Gia_Man_t * p,
int iLit,
Vec_Int_t * vObjs )

Function*************************************************************

Synopsis [Finds a satisfying assignment.]

Description [Returns 1 if a sat assignment is found; 0 otherwise.]

SideEffects []

SeeAlso []

Definition at line 1072 of file giaSim.c.

1073{
1074 int iObj = Abc_Lit2Var(iLit);
1075 Gia_Obj_t * pObj = Gia_ManObj( p, iObj );
1076 if ( pObj->fMark0 )
1077 return pObj->fMark1 == (unsigned)Abc_LitIsCompl(iLit);
1078 pObj->fMark0 = 1;
1079 pObj->fMark1 = Abc_LitIsCompl(iLit);
1080 Vec_IntPush( vObjs, iObj );
1081 if ( Gia_ObjIsAnd(pObj) )
1082 {
1083 if ( pObj->fMark1 == 0 ) // node value is 1
1084 {
1085 if ( !Gia_ManObjCheckSat_rec( p, Gia_ObjFaninLit0(pObj, iObj), vObjs ) ) return 0;
1086 if ( !Gia_ManObjCheckSat_rec( p, Gia_ObjFaninLit1(pObj, iObj), vObjs ) ) return 0;
1087 }
1088 else
1089 {
1090 if ( !Gia_ManObjCheckSat_rec( p, Abc_LitNot(Gia_ObjFaninLit0(pObj, iObj)), vObjs ) ) return 0;
1091 }
1092 }
1093 return 1;
1094}
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Gia_ManResetRandom()

void Gia_ManResetRandom ( Gia_ParSim_t * pPars)

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 580 of file giaSim.c.

581{
582 int i;
583 Gia_ManRandom( 1 );
584 for ( i = 0; i < pPars->RandSeed; i++ )
585 Gia_ManRandom( 0 );
586}
int RandSeed
Definition gia.h:312
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Gia_ManSimCollect()

void Gia_ManSimCollect ( Gia_Man_t * pGia,
Gia_Obj_t * pObj,
Vec_Int_t * vVec )

Function*************************************************************

Synopsis [Derives signal implications.]

Description []

SideEffects []

SeeAlso []

Definition at line 76 of file giaSim.c.

77{
78 Vec_IntClear( vVec );
79 Gia_ManSimCollect_rec( pGia, pObj, vVec );
80 Vec_IntUniqify( vVec );
81}
void Gia_ManSimCollect_rec(Gia_Man_t *pGia, Gia_Obj_t *pObj, Vec_Int_t *vVec)
FUNCTION DEFINITIONS ///.
Definition giaSim.c:55
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Gia_ManSimCollect_rec()

void Gia_ManSimCollect_rec ( Gia_Man_t * pGia,
Gia_Obj_t * pObj,
Vec_Int_t * vVec )

FUNCTION DEFINITIONS ///.

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 55 of file giaSim.c.

56{
57 Vec_IntPush( vVec, Gia_ObjToLit(pGia, pObj) );
58 if ( Gia_IsComplement(pObj) || Gia_ObjIsCi(pObj) )
59 return;
60 assert( Gia_ObjIsAnd(pObj) );
61 Gia_ManSimCollect_rec( pGia, Gia_ObjChild0(pObj), vVec );
62 Gia_ManSimCollect_rec( pGia, Gia_ObjChild1(pObj), vVec );
63}
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Gia_ManSimCreate()

Gia_ManSim_t * Gia_ManSimCreate ( Gia_Man_t * pAig,
Gia_ParSim_t * pPars )

Function*************************************************************

Synopsis [Creates fast simulation manager.]

Description []

SideEffects []

SeeAlso []

Definition at line 211 of file giaSim.c.

212{
213 Gia_ManSim_t * p;
214 int Entry, i;
215 p = ABC_ALLOC( Gia_ManSim_t, 1 );
216 memset( p, 0, sizeof(Gia_ManSim_t) );
217 // look for reset signals
218 if ( pPars->fVerbose )
219 p->vConsts = Gia_ManSimDeriveResets( pAig );
220 // derive the frontier
221 p->pAig = Gia_ManFront( pAig );
222 p->pPars = pPars;
223 p->nWords = pPars->nWords;
224 p->pDataSim = ABC_ALLOC( unsigned, p->nWords * p->pAig->nFront );
225 p->pDataSimCis = ABC_ALLOC( unsigned, p->nWords * Gia_ManCiNum(p->pAig) );
226 p->pDataSimCos = ABC_ALLOC( unsigned, p->nWords * Gia_ManCoNum(p->pAig) );
227 if ( !p->pDataSim || !p->pDataSimCis || !p->pDataSimCos )
228 {
229 Abc_Print( 1, "Simulator could not allocate %.2f GB for simulation info.\n",
230 4.0 * p->nWords * (p->pAig->nFront + Gia_ManCiNum(p->pAig) + Gia_ManCoNum(p->pAig)) / (1<<30) );
232 return NULL;
233 }
234 p->vCis2Ids = Vec_IntAlloc( Gia_ManCiNum(p->pAig) );
235 Vec_IntForEachEntry( pAig->vCis, Entry, i )
236 Vec_IntPush( p->vCis2Ids, i ); // do we need p->vCis2Ids?
237 if ( pPars->fVerbose )
238 Abc_Print( 1, "AIG = %7.2f MB. Front mem = %7.2f MB. Other mem = %7.2f MB.\n",
239 12.0*Gia_ManObjNum(p->pAig)/(1<<20),
240 4.0*p->nWords*p->pAig->nFront/(1<<20),
241 4.0*p->nWords*(Gia_ManCiNum(p->pAig) + Gia_ManCoNum(p->pAig))/(1<<20) );
242
243 return p;
244}
void Gia_ManSimDelete(Gia_ManSim_t *p)
Definition giaSim.c:189
Vec_Int_t * Gia_ManSimDeriveResets(Gia_Man_t *pGia)
Definition giaSim.c:94
struct Gia_ManSim_t_ Gia_ManSim_t
Definition gia.h:319
Gia_Man_t * Gia_ManFront(Gia_Man_t *p)
Definition giaFront.c:147
Vec_Int_t * vCis
Definition gia.h:110
int nWords
Definition gia.h:310
int fVerbose
Definition gia.h:315
char * memset()
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Gia_ManSimDelete()

void Gia_ManSimDelete ( Gia_ManSim_t * p)

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 189 of file giaSim.c.

190{
191 Vec_IntFreeP( &p->vConsts );
192 Vec_IntFreeP( &p->vCis2Ids );
193 Gia_ManStopP( &p->pAig );
194 ABC_FREE( p->pDataSim );
195 ABC_FREE( p->pDataSimCis );
196 ABC_FREE( p->pDataSimCos );
197 ABC_FREE( p );
198}
void Gia_ManStopP(Gia_Man_t **p)
Definition giaMan.c:224
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Gia_ManSimDeriveResets()

Vec_Int_t * Gia_ManSimDeriveResets ( Gia_Man_t * pGia)

Function*************************************************************

Synopsis [Finds signals, which reset flops to have constant values.]

Description []

SideEffects []

SeeAlso []

Definition at line 94 of file giaSim.c.

95{
96 int nImpLimit = 5;
97 Vec_Int_t * vResult;
98 Vec_Int_t * vCountLits, * vSuperGate;
99 Gia_Obj_t * pObj;
100 int i, k, Lit, Count;
101 int Counter0 = 0, Counter1 = 0;
102 int CounterPi0 = 0, CounterPi1 = 0;
103 abctime clk = Abc_Clock();
104
105 // create reset counters for each literal
106 vCountLits = Vec_IntStart( 2 * Gia_ManObjNum(pGia) );
107
108 // collect implications for each flop input driver
109 vSuperGate = Vec_IntAlloc( 1000 );
110 Gia_ManForEachRi( pGia, pObj, i )
111 {
112 if ( Gia_ObjFaninId0p(pGia, pObj) == 0 )
113 continue;
114 Vec_IntAddToEntry( vCountLits, Gia_ObjToLit(pGia, Gia_ObjChild0(pObj)), 1 );
115 Gia_ManSimCollect( pGia, Gia_ObjFanin0(pObj), vSuperGate );
116 Vec_IntForEachEntry( vSuperGate, Lit, k )
117 Vec_IntAddToEntry( vCountLits, Lit, 1 );
118 }
119 Vec_IntFree( vSuperGate );
120
121 // label signals whose counter if more than the limit
122 vResult = Vec_IntStartFull( Gia_ManObjNum(pGia) );
123 Vec_IntForEachEntry( vCountLits, Count, Lit )
124 {
125 if ( Count < nImpLimit )
126 continue;
127 pObj = Gia_ManObj( pGia, Abc_Lit2Var(Lit) );
128 if ( Abc_LitIsCompl(Lit) ) // const 0
129 {
130// Ssm_ObjSetLogic0( pObj );
131 Vec_IntWriteEntry( vResult, Abc_Lit2Var(Lit), 0 );
132 CounterPi0 += Gia_ObjIsPi(pGia, pObj);
133 Counter0++;
134 }
135 else
136 {
137// Ssm_ObjSetLogic1( pObj );
138 Vec_IntWriteEntry( vResult, Abc_Lit2Var(Lit), 1 );
139 CounterPi1 += Gia_ObjIsPi(pGia, pObj);
140 Counter1++;
141 }
142// if ( Gia_ObjIsPi(pGia, pObj) )
143// printf( "%d ", Count );
144 }
145// printf( "\n" );
146 Vec_IntFree( vCountLits );
147
148 printf( "Logic0 = %d (%d). Logic1 = %d (%d). ", Counter0, CounterPi0, Counter1, CounterPi1 );
149 Abc_PrintTime( 1, "Time", Abc_Clock() - clk );
150 return vResult;
151}
ABC_INT64_T abctime
Definition abc_global.h:332
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Definition bblif.c:37
void Gia_ManSimCollect(Gia_Man_t *pGia, Gia_Obj_t *pObj, Vec_Int_t *vVec)
Definition giaSim.c:76
#define Gia_ManForEachRi(p, pObj, i)
Definition gia.h:1254
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Gia_ManSimInfoInit()

void Gia_ManSimInfoInit ( Gia_ManSim_t * p)

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 430 of file giaSim.c.

431{
432 int iPioNum, i;
433 Vec_IntForEachEntry( p->vCis2Ids, iPioNum, i )
434 {
435 if ( iPioNum < Gia_ManPiNum(p->pAig) )
436 Gia_ManSimInfoRandom( p, Gia_SimDataCi(p, i) );
437 else
438 Gia_ManSimInfoZero( p, Gia_SimDataCi(p, i) );
439 }
440}
Here is the caller graph for this function:

◆ Gia_ManSimInfoTransfer()

void Gia_ManSimInfoTransfer ( Gia_ManSim_t * p)

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 453 of file giaSim.c.

454{
455 int iPioNum, i;
456 Vec_IntForEachEntry( p->vCis2Ids, iPioNum, i )
457 {
458 if ( iPioNum < Gia_ManPiNum(p->pAig) )
459 Gia_ManSimInfoRandom( p, Gia_SimDataCi(p, i) );
460 else
461 Gia_ManSimInfoCopy( p, Gia_SimDataCi(p, i), Gia_SimDataCo(p, Gia_ManPoNum(p->pAig)+iPioNum-Gia_ManPiNum(p->pAig)) );
462 }
463}
Here is the caller graph for this function:

◆ Gia_ManSimOneBit()

void Gia_ManSimOneBit ( Gia_Man_t * p,
Vec_Int_t * vValues )

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 1236 of file giaSim.c.

1237{
1238 Gia_Obj_t * pObj; int k;
1239 assert( Vec_IntSize(vValues) == Gia_ManCiNum(p) );
1240
1241 Gia_ManConst0(p)->fMark0 = 0;
1242 Gia_ManForEachCi( p, pObj, k )
1243 pObj->fMark0 = Vec_IntEntry(vValues, k);
1244 Gia_ManForEachAnd( p, pObj, k )
1245 pObj->fMark0 = (Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj)) & (Gia_ObjFanin1(pObj)->fMark0 ^ Gia_ObjFaninC1(pObj));
1246 Gia_ManForEachCo( p, pObj, k )
1247 pObj->fMark0 = Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj);
1248
1249 Gia_ManForEachCi( p, pObj, k )
1250 printf( "%d", k % 10 );
1251 printf( "\n" );
1252 Gia_ManForEachCi( p, pObj, k )
1253 printf( "%d", Vec_IntEntry(vValues, k) );
1254 printf( "\n" );
1255
1256 Gia_ManForEachCo( p, pObj, k )
1257 printf( "%d", k % 10 );
1258 printf( "\n" );
1259 Gia_ManForEachCo( p, pObj, k )
1260 printf( "%d", pObj->fMark0 );
1261 printf( "\n" );
1262 printf( "\n" );
1263}
#define Gia_ManForEachCo(p, pObj, i)
Definition gia.h:1236
#define Gia_ManForEachCi(p, pObj, i)
Definition gia.h:1228
Here is the caller graph for this function:

◆ Gia_ManSimOneBitTest()

void Gia_ManSimOneBitTest ( Gia_Man_t * p)

Definition at line 1378 of file giaSim.c.

1379{
1380 Vec_Int_t * vValues = Vec_IntStart( Gia_ManCiNum(p) );
1381 int i, k;
1382 for ( i = 0; i < 10; i++ )
1383 {
1384 for ( k = 0; k < Vec_IntSize(vValues); k++ )
1385 Vec_IntWriteEntry( vValues, k, Vec_IntEntry(vValues, k) ^ (rand()&1) );
1386
1387 printf( "Values = %d ", Vec_IntSum(vValues) );
1388 Gia_ManSimOneBit( p, vValues );
1389 }
1390}
void Gia_ManSimOneBit(Gia_Man_t *p, Vec_Int_t *vValues)
Definition giaSim.c:1236
Here is the call graph for this function:

◆ Gia_ManSimOneBitTest2()

void Gia_ManSimOneBitTest2 ( Gia_Man_t * p)

Definition at line 1264 of file giaSim.c.

1265{
1266 Vec_Int_t * vValues = Vec_IntStart( Gia_ManCiNum(p) );
1267
1268 Vec_IntWriteEntry( vValues, 0, 1 );
1269 Gia_ManSimOneBit( p, vValues );
1270 Vec_IntFill( vValues, Vec_IntSize(vValues), 0 );
1271
1272 Vec_IntWriteEntry( vValues, 0, 1 );
1273 Vec_IntWriteEntry( vValues, Gia_ManCiNum(p)/2, 1 );
1274 Gia_ManSimOneBit( p, vValues );
1275 Vec_IntFill( vValues, Vec_IntSize(vValues), 0 );
1276
1277 Vec_IntWriteEntry( vValues, 0, 1 );
1278 Vec_IntWriteEntry( vValues, 1, 1 );
1279 Vec_IntWriteEntry( vValues, Gia_ManCiNum(p)/2+2, 1 );
1280 Gia_ManSimOneBit( p, vValues );
1281 Vec_IntFill( vValues, Vec_IntSize(vValues), 0 );
1282
1283 Vec_IntWriteEntry( vValues, 0, 1 );
1284 Vec_IntWriteEntry( vValues, 1, 1 );
1285 Vec_IntWriteEntry( vValues, Gia_ManCiNum(p)/2, 1 );
1286 Gia_ManSimOneBit( p, vValues );
1287 Vec_IntFill( vValues, Vec_IntSize(vValues), 0 );
1288
1289 Vec_IntFill( vValues, Vec_IntSize(vValues)/2, 1 );
1290 Vec_IntFillExtra( vValues, Gia_ManCiNum(p), 0 );
1291 Gia_ManSimOneBit( p, vValues );
1292 Vec_IntFill( vValues, Gia_ManCiNum(p), 0 );
1293
1294 Vec_IntFill( vValues, Gia_ManCiNum(p), 1 );
1295 Gia_ManSimOneBit( p, vValues );
1296 Vec_IntFill( vValues, Gia_ManCiNum(p), 0 );
1297
1298 Vec_IntFill( vValues, Gia_ManCiNum(p), 1 );
1299 Vec_IntWriteEntry( vValues, 127, 1 );
1300 Vec_IntWriteEntry( vValues, 255, 0 );
1301 Gia_ManSimOneBit( p, vValues );
1302 Vec_IntFill( vValues, Gia_ManCiNum(p), 0 );
1303
1304 Vec_IntFill( vValues, Gia_ManCiNum(p), 1 );
1305 Vec_IntWriteEntry( vValues, 127, 0 );
1306 Vec_IntWriteEntry( vValues, 255, 1 );
1307 Gia_ManSimOneBit( p, vValues );
1308 Vec_IntFill( vValues, Gia_ManCiNum(p), 0 );
1309
1310 Vec_IntFill( vValues, Gia_ManCiNum(p), 1 );
1311 Vec_IntWriteEntry( vValues, 127, 0 );
1312 Vec_IntWriteEntry( vValues, 255, 0 );
1313 Gia_ManSimOneBit( p, vValues );
1314 Vec_IntFill( vValues, Gia_ManCiNum(p), 0 );
1315
1316 Vec_IntFree( vValues );
1317}
Here is the call graph for this function:

◆ Gia_ManSimOneBitTest3()

void Gia_ManSimOneBitTest3 ( Gia_Man_t * p)

Definition at line 1318 of file giaSim.c.

1319{
1320 Vec_Int_t * vValues = Vec_IntStart( Gia_ManCiNum(p) );
1321
1322 Vec_IntWriteEntry( vValues, 0, 1 );
1323 Gia_ManSimOneBit( p, vValues );
1324 Vec_IntFill( vValues, Vec_IntSize(vValues), 0 );
1325
1326 Vec_IntWriteEntry( vValues, 0, 1 );
1327 Vec_IntWriteEntry( vValues, Gia_ManCiNum(p)/2, 1 );
1328 Gia_ManSimOneBit( p, vValues );
1329 Vec_IntFill( vValues, Vec_IntSize(vValues), 0 );
1330
1331 Vec_IntWriteEntry( vValues, 0, 1 );
1332 Vec_IntWriteEntry( vValues, 1, 1 );
1333 Vec_IntWriteEntry( vValues, Gia_ManCiNum(p)/2+2, 1 );
1334 Gia_ManSimOneBit( p, vValues );
1335 Vec_IntFill( vValues, Vec_IntSize(vValues), 0 );
1336
1337 Vec_IntWriteEntry( vValues, Gia_ManCiNum(p)/2-1, 1 );
1338 Vec_IntWriteEntry( vValues, Gia_ManCiNum(p) -1, 1 );
1339 Gia_ManSimOneBit( p, vValues );
1340 Vec_IntFill( vValues, Vec_IntSize(vValues), 0 );
1341
1342 Vec_IntWriteEntry( vValues, Gia_ManCiNum(p)/2-1, 1 );
1343 Vec_IntWriteEntry( vValues, Gia_ManCiNum(p)/2-2, 1 );
1344 Vec_IntWriteEntry( vValues, Gia_ManCiNum(p) -1, 1 );
1345 Vec_IntWriteEntry( vValues, Gia_ManCiNum(p) -2, 1 );
1346 Gia_ManSimOneBit( p, vValues );
1347 Vec_IntFill( vValues, Vec_IntSize(vValues), 0 );
1348
1349 Vec_IntWriteEntry( vValues, Gia_ManCiNum(p)/2-2, 1 );
1350 Vec_IntWriteEntry( vValues, Gia_ManCiNum(p) -2, 1 );
1351 Gia_ManSimOneBit( p, vValues );
1352 Vec_IntFill( vValues, Vec_IntSize(vValues), 0 );
1353
1354 Vec_IntWriteEntry( vValues, Gia_ManCiNum(p)/2-1, 1 );
1355 Vec_IntWriteEntry( vValues, Gia_ManCiNum(p)/2-2, 1 );
1356 Vec_IntWriteEntry( vValues, Gia_ManCiNum(p)/2-3, 1 );
1357 Vec_IntWriteEntry( vValues, Gia_ManCiNum(p) -1, 1 );
1358 Vec_IntWriteEntry( vValues, Gia_ManCiNum(p) -2, 1 );
1359 Vec_IntWriteEntry( vValues, Gia_ManCiNum(p) -3, 1 );
1360 Gia_ManSimOneBit( p, vValues );
1361 Vec_IntFill( vValues, Vec_IntSize(vValues), 0 );
1362
1363 Vec_IntWriteEntry( vValues, Gia_ManCiNum(p)/2-2, 1 );
1364 Vec_IntWriteEntry( vValues, Gia_ManCiNum(p)/2-3, 1 );
1365 Vec_IntWriteEntry( vValues, Gia_ManCiNum(p) -2, 1 );
1366 Vec_IntWriteEntry( vValues, Gia_ManCiNum(p) -3, 1 );
1367 Gia_ManSimOneBit( p, vValues );
1368 Vec_IntFill( vValues, Vec_IntSize(vValues), 0 );
1369
1370 Vec_IntFill( vValues, Vec_IntSize(vValues), 1 );
1371 Gia_ManSimOneBit( p, vValues );
1372 Vec_IntFill( vValues, Vec_IntSize(vValues), 0 );
1373
1374 Vec_IntFree( vValues );
1375}
Here is the call graph for this function:

◆ Gia_ManSimReadFile()

Vec_Int_t * Gia_ManSimReadFile ( char * pFileIn)

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 668 of file giaSim.c.

669{
670 int c;
671 Vec_Int_t * vPat;
672 FILE * pFile = fopen( pFileIn, "rb" );
673 if ( pFile == NULL )
674 {
675 printf( "Cannot open input file.\n" );
676 return NULL;
677 }
678 vPat = Vec_IntAlloc( 1000 );
679 while ( (c = fgetc(pFile)) != EOF )
680 if ( c == '0' || c == '1' )
681 Vec_IntPush( vPat, c - '0' );
682 fclose( pFile );
683 return vPat;
684}
Here is the caller graph for this function:

◆ Gia_ManSimSetDefaultParams()

void Gia_ManSimSetDefaultParams ( Gia_ParSim_t * p)

Function*************************************************************

Synopsis [This procedure sets default parameters.]

Description []

SideEffects []

SeeAlso []

Definition at line 165 of file giaSim.c.

166{
167 memset( p, 0, sizeof(Gia_ParSim_t) );
168 // user-controlled parameters
169 p->nWords = 8; // the number of machine words
170 p->nIters = 32; // the number of timeframes
171 p->RandSeed = 0; // the seed to generate random numbers
172 p->TimeLimit = 60; // time limit in seconds
173 p->fCheckMiter = 0; // check if miter outputs are non-zero
174 p->fVerbose = 0; // enables verbose output
175 p->iOutFail = -1; // index of the failed output
176}
struct Gia_ParSim_t_ Gia_ParSim_t
Definition gia.h:306
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Gia_ManSimSimulate()

int Gia_ManSimSimulate ( Gia_Man_t * pAig,
Gia_ParSim_t * pPars )

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 599 of file giaSim.c.

600{
601 extern int Gia_ManSimSimulateEquiv( Gia_Man_t * pAig, Gia_ParSim_t * pPars );
602 Gia_ManSim_t * p;
603 abctime clkTotal = Abc_Clock();
604 int i, iOut, iPat, RetValue = 0;
605 abctime nTimeToStop = pPars->TimeLimit ? pPars->TimeLimit * CLOCKS_PER_SEC + Abc_Clock(): 0;
606 if ( pAig->pReprs && pAig->pNexts )
607 return Gia_ManSimSimulateEquiv( pAig, pPars );
608 ABC_FREE( pAig->pCexSeq );
609 p = Gia_ManSimCreate( pAig, pPars );
610 Gia_ManResetRandom( pPars );
612 for ( i = 0; i < pPars->nIters; i++ )
613 {
615 if ( pPars->fVerbose )
616 {
617 Abc_Print( 1, "Frame %4d out of %4d and timeout %3d sec. ", i+1, pPars->nIters, pPars->TimeLimit );
618 Abc_Print( 1, "Time = %7.2f sec\r", (1.0*Abc_Clock()-clkTotal)/CLOCKS_PER_SEC );
619 }
620 if ( pPars->fCheckMiter && Gia_ManCheckPos( p, &iOut, &iPat ) )
621 {
622 Gia_ManResetRandom( pPars );
623 pPars->iOutFail = iOut;
624 pAig->pCexSeq = Gia_ManGenerateCounter( pAig, i, iOut, p->nWords, iPat, p->vCis2Ids );
625 Abc_Print( 1, "Output %d of miter \"%s\" was asserted in frame %d. ", iOut, pAig->pName, i );
626 if ( !Gia_ManVerifyCex( pAig, pAig->pCexSeq, 0 ) )
627 {
628// Abc_Print( 1, "\n" );
629 Abc_Print( 1, "\nGenerated counter-example is INVALID. " );
630// Abc_Print( 1, "\n" );
631 }
632 else
633 {
634// Abc_Print( 1, "\n" );
635// if ( pPars->fVerbose )
636// Abc_Print( 1, "\nGenerated counter-example is verified correctly. " );
637// Abc_Print( 1, "\n" );
638 }
639 RetValue = 1;
640 break;
641 }
642 if ( Abc_Clock() > nTimeToStop )
643 {
644 i++;
645 break;
646 }
647 if ( i < pPars->nIters - 1 )
649 }
651 if ( pAig->pCexSeq == NULL )
652 Abc_Print( 1, "No bug detected after simulating %d frames with %d words. ", i, pPars->nWords );
653 Abc_PrintTime( 1, "Time", Abc_Clock() - clkTotal );
654 return RetValue;
655}
int Gia_ManSimSimulateEquiv(Gia_Man_t *pAig, Gia_ParSim_t *pPars)
Definition giaSim2.c:638
void Gia_ManResetRandom(Gia_ParSim_t *pPars)
Definition giaSim.c:580
Gia_ManSim_t * Gia_ManSimCreate(Gia_Man_t *pAig, Gia_ParSim_t *pPars)
Definition giaSim.c:211
void Gia_ManSimInfoTransfer(Gia_ManSim_t *p)
Definition giaSim.c:453
void Gia_ManSimInfoInit(Gia_ManSim_t *p)
Definition giaSim.c:430
Abc_Cex_t * Gia_ManGenerateCounter(Gia_Man_t *pAig, int iFrame, int iOut, int nWords, int iPat, Vec_Int_t *vCis2Ids)
Definition giaSim.c:543
void Gia_ManSimulateRound(Gia_ManSim_t *p)
Definition giaSim.c:476
struct Gia_Man_t_ Gia_Man_t
Definition gia.h:96
int Gia_ManVerifyCex(Gia_Man_t *pAig, Abc_Cex_t *p, int fDualOut)
DECLARATIONS ///.
Definition giaCex.c:48
Gia_Rpr_t * pReprs
Definition gia.h:126
int * pNexts
Definition gia.h:127
Abc_Cex_t * pCexSeq
Definition gia.h:150
char * pName
Definition gia.h:99
int fCheckMiter
Definition gia.h:314
int TimeLimit
Definition gia.h:313
int iOutFail
Definition gia.h:316
int nIters
Definition gia.h:311
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Gia_ManSimSimulateOne()

Vec_Int_t * Gia_ManSimSimulateOne ( Gia_Man_t * p,
Vec_Int_t * vPat )

Definition at line 704 of file giaSim.c.

705{
706 Vec_Int_t * vPatOut;
707 Gia_Obj_t * pObj, * pObjRo;
708 int i, k, f;
709 assert( Vec_IntSize(vPat) % Gia_ManPiNum(p) == 0 );
710 Gia_ManConst0(p)->fMark1 = 0;
711 Gia_ManForEachRo( p, pObj, i )
712 pObj->fMark1 = 0;
713 vPatOut = Vec_IntAlloc( 1000 );
714 for ( k = f = 0; f < Vec_IntSize(vPat) / Gia_ManPiNum(p); f++ )
715 {
716 Gia_ManForEachPi( p, pObj, i )
717 pObj->fMark1 = Vec_IntEntry( vPat, k++ );
718 Gia_ManForEachAnd( p, pObj, i )
719 pObj->fMark1 = (Gia_ObjFanin0(pObj)->fMark1 ^ Gia_ObjFaninC0(pObj)) & (Gia_ObjFanin1(pObj)->fMark1 ^ Gia_ObjFaninC1(pObj));
720 Gia_ManForEachCo( p, pObj, i )
721 pObj->fMark1 = (Gia_ObjFanin0(pObj)->fMark1 ^ Gia_ObjFaninC0(pObj));
722 Gia_ManForEachPo( p, pObj, i )
723 Vec_IntPush( vPatOut, pObj->fMark1 );
724 Gia_ManForEachRiRo( p, pObj, pObjRo, i )
725 pObjRo->fMark1 = pObj->fMark1;
726 }
727 assert( k == Vec_IntSize(vPat) );
728 Gia_ManForEachObj( p, pObj, i )
729 pObj->fMark1 = 0;
730 return vPatOut;
731}
#define Gia_ManForEachRo(p, pObj, i)
Definition gia.h:1252
#define Gia_ManForEachPo(p, pObj, i)
Definition gia.h:1250
#define Gia_ManForEachPi(p, pObj, i)
Definition gia.h:1248
#define Gia_ManForEachObj(p, pObj, i)
MACRO DEFINITIONS ///.
Definition gia.h:1190
#define Gia_ManForEachRiRo(p, pObjRi, pObjRo, i)
Definition gia.h:1256
Here is the caller graph for this function:

◆ Gia_ManSimSimulatePattern()

void Gia_ManSimSimulatePattern ( Gia_Man_t * p,
char * pFileIn,
char * pFileOut )

Definition at line 732 of file giaSim.c.

733{
734 Vec_Int_t * vPat, * vPatOut;
735 vPat = Gia_ManSimReadFile( pFileIn );
736 if ( vPat == NULL )
737 return;
738 if ( Vec_IntSize(vPat) % Gia_ManPiNum(p) )
739 {
740 printf( "The number of 0s and 1s in the input file (%d) does not evenly divide by the number of primary inputs (%d).\n",
741 Vec_IntSize(vPat), Gia_ManPiNum(p) );
742 Vec_IntFree( vPat );
743 return;
744 }
745 vPatOut = Gia_ManSimSimulateOne( p, vPat );
746 if ( Gia_ManSimWriteFile( pFileOut, vPatOut, Gia_ManPoNum(p) ) )
747 printf( "Output patterns are written into file \"%s\".\n", pFileOut );
748 Vec_IntFree( vPat );
749 Vec_IntFree( vPatOut );
750}
int Gia_ManSimWriteFile(char *pFileOut, Vec_Int_t *vPat, int nOuts)
Definition giaSim.c:685
Vec_Int_t * Gia_ManSimReadFile(char *pFileIn)
Definition giaSim.c:668
Vec_Int_t * Gia_ManSimSimulateOne(Gia_Man_t *p, Vec_Int_t *vPat)
Definition giaSim.c:704
Here is the call graph for this function:

◆ Gia_ManSimulateRound()

void Gia_ManSimulateRound ( Gia_ManSim_t * p)

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 476 of file giaSim.c.

477{
478 Gia_Obj_t * pObj;
479 int i, iCis = 0, iCos = 0;
480 assert( p->pAig->nFront > 0 );
481 assert( Gia_ManConst0(p->pAig)->Value == 0 );
482 Gia_ManSimInfoZero( p, Gia_SimData(p, 0) );
483 Gia_ManForEachObj1( p->pAig, pObj, i )
484 {
485 if ( Gia_ObjIsAndOrConst0(pObj) )
486 {
487 assert( Gia_ObjValue(pObj) < p->pAig->nFront );
488 Gia_ManSimulateNode( p, pObj );
489 }
490 else if ( Gia_ObjIsCo(pObj) )
491 {
492 assert( Gia_ObjValue(pObj) == GIA_NONE );
493 Gia_ManSimulateCo( p, iCos++, pObj );
494 }
495 else // if ( Gia_ObjIsCi(pObj) )
496 {
497 assert( Gia_ObjValue(pObj) < p->pAig->nFront );
498 Gia_ManSimulateCi( p, pObj, iCis++ );
499 }
500 }
501 assert( Gia_ManCiNum(p->pAig) == iCis );
502 assert( Gia_ManCoNum(p->pAig) == iCos );
503}
#define Gia_ManForEachObj1(p, pObj, i)
Definition gia.h:1192
#define GIA_NONE
INCLUDES ///.
Definition gia.h:45
Here is the caller graph for this function:

◆ Gia_ManSimWriteFile()

int Gia_ManSimWriteFile ( char * pFileOut,
Vec_Int_t * vPat,
int nOuts )

Definition at line 685 of file giaSim.c.

686{
687 int c, i;
688 FILE * pFile = fopen( pFileOut, "wb" );
689 if ( pFile == NULL )
690 {
691 printf( "Cannot open output file.\n" );
692 return 0;
693 }
694 assert( Vec_IntSize(vPat) % nOuts == 0 );
695 Vec_IntForEachEntry( vPat, c, i )
696 {
697 fputc( '0' + c, pFile );
698 if ( i % nOuts == nOuts - 1 )
699 fputc( '\n', pFile );
700 }
701 fclose( pFile );
702 return 1;
703}
Here is the caller graph for this function:

◆ Gia_SimDataCiExt()

unsigned * Gia_SimDataCiExt ( Gia_ManSim_t * p,
int i )

Definition at line 36 of file giaSim.c.

36{ return Gia_SimDataCi(p, i); }

◆ Gia_SimDataCoExt()

unsigned * Gia_SimDataCoExt ( Gia_ManSim_t * p,
int i )

Definition at line 37 of file giaSim.c.

37{ return Gia_SimDataCo(p, i); }

◆ Gia_SimDataExt()

unsigned * Gia_SimDataExt ( Gia_ManSim_t * p,
int i )

Definition at line 35 of file giaSim.c.

35{ return Gia_SimData(p, i); }