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
6b55bf02
Commit
6b55bf02
authored
8 years ago
by
Alan Mishchenko
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
New SAT-based optimization package.
parent
64bdbe1a
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
343 additions
and
42 deletions
+343
-42
src/base/abci/abc.c
+129
-0
src/base/io/ioWriteDot.c
+1
-1
src/misc/util/utilTruth.h
+28
-0
src/opt/sbd/sbd.h
+11
-41
src/opt/sbd/sbdCore.c
+0
-0
src/opt/sbd/sbdInt.h
+1
-0
src/opt/sbd/sbdSat.c
+173
-0
No files found.
src/base/abci/abc.c
View file @
6b55bf02
...
@@ -55,6 +55,7 @@
...
@@ -55,6 +55,7 @@
#include "sat/bmc/bmc.h"
#include "sat/bmc/bmc.h"
#include "proof/ssc/ssc.h"
#include "proof/ssc/ssc.h"
#include "opt/sfm/sfm.h"
#include "opt/sfm/sfm.h"
#include "opt/sbd/sbd.h"
#include "bool/rpo/rpo.h"
#include "bool/rpo/rpo.h"
#include "map/mpm/mpm.h"
#include "map/mpm/mpm.h"
#include "opt/fret/fretime.h"
#include "opt/fret/fretime.h"
...
@@ -481,6 +482,7 @@ static int Abc_CommandAbc9Acec ( Abc_Frame_t * pAbc, int argc, cha
...
@@ -481,6 +482,7 @@ static int Abc_CommandAbc9Acec ( Abc_Frame_t * pAbc, int argc, cha
static
int
Abc_CommandAbc9Esop
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Abc_CommandAbc9Esop
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Abc_CommandAbc9Exorcism
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Abc_CommandAbc9Exorcism
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Abc_CommandAbc9Mfs
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Abc_CommandAbc9Mfs
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Abc_CommandAbc9Mfsd
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
//static int Abc_CommandAbc9PoPart2 ( Abc_Frame_t * pAbc, int argc, char ** argv );
//static int Abc_CommandAbc9PoPart2 ( Abc_Frame_t * pAbc, int argc, char ** argv );
//static int Abc_CommandAbc9CexCut ( Abc_Frame_t * pAbc, int argc, char ** argv );
//static int Abc_CommandAbc9CexCut ( Abc_Frame_t * pAbc, int argc, char ** argv );
//static int Abc_CommandAbc9CexMerge ( Abc_Frame_t * pAbc, int argc, char ** argv );
//static int Abc_CommandAbc9CexMerge ( Abc_Frame_t * pAbc, int argc, char ** argv );
...
@@ -1122,6 +1124,7 @@ void Abc_Init( Abc_Frame_t * pAbc )
...
@@ -1122,6 +1124,7 @@ void Abc_Init( Abc_Frame_t * pAbc )
Cmd_CommandAdd
(
pAbc
,
"ABC9"
,
"&esop"
,
Abc_CommandAbc9Esop
,
0
);
Cmd_CommandAdd
(
pAbc
,
"ABC9"
,
"&esop"
,
Abc_CommandAbc9Esop
,
0
);
Cmd_CommandAdd
(
pAbc
,
"ABC9"
,
"&exorcism"
,
Abc_CommandAbc9Exorcism
,
0
);
Cmd_CommandAdd
(
pAbc
,
"ABC9"
,
"&exorcism"
,
Abc_CommandAbc9Exorcism
,
0
);
Cmd_CommandAdd
(
pAbc
,
"ABC9"
,
"&mfs"
,
Abc_CommandAbc9Mfs
,
0
);
Cmd_CommandAdd
(
pAbc
,
"ABC9"
,
"&mfs"
,
Abc_CommandAbc9Mfs
,
0
);
Cmd_CommandAdd
(
pAbc
,
"ABC9"
,
"&mfsd"
,
Abc_CommandAbc9Mfsd
,
0
);
// Cmd_CommandAdd( pAbc, "ABC9", "&popart2", Abc_CommandAbc9PoPart2, 0 );
// Cmd_CommandAdd( pAbc, "ABC9", "&popart2", Abc_CommandAbc9PoPart2, 0 );
// Cmd_CommandAdd( pAbc, "ABC9", "&cexcut", Abc_CommandAbc9CexCut, 0 );
// Cmd_CommandAdd( pAbc, "ABC9", "&cexcut", Abc_CommandAbc9CexCut, 0 );
// Cmd_CommandAdd( pAbc, "ABC9", "&cexmerge", Abc_CommandAbc9CexMerge, 0 );
// Cmd_CommandAdd( pAbc, "ABC9", "&cexmerge", Abc_CommandAbc9CexMerge, 0 );
...
@@ -40829,6 +40832,132 @@ usage:
...
@@ -40829,6 +40832,132 @@ usage:
Synopsis []
Synopsis []
Description []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int
Abc_CommandAbc9Mfsd
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
)
{
extern
Gia_Man_t
*
Sbd_NtkPerform
(
Gia_Man_t
*
pGia
,
Sbd_Par_t
*
pPars
);
Gia_Man_t
*
pTemp
;
int
c
;
Sbd_Par_t
Pars
,
*
pPars
=
&
Pars
;
Sbd_ParSetDefault
(
pPars
);
Extra_UtilGetoptReset
();
while
(
(
c
=
Extra_UtilGetopt
(
argc
,
argv
,
"KWFMCavwh"
)
)
!=
EOF
)
{
switch
(
c
)
{
case
'K'
:
if
(
globalUtilOptind
>=
argc
)
{
Abc_Print
(
-
1
,
"Command line switch
\"
-K
\"
should be followed by an integer.
\n
"
);
goto
usage
;
}
pPars
->
nLutSize
=
atoi
(
argv
[
globalUtilOptind
]);
globalUtilOptind
++
;
if
(
pPars
->
nLutSize
<
0
)
goto
usage
;
break
;
case
'W'
:
if
(
globalUtilOptind
>=
argc
)
{
Abc_Print
(
-
1
,
"Command line switch
\"
-W
\"
should be followed by an integer.
\n
"
);
goto
usage
;
}
pPars
->
nTfoLevels
=
atoi
(
argv
[
globalUtilOptind
]);
globalUtilOptind
++
;
if
(
pPars
->
nTfoLevels
<
0
)
goto
usage
;
break
;
case
'F'
:
if
(
globalUtilOptind
>=
argc
)
{
Abc_Print
(
-
1
,
"Command line switch
\"
-F
\"
should be followed by an integer.
\n
"
);
goto
usage
;
}
pPars
->
nTfoFanMax
=
atoi
(
argv
[
globalUtilOptind
]);
globalUtilOptind
++
;
if
(
pPars
->
nTfoFanMax
<
0
)
goto
usage
;
break
;
case
'M'
:
if
(
globalUtilOptind
>=
argc
)
{
Abc_Print
(
-
1
,
"Command line switch
\"
-M
\"
should be followed by an integer.
\n
"
);
goto
usage
;
}
pPars
->
nWinSizeMax
=
atoi
(
argv
[
globalUtilOptind
]);
globalUtilOptind
++
;
if
(
pPars
->
nWinSizeMax
<
0
)
goto
usage
;
break
;
case
'C'
:
if
(
globalUtilOptind
>=
argc
)
{
Abc_Print
(
-
1
,
"Command line switch
\"
-C
\"
should be followed by an integer.
\n
"
);
goto
usage
;
}
pPars
->
nBTLimit
=
atoi
(
argv
[
globalUtilOptind
]);
globalUtilOptind
++
;
if
(
pPars
->
nBTLimit
<
0
)
goto
usage
;
break
;
case
'a'
:
pPars
->
fArea
^=
1
;
break
;
case
'v'
:
pPars
->
fVerbose
^=
1
;
break
;
case
'w'
:
pPars
->
fVeryVerbose
^=
1
;
break
;
case
'h'
:
goto
usage
;
default:
goto
usage
;
}
}
if
(
pAbc
->
pGia
==
NULL
)
{
Abc_Print
(
-
1
,
"Abc_CommandAbc9Mfs(): There is no AIG.
\n
"
);
return
0
;
}
if
(
Gia_ManBufNum
(
pAbc
->
pGia
)
)
{
Abc_Print
(
-
1
,
"Abc_CommandAbc9Mfs(): This command does not work with barrier buffers.
\n
"
);
return
1
;
}
if
(
Gia_ManHasMapping
(
pAbc
->
pGia
)
)
{
Abc_Print
(
-
1
,
"Abc_CommandAbc9Mfs(): The current AIG has mapping (run &st to unmap).
\n
"
);
return
0
;
}
pTemp
=
Sbd_NtkPerform
(
pAbc
->
pGia
,
pPars
);
Abc_FrameUpdateGia
(
pAbc
,
pTemp
);
return
0
;
usage:
Abc_Print
(
-
2
,
"usage: &mfsd [-KWFMC <num>] [-avwh]
\n
"
);
Abc_Print
(
-
2
,
"
\t
performs SAT-based delay-oriented AIG optimization
\n
"
);
Abc_Print
(
-
2
,
"
\t
-K <num> : the LUT size for delay minimization (2 <= num <= 6) [default = %d]
\n
"
,
pPars
->
nLutSize
);
Abc_Print
(
-
2
,
"
\t
-W <num> : the number of levels in the TFO cone (0 <= num) [default = %d]
\n
"
,
pPars
->
nTfoLevels
);
Abc_Print
(
-
2
,
"
\t
-F <num> : the max number of fanouts to skip (1 <= num) [default = %d]
\n
"
,
pPars
->
nTfoFanMax
);
Abc_Print
(
-
2
,
"
\t
-M <num> : the max node count of windows to consider (0 = no limit) [default = %d]
\n
"
,
pPars
->
nWinSizeMax
);
Abc_Print
(
-
2
,
"
\t
-C <num> : the max number of conflicts in one SAT run (0 = no limit) [default = %d]
\n
"
,
pPars
->
nBTLimit
);
Abc_Print
(
-
2
,
"
\t
-a : toggle minimizing area or area+edges [default = %s]
\n
"
,
pPars
->
fArea
?
"area"
:
"area+edges"
);
Abc_Print
(
-
2
,
"
\t
-v : toggle printing optimization summary [default = %s]
\n
"
,
pPars
->
fVerbose
?
"yes"
:
"no"
);
Abc_Print
(
-
2
,
"
\t
-w : toggle printing detailed stats for each node [default = %s]
\n
"
,
pPars
->
fVeryVerbose
?
"yes"
:
"no"
);
Abc_Print
(
-
2
,
"
\t
-h : print the command usage
\n
"
);
return
1
;
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SideEffects []
This diff is collapsed.
Click to expand it.
src/base/io/ioWriteDot.c
View file @
6b55bf02
...
@@ -74,7 +74,7 @@ void Io_WriteDotNtk( Abc_Ntk_t * pNtk, Vec_Ptr_t * vNodes, Vec_Ptr_t * vNodesSho
...
@@ -74,7 +74,7 @@ void Io_WriteDotNtk( Abc_Ntk_t * pNtk, Vec_Ptr_t * vNodes, Vec_Ptr_t * vNodesSho
Abc_Obj_t
*
pNode
,
*
pFanin
;
Abc_Obj_t
*
pNode
,
*
pFanin
;
char
*
pSopString
;
char
*
pSopString
;
int
LevelMin
,
LevelMax
,
fHasCos
,
Level
,
i
,
k
,
fHasBdds
,
fCompl
,
Prev
;
int
LevelMin
,
LevelMax
,
fHasCos
,
Level
,
i
,
k
,
fHasBdds
,
fCompl
,
Prev
;
int
Limit
=
3
00
;
int
Limit
=
5
00
;
assert
(
Abc_NtkIsStrash
(
pNtk
)
||
Abc_NtkIsLogic
(
pNtk
)
);
assert
(
Abc_NtkIsStrash
(
pNtk
)
||
Abc_NtkIsLogic
(
pNtk
)
);
...
...
This diff is collapsed.
Click to expand it.
src/misc/util/utilTruth.h
View file @
6b55bf02
...
@@ -266,6 +266,28 @@ static inline void Abc_TtAnd( word * pOut, word * pIn1, word * pIn2, int nWords,
...
@@ -266,6 +266,28 @@ static inline void Abc_TtAnd( word * pOut, word * pIn1, word * pIn2, int nWords,
for
(
w
=
0
;
w
<
nWords
;
w
++
)
for
(
w
=
0
;
w
<
nWords
;
w
++
)
pOut
[
w
]
=
pIn1
[
w
]
&
pIn2
[
w
];
pOut
[
w
]
=
pIn1
[
w
]
&
pIn2
[
w
];
}
}
static
inline
void
Abc_TtAndCompl
(
word
*
pOut
,
word
*
pIn1
,
int
fCompl1
,
word
*
pIn2
,
int
fCompl2
,
int
nWords
)
{
int
w
;
if
(
fCompl1
)
{
if
(
fCompl2
)
for
(
w
=
0
;
w
<
nWords
;
w
++
)
pOut
[
w
]
=
~
pIn1
[
w
]
&
~
pIn2
[
w
];
else
for
(
w
=
0
;
w
<
nWords
;
w
++
)
pOut
[
w
]
=
~
pIn1
[
w
]
&
pIn2
[
w
];
}
else
{
if
(
fCompl2
)
for
(
w
=
0
;
w
<
nWords
;
w
++
)
pOut
[
w
]
=
pIn1
[
w
]
&
~
pIn2
[
w
];
else
for
(
w
=
0
;
w
<
nWords
;
w
++
)
pOut
[
w
]
=
pIn1
[
w
]
&
pIn2
[
w
];
}
}
static
inline
void
Abc_TtAndSharp
(
word
*
pOut
,
word
*
pIn1
,
word
*
pIn2
,
int
nWords
,
int
fCompl
)
static
inline
void
Abc_TtAndSharp
(
word
*
pOut
,
word
*
pIn1
,
word
*
pIn2
,
int
nWords
,
int
fCompl
)
{
{
int
w
;
int
w
;
...
@@ -288,6 +310,12 @@ static inline void Abc_TtOr( word * pOut, word * pIn1, word * pIn2, int nWords )
...
@@ -288,6 +310,12 @@ static inline void Abc_TtOr( word * pOut, word * pIn1, word * pIn2, int nWords )
for
(
w
=
0
;
w
<
nWords
;
w
++
)
for
(
w
=
0
;
w
<
nWords
;
w
++
)
pOut
[
w
]
=
pIn1
[
w
]
|
pIn2
[
w
];
pOut
[
w
]
=
pIn1
[
w
]
|
pIn2
[
w
];
}
}
static
inline
void
Abc_TtOrXor
(
word
*
pOut
,
word
*
pIn1
,
word
*
pIn2
,
int
nWords
)
{
int
w
;
for
(
w
=
0
;
w
<
nWords
;
w
++
)
pOut
[
w
]
|=
pIn1
[
w
]
^
pIn2
[
w
];
}
static
inline
void
Abc_TtXor
(
word
*
pOut
,
word
*
pIn1
,
word
*
pIn2
,
int
nWords
,
int
fCompl
)
static
inline
void
Abc_TtXor
(
word
*
pOut
,
word
*
pIn1
,
word
*
pIn2
,
int
nWords
,
int
fCompl
)
{
{
int
w
;
int
w
;
...
...
This diff is collapsed.
Click to expand it.
src/opt/sbd/sbd.h
View file @
6b55bf02
...
@@ -35,42 +35,21 @@ ABC_NAMESPACE_HEADER_START
...
@@ -35,42 +35,21 @@ ABC_NAMESPACE_HEADER_START
/// BASIC TYPES ///
/// BASIC TYPES ///
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
typedef
struct
Sbd_Ntk_t_
Sbd_Ntk_t
;
typedef
struct
Sbd_Par_t_
Sbd_Par_t
;
typedef
struct
Sbd_Par_t_
Sbd_Par_t
;
struct
Sbd_Par_t_
struct
Sbd_Par_t_
{
{
int
nTfoLevMax
;
// the maximum fanout levels
int
nLutSize
;
// target LUT size
int
nTfiLevMax
;
// the maximum fanin levels
int
nTfoLevels
;
// the number of TFO levels (windowing)
int
nFanoutMax
;
// the maximum number of fanouts
int
nTfoFanMax
;
// the max number of fanouts (windowing)
int
nDepthMax
;
// the maximum depth to try
int
nWinSizeMax
;
// maximum window size (windowing)
int
nVarMax
;
// the maximum variable count
int
nBTLimit
;
// maximum number of SAT conflicts
int
nMffcMin
;
// the minimum MFFC size
int
nWords
;
// simulation word count
int
nMffcMax
;
// the maximum MFFC size
int
fArea
;
// area-oriented optimization
int
nDecMax
;
// the maximum number of decompositions
int
fVerbose
;
// verbose flag
int
nWinSizeMax
;
// the maximum window size
int
fVeryVerbose
;
// verbose flag
int
nGrowthLevel
;
// the maximum allowed growth in level
int
nBTLimit
;
// the maximum number of conflicts in one SAT run
int
nNodesMax
;
// the maximum number of nodes to try
int
iNodeOne
;
// one particular node to try
int
nFirstFixed
;
// the number of first nodes to be treated as fixed
int
nTimeWin
;
// the size of timing window in percents
int
DeltaCrit
;
// delay delta in picoseconds
int
DelAreaRatio
;
// delay/area tradeoff (how many ps we trade for a unit of area)
int
fRrOnly
;
// perform redundance removal
int
fArea
;
// performs optimization for area
int
fAreaRev
;
// performs optimization for area in reverse order
int
fMoreEffort
;
// performs high-affort minimization
int
fUseAndOr
;
// enable internal detection of AND/OR gates
int
fZeroCost
;
// enable zero-cost replacement
int
fUseSim
;
// enable simulation
int
fPrintDecs
;
// enable printing decompositions
int
fAllBoxes
;
// enable preserving all boxes
int
fLibVerbose
;
// enable library stats
int
fDelayVerbose
;
// enable delay stats
int
fVerbose
;
// enable basic stats
int
fVeryVerbose
;
// enable detailed stats
};
};
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
/// MACRO DEFINITIONS ///
/// MACRO DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
...
@@ -82,16 +61,7 @@ struct Sbd_Par_t_
...
@@ -82,16 +61,7 @@ struct Sbd_Par_t_
/*=== sbdCnf.c ==========================================================*/
/*=== sbdCnf.c ==========================================================*/
/*=== sbdCore.c ==========================================================*/
/*=== sbdCore.c ==========================================================*/
extern
void
Sbd_ParSetDefault
(
Sbd_Par_t
*
pPars
);
extern
void
Sbd_ParSetDefault
(
Sbd_Par_t
*
pPars
);
extern
int
Sbd_NtkPerform
(
Sbd_Ntk_t
*
p
,
Sbd_Par_t
*
pPars
);
extern
Gia_Man_t
*
Sbd_NtkPerform
(
Gia_Man_t
*
p
,
Sbd_Par_t
*
pPars
);
/*=== sbdNtk.c ==========================================================*/
extern
Sbd_Ntk_t
*
Sbd_NtkConstruct
(
Vec_Wec_t
*
vFanins
,
int
nPis
,
int
nPos
,
Vec_Str_t
*
vFixed
,
Vec_Str_t
*
vEmpty
,
Vec_Wrd_t
*
vTruths
);
extern
void
Sbd_NtkFree
(
Sbd_Ntk_t
*
p
);
extern
Vec_Int_t
*
Sbd_NodeReadFanins
(
Sbd_Ntk_t
*
p
,
int
i
);
extern
word
*
Sbd_NodeReadTruth
(
Sbd_Ntk_t
*
p
,
int
i
);
extern
int
Sbd_NodeReadFixed
(
Sbd_Ntk_t
*
p
,
int
i
);
extern
int
Sbd_NodeReadUsed
(
Sbd_Ntk_t
*
p
,
int
i
);
/*=== sbdWin.c ==========================================================*/
extern
Vec_Int_t
*
Sbd_NtkDfs
(
Sbd_Ntk_t
*
p
,
Vec_Wec_t
*
vGroups
,
Vec_Int_t
*
vGroupMap
,
Vec_Int_t
*
vBoxesLeft
,
int
fAllBoxes
);
ABC_NAMESPACE_HEADER_END
ABC_NAMESPACE_HEADER_END
...
...
This diff is collapsed.
Click to expand it.
src/opt/sbd/sbdCore.c
View file @
6b55bf02
This diff is collapsed.
Click to expand it.
src/opt/sbd/sbdInt.h
View file @
6b55bf02
...
@@ -34,6 +34,7 @@
...
@@ -34,6 +34,7 @@
#include "misc/vec/vec.h"
#include "misc/vec/vec.h"
#include "sat/bsat/satSolver.h"
#include "sat/bsat/satSolver.h"
#include "misc/util/utilNam.h"
#include "misc/util/utilNam.h"
#include "misc/util/utilTruth.h"
#include "map/scl/sclLib.h"
#include "map/scl/sclLib.h"
#include "map/scl/sclCon.h"
#include "map/scl/sclCon.h"
#include "bool/kit/kit.h"
#include "bool/kit/kit.h"
...
...
This diff is collapsed.
Click to expand it.
src/opt/sbd/sbdSat.c
View file @
6b55bf02
...
@@ -37,6 +37,179 @@ ABC_NAMESPACE_IMPL_START
...
@@ -37,6 +37,179 @@ ABC_NAMESPACE_IMPL_START
/// FUNCTION DEFINITIONS ///
/// FUNCTION DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
#define SBD_LUTS_MAX 2
#define SBD_SIZE_MAX 4
#define SBD_DIV_MAX 16
// new AIG manager
typedef
struct
Sbd_Pro_t_
Sbd_Pro_t
;
struct
Sbd_Pro_t_
{
int
nLuts
;
// LUT count
int
nSize
;
// LUT size
int
nDivs
;
// divisor count
int
nVars
;
// intermediate variables (nLuts * nSize)
int
nPars
;
// total parameter count (nLuts * (1 << nSize) + nLuts * nSize * nDivs)
int
pPars1
[
SBD_LUTS_MAX
][
1
<<
SBD_SIZE_MAX
];
// lut parameters
int
pPars2
[
SBD_LUTS_MAX
][
SBD_SIZE_MAX
][
SBD_DIV_MAX
];
// topo parameters
int
pVars
[
SBD_LUTS_MAX
][
SBD_SIZE_MAX
+
1
];
// internal variables
int
pDivs
[
SBD_DIV_MAX
];
// divisor variables (external)
};
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
Vec_Int_t
*
Sbd_ProblemSetup
(
Sbd_Pro_t
*
p
,
int
nLuts
,
int
nSize
,
int
nDivs
)
{
Vec_Int_t
*
vCnf
=
Vec_IntAlloc
(
1000
);
int
i
,
k
,
d
,
v
,
n
,
iVar
=
0
;
assert
(
nLuts
>=
1
&&
nLuts
<=
2
);
memset
(
p
,
0
,
sizeof
(
Sbd_Pro_t
)
);
p
->
nLuts
=
nLuts
;
p
->
nSize
=
nSize
;
p
->
nDivs
=
nDivs
;
p
->
nVars
=
nLuts
*
nSize
;
p
->
nPars
=
nLuts
*
(
1
<<
nSize
)
+
nLuts
*
nSize
*
nDivs
;
// set parameters
for
(
i
=
0
;
i
<
nLuts
;
i
++
)
for
(
k
=
0
;
k
<
(
1
<<
nSize
);
k
++
)
p
->
pPars1
[
i
][
k
]
=
iVar
++
;
for
(
i
=
0
;
i
<
nLuts
;
i
++
)
for
(
k
=
0
;
k
<
nSize
;
k
++
)
for
(
d
=
0
;
d
<
nDivs
;
d
++
)
p
->
pPars2
[
i
][
k
][
d
]
=
iVar
++
;
// set intermediate variables
for
(
i
=
0
;
i
<
nLuts
;
i
++
)
for
(
k
=
0
;
k
<
nSize
;
k
++
)
p
->
pVars
[
i
][
k
]
=
iVar
++
;
// set top variables
for
(
i
=
1
;
i
<
nLuts
;
i
++
)
p
->
pVars
[
i
][
nSize
]
=
p
->
pVars
[
i
-
1
][
0
];
// set divisor variables
for
(
d
=
0
;
d
<
nDivs
;
d
++
)
p
->
pDivs
[
d
]
=
iVar
++
;
assert
(
iVar
==
p
->
nPars
+
p
->
nVars
+
p
->
nDivs
);
// input compatiblity clauses
for
(
i
=
0
;
i
<
nLuts
;
i
++
)
for
(
k
=
(
i
>
0
);
k
<
nSize
;
k
++
)
for
(
d
=
0
;
d
<
nDivs
;
d
++
)
for
(
n
=
0
;
n
<
nDivs
;
n
++
)
{
if
(
n
<
d
)
{
Vec_IntPush
(
vCnf
,
Abc_Var2Lit
(
p
->
pPars2
[
i
][
k
][
d
],
0
)
);
Vec_IntPush
(
vCnf
,
Abc_Var2Lit
(
p
->
pPars2
[
i
][
k
][
n
],
0
)
);
Vec_IntPush
(
vCnf
,
-
1
);
}
else
if
(
k
<
nSize
-
1
)
{
Vec_IntPush
(
vCnf
,
Abc_Var2Lit
(
p
->
pPars2
[
i
][
k
][
d
],
0
)
);
Vec_IntPush
(
vCnf
,
Abc_Var2Lit
(
p
->
pPars2
[
i
][
k
+
1
][
n
],
0
)
);
Vec_IntPush
(
vCnf
,
-
1
);
}
}
// create LUT clauses
for
(
i
=
0
;
i
<
nLuts
;
i
++
)
for
(
k
=
0
;
k
<
(
1
<<
nSize
);
k
++
)
for
(
n
=
0
;
n
<
2
;
n
++
)
{
for
(
v
=
0
;
v
<
nSize
;
v
++
)
Vec_IntPush
(
vCnf
,
Abc_Var2Lit
(
p
->
pPars1
[
i
][
v
],
(
k
>>
v
)
&
1
)
);
Vec_IntPush
(
vCnf
,
Abc_Var2Lit
(
p
->
pVars
[
i
][
nSize
],
n
)
);
Vec_IntPush
(
vCnf
,
Abc_Var2Lit
(
p
->
pPars1
[
i
][
k
],
!
n
)
);
Vec_IntPush
(
vCnf
,
-
1
);
}
// create input clauses
for
(
i
=
0
;
i
<
nLuts
;
i
++
)
for
(
k
=
(
i
>
0
);
k
<
nSize
;
k
++
)
for
(
d
=
0
;
d
<
nDivs
;
d
++
)
for
(
n
=
0
;
n
<
2
;
n
++
)
{
Vec_IntPush
(
vCnf
,
Abc_Var2Lit
(
p
->
pPars2
[
i
][
k
][
d
],
0
)
);
Vec_IntPush
(
vCnf
,
Abc_Var2Lit
(
p
->
pPars1
[
i
][
k
],
n
)
);
Vec_IntPush
(
vCnf
,
Abc_Var2Lit
(
p
->
pDivs
[
d
],
!
n
)
);
Vec_IntPush
(
vCnf
,
-
1
);
}
return
vCnf
;
}
// add clauses to the don't-care computation solver
void
Sbd_ProblemLoad1
(
Sbd_Pro_t
*
p
,
Vec_Int_t
*
vCnf
,
int
iStartVar
,
int
*
pDivVars
,
int
iTopVar
,
sat_solver
*
pSat
)
{
int
pLits
[
8
],
nLits
,
i
,
k
,
iLit
,
RetValue
;
int
ThisTopVar
=
p
->
pVars
[
0
][
p
->
nSize
];
int
FirstDivVar
=
p
->
nPars
+
p
->
nVars
;
// add clauses
for
(
i
=
0
;
i
<
Vec_IntSize
(
vCnf
);
i
++
)
{
assert
(
Vec_IntEntry
(
vCnf
,
i
)
!=
-
1
);
for
(
k
=
i
+
1
;
k
<
Vec_IntSize
(
vCnf
);
k
++
)
if
(
Vec_IntEntry
(
vCnf
,
i
)
==
-
1
)
break
;
nLits
=
0
;
Vec_IntForEachEntryStartStop
(
vCnf
,
iLit
,
i
,
i
,
k
)
{
if
(
Abc_Lit2Var
(
iLit
)
==
ThisTopVar
)
pLits
[
nLits
++
]
=
Abc_Var2Lit
(
ThisTopVar
,
Abc_LitIsCompl
(
iLit
)
);
else
if
(
Abc_Lit2Var
(
iLit
)
>=
FirstDivVar
)
pLits
[
nLits
++
]
=
Abc_Var2Lit
(
pDivVars
[
Abc_Lit2Var
(
iLit
)
-
FirstDivVar
],
Abc_LitIsCompl
(
iLit
)
);
else
pLits
[
nLits
++
]
=
iLit
+
2
*
iStartVar
;
}
assert
(
nLits
<=
8
);
RetValue
=
sat_solver_addclause
(
pSat
,
pLits
,
pLits
+
nLits
);
assert
(
RetValue
);
}
}
// add clauses to the functionality evaluation solver
void
Sbd_ProblemLoad2
(
Sbd_Pro_t
*
p
,
Vec_Wec_t
*
vCnf
,
int
iStartVar
,
int
*
pDivVarValues
,
int
iTopVarValue
,
sat_solver
*
pSat
)
{
Vec_Int_t
*
vLevel
;
int
pLits
[
8
],
nLits
,
i
,
k
,
iLit
,
RetValue
;
int
ThisTopVar
=
p
->
pVars
[
0
][
p
->
nSize
];
int
FirstDivVar
=
p
->
nPars
+
p
->
nVars
;
int
FirstIntVar
=
p
->
nPars
;
// add clauses
Vec_WecForEachLevel
(
vCnf
,
vLevel
,
i
)
{
nLits
=
0
;
Vec_IntForEachEntry
(
vLevel
,
iLit
,
k
)
{
if
(
Abc_Lit2Var
(
iLit
)
==
ThisTopVar
)
{
if
(
Abc_LitIsCompl
(
iLit
)
==
iTopVarValue
)
break
;
continue
;
}
else
if
(
Abc_Lit2Var
(
iLit
)
>=
FirstDivVar
)
{
if
(
Abc_LitIsCompl
(
iLit
)
==
pDivVarValues
[
Abc_Lit2Var
(
iLit
)
-
FirstDivVar
]
)
break
;
continue
;
}
else
if
(
Abc_Lit2Var
(
iLit
)
>=
FirstIntVar
)
pLits
[
nLits
++
]
=
iLit
+
2
*
iStartVar
;
else
pLits
[
nLits
++
]
=
iLit
;
}
if
(
k
<
Vec_IntSize
(
vLevel
)
)
continue
;
assert
(
nLits
<=
8
);
RetValue
=
sat_solver_addclause
(
pSat
,
pLits
,
pLits
+
nLits
);
assert
(
RetValue
);
}
}
/**Function*************************************************************
/**Function*************************************************************
Synopsis []
Synopsis []
...
...
This diff is collapsed.
Click to expand it.
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