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
94a75fe6
Commit
94a75fe6
authored
May 25, 2013
by
Alan Mishchenko
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
New MFS package.
parent
f47cc6ce
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
111 additions
and
109 deletions
+111
-109
src/base/abci/abc.c
+2
-2
src/base/abci/abcMfs.c
+10
-1
src/opt/mfs/mfsCore.c
+2
-2
src/opt/mfs/mfsDiv.c
+2
-2
src/opt/mfs/mfsMan.c
+2
-2
src/opt/mfs/mfsResub.c
+4
-4
src/opt/sfm/sfm.h
+13
-12
src/opt/sfm/sfmCore.c
+12
-15
src/opt/sfm/sfmInt.h
+6
-5
src/opt/sfm/sfmNtk.c
+9
-8
src/opt/sfm/sfmSat.c
+29
-49
src/opt/sfm/sfmWin.c
+20
-7
No files found.
src/base/abci/abc.c
View file @
94a75fe6
...
...
@@ -4327,7 +4327,7 @@ int Abc_CommandMfs( Abc_Frame_t * pAbc, int argc, char ** argv )
}
pPars
->
nFanoutsMax
=
atoi
(
argv
[
globalUtilOptind
]);
globalUtilOptind
++
;
if
(
pPars
->
nFanoutsMax
<
1
)
if
(
pPars
->
nFanoutsMax
<
0
)
goto
usage
;
break
;
case
'D'
:
...
...
@@ -4496,7 +4496,7 @@ int Abc_CommandMfs2( Abc_Frame_t * pAbc, int argc, char ** argv )
}
pPars
->
nFanoutMax
=
atoi
(
argv
[
globalUtilOptind
]);
globalUtilOptind
++
;
if
(
pPars
->
nFanoutMax
<
1
)
if
(
pPars
->
nFanoutMax
<
0
)
goto
usage
;
break
;
case
'D'
:
src/base/abci/abcMfs.c
View file @
94a75fe6
...
...
@@ -19,6 +19,7 @@
***********************************************************************/
#include "base/abc/abc.h"
#include "bool/kit/kit.h"
#include "opt/sfm/sfm.h"
ABC_NAMESPACE_IMPL_START
...
...
@@ -120,6 +121,7 @@ Sfm_Ntk_t * Abc_NtkExtractMfs( Abc_Ntk_t * pNtk )
***********************************************************************/
void
Abc_NtkInsertMfs
(
Abc_Ntk_t
*
pNtk
,
Sfm_Ntk_t
*
p
)
{
Vec_Int_t
*
vCover
=
Sfm_NodeReadCover
(
p
);
Vec_Int_t
*
vMap
,
*
vArray
;
Abc_Obj_t
*
pNode
;
int
i
,
k
,
Fanin
;
...
...
@@ -155,7 +157,14 @@ void Abc_NtkInsertMfs( Abc_Ntk_t * pNtk, Sfm_Ntk_t * p )
else
if
(
~
pTruth
[
0
]
==
0
)
pNode
->
pData
=
Abc_SopRegister
(
(
Mem_Flex_t
*
)
pNtk
->
pManFunc
,
" 1
\n
"
);
else
pNode
->
pData
=
Abc_SopCreateFromTruth
(
(
Mem_Flex_t
*
)
pNtk
->
pManFunc
,
Vec_IntSize
(
vArray
),
(
unsigned
*
)
pTruth
);
{
// pNode->pData = Abc_SopCreateFromTruth( (Mem_Flex_t *)pNtk->pManFunc, Vec_IntSize(vArray), (unsigned *)pTruth );
int
RetValue
=
Kit_TruthIsop
(
(
unsigned
*
)
pTruth
,
Vec_IntSize
(
vArray
),
vCover
,
1
);
assert
(
RetValue
==
0
||
RetValue
==
1
);
pNode
->
pData
=
Abc_SopCreateFromIsop
(
(
Mem_Flex_t
*
)
pNtk
->
pManFunc
,
Vec_IntSize
(
vArray
),
vCover
);
if
(
RetValue
)
Abc_SopComplement
(
(
char
*
)
pNode
->
pData
);
}
}
Vec_IntFree
(
vMap
);
}
...
...
src/opt/mfs/mfsCore.c
View file @
94a75fe6
...
...
@@ -48,7 +48,7 @@ void Abc_NtkMfsParsDefault( Mfs_Par_t * pPars )
{
memset
(
pPars
,
0
,
sizeof
(
Mfs_Par_t
)
);
pPars
->
nWinTfoLevs
=
2
;
pPars
->
nFanoutsMax
=
1
0
;
pPars
->
nFanoutsMax
=
3
0
;
pPars
->
nDepthMax
=
20
;
pPars
->
nDivMax
=
250
;
pPars
->
nWinSizeMax
=
300
;
...
...
@@ -406,7 +406,7 @@ int Abc_NtkMfs( Abc_Ntk_t * pNtk, Mfs_Par_t * pPars )
}
}
// perform the network sweep
Abc_NtkSweep
(
pNtk
,
0
);
//
Abc_NtkSweep( pNtk, 0 );
// convert into the AIG
if
(
!
Abc_NtkToAig
(
pNtk
)
)
{
...
...
src/opt/mfs/mfsDiv.c
View file @
94a75fe6
...
...
@@ -214,7 +214,7 @@ Vec_Ptr_t * Abc_MfsComputeDivisors( Mfs_Man_t * p, Abc_Obj_t * pNode, int nLevDi
// (3) the node's fanins (these are treated as a special case)
Abc_NtkIncrementTravId
(
pNode
->
pNtk
);
Abc_MfsWinSweepLeafTfo_rec
(
pNode
,
nLevDivMax
);
Abc_MfsWinVisitMffc
(
pNode
);
//
Abc_MfsWinVisitMffc( pNode );
Abc_ObjForEachFanin
(
pNode
,
pObj
,
k
)
Abc_NodeSetTravIdCurrent
(
pObj
);
...
...
@@ -244,7 +244,7 @@ Vec_Ptr_t * Abc_MfsComputeDivisors( Mfs_Man_t * p, Abc_Obj_t * pNode, int nLevDi
Abc_ObjForEachFanout
(
pObj
,
pFanout
,
f
)
{
// stop if there are too many fanouts
if
(
f
>
20
)
if
(
p
->
pPars
->
nFanoutsMax
&&
f
>
p
->
pPars
->
nFanoutsMax
)
break
;
// skip nodes that are already added
if
(
Abc_NodeIsTravIdPrevious
(
pFanout
)
)
...
...
src/opt/mfs/mfsMan.c
View file @
94a75fe6
...
...
@@ -113,7 +113,7 @@ void Mfs_ManPrint( Mfs_Man_t * p )
if
(
p
->
pPars
->
fResub
)
{
printf
(
"Nodes = %d. Try = %d. Resub = %d. Div = %d. SAT calls = %d. Timeouts = %d.
\n
"
,
Abc_NtkNodeNum
(
p
->
pNtk
)
,
p
->
nNodesTried
,
p
->
nNodesResub
,
p
->
nTotalDivs
,
p
->
nSatCalls
,
p
->
nTimeOuts
);
p
->
nTotalNodesBeg
,
p
->
nNodesTried
,
p
->
nNodesResub
,
p
->
nTotalDivs
,
p
->
nSatCalls
,
p
->
nTimeOuts
);
printf
(
"Attempts : "
);
printf
(
"Remove %6d out of %6d (%6.2f %%) "
,
p
->
nRemoves
,
p
->
nTryRemoves
,
100
.
0
*
p
->
nRemoves
/
Abc_MaxInt
(
1
,
p
->
nTryRemoves
)
);
...
...
@@ -137,7 +137,7 @@ void Mfs_ManPrint( Mfs_Man_t * p )
else
{
printf
(
"Nodes = %d. Try = %d. Total mints = %d. Local DC mints = %d. Ratio = %5.2f.
\n
"
,
Abc_NtkNodeNum
(
p
->
pNtk
)
,
p
->
nNodesTried
,
p
->
nMintsTotal
,
p
->
nMintsTotal
-
p
->
nMintsCare
,
p
->
nTotalNodesBeg
,
p
->
nNodesTried
,
p
->
nMintsTotal
,
p
->
nMintsTotal
-
p
->
nMintsCare
,
1
.
0
*
(
p
->
nMintsTotal
-
p
->
nMintsCare
)
/
p
->
nMintsTotal
);
// printf( "Average ratio of sequential DCs in the global space = %5.2f.\n",
// 1.0-(p->dTotalRatios/p->nNodesTried) );
...
...
src/opt/mfs/mfsResub.c
View file @
94a75fe6
...
...
@@ -164,7 +164,7 @@ p->timeGia += clock() - clk;
***********************************************************************/
int
Abc_NtkMfsSolveSatResub
(
Mfs_Man_t
*
p
,
Abc_Obj_t
*
pNode
,
int
iFanin
,
int
fOnlyRemove
,
int
fSkipUpdate
)
{
int
fVeryVerbose
=
p
->
pPars
->
fVeryVerbose
&&
Vec_PtrSize
(
p
->
vDivs
)
<
200
;
// || pNode->Id == 556;
int
fVeryVerbose
=
0
;
//
p->pPars->fVeryVerbose && Vec_PtrSize(p->vDivs) < 200;// || pNode->Id == 556;
unsigned
*
pData
;
int
pCands
[
MFS_FANIN_MAX
];
int
RetValue
,
iVar
,
i
,
nCands
,
nWords
,
w
;
...
...
@@ -180,9 +180,9 @@ int Abc_NtkMfsSolveSatResub( Mfs_Man_t * p, Abc_Obj_t * pNode, int iFanin, int f
if
(
p
->
pPars
->
fVeryVerbose
)
{
// printf( "\n" );
printf
(
"
Node %5d : Level = %2d. Divs = %3d. Fanin = %d (out of %d).
MFFC = %d
\n
"
,
pNode
->
Id
,
pNode
->
Level
,
Vec_PtrSize
(
p
->
vDivs
)
-
Abc_ObjFaninNum
(
pNode
),
iFanin
,
Abc_ObjFaninNum
(
pNode
),
printf
(
"
%5d : Lev =%3d. Leaf =%3d. Node =%3d. Divs =%3d. Fanin = %4d (%d/%d),
MFFC = %d
\n
"
,
pNode
->
Id
,
pNode
->
Level
,
Vec_PtrSize
(
p
->
v
Supp
),
Vec_PtrSize
(
p
->
vNodes
),
Vec_PtrSize
(
p
->
v
Divs
)
-
Abc_ObjFaninNum
(
pNode
),
Abc_ObjFaninId
(
pNode
,
iFanin
),
iFanin
,
Abc_ObjFaninNum
(
pNode
),
Abc_ObjFanoutNum
(
Abc_ObjFanin
(
pNode
,
iFanin
))
==
1
?
Abc_NodeMffcLabel
(
Abc_ObjFanin
(
pNode
,
iFanin
))
:
0
);
}
...
...
src/opt/sfm/sfm.h
View file @
94a75fe6
...
...
@@ -42,18 +42,18 @@ typedef struct Sfm_Ntk_t_ Sfm_Ntk_t;
typedef
struct
Sfm_Par_t_
Sfm_Par_t
;
struct
Sfm_Par_t_
{
int
nTfoLevMax
;
// the maximum fanout levels
int
nFanoutMax
;
// the maximum number of fanouts
int
nDepthMax
;
// the maximum depth to try
int
nWinSizeMax
;
// the maximum window size
int
nDivNumMax
;
// the maximum number of divisors
int
nBTLimit
;
// the maximum number of conflicts in one SAT run
int
fFixLevel
;
// does not allow level to increase
int
fRrOnly
;
// perform redundance removal
int
fArea
;
// performs optimization for area
int
fMoreEffort
;
// performs high-affort minimization
int
fVerbose
;
// enable basic stats
int
fVeryVerbose
;
// enable detailed stats
int
nTfoLevMax
;
// the maximum fanout levels
int
nFanoutMax
;
// the maximum number of fanouts
int
nDepthMax
;
// the maximum depth to try
int
nWinSizeMax
;
// the maximum window size
int
nDivNumMax
;
// the maximum number of divisors
int
nBTLimit
;
// the maximum number of conflicts in one SAT run
int
fFixLevel
;
// does not allow level to increase
int
fRrOnly
;
// perform redundance removal
int
fArea
;
// performs optimization for area
int
fMoreEffort
;
// performs high-affort minimization
int
fVerbose
;
// enable basic stats
int
fVeryVerbose
;
// enable detailed stats
};
////////////////////////////////////////////////////////////////////////
...
...
@@ -75,6 +75,7 @@ extern Vec_Int_t * Sfm_NodeReadFanins( Sfm_Ntk_t * p, int i );
extern
word
*
Sfm_NodeReadTruth
(
Sfm_Ntk_t
*
p
,
int
i
);
extern
int
Sfm_NodeReadFixed
(
Sfm_Ntk_t
*
p
,
int
i
);
extern
int
Sfm_NodeReadUsed
(
Sfm_Ntk_t
*
p
,
int
i
);
extern
Vec_Int_t
*
Sfm_NodeReadCover
(
Sfm_Ntk_t
*
p
);
/*=== sfmSat.c ==========================================================*/
...
...
src/opt/sfm/sfmCore.c
View file @
94a75fe6
...
...
@@ -33,7 +33,7 @@ ABC_NAMESPACE_IMPL_START
/**Function*************************************************************
Synopsis []
Synopsis [
Setup parameter structure.
]
Description []
...
...
@@ -46,7 +46,7 @@ void Sfm_ParSetDefault( Sfm_Par_t * pPars )
{
memset
(
pPars
,
0
,
sizeof
(
Sfm_Par_t
)
);
pPars
->
nTfoLevMax
=
2
;
// the maximum fanout levels
pPars
->
nFanoutMax
=
1
0
;
// the maximum number of fanouts
pPars
->
nFanoutMax
=
3
0
;
// the maximum number of fanouts
pPars
->
nDepthMax
=
20
;
// the maximum depth to try
pPars
->
nWinSizeMax
=
300
;
// the maximum window size
pPars
->
nDivNumMax
=
300
;
// the maximum number of divisors
...
...
@@ -61,7 +61,7 @@ void Sfm_ParSetDefault( Sfm_Par_t * pPars )
/**Function*************************************************************
Synopsis []
Synopsis [
Prints statistics.
]
Description []
...
...
@@ -73,12 +73,12 @@ void Sfm_ParSetDefault( Sfm_Par_t * pPars )
void
Sfm_NtkPrintStats
(
Sfm_Ntk_t
*
p
)
{
p
->
timeOther
=
p
->
timeTotal
-
p
->
timeWin
-
p
->
timeDiv
-
p
->
timeCnf
-
p
->
timeSat
;
printf
(
"Nodes = %d. Try = %d. Resub = %d. Div = %d. SAT calls = %d. Timeouts = %d.
\n
"
,
Sfm_NtkNodeNum
(
p
),
p
->
nNodesTried
,
p
->
nRemoves
+
p
->
nResubs
,
p
->
nTotalDivs
,
p
->
nSatCalls
,
p
->
nTimeOuts
);
printf
(
"Nodes = %d. Try = %d. Resub = %d. Div = %d. SAT calls = %d. Timeouts = %d.
MaxDivs = %d.
\n
"
,
Sfm_NtkNodeNum
(
p
),
p
->
nNodesTried
,
p
->
nRemoves
+
p
->
nResubs
,
p
->
nTotalDivs
,
p
->
nSatCalls
,
p
->
nTimeOuts
,
p
->
nMaxDivs
);
printf
(
"Attempts : "
);
printf
(
"Remove %6d out of %6d (%6.2f %%) "
,
p
->
nRemoves
,
p
->
nTryRemoves
,
p
->
nRemoves
,
100
.
0
*
p
->
nRemoves
/
Abc_MaxInt
(
1
,
p
->
nTryRemoves
)
);
printf
(
"Resub %6d out of %6d (%6.2f %%) "
,
p
->
nResubs
,
p
->
nTryResubs
,
p
->
nResubs
,
100
.
0
*
p
->
nResubs
/
Abc_MaxInt
(
1
,
p
->
nTryResubs
)
);
printf
(
"Remove %6d out of %6d (%6.2f %%) "
,
p
->
nRemoves
,
p
->
nTryRemoves
,
100
.
0
*
p
->
nRemoves
/
Abc_MaxInt
(
1
,
p
->
nTryRemoves
)
);
printf
(
"Resub %6d out of %6d (%6.2f %%) "
,
p
->
nResubs
,
p
->
nTryResubs
,
100
.
0
*
p
->
nResubs
/
Abc_MaxInt
(
1
,
p
->
nTryResubs
)
);
printf
(
"
\n
"
);
printf
(
"Reduction: "
);
...
...
@@ -92,6 +92,7 @@ void Sfm_NtkPrintStats( Sfm_Ntk_t * p )
ABC_PRTP
(
"Sat"
,
p
->
timeSat
,
p
->
timeTotal
);
ABC_PRTP
(
"Oth"
,
p
->
timeOther
,
p
->
timeTotal
);
ABC_PRTP
(
"ALL"
,
p
->
timeTotal
,
p
->
timeTotal
);
// ABC_PRTP( " ", p->time1 , p->timeTotal );
}
/**Function*************************************************************
...
...
@@ -108,22 +109,18 @@ void Sfm_NtkPrintStats( Sfm_Ntk_t * p )
int
Sfm_NodeResubSolve
(
Sfm_Ntk_t
*
p
,
int
iNode
,
int
f
,
int
fRemoveOnly
)
{
int
fSkipUpdate
=
0
;
int
fVeryVerbose
=
p
->
pPars
->
fVeryVerbose
&&
Vec_IntSize
(
p
->
vDivs
)
<
200
;
// || pNode->Id == 556;
int
fVeryVerbose
=
0
;
//
p->pPars->fVeryVerbose && Vec_IntSize(p->vDivs) < 200;// || pNode->Id == 556;
int
i
,
iFanin
,
iVar
=
-
1
;
word
uTruth
,
uSign
,
uMask
;
clock_t
clk
;
assert
(
Sfm_ObjIsNode
(
p
,
iNode
)
);
assert
(
f
>=
0
&&
f
<
Sfm_ObjFaninNum
(
p
,
iNode
)
);
if
(
iNode
==
211
)
{
int
i
=
0
;
}
p
->
nTryRemoves
++
;
// report init stats
if
(
p
->
pPars
->
fVeryVerbose
)
printf
(
"%5d : Lev =%3d. Leaf =%3d. Node =%3d. Div=%3d. Fanin =
%d/%d
. MFFC = %d
\n
"
,
iNode
,
Sfm_ObjLevel
(
p
,
iNode
),
Vec_IntSize
(
p
->
vLeaves
),
Vec_IntSize
(
p
->
vNodes
),
Vec_IntSize
(
p
->
vDivs
),
f
,
Sfm_ObjFaninNum
(
p
,
iNode
),
Sfm_ObjFan
outNum
(
p
,
Sfm_ObjFanin
(
p
,
iNode
,
f
))
==
1
?
Sfm_ObjMffcSize
(
p
,
iNode
)
:
0
);
printf
(
"%5d : Lev =%3d. Leaf =%3d. Node =%3d. Div=%3d. Fanin =
%4d (%d/%d)
. MFFC = %d
\n
"
,
iNode
,
Sfm_ObjLevel
(
p
,
iNode
),
Vec_IntSize
(
p
->
vLeaves
),
Vec_IntSize
(
p
->
vNodes
),
Vec_IntSize
(
p
->
vDivs
),
Sfm_ObjFan
in
(
p
,
iNode
,
f
),
f
,
Sfm_ObjFaninNum
(
p
,
iNode
),
Sfm_ObjMffcSize
(
p
,
Sfm_ObjFanin
(
p
,
iNode
,
f
))
);
// clean simulation info
p
->
nCexes
=
0
;
Vec_WrdFill
(
p
->
vDivCexes
,
Vec_IntSize
(
p
->
vDivs
),
0
);
...
...
src/opt/sfm/sfmInt.h
View file @
94a75fe6
...
...
@@ -84,8 +84,7 @@ struct Sfm_Ntk_t_
Vec_Int_t
*
vRoots
;
// roots
Vec_Int_t
*
vTfo
;
// TFO (excluding iNode)
// SAT solving
sat_solver
*
pSat0
;
// SAT solver for the off-set
sat_solver
*
pSat1
;
// SAT solver for the on-set
sat_solver
*
pSat
;
// SAT solver
int
nSatVars
;
// the number of variables
int
nTryRemoves
;
// number of fanin removals
int
nTryResubs
;
// number of resubstitutions
...
...
@@ -95,11 +94,11 @@ struct Sfm_Ntk_t_
int
nCexes
;
// number of CEXes
Vec_Wrd_t
*
vDivCexes
;
// counter-examples
// intermediate data
// Vec_Int_t * vFans; // current fanins
Vec_Int_t
*
vOrder
;
// object order
Vec_Int_t
*
vDivVars
;
// divisor SAT variables
Vec_Int_t
*
vDivIds
;
// divisors indexes
Vec_Int_t
*
vLits
;
// literals
Vec_Int_t
*
vValues
;
// SAT variable values
Vec_Wec_t
*
vClauses
;
// CNF clauses for the node
Vec_Int_t
*
vFaninMap
;
// mapping fanins into their SAT vars
// nodes
...
...
@@ -111,6 +110,7 @@ struct Sfm_Ntk_t_
int
nTotalDivs
;
int
nSatCalls
;
int
nTimeOuts
;
int
nMaxDivs
;
// runtime
clock_t
timeWin
;
clock_t
timeDiv
;
...
...
@@ -118,6 +118,7 @@ struct Sfm_Ntk_t_
clock_t
timeSat
;
clock_t
timeOther
;
clock_t
timeTotal
;
// clock_t time1;
};
static
inline
int
Sfm_NtkPiNum
(
Sfm_Ntk_t
*
p
)
{
return
p
->
nPis
;
}
...
...
@@ -135,8 +136,8 @@ static inline Vec_Int_t * Sfm_ObjFoArray( Sfm_Ntk_t * p, int i ) { return
static
inline
int
Sfm_ObjFaninNum
(
Sfm_Ntk_t
*
p
,
int
i
)
{
return
Vec_IntSize
(
Sfm_ObjFiArray
(
p
,
i
));
}
static
inline
int
Sfm_ObjFanoutNum
(
Sfm_Ntk_t
*
p
,
int
i
)
{
return
Vec_IntSize
(
Sfm_ObjFoArray
(
p
,
i
));
}
static
inline
int
Sfm_ObjRefIncrement
(
Sfm_Ntk_t
*
p
,
int
iObj
)
{
return
++
Sfm_ObjF
i
Array
(
p
,
iObj
)
->
nSize
;
}
static
inline
int
Sfm_ObjRefDecrement
(
Sfm_Ntk_t
*
p
,
int
iObj
)
{
return
--
Sfm_ObjF
i
Array
(
p
,
iObj
)
->
nSize
;
}
static
inline
int
Sfm_ObjRefIncrement
(
Sfm_Ntk_t
*
p
,
int
iObj
)
{
return
++
Sfm_ObjF
o
Array
(
p
,
iObj
)
->
nSize
;
}
static
inline
int
Sfm_ObjRefDecrement
(
Sfm_Ntk_t
*
p
,
int
iObj
)
{
return
--
Sfm_ObjF
o
Array
(
p
,
iObj
)
->
nSize
;
}
static
inline
int
Sfm_ObjFanin
(
Sfm_Ntk_t
*
p
,
int
i
,
int
k
)
{
return
Vec_IntEntry
(
Sfm_ObjFiArray
(
p
,
i
),
k
);
}
static
inline
int
Sfm_ObjFanout
(
Sfm_Ntk_t
*
p
,
int
i
,
int
k
)
{
return
Vec_IntEntry
(
Sfm_ObjFoArray
(
p
,
i
),
k
);
}
...
...
src/opt/sfm/sfmNtk.c
View file @
94a75fe6
...
...
@@ -169,13 +169,14 @@ void Sfm_NtkPrepare( Sfm_Ntk_t * p )
p
->
vRoots
=
Vec_IntAlloc
(
1000
);
p
->
vTfo
=
Vec_IntAlloc
(
1000
);
p
->
vDivCexes
=
Vec_WrdStart
(
p
->
pPars
->
nDivNumMax
);
// p->vFans = Vec_IntAlloc( 100 );
p
->
vOrder
=
Vec_IntAlloc
(
100
);
p
->
vDivVars
=
Vec_IntAlloc
(
100
);
p
->
vDivIds
=
Vec_IntAlloc
(
1000
);
p
->
vLits
=
Vec_IntAlloc
(
100
);
p
->
vValues
=
Vec_IntAlloc
(
100
);
p
->
vClauses
=
Vec_WecAlloc
(
100
);
p
->
vFaninMap
=
Vec_IntAlloc
(
10
);
p
->
pSat
=
sat_solver_new
();
}
void
Sfm_NtkFree
(
Sfm_Ntk_t
*
p
)
{
...
...
@@ -200,15 +201,14 @@ void Sfm_NtkFree( Sfm_Ntk_t * p )
Vec_IntFreeP
(
&
p
->
vRoots
);
Vec_IntFreeP
(
&
p
->
vTfo
);
Vec_WrdFreeP
(
&
p
->
vDivCexes
);
// Vec_IntFreeP( &p->vFans );
Vec_IntFreeP
(
&
p
->
vOrder
);
Vec_IntFreeP
(
&
p
->
vDivVars
);
Vec_IntFreeP
(
&
p
->
vDivIds
);
Vec_IntFreeP
(
&
p
->
vLits
);
Vec_IntFreeP
(
&
p
->
vValues
);
Vec_WecFreeP
(
&
p
->
vClauses
);
Vec_IntFreeP
(
&
p
->
vFaninMap
);
if
(
p
->
pSat0
)
sat_solver_delete
(
p
->
pSat0
);
if
(
p
->
pSat1
)
sat_solver_delete
(
p
->
pSat1
);
if
(
p
->
pSat
)
sat_solver_delete
(
p
->
pSat
);
ABC_FREE
(
p
);
}
...
...
@@ -243,10 +243,6 @@ void Sfm_NtkAddFanin( Sfm_Ntk_t * p, int iNode, int iFanin )
void
Sfm_NtkDeleteObj_rec
(
Sfm_Ntk_t
*
p
,
int
iNode
)
{
int
i
,
iFanin
;
if
(
iNode
==
202
)
{
int
s
=
0
;
}
if
(
Sfm_ObjFanoutNum
(
p
,
iNode
)
>
0
||
Sfm_ObjIsPi
(
p
,
iNode
)
)
return
;
assert
(
Sfm_ObjIsNode
(
p
,
iNode
)
);
...
...
@@ -272,6 +268,7 @@ void Sfm_NtkUpdateLevel_rec( Sfm_Ntk_t * p, int iNode )
void
Sfm_NtkUpdate
(
Sfm_Ntk_t
*
p
,
int
iNode
,
int
f
,
int
iFaninNew
,
word
uTruth
)
{
int
iFanin
=
Sfm_ObjFanin
(
p
,
iNode
,
f
);
assert
(
iFanin
!=
iFaninNew
);
// replace old fanin by new fanin
assert
(
Sfm_ObjIsNode
(
p
,
iNode
)
);
Sfm_NtkRemoveFanin
(
p
,
iNode
,
iFanin
);
...
...
@@ -312,6 +309,10 @@ int Sfm_NodeReadUsed( Sfm_Ntk_t * p, int i )
{
return
(
Sfm_ObjFaninNum
(
p
,
i
)
>
0
)
||
(
Sfm_ObjFanoutNum
(
p
,
i
)
>
0
);
}
Vec_Int_t
*
Sfm_NodeReadCover
(
Sfm_Ntk_t
*
p
)
{
return
p
->
vCover
;
}
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
...
...
src/opt/sfm/sfmSat.c
View file @
94a75fe6
...
...
@@ -54,18 +54,18 @@ static word s_Truths6[6] = {
void
Sfm_NtkWindowToSolver
(
Sfm_Ntk_t
*
p
)
{
Vec_Int_t
*
vClause
;
int
RetValue
,
Lit
,
iNode
=
-
1
,
iFanin
,
i
,
k
;
int
RetValue
,
iNode
=
-
1
,
iFanin
,
i
,
k
;
clock_t
clk
=
clock
();
sat_solver
*
pSat0
=
sat_solver_new
();
sat_solver
*
pSat1
=
sat_solver_new
(
);
sat_solver_
setnvars
(
pSat0
,
1
+
Vec_IntSize
(
p
->
vDivs
)
+
2
*
Vec_IntSize
(
p
->
vTfo
)
+
Vec_IntSize
(
p
->
vRoots
)
+
100
);
sat_solver_setnvars
(
p
Sat1
,
1
+
Vec_IntSize
(
p
->
vDivs
)
+
2
*
Vec_IntSize
(
p
->
vTfo
)
+
Vec_IntSize
(
p
->
vRoots
)
+
100
);
// if ( p->pSat )
// printf( "%d ", p->pSat->stats.learnts
);
sat_solver_
restart
(
p
->
pSat
);
sat_solver_setnvars
(
p
->
pSat
,
1
+
Vec_IntSize
(
p
->
vDivs
)
+
2
*
Vec_IntSize
(
p
->
vTfo
)
+
Vec_IntSize
(
p
->
vRoots
)
+
100
);
// create SAT variables
Sfm_NtkCleanVars
(
p
);
p
->
nSatVars
=
1
;
Vec_IntForEachEntry
(
p
->
vOrder
,
iNode
,
i
)
Sfm_ObjSetSatVar
(
p
,
iNode
,
p
->
nSatVars
++
);
// c
reate
divisor variables
// c
ollect
divisor variables
Vec_IntClear
(
p
->
vDivVars
);
Vec_IntForEachEntry
(
p
->
vDivs
,
iNode
,
i
)
Vec_IntPush
(
p
->
vDivVars
,
Sfm_ObjSatVar
(
p
,
iNode
)
);
...
...
@@ -86,39 +86,15 @@ void Sfm_NtkWindowToSolver( Sfm_Ntk_t * p )
{
if
(
Vec_IntSize
(
vClause
)
==
0
)
break
;
RetValue
=
sat_solver_addclause
(
pSat0
,
Vec_IntArray
(
vClause
),
Vec_IntArray
(
vClause
)
+
Vec_IntSize
(
vClause
)
);
assert
(
RetValue
);
RetValue
=
sat_solver_addclause
(
pSat1
,
Vec_IntArray
(
vClause
),
Vec_IntArray
(
vClause
)
+
Vec_IntSize
(
vClause
)
);
RetValue
=
sat_solver_addclause
(
p
->
pSat
,
Vec_IntArray
(
vClause
),
Vec_IntArray
(
vClause
)
+
Vec_IntSize
(
vClause
)
);
assert
(
RetValue
);
}
}
// Sat_SolverWriteDimacs( pSat0, "test.cnf", NULL, NULL, 0 );
// get the last node
iNode
=
Vec_IntEntryLast
(
p
->
vNodes
);
// add unit clause
Lit
=
Abc_Var2Lit
(
Sfm_ObjSatVar
(
p
,
iNode
),
1
);
RetValue
=
sat_solver_addclause
(
pSat0
,
&
Lit
,
&
Lit
+
1
);
assert
(
RetValue
);
// add unit clause
Lit
=
Abc_Var2Lit
(
Sfm_ObjSatVar
(
p
,
iNode
),
0
);
RetValue
=
sat_solver_addclause
(
pSat1
,
&
Lit
,
&
Lit
+
1
);
assert
(
RetValue
);
// finalize
RetValue
=
sat_solver_simplify
(
p
Sat0
);
RetValue
=
sat_solver_simplify
(
p
->
pSat
);
assert
(
RetValue
);
RetValue
=
sat_solver_simplify
(
pSat1
);
if
(
RetValue
==
0
)
{
Sat_SolverWriteDimacs
(
pSat1
,
"test.cnf"
,
NULL
,
NULL
,
0
);
}
assert
(
RetValue
);
// return the result
if
(
p
->
pSat0
)
sat_solver_delete
(
p
->
pSat0
);
if
(
p
->
pSat1
)
sat_solver_delete
(
p
->
pSat1
);
p
->
pSat0
=
pSat0
;
p
->
pSat1
=
pSat1
;
p
->
timeCnf
+=
clock
()
-
clk
;
}
}
/**Function*************************************************************
...
...
@@ -135,55 +111,59 @@ word Sfm_ComputeInterpolant( Sfm_Ntk_t * p )
{
word
*
pSign
,
uCube
,
uTruth
=
0
;
int
status
,
i
,
Div
,
iVar
,
nFinal
,
*
pFinal
,
nIter
=
0
;
int
nVars
=
sat_solver_nvars
(
p
->
pSat1
);
int
iNewLit
=
Abc_Var2Lit
(
nVars
,
0
);
sat_solver_setnvars
(
p
->
pSat1
,
nVars
+
1
);
int
pLits
[
2
],
nVars
=
sat_solver_nvars
(
p
->
pSat
);
sat_solver_setnvars
(
p
->
pSat
,
nVars
+
1
);
pLits
[
0
]
=
Abc_Var2Lit
(
Sfm_ObjSatVar
(
p
,
Vec_IntEntryLast
(
p
->
vNodes
)),
0
);
// F = 1
pLits
[
1
]
=
Abc_Var2Lit
(
nVars
,
0
);
// iNewLit
while
(
1
)
{
// find onset minterm
p
->
nSatCalls
++
;
status
=
sat_solver_solve
(
p
->
pSat
1
,
&
iNewLit
,
&
iNewLit
+
1
,
p
->
pPars
->
nBTLimit
,
0
,
0
,
0
);
status
=
sat_solver_solve
(
p
->
pSat
,
pLits
,
pLits
+
2
,
p
->
pPars
->
nBTLimit
,
0
,
0
,
0
);
if
(
status
==
l_Undef
)
return
SFM_SAT_UNDEC
;
if
(
status
==
l_False
)
{
// printf( "+%d ", nIter );
return
uTruth
;
}
assert
(
status
==
l_True
);
// remember variable values
Vec_IntClear
(
p
->
vValues
);
Vec_IntForEachEntry
(
p
->
vDivVars
,
iVar
,
i
)
Vec_IntPush
(
p
->
vValues
,
sat_solver_var_value
(
p
->
pSat
,
iVar
)
);
// collect divisor literals
Vec_IntClear
(
p
->
vLits
);
Vec_IntPush
(
p
->
vLits
,
Abc_LitNot
(
pLits
[
0
])
);
// F = 0
Vec_IntForEachEntry
(
p
->
vDivIds
,
Div
,
i
)
Vec_IntPush
(
p
->
vLits
,
sat_solver_var_literal
(
p
->
pSat
1
,
Div
)
);
Vec_IntPush
(
p
->
vLits
,
sat_solver_var_literal
(
p
->
pSat
,
Div
)
);
// check against offset
p
->
nSatCalls
++
;
status
=
sat_solver_solve
(
p
->
pSat
0
,
Vec_IntArray
(
p
->
vLits
),
Vec_IntArray
(
p
->
vLits
)
+
Vec_IntSize
(
p
->
vLits
),
p
->
pPars
->
nBTLimit
,
0
,
0
,
0
);
status
=
sat_solver_solve
(
p
->
pSat
,
Vec_IntArray
(
p
->
vLits
),
Vec_IntArray
(
p
->
vLits
)
+
Vec_IntSize
(
p
->
vLits
),
p
->
pPars
->
nBTLimit
,
0
,
0
,
0
);
if
(
status
==
l_Undef
)
return
SFM_SAT_UNDEC
;
if
(
status
==
l_True
)
break
;
assert
(
status
==
l_False
);
// compute cube and add clause
nFinal
=
sat_solver_final
(
p
->
pSat
0
,
&
pFinal
);
nFinal
=
sat_solver_final
(
p
->
pSat
,
&
pFinal
);
uCube
=
~
(
word
)
0
;
Vec_IntClear
(
p
->
vLits
);
Vec_IntPush
(
p
->
vLits
,
Abc_LitNot
(
iNewLit
)
);
Vec_IntPush
(
p
->
vLits
,
Abc_LitNot
(
pLits
[
1
])
);
// NOT(iNewLit)
for
(
i
=
0
;
i
<
nFinal
;
i
++
)
{
if
(
pFinal
[
i
]
==
pLits
[
0
]
)
continue
;
Vec_IntPush
(
p
->
vLits
,
pFinal
[
i
]
);
iVar
=
Vec_IntFind
(
p
->
vDivIds
,
Abc_Lit2Var
(
pFinal
[
i
])
);
assert
(
iVar
>=
0
);
uCube
&=
Abc_LitIsCompl
(
pFinal
[
i
])
?
s_Truths6
[
iVar
]
:
~
s_Truths6
[
iVar
];
}
uTruth
|=
uCube
;
status
=
sat_solver_addclause
(
p
->
pSat
1
,
Vec_IntArray
(
p
->
vLits
),
Vec_IntArray
(
p
->
vLits
)
+
Vec_IntSize
(
p
->
vLits
)
);
status
=
sat_solver_addclause
(
p
->
pSat
,
Vec_IntArray
(
p
->
vLits
),
Vec_IntArray
(
p
->
vLits
)
+
Vec_IntSize
(
p
->
vLits
)
);
assert
(
status
);
nIter
++
;
}
// printf( "-%d ", nIter );
assert
(
status
==
l_True
);
// store the counter-example
Vec_IntForEachEntry
(
p
->
vDivVars
,
iVar
,
i
)
if
(
sat_solver_var_value
(
p
->
pSat1
,
iVar
)
^
sat_solver_var_value
(
p
->
pSat0
,
iVar
)
)
// insert 1
if
(
Vec_IntEntry
(
p
->
vValues
,
i
)
^
sat_solver_var_value
(
p
->
pSat
,
iVar
)
)
// insert 1
{
pSign
=
Vec_WrdEntryP
(
p
->
vDivCexes
,
i
);
assert
(
!
Abc_InfoHasBit
(
(
unsigned
*
)
pSign
,
p
->
nCexes
)
);
...
...
@@ -207,8 +187,8 @@ word Sfm_ComputeInterpolant( Sfm_Ntk_t * p )
void
Sfm_ComputeInterpolantCheck
(
Sfm_Ntk_t
*
p
)
{
int
iNode
=
3
;
int
iDiv0
=
5
;
int
iDiv1
=
4
;
int
iDiv0
=
6
;
int
iDiv1
=
7
;
word
uTruth
;
// int i;
// Sfm_NtkForEachNode( p, i )
...
...
src/opt/sfm/sfmWin.c
View file @
94a75fe6
...
...
@@ -89,6 +89,10 @@ int Sfm_ObjDeref( Sfm_Ntk_t * p, int iObj )
int
Sfm_ObjMffcSize
(
Sfm_Ntk_t
*
p
,
int
iObj
)
{
int
Count1
,
Count2
;
if
(
Sfm_ObjIsPi
(
p
,
iObj
)
)
return
0
;
if
(
Sfm_ObjFanoutNum
(
p
,
iObj
)
!=
1
)
return
0
;
assert
(
Sfm_ObjIsNode
(
p
,
iObj
)
);
Count1
=
Sfm_ObjDeref
(
p
,
iObj
);
Count2
=
Sfm_ObjRef
(
p
,
iObj
);
...
...
@@ -182,10 +186,11 @@ int Sfm_NtkCheckFanouts( Sfm_Ntk_t * p, int iNode )
void
Sfm_NtkAddDivisors
(
Sfm_Ntk_t
*
p
,
int
iNode
,
int
nLevelMax
)
{
int
i
,
iFanout
;
if
(
Sfm_ObjFanoutNum
(
p
,
iNode
)
>
p
->
pPars
->
nFanoutMax
)
return
;
Sfm_ObjForEachFanout
(
p
,
iNode
,
iFanout
,
i
)
{
// skip some of the fanouts if the number is large
if
(
p
->
pPars
->
nFanoutMax
&&
i
>
p
->
pPars
->
nFanoutMax
)
break
;
// skip TFI nodes, PO nodes, or nodes with high logic level
if
(
Sfm_ObjIsTravIdCurrent
(
p
,
iFanout
)
||
Sfm_ObjIsPo
(
p
,
iFanout
)
||
(
p
->
pPars
->
fFixLevel
&&
Sfm_ObjLevel
(
p
,
iFanout
)
>=
nLevelMax
)
)
...
...
@@ -252,7 +257,8 @@ int Sfm_NtkCreateWindow( Sfm_Ntk_t * p, int iNode, int fVerbose )
return
0
;
}
// collect TFO (currently use only one level of TFO)
if
(
Sfm_NtkCheckFanouts
(
p
,
iNode
)
)
// if ( Sfm_NtkCheckFanouts(p, iNode) )
if
(
0
)
{
Sfm_ObjForEachFanout
(
p
,
iNode
,
iTemp
,
i
)
{
...
...
@@ -268,10 +274,10 @@ int Sfm_NtkCreateWindow( Sfm_Ntk_t * p, int iNode, int fVerbose )
clk
=
clock
();
// create ordering of the nodes
Vec_IntClear
(
p
->
vOrder
);
Vec_IntForEachEntryReverse
(
p
->
vNodes
,
i
Node
,
i
)
Vec_IntPush
(
p
->
vOrder
,
i
Node
);
Vec_IntForEachEntry
(
p
->
vLeaves
,
i
Node
,
i
)
Vec_IntPush
(
p
->
vOrder
,
i
Node
);
Vec_IntForEachEntryReverse
(
p
->
vNodes
,
i
Temp
,
i
)
Vec_IntPush
(
p
->
vOrder
,
i
Temp
);
Vec_IntForEachEntry
(
p
->
vLeaves
,
i
Temp
,
i
)
Vec_IntPush
(
p
->
vOrder
,
i
Temp
);
// mark fanins
Sfm_NtkIncrementTravId2
(
p
);
Sfm_ObjSetTravIdCurrent2
(
p
,
iNode
);
...
...
@@ -294,11 +300,17 @@ int Sfm_NtkCreateWindow( Sfm_Ntk_t * p, int iNode, int fVerbose )
Vec_IntShrink
(
p
->
vDivs
,
k
);
assert
(
Vec_IntSize
(
p
->
vDivs
)
==
p
->
pPars
->
nDivNumMax
);
}
//Vec_IntPrint( p->vLeaves );
//Vec_IntPrint( p->vNodes );
//Vec_IntPrint( p->vDivs );
// collect additional divisors of the TFI nodes
if
(
Vec_IntSize
(
p
->
vDivs
)
<
p
->
pPars
->
nDivNumMax
)
{
int
nStartNew
=
Vec_IntSize
(
p
->
vDivs
);
Sfm_NtkIncrementTravId2
(
p
);
Sfm_ObjForEachFanin
(
p
,
iNode
,
iTemp
,
i
)
if
(
Vec_IntSize
(
p
->
vDivs
)
<
p
->
pPars
->
nDivNumMax
)
Sfm_NtkAddDivisors
(
p
,
iTemp
,
Sfm_ObjLevel
(
p
,
iNode
)
);
Vec_IntForEachEntry
(
p
->
vDivs
,
iTemp
,
i
)
if
(
Vec_IntSize
(
p
->
vDivs
)
<
p
->
pPars
->
nDivNumMax
)
Sfm_NtkAddDivisors
(
p
,
iTemp
,
Sfm_ObjLevel
(
p
,
iNode
)
);
...
...
@@ -309,6 +321,7 @@ int Sfm_NtkCreateWindow( Sfm_Ntk_t * p, int iNode, int fVerbose )
Vec_IntPush
(
p
->
vOrder
,
iTemp
);
}
assert
(
Vec_IntSize
(
p
->
vDivs
)
<=
p
->
pPars
->
nDivNumMax
);
p
->
nMaxDivs
+=
(
Vec_IntSize
(
p
->
vDivs
)
==
p
->
pPars
->
nDivNumMax
);
// statistics
p
->
nTotalDivs
+=
Vec_IntSize
(
p
->
vDivs
);
p
->
timeDiv
+=
clock
()
-
clk
;
...
...
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