Commit 5838789e by Alan Mishchenko

Scalable gate-level abstraction.

parent 8a2d237f
...@@ -128,6 +128,7 @@ struct Gia_Man_t_ ...@@ -128,6 +128,7 @@ struct Gia_Man_t_
Vec_Int_t * vFanoutNums; // static fanout Vec_Int_t * vFanoutNums; // static fanout
Vec_Int_t * vFanout; // static fanout Vec_Int_t * vFanout; // static fanout
int * pMapping; // mapping for each node int * pMapping; // mapping for each node
Vec_Int_t * vMapping;
Vec_Int_t * vLutConfigs; // LUT configurations Vec_Int_t * vLutConfigs; // LUT configurations
Abc_Cex_t * pCexComb; // combinational counter-example Abc_Cex_t * pCexComb; // combinational counter-example
Abc_Cex_t * pCexSeq; // sequential counter-example Abc_Cex_t * pCexSeq; // sequential counter-example
...@@ -718,6 +719,7 @@ extern Vec_Int_t * Gia_FlaConvertToGla( Gia_Man_t * p, Vec_Int_t * vFla ...@@ -718,6 +719,7 @@ extern Vec_Int_t * Gia_FlaConvertToGla( Gia_Man_t * p, Vec_Int_t * vFla
extern Vec_Int_t * Gia_GlaConvertToFla( Gia_Man_t * p, Vec_Int_t * vGla ); extern Vec_Int_t * Gia_GlaConvertToFla( Gia_Man_t * p, Vec_Int_t * vGla );
/*=== giaAbsGla.c ===========================================================*/ /*=== giaAbsGla.c ===========================================================*/
extern int Gia_GlaPerform( Gia_Man_t * p, Gia_ParVta_t * pPars, int fStartVta ); extern int Gia_GlaPerform( Gia_Man_t * p, Gia_ParVta_t * pPars, int fStartVta );
extern int Ga2_ManPerform( Gia_Man_t * p, Gia_ParVta_t * pPars );
/*=== giaAbsVta.c ===========================================================*/ /*=== giaAbsVta.c ===========================================================*/
extern void Gia_VtaSetDefaultParams( Gia_ParVta_t * p ); extern void Gia_VtaSetDefaultParams( Gia_ParVta_t * p );
extern int Gia_VtaPerform( Gia_Man_t * pAig, Gia_ParVta_t * pPars ); extern int Gia_VtaPerform( Gia_Man_t * pAig, Gia_ParVta_t * pPars );
......
...@@ -38,31 +38,30 @@ typedef struct Ga2_Man_t_ Ga2_Man_t; // manager ...@@ -38,31 +38,30 @@ typedef struct Ga2_Man_t_ Ga2_Man_t; // manager
struct Ga2_Man_t_ struct Ga2_Man_t_
{ {
// user data // user data
Gia_Man_t * pGia; // working AIG manager Gia_Man_t * pGia; // working AIG manager
Gia_ParVta_t * pPars; // parameters Gia_ParVta_t * pPars; // parameters
// markings // markings
int nMarked; // total number of marked nodes and flops int nMarked; // total number of marked nodes and flops
Vec_Int_t * vMapping; // for each object: leaf count, leaves, truth table Vec_Ptr_t * vCnfs; // for each object: CNF0, CNF1
Vec_Ptr_t * vDatas; // for each object: leaves, CNF0, CNF1
// abstraction // abstraction
Vec_Int_t * vAbs; // array of abstracted objects Vec_Int_t * vIds; // abstraction ID for each object
Vec_Int_t * vValues; // array of objects with SAT numbers assigned Vec_Int_t * vAbs; // array of abstracted objects
int LimAbs; // limit value for starting abstraction objects Vec_Int_t * vValues; // array of objects with SAT numbers assigned
int LimPpi; // limit value for starting PPI objects int LimAbs; // limit value for starting abstraction objects
int LimPpi; // limit value for starting PPI objects
// refinement // refinement
Rnm_Man_t * pRnm; // refinement manager Rnm_Man_t * pRnm; // refinement manager
// SAT solver and variables // SAT solver and variables
Vec_Ptr_t * vId2Lit; // mapping, for each timeframe, of object ID into SAT literal Vec_Ptr_t * vId2Lit; // mapping, for each timeframe, of object ID into SAT literal
sat_solver2 * pSat; // incremental SAT solver sat_solver2 * pSat; // incremental SAT solver
int nSatVars; // the number of SAT variables int nSatVars; // the number of SAT variables
int nProofIds; // the counter of proof IDs int nProofIds; // the counter of proof IDs
// temporaries // temporaries
Vec_Int_t * vCnf;
Vec_Int_t * vLits; Vec_Int_t * vLits;
Vec_Int_t * vIsopMem; Vec_Int_t * vIsopMem;
char * pSopSizes, ** pSops; // CNF representation char * pSopSizes, ** pSops; // CNF representation
int nCexes; // the number of counter-examples int nCexes; // the number of counter-examples
int nObjAdded; // objs added during refinement int nObjAdded; // objs added during refinement
// statistics // statistics
clock_t timeStart; clock_t timeStart;
clock_t timeInit; clock_t timeInit;
...@@ -72,38 +71,39 @@ struct Ga2_Man_t_ ...@@ -72,38 +71,39 @@ struct Ga2_Man_t_
clock_t timeOther; clock_t timeOther;
}; };
static inline int Ga2_ObjOffset( Ga2_Man_t * p, Gia_Obj_t * pObj ) { assert(pObj->Value); return Vec_IntEntry(p->vMapping, Gia_ObjId(p->pGia, pObj)); } static inline int Ga2_ObjOffset( Gia_Man_t * p, Gia_Obj_t * pObj ) { return Vec_IntEntry(p->vMapping, Gia_ObjId(p, pObj)); }
static inline int Ga2_ObjLeaveNum( Ga2_Man_t * p, Gia_Obj_t * pObj ) { return Vec_IntEntry(p->vMapping, Ga2_ObjOffset(p, pObj)); } static inline int Ga2_ObjLeaveNum( Gia_Man_t * p, Gia_Obj_t * pObj ) { return Vec_IntEntry(p->vMapping, Ga2_ObjOffset(p, pObj)); }
static inline int * Ga2_ObjLeavePtr( Ga2_Man_t * p, Gia_Obj_t * pObj ) { return Vec_IntEntryP(p->vMapping, Ga2_ObjOffset(p, pObj) + 1); } static inline int * Ga2_ObjLeavePtr( Gia_Man_t * p, Gia_Obj_t * pObj ) { return Vec_IntEntryP(p->vMapping, Ga2_ObjOffset(p, pObj) + 1); }
static inline unsigned Ga2_ObjTruth( Ga2_Man_t * p, Gia_Obj_t * pObj ) { return (unsigned)Vec_IntEntry(p->vMapping, Ga2_ObjOffset(p, pObj) + Ga2_ObjLeaveNum(p, pObj) + 1); } static inline unsigned Ga2_ObjTruth( Gia_Man_t * p, Gia_Obj_t * pObj ) { return (unsigned)Vec_IntEntry(p->vMapping, Ga2_ObjOffset(p, pObj) + Ga2_ObjLeaveNum(p, pObj) + 1); }
static inline int Ga2_ObjRefNum( Ga2_Man_t * p, Gia_Obj_t * pObj ) { return (unsigned)Vec_IntEntry(p->vMapping, Ga2_ObjOffset(p, pObj) + Ga2_ObjLeaveNum(p, pObj) + 2); } static inline int Ga2_ObjRefNum( Gia_Man_t * p, Gia_Obj_t * pObj ) { return (unsigned)Vec_IntEntry(p->vMapping, Ga2_ObjOffset(p, pObj) + Ga2_ObjLeaveNum(p, pObj) + 2); }
static inline Vec_Int_t * Ga2_ObjLeaves( Ga2_Man_t * p, Gia_Obj_t * pObj ) { static Vec_Int_t vVec; vVec.nSize = Ga2_ObjLeaveNum(p, pObj), vVec.pArray = Ga2_ObjLeavePtr(p, pObj); return &vVec; } static inline Vec_Int_t * Ga2_ObjLeaves( Gia_Man_t * p, Gia_Obj_t * pObj ) { static Vec_Int_t v; v.nSize = Ga2_ObjLeaveNum(p, pObj), v.pArray = Ga2_ObjLeavePtr(p, pObj); return &v; }
static inline Vec_Int_t * Ga2_ObjCnf0( Ga2_Man_t * p, Gia_Obj_t * pObj ) { assert(pObj->Value); return Vec_PtrEntry(p->vDatas, (pObj->Value << 1) ); } static inline int Ga2_ObjId( Ga2_Man_t * p, Gia_Obj_t * pObj ) { return Vec_IntEntry(p->vIds, Gia_ObjId(p->pGia, pObj)); }
static inline Vec_Int_t * Ga2_ObjCnf1( Ga2_Man_t * p, Gia_Obj_t * pObj ) { assert(pObj->Value); return Vec_PtrEntry(p->vDatas, (pObj->Value << 1)+1); } static inline void Ga2_ObjSetId( Ga2_Man_t * p, Gia_Obj_t * pObj, int i ) { Vec_IntWriteEntry(p->vIds, Gia_ObjId(p->pGia, pObj), i); }
static inline int Ga2_ObjIsAbs( Ga2_Man_t * p, Gia_Obj_t * pObj ) { assert( pObj->Value ); return (int)pObj->Value < p->LimAbs; } static inline Vec_Int_t * Ga2_ObjCnf0( Ga2_Man_t * p, Gia_Obj_t * pObj ) { assert(Ga2_ObjId(p,pObj)); return Vec_PtrEntry(p->vCnfs, (Ga2_ObjId(p,pObj) << 1) ); }
static inline int Ga2_ObjIsPPI( Ga2_Man_t * p, Gia_Obj_t * pObj ) { assert( pObj->Value ); return (int)pObj->Value >= p->LimAbs && (int)pObj->Value < p->LimPpi; } static inline Vec_Int_t * Ga2_ObjCnf1( Ga2_Man_t * p, Gia_Obj_t * pObj ) { assert(Ga2_ObjId(p,pObj)); return Vec_PtrEntry(p->vCnfs, (Ga2_ObjId(p,pObj) << 1)+1); }
static inline Vec_Int_t * Ga2_MapFrameMap( Ga2_Man_t * p, int f ) { return (Vec_Int_t *)Vec_PtrEntry( p->vId2Lit, f ); } static inline int Ga2_ObjIsAbs( Ga2_Man_t * p, Gia_Obj_t * pObj ) { assert(Ga2_ObjId(p,pObj)); return Ga2_ObjId(p,pObj) < p->LimAbs; }
static inline int Ga2_ObjIsPpi( Ga2_Man_t * p, Gia_Obj_t * pObj ) { assert(Ga2_ObjId(p,pObj)); return Ga2_ObjId(p,pObj) >= p->LimAbs && Ga2_ObjId(p,pObj) < p->LimPpi; }
static inline Vec_Int_t * Ga2_MapFrameMap( Ga2_Man_t * p, int f ) { return (Vec_Int_t *)Vec_PtrEntry( p->vId2Lit, f ); }
// returns literal of this object, or -1 if SAT variable of the object is not assigned // returns literal of this object, or -1 if SAT variable of the object is not assigned
static inline int Ga2_ObjFindLit( Ga2_Man_t * p, Gia_Obj_t * pObj, int f ) static inline int Ga2_ObjFindLit( Ga2_Man_t * p, Gia_Obj_t * pObj, int f )
{ {
assert( pObj->fPhase ); assert( Ga2_ObjId(p,pObj) && Ga2_ObjId(p,pObj) < Vec_IntSize(p->vValues) );
assert( pObj->Value && pObj->Value < Vec_IntSize(p->vValues) );
if ( f == Vec_PtrSize(p->vId2Lit) ) if ( f == Vec_PtrSize(p->vId2Lit) )
Vec_PtrPush( p->vId2Lit, Vec_IntStartFull(Vec_IntSize(p->vValues)) ); Vec_PtrPush( p->vId2Lit, Vec_IntStartFull(Vec_IntSize(p->vValues)) );
assert( f < Vec_PtrSize(p->vId2Lit) ); assert( f < Vec_PtrSize(p->vId2Lit) );
return Vec_IntEntry( Ga2_MapFrameMap(p, f), pObj->Value ); return Vec_IntEntry( Ga2_MapFrameMap(p, f), Ga2_ObjId(p,pObj) );
} }
// inserts literal of this object // inserts literal of this object
static inline void Ga2_ObjAddLit( Ga2_Man_t * p, Gia_Obj_t * pObj, int f, int Lit ) static inline void Ga2_ObjAddLit( Ga2_Man_t * p, Gia_Obj_t * pObj, int f, int Lit )
{ {
assert( Lit > 1 ); assert( Lit > 1 );
assert( Ga2_ObjFindLit(p, pObj, f) == -1 ); assert( Ga2_ObjFindLit(p, pObj, f) == -1 );
Vec_IntSetEntry( Ga2_MapFrameMap(p, f), pObj->Value, Lit ); Vec_IntSetEntry( Ga2_MapFrameMap(p, f), Ga2_ObjId(p,pObj), Lit );
} }
// returns or inserts-and-returns literal of this object // returns or inserts-and-returns literal of this object
static inline int Ga2_ObjFindOrAddLit( Ga2_Man_t * p, Gia_Obj_t * pObj, int f ) static inline int Ga2_ObjFindOrAddLit( Ga2_Man_t * p, Gia_Obj_t * pObj, int f )
...@@ -118,7 +118,6 @@ static inline int Ga2_ObjFindOrAddLit( Ga2_Man_t * p, Gia_Obj_t * pObj, int f ) ...@@ -118,7 +118,6 @@ static inline int Ga2_ObjFindOrAddLit( Ga2_Man_t * p, Gia_Obj_t * pObj, int f )
return Lit; return Lit;
} }
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
/// FUNCTION DEFINITIONS /// /// FUNCTION DEFINITIONS ///
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
...@@ -147,21 +146,11 @@ unsigned Ga2_ObjComputeTruth_rec( Gia_Man_t * p, Gia_Obj_t * pObj, int fFirst ) ...@@ -147,21 +146,11 @@ unsigned Ga2_ObjComputeTruth_rec( Gia_Man_t * p, Gia_Obj_t * pObj, int fFirst )
unsigned Ga2_ManComputeTruth( Gia_Man_t * p, Gia_Obj_t * pRoot, Vec_Int_t * vLeaves ) unsigned Ga2_ManComputeTruth( Gia_Man_t * p, Gia_Obj_t * pRoot, Vec_Int_t * vLeaves )
{ {
static unsigned uTruth5[5] = { 0xAAAAAAAA, 0xCCCCCCCC, 0xF0F0F0F0, 0xFF00FF00, 0xFFFF0000 }; static unsigned uTruth5[5] = { 0xAAAAAAAA, 0xCCCCCCCC, 0xF0F0F0F0, 0xFF00FF00, 0xFFFF0000 };
unsigned Res, Values[5];
Gia_Obj_t * pObj; Gia_Obj_t * pObj;
int i; int i;
// assign elementary truth tables
Gia_ManForEachObjVec( vLeaves, p, pObj, i ) Gia_ManForEachObjVec( vLeaves, p, pObj, i )
{
assert( pObj->fPhase );
Values[i] = pObj->Value;
pObj->Value = uTruth5[i]; pObj->Value = uTruth5[i];
} return Ga2_ObjComputeTruth_rec( p, pRoot, 1 );
Res = Ga2_ObjComputeTruth_rec( p, pRoot, 1 );
// return values
Gia_ManForEachObjVec( vLeaves, p, pObj, i )
pObj->Value = Values[i];
return Res;
} }
/**Function************************************************************* /**Function*************************************************************
...@@ -243,11 +232,10 @@ void Ga2_ManCollectLeaves_rec( Gia_Man_t * p, Gia_Obj_t * pObj, Vec_Int_t * vLea ...@@ -243,11 +232,10 @@ void Ga2_ManCollectLeaves_rec( Gia_Man_t * p, Gia_Obj_t * pObj, Vec_Int_t * vLea
Ga2_ManCollectLeaves_rec( p, Gia_ObjFanin0(pObj), vLeaves, 0 ); Ga2_ManCollectLeaves_rec( p, Gia_ObjFanin0(pObj), vLeaves, 0 );
Ga2_ManCollectLeaves_rec( p, Gia_ObjFanin1(pObj), vLeaves, 0 ); Ga2_ManCollectLeaves_rec( p, Gia_ObjFanin1(pObj), vLeaves, 0 );
} }
int Ga2_ManMarkup( Gia_Man_t * p, int N, Vec_Int_t ** pvMap ) int Ga2_ManMarkup( Gia_Man_t * p, int N )
{ {
static unsigned uTruth5[5] = { 0xAAAAAAAA, 0xCCCCCCCC, 0xF0F0F0F0, 0xFF00FF00, 0xFFFF0000 }; static unsigned uTruth5[5] = { 0xAAAAAAAA, 0xCCCCCCCC, 0xF0F0F0F0, 0xFF00FF00, 0xFFFF0000 };
clock_t clk = clock(); clock_t clk = clock();
Vec_Int_t * vMap;
Vec_Int_t * vLeaves; Vec_Int_t * vLeaves;
Gia_Obj_t * pObj; Gia_Obj_t * pObj;
int i, k, Leaf, CountMarks; int i, k, Leaf, CountMarks;
...@@ -289,7 +277,8 @@ int Ga2_ManMarkup( Gia_Man_t * p, int N, Vec_Int_t ** pvMap ) ...@@ -289,7 +277,8 @@ int Ga2_ManMarkup( Gia_Man_t * p, int N, Vec_Int_t ** pvMap )
} }
// verify that the tree is split correctly // verify that the tree is split correctly
CountMarks = 0; CountMarks = 0;
vMap = Vec_IntStart( Gia_ManObjNum(p) ); Vec_IntFreeP( &p->vMapping );
p->vMapping = Vec_IntStart( Gia_ManObjNum(p) );
Gia_ManForEachAnd( p, pObj, i ) Gia_ManForEachAnd( p, pObj, i )
{ {
if ( !pObj->fPhase ) if ( !pObj->fPhase )
...@@ -299,18 +288,18 @@ int Ga2_ManMarkup( Gia_Man_t * p, int N, Vec_Int_t ** pvMap ) ...@@ -299,18 +288,18 @@ int Ga2_ManMarkup( Gia_Man_t * p, int N, Vec_Int_t ** pvMap )
// printf( "%d ", Vec_IntSize(vLeaves) ); // printf( "%d ", Vec_IntSize(vLeaves) );
assert( Vec_IntSize(vLeaves) <= N ); assert( Vec_IntSize(vLeaves) <= N );
// create map // create map
Vec_IntWriteEntry( vMap, i, Vec_IntSize(vMap) ); Vec_IntWriteEntry( p->vMapping, i, Vec_IntSize(p->vMapping) );
Vec_IntPush( vMap, Vec_IntSize(vLeaves) ); Vec_IntPush( p->vMapping, Vec_IntSize(vLeaves) );
Vec_IntForEachEntry( vLeaves, Leaf, k ) Vec_IntForEachEntry( vLeaves, Leaf, k )
{ {
Vec_IntPush( vMap, Leaf ); Vec_IntPush( p->vMapping, Leaf );
Gia_ManObj(p, Leaf)->Value = uTruth5[k]; Gia_ManObj(p, Leaf)->Value = uTruth5[k];
assert( Gia_ManObj(p, Leaf)->fPhase );
} }
Vec_IntPush( vMap, (int)Ga2_ObjComputeTruth_rec( p, pObj, 1 ) ); Vec_IntPush( p->vMapping, (int)Ga2_ObjComputeTruth_rec( p, pObj, 1 ) );
Vec_IntPush( vMap, -1 ); // placeholder for ref counter Vec_IntPush( p->vMapping, -1 ); // placeholder for ref counter
CountMarks++; CountMarks++;
} }
*pvMap = vMap;
// printf( "Internal nodes = %d. ", CountMarks ); // printf( "Internal nodes = %d. ", CountMarks );
Abc_PrintTime( 1, "Time", clock() - clk ); Abc_PrintTime( 1, "Time", clock() - clk );
Vec_IntFree( vLeaves ); Vec_IntFree( vLeaves );
...@@ -319,22 +308,23 @@ int Ga2_ManMarkup( Gia_Man_t * p, int N, Vec_Int_t ** pvMap ) ...@@ -319,22 +308,23 @@ int Ga2_ManMarkup( Gia_Man_t * p, int N, Vec_Int_t ** pvMap )
void Ga2_ManComputeTest( Gia_Man_t * p ) void Ga2_ManComputeTest( Gia_Man_t * p )
{ {
clock_t clk; clock_t clk;
Vec_Int_t * vLeaves, * vMap; // unsigned uTruth;
Gia_Obj_t * pObj; Gia_Obj_t * pObj;
int i; int i, Counter = 0;
Ga2_ManMarkup( p, 5, &vMap );
clk = clock(); clk = clock();
vLeaves = Vec_IntAlloc( 100 ); Ga2_ManMarkup( p, 5 );
Abc_PrintTime( 1, "Time", clock() - clk );
Gia_ManForEachAnd( p, pObj, i ) Gia_ManForEachAnd( p, pObj, i )
{ {
if ( !pObj->fPhase ) if ( !pObj->fPhase )
continue; continue;
Vec_IntClear( vLeaves ); // uTruth = Ga2_ObjTruth( p, pObj );
Ga2_ManCollectLeaves_rec( p, pObj, vLeaves, 1 ); // printf( "%6d : ", Counter );
Ga2_ManComputeTruth( p, pObj, vLeaves ); // Kit_DsdPrintFromTruth( &uTruth, Ga2_ObjLeaveNum(p, pObj) );
// printf( "\n" );
Counter++;
} }
Vec_IntFree( vLeaves ); printf( "Marked AND nodes = %6d. ", Counter );
Vec_IntFree( vMap );
Abc_PrintTime( 1, "Time", clock() - clk ); Abc_PrintTime( 1, "Time", clock() - clk );
} }
...@@ -355,57 +345,69 @@ Ga2_Man_t * Ga2_ManStart( Gia_Man_t * pGia, Gia_ParVta_t * pPars ) ...@@ -355,57 +345,69 @@ Ga2_Man_t * Ga2_ManStart( Gia_Man_t * pGia, Gia_ParVta_t * pPars )
p = ABC_CALLOC( Ga2_Man_t, 1 ); p = ABC_CALLOC( Ga2_Man_t, 1 );
p->timeStart = clock(); p->timeStart = clock();
// user data // user data
p->pGia = pGia; p->pGia = pGia;
p->pPars = pPars; p->pPars = pPars;
// markings // markings
p->nMarked = Gia_ManRegNum(p->pGia) + Ga2_ManMarkup( pGia, 5, &p->vMapping ); p->nMarked = Ga2_ManMarkup( pGia, 5 ) + Gia_ManRegNum( p->pGia );
p->vDatas = Vec_PtrAlloc( 1000 ); p->vCnfs = Vec_PtrAlloc( 1000 );
Vec_PtrPush( p->vDatas, Vec_IntAlloc(0) ); Vec_PtrPush( p->vCnfs, Vec_IntAlloc(0) );
Vec_PtrPush( p->vDatas, Vec_IntAlloc(0) ); Vec_PtrPush( p->vCnfs, Vec_IntAlloc(0) );
// abstraction // abstraction
p->vAbs = Vec_IntAlloc( 1000 ); p->vIds = Vec_IntStart( Gia_ManObjNum(pGia) );
p->vValues = Vec_IntAlloc( 1000 ); p->vAbs = Vec_IntAlloc( 1000 );
p->vValues = Vec_IntAlloc( 1000 );
Vec_IntPush( p->vValues, -1 ); Vec_IntPush( p->vValues, -1 );
// refinement // refinement
p->pRnm = Rnm_ManStart( pGia ); p->pRnm = Rnm_ManStart( pGia );
// SAT solver and variables // SAT solver and variables
p->vId2Lit = Vec_PtrAlloc( 1000 ); p->vId2Lit = Vec_PtrAlloc( 1000 );
// temporaries // temporaries
p->vCnf = Vec_IntAlloc( 100 ); p->vLits = Vec_IntAlloc( 100 );
p->vLits = Vec_IntAlloc( 100 ); p->vIsopMem = Vec_IntAlloc( 100 );
p->vIsopMem = Vec_IntAlloc( 100 );
Cnf_ReadMsops( &p->pSopSizes, &p->pSops ); Cnf_ReadMsops( &p->pSopSizes, &p->pSops );
// prepare
Gia_ManCleanValue( pGia );
return p; return p;
} }
void Ga2_ManReportMemory( Ga2_Man_t * p )
/**Function************************************************************* {
double memTot = 0;
Synopsis [] double memAig = 1.0 * p->pGia->nObjsAlloc * sizeof(Gia_Obj_t) + Vec_IntMemory(p->pGia->vMapping);
double memSat = sat_solver2_memory( p->pSat, 1 );
Description [] double memPro = sat_solver2_memory_proof( p->pSat );
double memMap = Vec_VecMemoryInt( (Vec_Vec_t *)p->vId2Lit );
SideEffects [] double memRef = Rnm_ManMemoryUsage( p->pRnm );
double memOth = sizeof(Ga2_Man_t);
SeeAlso [] memOth += Vec_VecMemoryInt( (Vec_Vec_t *)p->vCnfs );
memOth += Vec_IntMemory( p->vIds );
***********************************************************************/ memOth += Vec_IntMemory( p->vAbs );
memOth += Vec_IntMemory( p->vValues );
memOth += Vec_IntMemory( p->vLits );
memOth += Vec_IntMemory( p->vIsopMem );
memOth += 336450 + (sizeof(char) + sizeof(char*)) * 65536;
memTot = memAig + memSat + memPro + memMap + memRef + memOth;
ABC_PRMP( "Memory: AIG ", memAig, memTot );
ABC_PRMP( "Memory: SAT ", memSat, memTot );
ABC_PRMP( "Memory: Proof ", memPro, memTot );
ABC_PRMP( "Memory: Map ", memMap, memTot );
ABC_PRMP( "Memory: Refine", memRef, memTot );
ABC_PRMP( "Memory: Other ", memOth, memTot );
ABC_PRMP( "Memory: TOTAL ", memTot, memTot );
}
void Ga2_ManStop( Ga2_Man_t * p ) void Ga2_ManStop( Ga2_Man_t * p )
{ {
Vec_IntFreeP( &p->pGia->vMapping );
Gia_ManSetPhase( p->pGia );
// if ( p->pPars->fVerbose ) // if ( p->pPars->fVerbose )
Abc_Print( 1, "SAT solver: Var = %d Cla = %d Conf = %d Reduce = %d Cex = %d ObjsAdded = %d\n", Abc_Print( 1, "SAT solver: Var = %d Cla = %d Conf = %d Reduce = %d Cex = %d ObjsAdded = %d\n",
sat_solver2_nvars(p->pSat), sat_solver2_nclauses(p->pSat), sat_solver2_nconflicts(p->pSat), p->pSat->nDBreduces, p->nCexes, p->nObjAdded ); sat_solver2_nvars(p->pSat), sat_solver2_nclauses(p->pSat), sat_solver2_nconflicts(p->pSat), p->pSat->nDBreduces, p->nCexes, p->nObjAdded );
Vec_IntFree( p->vMapping ); if( p->pSat ) sat_solver2_delete( p->pSat );
Vec_VecFree( (Vec_Vec_t *)p->vDatas ); Vec_VecFree( (Vec_Vec_t *)p->vCnfs );
Vec_VecFree( (Vec_Vec_t *)p->vId2Lit );
Vec_IntFree( p->vIds );
Vec_IntFree( p->vAbs ); Vec_IntFree( p->vAbs );
Vec_IntFree( p->vValues ); Vec_IntFree( p->vValues );
Vec_VecFree( (Vec_Vec_t *)p->vId2Lit );
Vec_IntFree( p->vCnf );
Vec_IntFree( p->vLits ); Vec_IntFree( p->vLits );
Vec_IntFree( p->vIsopMem ); Vec_IntFree( p->vIsopMem );
Rnm_ManStop( p->pRnm, 1 ); Rnm_ManStop( p->pRnm, 1 );
sat_solver2_delete( p->pSat );
ABC_FREE( p->pSopSizes ); ABC_FREE( p->pSopSizes );
ABC_FREE( p->pSops[1] ); ABC_FREE( p->pSops[1] );
ABC_FREE( p->pSops ); ABC_FREE( p->pSops );
...@@ -415,10 +417,12 @@ void Ga2_ManStop( Ga2_Man_t * p ) ...@@ -415,10 +417,12 @@ void Ga2_ManStop( Ga2_Man_t * p )
/**Function************************************************************* /**Function*************************************************************
Synopsis [Computes and minimizes the truth table.] Synopsis [Computes a minimized truth table.]
Description [Array of input literals may contain 0 (const0), 1 (const1) Description [Input literals can be 0/1 (const 0/1), non-trivial literals
or 2 (literal). Upon exit, it contains the variables in the support.] (integers that are more than 1) and unassigned literals (large integers).
This procedure computes the truth table that essentially depends on input
variables ordered in the increasing order of their positive literals.]
SideEffects [] SideEffects []
...@@ -427,63 +431,65 @@ void Ga2_ManStop( Ga2_Man_t * p ) ...@@ -427,63 +431,65 @@ void Ga2_ManStop( Ga2_Man_t * p )
***********************************************************************/ ***********************************************************************/
static inline unsigned Ga2_ObjTruthDepends( unsigned t, int v ) static inline unsigned Ga2_ObjTruthDepends( unsigned t, int v )
{ {
static unsigned uInvTruth5[5] = { 0x55555555, 0x33333333, 0x0F0F0F0F, 0x00FF00FF, 0x0000FFFF };
assert( v >= 0 && v <= 4 ); assert( v >= 0 && v <= 4 );
if ( v == 0 ) return ((t ^ (t >> (1 << v))) & uInvTruth5[v]);
return ((t ^ (t >> 1)) & 0x55555555);
if ( v == 1 )
return ((t ^ (t >> 2)) & 0x33333333);
if ( v == 2 )
return ((t ^ (t >> 4)) & 0x0F0F0F0F);
if ( v == 3 )
return ((t ^ (t >> 8)) & 0x00FF00FF);
if ( v == 4 )
return ((t ^ (t >>16)) & 0x0000FFFF);
return -1;
} }
unsigned Ga2_ObjComputeTruthSpecial( Gia_Man_t * p, Gia_Obj_t * pRoot, Vec_Int_t * vLeaves, Vec_Int_t * vLits ) unsigned Ga2_ObjComputeTruthSpecial( Gia_Man_t * p, Gia_Obj_t * pRoot, Vec_Int_t * vLeaves, Vec_Int_t * vLits )
{ {
static unsigned uTruth5[5] = { 0xAAAAAAAA, 0xCCCCCCCC, 0xF0F0F0F0, 0xFF00FF00, 0xFFFF0000 }; static unsigned uTruth5[5] = { 0xAAAAAAAA, 0xCCCCCCCC, 0xF0F0F0F0, 0xFF00FF00, 0xFFFF0000 };
unsigned Res, Values[5];
Gia_Obj_t * pObj; Gia_Obj_t * pObj;
int i, k, Entry; int i, Entry;
unsigned Res;
// assign elementary truth tables // assign elementary truth tables
Gia_ManForEachObjVec( vLeaves, p, pObj, i ) Gia_ManForEachObjVec( vLeaves, p, pObj, i )
{ {
assert( pObj->fPhase );
Values[i] = pObj->Value;
Entry = Vec_IntEntry( vLits, i ); Entry = Vec_IntEntry( vLits, i );
assert( Entry >= 0 && Entry <= 2 ); assert( Entry >= 0 );
if ( Entry == 0 ) if ( Entry == 0 )
pObj->Value = 0; pObj->Value = 0;
else if ( Entry == 1 ) else if ( Entry == 1 )
pObj->Value = ~0; pObj->Value = ~0;
else // if ( Entry == 2 ) else // non-trivial literal
pObj->Value = uTruth5[i]; pObj->Value = uTruth5[i];
} }
// compute truth table
Res = Ga2_ObjComputeTruth_rec( p, pRoot, 1 ); Res = Ga2_ObjComputeTruth_rec( p, pRoot, 1 );
Vec_IntClear( vLits );
if ( Res != 0 && Res != ~0 ) if ( Res != 0 && Res != ~0 )
{ {
// check if truth table depends on them // find essential variables
// and create a new array of literals with essential-support variables int nUsed = 0, pUsed[5];
k = 0; for ( i = 0; i < Vec_IntSize(vLeaves); i++ )
if ( Ga2_ObjTruthDepends( Res, i ) )
pUsed[nUsed++] = i;
assert( nUsed > 0 );
// order the by literal value
Vec_IntSelectSortCost( pUsed, nUsed, vLits );
assert( Vec_IntEntry(vLits, pUsed[0]) <= Vec_IntEntry(vLits, pUsed[nUsed-1]) );
// assign elementary truth tables to the leaves
Gia_ManForEachObjVec( vLeaves, p, pObj, i ) Gia_ManForEachObjVec( vLeaves, p, pObj, i )
pObj->Value = 0;
for ( i = 0; i < nUsed; i++ )
{ {
if ( Ga2_ObjTruthDepends( Res, i ) ) Entry = Vec_IntEntry( vLits, pUsed[i] );
{ assert( Entry > 1 );
pObj->Value = uTruth5[k++]; pObj = Gia_ManObj( p, Vec_IntEntry(vLeaves, pUsed[i]) );
Vec_IntPush( vLits, i ); pObj->Value = Abc_LitIsCompl(Entry) ? ~uTruth5[i] : uTruth5[i];
} // remember this literal
pUsed[i] = Abc_LitRegular(Entry);
} }
// recompute the truth table // compute truth table
Res = Ga2_ObjComputeTruth_rec( p, pRoot, 1 ); Res = Ga2_ObjComputeTruth_rec( p, pRoot, 1 );
// verify that the truthe table depends on them // reload the literals
for ( i = 0; i < Vec_IntSize(vLeaves); i++ ) Vec_IntClear( vLits );
assert( (i < Vec_IntSize(vLits)) == (Ga2_ObjTruthDepends(Res, i) > 0) ); for ( i = 0; i < nUsed; i++ )
{
Vec_IntPush( vLits, pUsed[i] );
assert( Ga2_ObjTruthDepends(Res, i) );
}
} }
// return values else
Gia_ManForEachObjVec( vLeaves, p, pObj, i ) Vec_IntClear( vLits );
pObj->Value = Values[i];
return Res; return Res;
} }
...@@ -510,7 +516,6 @@ Vec_Int_t * Ga2_ManCnfCompute( unsigned uTruth, int nVars, Vec_Int_t * vCover ) ...@@ -510,7 +516,6 @@ Vec_Int_t * Ga2_ManCnfCompute( unsigned uTruth, int nVars, Vec_Int_t * vCover )
return Vec_IntDup( vCover ); return Vec_IntDup( vCover );
} }
/**Function************************************************************* /**Function*************************************************************
Synopsis [Derives CNF for one node.] Synopsis [Derives CNF for one node.]
...@@ -539,20 +544,18 @@ static inline void Ga2_ManCnfAddDynamic( Ga2_Man_t * p, int uTruth, int Lits[], ...@@ -539,20 +544,18 @@ static inline void Ga2_ManCnfAddDynamic( Ga2_Man_t * p, int uTruth, int Lits[],
Cube = p->pSops[uTruth][k]; Cube = p->pSops[uTruth][k];
for ( b = 3; b >= 0; b-- ) for ( b = 3; b >= 0; b-- )
{ {
if ( Cube % 3 == 0 ) // value 0 --> write positive literal if ( Cube % 3 == 0 ) // value 0 --> add positive literal
{ {
assert( Lits[b] > 1 ); assert( Lits[b] > 1 );
ClaLits[nClaLits++] = Lits[b]; ClaLits[nClaLits++] = Lits[b];
} }
else if ( Cube % 3 == 1 ) // value 1 --> write negative literal else if ( Cube % 3 == 1 ) // value 1 --> add negative literal
{ {
assert( Lits[b] > 1 ); assert( Lits[b] > 1 );
ClaLits[nClaLits++] = lit_neg(Lits[b]); ClaLits[nClaLits++] = lit_neg(Lits[b]);
} }
Cube = Cube / 3; Cube = Cube / 3;
} }
// if ( !sat_solver_addclause( p->pSat, ClaLits, ClaLits+nClaLits ) )
// assert( 0 );
sat_solver2_addclause( p->pSat, ClaLits, ClaLits+nClaLits, ProofId ); sat_solver2_addclause( p->pSat, ClaLits, ClaLits+nClaLits, ProofId );
} }
} }
...@@ -575,13 +578,13 @@ static inline void Ga2_ManCnfAddStatic( Ga2_Man_t * p, Vec_Int_t * vCnf0, Vec_In ...@@ -575,13 +578,13 @@ static inline void Ga2_ManCnfAddStatic( Ga2_Man_t * p, Vec_Int_t * vCnf0, Vec_In
for ( b = 0; b < 5; b++ ) for ( b = 0; b < 5; b++ )
{ {
Literal = 3 & (Cube >> (b << 1)); Literal = 3 & (Cube >> (b << 1));
if ( Literal == 1 ) // value 0 --> write positive literal if ( Literal == 1 ) // value 0 --> add positive literal
{ {
// pCube[b] = '0'; // pCube[b] = '0';
assert( Lits[b] > 1 ); assert( Lits[b] > 1 );
ClaLits[nClaLits++] = Lits[b]; ClaLits[nClaLits++] = Lits[b];
} }
else if ( Literal == 2 ) // value 1 --> write negative literal else if ( Literal == 2 ) // value 1 --> add negative literal
{ {
// pCube[b] = '1'; // pCube[b] = '1';
assert( Lits[b] > 1 ); assert( Lits[b] > 1 );
...@@ -590,8 +593,6 @@ static inline void Ga2_ManCnfAddStatic( Ga2_Man_t * p, Vec_Int_t * vCnf0, Vec_In ...@@ -590,8 +593,6 @@ static inline void Ga2_ManCnfAddStatic( Ga2_Man_t * p, Vec_Int_t * vCnf0, Vec_In
else if ( Literal != 0 ) else if ( Literal != 0 )
assert( 0 ); assert( 0 );
} }
// if ( !sat_solver_addclause( p->pSat, ClaLits, ClaLits+nClaLits ) )
// assert( 0 );
sat_solver2_addclause( p->pSat, ClaLits, ClaLits+nClaLits, ProofId ); sat_solver2_addclause( p->pSat, ClaLits, ClaLits+nClaLits, ProofId );
} }
} }
...@@ -614,25 +615,25 @@ void Ga2_ManSetupNode( Ga2_Man_t * p, Gia_Obj_t * pObj, int fAbs ) ...@@ -614,25 +615,25 @@ void Ga2_ManSetupNode( Ga2_Man_t * p, Gia_Obj_t * pObj, int fAbs )
unsigned uTruth; unsigned uTruth;
int nLeaves; int nLeaves;
assert( pObj->fPhase ); assert( pObj->fPhase );
assert( Vec_PtrSize(p->vDatas) == 2 * Vec_IntSize(p->vValues) ); assert( Vec_PtrSize(p->vCnfs) == 2 * Vec_IntSize(p->vValues) );
// assign value to the node // assign abstraction ID to the node
if ( pObj->Value == 0 ) if ( Ga2_ObjId(p,pObj) == 0 )
{ {
pObj->Value = Vec_IntSize(p->vValues); Ga2_ObjSetId( p, pObj, Vec_IntSize(p->vValues) );
Vec_IntPush( p->vValues, Gia_ObjId(p->pGia, pObj) ); Vec_IntPush( p->vValues, Gia_ObjId(p->pGia, pObj) );
Vec_PtrPush( p->vDatas, NULL ); Vec_PtrPush( p->vCnfs, NULL );
Vec_PtrPush( p->vDatas, NULL ); Vec_PtrPush( p->vCnfs, NULL );
} }
assert( Ga2_ObjCnf0(p, pObj) == NULL ); assert( Ga2_ObjCnf0(p, pObj) == NULL );
if ( !fAbs ) if ( !fAbs )
return; return;
// compute parameters // compute parameters
nLeaves = Ga2_ObjLeaveNum(p, pObj); nLeaves = Ga2_ObjLeaveNum(p->pGia, pObj);
uTruth = Ga2_ObjTruth( p, pObj ); uTruth = Ga2_ObjTruth( p->pGia, pObj );
// create CNF for pos/neg phases // create CNF for pos/neg phases
Vec_PtrWriteEntry( p->vDatas, 2 * pObj->Value, Ga2_ManCnfCompute(uTruth, nLeaves, p->vIsopMem) ); Vec_PtrWriteEntry( p->vCnfs, 2 * Ga2_ObjId(p,pObj), Ga2_ManCnfCompute(uTruth, nLeaves, p->vIsopMem) );
uTruth = (~uTruth) & Abc_InfoMask( (1 << nLeaves) ); uTruth = (~uTruth) & Abc_InfoMask( (1 << nLeaves) );
Vec_PtrWriteEntry( p->vDatas, 2 * pObj->Value + 1, Ga2_ManCnfCompute(uTruth, nLeaves, p->vIsopMem) ); Vec_PtrWriteEntry( p->vCnfs, 2 * Ga2_ObjId(p,pObj) + 1, Ga2_ManCnfCompute(uTruth, nLeaves, p->vIsopMem) );
} }
void Ga2_ManAddToAbs( Ga2_Man_t * p, Vec_Int_t * vToAdd ) void Ga2_ManAddToAbs( Ga2_Man_t * p, Vec_Int_t * vToAdd )
...@@ -649,8 +650,8 @@ void Ga2_ManAddToAbs( Ga2_Man_t * p, Vec_Int_t * vToAdd ) ...@@ -649,8 +650,8 @@ void Ga2_ManAddToAbs( Ga2_Man_t * p, Vec_Int_t * vToAdd )
// add PPI objects // add PPI objects
Gia_ManForEachObjVec( vToAdd, p->pGia, pObj, i ) Gia_ManForEachObjVec( vToAdd, p->pGia, pObj, i )
{ {
vLeaves = Ga2_ObjLeaves( p, pObj ); vLeaves = Ga2_ObjLeaves( p->pGia, pObj );
Gia_ManForEachObjVec( vLeaves, p->pGia, pFanin, k, ) Gia_ManForEachObjVec( vLeaves, p->pGia, pFanin, k )
Ga2_ManSetupNode( p, pObj, 0 ); Ga2_ManSetupNode( p, pObj, 0 );
} }
// clean mapping in the timeframes // clean mapping in the timeframes
...@@ -661,9 +662,9 @@ void Ga2_ManAddToAbs( Ga2_Man_t * p, Vec_Int_t * vToAdd ) ...@@ -661,9 +662,9 @@ void Ga2_ManAddToAbs( Ga2_Man_t * p, Vec_Int_t * vToAdd )
Gia_ManForEachObjVec( vToAdd, p->pGia, pObj, i ) Gia_ManForEachObjVec( vToAdd, p->pGia, pObj, i )
{ {
iLitOut = Ga2_ObjFindOrAddLit( p, pObj, f ); iLitOut = Ga2_ObjFindOrAddLit( p, pObj, f );
vLeaves = Ga2_ObjLeaves( p, pObj ); vLeaves = Ga2_ObjLeaves( p->pGia, pObj );
Vec_IntClear( p->vLits ); Vec_IntClear( p->vLits );
Gia_ManForEachObjVec( vLeaves, p->pGia, pFanin, k, ) Gia_ManForEachObjVec( vLeaves, p->pGia, pFanin, k )
Vec_IntPush( p->vLits, Ga2_ObjFindOrAddLit( p, pFanin, f ) ); Vec_IntPush( p->vLits, Ga2_ObjFindOrAddLit( p, pFanin, f ) );
Ga2_ManCnfAddStatic( p, Ga2_ObjCnf0(p, pObj), Ga2_ObjCnf1(p, pObj), Vec_IntArray(p->vLits), iLitOut, p->nProofIds + i ); Ga2_ManCnfAddStatic( p, Ga2_ObjCnf0(p, pObj), Ga2_ObjCnf1(p, pObj), Vec_IntArray(p->vLits), iLitOut, p->nProofIds + i );
} }
...@@ -679,9 +680,9 @@ void Ga2_ManAddAbsClauses( Ga2_Man_t * p, int f ) ...@@ -679,9 +680,9 @@ void Ga2_ManAddAbsClauses( Ga2_Man_t * p, int f )
if ( i < p->LimAbs ) if ( i < p->LimAbs )
continue; continue;
iLitOut = Ga2_ObjFindOrAddLit( p, pObj, f ); iLitOut = Ga2_ObjFindOrAddLit( p, pObj, f );
vLeaves = Ga2_ObjLeaves( p, pObj ); vLeaves = Ga2_ObjLeaves( p->pGia, pObj );
Vec_IntClear( p->vLits ); Vec_IntClear( p->vLits );
Gia_ManForEachObjVec( vLeaves, p->pGia, pFanin, k, ) Gia_ManForEachObjVec( vLeaves, p->pGia, pFanin, k )
Vec_IntPush( p->vLits, Ga2_ObjFindOrAddLit( p, pFanin, f ) ); Vec_IntPush( p->vLits, Ga2_ObjFindOrAddLit( p, pFanin, f ) );
Ga2_ManCnfAddStatic( p, Ga2_ObjCnf0(p, pObj), Ga2_ObjCnf1(p, pObj), Vec_IntArray(p->vLits), iLitOut, i - p->LimAbs ); Ga2_ManCnfAddStatic( p, Ga2_ObjCnf0(p, pObj), Ga2_ObjCnf1(p, pObj), Vec_IntArray(p->vLits), iLitOut, i - p->LimAbs );
} }
...@@ -703,25 +704,25 @@ void Ga2_ManShrinkAbs( Ga2_Man_t * p, int nAbs, int nValues ) ...@@ -703,25 +704,25 @@ void Ga2_ManShrinkAbs( Ga2_Man_t * p, int nAbs, int nValues )
continue; continue;
Vec_IntFree( Ga2_ObjCnf0(p, pObj) ); Vec_IntFree( Ga2_ObjCnf0(p, pObj) );
Vec_IntFree( Ga2_ObjCnf1(p, pObj) ); Vec_IntFree( Ga2_ObjCnf1(p, pObj) );
Vec_PtrWriteEntry( p->vDatas, 2 * pObj->Value, NULL ); Vec_PtrWriteEntry( p->vCnfs, 2 * Ga2_ObjId(p,pObj), NULL );
Vec_PtrWriteEntry( p->vDatas, 2 * pObj->Value + 1, NULL ); Vec_PtrWriteEntry( p->vCnfs, 2 * Ga2_ObjId(p,pObj) + 1, NULL );
} }
Vec_IntShrink( p->vAbs, nAbs ); Vec_IntShrink( p->vAbs, nAbs );
// shrink values // shrink values
Gia_ManForEachObjVec( p->vValues, p->pGia, pObj, i ) Gia_ManForEachObjVec( p->vValues, p->pGia, pObj, i )
{ {
assert( pObj->Value ); assert( Ga2_ObjId(p,pObj) );
if ( i < nValues ) if ( i < nValues )
continue; continue;
pObj->Value = 0; Ga2_ObjSetId( p, pObj, 0 );
} }
Vec_IntShrink( p->vValues, nValues ); Vec_IntShrink( p->vValues, nValues );
Vec_PtrShrink( p->vCnfs, 2 * nValues );
// clean mapping into timeframes // clean mapping into timeframes
Vec_PtrForEachEntry( Vec_Int_t *, p->vId2Lit, vMap, i ) Vec_PtrForEachEntry( Vec_Int_t *, p->vId2Lit, vMap, i )
Vec_IntShrink( vMap, nValues ); Vec_IntShrink( vMap, nValues );
} }
/**Function************************************************************* /**Function*************************************************************
Synopsis [] Synopsis []
...@@ -742,6 +743,7 @@ void Ga2_ManAbsTranslate_rec( Gia_Man_t * p, Gia_Obj_t * pObj, Vec_Int_t * vClas ...@@ -742,6 +743,7 @@ void Ga2_ManAbsTranslate_rec( Gia_Man_t * p, Gia_Obj_t * pObj, Vec_Int_t * vClas
Ga2_ManAbsTranslate_rec( p, Gia_ObjFanin1(pObj), vClasses, 0 ); Ga2_ManAbsTranslate_rec( p, Gia_ObjFanin1(pObj), vClasses, 0 );
Vec_IntWriteEntry( vClasses, Gia_ObjId(p, pObj), 1 ); Vec_IntWriteEntry( vClasses, Gia_ObjId(p, pObj), 1 );
} }
Vec_Int_t * Ga2_ManAbsTranslate( Ga2_Man_t * p ) Vec_Int_t * Ga2_ManAbsTranslate( Ga2_Man_t * p )
{ {
Vec_Int_t * vGateClasses; Vec_Int_t * vGateClasses;
...@@ -752,34 +754,26 @@ Vec_Int_t * Ga2_ManAbsTranslate( Ga2_Man_t * p ) ...@@ -752,34 +754,26 @@ Vec_Int_t * Ga2_ManAbsTranslate( Ga2_Man_t * p )
Ga2_ManAbsTranslate_rec( p->pGia, pObj, vGateClasses, 1 ); Ga2_ManAbsTranslate_rec( p->pGia, pObj, vGateClasses, 1 );
return vGateClasses; return vGateClasses;
} }
Vec_Int_t * Ga2_ManAbsDerive( Gia_Man_t * p ) Vec_Int_t * Ga2_ManAbsDerive( Gia_Man_t * p )
{ {
Vec_Int_t * vToAdd; Vec_Int_t * vToAdd;
Gia_Obj_t * pObj; Gia_Obj_t * pObj;
int i; int i;
vToAdd = Vec_IntAlloc( 1000 ); vToAdd = Vec_IntAlloc( 1000 );
Gia_ManForEachObj( p, pObj, i ) Gia_ManForEachRo( p, pObj, i )
if ( pObj->fPhase && Vec_IntEntry(p->vGateClasses, i) )
Vec_IntPush( vToAdd, i );
Gia_ManForEachAnd( p, pObj, i )
if ( pObj->fPhase && Vec_IntEntry(p->vGateClasses, i) ) if ( pObj->fPhase && Vec_IntEntry(p->vGateClasses, i) )
Vec_IntPush( vToAdd, i ); Vec_IntPush( vToAdd, i );
return vToAdd; return vToAdd;
} }
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void Ga2_ManRestart( Ga2_Man_t * p ) void Ga2_ManRestart( Ga2_Man_t * p )
{ {
Vec_Int_t * vToAdd; Vec_Int_t * vToAdd;
assert( p->pGia != NULL ); assert( p->pGia != NULL && p->pGia->vGateClasses != NULL );
assert( p->pGia->vGateClasses != NULL );
assert( Gia_ManPi(p->pGia, 0)->fPhase ); // marks are set assert( Gia_ManPi(p->pGia, 0)->fPhase ); // marks are set
// clear mappings from objects // clear mappings from objects
Ga2_ManShrinkAbs( p, 0, 1 ); Ga2_ManShrinkAbs( p, 0, 1 );
...@@ -814,7 +808,6 @@ int Ga2_ManUnroll_rec( Ga2_Man_t * p, Gia_Obj_t * pObj, int f ) ...@@ -814,7 +808,6 @@ int Ga2_ManUnroll_rec( Ga2_Man_t * p, Gia_Obj_t * pObj, int f )
{ {
int fSimple = 1; int fSimple = 1;
unsigned uTruth; unsigned uTruth;
Vec_Int_t * vLeaves;
Gia_Obj_t * pLeaf; Gia_Obj_t * pLeaf;
int nLeaves, * pLeaves; int nLeaves, * pLeaves;
int i, Lit, pLits[5]; int i, Lit, pLits[5];
...@@ -826,12 +819,13 @@ int Ga2_ManUnroll_rec( Ga2_Man_t * p, Gia_Obj_t * pObj, int f ) ...@@ -826,12 +819,13 @@ int Ga2_ManUnroll_rec( Ga2_Man_t * p, Gia_Obj_t * pObj, int f )
{ {
Lit = Ga2_ObjFindOrAddLit( p, pObj, f ); Lit = Ga2_ObjFindOrAddLit( p, pObj, f );
Lit = Abc_LitNot(Lit); Lit = Abc_LitNot(Lit);
sat_solver2_addclause( p->pSat, &Lit, &Lit + 1, -1 );
assert( Lit > 1 ); assert( Lit > 1 );
sat_solver2_addclause( p->pSat, &Lit, &Lit + 1, -1 );
return Lit; return Lit;
} }
return 0; return 0;
} }
assert( pObj->fPhase );
Lit = Ga2_ObjFindLit( p, pObj, f ); Lit = Ga2_ObjFindLit( p, pObj, f );
if ( Lit >= 0 ) if ( Lit >= 0 )
return Lit; return Lit;
...@@ -844,12 +838,16 @@ int Ga2_ManUnroll_rec( Ga2_Man_t * p, Gia_Obj_t * pObj, int f ) ...@@ -844,12 +838,16 @@ int Ga2_ManUnroll_rec( Ga2_Man_t * p, Gia_Obj_t * pObj, int f )
Ga2_ObjAddLit( p, pObj, f, Lit ); Ga2_ObjAddLit( p, pObj, f, Lit );
return Lit; return Lit;
} }
nLeaves = Ga2_ObjLeaveNum( p->pGia, pObj );
pLeaves = Ga2_ObjLeavePtr( p->pGia, pObj );
if ( fSimple ) if ( fSimple )
{ {
// collect fanin literals // collect fanin literals
vLeaves = Ga2_ObjLeaves( p, pObj ); for ( i = 0; i < nLeaves; i++ )
Gia_ManForEachObjVec( vLeaves, p->pGia, pLeaf, i ) {
pLeaf = Gia_ManObj(p->pGia, pLeaves[i]);
pLits[i] = Ga2_ManUnroll_rec( p, pLeaf, f ); pLits[i] = Ga2_ManUnroll_rec( p, pLeaf, f );
}
// create fanout literal // create fanout literal
Lit = Ga2_ObjFindOrAddLit( p, pObj, f ); Lit = Ga2_ObjFindOrAddLit( p, pObj, f );
// create clauses // create clauses
...@@ -857,168 +855,44 @@ int Ga2_ManUnroll_rec( Ga2_Man_t * p, Gia_Obj_t * pObj, int f ) ...@@ -857,168 +855,44 @@ int Ga2_ManUnroll_rec( Ga2_Man_t * p, Gia_Obj_t * pObj, int f )
return Lit; return Lit;
} }
// collect fanin literals // collect fanin literals
nLeaves = Ga2_ObjLeaveNum( p, pObj );
pLeaves = Ga2_ObjLeavePtr( p, pObj );
for ( i = 0; i < nLeaves; i++ ) for ( i = 0; i < nLeaves; i++ )
{ {
pLeaf = Gia_ManObj( p->pGia, pLeaves[i] ); pLeaf = Gia_ManObj( p->pGia, pLeaves[i] );
if ( Ga2_ObjIsAbs(p, pLeaf) ) // belongs to original abstraction if ( Ga2_ObjIsAbs(p, pLeaf) ) // belongs to original abstraction
pLits[i] = Ga2_ManUnroll_rec( p, pLeaf, f ); pLits[i] = Ga2_ManUnroll_rec( p, pLeaf, f );
else if ( Ga2_ObjIsPPI(p, pLeaf) ) // belongs to original PPIs else if ( Ga2_ObjIsPpi(p, pLeaf) ) // belongs to original PPIs
pLits[i] = GA2_BIG_NUM + i; pLits[i] = GA2_BIG_NUM + i;
else else assert( 0 );
assert( 0 );
} }
// collect literals // collect literals
Vec_IntClear( p->vLits ); Vec_IntClear( p->vLits );
for ( i = 0; i < nLeaves; i++ ) for ( i = 0; i < nLeaves; i++ )
Vec_IntPush( p->vLits, pLits[i] ); Vec_IntPush( p->vLits, pLits[i] );
// minimize truth table // minimize truth table
vLeaves = Ga2_ObjLeaves( p, pObj ); uTruth = Ga2_ObjComputeTruthSpecial( p->pGia, pObj, Ga2_ObjLeaves(p->pGia, pObj), p->vLits );
uTruth = Ga2_ObjComputeTruthSpecial( p->pGia, pObj, vLeaves, p->vLits ); if ( uTruth == 0 || uTruth == ~0 ) // const 0 / 1
if ( uTruth == 0 || uTruth == ~0 ) Lit = (uTruth > 0);
Ga2_ObjAddLit( p, pObj, f, uTruth == 0 ? 3 : 2 ); // const 0 / 1
else if ( uTruth == 0xAAAAAAAA || uTruth == 0x55555555 ) // buffer / inverter else if ( uTruth == 0xAAAAAAAA || uTruth == 0x55555555 ) // buffer / inverter
{ {
Lit = Vec_IntEntry( p->vLits, 0 ); Lit = Vec_IntEntry( p->vLits, 0 );
pLeaf = Gia_ManObj( p->pGia, Vec_IntEntry(vLeaves, Lit) ); if ( Lit >= GA2_BIG_NUM )
Lit = Ga2_ObjFindOrAddLit( p, pLeaf, f );
Ga2_ObjAddLit( p, pObj, f, Abc_LitNotCond(Lit, uTruth == 0x55555555) );
}
else
{
// replace numbers of literals by actual literals
Vec_IntForEachEntry( p->vLits, Lit, i )
{ {
pLeaf = Gia_ManObj( p->pGia, Vec_IntEntry(vLeaves, Lit) ); pLeaf = Gia_ManObj( p->pGia, pLeaves[Lit-GA2_BIG_NUM] );
Lit = Ga2_ObjFindOrAddLit(p, pLeaf, f);
Vec_IntWriteEntry( p->vLits, i, Lit );
}
// add CNF
Lit = Ga2_ObjFindOrAddLit(p, pObj, f);
Ga2_ManCnfAddDynamic( p, uTruth, Vec_IntArray(p->vLits), Lit, 0 );
Ga2_ObjAddLit( p, pObj, f, Lit );
}
return Lit;
}
/**Function*************************************************************
Synopsis [Unrolls one timeframe.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
/*
void Ga2_ManUnroll2( Ga2_Man_t * p, int f )
{
Gia_Obj_t * pObj, * pObjRi, * pLeaf;
Vec_Int_t * vLeaves;
unsigned uTruth;
int i, k, Lit, iLitOut, fFullTable;
// construct CNF for internal nodes
Gia_ManForEachObjVec( p->vAbs, p->pGia, pObj, i )
{
// assign RO literal values (no need to add clauses)
assert( pObj->fPhase && pObj->Value );
if ( Gia_ObjIsConst0(pObj) )
{
Ga2_ObjAddLit( p, pObj, f, 3 ); // const 0
continue;
}
if ( Gia_ObjIsRo(p->pGia, pObj) )
{
pObjRi = Gia_ObjRoToRi(p->pGia, pObj);
Lit = f ? Ga2_ObjFindOrAddLit( p, pObjRi, f-1 ) : 3; // const 0
Ga2_ObjAddLit( p, pObj, f, Lit );
continue;
}
assert( Gia_ObjIsAnd(pObj) );
assert( pObj->Value > 0 );
vLeaves = Ga2_ObjLeaves(p, pObj);
// for nodes recently added to abstraction, add CNF without const propagation
fFullTable = 1;
if ( i < p->nAbs )
{
Gia_ManForEachObjVec( vLeaves, p->pGia, pLeaf, k )
{
Lit = Ga2_ObjFindLit( p, pLeaf, f );
if ( Lit == 2 || Lit == 3 )
{
fFullTable = 0;
break;
}
}
}
if ( fFullTable )
{
Vec_IntClear( p->vLits );
Gia_ManForEachObjVec( vLeaves, p->pGia, pLeaf, k )
Vec_IntWriteEntry( p->vLits, k, Ga2_ObjFindOrAddLit(p, pLeaf, f) );
iLitOut = Ga2_ObjFindOrAddLit(p, pObj, f);
Ga2_ManCnfAddStatic( p, &p->pvCnfs0[pObj->Value], &p->pvCnfs1[pObj->Value],
Vec_IntArray(p->vLits), iLitOut, i < p->nAbs ? 0 : Gia_ObjId(p->pGia, pObj) );
continue;
}
assert( i < p->nAbs );
// collect literal types
Vec_IntClear( p->vLits );
Gia_ManForEachObjVec( vLeaves, p->pGia, pLeaf, k )
{
Lit = Ga2_ObjFindLit( p, pLeaf, f );
if ( Lit == 3 ) // const 0
Vec_IntPush( p->vLits, 0 );
else if ( Lit == 2 ) // const 1
Vec_IntPush( p->vLits, 1 );
else
Vec_IntPush( p->vLits, 2 );
}
uTruth = Ga2_ObjComputeTruthSpecial( p->pGia, pObj, vLeaves, p->vLits );
if ( uTruth == 0 || uTruth == ~0 )
Ga2_ObjAddLit( p, pObj, f, uTruth == 0 ? 3 : 2 ); // const 0 / 1
else if ( uTruth == 0xAAAAAAAA || uTruth == 0x55555555 ) // buffer / inverter
{
Lit = Vec_IntEntry( p->vLits, 0 );
pLeaf = Gia_ManObj( p->pGia, Vec_IntEntry(vLeaves, Lit) );
Lit = Ga2_ObjFindOrAddLit( p, pLeaf, f ); Lit = Ga2_ObjFindOrAddLit( p, pLeaf, f );
Ga2_ObjAddLit( p, pObj, f, Abc_LitNotCond(Lit, uTruth == 0x55555555) );
}
else
{
// replace numbers of literals by actual literals
Vec_IntForEachEntry( p->vLits, Lit, i )
{
pLeaf = Gia_ManObj( p->pGia, Vec_IntEntry(vLeaves, Lit) );
Lit = Ga2_ObjFindOrAddLit(p, pLeaf, f);
Vec_IntWriteEntry( p->vLits, i, Lit );
}
// add CNF
iLitOut = Ga2_ObjFindOrAddLit(p, pObj, f);
Ga2_ManCnfAddDynamic( p, uTruth, Vec_IntArray(p->vLits), iLitOut, 0 );
} }
Lit = Abc_LitNotCond( Lit, uTruth == 0x55555555 );
} }
// propagate literals to the PO and flop outputs else
pObjRi = Gia_ManPo( p->pGia, 0 );
Lit = Ga2_ObjFindLit( p, Gia_ObjFanin0(pObjRi), f );
assert( Lit > 1 );
Lit = Abc_LitNotCond( Lit, Gia_ObjFaninC0(pObjRi) );
Ga2_ObjAddLit( p, pObj, f, Lit );
Gia_ManForEachObjVec( p->vAbs, p->pGia, pObj, i )
{ {
if ( !Gia_ObjIsRo(p->pGia, pObj) ) // perform structural hashing here!!!
continue;
pObjRi = Gia_ObjRoToRi(p->pGia, pObj); // add new node
Lit = Ga2_ObjFindLit( p, Gia_ObjFanin0(pObjRi), f ); Lit = Ga2_ObjFindOrAddLit(p, pObj, f);
assert( Lit > 1 ); Ga2_ManCnfAddDynamic( p, uTruth, Vec_IntArray(p->vLits), Lit, -1 );
Lit = Abc_LitNotCond( Lit, Gia_ObjFaninC0(pObjRi) );
Ga2_ObjAddLit( p, pObjRi, f, Lit );
} }
Ga2_ObjAddLit( p, pObj, f, Lit );
return Lit;
} }
*/
/**Function************************************************************* /**Function*************************************************************
...@@ -1041,7 +915,6 @@ int Vec_IntCheckUnique( Vec_Int_t * p ) ...@@ -1041,7 +915,6 @@ int Vec_IntCheckUnique( Vec_Int_t * p )
return RetValue; return RetValue;
} }
/**Function************************************************************* /**Function*************************************************************
Synopsis [] Synopsis []
...@@ -1072,7 +945,7 @@ void Ga2_GlaPrepareCexAndMap( Ga2_Man_t * p, Abc_Cex_t ** ppCex, Vec_Int_t ** pv ...@@ -1072,7 +945,7 @@ void Ga2_GlaPrepareCexAndMap( Ga2_Man_t * p, Abc_Cex_t ** ppCex, Vec_Int_t ** pv
{ {
if ( Ga2_ObjIsAbs(p, pObj) ) if ( Ga2_ObjIsAbs(p, pObj) )
continue; continue;
assert( Ga2_ObjIsPPI(p, pObj) ); assert( Ga2_ObjIsPpi(p, pObj) );
assert( Gia_ObjIsAnd(pObj) || Gia_ObjIsCi(pObj) ); assert( Gia_ObjIsAnd(pObj) || Gia_ObjIsCi(pObj) );
Vec_IntPush( vMap, Gia_ObjId(p->pGia, pObj) ); Vec_IntPush( vMap, Gia_ObjId(p->pGia, pObj) );
} }
...@@ -1125,7 +998,7 @@ Vec_Int_t * Ga2_ManRefine( Ga2_Man_t * p ) ...@@ -1125,7 +998,7 @@ Vec_Int_t * Ga2_ManRefine( Ga2_Man_t * p )
Vec_IntFree( vMap ); Vec_IntFree( vMap );
// these objects should be PPIs that are not abstracted yet // these objects should be PPIs that are not abstracted yet
Gia_ManForEachObjVec( vVec, p->pGia, pObj, i ) Gia_ManForEachObjVec( vVec, p->pGia, pObj, i )
assert( Ga2_ObjIsPPI(p, pObj) && !Ga2_ObjIsAbs(p, pObj) ); assert( Ga2_ObjIsPpi(p, pObj) && !Ga2_ObjIsAbs(p, pObj) );
p->nObjAdded += Vec_IntSize(vVec); p->nObjAdded += Vec_IntSize(vVec);
return vVec; return vVec;
} }
...@@ -1146,7 +1019,8 @@ int Ga2_ManPerform( Gia_Man_t * pAig, Gia_ParVta_t * pPars ) ...@@ -1146,7 +1019,8 @@ int Ga2_ManPerform( Gia_Man_t * pAig, Gia_ParVta_t * pPars )
Ga2_Man_t * p; Ga2_Man_t * p;
Vec_Int_t * vCore, * vPPis; Vec_Int_t * vCore, * vPPis;
clock_t clk = clock(); clock_t clk = clock();
int i, c, f, Lit, nAbs, nValues, Status, RetValue = -1;; int nAbs, nValues, Status, RetValue = -1;
int i, c, f, Lit;
// start the manager // start the manager
p = Ga2_ManStart( pAig, pPars ); p = Ga2_ManStart( pAig, pPars );
// check trivial case // check trivial case
...@@ -1203,10 +1077,14 @@ int Ga2_ManPerform( Gia_Man_t * pAig, Gia_ParVta_t * pPars ) ...@@ -1203,10 +1077,14 @@ int Ga2_ManPerform( Gia_Man_t * pAig, Gia_ParVta_t * pPars )
for ( c = 0; ; c++ ) for ( c = 0; ; c++ )
{ {
// perform SAT solving // perform SAT solving
clk = clock();
Status = sat_solver2_solve( p->pSat, &Lit, &Lit+1, (ABC_INT64_T)pPars->nConfLimit, (ABC_INT64_T)0, (ABC_INT64_T)0, (ABC_INT64_T)0 ); Status = sat_solver2_solve( p->pSat, &Lit, &Lit+1, (ABC_INT64_T)pPars->nConfLimit, (ABC_INT64_T)0, (ABC_INT64_T)0, (ABC_INT64_T)0 );
if ( Status == l_True ) // perform refinement if ( Status == l_True ) // perform refinement
{ {
p->timeSat += clock() - clk;
clk = clock();
vPPis = Ga2_ManRefine( p ); vPPis = Ga2_ManRefine( p );
p->timeCex += clock() - clk;
if ( vPPis == NULL ) if ( vPPis == NULL )
goto finish; goto finish;
Ga2_ManAddToAbs( p, vPPis ); Ga2_ManAddToAbs( p, vPPis );
...@@ -1216,6 +1094,7 @@ int Ga2_ManPerform( Gia_Man_t * pAig, Gia_ParVta_t * pPars ) ...@@ -1216,6 +1094,7 @@ int Ga2_ManPerform( Gia_Man_t * pAig, Gia_ParVta_t * pPars )
printf( "Vector has %d duplicated entries.\n", Vec_IntCheckUnique(p->vAbs) ); printf( "Vector has %d duplicated entries.\n", Vec_IntCheckUnique(p->vAbs) );
continue; continue;
} }
p->timeUnsat += clock() - clk;
if ( p->pSat->nRuntimeLimit && clock() > p->pSat->nRuntimeLimit ) // timeout if ( p->pSat->nRuntimeLimit && clock() > p->pSat->nRuntimeLimit ) // timeout
goto finish; goto finish;
if ( Status == l_Undef ) // ran out of resources if ( Status == l_Undef ) // ran out of resources
...@@ -1292,7 +1171,7 @@ finish: ...@@ -1292,7 +1171,7 @@ finish:
ABC_PRTP( "Runtime: Refinement ", p->timeCex, clock() - clk ); ABC_PRTP( "Runtime: Refinement ", p->timeCex, clock() - clk );
ABC_PRTP( "Runtime: Other ", p->timeOther, clock() - clk ); ABC_PRTP( "Runtime: Other ", p->timeOther, clock() - clk );
ABC_PRTP( "Runtime: TOTAL ", clock() - clk, clock() - clk ); ABC_PRTP( "Runtime: TOTAL ", clock() - clk, clock() - clk );
// Ga2_ManReportMemory( p ); Ga2_ManReportMemory( p );
} }
Ga2_ManStop( p ); Ga2_ManStop( p );
fflush( stdout ); fflush( stdout );
......
...@@ -90,6 +90,7 @@ void Gia_ManStop( Gia_Man_t * p ) ...@@ -90,6 +90,7 @@ void Gia_ManStop( Gia_Man_t * p )
Vec_IntFreeP( &p->vTtNodes ); Vec_IntFreeP( &p->vTtNodes );
Vec_WrdFreeP( &p->vTtMemory ); Vec_WrdFreeP( &p->vTtMemory );
Vec_PtrFreeP( &p->vTtInputs ); Vec_PtrFreeP( &p->vTtInputs );
Vec_IntFreeP( &p->vMapping );
Vec_IntFree( p->vCis ); Vec_IntFree( p->vCis );
Vec_IntFree( p->vCos ); Vec_IntFree( p->vCos );
ABC_FREE( p->pTravIds ); ABC_FREE( p->pTravIds );
......
...@@ -28109,10 +28109,10 @@ usage: ...@@ -28109,10 +28109,10 @@ usage:
int Abc_CommandAbc9Gla( Abc_Frame_t * pAbc, int argc, char ** argv ) int Abc_CommandAbc9Gla( Abc_Frame_t * pAbc, int argc, char ** argv )
{ {
Gia_ParVta_t Pars, * pPars = &Pars; Gia_ParVta_t Pars, * pPars = &Pars;
int c, fStartVta = 0; int c, fStartVta = 0, fNewAlgo = 0;
Gia_VtaSetDefaultParams( pPars ); Gia_VtaSetDefaultParams( pPars );
Extra_UtilGetoptReset(); Extra_UtilGetoptReset();
while ( ( c = Extra_UtilGetopt( argc, argv, "FSPCLDETRAtrfkadvh" ) ) != EOF ) while ( ( c = Extra_UtilGetopt( argc, argv, "FSPCLDETRAtrfkadnvh" ) ) != EOF )
{ {
switch ( c ) switch ( c )
{ {
...@@ -28242,6 +28242,9 @@ int Abc_CommandAbc9Gla( Abc_Frame_t * pAbc, int argc, char ** argv ) ...@@ -28242,6 +28242,9 @@ int Abc_CommandAbc9Gla( Abc_Frame_t * pAbc, int argc, char ** argv )
case 'd': case 'd':
pPars->fDumpVabs ^= 1; pPars->fDumpVabs ^= 1;
break; break;
case 'n':
fNewAlgo ^= 1;
break;
case 'v': case 'v':
pPars->fVerbose ^= 1; pPars->fVerbose ^= 1;
break; break;
...@@ -28278,13 +28281,16 @@ int Abc_CommandAbc9Gla( Abc_Frame_t * pAbc, int argc, char ** argv ) ...@@ -28278,13 +28281,16 @@ int Abc_CommandAbc9Gla( Abc_Frame_t * pAbc, int argc, char ** argv )
Abc_Print( 1, "The starting frame is larger than the max number of frames.\n" ); Abc_Print( 1, "The starting frame is larger than the max number of frames.\n" );
return 0; return 0;
} }
pAbc->Status = Gia_GlaPerform( pAbc->pGia, pPars, fStartVta ); if ( fNewAlgo )
pAbc->Status = Ga2_ManPerform( pAbc->pGia, pPars );
else
pAbc->Status = Gia_GlaPerform( pAbc->pGia, pPars, fStartVta );
pAbc->nFrames = pPars->iFrame; pAbc->nFrames = pPars->iFrame;
Abc_FrameReplaceCex( pAbc, &pAbc->pGia->pCexSeq ); Abc_FrameReplaceCex( pAbc, &pAbc->pGia->pCexSeq );
return 0; return 0;
usage: usage:
Abc_Print( -2, "usage: &gla [-FSCLDETR num] [-A file] [-fkadvh]\n" ); Abc_Print( -2, "usage: &gla [-FSCLDETR num] [-A file] [-fkadnvh]\n" );
Abc_Print( -2, "\t fixed-time-frame gate-level proof- and cex-based abstraction\n" ); Abc_Print( -2, "\t fixed-time-frame gate-level proof- and cex-based abstraction\n" );
Abc_Print( -2, "\t-F num : the max number of timeframes to unroll [default = %d]\n", pPars->nFramesMax ); Abc_Print( -2, "\t-F num : the max number of timeframes to unroll [default = %d]\n", pPars->nFramesMax );
Abc_Print( -2, "\t-S num : the starting time frame (0=unused) [default = %d]\n", pPars->nFramesStart ); Abc_Print( -2, "\t-S num : the starting time frame (0=unused) [default = %d]\n", pPars->nFramesStart );
...@@ -28299,6 +28305,7 @@ usage: ...@@ -28299,6 +28305,7 @@ usage:
Abc_Print( -2, "\t-k : toggle using VTA to kick start GLA for starting frames [default = %s]\n", fStartVta? "yes": "no" ); Abc_Print( -2, "\t-k : toggle using VTA to kick start GLA for starting frames [default = %s]\n", fStartVta? "yes": "no" );
Abc_Print( -2, "\t-a : toggle refinement by adding one layers of gates [default = %s]\n", pPars->fAddLayer? "yes": "no" ); Abc_Print( -2, "\t-a : toggle refinement by adding one layers of gates [default = %s]\n", pPars->fAddLayer? "yes": "no" );
Abc_Print( -2, "\t-d : toggle dumping abstracted model into a file [default = %s]\n", pPars->fDumpVabs? "yes": "no" ); Abc_Print( -2, "\t-d : toggle dumping abstracted model into a file [default = %s]\n", pPars->fDumpVabs? "yes": "no" );
Abc_Print( -2, "\t-n : toggle using new algorithms [default = %s]\n", fNewAlgo? "yes": "no" );
Abc_Print( -2, "\t-v : toggle printing verbose information [default = %s]\n", pPars->fVerbose? "yes": "no" ); Abc_Print( -2, "\t-v : toggle printing verbose information [default = %s]\n", pPars->fVerbose? "yes": "no" );
Abc_Print( -2, "\t-h : print the command usage\n"); Abc_Print( -2, "\t-h : print the command usage\n");
return 1; return 1;
...@@ -29677,7 +29684,8 @@ int Abc_CommandAbc9Test( Abc_Frame_t * pAbc, int argc, char ** argv ) ...@@ -29677,7 +29684,8 @@ int Abc_CommandAbc9Test( Abc_Frame_t * pAbc, int argc, char ** argv )
// extern Gia_Man_t * Gia_VtaTest( Gia_Man_t * p ); // extern Gia_Man_t * Gia_VtaTest( Gia_Man_t * p );
// extern int Gia_ManSuppSizeTest( Gia_Man_t * p ); // extern int Gia_ManSuppSizeTest( Gia_Man_t * p );
// extern void Gia_VtaTest( Gia_Man_t * p, int nFramesStart, int nFramesMax, int nConfMax, int nTimeMax, int fVerbose ); // extern void Gia_VtaTest( Gia_Man_t * p, int nFramesStart, int nFramesMax, int nConfMax, int nTimeMax, int fVerbose );
extern void Gia_IsoTest( Gia_Man_t * p, int fVerbose ); // extern void Gia_IsoTest( Gia_Man_t * p, int fVerbose );
extern void Ga2_ManComputeTest( Gia_Man_t * p );
Extra_UtilGetoptReset(); Extra_UtilGetoptReset();
while ( ( c = Extra_UtilGetopt( argc, argv, "svh" ) ) != EOF ) while ( ( c = Extra_UtilGetopt( argc, argv, "svh" ) ) != EOF )
...@@ -29716,6 +29724,7 @@ int Abc_CommandAbc9Test( Abc_Frame_t * pAbc, int argc, char ** argv ) ...@@ -29716,6 +29724,7 @@ int Abc_CommandAbc9Test( Abc_Frame_t * pAbc, int argc, char ** argv )
// Gia_ManSuppSizeTest( pAbc->pGia ); // Gia_ManSuppSizeTest( pAbc->pGia );
// Gia_VtaTest( pAbc->pGia, 10, 100000, 0, 0, 1 ); // Gia_VtaTest( pAbc->pGia, 10, 100000, 0, 0, 1 );
// Gia_IsoTest( pAbc->pGia, fVerbose ); // Gia_IsoTest( pAbc->pGia, fVerbose );
Ga2_ManComputeTest( pAbc->pGia );
return 0; return 0;
usage: usage:
Abc_Print( -2, "usage: &test [-svh]\n" ); Abc_Print( -2, "usage: &test [-svh]\n" );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment