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

Go to the source code of this file.

Classes

struct  Gia_Cut_t_
 
struct  Gia_Sto_t_
 

Macros

#define GIA_MAX_CUTSIZE   8
 DECLARATIONS ///.
 
#define GIA_MAX_CUTNUM   257
 
#define GIA_MAX_TT_WORDS   ((GIA_MAX_CUTSIZE > 6) ? 1 << (GIA_MAX_CUTSIZE-6) : 1)
 
#define GIA_CUT_NO_LEAF   0xF
 
#define Sdb_ForEachCut(pList, pCut, i)
 

Typedefs

typedef struct Gia_Cut_t_ Gia_Cut_t
 
typedef struct Gia_Sto_t_ Gia_Sto_t
 

Functions

void Gia_StoMergeCuts (Gia_Sto_t *p, int iObj)
 
Gia_Sto_tGia_StoAlloc (Gia_Man_t *pGia, int nCutSize, int nCutNum, int fCutMin, int fTruthMin, int fVerbose)
 
void Gia_StoFree (Gia_Sto_t *p)
 
void Gia_StoComputeCutsConst0 (Gia_Sto_t *p, int iObj)
 
void Gia_StoComputeCutsCi (Gia_Sto_t *p, int iObj)
 
void Gia_StoComputeCutsNode (Gia_Sto_t *p, int iObj)
 
void Gia_StoRefObj (Gia_Sto_t *p, int iObj)
 
void Gia_StoComputeCuts (Gia_Man_t *pGia)
 
int Gia_StoSelectOneCut (Vec_Wec_t *vCuts, int iObj, Vec_Int_t *vCut, int nCutSizeMin)
 
Vec_Wec_tGia_ManSelectCuts (Vec_Wec_t *vCuts, int nCuts, int nCutSizeMin)
 
Vec_Wec_tGia_ManExtractCuts (Gia_Man_t *pGia, int nCutSize0, int nCuts0, int fVerbose0)
 
void Gia_ManCreateWins (Gia_Man_t *pGia, Vec_Wec_t *vCuts)
 
void Gia_ManPrintWins (Vec_Wec_t *vCuts)
 
void Gia_ManPrintWinStats (Vec_Wec_t *vCuts)
 
void Gia_ManExtractTest (Gia_Man_t *pGia)
 
void Gia_StoCutPrint (int *pCut)
 
void Gia_StoPrintCuts (Vec_Int_t *vThis, int iObj, int nCutSize)
 
Vec_Wec_tGia_ManFilterCuts (Gia_Man_t *pGia, Vec_Wec_t *vStore, int nCutSize, int nCuts)
 
int Gia_ManCountRefs (Gia_Man_t *pGia, Vec_Int_t *vLevel)
 
Vec_Wrd_tGia_ManGenSims (Gia_Man_t *pGia)
 
int Gia_ManFindSatDcs (Gia_Man_t *pGia, Vec_Wrd_t *vSims, Vec_Int_t *vLevel)
 
int Gia_ManCollectCutDivs (Gia_Man_t *p, Vec_Int_t *vIns)
 
void Gia_ManConsiderCuts (Gia_Man_t *pGia, Vec_Wec_t *vCuts)
 
Vec_Wec_tGia_ManExploreCuts (Gia_Man_t *pGia, int nCutSize0, int nCuts0, int fVerbose0)
 
void Gia_ManExploreCutsTest (Gia_Man_t *pGia, int nCutSize0, int nCuts0, int fVerbose0)
 
Gia_Sto_tGia_ManMatchCutsInt (Gia_Man_t *pGia, int nCutSize0, int nCutNum0, int fVerbose0)
 
void Gia_ManMatchCuts (Vec_Mem_t *vTtMem, Gia_Man_t *pGia, int nCutSize, int nCutNum, int fVerbose)
 
Vec_Ptr_tGia_ManMatchCutsArray (Vec_Ptr_t *vTtMems, Gia_Man_t *pGia, int nCutSize, int nCutNum, int fVerbose)
 
Vec_Ptr_tGia_ManMatchCutsMany (Vec_Mem_t *vTtMem, Vec_Int_t *vMap, int nFuncs, Gia_Man_t *pGia, int nCutSize, int nCutNum, int fVerbose)
 
void Gia_ManDumpCuts (Gia_Man_t *p, int nCutSize, int nCutNum, int fVerbose)
 
Vec_Wrd_tGia_ManCollectCutFuncs (Gia_Man_t *p, int nCutSize, int nCutNum, int fVerbose)
 
Vec_Int_tGia_ManCountNpnClasses (Vec_Mem_t *vTtMem, Vec_Int_t *vMap, int nClasses, Vec_Wrd_t *vOrig)
 
Vec_Wrd_tGia_ManMatchFilterClasses (Vec_Mem_t *vTtMem, Vec_Int_t *vMap, Vec_Int_t *vClassCounts, int nNumFuncs, int fVerbose)
 
void Gia_ManMatchProfileFunctions (Vec_Wrd_t *vBestReprs, Vec_Mem_t *vTtMem, Vec_Int_t *vMap, Vec_Wrd_t *vFuncs, int nCutSize)
 
void Gia_ManMatchCones (Gia_Man_t *pBig, Gia_Man_t *pSmall, int nCutSize, int nCutNum, int nNumFuncs, int nNumCones, int fVerbose)
 
int Gia_ManMatchConesMinimizeTts (Vec_Wrd_t *vSims, int nVarsMax)
 
void Gia_ManMatchConesOutputPrint (Vec_Ptr_t *p, int fVerbose)
 
void Gia_ManMatchConesOutputFree (Vec_Ptr_t *p)
 
void Gia_ManMatchConesOutput (Gia_Man_t *pBig, Gia_Man_t *pSmall, int nCutNum, int fVerbose)
 

Macro Definition Documentation

◆ GIA_CUT_NO_LEAF

#define GIA_CUT_NO_LEAF   0xF

Definition at line 36 of file giaCut.c.

◆ GIA_MAX_CUTNUM

#define GIA_MAX_CUTNUM   257

Definition at line 33 of file giaCut.c.

◆ GIA_MAX_CUTSIZE

#define GIA_MAX_CUTSIZE   8

DECLARATIONS ///.

CFile****************************************************************

FileName [giaCut.c]

SystemName [ABC: Logic synthesis and verification system.]

PackageName [Scalable AIG package.]

Synopsis [Stand-alone cut computation.]

Author [Alan Mishchenko]

Affiliation [UC Berkeley]

Date [Ver. 1.0. Started - June 20, 2005.]

Revision [

Id
giaCut.c,v 1.00 2005/06/20 00:00:00 alanmi Exp

]

Definition at line 32 of file giaCut.c.

◆ GIA_MAX_TT_WORDS

#define GIA_MAX_TT_WORDS   ((GIA_MAX_CUTSIZE > 6) ? 1 << (GIA_MAX_CUTSIZE-6) : 1)

Definition at line 34 of file giaCut.c.

◆ Sdb_ForEachCut

#define Sdb_ForEachCut ( pList,
pCut,
i )
Value:
for ( i = 0, pCut = pList + 1; i < pList[0]; i++, pCut += pCut[0] + 2 )

Definition at line 75 of file giaCut.c.

Typedef Documentation

◆ Gia_Cut_t

typedef struct Gia_Cut_t_ Gia_Cut_t

Definition at line 38 of file giaCut.c.

◆ Gia_Sto_t

typedef struct Gia_Sto_t_ Gia_Sto_t

Definition at line 51 of file giaCut.c.

Function Documentation

◆ Gia_ManCollectCutDivs()

int Gia_ManCollectCutDivs ( Gia_Man_t * p,
Vec_Int_t * vIns )

Definition at line 920 of file giaCut.c.

921{
922 Gia_Obj_t * pObj; int i, Res = 0;
923 Vec_Int_t * vRes = Vec_IntAlloc( 100 );
924 Vec_IntSort( vIns, 0 );
925
926 Vec_IntPush( vRes, 0 );
927 Vec_IntAppend( vRes, vIns );
928
931 Gia_ManForEachObjVec( vIns, p, pObj, i )
932 Gia_ObjSetTravIdCurrent( p, pObj );
933
934 Gia_ManForEachAnd( p, pObj, i )
935 if ( Gia_ObjIsTravIdCurrent(p, pObj) )
936 continue;
937 else if ( Gia_ObjIsTravIdCurrent(p, Gia_ObjFanin0(pObj)) && Gia_ObjIsTravIdCurrent(p, Gia_ObjFanin1(pObj)) )
938 {
939 if ( !Gia_ObjIsTravIdPrevious(p, pObj) )
940 Vec_IntPush( vRes, i );
941 Gia_ObjSetTravIdCurrent( p, pObj );
942 }
943// printf( "Divisors: " );
944// Vec_IntPrint( vRes );
945 Res = Vec_IntSize(vRes);
946 Vec_IntFree( vRes );
947 return Res;
948}
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Definition bblif.c:37
Cube * p
Definition exorList.c:222
#define Gia_ManForEachAnd(p, pObj, i)
Definition gia.h:1214
struct Gia_Obj_t_ Gia_Obj_t
Definition gia.h:76
#define Gia_ManForEachObjVec(vVec, p, pObj, i)
Definition gia.h:1194
void Gia_ManIncrementTravId(Gia_Man_t *p)
Definition giaUtil.c:190
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Gia_ManCollectCutFuncs()

