Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
abc
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
abc
Commits
d3c018cd
Commit
d3c018cd
authored
Jul 01, 2012
by
Alan Mishchenko
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Reducing memory usage in bmc2 and bmc3.
parent
a4908534
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
229 additions
and
179 deletions
+229
-179
src/aig/gia/gia.h
+1
-0
src/aig/gia/giaFrames.c
+60
-0
src/aig/saig/saigBmc2.c
+57
-65
src/aig/saig/saigBmc3.c
+92
-107
src/base/abci/abc.c
+19
-7
No files found.
src/aig/gia/gia.h
View file @
d3c018cd
...
@@ -739,6 +739,7 @@ extern void Gia_ManUnrollStop( void * pMan );
...
@@ -739,6 +739,7 @@ extern void Gia_ManUnrollStop( void * pMan );
extern
int
Gia_ManUnrollLastLit
(
void
*
pMan
);
extern
int
Gia_ManUnrollLastLit
(
void
*
pMan
);
extern
void
Gia_ManFraSetDefaultParams
(
Gia_ParFra_t
*
p
);
extern
void
Gia_ManFraSetDefaultParams
(
Gia_ParFra_t
*
p
);
extern
Gia_Man_t
*
Gia_ManFrames
(
Gia_Man_t
*
pAig
,
Gia_ParFra_t
*
pPars
);
extern
Gia_Man_t
*
Gia_ManFrames
(
Gia_Man_t
*
pAig
,
Gia_ParFra_t
*
pPars
);
extern
Gia_Man_t
*
Gia_ManFramesInitSpecial
(
Gia_Man_t
*
pAig
,
int
nFrames
,
int
fVerbose
);
/*=== giaFront.c ==========================================================*/
/*=== giaFront.c ==========================================================*/
extern
Gia_Man_t
*
Gia_ManFront
(
Gia_Man_t
*
p
);
extern
Gia_Man_t
*
Gia_ManFront
(
Gia_Man_t
*
p
);
extern
void
Gia_ManFrontTest
(
Gia_Man_t
*
p
);
extern
void
Gia_ManFrontTest
(
Gia_Man_t
*
p
);
...
...
src/aig/gia/giaFrames.c
View file @
d3c018cd
...
@@ -915,6 +915,66 @@ Gia_Man_t * Gia_ManFrames( Gia_Man_t * pAig, Gia_ParFra_t * pPars )
...
@@ -915,6 +915,66 @@ Gia_Man_t * Gia_ManFrames( Gia_Man_t * pAig, Gia_ParFra_t * pPars )
return
pFrames
;
return
pFrames
;
}
}
/**Function*************************************************************
Synopsis [Perform init unrolling as long as PO(s) are constant 0.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
Gia_Man_t
*
Gia_ManFramesInitSpecial
(
Gia_Man_t
*
pAig
,
int
nFrames
,
int
fVerbose
)
{
Gia_Man_t
*
pFrames
,
*
pTemp
;
Gia_Obj_t
*
pObj
;
int
i
,
f
;
assert
(
Gia_ManRegNum
(
pAig
)
>
0
);
if
(
nFrames
>
0
)
printf
(
"Computing specialized unrolling with %d frames...
\n
"
,
nFrames
);
pFrames
=
Gia_ManStart
(
Gia_ManObjNum
(
pAig
)
);
pFrames
->
pName
=
Abc_UtilStrsav
(
pAig
->
pName
);
Gia_ManHashAlloc
(
pFrames
);
Gia_ManConst0
(
pAig
)
->
Value
=
0
;
for
(
f
=
0
;
nFrames
==
0
||
f
<
nFrames
;
f
++
)
{
if
(
fVerbose
&&
(
f
%
100
==
0
)
)
{
printf
(
"%6d : "
,
f
);
Gia_ManPrintStats
(
pFrames
,
0
,
0
);
}
Gia_ManForEachRo
(
pAig
,
pObj
,
i
)
pObj
->
Value
=
f
?
Gia_ObjRoToRi
(
pAig
,
pObj
)
->
Value
:
0
;
Gia_ManForEachPi
(
pAig
,
pObj
,
i
)
pObj
->
Value
=
Gia_ManAppendCi
(
pFrames
);
Gia_ManForEachAnd
(
pAig
,
pObj
,
i
)
pObj
->
Value
=
Gia_ManHashAnd
(
pFrames
,
Gia_ObjFanin0Copy
(
pObj
),
Gia_ObjFanin1Copy
(
pObj
)
);
Gia_ManForEachPo
(
pAig
,
pObj
,
i
)
if
(
Gia_ObjFanin0Copy
(
pObj
)
!=
0
)
break
;
if
(
i
<
Gia_ManPoNum
(
pAig
)
)
break
;
Gia_ManForEachRi
(
pAig
,
pObj
,
i
)
pObj
->
Value
=
Gia_ObjFanin0Copy
(
pObj
);
}
if
(
fVerbose
)
printf
(
"Computed prefix of %d frames.
\n
"
,
f
);
Gia_ManForEachRi
(
pAig
,
pObj
,
i
)
Gia_ManAppendCo
(
pFrames
,
pObj
->
Value
);
Gia_ManHashStop
(
pFrames
);
pFrames
=
Gia_ManCleanup
(
pTemp
=
pFrames
);
if
(
fVerbose
)
printf
(
"Before cleanup = %d nodes. After cleanup = %d nodes.
\n
"
,
Gia_ManAndNum
(
pTemp
),
Gia_ManAndNum
(
pFrames
)
);
Gia_ManStop
(
pTemp
);
return
pFrames
;
}
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
...
...
src/aig/saig/saigBmc2.c
View file @
d3c018cd
...
@@ -25,12 +25,11 @@
...
@@ -25,12 +25,11 @@
ABC_NAMESPACE_IMPL_START
ABC_NAMESPACE_IMPL_START
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
/// DECLARATIONS ///
/// DECLARATIONS ///
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
#define AIG_VISITED ((Aig_Obj_t *)(ABC_PTRUINT_T)1)
//
#define AIG_VISITED ((Aig_Obj_t *)(ABC_PTRUINT_T)1)
typedef
struct
Saig_Bmc_t_
Saig_Bmc_t
;
typedef
struct
Saig_Bmc_t_
Saig_Bmc_t
;
struct
Saig_Bmc_t_
struct
Saig_Bmc_t_
...
@@ -44,11 +43,10 @@ struct Saig_Bmc_t_
...
@@ -44,11 +43,10 @@ struct Saig_Bmc_t_
// AIG managers
// AIG managers
Aig_Man_t
*
pAig
;
// the user's AIG manager
Aig_Man_t
*
pAig
;
// the user's AIG manager
Aig_Man_t
*
pFrm
;
// Frames manager
Aig_Man_t
*
pFrm
;
// Frames manager
Vec_
Ptr
_t
*
vVisited
;
// nodes visited in Frames
Vec_
Int
_t
*
vVisited
;
// nodes visited in Frames
// node mapping
// node mapping
int
nObjs
;
// the largest number of an AIG object
int
nObjs
;
// the largest number of an AIG object
Vec_Ptr_t
*
vAig2Frm
;
// mapping of AIG nodees into Frames nodes
Vec_Ptr_t
*
vAig2Frm
;
// mapping of AIG nodees into Frames nodes
// Vec_Str_t * vAig2Frm2; // mapping of AIG nodees into Frames nodes
// SAT solver
// SAT solver
sat_solver
*
pSat
;
// SAT solver
sat_solver
*
pSat
;
// SAT solver
int
nSatVars
;
// the number of used SAT variables
int
nSatVars
;
// the number of used SAT variables
...
@@ -63,15 +61,43 @@ struct Saig_Bmc_t_
...
@@ -63,15 +61,43 @@ struct Saig_Bmc_t_
int
iOutputFail
;
// failed output
int
iOutputFail
;
// failed output
};
};
static
inline
int
Saig_BmcSatNum
(
Saig_Bmc_t
*
p
,
Aig_Obj_t
*
pObj
)
{
return
Vec_IntGetEntry
(
p
->
vObj2Var
,
pObj
->
Id
);
}
static
inline
Aig_Obj_t
*
Saig_BmcObjFrame
(
Saig_Bmc_t
*
p
,
Aig_Obj_t
*
pObj
,
int
i
)
static
inline
void
Saig_BmcSetSatNum
(
Saig_Bmc_t
*
p
,
Aig_Obj_t
*
pObj
,
int
Num
)
{
Vec_IntSetEntry
(
p
->
vObj2Var
,
pObj
->
Id
,
Num
);
}
{
// return (Aig_Obj_t *)Vec_PtrGetEntry( p->vAig2Frm, p->nObjs*i+pObj->Id );
static
inline
Aig_Obj_t
*
Saig_BmcObjFrame
(
Saig_Bmc_t
*
p
,
Aig_Obj_t
*
pObj
,
int
i
)
{
return
(
Aig_Obj_t
*
)
Vec_PtrGetEntry
(
p
->
vAig2Frm
,
p
->
nObjs
*
i
+
pObj
->
Id
);
}
Aig_Obj_t
*
pRes
;
static
inline
void
Saig_BmcObjSetFrame
(
Saig_Bmc_t
*
p
,
Aig_Obj_t
*
pObj
,
int
i
,
Aig_Obj_t
*
pNode
)
{
Vec_PtrSetEntry
(
p
->
vAig2Frm
,
p
->
nObjs
*
i
+
pObj
->
Id
,
pNode
);
}
Vec_Int_t
*
vFrame
=
(
Vec_Int_t
*
)
Vec_PtrEntry
(
p
->
vAig2Frm
,
i
);
int
iObjLit
=
Vec_IntEntry
(
vFrame
,
Aig_ObjId
(
pObj
)
);
if
(
iObjLit
==
-
1
)
return
NULL
;
pRes
=
Aig_ManObj
(
p
->
pFrm
,
Abc_Lit2Var
(
iObjLit
)
);
if
(
pRes
==
NULL
)
Vec_IntWriteEntry
(
vFrame
,
Aig_ObjId
(
pObj
),
-
1
);
else
pRes
=
Aig_NotCond
(
pRes
,
Abc_LitIsCompl
(
iObjLit
)
);
return
pRes
;
}
static
inline
void
Saig_BmcObjSetFrame
(
Saig_Bmc_t
*
p
,
Aig_Obj_t
*
pObj
,
int
i
,
Aig_Obj_t
*
pNode
)
{
// Vec_PtrSetEntry( p->vAig2Frm, p->nObjs*i+pObj->Id, pNode );
Vec_Int_t
*
vFrame
;
int
iObjLit
;
if
(
i
==
Vec_PtrSize
(
p
->
vAig2Frm
)
)
Vec_PtrPush
(
p
->
vAig2Frm
,
Vec_IntStartFull
(
p
->
nObjs
)
);
assert
(
i
<
Vec_PtrSize
(
p
->
vAig2Frm
)
);
vFrame
=
(
Vec_Int_t
*
)
Vec_PtrEntry
(
p
->
vAig2Frm
,
i
);
if
(
pNode
==
NULL
)
iObjLit
=
-
1
;
else
iObjLit
=
Abc_Var2Lit
(
Aig_ObjId
(
Aig_Regular
(
pNode
)),
Aig_IsComplement
(
pNode
)
);
Vec_IntWriteEntry
(
vFrame
,
Aig_ObjId
(
pObj
),
iObjLit
);
}
static
inline
Aig_Obj_t
*
Saig_BmcObjChild0
(
Saig_Bmc_t
*
p
,
Aig_Obj_t
*
pObj
,
int
i
)
{
assert
(
!
Aig_IsComplement
(
pObj
)
);
return
Aig_NotCond
(
Saig_BmcObjFrame
(
p
,
Aig_ObjFanin0
(
pObj
),
i
),
Aig_ObjFaninC0
(
pObj
));
}
static
inline
Aig_Obj_t
*
Saig_BmcObjChild0
(
Saig_Bmc_t
*
p
,
Aig_Obj_t
*
pObj
,
int
i
)
{
assert
(
!
Aig_IsComplement
(
pObj
)
);
return
Aig_NotCond
(
Saig_BmcObjFrame
(
p
,
Aig_ObjFanin0
(
pObj
),
i
),
Aig_ObjFaninC0
(
pObj
));
}
static
inline
Aig_Obj_t
*
Saig_BmcObjChild1
(
Saig_Bmc_t
*
p
,
Aig_Obj_t
*
pObj
,
int
i
)
{
assert
(
!
Aig_IsComplement
(
pObj
)
);
return
Aig_NotCond
(
Saig_BmcObjFrame
(
p
,
Aig_ObjFanin1
(
pObj
),
i
),
Aig_ObjFaninC1
(
pObj
));
}
static
inline
Aig_Obj_t
*
Saig_BmcObjChild1
(
Saig_Bmc_t
*
p
,
Aig_Obj_t
*
pObj
,
int
i
)
{
assert
(
!
Aig_IsComplement
(
pObj
)
);
return
Aig_NotCond
(
Saig_BmcObjFrame
(
p
,
Aig_ObjFanin1
(
pObj
),
i
),
Aig_ObjFaninC1
(
pObj
));
}
static
inline
int
Saig_BmcSatNum
(
Saig_Bmc_t
*
p
,
Aig_Obj_t
*
pObj
)
{
return
Vec_IntGetEntry
(
p
->
vObj2Var
,
pObj
->
Id
);
}
static
inline
void
Saig_BmcSetSatNum
(
Saig_Bmc_t
*
p
,
Aig_Obj_t
*
pObj
,
int
Num
)
{
Vec_IntSetEntry
(
p
->
vObj2Var
,
pObj
->
Id
,
Num
);
}
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
/// FUNCTION DEFINITIONS ///
/// FUNCTION DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
...
@@ -268,12 +294,11 @@ Saig_Bmc_t * Saig_BmcManStart( Aig_Man_t * pAig, int nFramesMax, int nNodesMax,
...
@@ -268,12 +294,11 @@ Saig_Bmc_t * Saig_BmcManStart( Aig_Man_t * pAig, int nFramesMax, int nNodesMax,
p
->
pAig
=
pAig
;
p
->
pAig
=
pAig
;
p
->
nObjs
=
Aig_ManObjNumMax
(
pAig
);
p
->
nObjs
=
Aig_ManObjNumMax
(
pAig
);
// create node and variable mappings
// create node and variable mappings
p
->
vAig2Frm
=
Vec_PtrAlloc
(
0
);
p
->
vAig2Frm
=
Vec_PtrAlloc
(
100
);
Vec_PtrFill
(
p
->
vAig2Frm
,
5
*
p
->
nObjs
,
NULL
);
p
->
vObj2Var
=
Vec_IntAlloc
(
0
);
p
->
vObj2Var
=
Vec_IntAlloc
(
0
);
Vec_IntFill
(
p
->
vObj2Var
,
5
*
p
->
nObjs
,
0
);
Vec_IntFill
(
p
->
vObj2Var
,
p
->
nObjs
,
0
);
// start the AIG manager and map primary inputs
// start the AIG manager and map primary inputs
p
->
pFrm
=
Aig_ManStart
(
5
*
p
->
nObjs
);
p
->
pFrm
=
Aig_ManStart
(
p
->
nObjs
);
Saig_ManForEachLo
(
pAig
,
pObj
,
i
)
Saig_ManForEachLo
(
pAig
,
pObj
,
i
)
Saig_BmcObjSetFrame
(
p
,
pObj
,
0
,
Aig_ManConst0
(
p
->
pFrm
)
);
Saig_BmcObjSetFrame
(
p
,
pObj
,
0
,
Aig_ManConst0
(
p
->
pFrm
)
);
// create SAT solver
// create SAT solver
...
@@ -284,8 +309,8 @@ Saig_Bmc_t * Saig_BmcManStart( Aig_Man_t * pAig, int nFramesMax, int nNodesMax,
...
@@ -284,8 +309,8 @@ Saig_Bmc_t * Saig_BmcManStart( Aig_Man_t * pAig, int nFramesMax, int nNodesMax,
sat_solver_addclause
(
p
->
pSat
,
&
Lit
,
&
Lit
+
1
);
sat_solver_addclause
(
p
->
pSat
,
&
Lit
,
&
Lit
+
1
);
Saig_BmcSetSatNum
(
p
,
Aig_ManConst1
(
p
->
pFrm
),
p
->
nSatVars
++
);
Saig_BmcSetSatNum
(
p
,
Aig_ManConst1
(
p
->
pFrm
),
p
->
nSatVars
++
);
// other data structures
// other data structures
p
->
vTargets
=
Vec_PtrAlloc
(
0
);
p
->
vTargets
=
Vec_PtrAlloc
(
100
0
);
p
->
vVisited
=
Vec_
PtrAlloc
(
0
);
p
->
vVisited
=
Vec_
IntAlloc
(
100
0
);
p
->
iOutputFail
=
-
1
;
p
->
iOutputFail
=
-
1
;
p
->
iFrameFail
=
-
1
;
p
->
iFrameFail
=
-
1
;
return
p
;
return
p
;
...
@@ -304,36 +329,12 @@ Saig_Bmc_t * Saig_BmcManStart( Aig_Man_t * pAig, int nFramesMax, int nNodesMax,
...
@@ -304,36 +329,12 @@ Saig_Bmc_t * Saig_BmcManStart( Aig_Man_t * pAig, int nFramesMax, int nNodesMax,
***********************************************************************/
***********************************************************************/
void
Saig_BmcManStop
(
Saig_Bmc_t
*
p
)
void
Saig_BmcManStop
(
Saig_Bmc_t
*
p
)
{
{
// Aig_Obj_t * pObj;
// int i, f, Counter = 0;
// int i, Counter = 0;
// for ( i = 0; i < p->vAig2Frm2->nSize; i++ )
// Counter += (p->vAig2Frm2->pArray[i] != 0);
// for ( i = 0; i < p->vAig2Frm->nSize; i++ )
// Counter += (p->vAig2Frm->pArray[i] != NULL);
// printf( "Objs = %d. Nodes = %d. Frames = %d. Used = %d. Non-empty = %d.\n",
// p->nObjs, Aig_ManNodeNum(p->pAig), p->iFrameLast, p->vAig2Frm->nSize, Counter );
/*
Aig_ManForEachObj( p->pAig, pObj, i )
{
int Last = -1;
for ( f = 0; f <= p->iFrameLast; f++ )
if ( Saig_BmcObjFrame( p, pObj, f ) )
Last = f;
if ( i % 50 == 0 )
printf( "%d ", Last );
}
printf( "\n" );
*/
Aig_ManStop
(
p
->
pFrm
);
Aig_ManStop
(
p
->
pFrm
);
Vec_PtrFree
(
p
->
vAig2Frm
);
Vec_VecFree
(
(
Vec_Vec_t
*
)
p
->
vAig2Frm
);
// Vec_StrFree( p->vAig2Frm2 );
Vec_IntFree
(
p
->
vObj2Var
);
Vec_IntFree
(
p
->
vObj2Var
);
sat_solver_delete
(
p
->
pSat
);
sat_solver_delete
(
p
->
pSat
);
Vec_PtrFree
(
p
->
vTargets
);
Vec_PtrFree
(
p
->
vTargets
);
Vec_
Ptr
Free
(
p
->
vVisited
);
Vec_
Int
Free
(
p
->
vVisited
);
ABC_FREE
(
p
);
ABC_FREE
(
p
);
}
}
...
@@ -348,6 +349,7 @@ void Saig_BmcManStop( Saig_Bmc_t * p )
...
@@ -348,6 +349,7 @@ void Saig_BmcManStop( Saig_Bmc_t * p )
SeeAlso []
SeeAlso []
***********************************************************************/
***********************************************************************/
/*
Aig_Obj_t * Saig_BmcIntervalExplore_rec( Saig_Bmc_t * p, Aig_Obj_t * pObj, int i )
Aig_Obj_t * Saig_BmcIntervalExplore_rec( Saig_Bmc_t * p, Aig_Obj_t * pObj, int i )
{
{
Aig_Obj_t * pRes, * p0, * p1, * pConst1 = Aig_ManConst1(p->pAig);
Aig_Obj_t * pRes, * p0, * p1, * pConst1 = Aig_ManConst1(p->pAig);
...
@@ -388,6 +390,7 @@ Aig_Obj_t * Saig_BmcIntervalExplore_rec( Saig_Bmc_t * p, Aig_Obj_t * pObj, int i
...
@@ -388,6 +390,7 @@ Aig_Obj_t * Saig_BmcIntervalExplore_rec( Saig_Bmc_t * p, Aig_Obj_t * pObj, int i
Saig_BmcObjSetFrame( p, pObj, i, pRes );
Saig_BmcObjSetFrame( p, pObj, i, pRes );
return pRes;
return pRes;
}
}
*/
/**Function*************************************************************
/**Function*************************************************************
...
@@ -400,7 +403,7 @@ Aig_Obj_t * Saig_BmcIntervalExplore_rec( Saig_Bmc_t * p, Aig_Obj_t * pObj, int i
...
@@ -400,7 +403,7 @@ Aig_Obj_t * Saig_BmcIntervalExplore_rec( Saig_Bmc_t * p, Aig_Obj_t * pObj, int i
SeeAlso []
SeeAlso []
***********************************************************************/
***********************************************************************/
Aig_Obj_t
*
Saig_BmcIntervalConstruct_rec
(
Saig_Bmc_t
*
p
,
Aig_Obj_t
*
pObj
,
int
i
,
Vec_
Ptr
_t
*
vVisited
)
Aig_Obj_t
*
Saig_BmcIntervalConstruct_rec
(
Saig_Bmc_t
*
p
,
Aig_Obj_t
*
pObj
,
int
i
,
Vec_
Int
_t
*
vVisited
)
{
{
Aig_Obj_t
*
pRes
;
Aig_Obj_t
*
pRes
;
pRes
=
Saig_BmcObjFrame
(
p
,
pObj
,
i
);
pRes
=
Saig_BmcObjFrame
(
p
,
pObj
,
i
);
...
@@ -428,8 +431,8 @@ Aig_Obj_t * Saig_BmcIntervalConstruct_rec( Saig_Bmc_t * p, Aig_Obj_t * pObj, int
...
@@ -428,8 +431,8 @@ Aig_Obj_t * Saig_BmcIntervalConstruct_rec( Saig_Bmc_t * p, Aig_Obj_t * pObj, int
}
}
assert
(
pRes
!=
NULL
);
assert
(
pRes
!=
NULL
);
Saig_BmcObjSetFrame
(
p
,
pObj
,
i
,
pRes
);
Saig_BmcObjSetFrame
(
p
,
pObj
,
i
,
pRes
);
Vec_
PtrPush
(
vVisited
,
pObj
);
Vec_
IntPush
(
vVisited
,
Aig_ObjId
(
pObj
)
);
Vec_
PtrPush
(
vVisited
,
(
void
*
)(
ABC_PTRINT_T
)
i
);
Vec_
IntPush
(
vVisited
,
i
);
return
pRes
;
return
pRes
;
}
}
...
@@ -447,13 +450,12 @@ Aig_Obj_t * Saig_BmcIntervalConstruct_rec( Saig_Bmc_t * p, Aig_Obj_t * pObj, int
...
@@ -447,13 +450,12 @@ Aig_Obj_t * Saig_BmcIntervalConstruct_rec( Saig_Bmc_t * p, Aig_Obj_t * pObj, int
void
Saig_BmcInterval
(
Saig_Bmc_t
*
p
)
void
Saig_BmcInterval
(
Saig_Bmc_t
*
p
)
{
{
Aig_Obj_t
*
pTarget
;
Aig_Obj_t
*
pTarget
;
Aig_Obj_t
*
pObj
,
*
pRes
;
int
i
,
iObj
,
iFrame
;
int
i
,
iFrame
,
Counter
;
int
nNodes
=
Aig_ManObjNum
(
p
->
pFrm
);
int
nNodes
=
Aig_ManObjNum
(
p
->
pFrm
);
Vec_PtrClear
(
p
->
vTargets
);
Vec_PtrClear
(
p
->
vTargets
);
p
->
iFramePrev
=
p
->
iFrameLast
;
p
->
iFramePrev
=
p
->
iFrameLast
;
for
(
;
p
->
iFrameLast
<
p
->
nFramesMax
;
p
->
iFrameLast
++
,
p
->
iOutputLast
=
0
)
for
(
;
p
->
iFrameLast
<
p
->
nFramesMax
;
p
->
iFrameLast
++
,
p
->
iOutputLast
=
0
)
{
{
if
(
p
->
iOutputLast
==
0
)
if
(
p
->
iOutputLast
==
0
)
{
{
Saig_BmcObjSetFrame
(
p
,
Aig_ManConst1
(
p
->
pAig
),
p
->
iFrameLast
,
Aig_ManConst1
(
p
->
pFrm
)
);
Saig_BmcObjSetFrame
(
p
,
Aig_ManConst1
(
p
->
pAig
),
p
->
iFrameLast
,
Aig_ManConst1
(
p
->
pFrm
)
);
...
@@ -463,24 +465,14 @@ void Saig_BmcInterval( Saig_Bmc_t * p )
...
@@ -463,24 +465,14 @@ void Saig_BmcInterval( Saig_Bmc_t * p )
if
(
Aig_ManObjNum
(
p
->
pFrm
)
>=
nNodes
+
p
->
nNodesMax
)
if
(
Aig_ManObjNum
(
p
->
pFrm
)
>=
nNodes
+
p
->
nNodesMax
)
return
;
return
;
// Saig_BmcIntervalExplore_rec( p, Aig_ManCo(p->pAig, p->iOutputLast), p->iFrameLast );
// Saig_BmcIntervalExplore_rec( p, Aig_ManCo(p->pAig, p->iOutputLast), p->iFrameLast );
Vec_
Ptr
Clear
(
p
->
vVisited
);
Vec_
Int
Clear
(
p
->
vVisited
);
pTarget
=
Saig_BmcIntervalConstruct_rec
(
p
,
Aig_ManCo
(
p
->
pAig
,
p
->
iOutputLast
),
p
->
iFrameLast
,
p
->
vVisited
);
pTarget
=
Saig_BmcIntervalConstruct_rec
(
p
,
Aig_ManCo
(
p
->
pAig
,
p
->
iOutputLast
),
p
->
iFrameLast
,
p
->
vVisited
);
Vec_PtrPush
(
p
->
vTargets
,
pTarget
);
Vec_PtrPush
(
p
->
vTargets
,
pTarget
);
Aig_ObjCreateCo
(
p
->
pFrm
,
pTarget
);
Aig_ObjCreateCo
(
p
->
pFrm
,
pTarget
);
Aig_ManCleanup
(
p
->
pFrm
);
Aig_ManCleanup
(
p
->
pFrm
);
// check if the node is gone
// check if the node is gone
Counter
=
0
;
Vec_IntForEachEntryDouble
(
p
->
vVisited
,
iObj
,
iFrame
,
i
)
Vec_PtrForEachEntry
(
Aig_Obj_t
*
,
p
->
vVisited
,
pObj
,
i
)
Saig_BmcObjFrame
(
p
,
Aig_ManObj
(
p
->
pAig
,
iObj
),
iFrame
);
{
iFrame
=
(
int
)(
ABC_PTRINT_T
)
Vec_PtrEntry
(
p
->
vVisited
,
1
+
i
++
);
pRes
=
Saig_BmcObjFrame
(
p
,
pObj
,
iFrame
);
if
(
Aig_ObjIsNone
(
Aig_Regular
(
pRes
)
)
)
{
Saig_BmcObjSetFrame
(
p
,
pObj
,
iFrame
,
NULL
);
Counter
++
;
}
}
// printf( "%d ", Counter );
}
}
}
}
}
}
...
@@ -500,7 +492,7 @@ Aig_Obj_t * Saig_BmcIntervalToAig_rec( Saig_Bmc_t * p, Aig_Man_t * pNew, Aig_Obj
...
@@ -500,7 +492,7 @@ Aig_Obj_t * Saig_BmcIntervalToAig_rec( Saig_Bmc_t * p, Aig_Man_t * pNew, Aig_Obj
{
{
if
(
pObj
->
pData
)
if
(
pObj
->
pData
)
return
(
Aig_Obj_t
*
)
pObj
->
pData
;
return
(
Aig_Obj_t
*
)
pObj
->
pData
;
Vec_
PtrPush
(
p
->
vVisited
,
pObj
);
Vec_
IntPush
(
p
->
vVisited
,
Aig_ObjId
(
pObj
)
);
if
(
Saig_BmcSatNum
(
p
,
pObj
)
||
Aig_ObjIsCi
(
pObj
)
)
if
(
Saig_BmcSatNum
(
p
,
pObj
)
||
Aig_ObjIsCi
(
pObj
)
)
{
{
p
->
nStitchVars
+=
!
Aig_ObjIsCi
(
pObj
);
p
->
nStitchVars
+=
!
Aig_ObjIsCi
(
pObj
);
...
@@ -533,15 +525,15 @@ Aig_Man_t * Saig_BmcIntervalToAig( Saig_Bmc_t * p )
...
@@ -533,15 +525,15 @@ Aig_Man_t * Saig_BmcIntervalToAig( Saig_Bmc_t * p )
pNew
=
Aig_ManStart
(
p
->
nNodesMax
);
pNew
=
Aig_ManStart
(
p
->
nNodesMax
);
Aig_ManConst1
(
p
->
pFrm
)
->
pData
=
Aig_ManConst1
(
pNew
);
Aig_ManConst1
(
p
->
pFrm
)
->
pData
=
Aig_ManConst1
(
pNew
);
Vec_
Ptr
Clear
(
p
->
vVisited
);
Vec_
Int
Clear
(
p
->
vVisited
);
Vec_
PtrPush
(
p
->
vVisited
,
Aig_ManConst1
(
p
->
pFrm
)
);
Vec_
IntPush
(
p
->
vVisited
,
Aig_ObjId
(
Aig_ManConst1
(
p
->
pFrm
)
)
);
Vec_PtrForEachEntry
(
Aig_Obj_t
*
,
p
->
vTargets
,
pObj
,
i
)
Vec_PtrForEachEntry
(
Aig_Obj_t
*
,
p
->
vTargets
,
pObj
,
i
)
{
{
// assert( !Aig_ObjIsConst1(Aig_Regular(pObj)) );
// assert( !Aig_ObjIsConst1(Aig_Regular(pObj)) );
pObjNew
=
Saig_BmcIntervalToAig_rec
(
p
,
pNew
,
Aig_Regular
(
pObj
)
);
pObjNew
=
Saig_BmcIntervalToAig_rec
(
p
,
pNew
,
Aig_Regular
(
pObj
)
);
assert
(
!
Aig_IsComplement
(
pObjNew
)
);
assert
(
!
Aig_IsComplement
(
pObjNew
)
);
Aig_ObjCreateCo
(
pNew
,
pObjNew
);
Aig_ObjCreateCo
(
pNew
,
pObjNew
);
}
}
return
pNew
;
return
pNew
;
}
}
...
@@ -560,7 +552,7 @@ void Saig_BmcLoadCnf( Saig_Bmc_t * p, Cnf_Dat_t * pCnf )
...
@@ -560,7 +552,7 @@ void Saig_BmcLoadCnf( Saig_Bmc_t * p, Cnf_Dat_t * pCnf )
{
{
Aig_Obj_t
*
pObj
,
*
pObjNew
;
Aig_Obj_t
*
pObj
,
*
pObjNew
;
int
i
,
Lits
[
2
],
VarNumOld
,
VarNumNew
;
int
i
,
Lits
[
2
],
VarNumOld
,
VarNumNew
;
Vec_PtrForEachEntry
(
Aig_Obj_t
*
,
p
->
vVisited
,
pObj
,
i
)
Aig_ManForEachObjVec
(
p
->
vVisited
,
p
->
pFrm
,
pObj
,
i
)
{
{
// get the new variable of this node
// get the new variable of this node
pObjNew
=
(
Aig_Obj_t
*
)
pObj
->
pData
;
pObjNew
=
(
Aig_Obj_t
*
)
pObj
->
pData
;
...
...
src/aig/saig/saigBmc3.c
View file @
d3c018cd
...
@@ -40,14 +40,13 @@ struct Gia_ManBmc_t_
...
@@ -40,14 +40,13 @@ struct Gia_ManBmc_t_
Vec_Int_t
*
vMapping
;
// mapping
Vec_Int_t
*
vMapping
;
// mapping
Vec_Vec_t
*
vSects
;
// sections
Vec_Vec_t
*
vSects
;
// sections
Vec_Int_t
*
vId2Num
;
// number of each node
Vec_Int_t
*
vId2Num
;
// number of each node
Vec_Int_t
*
vVisited
;
// visited nodes
Vec_Ptr_t
*
vTerInfo
;
// ternary information
// SAT variables
Vec_Int_t
*
vPiVars
;
// SAT vars for the PIs
Vec_Ptr_t
*
vId2Var
;
// SAT vars for each object
Vec_Ptr_t
*
vId2Var
;
// SAT vars for each object
// SAT solver
// SAT solver
sat_solver
*
pSat
;
// SAT solver
sat_solver
*
pSat
;
// SAT solver
int
nSatVars
;
// SAT variables
int
nSatVars
;
// SAT variables
int
nObjNums
;
// SAT objects
int
nObjNums
;
// SAT objects
int
nWordNum
;
// unsigned words for ternary simulation
int
nBufNum
;
// the number of simple nodes
int
nBufNum
;
// the number of simple nodes
int
nDupNum
;
// the number of simple nodes
int
nDupNum
;
// the number of simple nodes
char
*
pSopSizes
,
**
pSops
;
// CNF representation
char
*
pSopSizes
,
**
pSops
;
// CNF representation
...
@@ -684,14 +683,15 @@ Gia_ManBmc_t * Saig_Bmc3ManStart( Aig_Man_t * pAig )
...
@@ -684,14 +683,15 @@ Gia_ManBmc_t * Saig_Bmc3ManStart( Aig_Man_t * pAig )
Vec_IntWriteEntry
(
p
->
vId2Num
,
Aig_ObjId
(
pObj
),
p
->
nObjNums
++
);
Vec_IntWriteEntry
(
p
->
vId2Num
,
Aig_ObjId
(
pObj
),
p
->
nObjNums
++
);
Aig_ManForEachCo
(
pAig
,
pObj
,
i
)
Aig_ManForEachCo
(
pAig
,
pObj
,
i
)
Vec_IntWriteEntry
(
p
->
vId2Num
,
Aig_ObjId
(
pObj
),
p
->
nObjNums
++
);
Vec_IntWriteEntry
(
p
->
vId2Num
,
Aig_ObjId
(
pObj
),
p
->
nObjNums
++
);
p
->
vPiVars
=
Vec_IntAlloc
(
1000
);
p
->
vId2Var
=
Vec_PtrAlloc
(
100
);
p
->
vId2Var
=
Vec_PtrAlloc
(
100
);
p
->
v
Visited
=
Vec_IntAlloc
(
10
00
);
p
->
v
TerInfo
=
Vec_PtrAlloc
(
1
00
);
// create solver
// create solver
p
->
nSatVars
=
1
;
p
->
nSatVars
=
1
;
p
->
pSat
=
sat_solver_new
();
p
->
pSat
=
sat_solver_new
();
sat_solver_setnvars
(
p
->
pSat
,
1000
);
sat_solver_setnvars
(
p
->
pSat
,
1000
);
Cnf_ReadMsops
(
&
p
->
pSopSizes
,
&
p
->
pSops
);
Cnf_ReadMsops
(
&
p
->
pSopSizes
,
&
p
->
pSops
);
// terminary simulation
p
->
nWordNum
=
Abc_BitWordNum
(
2
*
Aig_ManObjNumMax
(
pAig
)
);
return
p
;
return
p
;
}
}
...
@@ -708,7 +708,7 @@ Gia_ManBmc_t * Saig_Bmc3ManStart( Aig_Man_t * pAig )
...
@@ -708,7 +708,7 @@ Gia_ManBmc_t * Saig_Bmc3ManStart( Aig_Man_t * pAig )
***********************************************************************/
***********************************************************************/
void
Saig_Bmc3ManStop
(
Gia_ManBmc_t
*
p
)
void
Saig_Bmc3ManStop
(
Gia_ManBmc_t
*
p
)
{
{
Aig_ManCleanMarkA
(
p
->
pAig
);
//
Aig_ManCleanMarkA( p->pAig );
if
(
p
->
vCexes
)
if
(
p
->
vCexes
)
{
{
assert
(
p
->
pAig
->
vSeqModelVec
==
NULL
);
assert
(
p
->
pAig
->
vSeqModelVec
==
NULL
);
...
@@ -719,9 +719,8 @@ void Saig_Bmc3ManStop( Gia_ManBmc_t * p )
...
@@ -719,9 +719,8 @@ void Saig_Bmc3ManStop( Gia_ManBmc_t * p )
Vec_IntFree
(
p
->
vMapping
);
Vec_IntFree
(
p
->
vMapping
);
Vec_VecFree
(
p
->
vSects
);
Vec_VecFree
(
p
->
vSects
);
Vec_IntFree
(
p
->
vId2Num
);
Vec_IntFree
(
p
->
vId2Num
);
Vec_IntFree
(
p
->
vPiVars
);
Vec_IntFree
(
p
->
vVisited
);
Vec_VecFree
(
(
Vec_Vec_t
*
)
p
->
vId2Var
);
Vec_VecFree
(
(
Vec_Vec_t
*
)
p
->
vId2Var
);
Vec_PtrFreeFree
(
p
->
vTerInfo
);
sat_solver_delete
(
p
->
pSat
);
sat_solver_delete
(
p
->
pSat
);
free
(
p
->
pSopSizes
);
free
(
p
->
pSopSizes
);
free
(
p
->
pSops
[
1
]
);
free
(
p
->
pSops
[
1
]
);
...
@@ -790,13 +789,6 @@ static inline int Saig_ManBmcSetLiteral( Gia_ManBmc_t * p, Aig_Obj_t * pObj, int
...
@@ -790,13 +789,6 @@ static inline int Saig_ManBmcSetLiteral( Gia_ManBmc_t * p, Aig_Obj_t * pObj, int
ObjNum
=
Vec_IntEntry
(
p
->
vId2Num
,
Aig_ObjId
(
pObj
)
);
ObjNum
=
Vec_IntEntry
(
p
->
vId2Num
,
Aig_ObjId
(
pObj
)
);
vFrame
=
(
Vec_Int_t
*
)
Vec_PtrEntry
(
p
->
vId2Var
,
iFrame
);
vFrame
=
(
Vec_Int_t
*
)
Vec_PtrEntry
(
p
->
vId2Var
,
iFrame
);
Vec_IntWriteEntry
(
vFrame
,
ObjNum
,
iLit
);
Vec_IntWriteEntry
(
vFrame
,
ObjNum
,
iLit
);
if
(
iLit
==
ABC_INFINITY
||
iLit
==
ABC_INFINITY
+
1
)
{
Vec_IntPush
(
p
->
vVisited
,
Aig_ObjId
(
pObj
)
);
Vec_IntPush
(
p
->
vVisited
,
iFrame
);
}
else
if
(
iLit
!=
~
0
&&
Saig_ObjIsPi
(
p
->
pAig
,
pObj
)
)
// save PI SAT var num
Vec_IntWriteEntry
(
p
->
vPiVars
,
iFrame
*
Saig_ManPiNum
(
p
->
pAig
)
+
Aig_ObjCioId
(
pObj
),
lit_var
(
iLit
)
);
return
iLit
;
return
iLit
;
}
}
...
@@ -1058,12 +1050,14 @@ int Saig_ManBmcCreateCnf_rec( Gia_ManBmc_t * p, Aig_Obj_t * pObj, int iFrame, in
...
@@ -1058,12 +1050,14 @@ int Saig_ManBmcCreateCnf_rec( Gia_ManBmc_t * p, Aig_Obj_t * pObj, int iFrame, in
{
{
iLit
=
ABC_INFINITY
;
iLit
=
ABC_INFINITY
;
}
}
assert
(
iLit
!=
ABC_INFINITY
);
return
Saig_ManBmcSetLiteral
(
p
,
pObj
,
iFrame
,
iLit
);
return
Saig_ManBmcSetLiteral
(
p
,
pObj
,
iFrame
,
iLit
);
}
}
/**Function*************************************************************
/**Function*************************************************************
Synopsis [
Derives CNF for one node
.]
Synopsis [
Recursively performs terminary simulation
.]
Description []
Description []
...
@@ -1072,25 +1066,59 @@ int Saig_ManBmcCreateCnf_rec( Gia_ManBmc_t * p, Aig_Obj_t * pObj, int iFrame, in
...
@@ -1072,25 +1066,59 @@ int Saig_ManBmcCreateCnf_rec( Gia_ManBmc_t * p, Aig_Obj_t * pObj, int iFrame, in
SeeAlso []
SeeAlso []
***********************************************************************/
***********************************************************************/
int
Saig_ManBmc
CreateCnf
(
Gia_ManBmc_t
*
p
,
Aig_Obj_t
*
pObj
,
int
iFrame
)
int
Saig_ManBmc
RunTerSim_rec
(
Gia_ManBmc_t
*
p
,
Aig_Obj_t
*
pObj
,
int
iFrame
)
{
{
int
i
,
iLit
,
Entry
,
iFrameOld
,
Value
;
unsigned
*
pInfo
=
(
unsigned
*
)
Vec_PtrEntry
(
p
->
vTerInfo
,
iFrame
);
Vec_IntClear
(
p
->
vVisited
);
int
Val0
,
Val1
,
Value
=
Saig_ManBmcSimInfoGet
(
pInfo
,
pObj
);
iLit
=
Saig_ManBmcCreateCnf_rec
(
p
,
pObj
,
iFrame
,
0
);
if
(
Value
!=
SAIG_TER_NON
)
Vec_IntForEachEntry
(
p
->
vVisited
,
Entry
,
i
)
return
Value
;
if
(
Aig_ObjIsCo
(
pObj
)
)
{
{
iFrameOld
=
Vec_IntEntry
(
p
->
vVisited
,
++
i
);
Value
=
Saig_ManBmcRunTerSim_rec
(
p
,
Aig_ObjFanin0
(
pObj
),
iFrame
);
Value
=
Saig_ManBmcLiteral
(
p
,
Aig_ManObj
(
p
->
pAig
,
Entry
),
iFrameOld
);
if
(
Aig_ObjFaninC0
(
pObj
)
)
// assert( Value == 0 || Value == 1 || Value == ABC_INFINITY || Value == ABC_INFINITY+1 );
Value
=
Saig_ManBmcSimInfoNot
(
Value
);
assert
(
Value
==
ABC_INFINITY
||
Value
==
ABC_INFINITY
+
1
);
if
(
!
(
Value
==
ABC_INFINITY
||
Value
==
ABC_INFINITY
+
1
)
)
printf
(
"Internal error!
\n
"
);
// if ( Value == 0 || Value == 1 )
// continue;
Saig_ManBmcSetLiteral
(
p
,
Aig_ManObj
(
p
->
pAig
,
Entry
),
iFrameOld
,
~
0
);
}
}
if
(
iLit
<
2
)
else
if
(
Saig_ObjIsLo
(
p
->
pAig
,
pObj
)
)
return
iLit
;
{
assert
(
iFrame
>
0
);
Value
=
Saig_ManBmcRunTerSim_rec
(
p
,
Saig_ObjLoToLi
(
p
->
pAig
,
pObj
),
iFrame
-
1
);
}
else
if
(
Aig_ObjIsNode
(
pObj
)
)
{
Val0
=
Saig_ManBmcRunTerSim_rec
(
p
,
Aig_ObjFanin0
(
pObj
),
iFrame
);
Val1
=
Saig_ManBmcRunTerSim_rec
(
p
,
Aig_ObjFanin1
(
pObj
),
iFrame
);
if
(
Aig_ObjFaninC0
(
pObj
)
)
Val0
=
Saig_ManBmcSimInfoNot
(
Val0
);
if
(
Aig_ObjFaninC1
(
pObj
)
)
Val1
=
Saig_ManBmcSimInfoNot
(
Val1
);
Value
=
Saig_ManBmcSimInfoAnd
(
Val0
,
Val1
);
}
else
assert
(
0
);
Saig_ManBmcSimInfoSet
(
pInfo
,
pObj
,
Value
);
// transfer to the unrolling
if
(
Saig_ManBmcMapping
(
p
,
pObj
)
&&
Value
!=
SAIG_TER_UND
)
Saig_ManBmcSetLiteral
(
p
,
pObj
,
iFrame
,
(
int
)(
Value
==
SAIG_TER_ONE
)
);
return
Value
;
}
/**Function*************************************************************
Synopsis [Derives CNF for one node.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int
Saig_ManBmcCreateCnf
(
Gia_ManBmc_t
*
p
,
Aig_Obj_t
*
pObj
,
int
iFrame
)
{
// perform terminary simulation
int
Value
=
Saig_ManBmcRunTerSim_rec
(
p
,
pObj
,
iFrame
);
if
(
Value
!=
SAIG_TER_UND
)
return
(
int
)(
Value
==
SAIG_TER_ONE
);
// construct CNF if value is ternary
return
Saig_ManBmcCreateCnf_rec
(
p
,
pObj
,
iFrame
,
1
);
return
Saig_ManBmcCreateCnf_rec
(
p
,
pObj
,
iFrame
,
1
);
}
}
...
@@ -1124,44 +1152,6 @@ int Aig_NodeCompareRefsIncrease( Aig_Obj_t ** pp1, Aig_Obj_t ** pp2 )
...
@@ -1124,44 +1152,6 @@ int Aig_NodeCompareRefsIncrease( Aig_Obj_t ** pp1, Aig_Obj_t ** pp2 )
/**Function*************************************************************
/**Function*************************************************************
Synopsis [Mark PIs to be skipped based on nPisAbstract.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void
Saig_ManBmcMarkPis
(
Aig_Man_t
*
pAig
,
int
nPisAbstract
)
{
Vec_Ptr_t
*
vPis
;
Aig_Obj_t
*
pObj
;
int
i
;
if
(
nPisAbstract
<
1
)
return
;
// sort PIs by the number of their fanouts
vPis
=
Vec_PtrAlloc
(
100
);
Saig_ManForEachPi
(
pAig
,
pObj
,
i
)
Vec_PtrPush
(
vPis
,
pObj
);
Vec_PtrSort
(
vPis
,
(
int
(
*
)(
void
))
Aig_NodeCompareRefsIncrease
);
Vec_PtrForEachEntry
(
Aig_Obj_t
*
,
vPis
,
pObj
,
i
)
{
if
(
i
<
nPisAbstract
)
{
pObj
->
fMarkA
=
1
;
// printf( "%d=%d ", Aig_ObjCioId(pObj), Aig_ObjRefs(pObj) );
}
}
// printf( "\n" );
// print primary inputs
// Saig_ManForEachPi( pAig, pObj, i )
// printf( "%d=%d ", i, Aig_ObjRefs(pObj) );
// printf( "\n" );
}
/**Function*************************************************************
Synopsis [This procedure sets default parameters.]
Synopsis [This procedure sets default parameters.]
Description []
Description []
...
@@ -1203,19 +1193,18 @@ int Saig_ManBmcScalable( Aig_Man_t * pAig, Saig_ParBmc_t * pPars )
...
@@ -1203,19 +1193,18 @@ int Saig_ManBmcScalable( Aig_Man_t * pAig, Saig_ParBmc_t * pPars )
{
{
Gia_ManBmc_t
*
p
;
Gia_ManBmc_t
*
p
;
Aig_Obj_t
*
pObj
;
Aig_Obj_t
*
pObj
;
unsigned
*
pInfo
;
int
RetValue
=
-
1
,
fFirst
=
1
,
nJumpFrame
=
0
,
fUnfinished
=
0
;
int
RetValue
=
-
1
,
fFirst
=
1
,
nJumpFrame
=
0
,
fUnfinished
=
0
;
int
nOutDigits
=
Abc_Base10Log
(
Saig_ManPoNum
(
pAig
)
-
Saig_ManConstrNum
(
pAig
)
);
int
nOutDigits
=
Abc_Base10Log
(
Saig_ManPoNum
(
pAig
)
);
int
i
,
f
,
Lit
,
status
,
clk
,
clk2
,
clkOther
=
0
,
clkTotal
=
clock
();
int
i
,
f
,
Lit
,
status
,
clk
,
clk2
,
clkOther
=
0
,
clkTotal
=
clock
();
int
nTimeToStop
=
time
(
NULL
)
+
pPars
->
nTimeOut
;
int
nTimeToStop
=
time
(
NULL
)
+
pPars
->
nTimeOut
;
if
(
pPars
->
fVerbose
&&
Aig_ManConstrNum
(
pAig
)
>
0
)
printf
(
"Performing BMC with constraints...
\n
"
);
p
=
Saig_Bmc3ManStart
(
pAig
);
p
=
Saig_Bmc3ManStart
(
pAig
);
p
->
pPars
=
pPars
;
p
->
pPars
=
pPars
;
if
(
pPars
->
fVerbose
)
if
(
pPars
->
fVerbose
)
{
{
printf
(
"Running
\"
bmc3
\"
.
AIG: PI/PO/Reg = %d/%d/%d. Node = %6d. Lev = %5d. Map =
%6d. Sect =%3d.
\n
"
,
printf
(
"Running
\"
bmc3
\"
.
PI/PO/Reg = %d/%d/%d. And =%7d. Lev =%6d. ObjNums =
%6d. Sect =%3d.
\n
"
,
Saig_ManPiNum
(
pAig
),
Saig_ManPoNum
(
pAig
),
Saig_ManRegNum
(
pAig
),
Saig_ManPiNum
(
pAig
),
Saig_ManPoNum
(
pAig
),
Saig_ManRegNum
(
pAig
),
Aig_ManNodeNum
(
pAig
),
Aig_ManLevelNum
(
pAig
),
(
Vec_IntSize
(
p
->
vMapping
)
-
Aig_ManObjNumMax
(
pAig
))
/
5
,
Vec_VecSize
(
p
->
vSects
)
);
Aig_ManNodeNum
(
pAig
),
Aig_ManLevelNum
(
pAig
),
p
->
nObjNums
,
Vec_VecSize
(
p
->
vSects
)
);
printf
(
"Params: Start = %d. FramesMax = %d. ConfLimit = %d. TimeOut = %d. SolveAll = %d.
\n
"
,
printf
(
"Params: Start = %d. FramesMax = %d. ConfLimit = %d. TimeOut = %d. SolveAll = %d.
\n
"
,
pPars
->
nStart
,
pPars
->
nFramesMax
,
pPars
->
nConfLimit
,
pPars
->
nTimeOut
,
pPars
->
fSolveAll
);
pPars
->
nStart
,
pPars
->
nFramesMax
,
pPars
->
nConfLimit
,
pPars
->
nTimeOut
,
pPars
->
fSolveAll
);
}
}
...
@@ -1225,7 +1214,6 @@ int Saig_ManBmcScalable( Aig_Man_t * pAig, Saig_ParBmc_t * pPars )
...
@@ -1225,7 +1214,6 @@ int Saig_ManBmcScalable( Aig_Man_t * pAig, Saig_ParBmc_t * pPars )
sat_solver_set_runtime_limit
(
p
->
pSat
,
nTimeToStop
);
sat_solver_set_runtime_limit
(
p
->
pSat
,
nTimeToStop
);
// perform frames
// perform frames
Aig_ManRandom
(
1
);
Aig_ManRandom
(
1
);
Saig_ManBmcMarkPis
(
pAig
,
pPars
->
nPisAbstract
);
for
(
f
=
0
;
f
<
pPars
->
nFramesMax
;
f
++
)
for
(
f
=
0
;
f
<
pPars
->
nFramesMax
;
f
++
)
{
{
// stop BMC after exploring all reachable states
// stop BMC after exploring all reachable states
...
@@ -1235,7 +1223,7 @@ int Saig_ManBmcScalable( Aig_Man_t * pAig, Saig_ParBmc_t * pPars )
...
@@ -1235,7 +1223,7 @@ int Saig_ManBmcScalable( Aig_Man_t * pAig, Saig_ParBmc_t * pPars )
return
pPars
->
nFailOuts
?
0
:
1
;
return
pPars
->
nFailOuts
?
0
:
1
;
}
}
// stop BMC if all targets are solved
// stop BMC if all targets are solved
if
(
pPars
->
fSolveAll
&&
pPars
->
nFailOuts
==
Saig_ManPoNum
(
pAig
)
-
Saig_ManConstrNum
(
pAig
)
)
if
(
pPars
->
fSolveAll
&&
pPars
->
nFailOuts
==
Saig_ManPoNum
(
pAig
)
)
{
{
Saig_Bmc3ManStop
(
p
);
Saig_Bmc3ManStop
(
p
);
return
0
;
return
0
;
...
@@ -1243,11 +1231,12 @@ int Saig_ManBmcScalable( Aig_Man_t * pAig, Saig_ParBmc_t * pPars )
...
@@ -1243,11 +1231,12 @@ int Saig_ManBmcScalable( Aig_Man_t * pAig, Saig_ParBmc_t * pPars )
// consider the next timeframe
// consider the next timeframe
if
(
RetValue
==
-
1
&&
pPars
->
nStart
==
0
&&
!
nJumpFrame
)
if
(
RetValue
==
-
1
&&
pPars
->
nStart
==
0
&&
!
nJumpFrame
)
pPars
->
iFrame
=
f
-
1
;
pPars
->
iFrame
=
f
-
1
;
// resize the array
Vec_IntFillExtra
(
p
->
vPiVars
,
(
f
+
1
)
*
Saig_ManPiNum
(
p
->
pAig
),
0
);
// map nodes of this section
// map nodes of this section
Vec_PtrPush
(
p
->
vId2Var
,
Vec_IntStartFull
(
p
->
nObjNums
)
);
Vec_PtrPush
(
p
->
vId2Var
,
Vec_IntStartFull
(
p
->
nObjNums
)
);
Vec_PtrPush
(
p
->
vTerInfo
,
(
pInfo
=
ABC_CALLOC
(
unsigned
,
p
->
nWordNum
))
);
/*
/*
// cannot remove mapping of frame values for any timeframes
// because with constant propagation they may be needed arbitrarily far
if ( f > 2*Vec_VecSize(p->vSects) )
if ( f > 2*Vec_VecSize(p->vSects) )
{
{
int iFrameOld = f - 2*Vec_VecSize( p->vSects );
int iFrameOld = f - 2*Vec_VecSize( p->vSects );
...
@@ -1257,28 +1246,15 @@ int Saig_ManBmcScalable( Aig_Man_t * pAig, Saig_ParBmc_t * pPars )
...
@@ -1257,28 +1246,15 @@ int Saig_ManBmcScalable( Aig_Man_t * pAig, Saig_ParBmc_t * pPars )
*/
*/
// prepare some nodes
// prepare some nodes
Saig_ManBmcSetLiteral
(
p
,
Aig_ManConst1
(
pAig
),
f
,
1
);
Saig_ManBmcSetLiteral
(
p
,
Aig_ManConst1
(
pAig
),
f
,
1
);
Saig_ManBmcSimInfoSet
(
pInfo
,
Aig_ManConst1
(
pAig
),
SAIG_TER_ONE
);
Saig_ManForEachPi
(
pAig
,
pObj
,
i
)
Saig_ManBmcSimInfoSet
(
pInfo
,
pObj
,
SAIG_TER_UND
);
if
(
f
==
0
)
if
(
f
==
0
)
Saig_ManForEachLo
(
p
->
pAig
,
pObj
,
i
)
Saig_ManBmcSetLiteral
(
p
,
pObj
,
0
,
0
);
// set PIs to zero if they are marked
Saig_ManForEachPi
(
p
->
pAig
,
pObj
,
i
)
if
(
pObj
->
fMarkA
)
Saig_ManBmcSetLiteral
(
p
,
pObj
,
f
,
Aig_ManRandom
(
0
)
&
1
);
// add the constraints for this frame
Saig_ManForEachPo
(
pAig
,
pObj
,
i
)
{
{
if
(
i
<
Saig_ManPoNum
(
pAig
)
-
Saig_ManConstrNum
(
pAig
)
)
Saig_ManForEachLo
(
p
->
pAig
,
pObj
,
i
)
continue
;
clk2
=
clock
();
Lit
=
Saig_ManBmcCreateCnf
(
p
,
pObj
,
f
);
Lit
=
lit_neg
(
Lit
);
clkOther
+=
clock
()
-
clk2
;
status
=
sat_solver_addclause
(
p
->
pSat
,
&
Lit
,
&
Lit
+
1
);
if
(
status
==
0
)
{
{
printf
(
"SAT problem became UNSAT after adding constraints in frame %d.
\n
"
,
f
);
Saig_ManBmcSetLiteral
(
p
,
pObj
,
0
,
0
);
Saig_Bmc3ManStop
(
p
);
Saig_ManBmcSimInfoSet
(
pInfo
,
pObj
,
SAIG_TER_ZER
);
return
1
;
}
}
}
}
if
(
(
pPars
->
nStart
&&
f
<
pPars
->
nStart
)
||
(
nJumpFrame
&&
f
<
nJumpFrame
)
)
if
(
(
pPars
->
nStart
&&
f
<
pPars
->
nStart
)
||
(
nJumpFrame
&&
f
<
nJumpFrame
)
)
...
@@ -1287,7 +1263,7 @@ clkOther += clock() - clk2;
...
@@ -1287,7 +1263,7 @@ clkOther += clock() - clk2;
clk
=
clock
();
clk
=
clock
();
Saig_ManForEachPo
(
pAig
,
pObj
,
i
)
Saig_ManForEachPo
(
pAig
,
pObj
,
i
)
{
{
if
(
i
>=
Saig_ManPoNum
(
pAig
)
-
Saig_ManConstrNum
(
pAig
)
)
if
(
i
>=
Saig_ManPoNum
(
pAig
)
)
break
;
break
;
// skip solved outputs
// skip solved outputs
if
(
p
->
vCexes
&&
Vec_PtrEntry
(
p
->
vCexes
,
i
)
)
if
(
p
->
vCexes
&&
Vec_PtrEntry
(
p
->
vCexes
,
i
)
)
...
@@ -1311,7 +1287,7 @@ clkOther += clock() - clk2;
...
@@ -1311,7 +1287,7 @@ clkOther += clock() - clk2;
}
}
pPars
->
nFailOuts
++
;
pPars
->
nFailOuts
++
;
printf
(
"Output %*d was asserted in frame %2d (solved %*d out of %*d outputs).
\n
"
,
printf
(
"Output %*d was asserted in frame %2d (solved %*d out of %*d outputs).
\n
"
,
nOutDigits
,
i
,
f
,
nOutDigits
,
pPars
->
nFailOuts
,
nOutDigits
,
Saig_ManPoNum
(
pAig
)
-
Saig_ManConstrNum
(
pAig
)
);
nOutDigits
,
i
,
f
,
nOutDigits
,
pPars
->
nFailOuts
,
nOutDigits
,
Saig_ManPoNum
(
pAig
)
);
if
(
p
->
vCexes
==
NULL
)
if
(
p
->
vCexes
==
NULL
)
p
->
vCexes
=
Vec_PtrStart
(
Saig_ManPoNum
(
pAig
)
);
p
->
vCexes
=
Vec_PtrStart
(
Saig_ManPoNum
(
pAig
)
);
Vec_PtrWriteEntry
(
p
->
vCexes
,
i
,
pCex
);
Vec_PtrWriteEntry
(
p
->
vCexes
,
i
,
pCex
);
...
@@ -1332,13 +1308,19 @@ clkOther += clock() - clk2;
...
@@ -1332,13 +1308,19 @@ clkOther += clock() - clk2;
}
}
else
if
(
status
==
l_True
)
else
if
(
status
==
l_True
)
{
{
int
*
pModel
=
Sat_SolverGetModel
(
p
->
pSat
,
Vec_IntArray
(
p
->
vPiVars
),
Vec_IntSize
(
p
->
vPiVars
)
);
Aig_Obj_t
*
pObjPi
;
Abc_Cex_t
*
pCex
=
Abc_CexCreate
(
Aig_ManRegNum
(
pAig
),
Saig_ManPiNum
(
pAig
),
pModel
,
f
,
i
,
1
);
Abc_Cex_t
*
pCex
=
Abc_CexMakeTriv
(
Aig_ManRegNum
(
pAig
),
Saig_ManPiNum
(
pAig
),
Saig_ManPoNum
(
pAig
),
f
*
Saig_ManPoNum
(
pAig
)
+
i
);
ABC_FREE
(
pModel
);
int
j
,
k
,
iBit
=
Saig_ManRegNum
(
pAig
);
for
(
j
=
0
;
j
<=
f
;
j
++
,
iBit
+=
Saig_ManPiNum
(
pAig
)
)
Saig_ManForEachPi
(
p
->
pAig
,
pObjPi
,
k
)
{
int
iLit
=
Saig_ManBmcLiteral
(
p
,
pObjPi
,
j
);
if
(
iLit
!=
~
0
&&
sat_solver_var_value
(
p
->
pSat
,
lit_var
(
iLit
))
)
Abc_InfoSetBit
(
pCex
->
pData
,
iBit
+
k
);
}
fFirst
=
0
;
fFirst
=
0
;
if
(
!
pPars
->
fSolveAll
)
if
(
!
pPars
->
fSolveAll
)
{
{
//ABC_PRT( "CNF generation runtime", clkOther );
if
(
pPars
->
fVerbose
)
if
(
pPars
->
fVerbose
)
{
{
printf
(
"%3d %s : "
,
f
,
fUnfinished
?
"-"
:
"+"
);
printf
(
"%3d %s : "
,
f
,
fUnfinished
?
"-"
:
"+"
);
...
@@ -1347,8 +1329,9 @@ clkOther += clock() - clk2;
...
@@ -1347,8 +1329,9 @@ clkOther += clock() - clk2;
printf
(
"Conf =%7.0f. "
,
(
double
)
p
->
pSat
->
stats
.
conflicts
);
printf
(
"Conf =%7.0f. "
,
(
double
)
p
->
pSat
->
stats
.
conflicts
);
printf
(
"Imp =%10.0f. "
,
(
double
)
p
->
pSat
->
stats
.
propagations
);
printf
(
"Imp =%10.0f. "
,
(
double
)
p
->
pSat
->
stats
.
propagations
);
// ABC_PRT( "Time", clock() - clk );
// ABC_PRT( "Time", clock() - clk );
printf
(
"%4.0f Mb"
,
4
.
0
*
(
f
+
1
)
*
p
->
nObjNums
/
(
1
<<
20
)
);
printf
(
"%4.0f Mb"
,
1
.
0
*
sat_solver_memory
(
p
->
pSat
)
/
(
1
<<
20
)
);
printf
(
"%9.2f sec "
,
(
float
)(
clock
()
-
clkTotal
)
/
(
float
)(
CLOCKS_PER_SEC
)
);
printf
(
"%9.2f sec "
,
(
float
)(
clock
()
-
clkTotal
)
/
(
float
)(
CLOCKS_PER_SEC
)
);
printf
(
"%5.0f Mb"
,
1
.
0
+
sat_solver_memory
(
p
->
pSat
)
/
(
1
<<
20
)
);
printf
(
"
\n
"
);
printf
(
"
\n
"
);
// ABC_PRMn( "Id2Var", (f+1)*p->nObjNums*4 );
// ABC_PRMn( "Id2Var", (f+1)*p->nObjNums*4 );
// ABC_PRMn( "SAT", 42 * p->pSat->size + 16 * (int)p->pSat->stats.clauses + 4 * (int)p->pSat->stats.clauses_literals );
// ABC_PRMn( "SAT", 42 * p->pSat->size + 16 * (int)p->pSat->stats.clauses + 4 * (int)p->pSat->stats.clauses_literals );
...
@@ -1364,7 +1347,7 @@ clkOther += clock() - clk2;
...
@@ -1364,7 +1347,7 @@ clkOther += clock() - clk2;
}
}
pPars
->
nFailOuts
++
;
pPars
->
nFailOuts
++
;
printf
(
"Output %*d was asserted in frame %2d (solved %*d out of %*d outputs).
\n
"
,
printf
(
"Output %*d was asserted in frame %2d (solved %*d out of %*d outputs).
\n
"
,
nOutDigits
,
i
,
f
,
nOutDigits
,
pPars
->
nFailOuts
,
nOutDigits
,
Saig_ManPoNum
(
pAig
)
-
Saig_ManConstrNum
(
pAig
)
);
nOutDigits
,
i
,
f
,
nOutDigits
,
pPars
->
nFailOuts
,
nOutDigits
,
Saig_ManPoNum
(
pAig
)
);
if
(
p
->
vCexes
==
NULL
)
if
(
p
->
vCexes
==
NULL
)
p
->
vCexes
=
Vec_PtrStart
(
Saig_ManPoNum
(
pAig
)
);
p
->
vCexes
=
Vec_PtrStart
(
Saig_ManPoNum
(
pAig
)
);
Vec_PtrWriteEntry
(
p
->
vCexes
,
i
,
pCex
);
Vec_PtrWriteEntry
(
p
->
vCexes
,
i
,
pCex
);
...
@@ -1409,8 +1392,10 @@ clkOther += clock() - clk2;
...
@@ -1409,8 +1392,10 @@ clkOther += clock() - clk2;
printf
(
"Conf =%7.0f. "
,(
double
)
p
->
pSat
->
stats
.
conflicts
);
printf
(
"Conf =%7.0f. "
,(
double
)
p
->
pSat
->
stats
.
conflicts
);
printf
(
"Imp =%10.0f. "
,
(
double
)
p
->
pSat
->
stats
.
propagations
);
printf
(
"Imp =%10.0f. "
,
(
double
)
p
->
pSat
->
stats
.
propagations
);
// ABC_PRT( "Time", clock() - clk );
// ABC_PRT( "Time", clock() - clk );
// printf( "%4.0f Mb", 4.0*Vec_IntSize(p->vVisited) /(1<<20) );
printf
(
"%4.0f Mb"
,
4
.
0
*
(
f
+
1
)
*
p
->
nObjNums
/
(
1
<<
20
)
);
printf
(
"%4.0f Mb"
,
1
.
0
*
sat_solver_memory
(
p
->
pSat
)
/
(
1
<<
20
)
);
printf
(
"%9.2f sec "
,
(
float
)(
clock
()
-
clkTotal
)
/
(
float
)(
CLOCKS_PER_SEC
)
);
printf
(
"%9.2f sec "
,
(
float
)(
clock
()
-
clkTotal
)
/
(
float
)(
CLOCKS_PER_SEC
)
);
printf
(
"%5.0f Mb"
,
1
.
0
+
sat_solver_memory
(
p
->
pSat
)
/
(
1
<<
20
)
);
printf
(
"
\n
"
);
printf
(
"
\n
"
);
// ABC_PRMn( "Id2Var", (f+1)*p->nObjNums*4 );
// ABC_PRMn( "Id2Var", (f+1)*p->nObjNums*4 );
// ABC_PRMn( "SAT", 42 * p->pSat->size + 16 * (int)p->pSat->stats.clauses + 4 * (int)p->pSat->stats.clauses_literals );
// ABC_PRMn( "SAT", 42 * p->pSat->size + 16 * (int)p->pSat->stats.clauses + 4 * (int)p->pSat->stats.clauses_literals );
...
...
src/base/abci/abc.c
View file @
d3c018cd
...
@@ -19927,6 +19927,11 @@ int Abc_CommandBmc3( Abc_Frame_t * pAbc, int argc, char ** argv )
...
@@ -19927,6 +19927,11 @@ int Abc_CommandBmc3( Abc_Frame_t * pAbc, int argc, char ** argv )
Abc_Print
(
-
1
,
"Does not work for combinational networks.
\n
"
);
Abc_Print
(
-
1
,
"Does not work for combinational networks.
\n
"
);
return
0
;
return
0
;
}
}
if
(
Abc_NtkConstrNum
(
pNtk
)
>
0
)
{
Abc_Print
(
-
1
,
"Constraints have to be folded (use
\"
fold
\"
).
\n
"
);
return
0
;
}
pAbc
->
Status
=
Abc_NtkDarBmc3
(
pNtk
,
pPars
,
fOrDecomp
);
pAbc
->
Status
=
Abc_NtkDarBmc3
(
pNtk
,
pPars
,
fOrDecomp
);
pAbc
->
nFrames
=
pPars
->
iFrame
;
pAbc
->
nFrames
=
pPars
->
iFrame
;
Abc_FrameReplaceCex
(
pAbc
,
&
pNtk
->
pSeqModel
);
Abc_FrameReplaceCex
(
pAbc
,
&
pNtk
->
pSeqModel
);
...
@@ -24162,10 +24167,11 @@ int Abc_CommandAbc9Frames( Abc_Frame_t * pAbc, int argc, char ** argv )
...
@@ -24162,10 +24167,11 @@ int Abc_CommandAbc9Frames( Abc_Frame_t * pAbc, int argc, char ** argv )
Gia_ParFra_t
Pars
,
*
pPars
=
&
Pars
;
Gia_ParFra_t
Pars
,
*
pPars
=
&
Pars
;
int
c
;
int
c
;
int
nCofFanLit
=
0
;
int
nCofFanLit
=
0
;
int
nNewAlgo
=
1
;
int
fNewAlgo
=
1
;
int
fInitSpecial
=
0
;
Gia_ManFraSetDefaultParams
(
pPars
);
Gia_ManFraSetDefaultParams
(
pPars
);
Extra_UtilGetoptReset
();
Extra_UtilGetoptReset
();
while
(
(
c
=
Extra_UtilGetopt
(
argc
,
argv
,
"FLiavh"
)
)
!=
EOF
)
while
(
(
c
=
Extra_UtilGetopt
(
argc
,
argv
,
"FLia
s
vh"
)
)
!=
EOF
)
{
{
switch
(
c
)
switch
(
c
)
{
{
...
@@ -24195,7 +24201,10 @@ int Abc_CommandAbc9Frames( Abc_Frame_t * pAbc, int argc, char ** argv )
...
@@ -24195,7 +24201,10 @@ int Abc_CommandAbc9Frames( Abc_Frame_t * pAbc, int argc, char ** argv )
pPars
->
fInit
^=
1
;
pPars
->
fInit
^=
1
;
break
;
break
;
case
'a'
:
case
'a'
:
nNewAlgo
^=
1
;
fNewAlgo
^=
1
;
break
;
case
's'
:
fInitSpecial
^=
1
;
break
;
break
;
case
'v'
:
case
'v'
:
pPars
->
fVerbose
^=
1
;
pPars
->
fVerbose
^=
1
;
...
@@ -24216,9 +24225,11 @@ int Abc_CommandAbc9Frames( Abc_Frame_t * pAbc, int argc, char ** argv )
...
@@ -24216,9 +24225,11 @@ int Abc_CommandAbc9Frames( Abc_Frame_t * pAbc, int argc, char ** argv )
Abc_Print
(
-
1
,
"The network is combinational.
\n
"
);
Abc_Print
(
-
1
,
"The network is combinational.
\n
"
);
return
0
;
return
0
;
}
}
if
(
nCofFanLit
)
if
(
fInitSpecial
)
pTemp
=
Gia_ManFramesInitSpecial
(
pAbc
->
pGia
,
pPars
->
nFrames
,
pPars
->
fVerbose
);
else
if
(
nCofFanLit
)
pTemp
=
Gia_ManUnrollAndCofactor
(
pAbc
->
pGia
,
pPars
->
nFrames
,
nCofFanLit
,
pPars
->
fVerbose
);
pTemp
=
Gia_ManUnrollAndCofactor
(
pAbc
->
pGia
,
pPars
->
nFrames
,
nCofFanLit
,
pPars
->
fVerbose
);
else
if
(
n
NewAlgo
)
else
if
(
f
NewAlgo
)
pTemp
=
Gia_ManFrames2
(
pAbc
->
pGia
,
pPars
);
pTemp
=
Gia_ManFrames2
(
pAbc
->
pGia
,
pPars
);
else
else
pTemp
=
Gia_ManFrames
(
pAbc
->
pGia
,
pPars
);
pTemp
=
Gia_ManFrames
(
pAbc
->
pGia
,
pPars
);
...
@@ -24226,12 +24237,13 @@ int Abc_CommandAbc9Frames( Abc_Frame_t * pAbc, int argc, char ** argv )
...
@@ -24226,12 +24237,13 @@ int Abc_CommandAbc9Frames( Abc_Frame_t * pAbc, int argc, char ** argv )
return
0
;
return
0
;
usage:
usage:
Abc_Print
(
-
2
,
"usage: &frames [-FL <num>] [-
ai
vh]
\n
"
);
Abc_Print
(
-
2
,
"usage: &frames [-FL <num>] [-
ias
vh]
\n
"
);
Abc_Print
(
-
2
,
"
\t
unrolls the design for several timeframes
\n
"
);
Abc_Print
(
-
2
,
"
\t
unrolls the design for several timeframes
\n
"
);
Abc_Print
(
-
2
,
"
\t
-F num : the number of frames to unroll [default = %d]
\n
"
,
pPars
->
nFrames
);
Abc_Print
(
-
2
,
"
\t
-F num : the number of frames to unroll [default = %d]
\n
"
,
pPars
->
nFrames
);
Abc_Print
(
-
2
,
"
\t
-L num : the limit on fanout count of resets/enables to cofactor [default = %d]
\n
"
,
nCofFanLit
);
Abc_Print
(
-
2
,
"
\t
-L num : the limit on fanout count of resets/enables to cofactor [default = %d]
\n
"
,
nCofFanLit
);
Abc_Print
(
-
2
,
"
\t
-i : toggle initializing registers [default = %s]
\n
"
,
pPars
->
fInit
?
"yes"
:
"no"
);
Abc_Print
(
-
2
,
"
\t
-i : toggle initializing registers [default = %s]
\n
"
,
pPars
->
fInit
?
"yes"
:
"no"
);
Abc_Print
(
-
2
,
"
\t
-a : toggle using new algorithm [default = %s]
\n
"
,
nNewAlgo
?
"yes"
:
"no"
);
Abc_Print
(
-
2
,
"
\t
-a : toggle using new algorithm [default = %s]
\n
"
,
fNewAlgo
?
"yes"
:
"no"
);
Abc_Print
(
-
2
,
"
\t
-s : toggle computing special AIG for BMC [default = %s]
\n
"
,
fInitSpecial
?
"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
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment