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
54b4692d
Commit
54b4692d
authored
Dec 29, 2016
by
Alan Mishchenko
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Updates to delay optimization project.
parent
4488ab83
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
69 additions
and
32 deletions
+69
-32
src/base/abci/abc.c
+14
-2
src/opt/dau/dauGia.c
+1
-1
src/opt/sbd/sbd.h
+1
-0
src/opt/sbd/sbdCore.c
+0
-0
src/opt/sbd/sbdCut.c
+44
-18
src/opt/sbd/sbdInt.h
+2
-1
src/opt/sbd/sbdLut.c
+7
-10
No files found.
src/base/abci/abc.c
View file @
54b4692d
...
...
@@ -41010,7 +41010,7 @@ int Abc_CommandAbc9Mfsd( Abc_Frame_t * pAbc, int argc, char ** argv )
Sbd_Par_t
Pars
,
*
pPars
=
&
Pars
;
Sbd_ParSetDefault
(
pPars
);
Extra_UtilGetoptReset
();
while
(
(
c
=
Extra_UtilGetopt
(
argc
,
argv
,
"KWFMCacvwh"
)
)
!=
EOF
)
while
(
(
c
=
Extra_UtilGetopt
(
argc
,
argv
,
"K
S
WFMCacvwh"
)
)
!=
EOF
)
{
switch
(
c
)
{
...
...
@@ -41025,6 +41025,17 @@ int Abc_CommandAbc9Mfsd( Abc_Frame_t * pAbc, int argc, char ** argv )
if
(
pPars
->
nLutSize
<
0
)
goto
usage
;
break
;
case
'S'
:
if
(
globalUtilOptind
>=
argc
)
{
Abc_Print
(
-
1
,
"Command line switch
\"
-S
\"
should be followed by an integer.
\n
"
);
goto
usage
;
}
pPars
->
nLutNum
=
atoi
(
argv
[
globalUtilOptind
]);
globalUtilOptind
++
;
if
(
pPars
->
nLutNum
<
0
)
goto
usage
;
break
;
case
'W'
:
if
(
globalUtilOptind
>=
argc
)
{
...
...
@@ -41107,9 +41118,10 @@ int Abc_CommandAbc9Mfsd( Abc_Frame_t * pAbc, int argc, char ** argv )
return
0
;
usage:
Abc_Print
(
-
2
,
"usage: &mfsd [-KWFMC <num>] [-acvwh]
\n
"
);
Abc_Print
(
-
2
,
"usage: &mfsd [-K
S
WFMC <num>] [-acvwh]
\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
-S <num> : the LUT structure size (1 <= num <= 2) [default = %d]
\n
"
,
pPars
->
nLutNum
);
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
);
src/opt/dau/dauGia.c
View file @
54b4692d
...
...
@@ -241,7 +241,7 @@ int Dau_DsdBalance( Gia_Man_t * pGia, int * pFans, int nFans, int fAnd )
if
(
pGia
->
pHTable
==
NULL
)
{
if
(
fAnd
)
iFan
=
Gia_ManAppendAnd
(
pGia
,
iFan0
,
iFan1
);
iFan
=
Gia_ManAppendAnd
2
(
pGia
,
iFan0
,
iFan1
);
else
if
(
pGia
->
pMuxes
)
{
int
fCompl
=
Abc_LitIsCompl
(
iFan0
)
^
Abc_LitIsCompl
(
iFan1
);
...
...
src/opt/sbd/sbd.h
View file @
54b4692d
...
...
@@ -39,6 +39,7 @@ typedef struct Sbd_Par_t_ Sbd_Par_t;
struct
Sbd_Par_t_
{
int
nLutSize
;
// target LUT size
int
nLutNum
;
// target LUT count
int
nTfoLevels
;
// the number of TFO levels (windowing)
int
nTfoFanMax
;
// the max number of fanouts (windowing)
int
nWinSizeMax
;
// maximum window size (windowing)
...
...
src/opt/sbd/sbdCore.c
View file @
54b4692d
This diff is collapsed.
Click to expand it.
src/opt/sbd/sbdCut.c
View file @
54b4692d
...
...
@@ -40,8 +40,9 @@ struct Sbd_Cut_t_
int
iFunc
;
// functionality
int
Cost
;
// cut cost
int
CostLev
;
// cut cost
unsigned
nSlowLeaves
:
14
;
// slow leaves
unsigned
nTreeLeaves
:
14
;
// tree leaves
unsigned
nTreeLeaves
:
9
;
// tree leaves
unsigned
nSlowLeaves
:
9
;
// slow leaves
unsigned
nTopLeaves
:
10
;
// top leaves
unsigned
nLeaves
:
4
;
// leaf count
int
pLeaves
[
SBD_MAX_CUTSIZE
];
// leaves
};
...
...
@@ -442,13 +443,6 @@ static inline int Sbd_CutCountBits( word i )
i
=
((
i
+
(
i
>>
4
))
&
0x0F0F0F0F0F0F0F0F
);
return
(
i
*
(
0x0101010101010101
))
>>
56
;
}
static
inline
int
Sbd_CutSlowLeaves
(
Sbd_Sto_t
*
p
,
int
iObj
,
Sbd_Cut_t
*
pCut
)
{
int
i
,
Count
=
0
,
Delay
=
Vec_IntEntry
(
p
->
vDelays
,
iObj
);
for
(
i
=
0
;
i
<
(
int
)
pCut
->
nLeaves
;
i
++
)
Count
+=
(
Vec_IntEntry
(
p
->
vDelays
,
pCut
->
pLeaves
[
i
])
-
Delay
>=
-
1
);
return
Count
;
}
static
inline
int
Sbd_CutCost
(
Sbd_Sto_t
*
p
,
Sbd_Cut_t
*
pCut
)
{
int
i
,
Cost
=
0
;
...
...
@@ -470,6 +464,20 @@ static inline int Sbd_CutTreeLeaves( Sbd_Sto_t * p, Sbd_Cut_t * pCut )
Cost
+=
Vec_IntEntry
(
p
->
vRefs
,
pCut
->
pLeaves
[
i
]
)
==
1
;
return
Cost
;
}
static
inline
int
Sbd_CutSlowLeaves
(
Sbd_Sto_t
*
p
,
int
iObj
,
Sbd_Cut_t
*
pCut
)
{
int
i
,
Count
=
0
,
Delay
=
Vec_IntEntry
(
p
->
vDelays
,
iObj
);
for
(
i
=
0
;
i
<
(
int
)
pCut
->
nLeaves
;
i
++
)
Count
+=
(
Vec_IntEntry
(
p
->
vDelays
,
pCut
->
pLeaves
[
i
])
-
Delay
>=
-
1
);
return
Count
;
}
static
inline
int
Sbd_CutTopLeaves
(
Sbd_Sto_t
*
p
,
int
iObj
,
Sbd_Cut_t
*
pCut
)
{
int
i
,
Count
=
0
,
Delay
=
Vec_IntEntry
(
p
->
vDelays
,
iObj
);
for
(
i
=
0
;
i
<
(
int
)
pCut
->
nLeaves
;
i
++
)
Count
+=
(
Vec_IntEntry
(
p
->
vDelays
,
pCut
->
pLeaves
[
i
])
-
Delay
==
-
2
);
return
Count
;
}
static
inline
void
Sbd_CutAddUnit
(
Sbd_Sto_t
*
p
,
int
iObj
)
{
Vec_Int_t
*
vThis
=
Vec_WecEntry
(
p
->
vCuts
,
iObj
);
...
...
@@ -481,6 +489,14 @@ static inline void Sbd_CutAddUnit( Sbd_Sto_t * p, int iObj )
Vec_IntPush
(
vThis
,
iObj
);
Vec_IntPush
(
vThis
,
2
);
}
static
inline
void
Sbd_CutAddZero
(
Sbd_Sto_t
*
p
,
int
iObj
)
{
Vec_Int_t
*
vThis
=
Vec_WecEntry
(
p
->
vCuts
,
iObj
);
assert
(
Vec_IntSize
(
vThis
)
==
0
);
Vec_IntPush
(
vThis
,
1
);
Vec_IntPush
(
vThis
,
0
);
Vec_IntPush
(
vThis
,
0
);
}
static
inline
int
Sbd_StoPrepareSet
(
Sbd_Sto_t
*
p
,
int
iObj
,
int
Index
)
{
Vec_Int_t
*
vThis
=
Vec_WecEntry
(
p
->
vCuts
,
iObj
);
...
...
@@ -495,8 +511,9 @@ static inline int Sbd_StoPrepareSet( Sbd_Sto_t * p, int iObj, int Index )
pCutTemp
->
Sign
=
Sbd_CutGetSign
(
pCutTemp
);
pCutTemp
->
Cost
=
Sbd_CutCost
(
p
,
pCutTemp
);
pCutTemp
->
CostLev
=
Sbd_CutCostLev
(
p
,
pCutTemp
);
pCutTemp
->
nSlowLeaves
=
Sbd_CutSlowLeaves
(
p
,
iObj
,
pCutTemp
);
pCutTemp
->
nTreeLeaves
=
Sbd_CutTreeLeaves
(
p
,
pCutTemp
);
pCutTemp
->
nSlowLeaves
=
Sbd_CutSlowLeaves
(
p
,
iObj
,
pCutTemp
);
pCutTemp
->
nTopLeaves
=
Sbd_CutTopLeaves
(
p
,
iObj
,
pCutTemp
);
}
return
pList
[
0
];
}
...
...
@@ -542,6 +559,7 @@ static inline void Sbd_StoComputeSpec( Sbd_Sto_t * p, int iObj, Sbd_Cut_t ** pCu
int
i
;
for
(
i
=
0
;
i
<
nCuts
;
i
++
)
{
pCuts
[
i
]
->
nTopLeaves
=
Sbd_CutTopLeaves
(
p
,
iObj
,
pCuts
[
i
]
);
pCuts
[
i
]
->
nSlowLeaves
=
Sbd_CutSlowLeaves
(
p
,
iObj
,
pCuts
[
i
]
);
p
->
nCutsSpec
+=
(
pCuts
[
i
]
->
nSlowLeaves
==
0
);
}
...
...
@@ -555,8 +573,8 @@ static inline void Sbd_CutPrint( Sbd_Sto_t * p, int iObj, Sbd_Cut_t * pCut )
printf
(
" %*d"
,
nDigits
,
pCut
->
pLeaves
[
i
]
);
for
(
;
i
<
(
int
)
p
->
nCutSize
;
i
++
)
printf
(
" %*s"
,
nDigits
,
" "
);
printf
(
" } Cost = %3d CostL = %3d
Slow = %d Tree
= %d "
,
pCut
->
Cost
,
pCut
->
CostLev
,
pCut
->
n
SlowLeaves
,
pCut
->
nTree
Leaves
);
printf
(
" } Cost = %3d CostL = %3d
Tree = %d Slow = %d Top
= %d "
,
pCut
->
Cost
,
pCut
->
CostLev
,
pCut
->
n
TreeLeaves
,
pCut
->
nSlowLeaves
,
pCut
->
nTop
Leaves
);
printf
(
"%c "
,
pCut
->
nSlowLeaves
==
0
?
'*'
:
' '
);
for
(
i
=
0
;
i
<
(
int
)
pCut
->
nLeaves
;
i
++
)
printf
(
"%3d "
,
Vec_IntEntry
(
p
->
vDelays
,
pCut
->
pLeaves
[
i
])
-
Delay
);
...
...
@@ -607,7 +625,7 @@ void Sbd_StoMergeCuts( Sbd_Sto_t * p, int iObj )
p
->
nCutsR
=
nCutsR
;
p
->
Pivot
=
iObj
;
// debug printout
if
(
1
)
if
(
0
)
{
printf
(
"*** Obj = %4d Delay = %4d NumCuts = %4d
\n
"
,
iObj
,
Vec_IntEntry
(
p
->
vDelays
,
iObj
),
nCutsR
);
for
(
i
=
0
;
i
<
nCutsR
;
i
++
)
...
...
@@ -687,6 +705,11 @@ void Sbd_StoComputeCutsObj( Sbd_Sto_t * p, int iObj, int Delay, int Level )
Vec_WecPushLevel
(
p
->
vCuts
);
}
}
void
Sbd_StoComputeCutsConst0
(
Sbd_Sto_t
*
p
,
int
iObj
)
{
Sbd_StoComputeCutsObj
(
p
,
iObj
,
0
,
0
);
Sbd_CutAddZero
(
p
,
iObj
);
}
void
Sbd_StoComputeCutsCi
(
Sbd_Sto_t
*
p
,
int
iObj
,
int
Delay
,
int
Level
)
{
Sbd_StoComputeCutsObj
(
p
,
iObj
,
Delay
,
Level
);
...
...
@@ -732,11 +755,14 @@ int Sbd_StoObjBestCut( Sbd_Sto_t * p, int iObj, int * pLeaves )
Sbd_Cut_t
*
pCutBest
=
NULL
;
int
i
;
assert
(
p
->
Pivot
==
iObj
);
for
(
i
=
0
;
i
<
p
->
nCutsR
;
i
++
)
{
if
(
(
int
)
p
->
ppCuts
[
i
]
->
nLeaves
>
p
->
nLutSize
&&
(
pCutBest
==
NULL
||
Sbd_CutCompare2
(
pCutBest
,
p
->
ppCuts
[
i
])
==
1
)
)
if
(
(
int
)
p
->
ppCuts
[
i
]
->
nLeaves
>
p
->
nLutSize
&&
(
int
)
p
->
ppCuts
[
i
]
->
nSlowLeaves
==
0
&&
(
int
)
p
->
ppCuts
[
i
]
->
nTopLeaves
<=
p
->
nLutSize
-
1
&&
(
pCutBest
==
NULL
||
Sbd_CutCompare2
(
pCutBest
,
p
->
ppCuts
[
i
])
==
1
)
)
pCutBest
=
p
->
ppCuts
[
i
];
}
Sbd_CutPrint
(
p
,
iObj
,
pCutBest
);
if
(
pCutBest
==
NULL
)
return
-
1
;
//Sbd_CutPrint( p, iObj, pCutBest );
assert
(
pCutBest
->
nLeaves
<=
SBD_DIV_MAX
);
for
(
i
=
0
;
i
<
(
int
)
pCutBest
->
nLeaves
;
i
++
)
pLeaves
[
i
]
=
pCutBest
->
pLeaves
[
i
];
...
...
@@ -751,7 +777,7 @@ void Sbd_StoComputeCutsTest( Gia_Man_t * pGia )
Gia_ManForEachObj
(
p
->
pGia
,
pObj
,
iObj
)
Sbd_StoRefObj
(
p
,
iObj
,
-
1
);
// compute cuts
Sbd_StoComputeCuts
Obj
(
p
,
0
,
0
,
0
);
Sbd_StoComputeCuts
Const0
(
p
,
0
);
Gia_ManForEachCiId
(
p
->
pGia
,
iObj
,
i
)
Sbd_StoComputeCutsCi
(
p
,
iObj
,
0
,
0
);
Gia_ManForEachAnd
(
p
->
pGia
,
pObj
,
iObj
)
...
...
src/opt/sbd/sbdInt.h
View file @
54b4692d
...
...
@@ -84,7 +84,8 @@ struct Sbd_Str_t_
extern
Sbd_Sto_t
*
Sbd_StoAlloc
(
Gia_Man_t
*
pGia
,
Vec_Int_t
*
vMirrors
,
int
nLutSize
,
int
nCutSize
,
int
nCutNum
,
int
fCutMin
,
int
fVerbose
);
extern
void
Sbd_StoFree
(
Sbd_Sto_t
*
p
);
extern
void
Sbd_StoRefObj
(
Sbd_Sto_t
*
p
,
int
iObj
,
int
iMirror
);
extern
void
Sbd_StoDefefObj
(
Sbd_Sto_t
*
p
,
int
iObj
);
extern
void
Sbd_StoDerefObj
(
Sbd_Sto_t
*
p
,
int
iObj
);
extern
void
Sbd_StoComputeCutsConst0
(
Sbd_Sto_t
*
p
,
int
iObj
);
extern
void
Sbd_StoComputeCutsObj
(
Sbd_Sto_t
*
p
,
int
iObj
,
int
Delay
,
int
Level
);
extern
void
Sbd_StoComputeCutsCi
(
Sbd_Sto_t
*
p
,
int
iObj
,
int
Delay
,
int
Level
);
extern
int
Sbd_StoComputeCutsNode
(
Sbd_Sto_t
*
p
,
int
iObj
);
...
...
src/opt/sbd/sbdLut.c
View file @
54b4692d
...
...
@@ -157,7 +157,7 @@ void Sbd_ProblemCollectSolution( int nStrs, Sbd_Str_t * pStr0, Vec_Int_t * vLits
for
(
m
=
0
;
m
<
nIters
;
m
++
,
iLit
++
)
if
(
!
Abc_LitIsCompl
(
Vec_IntEntry
(
vLits
,
iLit
))
)
Abc_TtSetBit
(
&
pStr
->
Res
,
m
);
Abc_TtStretch6
(
&
pStr
->
Res
,
pStr
->
nVarIns
,
6
);
pStr
->
Res
=
Abc_Tt6Stretch
(
pStr
->
Res
,
pStr
->
nVarIns
);
}
else
{
...
...
@@ -192,13 +192,12 @@ int Sbd_ProblemSolve( Gia_Man_t * p, Vec_Int_t * vMirrors,
{
extern
sat_solver
*
Sbd_ManSatSolver
(
sat_solver
*
pSat
,
Gia_Man_t
*
p
,
Vec_Int_t
*
vMirrors
,
int
Pivot
,
Vec_Int_t
*
vWinObjs
,
Vec_Int_t
*
vObj2Var
,
Vec_Int_t
*
vTfo
,
Vec_Int_t
*
vRoots
,
int
fQbf
);
int
fVerbose
=
1
;
int
fVerbose
=
0
;
abctime
clk
=
Abc_Clock
();
Vec_Int_t
*
vLits
=
Vec_IntAlloc
(
100
);
sat_solver
*
pSatCec
=
Sbd_ManSatSolver
(
NULL
,
p
,
vMirrors
,
Pivot
,
vWinObjs
,
vObj2Var
,
vTfo
,
vRoots
,
1
);
sat_solver
*
pSatQbf
=
sat_solver_new
();
//int PivotVar = Vec_IntEntry(vObj2Var, Pivot);
int
nVars
=
Vec_IntSize
(
vDivSet
);
int
nPars
=
Sbd_ProblemCountParams
(
nStrs
,
pStr0
);
...
...
@@ -248,8 +247,6 @@ int Sbd_ProblemSolve( Gia_Man_t * p, Vec_Int_t * vMirrors,
if
(
status
==
l_False
)
// solution found
break
;
assert
(
status
==
l_True
);
// Vec_IntForEachEntry( vWinObjs, iVar, i )
// printf( "Node = %4d. SatVar = %4d. Value = %d.\n", iVar, i, sat_solver_var_value(pSatCec, i) );
if
(
fVerbose
)
{
...
...
@@ -292,16 +289,16 @@ int Sbd_ProblemSolve( Gia_Man_t * p, Vec_Int_t * vMirrors,
}
if
(
Vec_IntSize
(
vLits
)
>
0
)
{
Sbd_ProblemPrintSolution
(
nStrs
,
pStr0
,
vLits
);
//
Sbd_ProblemPrintSolution( nStrs, pStr0, vLits );
Sbd_ProblemCollectSolution
(
nStrs
,
pStr0
,
vLits
);
RetValue
=
1
;
}
else
printf
(
"Solution does not exist.
\n
"
);
sat_solver_delete
(
pSatCec
);
sat_solver_delete
(
pSatQbf
);
Vec_IntFree
(
vLits
);
if
(
fVerbose
)
Abc_PrintTime
(
1
,
"Time"
,
Abc_Clock
()
-
clk
);
return
RetValue
;
}
...
...
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