Vec_Wrd_t * Gia_ManCollectCutFuncs ( Gia_Man_t * p,
int nCutSize,
int nCutNum,
int fVerbose )

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

Synopsis [Function enumeration.]

Description []

SideEffects []

SeeAlso []

Definition at line 1222 of file giaCut.c.

1223{
1224 Gia_Sto_t * pSto = Gia_ManMatchCutsInt( p, nCutSize, nCutNum, 0 );
1225 Vec_Wrd_t * vFuncs = Vec_WrdAlloc( 1000 ); Vec_Int_t * vLevel; int i, k, * pCut;
1226 Vec_WecForEachLevel( pSto->vCuts, vLevel, i ) if ( Vec_IntSize(vLevel) )
1227 Sdb_ForEachCut( Vec_IntArray(vLevel), pCut, k ) if ( pCut[0] == nCutSize ) {
1228 word * pTruth = Vec_MemReadEntry( pSto->vTtMem, Abc_Lit2Var(pCut[pCut[0]+1]) );
1229 Vec_WrdPush( vFuncs, pTruth[0] );
1230 }
1231 Gia_StoFree( pSto );
1232 if ( fVerbose )
1233 printf( "Collected %d cut functions using the AIG with %d nodes.\n", Vec_WrdSize(vFuncs), Gia_ManAndNum(p) );
1234 return vFuncs;
1235}
#define Sdb_ForEachCut(pList, pCut, i)
Definition giaCut.c:75
Gia_Sto_t * Gia_ManMatchCutsInt(Gia_Man_t *pGia, int nCutSize0, int nCutNum0, int fVerbose0)
Definition giaCut.c:1030
void Gia_StoFree(Gia_Sto_t *p)
Definition giaCut.c:587
struct Gia_Sto_t_ Gia_Sto_t
Definition giaCut.c:51
unsigned __int64 word
DECLARATIONS ///.
Definition kitPerm.c:36
Vec_Mem_t * vTtMem
Definition giaCut.c:62
Vec_Wec_t * vCuts
Definition giaCut.c:61
#define Vec_WecForEachLevel(vGlob, vVec, i)
MACRO DEFINITIONS ///.
Definition vecWec.h:55
typedefABC_NAMESPACE_HEADER_START struct Vec_Wrd_t_ Vec_Wrd_t
INCLUDES ///.
Definition vecWrd.h:42
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Gia_ManConsiderCuts()

void Gia_ManConsiderCuts ( Gia_Man_t * pGia,
Vec_Wec_t * vCuts )

Definition at line 950 of file giaCut.c.

951{
952 Vec_Wrd_t * vSims = Gia_ManGenSims( pGia );
953 Vec_Int_t * vLevel; int i;
954 Gia_ManCreateRefs( pGia );
955 Vec_WecForEachLevel( vCuts, vLevel, i )
956 {
957 printf( "Cut %3d ", i );
958 printf( "Ref = %3d : ", Vec_IntEntry(vLevel, 0) );
959
960 Vec_IntShift( vLevel, 1 );
961 printf( "Ref = %3d : ", Gia_ManCountRefs(pGia, vLevel) );
962 printf( "SDC = %3d : ", Gia_ManFindSatDcs(pGia, vSims, vLevel) );
963 printf( "Div = %3d : ", Gia_ManCollectCutDivs(pGia, vLevel) );
964 Vec_IntPrint( vLevel );
965 Vec_IntShift( vLevel, -1 );
966 }
967 Vec_WrdFree( vSims );
968}
Vec_Wrd_t * Gia_ManGenSims(Gia_Man_t *pGia)
Definition giaCut.c:894
int Gia_ManCollectCutDivs(Gia_Man_t *p, Vec_Int_t *vIns)
Definition giaCut.c:920
int Gia_ManFindSatDcs(Gia_Man_t *pGia, Vec_Wrd_t *vSims, Vec_Int_t *vLevel)
Definition giaCut.c:902
int Gia_ManCountRefs(Gia_Man_t *pGia, Vec_Int_t *vLevel)
Definition giaCut.c:887
void Gia_ManCreateRefs(Gia_Man_t *p)
Definition giaUtil.c:779
Here is the call graph for this function:

◆ Gia_ManCountNpnClasses()

Vec_Int_t * Gia_ManCountNpnClasses ( Vec_Mem_t * vTtMem,
Vec_Int_t * vMap,
int nClasses,
Vec_Wrd_t * vOrig )

Definition at line 1236 of file giaCut.c.

1237{
1238 assert( Vec_MemEntryNum(vTtMem) == Vec_IntSize(vMap) );
1239 Vec_Int_t * vClassCounts = Vec_IntStart( nClasses ); int i; word Func;
1240 Vec_WrdForEachEntry( vOrig, Func, i ) {
1241 int * pSpot = Vec_MemHashLookup( vTtMem, &Func );
1242 if ( *pSpot == -1 )
1243 continue;
1244 int iClass = Vec_IntEntry( vMap, *pSpot );
1245 if ( iClass == -1 )
1246 continue;
1247 assert( iClass < Vec_IntSize(vClassCounts) );
1248 Vec_IntAddToEntry( vClassCounts, iClass, 1 );
1249 }
1250 return vClassCounts;
1251}
#define assert(ex)
Definition util_old.h:213
#define Vec_WrdForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
Definition vecWrd.h:54
Here is the caller graph for this function:

◆ Gia_ManCountRefs()

int Gia_ManCountRefs ( Gia_Man_t * pGia,
Vec_Int_t * vLevel )

Definition at line 887 of file giaCut.c.

888{
889 int i, iObj, nRefs = 0;
890 Vec_IntForEachEntry( vLevel, iObj, i )
891 nRefs += Gia_ObjRefNumId(pGia, iObj);
892 return nRefs;
893}
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
Definition vecInt.h:54
Here is the caller graph for this function:

◆ Gia_ManCreateWins()

void Gia_ManCreateWins ( Gia_Man_t * pGia,
Vec_Wec_t * vCuts )

Definition at line 735 of file giaCut.c.

736{
737 Gia_Obj_t * pObj;
738 Vec_Wec_t * vWins = Vec_WecStart( Gia_ManObjNum(pGia) );
739 Vec_Int_t * vTemp = Vec_IntAlloc( 100 );
740 Vec_Int_t * vCut; int i, k, Obj, Cut;
741 Vec_WecForEachLevel( vCuts, vCut, i )
742 Vec_IntForEachEntryStart( vCut, Obj, k, 1 )
743 Vec_IntPush( Vec_WecEntry(vWins, Obj), i );
744 Gia_ManForEachAnd( pGia, pObj, Obj )
745 {
746 Vec_Int_t * vWin = Vec_WecEntry(vWins, Obj);
747 Vec_Int_t * vWin0 = Vec_WecEntry(vWins, Gia_ObjFaninId0(pObj, Obj));
748 Vec_Int_t * vWin1 = Vec_WecEntry(vWins, Gia_ObjFaninId1(pObj, Obj));
749 Vec_IntTwoFindCommon( vWin0, vWin1, vTemp );
750 Vec_IntForEachEntry( vTemp, Cut, k )
751 {
752 Vec_IntPushUniqueOrder( vWin, Cut );
753 Vec_IntPush( Vec_WecEntry(vCuts, Cut), Obj );
754 }
755 }
756 Vec_WecFree( vWins );
757 Vec_IntFree( vTemp );
758}
#define Vec_IntForEachEntryStart(vVec, Entry, i, Start)
Definition vecInt.h:56
typedefABC_NAMESPACE_HEADER_START struct Vec_Wec_t_ Vec_Wec_t
INCLUDES ///.
Definition vecWec.h:42
Here is the caller graph for this function:

◆ Gia_ManDumpCuts()

void Gia_ManDumpCuts ( Gia_Man_t * p,
int nCutSize,
int nCutNum,
int fVerbose )

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

Synopsis [Function enumeration.]

Description []

SideEffects []

SeeAlso []

Definition at line 1182 of file giaCut.c.

