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
7d90895d
Commit
7d90895d
authored
May 01, 2021
by
Alan Mishchenko
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Experiments with LUT mapping for small functions.
parent
645752f7
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
226 additions
and
4 deletions
+226
-4
src/aig/gia/giaMinLut.c
+152
-0
src/aig/gia/module.make
+1
-0
src/base/abci/abc.c
+68
-0
src/base/abci/abcNtbdd.c
+5
-4
No files found.
src/aig/gia/giaMinLut.c
0 → 100644
View file @
7d90895d
/**CFile****************************************************************
FileName [giaMinLut.c]
SystemName [ABC: Logic synthesis and verification system.]
PackageName [Scalable AIG package.]
Synopsis [Collapsing AIG.]
Author [Alan Mishchenko]
Affiliation [UC Berkeley]
Date [Ver. 1.0. Started - June 20, 2005.]
Revision [$Id: giaMinLut.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
***********************************************************************/
#include "gia.h"
#include "giaAig.h"
#include "base/main/mainInt.h"
#include "opt/sfm/sfm.h"
#ifdef ABC_USE_CUDD
#include "bdd/extrab/extraBdd.h"
#include "bdd/dsd/dsd.h"
#endif
ABC_NAMESPACE_IMPL_START
////////////////////////////////////////////////////////////////////////
/// DECLARATIONS ///
////////////////////////////////////////////////////////////////////////
#ifdef ABC_USE_CUDD
////////////////////////////////////////////////////////////////////////
/// FUNCTION DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
Gia_Man_t
*
Gia_ManDoMuxMapping
(
Gia_Man_t
*
p
)
{
extern
Gia_Man_t
*
Gia_ManPerformMfs
(
Gia_Man_t
*
p
,
Sfm_Par_t
*
pPars
);
Gia_Man_t
*
pTemp
,
*
pNew
=
Gia_ManDup
(
p
);
Jf_Par_t
Pars
,
*
pPars
=
&
Pars
;
int
c
,
nIters
=
2
;
Sfm_Par_t
Pars2
,
*
pPars2
=
&
Pars2
;
Lf_ManSetDefaultPars
(
pPars
);
Sfm_ParSetDefault
(
pPars2
);
pPars2
->
nTfoLevMax
=
5
;
pPars2
->
nDepthMax
=
100
;
pPars2
->
nWinSizeMax
=
2000
;
for
(
c
=
0
;
c
<
nIters
;
c
++
)
{
pNew
=
Lf_ManPerformMapping
(
pTemp
=
pNew
,
pPars
);
Gia_ManStop
(
pTemp
);
pNew
=
Gia_ManPerformMfs
(
pTemp
=
pNew
,
pPars2
);
Gia_ManStop
(
pTemp
);
if
(
c
==
nIters
-
1
)
break
;
pNew
=
(
Gia_Man_t
*
)
Dsm_ManDeriveGia
(
pTemp
=
pNew
,
0
);
Gia_ManStop
(
pTemp
);
}
return
pNew
;
}
Gia_Man_t
*
Gia_ManDoMuxTransform
(
Gia_Man_t
*
p
,
int
fReorder
)
{
extern
Gia_Man_t
*
Abc_NtkStrashToGia
(
Abc_Ntk_t
*
pNtk
);
extern
Abc_Ntk_t
*
Abc_NtkFromAigPhase
(
Aig_Man_t
*
pMan
);
extern
int
Abc_NtkBddToMuxesPerformGlo
(
Abc_Ntk_t
*
pNtk
,
Abc_Ntk_t
*
pNtkNew
,
int
Limit
,
int
fReorder
);
Gia_Man_t
*
pRes
=
NULL
;
Aig_Man_t
*
pMan
=
Gia_ManToAig
(
p
,
0
);
Abc_Ntk_t
*
pNtk
=
Abc_NtkFromAigPhase
(
pMan
);
Abc_Ntk_t
*
pNtkNew
=
Abc_NtkStartFrom
(
pNtk
,
ABC_NTK_LOGIC
,
ABC_FUNC_SOP
);
pNtk
->
pName
=
Extra_UtilStrsav
(
pMan
->
pName
);
Aig_ManStop
(
pMan
);
if
(
Abc_NtkBddToMuxesPerformGlo
(
pNtk
,
pNtkNew
,
1000000
,
fReorder
)
)
{
Abc_Ntk_t
*
pStrash
=
Abc_NtkStrash
(
pNtkNew
,
1
,
1
,
0
);
pRes
=
Abc_NtkStrashToGia
(
pStrash
);
Abc_NtkDelete
(
pStrash
);
}
Abc_NtkDelete
(
pNtkNew
);
Abc_NtkDelete
(
pNtk
);
return
pRes
;
}
int
Gia_ManDoTest1
(
Gia_Man_t
*
p
,
int
fReorder
)
{
Gia_Man_t
*
pTemp
,
*
pNew
;
int
Res
;
pNew
=
Gia_ManDoMuxTransform
(
p
,
fReorder
);
pNew
=
Gia_ManDoMuxMapping
(
pTemp
=
pNew
);
Gia_ManStop
(
pTemp
);
Res
=
Gia_ManLutNum
(
pNew
);
Gia_ManStop
(
pNew
);
return
Res
;
}
Gia_Man_t
*
Gia_ManPerformMinLut
(
Gia_Man_t
*
p
,
int
GroupSize
,
int
LutSize
,
int
fVerbose
)
{
Gia_Man_t
*
pNew
=
NULL
;
int
Res1
,
Res2
,
Result
=
0
;
int
g
,
nGroups
=
Gia_ManCoNum
(
p
)
/
GroupSize
;
assert
(
Gia_ManCoNum
(
p
)
%
GroupSize
==
0
);
assert
(
GroupSize
<=
64
);
for
(
g
=
0
;
g
<
nGroups
;
g
++
)
{
Gia_Man_t
*
pNew
;
//, * pTemp;
int
fTrimPis
=
0
;
int
o
,
pPos
[
64
];
for
(
o
=
0
;
o
<
GroupSize
;
o
++
)
pPos
[
o
]
=
g
*
GroupSize
+
o
;
pNew
=
Gia_ManDupCones
(
p
,
pPos
,
GroupSize
,
fTrimPis
);
printf
(
"%3d / %3d : "
,
g
,
nGroups
);
printf
(
"Test1 = %4d "
,
Res1
=
Gia_ManDoTest1
(
pNew
,
0
)
);
printf
(
"Test2 = %4d "
,
Res2
=
Gia_ManDoTest1
(
pNew
,
1
)
);
printf
(
"Test = %4d "
,
Abc_MinInt
(
Res1
,
Res2
)
);
printf
(
"
\n
"
);
Result
+=
Abc_MinInt
(
Res1
,
Res2
);
//Gia_ManPrintStats( pNew, NULL );
Gia_ManStop
(
pNew
);
}
printf
(
"Total LUT count = %d.
\n
"
,
Result
);
return
pNew
;
}
#else
Gia_Man_t
*
Gia_ManPerformMinLut
(
Gia_Man_t
*
p
,
int
GroupSize
,
int
LutSize
,
int
fVerbose
)
{
return
NULL
;
}
#endif
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////
ABC_NAMESPACE_IMPL_END
src/aig/gia/module.make
View file @
7d90895d
...
...
@@ -51,6 +51,7 @@ SRC += src/aig/gia/giaAig.c \
src/aig/gia/giaMem.c
\
src/aig/gia/giaMfs.c
\
src/aig/gia/giaMini.c
\
src/aig/gia/giaMinLut.c
\
src/aig/gia/giaMuxes.c
\
src/aig/gia/giaNf.c
\
src/aig/gia/giaOf.c
\
...
...
src/base/abci/abc.c
View file @
7d90895d
...
...
@@ -485,6 +485,7 @@ static int Abc_CommandAbc9Of ( Abc_Frame_t * pAbc, int argc, cha
static
int
Abc_CommandAbc9Pack
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Abc_CommandAbc9Edge
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Abc_CommandAbc9SatLut
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Abc_CommandAbc9MinLut
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Abc_CommandAbc9Unmap
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Abc_CommandAbc9Struct
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Abc_CommandAbc9Trace
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
...
...
@@ -1208,6 +1209,7 @@ void Abc_Init( Abc_Frame_t * pAbc )
Cmd_CommandAdd
(
pAbc
,
"ABC9"
,
"&pack"
,
Abc_CommandAbc9Pack
,
0
);
Cmd_CommandAdd
(
pAbc
,
"ABC9"
,
"&edge"
,
Abc_CommandAbc9Edge
,
0
);
Cmd_CommandAdd
(
pAbc
,
"ABC9"
,
"&satlut"
,
Abc_CommandAbc9SatLut
,
0
);
Cmd_CommandAdd
(
pAbc
,
"ABC9"
,
"&minlut"
,
Abc_CommandAbc9MinLut
,
0
);
Cmd_CommandAdd
(
pAbc
,
"ABC9"
,
"&unmap"
,
Abc_CommandAbc9Unmap
,
0
);
Cmd_CommandAdd
(
pAbc
,
"ABC9"
,
"&struct"
,
Abc_CommandAbc9Struct
,
0
);
Cmd_CommandAdd
(
pAbc
,
"ABC9"
,
"&trace"
,
Abc_CommandAbc9Trace
,
0
);
...
...
@@ -40821,6 +40823,72 @@ usage:
SeeAlso []
***********************************************************************/
int
Abc_CommandAbc9MinLut
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
)
{
extern
Gia_Man_t
*
Gia_ManPerformMinLut
(
Gia_Man_t
*
p
,
int
GroupSize
,
int
LutSize
,
int
fVerbose
);
Gia_Man_t
*
pTemp
;
int
c
,
LutSize
=
6
,
GroupSize
=
3
,
fVerbose
=
0
;
Extra_UtilGetoptReset
();
while
(
(
c
=
Extra_UtilGetopt
(
argc
,
argv
,
"KGvh"
)
)
!=
EOF
)
{
switch
(
c
)
{
case
'K'
:
if
(
globalUtilOptind
>=
argc
)
{
Abc_Print
(
-
1
,
"Command line switch
\"
-K
\"
should be followed by a positive integer.
\n
"
);
goto
usage
;
}
LutSize
=
atoi
(
argv
[
globalUtilOptind
]);
globalUtilOptind
++
;
break
;
case
'G'
:
if
(
globalUtilOptind
>=
argc
)
{
Abc_Print
(
-
1
,
"Command line switch
\"
-G
\"
should be followed by a positive integer.
\n
"
);
goto
usage
;
}
GroupSize
=
atoi
(
argv
[
globalUtilOptind
]);
globalUtilOptind
++
;
break
;
case
'v'
:
fVerbose
^=
1
;
break
;
case
'h'
:
default:
goto
usage
;
}
}
if
(
pAbc
->
pGia
==
NULL
)
{
Abc_Print
(
-
1
,
"Empty GIA network.
\n
"
);
return
1
;
}
pTemp
=
Gia_ManPerformMinLut
(
pAbc
->
pGia
,
GroupSize
,
LutSize
,
fVerbose
);
//Abc_FrameUpdateGia( pAbc, pTemp );
return
0
;
usage:
Abc_Print
(
-
2
,
"usage: &minlut [-KG num] [-vh]
\n
"
);
Abc_Print
(
-
2
,
"
\t
performs specialized LUT mapping
\n
"
);
Abc_Print
(
-
2
,
"
\t
-K num : the LUT size for mapping [default = %d]
\n
"
,
LutSize
);
Abc_Print
(
-
2
,
"
\t
-G num : the output group size [default = %d]
\n
"
,
GroupSize
);
Abc_Print
(
-
2
,
"
\t
-v : toggles verbose output [default = %s]
\n
"
,
fVerbose
?
"yes"
:
"no"
);
Abc_Print
(
-
2
,
"
\t
-h : prints the command usage
\n
"
);
return
1
;
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int
Abc_CommandAbc9Unmap
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
)
{
extern
void
Gia_ManTestStruct
(
Gia_Man_t
*
p
);
src/base/abci/abcNtbdd.c
View file @
7d90895d
...
...
@@ -34,7 +34,7 @@ ABC_NAMESPACE_IMPL_START
#ifdef ABC_USE_CUDD
static
int
Abc_NtkBddToMuxesPerformGlo
(
Abc_Ntk_t
*
pNtk
,
Abc_Ntk_t
*
pNtkNew
,
int
Limit
);
int
Abc_NtkBddToMuxesPerformGlo
(
Abc_Ntk_t
*
pNtk
,
Abc_Ntk_t
*
pNtkNew
,
int
Limit
,
int
fReorder
);
static
void
Abc_NtkBddToMuxesPerform
(
Abc_Ntk_t
*
pNtk
,
Abc_Ntk_t
*
pNtkNew
);
static
Abc_Obj_t
*
Abc_NodeBddToMuxes
(
Abc_Obj_t
*
pNodeOld
,
Abc_Ntk_t
*
pNtkNew
);
static
Abc_Obj_t
*
Abc_NodeBddToMuxes_rec
(
DdManager
*
dd
,
DdNode
*
bFunc
,
Abc_Ntk_t
*
pNtkNew
,
st__table
*
tBdd2Node
);
...
...
@@ -135,7 +135,7 @@ Abc_Ntk_t * Abc_NtkBddToMuxes( Abc_Ntk_t * pNtk, int fGlobal, int Limit )
pNtkNew
=
Abc_NtkStartFrom
(
pNtk
,
ABC_NTK_LOGIC
,
ABC_FUNC_SOP
);
if
(
fGlobal
)
{
if
(
!
Abc_NtkBddToMuxesPerformGlo
(
pNtk
,
pNtkNew
,
Limit
)
)
if
(
!
Abc_NtkBddToMuxesPerformGlo
(
pNtk
,
pNtkNew
,
Limit
,
0
)
)
{
Abc_NtkDelete
(
pNtkNew
);
return
NULL
;
...
...
@@ -265,13 +265,13 @@ Abc_Obj_t * Abc_NodeBddToMuxes_rec( DdManager * dd, DdNode * bFunc, Abc_Ntk_t *
SeeAlso []
***********************************************************************/
int
Abc_NtkBddToMuxesPerformGlo
(
Abc_Ntk_t
*
pNtk
,
Abc_Ntk_t
*
pNtkNew
,
int
Limit
)
int
Abc_NtkBddToMuxesPerformGlo
(
Abc_Ntk_t
*
pNtk
,
Abc_Ntk_t
*
pNtkNew
,
int
Limit
,
int
fReorder
)
{
DdManager
*
dd
;
Abc_Obj_t
*
pObj
,
*
pObjNew
;
int
i
;
st__table
*
tBdd2Node
;
assert
(
Abc_NtkIsStrash
(
pNtk
)
);
dd
=
(
DdManager
*
)
Abc_NtkBuildGlobalBdds
(
pNtk
,
Limit
,
1
,
1
,
0
,
0
);
dd
=
(
DdManager
*
)
Abc_NtkBuildGlobalBdds
(
pNtk
,
Limit
,
1
,
1
,
fReorder
,
0
);
if
(
dd
==
NULL
)
{
printf
(
"Construction of global BDDs has failed.
\n
"
);
...
...
@@ -410,6 +410,7 @@ void * Abc_NtkBuildGlobalBdds( Abc_Ntk_t * pNtk, int nBddSizeMax, int fDropInter
if
(
fReorder
)
{
Cudd_ReduceHeap
(
dd
,
CUDD_REORDER_SYMM_SIFT
,
1
);
// Cudd_ReduceHeap( dd, CUDD_REORDER_SYMM_SIFT, 1 );
Cudd_AutodynDisable
(
dd
);
}
// Cudd_PrintInfo( dd, stdout );
...
...
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