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
6119f706
Commit
6119f706
authored
Feb 28, 2011
by
Alan Mishchenko
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Cumulative update to BDD-based reachability, speeding up &reachm and other changes.
parent
39839c3f
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
269 additions
and
116 deletions
+269
-116
src/aig/llb/llb3Image.c
+178
-30
src/aig/llb/llb3Nonlin.c
+83
-84
src/aig/llb/llbInt.h
+6
-0
src/base/abci/abc.c
+2
-2
No files found.
src/aig/llb/llb3Image.c
View file @
6119f706
...
@@ -50,7 +50,6 @@ struct Llb_Mgr_t_
...
@@ -50,7 +50,6 @@ struct Llb_Mgr_t_
Vec_Ptr_t
*
vLeaves
;
// leaves in the AIG manager
Vec_Ptr_t
*
vLeaves
;
// leaves in the AIG manager
Vec_Ptr_t
*
vRoots
;
// roots in the AIG manager
Vec_Ptr_t
*
vRoots
;
// roots in the AIG manager
DdManager
*
dd
;
// working BDD manager
DdManager
*
dd
;
// working BDD manager
DdNode
*
bCurrent
;
// current state functions in terms of vLeaves
int
*
pVars2Q
;
// variables to quantify
int
*
pVars2Q
;
// variables to quantify
// internal
// internal
Llb_Prt_t
**
pParts
;
// partitions
Llb_Prt_t
**
pParts
;
// partitions
...
@@ -624,20 +623,9 @@ void Llb_NonlinAddPair( Llb_Mgr_t * p, DdNode * bFunc, int iPart, int iVar )
...
@@ -624,20 +623,9 @@ void Llb_NonlinAddPair( Llb_Mgr_t * p, DdNode * bFunc, int iPart, int iVar )
SeeAlso []
SeeAlso []
***********************************************************************/
***********************************************************************/
int
Llb_NonlinStart
(
Llb_Mgr_t
*
p
,
int
TimeOut
)
void
Llb_NonlinAddPartition
(
Llb_Mgr_t
*
p
,
int
i
,
DdNode
*
bFunc
)
{
{
Vec_Ptr_t
*
vRootBdds
;
int
k
,
nSuppSize
;
Llb_Prt_t
*
pPart
;
DdNode
*
bFunc
;
int
i
,
k
,
nSuppSize
;
// create and collect BDDs
vRootBdds
=
Llb_NonlinBuildBdds
(
p
->
pAig
,
p
->
vLeaves
,
p
->
vRoots
,
p
->
dd
,
TimeOut
);
// come referenced
if
(
vRootBdds
==
NULL
)
return
0
;
Vec_PtrPush
(
vRootBdds
,
p
->
bCurrent
);
// add pairs (refs are consumed inside)
Vec_PtrForEachEntry
(
DdNode
*
,
vRootBdds
,
bFunc
,
i
)
{
assert
(
!
Cudd_IsConstant
(
bFunc
)
);
assert
(
!
Cudd_IsConstant
(
bFunc
)
);
// create partition
// create partition
p
->
pParts
[
i
]
=
ABC_CALLOC
(
Llb_Prt_t
,
1
);
p
->
pParts
[
i
]
=
ABC_CALLOC
(
Llb_Prt_t
,
1
);
...
@@ -654,12 +642,32 @@ int Llb_NonlinStart( Llb_Mgr_t * p, int TimeOut )
...
@@ -654,12 +642,32 @@ int Llb_NonlinStart( Llb_Mgr_t * p, int TimeOut )
Llb_NonlinAddPair
(
p
,
bFunc
,
i
,
k
);
Llb_NonlinAddPair
(
p
,
bFunc
,
i
,
k
);
}
}
p
->
nSuppMax
=
ABC_MAX
(
p
->
nSuppMax
,
nSuppSize
);
p
->
nSuppMax
=
ABC_MAX
(
p
->
nSuppMax
,
nSuppSize
);
}
}
/**Function*************************************************************
Synopsis [Starts non-linear quantification scheduling.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int
Llb_NonlinStart
(
Llb_Mgr_t
*
p
,
int
TimeOut
)
{
Vec_Ptr_t
*
vRootBdds
;
DdNode
*
bFunc
;
int
i
;
// create and collect BDDs
vRootBdds
=
Llb_NonlinBuildBdds
(
p
->
pAig
,
p
->
vLeaves
,
p
->
vRoots
,
p
->
dd
,
TimeOut
);
// come referenced
if
(
vRootBdds
==
NULL
)
return
0
;
// add pairs (refs are consumed inside)
Vec_PtrForEachEntry
(
DdNode
*
,
vRootBdds
,
bFunc
,
i
)
Llb_NonlinAddPartition
(
p
,
i
,
bFunc
);
Vec_PtrFree
(
vRootBdds
);
Vec_PtrFree
(
vRootBdds
);
// remove singles
Llb_MgrForEachPart
(
p
,
pPart
,
i
)
if
(
Llb_NonlinHasSingletonVars
(
p
,
pPart
)
)
Llb_NonlinQuantify1
(
p
,
pPart
,
0
);
return
1
;
return
1
;
}
}
...
@@ -672,8 +680,7 @@ int Llb_NonlinStart( Llb_Mgr_t * p, int TimeOut )
...
@@ -672,8 +680,7 @@ int Llb_NonlinStart( Llb_Mgr_t * p, int TimeOut )
SideEffects []
SideEffects []
SeeAlso []
SeeAlso []
**********************************************************************/
***********************************************************************/
void
Llb_NonlinCheckVars
(
Llb_Mgr_t
*
p
)
void
Llb_NonlinCheckVars
(
Llb_Mgr_t
*
p
)
{
{
Llb_Var_t
*
pVar
;
Llb_Var_t
*
pVar
;
...
@@ -736,7 +743,7 @@ int Llb_NonlinNextPartitions( Llb_Mgr_t * p, Llb_Prt_t ** ppPart1, Llb_Prt_t **
...
@@ -736,7 +743,7 @@ int Llb_NonlinNextPartitions( Llb_Mgr_t * p, Llb_Prt_t ** ppPart1, Llb_Prt_t **
SeeAlso []
SeeAlso []
***********************************************************************/
***********************************************************************/
void
Llb_NonlinReorder
(
DdManager
*
dd
,
int
fVerbose
)
void
Llb_NonlinReorder
(
DdManager
*
dd
,
int
f
Twice
,
int
f
Verbose
)
{
{
int
clk
=
clock
();
int
clk
=
clock
();
if
(
fVerbose
)
if
(
fVerbose
)
...
@@ -744,9 +751,12 @@ void Llb_NonlinReorder( DdManager * dd, int fVerbose )
...
@@ -744,9 +751,12 @@ void Llb_NonlinReorder( DdManager * dd, int fVerbose )
Cudd_ReduceHeap
(
dd
,
CUDD_REORDER_SYMM_SIFT
,
100
);
Cudd_ReduceHeap
(
dd
,
CUDD_REORDER_SYMM_SIFT
,
100
);
if
(
fVerbose
)
if
(
fVerbose
)
Abc_Print
(
1
,
"After =%5d. "
,
Cudd_ReadKeys
(
dd
)
-
Cudd_ReadDead
(
dd
)
);
Abc_Print
(
1
,
"After =%5d. "
,
Cudd_ReadKeys
(
dd
)
-
Cudd_ReadDead
(
dd
)
);
if
(
fTwice
)
{
Cudd_ReduceHeap
(
dd
,
CUDD_REORDER_SYMM_SIFT
,
100
);
Cudd_ReduceHeap
(
dd
,
CUDD_REORDER_SYMM_SIFT
,
100
);
if
(
fVerbose
)
if
(
fVerbose
)
Abc_Print
(
1
,
"After =%5d. "
,
Cudd_ReadKeys
(
dd
)
-
Cudd_ReadDead
(
dd
)
);
Abc_Print
(
1
,
"After =%5d. "
,
Cudd_ReadKeys
(
dd
)
-
Cudd_ReadDead
(
dd
)
);
}
if
(
fVerbose
)
if
(
fVerbose
)
Abc_PrintTime
(
1
,
"Time"
,
clock
()
-
clk
);
Abc_PrintTime
(
1
,
"Time"
,
clock
()
-
clk
);
}
}
...
@@ -815,7 +825,7 @@ void Llb_NonlinVerifyScores( Llb_Mgr_t * p )
...
@@ -815,7 +825,7 @@ void Llb_NonlinVerifyScores( Llb_Mgr_t * p )
SeeAlso []
SeeAlso []
***********************************************************************/
***********************************************************************/
Llb_Mgr_t
*
Llb_NonlinAlloc
(
Aig_Man_t
*
pAig
,
Vec_Ptr_t
*
vLeaves
,
Vec_Ptr_t
*
vRoots
,
int
*
pVars2Q
,
DdManager
*
dd
,
DdNode
*
bCurrent
)
Llb_Mgr_t
*
Llb_NonlinAlloc
(
Aig_Man_t
*
pAig
,
Vec_Ptr_t
*
vLeaves
,
Vec_Ptr_t
*
vRoots
,
int
*
pVars2Q
,
DdManager
*
dd
)
{
{
Llb_Mgr_t
*
p
;
Llb_Mgr_t
*
p
;
p
=
ABC_CALLOC
(
Llb_Mgr_t
,
1
);
p
=
ABC_CALLOC
(
Llb_Mgr_t
,
1
);
...
@@ -823,12 +833,11 @@ Llb_Mgr_t * Llb_NonlinAlloc( Aig_Man_t * pAig, Vec_Ptr_t * vLeaves, Vec_Ptr_t *
...
@@ -823,12 +833,11 @@ Llb_Mgr_t * Llb_NonlinAlloc( Aig_Man_t * pAig, Vec_Ptr_t * vLeaves, Vec_Ptr_t *
p
->
vLeaves
=
vLeaves
;
p
->
vLeaves
=
vLeaves
;
p
->
vRoots
=
vRoots
;
p
->
vRoots
=
vRoots
;
p
->
dd
=
dd
;
p
->
dd
=
dd
;
p
->
bCurrent
=
bCurrent
;
p
->
pVars2Q
=
pVars2Q
;
p
->
pVars2Q
=
pVars2Q
;
p
->
nVars
=
Cudd_ReadSize
(
dd
);
p
->
nVars
=
Cudd_ReadSize
(
dd
);
p
->
iPartFree
=
Vec_PtrSize
(
vRoots
)
+
1
;
p
->
iPartFree
=
Vec_PtrSize
(
vRoots
);
p
->
pVars
=
ABC_CALLOC
(
Llb_Var_t
*
,
p
->
nVars
);
p
->
pVars
=
ABC_CALLOC
(
Llb_Var_t
*
,
p
->
nVars
);
p
->
pParts
=
ABC_CALLOC
(
Llb_Prt_t
*
,
2
*
p
->
iPartFree
);
p
->
pParts
=
ABC_CALLOC
(
Llb_Prt_t
*
,
2
*
p
->
iPartFree
+
2
);
p
->
pSupp
=
ABC_ALLOC
(
int
,
Cudd_ReadSize
(
dd
)
);
p
->
pSupp
=
ABC_ALLOC
(
int
,
Cudd_ReadSize
(
dd
)
);
return
p
;
return
p
;
}
}
...
@@ -880,17 +889,24 @@ DdNode * Llb_NonlinImage( Aig_Man_t * pAig, Vec_Ptr_t * vLeaves, Vec_Ptr_t * vRo
...
@@ -880,17 +889,24 @@ DdNode * Llb_NonlinImage( Aig_Man_t * pAig, Vec_Ptr_t * vLeaves, Vec_Ptr_t * vRo
int
clk
=
clock
(),
clk2
;
int
clk
=
clock
(),
clk2
;
// start the manager
// start the manager
clk2
=
clock
();
clk2
=
clock
();
p
=
Llb_NonlinAlloc
(
pAig
,
vLeaves
,
vRoots
,
pVars2Q
,
dd
,
bCurrent
);
p
=
Llb_NonlinAlloc
(
pAig
,
vLeaves
,
vRoots
,
pVars2Q
,
dd
);
if
(
!
Llb_NonlinStart
(
p
,
TimeOut
)
)
if
(
!
Llb_NonlinStart
(
p
,
TimeOut
)
)
{
{
Llb_NonlinFree
(
p
);
Llb_NonlinFree
(
p
);
return
NULL
;
return
NULL
;
}
}
// add partition
Llb_NonlinAddPartition
(
p
,
p
->
iPartFree
++
,
bCurrent
);
// remove singles
Llb_MgrForEachPart
(
p
,
pPart
,
i
)
if
(
Llb_NonlinHasSingletonVars
(
p
,
pPart
)
)
Llb_NonlinQuantify1
(
p
,
pPart
,
0
);
timeBuild
+=
clock
()
-
clk2
;
timeBuild
+=
clock
()
-
clk2
;
timeInside
=
clock
()
-
clk2
;
timeInside
=
clock
()
-
clk2
;
// compute scores
// compute scores
Llb_NonlinRecomputeScores
(
p
);
Llb_NonlinRecomputeScores
(
p
);
// save permutation
// save permutation
if
(
pOrder
)
memcpy
(
pOrder
,
dd
->
invperm
,
sizeof
(
int
)
*
dd
->
size
);
memcpy
(
pOrder
,
dd
->
invperm
,
sizeof
(
int
)
*
dd
->
size
);
// iteratively quantify variables
// iteratively quantify variables
while
(
Llb_NonlinNextPartitions
(
p
,
&
pPart1
,
&
pPart2
)
)
while
(
Llb_NonlinNextPartitions
(
p
,
&
pPart1
,
&
pPart2
)
)
...
@@ -913,6 +929,111 @@ DdNode * Llb_NonlinImage( Aig_Man_t * pAig, Vec_Ptr_t * vLeaves, Vec_Ptr_t * vRo
...
@@ -913,6 +929,111 @@ DdNode * Llb_NonlinImage( Aig_Man_t * pAig, Vec_Ptr_t * vLeaves, Vec_Ptr_t * vRo
bFunc
=
Cudd_ReadOne
(
p
->
dd
);
Cudd_Ref
(
bFunc
);
bFunc
=
Cudd_ReadOne
(
p
->
dd
);
Cudd_Ref
(
bFunc
);
Llb_MgrForEachPart
(
p
,
pPart
,
i
)
Llb_MgrForEachPart
(
p
,
pPart
,
i
)
{
{
bFunc
=
Cudd_bddAnd
(
p
->
dd
,
bTemp
=
bFunc
,
pPart
->
bFunc
);
Cudd_Ref
(
bFunc
);
Cudd_RecursiveDeref
(
p
->
dd
,
bTemp
);
}
nSuppMax
=
p
->
nSuppMax
;
Llb_NonlinFree
(
p
);
// reorder variables
if
(
fReorder
)
Llb_NonlinReorder
(
dd
,
0
,
fVerbose
);
timeOther
+=
clock
()
-
clk
-
timeInside
;
// return
Cudd_Deref
(
bFunc
);
return
bFunc
;
}
static
Llb_Mgr_t
*
p
=
NULL
;
/**Function*************************************************************
Synopsis [Starts image computation manager.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
DdManager
*
Llb_NonlinImageStart
(
Aig_Man_t
*
pAig
,
Vec_Ptr_t
*
vLeaves
,
Vec_Ptr_t
*
vRoots
,
int
*
pVars2Q
,
int
*
pOrder
,
int
fFirst
)
{
DdManager
*
dd
;
int
clk
=
clock
();
assert
(
p
==
NULL
);
// start a new manager (disable reordering)
dd
=
Cudd_Init
(
Aig_ManObjNumMax
(
pAig
),
0
,
CUDD_UNIQUE_SLOTS
,
CUDD_CACHE_SLOTS
,
0
);
Cudd_ShuffleHeap
(
dd
,
pOrder
);
// if ( fFirst )
Cudd_AutodynEnable
(
dd
,
CUDD_REORDER_SYMM_SIFT
);
// start the manager
p
=
Llb_NonlinAlloc
(
pAig
,
vLeaves
,
vRoots
,
pVars2Q
,
dd
);
if
(
!
Llb_NonlinStart
(
p
,
0
)
)
{
Llb_NonlinFree
(
p
);
return
NULL
;
}
timeBuild
+=
clock
()
-
clk
;
// if ( !fFirst )
// Cudd_AutodynEnable( dd, CUDD_REORDER_SYMM_SIFT );
return
dd
;
}
/**Function*************************************************************
Synopsis [Performs image computation.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
DdNode
*
Llb_NonlinImageCompute
(
DdNode
*
bCurrent
,
int
fReorder
,
int
fDrop
,
int
fVerbose
,
int
*
pOrder
)
{
Llb_Prt_t
*
pPart
,
*
pPart1
,
*
pPart2
;
DdNode
*
bFunc
,
*
bTemp
;
int
i
,
nReorders
,
timeInside
=
0
;
int
clk
=
clock
(),
clk2
;
// add partition
Llb_NonlinAddPartition
(
p
,
p
->
iPartFree
++
,
bCurrent
);
// remove singles
Llb_MgrForEachPart
(
p
,
pPart
,
i
)
if
(
Llb_NonlinHasSingletonVars
(
p
,
pPart
)
)
Llb_NonlinQuantify1
(
p
,
pPart
,
0
);
// reorder
if
(
fReorder
)
Llb_NonlinReorder
(
p
->
dd
,
0
,
0
);
// save permutation
memcpy
(
pOrder
,
p
->
dd
->
invperm
,
sizeof
(
int
)
*
p
->
dd
->
size
);
// compute scores
Llb_NonlinRecomputeScores
(
p
);
// iteratively quantify variables
while
(
Llb_NonlinNextPartitions
(
p
,
&
pPart1
,
&
pPart2
)
)
{
clk2
=
clock
();
nReorders
=
Cudd_ReadReorderings
(
p
->
dd
);
if
(
!
Llb_NonlinQuantify2
(
p
,
pPart1
,
pPart2
,
0
,
0
)
)
{
Llb_NonlinFree
(
p
);
return
NULL
;
}
timeAndEx
+=
clock
()
-
clk2
;
timeInside
+=
clock
()
-
clk2
;
if
(
nReorders
<
Cudd_ReadReorderings
(
p
->
dd
)
)
Llb_NonlinRecomputeScores
(
p
);
// else
// Llb_NonlinVerifyScores( p );
}
// load partitions
bFunc
=
Cudd_ReadOne
(
p
->
dd
);
Cudd_Ref
(
bFunc
);
Llb_MgrForEachPart
(
p
,
pPart
,
i
)
{
bFunc
=
Cudd_bddAnd
(
p
->
dd
,
bTemp
=
bFunc
,
pPart
->
bFunc
);
bFunc
=
Cudd_bddAnd
(
p
->
dd
,
bTemp
=
bFunc
,
pPart
->
bFunc
);
if
(
bFunc
==
NULL
)
if
(
bFunc
==
NULL
)
{
{
...
@@ -924,16 +1045,43 @@ DdNode * Llb_NonlinImage( Aig_Man_t * pAig, Vec_Ptr_t * vLeaves, Vec_Ptr_t * vRo
...
@@ -924,16 +1045,43 @@ DdNode * Llb_NonlinImage( Aig_Man_t * pAig, Vec_Ptr_t * vLeaves, Vec_Ptr_t * vRo
Cudd_RecursiveDeref
(
p
->
dd
,
bTemp
);
Cudd_RecursiveDeref
(
p
->
dd
,
bTemp
);
}
}
nSuppMax
=
p
->
nSuppMax
;
nSuppMax
=
p
->
nSuppMax
;
Llb_NonlinFree
(
p
);
// reorder variables
// reorder variables
if
(
fReorder
)
// if ( fReorder )
Llb_NonlinReorder
(
dd
,
fVerbose
);
// Llb_NonlinReorder( p->dd, 0, fVerbose );
// save permutation
// memcpy( pOrder, p->dd->invperm, sizeof(int) * Cudd_ReadSize(p->dd) );
timeOther
+=
clock
()
-
clk
-
timeInside
;
timeOther
+=
clock
()
-
clk
-
timeInside
;
// return
// return
Cudd_Deref
(
bFunc
);
Cudd_Deref
(
bFunc
);
return
bFunc
;
return
bFunc
;
}
}
/**Function*************************************************************
Synopsis [Quits image computation manager.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void
Llb_NonlinImageQuit
()
{
DdManager
*
dd
;
if
(
p
==
NULL
)
return
;
dd
=
p
->
dd
;
Llb_NonlinFree
(
p
);
if
(
dd
->
bFunc
)
Cudd_RecursiveDeref
(
dd
,
dd
->
bFunc
);
Extra_StopManager
(
dd
);
// Cudd_Quit ( dd );
p
=
NULL
;
}
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
...
...
src/aig/llb/llb3Nonlin.c
View file @
6119f706
...
@@ -42,13 +42,18 @@ struct Llb_Mnn_t_
...
@@ -42,13 +42,18 @@ struct Llb_Mnn_t_
Vec_Ptr_t
*
vLeaves
;
Vec_Ptr_t
*
vLeaves
;
Vec_Ptr_t
*
vRoots
;
Vec_Ptr_t
*
vRoots
;
int
*
pVars2Q
;
int
*
pVars2Q
;
int
*
pOrder
;
int
*
pOrderL
;
int
*
pOrderL2
;
int
*
pOrderG
;
Vec_Int_t
*
vCs2Glo
;
// cur state variables into global variables
Vec_Int_t
*
vCs2Glo
;
// cur state variables into global variables
Vec_Int_t
*
vNs2Glo
;
// next state variables into global variables
Vec_Int_t
*
vNs2Glo
;
// next state variables into global variables
Vec_Int_t
*
vGlo2Cs
;
// global variables into cur state variables
Vec_Int_t
*
vGlo2Cs
;
// global variables into cur state variables
Vec_Int_t
*
vGlo2Ns
;
// global variables into next state variables
Vec_Int_t
*
vGlo2Ns
;
// global variables into next state variables
int
ddLocReos
;
int
ddLocGrbs
;
int
timeImage
;
int
timeImage
;
int
timeTran1
;
int
timeTran1
;
int
timeTran2
;
int
timeTran2
;
...
@@ -297,7 +302,7 @@ Abc_Cex_t * Llb_NonlinDeriveCex( Llb_Mnn_t * p )
...
@@ -297,7 +302,7 @@ Abc_Cex_t * Llb_NonlinDeriveCex( Llb_Mnn_t * p )
//Extra_bddPrintSupport( p->dd, bRing ); printf( "\n" );
//Extra_bddPrintSupport( p->dd, bRing ); printf( "\n" );
// compute the next states
// compute the next states
bImage
=
Llb_NonlinImage
(
p
->
pAig
,
p
->
vLeaves
,
p
->
vRoots
,
p
->
pVars2Q
,
p
->
dd
,
bState
,
bImage
=
Llb_NonlinImage
(
p
->
pAig
,
p
->
vLeaves
,
p
->
vRoots
,
p
->
pVars2Q
,
p
->
dd
,
bState
,
p
->
pPars
->
fReorder
,
p
->
pPars
->
fVeryVerbose
,
p
->
pOrder
,
ABC_INFINITY
,
ABC_INFINITY
);
// consumed reference
p
->
pPars
->
fReorder
,
p
->
pPars
->
fVeryVerbose
,
NULL
,
ABC_INFINITY
,
ABC_INFINITY
);
// consumed reference
assert
(
bImage
!=
NULL
);
assert
(
bImage
!=
NULL
);
Cudd_Ref
(
bImage
);
Cudd_Ref
(
bImage
);
//Extra_bddPrintSupport( p->dd, bImage ); printf( "\n" );
//Extra_bddPrintSupport( p->dd, bImage ); printf( "\n" );
...
@@ -393,10 +398,37 @@ int Llb_NonlinReoHook( DdManager * dd, char * Type, void * Method )
...
@@ -393,10 +398,37 @@ int Llb_NonlinReoHook( DdManager * dd, char * Type, void * Method )
SeeAlso []
SeeAlso []
***********************************************************************/
***********************************************************************/
int
Llb_NonlinCompPerms
(
DdManager
*
dd
,
int
*
pVar2Lev
)
{
DdSubtable
*
pSubt
;
int
i
,
Sum
=
0
,
Entry
;
for
(
i
=
0
;
i
<
dd
->
size
;
i
++
)
{
pSubt
=
&
(
dd
->
subtables
[
dd
->
perm
[
i
]]);
if
(
pSubt
->
keys
==
pSubt
->
dead
+
1
)
continue
;
Entry
=
ABC_MAX
(
dd
->
perm
[
i
],
pVar2Lev
[
i
])
-
ABC_MIN
(
dd
->
perm
[
i
],
pVar2Lev
[
i
]);
Sum
+=
Entry
;
//printf( "%d-%d(%d) ", dd->perm[i], pV2L[i], Entry );
}
return
Sum
;
}
/**Function*************************************************************
Synopsis [Perform reachability with hints.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int
Llb_NonlinReachability
(
Llb_Mnn_t
*
p
)
int
Llb_NonlinReachability
(
Llb_Mnn_t
*
p
)
{
{
DdNode
*
b
Current
,
*
bNext
,
*
bTemp
;
DdNode
*
b
Temp
,
*
bNext
;
int
iVar
,
nIters
,
nBddSize0
,
nBddSize
,
Limit
=
p
->
pPars
->
nBddMax
;
int
nIters
,
nBddSize0
,
nBddSize
,
NumCmp
,
Limit
=
p
->
pPars
->
nBddMax
;
int
clk2
,
clk3
,
clk
=
clock
();
int
clk2
,
clk3
,
clk
=
clock
();
assert
(
Aig_ManRegNum
(
p
->
pAig
)
>
0
);
assert
(
Aig_ManRegNum
(
p
->
pAig
)
>
0
);
...
@@ -425,7 +457,9 @@ int Llb_NonlinReachability( Llb_Mnn_t * p )
...
@@ -425,7 +457,9 @@ int Llb_NonlinReachability( Llb_Mnn_t * p )
}
}
Cudd_Ref
(
p
->
ddR
->
bFunc
);
Cudd_Ref
(
p
->
ddR
->
bFunc
);
// compute the starting set of states
// compute the starting set of states
bCurrent
=
Llb_NonlinComputeInitState
(
p
->
pAig
,
p
->
dd
);
Cudd_Ref
(
bCurrent
);
Cudd_Quit
(
p
->
dd
);
p
->
dd
=
Llb_NonlinImageStart
(
p
->
pAig
,
p
->
vLeaves
,
p
->
vRoots
,
p
->
pVars2Q
,
p
->
pOrderL
,
1
);
p
->
dd
->
bFunc
=
Llb_NonlinComputeInitState
(
p
->
pAig
,
p
->
dd
);
Cudd_Ref
(
p
->
dd
->
bFunc
);
// current
p
->
ddG
->
bFunc
=
Llb_NonlinComputeInitState
(
p
->
pAig
,
p
->
ddG
);
Cudd_Ref
(
p
->
ddG
->
bFunc
);
// reached
p
->
ddG
->
bFunc
=
Llb_NonlinComputeInitState
(
p
->
pAig
,
p
->
ddG
);
Cudd_Ref
(
p
->
ddG
->
bFunc
);
// reached
p
->
ddG
->
bFunc2
=
Llb_NonlinComputeInitState
(
p
->
pAig
,
p
->
ddG
);
Cudd_Ref
(
p
->
ddG
->
bFunc2
);
// frontier
p
->
ddG
->
bFunc2
=
Llb_NonlinComputeInitState
(
p
->
pAig
,
p
->
ddG
);
Cudd_Ref
(
p
->
ddG
->
bFunc2
);
// frontier
for
(
nIters
=
0
;
nIters
<
p
->
pPars
->
nIterMax
;
nIters
++
)
for
(
nIters
=
0
;
nIters
<
p
->
pPars
->
nIterMax
;
nIters
++
)
...
@@ -437,18 +471,18 @@ int Llb_NonlinReachability( Llb_Mnn_t * p )
...
@@ -437,18 +471,18 @@ int Llb_NonlinReachability( Llb_Mnn_t * p )
if
(
!
p
->
pPars
->
fSilent
)
if
(
!
p
->
pPars
->
fSilent
)
printf
(
"Reached timeout (%d seconds) during image computation.
\n
"
,
p
->
pPars
->
TimeLimit
);
printf
(
"Reached timeout (%d seconds) during image computation.
\n
"
,
p
->
pPars
->
TimeLimit
);
p
->
pPars
->
iFrame
=
nIters
-
1
;
p
->
pPars
->
iFrame
=
nIters
-
1
;
Cudd_RecursiveDeref
(
p
->
dd
,
bCurrent
);
bCurrent
=
NULL
;
Llb_NonlinImageQuit
()
;
return
-
1
;
return
-
1
;
}
}
// save the onion ring
// save the onion ring
bTemp
=
Extra_TransferPermute
(
p
->
dd
,
p
->
ddR
,
bCurrent
,
Vec_IntArray
(
p
->
vCs2Glo
)
);
bTemp
=
Extra_TransferPermute
(
p
->
dd
,
p
->
ddR
,
p
->
dd
->
bFunc
,
Vec_IntArray
(
p
->
vCs2Glo
)
);
if
(
bTemp
==
NULL
)
if
(
bTemp
==
NULL
)
{
{
if
(
!
p
->
pPars
->
fSilent
)
if
(
!
p
->
pPars
->
fSilent
)
printf
(
"Reached timeout (%d seconds) during ring transfer.
\n
"
,
p
->
pPars
->
TimeLimit
);
printf
(
"Reached timeout (%d seconds) during ring transfer.
\n
"
,
p
->
pPars
->
TimeLimit
);
p
->
pPars
->
iFrame
=
nIters
-
1
;
p
->
pPars
->
iFrame
=
nIters
-
1
;
Cudd_RecursiveDeref
(
p
->
dd
,
bCurrent
);
bCurrent
=
NULL
;
Llb_NonlinImageQuit
()
;
return
-
1
;
return
-
1
;
}
}
Cudd_Ref
(
bTemp
);
Cudd_Ref
(
bTemp
);
...
@@ -460,7 +494,6 @@ int Llb_NonlinReachability( Llb_Mnn_t * p )
...
@@ -460,7 +494,6 @@ int Llb_NonlinReachability( Llb_Mnn_t * p )
assert
(
p
->
pInit
->
pSeqModel
==
NULL
);
assert
(
p
->
pInit
->
pSeqModel
==
NULL
);
if
(
!
p
->
pPars
->
fBackward
)
if
(
!
p
->
pPars
->
fBackward
)
p
->
pInit
->
pSeqModel
=
Llb_NonlinDeriveCex
(
p
);
p
->
pInit
->
pSeqModel
=
Llb_NonlinDeriveCex
(
p
);
Cudd_RecursiveDeref
(
p
->
dd
,
bCurrent
);
bCurrent
=
NULL
;
if
(
!
p
->
pPars
->
fSilent
)
if
(
!
p
->
pPars
->
fSilent
)
{
{
if
(
!
p
->
pPars
->
fBackward
)
if
(
!
p
->
pPars
->
fBackward
)
...
@@ -469,85 +502,32 @@ int Llb_NonlinReachability( Llb_Mnn_t * p )
...
@@ -469,85 +502,32 @@ int Llb_NonlinReachability( Llb_Mnn_t * p )
printf
(
"Output ??? was asserted in frame %d (counter-example is not produced). "
,
nIters
);
printf
(
"Output ??? was asserted in frame %d (counter-example is not produced). "
,
nIters
);
Abc_PrintTime
(
1
,
"Time"
,
clock
()
-
clk
);
Abc_PrintTime
(
1
,
"Time"
,
clock
()
-
clk
);
}
}
Llb_NonlinImageQuit
();
return
0
;
return
0
;
}
}
// check the size
if
(
Cudd_DagSize
(
bCurrent
)
>
p
->
pPars
->
nBddMax
)
{
DdNode
*
bVar
,
*
bVarG
;
// find the best variable
iVar
=
Llb_NonlinFindBestVar
(
p
->
dd
,
bCurrent
,
p
->
pAig
);
// get cofactor in the working manager
bVar
=
Cudd_bddIthVar
(
p
->
dd
,
Aig_ObjId
(
Saig_ManLo
(
p
->
pAig
,
iVar
))
);
bCurrent
=
Cudd_bddAnd
(
p
->
dd
,
bTemp
=
bCurrent
,
Cudd_Not
(
bVar
)
);
Cudd_Ref
(
bCurrent
);
Cudd_RecursiveDeref
(
p
->
dd
,
bTemp
);
// get cofactor in the global manager
bVarG
=
Cudd_bddIthVar
(
p
->
ddG
,
iVar
);
p
->
ddG
->
bFunc2
=
Cudd_bddAnd
(
p
->
ddG
,
bTemp
=
p
->
ddG
->
bFunc2
,
Cudd_Not
(
bVarG
)
);
Cudd_Ref
(
p
->
ddG
->
bFunc2
);
Cudd_RecursiveDeref
(
p
->
ddG
,
bTemp
);
}
// compute the next states
// compute the next states
clk3
=
clock
();
clk3
=
clock
();
nBddSize0
=
Cudd_DagSize
(
bCurrent
);
nBddSize0
=
Cudd_DagSize
(
p
->
dd
->
bFunc
);
bNext
=
Llb_NonlinImage
(
p
->
pAig
,
p
->
vLeaves
,
p
->
vRoots
,
p
->
pVars2Q
,
p
->
dd
,
bCurrent
,
bNext
=
Llb_NonlinImageCompute
(
p
->
dd
->
bFunc
,
p
->
pPars
->
fReorder
,
0
,
1
,
p
->
pOrderL
);
// consumes ref
// p->pPars->fReorder, p->pPars->fVeryVerbose, p->pOrder, nIters ? p->pPars->nBddMax : ABC_INFINITY );
// bNext = Llb_NonlinImage( p->pAig, p->vLeaves, p->vRoots, p->pVars2Q, p->dd, bCurrent,
p
->
pPars
->
fReorder
,
p
->
pPars
->
fVeryVerbose
,
p
->
pOrder
,
ABC_INFINITY
,
p
->
pPars
->
TimeTarget
);
// p->pPars->fReorder, p->pPars->fVeryVerbose, NULL, ABC_INFINITY, p->pPars->TimeTarget );
// Abc_PrintTime( 1, "Image time", clock() - clk3 );
if
(
bNext
==
NULL
)
if
(
bNext
==
NULL
)
{
{
if
(
!
p
->
pPars
->
fSilent
)
if
(
!
p
->
pPars
->
fSilent
)
printf
(
"Reached timeout (%d seconds) during image computation in quantification.
\n
"
,
p
->
pPars
->
TimeLimit
);
printf
(
"Reached timeout (%d seconds) during image computation in quantification.
\n
"
,
p
->
pPars
->
TimeLimit
);
p
->
pPars
->
iFrame
=
nIters
-
1
;
p
->
pPars
->
iFrame
=
nIters
-
1
;
Cudd_RecursiveDeref
(
p
->
dd
,
bCurrent
);
bCurrent
=
NULL
;
Llb_NonlinImageQuit
()
;
return
-
1
;
return
-
1
;
}
}
if
(
bNext
==
NULL
)
// Llb_NonlimImage() consumes reference of bCurrent!!!
{
DdNode
*
bVar
,
*
bVarG
;
// if ( !p->pPars->fSilent )
// printf( "Reached timeout during image computation (%d seconds).\n", p->pPars->TimeLimit );
// p->pPars->iFrame = nIters - 1;
// return -1;
printf
(
"Should never happen!
\n
"
);
// get the frontier in the working manager
bCurrent
=
Extra_TransferPermute
(
p
->
ddG
,
p
->
dd
,
p
->
ddG
->
bFunc2
,
Vec_IntArray
(
p
->
vGlo2Cs
)
);
Cudd_Ref
(
bCurrent
);
// find the best variable
iVar
=
Llb_NonlinFindBestVar
(
p
->
dd
,
bCurrent
,
p
->
pAig
);
// get cofactor in the working manager
bVar
=
Cudd_bddIthVar
(
p
->
dd
,
Aig_ObjId
(
Saig_ManLo
(
p
->
pAig
,
iVar
))
);
bCurrent
=
Cudd_bddAnd
(
p
->
dd
,
bTemp
=
bCurrent
,
Cudd_Not
(
bVar
)
);
Cudd_Ref
(
bCurrent
);
Cudd_RecursiveDeref
(
p
->
dd
,
bTemp
);
// get cofactor in the global manager
bVarG
=
Cudd_bddIthVar
(
p
->
dd
,
iVar
);
p
->
ddG
->
bFunc2
=
Cudd_bddAnd
(
p
->
ddG
,
bTemp
=
p
->
ddG
->
bFunc2
,
Cudd_Not
(
bVarG
)
);
Cudd_Ref
(
p
->
ddG
->
bFunc2
);
Cudd_RecursiveDeref
(
p
->
ddG
,
bTemp
);
// Cudd_ReduceHeap( p->dd, CUDD_REORDER_SIFT, 1 );
p
->
pPars
->
nBddMax
=
ABC_INFINITY
;
nIters
--
;
continue
;
}
else
p
->
pPars
->
nBddMax
=
Limit
;
Cudd_Ref
(
bNext
);
Cudd_Ref
(
bNext
);
nBddSize
=
Cudd_DagSize
(
bNext
);
nBddSize
=
Cudd_DagSize
(
bNext
);
p
->
timeImage
+=
clock
()
-
clk3
;
p
->
timeImage
+=
clock
()
-
clk3
;
// transfer to the state manager
// transfer to the state manager
clk3
=
clock
();
clk3
=
clock
();
Cudd_RecursiveDeref
(
p
->
ddG
,
p
->
ddG
->
bFunc2
);
Cudd_RecursiveDeref
(
p
->
ddG
,
p
->
ddG
->
bFunc2
);
// p->ddG->bFunc2 = Extra_TransferPermuteTime( p->dd, p->ddG, bNext, Vec_IntArray(p->vNs2Glo), p->pPars->TimeTarget );
p
->
ddG
->
bFunc2
=
Extra_TransferPermute
(
p
->
dd
,
p
->
ddG
,
bNext
,
Vec_IntArray
(
p
->
vNs2Glo
)
);
p
->
ddG
->
bFunc2
=
Extra_TransferPermute
(
p
->
dd
,
p
->
ddG
,
bNext
,
Vec_IntArray
(
p
->
vNs2Glo
)
);
if
(
p
->
ddG
->
bFunc2
==
NULL
)
if
(
p
->
ddG
->
bFunc2
==
NULL
)
{
{
...
@@ -555,12 +535,24 @@ int Llb_NonlinReachability( Llb_Mnn_t * p )
...
@@ -555,12 +535,24 @@ int Llb_NonlinReachability( Llb_Mnn_t * p )
printf
(
"Reached timeout (%d seconds) during image computation in transfer 1.
\n
"
,
p
->
pPars
->
TimeLimit
);
printf
(
"Reached timeout (%d seconds) during image computation in transfer 1.
\n
"
,
p
->
pPars
->
TimeLimit
);
p
->
pPars
->
iFrame
=
nIters
-
1
;
p
->
pPars
->
iFrame
=
nIters
-
1
;
Cudd_RecursiveDeref
(
p
->
dd
,
bNext
);
Cudd_RecursiveDeref
(
p
->
dd
,
bNext
);
Llb_NonlinImageQuit
();
return
-
1
;
return
-
1
;
}
}
Cudd_Ref
(
p
->
ddG
->
bFunc2
);
Cudd_Ref
(
p
->
ddG
->
bFunc2
);
Cudd_RecursiveDeref
(
p
->
dd
,
bNext
);
Cudd_RecursiveDeref
(
p
->
dd
,
bNext
);
p
->
timeTran1
+=
clock
()
-
clk3
;
p
->
timeTran1
+=
clock
()
-
clk3
;
// save permutation
NumCmp
=
Llb_NonlinCompPerms
(
p
->
dd
,
p
->
pOrderL2
);
// save order before image computation
memcpy
(
p
->
pOrderL2
,
p
->
dd
->
perm
,
sizeof
(
int
)
*
p
->
dd
->
size
);
// update the image computation manager
p
->
timeReo
+=
Cudd_ReadReorderingTime
(
p
->
dd
);
p
->
ddLocReos
+=
Cudd_ReadReorderings
(
p
->
dd
);
p
->
ddLocGrbs
+=
Cudd_ReadGarbageCollections
(
p
->
dd
);
Llb_NonlinImageQuit
();
p
->
dd
=
Llb_NonlinImageStart
(
p
->
pAig
,
p
->
vLeaves
,
p
->
vRoots
,
p
->
pVars2Q
,
p
->
pOrderL
,
0
);
// derive new states
// derive new states
clk3
=
clock
();
clk3
=
clock
();
p
->
ddG
->
bFunc2
=
Cudd_bddAnd
(
p
->
ddG
,
bTemp
=
p
->
ddG
->
bFunc2
,
Cudd_Not
(
p
->
ddG
->
bFunc
)
);
p
->
ddG
->
bFunc2
=
Cudd_bddAnd
(
p
->
ddG
,
bTemp
=
p
->
ddG
->
bFunc2
,
Cudd_Not
(
p
->
ddG
->
bFunc
)
);
...
@@ -570,6 +562,7 @@ int Llb_NonlinReachability( Llb_Mnn_t * p )
...
@@ -570,6 +562,7 @@ int Llb_NonlinReachability( Llb_Mnn_t * p )
printf
(
"Reached timeout (%d seconds) during image computation in transfer 1.
\n
"
,
p
->
pPars
->
TimeLimit
);
printf
(
"Reached timeout (%d seconds) during image computation in transfer 1.
\n
"
,
p
->
pPars
->
TimeLimit
);
p
->
pPars
->
iFrame
=
nIters
-
1
;
p
->
pPars
->
iFrame
=
nIters
-
1
;
Cudd_RecursiveDeref
(
p
->
ddG
,
bTemp
);
Cudd_RecursiveDeref
(
p
->
ddG
,
bTemp
);
Llb_NonlinImageQuit
();
return
-
1
;
return
-
1
;
}
}
Cudd_Ref
(
p
->
ddG
->
bFunc2
);
Cudd_Ref
(
p
->
ddG
->
bFunc2
);
...
@@ -584,6 +577,7 @@ int Llb_NonlinReachability( Llb_Mnn_t * p )
...
@@ -584,6 +577,7 @@ int Llb_NonlinReachability( Llb_Mnn_t * p )
printf
(
"Reached timeout (%d seconds) during image computation in transfer 1.
\n
"
,
p
->
pPars
->
TimeLimit
);
printf
(
"Reached timeout (%d seconds) during image computation in transfer 1.
\n
"
,
p
->
pPars
->
TimeLimit
);
p
->
pPars
->
iFrame
=
nIters
-
1
;
p
->
pPars
->
iFrame
=
nIters
-
1
;
Cudd_RecursiveDeref
(
p
->
ddG
,
bTemp
);
Cudd_RecursiveDeref
(
p
->
ddG
,
bTemp
);
Llb_NonlinImageQuit
();
return
-
1
;
return
-
1
;
}
}
Cudd_Ref
(
p
->
ddG
->
bFunc
);
Cudd_Ref
(
p
->
ddG
->
bFunc
);
...
@@ -593,20 +587,20 @@ int Llb_NonlinReachability( Llb_Mnn_t * p )
...
@@ -593,20 +587,20 @@ int Llb_NonlinReachability( Llb_Mnn_t * p )
// reset permutation
// reset permutation
// RetValue = Cudd_CheckZeroRef( dd );
// RetValue = Cudd_CheckZeroRef( dd );
// assert( RetValue == 0 );
// assert( RetValue == 0 );
// Cudd_ShuffleHeap( dd, pOrder );
// Cudd_ShuffleHeap( dd, pOrder
G
);
// move new states to the working manager
// move new states to the working manager
clk3
=
clock
();
clk3
=
clock
();
// bCurrent = Extra_TransferPermuteTime( p->ddG, p->dd, p->ddG->bFunc2, Vec_IntArray(p->vGlo2Cs), p->pPars->TimeTarget );
p
->
dd
->
bFunc
=
Extra_TransferPermute
(
p
->
ddG
,
p
->
dd
,
p
->
ddG
->
bFunc2
,
Vec_IntArray
(
p
->
vGlo2Cs
)
);
bCurrent
=
Extra_TransferPermute
(
p
->
ddG
,
p
->
dd
,
p
->
ddG
->
bFunc2
,
Vec_IntArray
(
p
->
vGlo2Cs
)
);
if
(
p
->
dd
->
bFunc
==
NULL
)
if
(
bCurrent
==
NULL
)
{
{
if
(
!
p
->
pPars
->
fSilent
)
if
(
!
p
->
pPars
->
fSilent
)
printf
(
"Reached timeout (%d seconds) during image computation in transfer 2.
\n
"
,
p
->
pPars
->
TimeLimit
);
printf
(
"Reached timeout (%d seconds) during image computation in transfer 2.
\n
"
,
p
->
pPars
->
TimeLimit
);
p
->
pPars
->
iFrame
=
nIters
-
1
;
p
->
pPars
->
iFrame
=
nIters
-
1
;
Llb_NonlinImageQuit
();
return
-
1
;
return
-
1
;
}
}
Cudd_Ref
(
bCurrent
);
Cudd_Ref
(
p
->
dd
->
bFunc
);
p
->
timeTran2
+=
clock
()
-
clk3
;
p
->
timeTran2
+=
clock
()
-
clk3
;
// report the results
// report the results
...
@@ -615,11 +609,14 @@ int Llb_NonlinReachability( Llb_Mnn_t * p )
...
@@ -615,11 +609,14 @@ int Llb_NonlinReachability( Llb_Mnn_t * p )
printf
(
"I =%3d : "
,
nIters
);
printf
(
"I =%3d : "
,
nIters
);
printf
(
"Fr =%7d "
,
nBddSize0
);
printf
(
"Fr =%7d "
,
nBddSize0
);
printf
(
"Im =%7d "
,
nBddSize
);
printf
(
"Im =%7d "
,
nBddSize
);
printf
(
"(%4d %4d) "
,
Cudd_ReadReorderings
(
p
->
dd
),
Cudd_ReadGarbageCollections
(
p
->
dd
)
);
printf
(
"(%4d %4d) "
,
p
->
ddLocReos
,
p
->
ddLocGrbs
);
printf
(
"Rea =%6d "
,
Cudd_DagSize
(
p
->
ddG
->
bFunc
)
);
printf
(
"Rea =%6d "
,
Cudd_DagSize
(
p
->
ddG
->
bFunc
)
);
printf
(
"(%4d %4d) "
,
Cudd_ReadReorderings
(
p
->
ddG
),
Cudd_ReadGarbageCollections
(
p
->
ddG
)
);
printf
(
"(%4d %4d) "
,
Cudd_ReadReorderings
(
p
->
ddG
),
Cudd_ReadGarbageCollections
(
p
->
ddG
)
);
printf
(
"S =%4d "
,
nSuppMax
);
printf
(
"S =%4d "
,
nSuppMax
);
printf
(
"cL =%5d "
,
NumCmp
);
printf
(
"cG =%5d "
,
Llb_NonlinCompPerms
(
p
->
ddG
,
p
->
pOrderG
)
);
Abc_PrintTime
(
1
,
"T"
,
clock
()
-
clk2
);
Abc_PrintTime
(
1
,
"T"
,
clock
()
-
clk2
);
memcpy
(
p
->
pOrderG
,
p
->
ddG
->
perm
,
sizeof
(
int
)
*
p
->
ddG
->
size
);
}
}
/*
/*
if ( pPars->fVerbose )
if ( pPars->fVerbose )
...
@@ -630,18 +627,16 @@ int Llb_NonlinReachability( Llb_Mnn_t * p )
...
@@ -630,18 +627,16 @@ int Llb_NonlinReachability( Llb_Mnn_t * p )
fflush( stdout );
fflush( stdout );
}
}
*/
*/
if
(
nIters
==
p
->
pPars
->
nIterMax
-
1
)
if
(
nIters
==
p
->
pPars
->
nIterMax
-
1
)
{
{
if
(
!
p
->
pPars
->
fSilent
)
if
(
!
p
->
pPars
->
fSilent
)
printf
(
"Reached limit on the number of timeframes (%d).
\n
"
,
p
->
pPars
->
nIterMax
);
printf
(
"Reached limit on the number of timeframes (%d).
\n
"
,
p
->
pPars
->
nIterMax
);
p
->
pPars
->
iFrame
=
nIters
;
p
->
pPars
->
iFrame
=
nIters
;
Cudd_RecursiveDeref
(
p
->
dd
,
bCurrent
);
bCurrent
=
NULL
;
Llb_NonlinImageQuit
()
;
return
-
1
;
return
-
1
;
}
}
// Llb_NonlinReorder( p->ddG, 1 );
// Llb_NonlinFindBestVar( p->ddG, bReached, NULL );
}
}
Llb_NonlinImageQuit
();
// report the stats
// report the stats
if
(
p
->
pPars
->
fVerbose
)
if
(
p
->
pPars
->
fVerbose
)
...
@@ -704,10 +699,14 @@ Llb_Mnn_t * Llb_MnnStart( Aig_Man_t * pInit, Aig_Man_t * pAig, Gia_ParLlb_t * p
...
@@ -704,10 +699,14 @@ Llb_Mnn_t * Llb_MnnStart( Aig_Man_t * pInit, Aig_Man_t * pAig, Gia_ParLlb_t * p
Saig_ManForEachLi
(
pAig
,
pObj
,
i
)
Saig_ManForEachLi
(
pAig
,
pObj
,
i
)
Vec_PtrPush
(
p
->
vRoots
,
pObj
);
Vec_PtrPush
(
p
->
vRoots
,
pObj
);
// variables to quantify
// variables to quantify
p
->
pOrder
=
ABC_CALLOC
(
int
,
Aig_ManObjNumMax
(
pAig
)
);
p
->
pOrderL
=
ABC_CALLOC
(
int
,
Aig_ManObjNumMax
(
pAig
)
);
p
->
pOrderL2
=
ABC_CALLOC
(
int
,
Aig_ManObjNumMax
(
pAig
)
);
p
->
pOrderG
=
ABC_CALLOC
(
int
,
Aig_ManObjNumMax
(
pAig
)
);
p
->
pVars2Q
=
ABC_CALLOC
(
int
,
Aig_ManObjNumMax
(
pAig
)
);
p
->
pVars2Q
=
ABC_CALLOC
(
int
,
Aig_ManObjNumMax
(
pAig
)
);
Aig_ManForEachPi
(
pAig
,
pObj
,
i
)
Aig_ManForEachPi
(
pAig
,
pObj
,
i
)
p
->
pVars2Q
[
Aig_ObjId
(
pObj
)]
=
1
;
p
->
pVars2Q
[
Aig_ObjId
(
pObj
)]
=
1
;
for
(
i
=
0
;
i
<
Aig_ManObjNumMax
(
pAig
);
i
++
)
p
->
pOrderL
[
i
]
=
p
->
pOrderL2
[
i
]
=
p
->
pOrderG
[
i
]
=
i
;
Llb_NonlinPrepareVarMap
(
p
);
Llb_NonlinPrepareVarMap
(
p
);
return
p
;
return
p
;
}
}
...
@@ -730,7 +729,6 @@ void Llb_MnnStop( Llb_Mnn_t * p )
...
@@ -730,7 +729,6 @@ void Llb_MnnStop( Llb_Mnn_t * p )
if
(
p
->
pPars
->
fVerbose
)
if
(
p
->
pPars
->
fVerbose
)
{
{
p
->
timeOther
=
p
->
timeTotal
-
p
->
timeImage
-
p
->
timeTran1
-
p
->
timeTran2
-
p
->
timeGloba
;
p
->
timeOther
=
p
->
timeTotal
-
p
->
timeImage
-
p
->
timeTran1
-
p
->
timeTran2
-
p
->
timeGloba
;
p
->
timeReo
=
Cudd_ReadReorderingTime
(
p
->
dd
);
p
->
timeReoG
=
Cudd_ReadReorderingTime
(
p
->
ddG
);
p
->
timeReoG
=
Cudd_ReadReorderingTime
(
p
->
ddG
);
ABC_PRTP
(
"Image "
,
p
->
timeImage
,
p
->
timeTotal
);
ABC_PRTP
(
"Image "
,
p
->
timeImage
,
p
->
timeTotal
);
ABC_PRTP
(
" build "
,
timeBuild
,
p
->
timeTotal
);
ABC_PRTP
(
" build "
,
timeBuild
,
p
->
timeTotal
);
...
@@ -744,7 +742,6 @@ void Llb_MnnStop( Llb_Mnn_t * p )
...
@@ -744,7 +742,6 @@ void Llb_MnnStop( Llb_Mnn_t * p )
ABC_PRTP
(
" reo "
,
p
->
timeReo
,
p
->
timeTotal
);
ABC_PRTP
(
" reo "
,
p
->
timeReo
,
p
->
timeTotal
);
ABC_PRTP
(
" reoG "
,
p
->
timeReoG
,
p
->
timeTotal
);
ABC_PRTP
(
" reoG "
,
p
->
timeReoG
,
p
->
timeTotal
);
}
}
p
->
dd
->
bFunc
=
NULL
;
if
(
p
->
ddR
->
bFunc
)
if
(
p
->
ddR
->
bFunc
)
Cudd_RecursiveDeref
(
p
->
ddR
,
p
->
ddR
->
bFunc
);
Cudd_RecursiveDeref
(
p
->
ddR
,
p
->
ddR
->
bFunc
);
Vec_PtrForEachEntry
(
DdNode
*
,
p
->
vRings
,
bTemp
,
i
)
Vec_PtrForEachEntry
(
DdNode
*
,
p
->
vRings
,
bTemp
,
i
)
...
@@ -755,7 +752,7 @@ void Llb_MnnStop( Llb_Mnn_t * p )
...
@@ -755,7 +752,7 @@ void Llb_MnnStop( Llb_Mnn_t * p )
if
(
p
->
ddG
->
bFunc2
)
if
(
p
->
ddG
->
bFunc2
)
Cudd_RecursiveDeref
(
p
->
ddG
,
p
->
ddG
->
bFunc2
);
Cudd_RecursiveDeref
(
p
->
ddG
,
p
->
ddG
->
bFunc2
);
// printf( "manager1\n" );
// printf( "manager1\n" );
Extra_StopManager
(
p
->
dd
);
//
Extra_StopManager( p->dd );
// printf( "manager2\n" );
// printf( "manager2\n" );
Extra_StopManager
(
p
->
ddG
);
Extra_StopManager
(
p
->
ddG
);
// printf( "manager3\n" );
// printf( "manager3\n" );
...
@@ -767,7 +764,9 @@ void Llb_MnnStop( Llb_Mnn_t * p )
...
@@ -767,7 +764,9 @@ void Llb_MnnStop( Llb_Mnn_t * p )
Vec_PtrFree
(
p
->
vLeaves
);
Vec_PtrFree
(
p
->
vLeaves
);
Vec_PtrFree
(
p
->
vRoots
);
Vec_PtrFree
(
p
->
vRoots
);
ABC_FREE
(
p
->
pVars2Q
);
ABC_FREE
(
p
->
pVars2Q
);
ABC_FREE
(
p
->
pOrder
);
ABC_FREE
(
p
->
pOrderL
);
ABC_FREE
(
p
->
pOrderL2
);
ABC_FREE
(
p
->
pOrderG
);
ABC_FREE
(
p
);
ABC_FREE
(
p
);
}
}
...
...
src/aig/llb/llbInt.h
View file @
6119f706
...
@@ -172,9 +172,15 @@ extern DdNode * Llb_ImgComputeImage( Aig_Man_t * pAig, Vec_Ptr_t * vDdMan
...
@@ -172,9 +172,15 @@ extern DdNode * Llb_ImgComputeImage( Aig_Man_t * pAig, Vec_Ptr_t * vDdMan
Vec_Ptr_t
*
vQuant0
,
Vec_Ptr_t
*
vQuant1
,
Vec_Int_t
*
vDriRefs
,
Vec_Ptr_t
*
vQuant0
,
Vec_Ptr_t
*
vQuant1
,
Vec_Int_t
*
vDriRefs
,
int
TimeTarget
,
int
fBackward
,
int
fReorder
,
int
fVerbose
);
int
TimeTarget
,
int
fBackward
,
int
fReorder
,
int
fVerbose
);
extern
DdManager
*
Llb_NonlinImageStart
(
Aig_Man_t
*
pAig
,
Vec_Ptr_t
*
vLeaves
,
Vec_Ptr_t
*
vRoots
,
int
*
pVars2Q
,
int
*
pOrder
,
int
fFirst
);
extern
DdNode
*
Llb_NonlinImageCompute
(
DdNode
*
bCurrent
,
int
fReorder
,
int
fDrop
,
int
fVerbose
,
int
*
pOrder
);
extern
void
Llb_NonlinImageQuit
();
/*=== llb3Image.c ======================================================*/
/*=== llb3Image.c ======================================================*/
extern
DdNode
*
Llb_NonlinImage
(
Aig_Man_t
*
pAig
,
Vec_Ptr_t
*
vLeaves
,
Vec_Ptr_t
*
vRoots
,
int
*
pVars2Q
,
extern
DdNode
*
Llb_NonlinImage
(
Aig_Man_t
*
pAig
,
Vec_Ptr_t
*
vLeaves
,
Vec_Ptr_t
*
vRoots
,
int
*
pVars2Q
,
DdManager
*
dd
,
DdNode
*
bCurrent
,
int
fReorder
,
int
fVerbose
,
int
*
pOrder
,
int
Limit
,
int
TimeTarget
);
DdManager
*
dd
,
DdNode
*
bCurrent
,
int
fReorder
,
int
fVerbose
,
int
*
pOrder
,
int
Limit
,
int
TimeTarget
);
/*=== llb3Nonlin.c ======================================================*/
extern
DdNode
*
Llb_NonlinComputeInitState
(
Aig_Man_t
*
pAig
,
DdManager
*
dd
);
ABC_NAMESPACE_HEADER_END
ABC_NAMESPACE_HEADER_END
...
...
src/base/abci/abc.c
View file @
6119f706
...
@@ -27937,7 +27937,7 @@ usage:
...
@@ -27937,7 +27937,7 @@ usage:
Abc_Print
(
-
2
,
"
\t
-F num : max number of reachability iterations [default = %d]
\n
"
,
pPars
->
nIterMax
);
Abc_Print
(
-
2
,
"
\t
-F num : max number of reachability iterations [default = %d]
\n
"
,
pPars
->
nIterMax
);
Abc_Print
(
-
2
,
"
\t
-T num : approximate time limit in seconds (0=infinite) [default = %d]
\n
"
,
pPars
->
TimeLimit
);
Abc_Print
(
-
2
,
"
\t
-T num : approximate time limit in seconds (0=infinite) [default = %d]
\n
"
,
pPars
->
TimeLimit
);
Abc_Print
(
-
2
,
"
\t
-L file: the log file name [default = %s]
\n
"
,
pLogFileName
?
pLogFileName
:
"no logging"
);
Abc_Print
(
-
2
,
"
\t
-L file: the log file name [default = %s]
\n
"
,
pLogFileName
?
pLogFileName
:
"no logging"
);
Abc_Print
(
-
2
,
"
\t
-r : enable
dynamic BDD variable reordering
[default = %s]
\n
"
,
pPars
->
fReorder
?
"yes"
:
"no"
);
Abc_Print
(
-
2
,
"
\t
-r : enable
additional BDD var reordering before image
[default = %s]
\n
"
,
pPars
->
fReorder
?
"yes"
:
"no"
);
Abc_Print
(
-
2
,
"
\t
-b : perform backward reachability analysis [default = %s]
\n
"
,
pPars
->
fBackward
?
"yes"
:
"no"
);
Abc_Print
(
-
2
,
"
\t
-b : perform backward reachability analysis [default = %s]
\n
"
,
pPars
->
fBackward
?
"yes"
:
"no"
);
Abc_Print
(
-
2
,
"
\t
-y : skip checking property outputs [default = %s]
\n
"
,
pPars
->
fSkipOutCheck
?
"yes"
:
"no"
);
Abc_Print
(
-
2
,
"
\t
-y : skip checking property outputs [default = %s]
\n
"
,
pPars
->
fSkipOutCheck
?
"yes"
:
"no"
);
Abc_Print
(
-
2
,
"
\t
-z : skip reachability (run preparation phase only) [default = %s]
\n
"
,
pPars
->
fSkipReach
?
"yes"
:
"no"
);
Abc_Print
(
-
2
,
"
\t
-z : skip reachability (run preparation phase only) [default = %s]
\n
"
,
pPars
->
fSkipReach
?
"yes"
:
"no"
);
...
@@ -28069,7 +28069,7 @@ usage:
...
@@ -28069,7 +28069,7 @@ usage:
Abc_Print
(
-
2
,
"
\t
-F num : max number of reachability iterations [default = %d]
\n
"
,
pPars
->
nIterMax
);
Abc_Print
(
-
2
,
"
\t
-F num : max number of reachability iterations [default = %d]
\n
"
,
pPars
->
nIterMax
);
Abc_Print
(
-
2
,
"
\t
-T num : approximate time limit in seconds (0=infinite) [default = %d]
\n
"
,
pPars
->
TimeLimit
);
Abc_Print
(
-
2
,
"
\t
-T num : approximate time limit in seconds (0=infinite) [default = %d]
\n
"
,
pPars
->
TimeLimit
);
Abc_Print
(
-
2
,
"
\t
-L file: the log file name [default = %s]
\n
"
,
pLogFileName
?
pLogFileName
:
"no logging"
);
Abc_Print
(
-
2
,
"
\t
-L file: the log file name [default = %s]
\n
"
,
pLogFileName
?
pLogFileName
:
"no logging"
);
Abc_Print
(
-
2
,
"
\t
-r : enable
dynamic BDD variable reordering
[default = %s]
\n
"
,
pPars
->
fReorder
?
"yes"
:
"no"
);
Abc_Print
(
-
2
,
"
\t
-r : enable
additional BDD var reordering before image
[default = %s]
\n
"
,
pPars
->
fReorder
?
"yes"
:
"no"
);
Abc_Print
(
-
2
,
"
\t
-y : skip checking property outputs [default = %s]
\n
"
,
pPars
->
fSkipOutCheck
?
"yes"
:
"no"
);
Abc_Print
(
-
2
,
"
\t
-y : skip checking property outputs [default = %s]
\n
"
,
pPars
->
fSkipOutCheck
?
"yes"
:
"no"
);
Abc_Print
(
-
2
,
"
\t
-z : skip reachability (run preparation phase only) [default = %s]
\n
"
,
pPars
->
fSkipReach
?
"yes"
:
"no"
);
Abc_Print
(
-
2
,
"
\t
-z : skip reachability (run preparation phase only) [default = %s]
\n
"
,
pPars
->
fSkipReach
?
"yes"
:
"no"
);
Abc_Print
(
-
2
,
"
\t
-v : prints verbose information [default = %s]
\n
"
,
pPars
->
fVerbose
?
"yes"
:
"no"
);
Abc_Print
(
-
2
,
"
\t
-v : prints verbose information [default = %s]
\n
"
,
pPars
->
fVerbose
?
"yes"
:
"no"
);
...
...
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