1183{
1184 FILE * pFile = fopen( "input.txt", "wb" ); if ( !pFile ) return;
1185 Gia_Sto_t * pSto = Gia_ManMatchCutsInt( p, nCutSize, nCutNum, 0 );
1186 Vec_Int_t * vLevel; int i, k, c, * pCut, nCuts = 0, nNodes = 0;
1187 Vec_WecForEachLevel( pSto->vCuts, vLevel, i ) if ( Vec_IntSize(vLevel) ) {
1188 if ( !Gia_ObjIsAnd(Gia_ManObj(p, i)) )
1189 continue;
1190 Sdb_ForEachCut( Vec_IntArray(vLevel), pCut, k ) {
1191 if ( pCut[0] == 1 )
1192 continue;
1193 fprintf( pFile, "%d ", i );
1194 for ( c = 1; c <= pCut[0]; c++ )
1195 fprintf( pFile, "%d ", pCut[c] );
1196 fprintf( pFile, "1\n" );
1197 nCuts += pCut[0];
1198 nNodes++;
1199 }
1200 }
1201 Gia_Obj_t * pObj;
1202 Gia_ManForEachCo( p, pObj, i ) {
1203 fprintf( pFile, "%d %d 0\n", Gia_ObjId(p, pObj), Gia_ObjFaninId0p(p, pObj) );
1204 }
1205 fclose( pFile );
1206 Gia_StoFree( pSto );
1207 if ( fVerbose )
1208 printf( "Dumped %d cuts for %d nodes into file \"input.txt\".\n", nCuts, nNodes );
1209}
#define Gia_ManForEachCo(p, pObj, i)
Definition gia.h:1236
Here is the call graph for this function:

◆ Gia_ManExploreCuts()

Vec_Wec_t * Gia_ManExploreCuts ( Gia_Man_t * pGia,
int nCutSize0,
int nCuts0,
int fVerbose0 )

Definition at line 971 of file giaCut.c.

972{
973 int nCutSize = nCutSize0;
974 int nCutNum = 64;
975 int fCutMin = 0;
976 int fTruthMin = 0;
977 int fVerbose = fVerbose0;
978 Vec_Wec_t * vCutsSel;
979 Gia_Sto_t * p = Gia_StoAlloc( pGia, nCutSize, nCutNum, fCutMin, fTruthMin, fVerbose );
980 Gia_Obj_t * pObj; int i, iObj;
981 assert( nCutSize <= GIA_MAX_CUTSIZE );
982 assert( nCutNum < GIA_MAX_CUTNUM );
983 // prepare references
984 Gia_ManForEachObj( p->pGia, pObj, iObj )
985 Gia_StoRefObj( p, iObj );
986 // compute cuts
988 Gia_ManForEachCiId( p->pGia, iObj, i )
989 Gia_StoComputeCutsCi( p, iObj );
990 Gia_ManForEachAnd( p->pGia, pObj, iObj )
991 Gia_StoComputeCutsNode( p, iObj );
992 if ( p->fVerbose )
993 {
994 printf( "Running cut computation with CutSize = %d CutNum = %d CutMin = %s TruthMin = %s\n",
995 p->nCutSize, p->nCutNum, p->fCutMin ? "yes":"no", p->fTruthMin ? "yes":"no" );
996 printf( "CutPair = %.0f ", p->CutCount[0] );
997 printf( "Merge = %.0f (%.2f %%) ", p->CutCount[1], 100.0*p->CutCount[1]/p->CutCount[0] );
998 printf( "Eval = %.0f (%.2f %%) ", p->CutCount[2], 100.0*p->CutCount[2]/p->CutCount[0] );
999 printf( "Cut = %.0f (%.2f %%) ", p->CutCount[3], 100.0*p->CutCount[3]/p->CutCount[0] );
1000 printf( "Cut/Node = %.2f ", p->CutCount[3] / Gia_ManAndNum(p->pGia) );
1001 printf( "\n" );
1002 printf( "The number of nodes with cut count over the limit (%d cuts) = %d nodes (out of %d). ",
1003 p->nCutNum, p->nCutsOver, Gia_ManAndNum(pGia) );
1004 Abc_PrintTime( 0, "Time", Abc_Clock() - p->clkStart );
1005 }
1006 vCutsSel = Gia_ManFilterCuts( pGia, p->vCuts, nCutSize0, nCuts0 );
1007 //Gia_ManConsiderCuts( pGia, vCutsSel );
1008 Gia_StoFree( p );
1009 return vCutsSel;
1010}
Vec_Wec_t * Gia_ManFilterCuts(Gia_Man_t *pGia, Vec_Wec_t *vStore, int nCutSize, int nCuts)
Definition giaCut.c:827
void Gia_StoComputeCutsConst0(Gia_Sto_t *p, int iObj)
Definition giaCut.c:597
void Gia_StoComputeCutsCi(Gia_Sto_t *p, int iObj)
Definition giaCut.c:601
#define GIA_MAX_CUTNUM
Definition giaCut.c:33
#define GIA_MAX_CUTSIZE
DECLARATIONS ///.
Definition giaCut.c:32
void Gia_StoComputeCutsNode(Gia_Sto_t *p, int iObj)
Definition giaCut.c:605
void Gia_StoRefObj(Gia_Sto_t *p, int iObj)
Definition giaCut.c:609
Gia_Sto_t * Gia_StoAlloc(Gia_Man_t *pGia, int nCutSize, int nCutNum, int fCutMin, int fTruthMin, int fVerbose)
Definition giaCut.c:568
#define Gia_ManForEachObj(p, pObj, i)
MACRO DEFINITIONS ///.
Definition gia.h:1190
#define Gia_ManForEachCiId(p, Id, i)
Definition gia.h:1230
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Gia_ManExploreCutsTest()

void Gia_ManExploreCutsTest ( Gia_Man_t * pGia,
int nCutSize0,
int nCuts0,
int fVerbose0 )

Definition at line 1011 of file giaCut.c.

1012{
1013 Vec_Wec_t * vCutSel = Gia_ManExploreCuts( pGia, nCutSize0, nCuts0, fVerbose0 );
1014 Vec_WecPrint( vCutSel, 0 );
1015 Vec_WecFree( vCutSel );
1016}
Vec_Wec_t * Gia_ManExploreCuts(Gia_Man_t *pGia, int nCutSize0, int nCuts0, int fVerbose0)
Definition giaCut.c:971
Here is the call graph for this function:

◆ Gia_ManExtractCuts()

Vec_Wec_t * Gia_ManExtractCuts ( Gia_Man_t * pGia,
int nCutSize0,
int nCuts0,
int fVerbose0 )

Definition at line 696 of file giaCut.c.

697{
698 int nCutSize = nCutSize0;
699 int nCutNum = 6;
700 int fCutMin = 0;
701 int fTruthMin = 0;
702 int fVerbose = fVerbose0;
703 Vec_Wec_t * vCutsSel;
704 Gia_Sto_t * p = Gia_StoAlloc( pGia, nCutSize, nCutNum, fCutMin, fTruthMin, fVerbose );
705 Gia_Obj_t * pObj; int i, iObj;
706 assert( nCutSize <= GIA_MAX_CUTSIZE );
707 assert( nCutNum < GIA_MAX_CUTNUM );
708 // prepare references
709 Gia_ManForEachObj( p->pGia, pObj, iObj )
710 Gia_StoRefObj( p, iObj );
711 // compute cuts
713 Gia_ManForEachCiId( p->pGia, iObj, i )
714 Gia_StoComputeCutsCi( p, iObj );
715 Gia_ManForEachAnd( p->pGia, pObj, iObj )
716 Gia_StoComputeCutsNode( p, iObj );
717 if ( p->fVerbose )
718 {
719 printf( "Running cut computation with CutSize = %d CutNum = %d CutMin = %s TruthMin = %s\n",
720 p->nCutSize, p->nCutNum, p->fCutMin ? "yes":"no", p->fTruthMin ? "yes":"no" );
721 printf( "CutPair = %.0f ", p->CutCount[0] );
722 printf( "Merge = %.0f (%.2f %%) ", p->CutCount[1], 100.0*p->CutCount[1]/p->CutCount[0] );
723 printf( "Eval = %.0f (%.2f %%) ", p->CutCount[2], 100.0*p->CutCount[2]/p->CutCount[0] );
724 printf( "Cut = %.0f (%.2f %%) ", p->CutCount[3], 100.0*p->CutCount[3]/p->CutCount[0] );
725 printf( "Cut/Node = %.2f ", p->CutCount[3] / Gia_ManAndNum(p->pGia) );
726 printf( "\n" );
727 printf( "The number of nodes with cut count over the limit (%d cuts) = %d nodes (out of %d). ",
728 p->nCutNum, p->nCutsOver, Gia_ManAndNum(pGia) );
729 Abc_PrintTime( 0, "Time", Abc_Clock() - p->clkStart );
730 }
731 vCutsSel = Gia_ManSelectCuts( p->vCuts, nCuts0, nCutSize0-1 );
732 Gia_StoFree( p );
733 return vCutsSel;
734}
Vec_Wec_t * Gia_ManSelectCuts(Vec_Wec_t *vCuts, int nCuts, int nCutSizeMin)
Definition giaCut.c:688
Here is the call graph for this function:

◆ Gia_ManExtractTest()

void Gia_ManExtractTest ( Gia_Man_t * pGia)

Definition at line 787 of file giaCut.c.

788{
789 extern Vec_Wec_t * Gia_ManExtractCuts2( Gia_Man_t * p, int nCutSize, int nCuts, int fVerbose );
790 Vec_Wec_t * vCutsSel = Gia_ManExtractCuts2( pGia, 8, 10000, 1 );
791 //Vec_Wec_t * vCutsSel = Gia_ManExtractCuts( pGia, 8, 10000, 1 );
792 abctime clk = Abc_Clock();
793 Gia_ManCreateWins( pGia, vCutsSel );
794 //Gia_ManPrintWins( vCutsSel );
795 Gia_ManPrintWinStats( vCutsSel );
796 Vec_WecFree( vCutsSel );
797 Abc_PrintTime( 0, "Creating windows", Abc_Clock() - clk );
798}
ABC_INT64_T abctime
Definition abc_global.h:332
void Gia_ManCreateWins(Gia_Man_t *pGia, Vec_Wec_t *vCuts)
Definition giaCut.c:735
void Gia_ManPrintWinStats(Vec_Wec_t *vCuts)
Definition giaCut.c:776
Vec_Wec_t * Gia_ManExtractCuts2(Gia_Man_t *p, int nCutSize, int nCuts, int fVerbose)
Definition giaResub2.c:1523
struct Gia_Man_t_ Gia_Man_t
Definition gia.h:96
Here is the call graph for this function:

◆ Gia_ManFilterCuts()

Vec_Wec_t * Gia_ManFilterCuts ( Gia_Man_t * pGia,
Vec_Wec_t * vStore,
int nCutSize,
int nCuts )

Definition at line 827 of file giaCut.c.

828{
829 abctime clkStart = Abc_Clock();
830 Vec_Wec_t * vCutsSel = Vec_WecAlloc( nCuts );
831 Vec_Int_t * vLevel, * vCut = Vec_IntAlloc( 10 );
832 Vec_Wec_t * vCuts = Vec_WecAlloc( 1000 );
833 Hsh_VecMan_t * p = Hsh_VecManStart( 1000 ); int i, s;
834 Vec_WecForEachLevel( vStore, vLevel, i ) if ( Vec_IntSize(vLevel) )
835 {
836 int v, k, * pCut, Value;
837 Sdb_ForEachCut( Vec_IntArray(vLevel), pCut, k )
838 {
839 if ( pCut[0] < 2 )
840 continue;
841
842 for ( v = 1; v <= pCut[0]; v++ )
843 if ( pCut[v] < 9 )
844 break;
845 if ( v <= pCut[0] )
846 continue;
847
848 Vec_IntClear( vCut );
849 Vec_IntPushArray( vCut, pCut+1, pCut[0] );
850 Value = Hsh_VecManAdd( p, vCut );
851 if ( Value == Vec_WecSize(vCuts) )
852 {
853 Vec_Int_t * vTemp = Vec_WecPushLevel(vCuts);
854 Vec_IntPush( vTemp, 0 );
855 Vec_IntAppend( vTemp, vCut );
856 }
857 Vec_IntAddToEntry( Vec_WecEntry(vCuts, Value), 0, 1 );
858 }
859 }
860 printf( "Collected cuts = %d.\n", Vec_WecSize(vCuts) );
861 for ( s = 3; s <= nCutSize; s++ )
862 Vec_WecForEachLevel( vCuts, vLevel, i )
863 if ( Vec_IntSize(vLevel) - 1 == s )
864 {
865 int * pCut = Vec_IntEntryP(vLevel, 1);
866 int u, v, Value;
867 for ( u = 0; u < s; u++ )
868 {
869 Vec_IntClear( vCut );
870 for ( v = 0; v < s; v++ ) if ( v != u )
871 Vec_IntPush( vCut, pCut[v] );
872 assert( Vec_IntSize(vCut) == s-1 );
873 Value = Hsh_VecManAdd( p, vCut );
874 if ( Value < Vec_WecSize(vCuts) )
875 Vec_IntAddToEntry( vLevel, 0, Vec_IntEntry(Vec_WecEntry(vCuts, Value), 0) );
876 }
877 }
878 Hsh_VecManStop( p );
879 Vec_IntFree( vCut );
880 // collect
881 Vec_WecSortByFirstInt( vCuts, 1 );
882 Vec_WecForEachLevelStop( vCuts, vLevel, i, Abc_MinInt(Vec_WecSize(vCuts), nCuts) )
883 Vec_IntAppend( Vec_WecPushLevel(vCutsSel), vLevel );
884 Abc_PrintTime( 0, "Cut filtering time", Abc_Clock() - clkStart );
885 return vCutsSel;
886}
struct Hsh_VecMan_t_ Hsh_VecMan_t
Definition vecHsh.h:85
#define Vec_WecForEachLevelStop(vGlob, vVec, i, LevelStop)
Definition vecWec.h:61
Here is the caller graph for this function:

◆ Gia_ManFindSatDcs()

int Gia_ManFindSatDcs ( Gia_Man_t * pGia,
Vec_Wrd_t * vSims,
Vec_Int_t * vLevel )

Definition at line 902 of file giaCut.c.

903{
904 int nWords = Vec_WrdSize(pGia->vSimsPi) / Gia_ManCiNum(pGia);
905 int i, w, iObj, Res = 0, Pres[256] = {0}, nMints = 1 << Vec_IntSize(vLevel);
906 for ( w = 0; w < 64*nWords; w++ )
907 {
908 int iInMint = 0;
909 Vec_IntForEachEntry( vLevel, iObj, i )
910 if ( Abc_TtGetBit( Vec_WrdEntryP(vSims, iObj*nWords), w ) )
911 iInMint |= 1 << i;
912 Pres[iInMint]++;
913 }
914 for ( i = 0; i < nMints; i++ )
915 Res += Pres[i] == 0;
916 return Res;
917}
int nWords
Definition abcNpn.c:127
Vec_Wrd_t * vSimsPi
Definition gia.h:215
Here is the caller graph for this function:

◆ Gia_ManGenSims()

Vec_Wrd_t * Gia_ManGenSims ( Gia_Man_t * pGia)

Definition at line 894 of file giaCut.c.

895{
896 Vec_Wrd_t * vSims;
897 Vec_WrdFreeP( &pGia->vSimsPi );
898 pGia->vSimsPi = Vec_WrdStartTruthTables( Gia_ManCiNum(pGia) );
899 vSims = Gia_ManSimPatSim( pGia );
900 return vSims;
901}
Vec_Wrd_t * Gia_ManSimPatSim(Gia_Man_t *p)
Definition giaSimBase.c:125
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Gia_ManMatchCones()

void Gia_ManMatchCones ( Gia_Man_t * pBig,
Gia_Man_t * pSmall,
int nCutSize,
int nCutNum,
int nNumFuncs,
int nNumCones,
int fVerbose )

Definition at line 1297 of file giaCut.c.

1298{
1299 abctime clkStart = Abc_Clock();
1300 extern void Dau_CanonicizeArray( Vec_Wrd_t * vFuncs, int nVars, int fVerbose );
1301 extern Vec_Mem_t * Dau_CollectNpnFunctionsArray( Vec_Wrd_t * vFuncs, int nVars, Vec_Int_t ** pvMap, int fVerbose );
1302 Vec_Wrd_t * vFuncs = Gia_ManCollectCutFuncs( pSmall, nCutSize, nCutNum, fVerbose );
1303 Vec_Wrd_t * vOrig = Vec_WrdDup( vFuncs );
1304 Dau_CanonicizeArray( vFuncs, nCutSize, fVerbose );
1305 Vec_Int_t * vMap = NULL; int n;
1306 Vec_Mem_t * vTtMem = Dau_CollectNpnFunctionsArray( vFuncs, nCutSize, &vMap, fVerbose );
1307 Vec_WrdFree( vFuncs );
1308 Vec_Int_t * vClassCounts = Gia_ManCountNpnClasses( vTtMem, vMap, Vec_IntEntryLast(vMap)+1, vOrig );
1309 Vec_Wrd_t * vBestReprs = Gia_ManMatchFilterClasses( vTtMem, vMap, vClassCounts, nNumFuncs, fVerbose );
1310 assert( Vec_WrdSize(vBestReprs) == nNumFuncs );
1311 Vec_IntFree( vClassCounts );
1312 printf( "Frequency profile for %d most popular classes in the small AIG:\n", nNumFuncs );
1313 Gia_ManMatchProfileFunctions( vBestReprs, vTtMem, vMap, vOrig, nCutSize );
1314 Vec_WrdFree( vOrig );
1315 Abc_Random( 1 );
1316 for ( n = 0; n < nNumCones; n++ ) {
1317 int nRand = Abc_Random( 0 ) % Gia_ManCoNum(pBig);
1318 Gia_Man_t * pCone = Gia_ManDupCones( pBig, &nRand, 1, 1 );
1319 Vec_Wrd_t * vCutFuncs = Gia_ManCollectCutFuncs( pCone, nCutSize, nCutNum, 0 );
1320 printf( "ITER %d: Considering output cone %d with %d and-nodes. ", n+1, nRand, Gia_ManAndNum(pCone) );
1321 printf( "Profiling %d functions of %d-cuts:\n", Vec_WrdSize(vCutFuncs), nCutSize );
1322 Gia_ManMatchProfileFunctions( vBestReprs, vTtMem, vMap, vCutFuncs, nCutSize );
1323 Vec_WrdFree( vCutFuncs );
1324 Gia_ManStop( pCone );
1325 }
1326 Vec_WrdFree( vBestReprs );
1327 Vec_IntFree( vMap );
1328 Vec_MemHashFree( vTtMem );
1329 Vec_MemFree( vTtMem );
1330 Abc_PrintTime( 1, "Total computation time", Abc_Clock() - clkStart );
1331}
unsigned Abc_Random(int fReset)
Definition utilSort.c:1004
void Dau_CanonicizeArray(Vec_Wrd_t *vFuncs, int nVars, int fVerbose)
Definition dauNpn.c:957
Vec_Mem_t * Dau_CollectNpnFunctionsArray(Vec_Wrd_t *vFuncs, int nVars, Vec_Int_t **pvMap, int fVerbose)
Definition dauNpn.c:873
Vec_Int_t * Gia_ManCountNpnClasses(Vec_Mem_t *vTtMem, Vec_Int_t *vMap, int nClasses, Vec_Wrd_t *vOrig)
Definition giaCut.c:1236
Vec_Wrd_t * Gia_ManMatchFilterClasses(Vec_Mem_t *vTtMem, Vec_Int_t *vMap, Vec_Int_t *vClassCounts, int nNumFuncs, int fVerbose)
Definition giaCut.c:1252
Vec_Wrd_t * Gia_ManCollectCutFuncs(Gia_Man_t *p, int nCutSize, int nCutNum, int fVerbose)
Definition giaCut.c:1222
void Gia_ManMatchProfileFunctions(Vec_Wrd_t *vBestReprs, Vec_Mem_t *vTtMem, Vec_Int_t *vMap, Vec_Wrd_t *vFuncs, int nCutSize)
Definition giaCut.c:1278
void Gia_ManStop(Gia_Man_t *p)
Definition giaMan.c:82
Gia_Man_t * Gia_ManDupCones(Gia_Man_t *p, int *pPos, int nPos, int fTrimPis)
Definition giaDup.c:3880
typedefABC_NAMESPACE_IMPL_START struct Vec_Mem_t_ Vec_Mem_t
DECLARATIONS ///.
Definition utilMem.c:35
Here is the call graph for this function:

◆ Gia_ManMatchConesMinimizeTts()

int Gia_ManMatchConesMinimizeTts ( Vec_Wrd_t * vSims,
int nVarsMax )

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

Synopsis [Function enumeration.]

Description []

SideEffects []

SeeAlso []

Definition at line 1344 of file giaCut.c.

1345{
1346 int nVars = 0;
1347 int nWordsMax = Abc_Truth6WordNum( nVarsMax ), nWords;
1348 int i, k = 0, nTruths = Vec_WrdSize(vSims) / nWordsMax;
1349 assert( nTruths * nWordsMax == Vec_WrdSize(vSims) );
1350 // support-minimize and find the largest supp size
1351 for ( i = 0; i < nTruths; i++ ) {
1352 word * pTruth = Vec_WrdEntryP( vSims, i * nWordsMax );
1353 int nVarsCur = Abc_TtMinBase( pTruth, NULL, nVarsMax, nVarsMax );
1354 nVars = Abc_MaxInt( nVars, nVarsCur );
1355 }
1356 // remap truth tables
1357 nWords = Abc_Truth6WordNum( nVars );
1358 for ( i = 0; i < nTruths; i++ ) {
1359 word * pTruth = Vec_WrdEntryP( vSims, i * nWordsMax );
1360 word * pTruth2 = Vec_WrdEntryP( vSims, k * nWords );
1361 if ( Abc_TtSupportSize(pTruth, nVars) < 3 )
1362 continue;
1363 memmove( pTruth2, pTruth, nWords * sizeof(word) );
1364 k++;
1365 if ( 0 ) {
1366 extern void Extra_PrintHexadecimal( FILE * pFile, unsigned Sign[], int nVars );
1367 printf( "Type%d : ", i );
1368 Extra_PrintHexadecimal( stdout, (unsigned *)pTruth2, nVars );
1369 printf( "\n" );
1370 }
1371 }
1372 Vec_WrdShrink ( vSims, k * nWords );
1373 return nVars;
1374}
void Extra_PrintHexadecimal(FILE *pFile, unsigned Sign[], int nVars)
char * memmove()
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Gia_ManMatchConesOutput()

void Gia_ManMatchConesOutput ( Gia_Man_t * pBig,
Gia_Man_t * pSmall,
int nCutNum,
int fVerbose )

Definition at line 1395 of file giaCut.c.

1396{
1397 abctime clkStart = Abc_Clock();
1398 extern Vec_Mem_t * Dau_CollectNpnFunctionsArray( Vec_Wrd_t * vFuncs, int nVars, Vec_Int_t ** pvMap, int fVerbose );
1399 Vec_Wrd_t * vSimsPi = Vec_WrdStartTruthTables( Gia_ManCiNum(pSmall) );
1400 Vec_Wrd_t * vSims = Gia_ManSimPatSimOut( pSmall, vSimsPi, 1 );
1401 int nVars = Gia_ManMatchConesMinimizeTts( vSims, Gia_ManCiNum(pSmall) );
1402 Vec_WrdFree( vSimsPi );
1403 if ( nVars > 10 ) {
1404 printf( "Some output functions have support size more than 10.\n" );
1405 Vec_WrdFree( vSims );
1406 return;
1407 }
1408 Vec_Int_t * vMap = NULL;
1409 Vec_Mem_t * vTtMem = Dau_CollectNpnFunctionsArray( vSims, nVars, &vMap, fVerbose );
1410 int nFuncs = Vec_WrdSize(vSims) / Abc_Truth6WordNum(nVars);
1411 assert( Vec_WrdSize(vSims) == nFuncs * Abc_Truth6WordNum(nVars) );
1412 Vec_WrdFree( vSims );
1413 printf( "Using %d output functions with the support size between 3 and %d.\n", nFuncs, nVars );
1414 Vec_Ptr_t * vRes = Gia_ManMatchCutsMany( vTtMem, vMap, nFuncs, pBig, nVars, nCutNum, fVerbose );
1415 Vec_MemHashFree( vTtMem );
1416 Vec_MemFree( vTtMem );
1417 Vec_IntFree( vMap );
1418 Gia_ManMatchConesOutputPrint( vRes, fVerbose );
1420 Abc_PrintTime( 1, "Total computation time", Abc_Clock() - clkStart );
1421}
Vec_Ptr_t * Gia_ManMatchCutsMany(Vec_Mem_t *vTtMem, Vec_Int_t *vMap, int nFuncs, Gia_Man_t *pGia, int nCutSize, int nCutNum, int fVerbose)
Definition giaCut.c:1137
void Gia_ManMatchConesOutputFree(Vec_Ptr_t *p)
Definition giaCut.c:1388
int Gia_ManMatchConesMinimizeTts(Vec_Wrd_t *vSims, int nVarsMax)
Definition giaCut.c:1344
void Gia_ManMatchConesOutputPrint(Vec_Ptr_t *p, int fVerbose)
Definition giaCut.c:1375
Vec_Wrd_t * Gia_ManSimPatSimOut(Gia_Man_t *pGia, Vec_Wrd_t *vSimsPi, int fOuts)
Definition giaSimBase.c:138
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
Definition vecPtr.h:42
Here is the call graph for this function:

◆ Gia_ManMatchConesOutputFree()

void Gia_ManMatchConesOutputFree ( Vec_Ptr_t * p)

Definition at line 1388 of file giaCut.c.

1389{
1390 Vec_Wec_t * vCuts; int i;
1391 Vec_PtrForEachEntry( Vec_Wec_t *, p, vCuts, i )
1392 Vec_WecFree( vCuts );
1393 Vec_PtrFree( p );
1394}
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.
Definition vecPtr.h:55
Here is the caller graph for this function:

◆ Gia_ManMatchConesOutputPrint()

void Gia_ManMatchConesOutputPrint ( Vec_Ptr_t * p,
int fVerbose )

Definition at line 1375 of file giaCut.c.

1376{
1377 Vec_Wec_t * vCuts; int i;
1378 printf( "Nodes with matching cuts:\n" );
1379 Vec_PtrForEachEntry( Vec_Wec_t *, p, vCuts, i ) {
1380 if ( fVerbose ) {
1381 printf( "Type %d:\n", i );
1382 Vec_WecPrint( vCuts, 0 );
1383 }
1384 else
1385 printf( "Type %d present in %d cuts\n", i, Vec_WecSize(vCuts) );
1386 }
1387}
Here is the caller graph for this function:

◆ Gia_ManMatchCuts()

void Gia_ManMatchCuts ( Vec_Mem_t * vTtMem,
Gia_Man_t * pGia,
int nCutSize,
int nCutNum,
int fVerbose )

Definition at line 1066 of file giaCut.c.

1067{
1068 Gia_Sto_t * p = Gia_ManMatchCutsInt( pGia, nCutSize, nCutNum, fVerbose );
1069 Vec_Int_t * vLevel; int i, j, k, * pCut;
1070 Vec_Int_t * vNodes = Vec_IntAlloc( 100 );
1071 Vec_Wec_t * vCuts = Vec_WecAlloc( 100 );
1072 abctime clkStart = Abc_Clock();
1073 assert( Abc_Truth6WordNum(nCutSize) == Vec_MemEntrySize(vTtMem) );
1074 Vec_WecForEachLevel( p->vCuts, vLevel, i ) if ( Vec_IntSize(vLevel) )
1075 {
1076 Sdb_ForEachCut( Vec_IntArray(vLevel), pCut, k ) if ( pCut[0] > 1 )
1077 {
1078 word * pTruth = Vec_MemReadEntry( p->vTtMem, Abc_Lit2Var(pCut[pCut[0]+1]) );
1079 int * pSpot = Vec_MemHashLookup( vTtMem, pTruth );
1080 if ( *pSpot == -1 )
1081 continue;
1082 Vec_IntPush( vNodes, i );
1083 vLevel = Vec_WecPushLevel( vCuts );
1084 Vec_IntPush( vLevel, i );
1085 for ( j = 1; j <= pCut[0]; j++ )
1086 Vec_IntPush( vLevel, pCut[j] );
1087 break;
1088 }
1089 }
1090 printf( "Nodes with matching cuts: " );
1091 Vec_IntPrint( vNodes );
1092 if ( Vec_WecSize(vCuts) > 32 )
1093 Vec_WecShrink(vCuts, 32);
1094 Vec_WecPrint( vCuts, 0 );
1095 Vec_WecFree( vCuts );
1096 Vec_IntFree( vNodes );
1097 Gia_StoFree( p );
1098 if ( fVerbose )
1099 Abc_PrintTime( 1, "Cut matching time", Abc_Clock() - clkStart );
1100}
Here is the call graph for this function:

◆ Gia_ManMatchCutsArray()

Vec_Ptr_t * Gia_ManMatchCutsArray ( Vec_Ptr_t * vTtMems,
Gia_Man_t * pGia,
int nCutSize,
int nCutNum,
int fVerbose )

Definition at line 1101 of file giaCut.c.

1102{
1103 Vec_Ptr_t * vRes = Vec_PtrAlloc( Vec_PtrSize(vTtMems) );
1104 Gia_Sto_t * p = Gia_ManMatchCutsInt( pGia, nCutSize, nCutNum, fVerbose );
1105 Vec_Int_t * vLevel, * vTemp; int i, k, c, * pCut;
1106 abctime clkStart = Abc_Clock();
1107 for ( i = 0; i < Vec_PtrSize(vTtMems); i++ )
1108 Vec_PtrPush( vRes, Vec_WecAlloc(100) );
1109 Vec_WecForEachLevel( p->vCuts, vLevel, i ) if ( Vec_IntSize(vLevel) )
1110 {
1111 Sdb_ForEachCut( Vec_IntArray(vLevel), pCut, k ) if ( pCut[0] > 1 )
1112 {
1113 Vec_Mem_t * vTtMem; int m;
1114 Vec_PtrForEachEntry( Vec_Mem_t *, vTtMems, vTtMem, m )
1115 {
1116 word * pTruth = Vec_MemReadEntry( p->vTtMem, Abc_Lit2Var(pCut[pCut[0]+1]) );
1117 int * pSpot = Vec_MemHashLookup( vTtMem, pTruth );
1118 if ( *pSpot == -1 )
1119 continue;
1120 vTemp = Vec_WecPushLevel( (Vec_Wec_t *)Vec_PtrEntry(vRes, m) );
1121 Vec_IntPush( vTemp, i );
1122 for ( c = 1; c <= pCut[0]; c++ )
1123 Vec_IntPush( vTemp, pCut[c] );
1124 }
1125 }
1126 }
1127 Gia_StoFree( p );
1128 if ( fVerbose ) {
1129 Vec_Wec_t * vCuts;
1130 printf( "Detected nodes by type: " );
1131 Vec_PtrForEachEntry( Vec_Wec_t *, vRes, vCuts, i )
1132 printf( "Type%d = %d ", i, Vec_WecSize(vCuts) );
1133 Abc_PrintTime( 1, "Cut matching time", Abc_Clock() - clkStart );
1134 }
1135 return vRes;
1136}
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Gia_ManMatchCutsInt()

Gia_Sto_t * Gia_ManMatchCutsInt ( Gia_Man_t * pGia,
int nCutSize0,
int nCutNum0,
int fVerbose0 )

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

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 1030 of file giaCut.c.

1031{
1032 int nCutSize = nCutSize0;
1033 int nCutNum = nCutNum0;
1034 int fCutMin = 1;
1035 int fTruthMin = 1;
1036 int fVerbose = fVerbose0;
1037 Gia_Sto_t * p = Gia_StoAlloc( pGia, nCutSize, nCutNum, fCutMin, fTruthMin, fVerbose );
1038 Gia_Obj_t * pObj; int i, iObj;
1039 assert( nCutSize <= GIA_MAX_CUTSIZE );
1040 assert( nCutNum < GIA_MAX_CUTNUM );
1041 // prepare references
1042 Gia_ManForEachObj( p->pGia, pObj, iObj )
1043 Gia_StoRefObj( p, iObj );
1044 // compute cuts
1046 Gia_ManForEachCiId( p->pGia, iObj, i )
1047 Gia_StoComputeCutsCi( p, iObj );
1048 Gia_ManForEachAnd( p->pGia, pObj, iObj )
1049 Gia_StoComputeCutsNode( p, iObj );
1050 if ( p->fVerbose )
1051 {
1052 printf( "Running cut computation with CutSize = %d CutNum = %d CutMin = %s TruthMin = %s\n",
1053 p->nCutSize, p->nCutNum, p->fCutMin ? "yes":"no", p->fTruthMin ? "yes":"no" );
1054 printf( "CutPair = %.0f ", p->CutCount[0] );
1055 printf( "Merge = %.0f (%.2f %%) ", p->CutCount[1], 100.0*p->CutCount[1]/p->CutCount[0] );
1056 printf( "Eval = %.0f (%.2f %%) ", p->CutCount[2], 100.0*p->CutCount[2]/p->CutCount[0] );
1057 printf( "Cut = %.0f (%.2f %%) ", p->CutCount[3], 100.0*p->CutCount[3]/p->CutCount[0] );
1058 printf( "Cut/Node = %.2f ", p->CutCount[3] / Gia_ManAndNum(p->pGia) );
1059 printf( "\n" );
1060 printf( "The number of nodes with cut count over the limit (%d cuts) = %d nodes (out of %d). ",
1061 p->nCutNum, p->nCutsOver, Gia_ManAndNum(pGia) );
1062 Abc_PrintTime( 0, "Time", Abc_Clock() - p->clkStart );
1063 }
1064 return p;
1065}
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Gia_ManMatchCutsMany()

Vec_Ptr_t * Gia_ManMatchCutsMany ( Vec_Mem_t * vTtMem,
Vec_Int_t * vMap,
int nFuncs,
Gia_Man_t * pGia,
int nCutSize,
int nCutNum,
int fVerbose )

Definition at line 1137 of file giaCut.c.

1138{
1139 Gia_Sto_t * p = Gia_ManMatchCutsInt( pGia, nCutSize, nCutNum, fVerbose );
1140 Vec_Int_t * vLevel; int i, j, k, * pCut;
1141 abctime clkStart = Abc_Clock();
1142 assert( Abc_Truth6WordNum(nCutSize) == Vec_MemEntrySize(vTtMem) );
1143 Vec_Ptr_t * vRes = Vec_PtrAlloc( nFuncs );
1144 for ( i = 0; i < nFuncs; i++ )
1145 Vec_PtrPush( vRes, Vec_WecAlloc(10) );
1146 Vec_WecForEachLevel( p->vCuts, vLevel, i ) if ( Vec_IntSize(vLevel) )
1147 {
1148 Sdb_ForEachCut( Vec_IntArray(vLevel), pCut, k ) if ( pCut[0] > 1 )
1149 {
1150 word * pTruth = Vec_MemReadEntry( p->vTtMem, Abc_Lit2Var(pCut[pCut[0]+1]) );
1151 assert( (pTruth[0] & 1) == 0 );
1152 int * pSpot = Vec_MemHashLookup( vTtMem, pTruth );
1153 if ( *pSpot == -1 )
1154 continue;
1155 int iFunc = vMap ? Vec_IntEntry( vMap, *pSpot ) : 0;
1156 assert( iFunc < nFuncs );
1157 Vec_Wec_t * vCuts = (Vec_Wec_t *)Vec_PtrEntry( vRes, iFunc );
1158 vLevel = Vec_WecPushLevel( vCuts );
1159 Vec_IntPush( vLevel, i );
1160 for ( j = 1; j <= pCut[0]; j++ )
1161 Vec_IntPush( vLevel, pCut[j] );
1162 break;
1163 }
1164 }
1165 Gia_StoFree( p );
1166 if ( fVerbose )
1167 Abc_PrintTime( 1, "Cut matching time", Abc_Clock() - clkStart );
1168 return vRes;
1169}
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Gia_ManMatchFilterClasses()

Vec_Wrd_t * Gia_ManMatchFilterClasses ( Vec_Mem_t * vTtMem,
Vec_Int_t * vMap,
Vec_Int_t * vClassCounts,
int nNumFuncs,
int fVerbose )

Definition at line 1252 of file giaCut.c.

1253{
1254 int * pPerm = Abc_MergeSortCost( Vec_IntArray(vClassCounts), Vec_IntSize(vClassCounts) );
1255 Vec_Wrd_t * vBest = Vec_WrdAlloc( nNumFuncs ); int i, k, Entry;
1256 Vec_Int_t * vMapNew = Vec_IntStartFull( Vec_IntSize(vMap) );
1257 for ( i = Vec_IntSize(vClassCounts)-1; i >= 0; i-- ) {
1258 word Best = ~(word)0;
1259 Vec_IntForEachEntry( vMap, Entry, k ) {
1260 if ( Entry != pPerm[i] )
1261 continue;
1262 if ( Best > Vec_MemReadEntry(vTtMem, k)[0] )
1263 Best = Vec_MemReadEntry(vTtMem, k)[0];
1264 Vec_IntWriteEntry( vMapNew, k, Vec_WrdSize(vBest) );
1265 }
1266 Vec_WrdPush( vBest, Best );
1267 assert( ~Best );
1268 if ( Vec_WrdSize(vBest) == nNumFuncs )
1269 break;
1270 }
1271 ABC_SWAP( Vec_Int_t, *vMap, *vMapNew );
1272 Vec_IntFree( vMapNew );
1273 ABC_FREE( pPerm );
1274 if ( fVerbose )
1275 printf( "Isolated %d (out of %d) most frequently occuring classes.\n", Vec_WrdSize(vBest), Vec_IntSize(vClassCounts) );
1276 return vBest;
1277}
#define ABC_SWAP(Type, a, b)
Definition abc_global.h:253
int * Abc_MergeSortCost(int *pCosts, int nSize)
Definition utilSort.c:442
#define ABC_FREE(obj)
Definition abc_global.h:267
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Gia_ManMatchProfileFunctions()

void Gia_ManMatchProfileFunctions ( Vec_Wrd_t * vBestReprs,
Vec_Mem_t * vTtMem,
Vec_Int_t * vMap,
Vec_Wrd_t * vFuncs,
int nCutSize )

Definition at line 1278 of file giaCut.c.

1279{
1280 int BarSize = 60;
1281 extern void Dau_DsdPrintFromTruth( word * pTruth, int nVarsInit );
1282 Vec_Int_t * vCounts = Gia_ManCountNpnClasses( vTtMem, vMap, Vec_WrdSize(vBestReprs), vFuncs );
1283 word Repr; int c, i, MaxCount = Vec_IntFindMax( vCounts );
1284 Vec_WrdForEachEntry( vBestReprs, Repr, c )
1285 {
1286 int nSymb = BarSize*Vec_IntEntry(vCounts, c)/Abc_MaxInt(MaxCount, 1);
1287 printf( "Class%4d : ", c );
1288 printf( "Count =%6d ", Vec_IntEntry(vCounts, c) );
1289 for ( i = 0; i < nSymb; i++ )
1290 printf( "*" );
1291 for ( i = nSymb; i < BarSize+3; i++ )
1292 printf( " " );
1293 Dau_DsdPrintFromTruth( &Repr, nCutSize );
1294 }
1295 Vec_IntFree( vCounts );
1296}
void Dau_DsdPrintFromTruth(word *pTruth, int nVarsInit)
Definition dauDsd.c:1968
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Gia_ManPrintWins()

void Gia_ManPrintWins ( Vec_Wec_t * vCuts)

Definition at line 759 of file giaCut.c.

760{
761 Vec_Int_t * vCut; int i, k, Obj;
762 Vec_WecForEachLevel( vCuts, vCut, i )
763 {
764 int nInputs = Vec_IntEntry(vCut, 0);
765 printf( "Cut %5d : ", i );
766 printf( "Supp = %d ", nInputs );
767 printf( "Nodes = %d ", Vec_IntSize(vCut) - 1 - nInputs );
768 Vec_IntForEachEntryStartStop( vCut, Obj, k, 1, nInputs+1 )
769 printf( "%d ", Obj );
770 printf( " " );
771 Vec_IntForEachEntryStart( vCut, Obj, k, nInputs+1 )
772 printf( "%d ", Obj );
773 printf( "\n" );
774 }
775}
#define Vec_IntForEachEntryStartStop(vVec, Entry, i, Start, Stop)
Definition vecInt.h:60

◆ Gia_ManPrintWinStats()

void Gia_ManPrintWinStats ( Vec_Wec_t * vCuts)

Definition at line 776 of file giaCut.c.

777{
778 Vec_Int_t * vCut; int i, nInputs = 0, nNodes = 0;
779 Vec_WecForEachLevel( vCuts, vCut, i )
780 {
781 nInputs += Vec_IntEntry(vCut, 0);
782 nNodes += Vec_IntSize(vCut) - 1 - Vec_IntEntry(vCut, 0);
783 }
784 printf( "Computed %d windows with average support %.3f and average volume %.3f.\n",
785 Vec_WecSize(vCuts), 1.0*nInputs/Vec_WecSize(vCuts), 1.0*nNodes/Vec_WecSize(vCuts) );
786}
Here is the caller graph for this function:

◆ Gia_ManSelectCuts()

Vec_Wec_t * Gia_ManSelectCuts ( Vec_Wec_t * vCuts,
int nCuts,
int nCutSizeMin )

Definition at line 688 of file giaCut.c.

689{
690 Vec_Wec_t * vCutsSel = Vec_WecStart( nCuts );
691 int i; srand( time(NULL) );
692 for ( i = 0; i < nCuts; i++ )
693 while ( !Gia_StoSelectOneCut(vCuts, (rand() | (rand() << 15)) % Vec_WecSize(vCuts), Vec_WecEntry(vCutsSel, i), nCutSizeMin) );
694 return vCutsSel;
695}
int Gia_StoSelectOneCut(Vec_Wec_t *vCuts, int iObj, Vec_Int_t *vCut, int nCutSizeMin)
Definition giaCut.c:671
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Gia_StoAlloc()

Gia_Sto_t * Gia_StoAlloc ( Gia_Man_t * pGia,
int nCutSize,
int nCutNum,
int fCutMin,
int fTruthMin,
int fVerbose )

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

Synopsis [Incremental cut computation.]

Description []

SideEffects []

SeeAlso []

Definition at line 568 of file giaCut.c.

569{
570 Gia_Sto_t * p;
571 assert( nCutSize < GIA_CUT_NO_LEAF );
572 assert( nCutSize > 1 && nCutSize <= GIA_MAX_CUTSIZE );
573 assert( nCutNum > 1 && nCutNum < GIA_MAX_CUTNUM );
574 p = ABC_CALLOC( Gia_Sto_t, 1 );
575 p->clkStart = Abc_Clock();
576 p->nCutSize = nCutSize;
577 p->nCutNum = nCutNum;
578 p->fCutMin = fCutMin;
579 p->fTruthMin = fTruthMin;
580 p->fVerbose = fVerbose;
581 p->pGia = pGia;
582 p->vRefs = Vec_IntAlloc( Gia_ManObjNum(pGia) );
583 p->vCuts = Vec_WecStart( Gia_ManObjNum(pGia) );
584 p->vTtMem = fCutMin ? Vec_MemAllocForTT( nCutSize, 0 ) : NULL;
585 return p;
586}
#define ABC_CALLOC(type, num)
Definition abc_global.h:265
#define GIA_CUT_NO_LEAF
Definition giaCut.c:36
Here is the caller graph for this function:

◆ Gia_StoComputeCuts()

void Gia_StoComputeCuts ( Gia_Man_t * pGia)

Definition at line 622 of file giaCut.c.

623{
624 int nCutSize = 8;
625 int nCutNum = 6;
626 int fCutMin = 0;
627 int fTruthMin = 0;
628 int fVerbose = 1;
629 Gia_Sto_t * p = Gia_StoAlloc( pGia, nCutSize, nCutNum, fCutMin, fTruthMin, fVerbose );
630 Gia_Obj_t * pObj; int i, iObj;
631 assert( nCutSize <= GIA_MAX_CUTSIZE );
632 assert( nCutNum < GIA_MAX_CUTNUM );
633 // prepare references
634 Gia_ManForEachObj( p->pGia, pObj, iObj )
635 Gia_StoRefObj( p, iObj );
636 // compute cuts
638 Gia_ManForEachCiId( p->pGia, iObj, i )
639 Gia_StoComputeCutsCi( p, iObj );
640 Gia_ManForEachAnd( p->pGia, pObj, iObj )
641 Gia_StoComputeCutsNode( p, iObj );
642 if ( p->fVerbose )
643 {
644 printf( "Running cut computation with CutSize = %d CutNum = %d CutMin = %s TruthMin = %s\n",
645 p->nCutSize, p->nCutNum, p->fCutMin ? "yes":"no", p->fTruthMin ? "yes":"no" );
646 printf( "CutPair = %.0f ", p->CutCount[0] );
647 printf( "Merge = %.0f (%.2f %%) ", p->CutCount[1], 100.0*p->CutCount[1]/p->CutCount[0] );
648 printf( "Eval = %.0f (%.2f %%) ", p->CutCount[2], 100.0*p->CutCount[2]/p->CutCount[0] );
649 printf( "Cut = %.0f (%.2f %%) ", p->CutCount[3], 100.0*p->CutCount[3]/p->CutCount[0] );
650 printf( "Cut/Node = %.2f ", p->CutCount[3] / Gia_ManAndNum(p->pGia) );
651 printf( "\n" );
652 printf( "The number of nodes with cut count over the limit (%d cuts) = %d nodes (out of %d). ",
653 p->nCutNum, p->nCutsOver, Gia_ManAndNum(pGia) );
654 Abc_PrintTime( 0, "Time", Abc_Clock() - p->clkStart );
655 }
656 Gia_StoFree( p );
657}
Here is the call graph for this function:

◆ Gia_StoComputeCutsCi()

void Gia_StoComputeCutsCi ( Gia_Sto_t * p,
int iObj )

Definition at line 601 of file giaCut.c.

602{
603 Gia_CutAddUnit( p, iObj );
604}
Here is the caller graph for this function:

◆ Gia_StoComputeCutsConst0()

void Gia_StoComputeCutsConst0 ( Gia_Sto_t * p,
int iObj )

Definition at line 597 of file giaCut.c.

598{
599 Gia_CutAddZero( p, iObj );
600}
Here is the caller graph for this function:

◆ Gia_StoComputeCutsNode()

void Gia_StoComputeCutsNode ( Gia_Sto_t * p,
int iObj )

Definition at line 605 of file giaCut.c.

606{
607 Gia_StoMergeCuts( p, iObj );
608}
void Gia_StoMergeCuts(Gia_Sto_t *p, int iObj)
Definition giaCut.c:500
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Gia_StoCutPrint()

void Gia_StoCutPrint ( int * pCut)

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

Synopsis [Extract a given number of cuts.]

Description []

SideEffects []

SeeAlso []

Definition at line 811 of file giaCut.c.

812{
813 int v;
814 printf( "{" );
815 for ( v = 1; v <= pCut[0]; v++ )
816 printf( " %d", pCut[v] );
817 printf( " }\n" );
818}
Here is the caller graph for this function:

◆ Gia_StoFree()

void Gia_StoFree ( Gia_Sto_t * p)

Definition at line 587 of file giaCut.c.

588{
589 Vec_IntFree( p->vRefs );
590 Vec_WecFree( p->vCuts );
591 if ( p->fCutMin )
592 Vec_MemHashFree( p->vTtMem );
593 if ( p->fCutMin )
594 Vec_MemFree( p->vTtMem );
595 ABC_FREE( p );
596}
Here is the caller graph for this function:

◆ Gia_StoMergeCuts()

void Gia_StoMergeCuts ( Gia_Sto_t * p,
int iObj )

Definition at line 500 of file giaCut.c.

501{
502 Gia_Obj_t * pObj = Gia_ManObj(p->pGia, iObj);
503 int fIsXor = Gia_ObjIsXor(pObj);
504 int nCutSize = p->nCutSize;
505 int nCutNum = p->nCutNum;
506 int fComp0 = Gia_ObjFaninC0(pObj);
507 int fComp1 = Gia_ObjFaninC1(pObj);
508 int Fan0 = Gia_ObjFaninId0(pObj, iObj);
509 int Fan1 = Gia_ObjFaninId1(pObj, iObj);
510 int nCuts0 = Gia_StoPrepareSet( p, Fan0, 0 );
511 int nCuts1 = Gia_StoPrepareSet( p, Fan1, 1 );
512 int i, k, nCutsR = 0;
513 Gia_Cut_t * pCut0, * pCut1, ** pCutsR = p->ppCuts;
514 assert( !Gia_ObjIsBuf(pObj) );
515 assert( !Gia_ObjIsMux(p->pGia, pObj) );
516 Gia_StoInitResult( p );
517 p->CutCount[0] += nCuts0 * nCuts1;
518 for ( i = 0, pCut0 = p->pCuts[0]; i < nCuts0; i++, pCut0++ )
519 for ( k = 0, pCut1 = p->pCuts[1]; k < nCuts1; k++, pCut1++ )
520 {
521 if ( (int)(pCut0->nLeaves + pCut1->nLeaves) > nCutSize && Gia_CutCountBits(pCut0->Sign | pCut1->Sign) > nCutSize )
522 continue;
523 p->CutCount[1]++;
524 if ( !Gia_CutMergeOrder(pCut0, pCut1, pCutsR[nCutsR], nCutSize) )
525 continue;
526 if ( Gia_CutSetLastCutIsContained(pCutsR, nCutsR) )
527 continue;
528 p->CutCount[2]++;
529 if ( p->fCutMin && Gia_CutComputeTruth(p, pCut0, pCut1, fComp0, fComp1, pCutsR[nCutsR], fIsXor) )
530 pCutsR[nCutsR]->Sign = Gia_CutGetSign(pCutsR[nCutsR]);
531 pCutsR[nCutsR]->nTreeLeaves = Gia_CutTreeLeaves( p, pCutsR[nCutsR] );
532 pCutsR[nCutsR]->CostF = Gia_CutGetCost( p, pCutsR[nCutsR] );
533 nCutsR = Gia_CutSetAddCut( pCutsR, nCutsR, nCutNum );
534 }
535 p->CutCount[3] += nCutsR;
536 p->nCutsOver += nCutsR == nCutNum-1;
537 p->nCutsR = nCutsR;
538 p->Pivot = iObj;
539 // debug printout
540 if ( 0 )
541 {
542 printf( "*** Obj = %4d NumCuts = %4d\n", iObj, nCutsR );
543 for ( i = 0; i < nCutsR; i++ )
544 Gia_CutPrint( p, iObj, pCutsR[i] );
545 printf( "\n" );
546 }
547 // verify
548 assert( nCutsR > 0 && nCutsR < nCutNum );
549 assert( Gia_CutSetCheckArray(pCutsR, nCutsR) );
550 // store the cutset
551 Gia_StoStoreResult( p, iObj, pCutsR, nCutsR );
552 if ( nCutsR > 1 || pCutsR[0]->nLeaves > 1 )
553 Gia_CutAddUnit( p, iObj );
554}
struct Gia_Cut_t_ Gia_Cut_t
Definition giaCut.c:38
unsigned nLeaves
Definition giaCut.c:46
word Sign
Definition giaCut.c:41
float CostF
Definition giaCut.c:48
unsigned nTreeLeaves
Definition giaCut.c:45
Here is the caller graph for this function:

◆ Gia_StoPrintCuts()

void Gia_StoPrintCuts ( Vec_Int_t * vThis,
int iObj,
int nCutSize )

Definition at line 819 of file giaCut.c.

820{
821 int i, * pCut;
822 printf( "Cuts of node %d (size = %d):\n", iObj, nCutSize );
823 Sdb_ForEachCut( Vec_IntArray(vThis), pCut, i )
824 if ( !nCutSize || pCut[0] == nCutSize )
825 Gia_StoCutPrint( pCut );
826}
void Gia_StoCutPrint(int *pCut)
Definition giaCut.c:811
Here is the call graph for this function:

◆ Gia_StoRefObj()

void Gia_StoRefObj ( Gia_Sto_t * p,
int iObj )

Definition at line 609 of file giaCut.c.

610{
611 Gia_Obj_t * pObj = Gia_ManObj(p->pGia, iObj);
612 assert( iObj == Vec_IntSize(p->vRefs) );
613 Vec_IntPush( p->vRefs, 0 );
614 if ( Gia_ObjIsAnd(pObj) )
615 {
616 Vec_IntAddToEntry( p->vRefs, Gia_ObjFaninId0(pObj, iObj), 1 );
617 Vec_IntAddToEntry( p->vRefs, Gia_ObjFaninId1(pObj, iObj), 1 );
618 }
619 else if ( Gia_ObjIsCo(pObj) )
620 Vec_IntAddToEntry( p->vRefs, Gia_ObjFaninId0(pObj, iObj), 1 );
621}
Here is the caller graph for this function:

◆ Gia_StoSelectOneCut()

int Gia_StoSelectOneCut ( Vec_Wec_t * vCuts,
int iObj,
Vec_Int_t * vCut,
int nCutSizeMin )

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

Synopsis [Extract a given number of cuts.]

Description []

SideEffects []

SeeAlso []

Definition at line 671 of file giaCut.c.

672{
673 Vec_Int_t * vThis = Vec_WecEntry( vCuts, iObj );
674 int i, v, * pCut, * pList = Vec_IntArray( vThis );
675 if ( pList == NULL )
676 return 0;
677 Vec_IntClear( vCut );
678 Sdb_ForEachCut( pList, pCut, i )
679 {
680 if ( pCut[0] < nCutSizeMin )
681 continue;
682 for ( v = 0; v <= pCut[0]; v++ )
683 Vec_IntPush( vCut, pCut[v] );
684 return 1;
685 }
686 return 0;
687}
Here is the caller graph for this function: