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
48ae2c44
Commit
48ae2c44
authored
Aug 17, 2011
by
Alan Mishchenko
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Bug fix in CBA and PBA.
parent
23671d65
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
86 additions
and
33 deletions
+86
-33
src/aig/gia/gia.h
+1
-1
src/aig/gia/giaAbs.c
+4
-3
src/aig/saig/saig.h
+1
-1
src/aig/saig/saigAbs.c
+3
-3
src/aig/saig/saigAbsCba.c
+4
-2
src/aig/saig/saigAbsPba.c
+58
-19
src/aig/saig/saigAbsStart.c
+1
-1
src/aig/saig/saigBmc3.c
+3
-0
src/base/abci/abc.c
+11
-3
No files found.
src/aig/gia/gia.h
View file @
48ae2c44
...
...
@@ -600,7 +600,7 @@ static inline int Gia_ObjLutFanin( Gia_Man_t * p, int Id, int i ) { re
extern
void
Gia_ManCexAbstractionStart
(
Gia_Man_t
*
p
,
Gia_ParAbs_t
*
pPars
);
Gia_Man_t
*
Gia_ManCexAbstractionDerive
(
Gia_Man_t
*
pGia
);
int
Gia_ManCexAbstractionRefine
(
Gia_Man_t
*
pGia
,
Abc_Cex_t
*
pCex
,
int
fTryFour
,
int
fSensePath
,
int
fVerbose
);
extern
int
Gia_ManPbaPerform
(
Gia_Man_t
*
pGia
,
int
nFrames
,
int
nConfLimit
,
int
fVerbose
);
extern
int
Gia_ManPbaPerform
(
Gia_Man_t
*
pGia
,
int
nFrames
,
int
nConfLimit
,
int
fVerbose
,
int
*
piFrame
);
extern
int
Gia_ManCbaPerform
(
Gia_Man_t
*
pGia
,
void
*
pPars
);
/*=== giaAiger.c ===========================================================*/
extern
int
Gia_FileSize
(
char
*
pFileName
);
...
...
src/aig/gia/giaAbs.c
View file @
48ae2c44
...
...
@@ -268,8 +268,9 @@ void Gia_ManFlopsAddToClasses( Vec_Int_t * vFlopClasses, Vec_Int_t * vAbsFfsToAd
SeeAlso []
***********************************************************************/
int
Gia_ManCbaPerform
(
Gia_Man_t
*
pGia
,
void
*
p
)
int
Gia_ManCbaPerform
(
Gia_Man_t
*
pGia
,
void
*
p
Pars
)
{
Saig_ParBmc_t
*
p
=
(
Saig_ParBmc_t
*
)
pPars
;
Gia_Man_t
*
pAbs
;
Aig_Man_t
*
pAig
,
*
pOrig
;
Vec_Int_t
*
vAbsFfsToAdd
;
...
...
@@ -315,7 +316,7 @@ int Gia_ManCbaPerform( Gia_Man_t * pGia, void * p )
SeeAlso []
***********************************************************************/
int
Gia_ManPbaPerform
(
Gia_Man_t
*
pGia
,
int
nFrames
,
int
nConfLimit
,
int
fVerbose
)
int
Gia_ManPbaPerform
(
Gia_Man_t
*
pGia
,
int
nFrames
,
int
nConfLimit
,
int
fVerbose
,
int
*
piFrame
)
{
Gia_Man_t
*
pAbs
;
Aig_Man_t
*
pAig
,
*
pOrig
;
...
...
@@ -331,7 +332,7 @@ int Gia_ManPbaPerform( Gia_Man_t * pGia, int nFrames, int nConfLimit, int fVerbo
// refine abstraction using PBA
pAig
=
Gia_ManToAigSimple
(
pAbs
);
Gia_ManStop
(
pAbs
);
vFlopsNew
=
Saig_ManPbaDerive
(
pAig
,
Gia_ManPiNum
(
pGia
),
nFrames
,
nConfLimit
,
fVerbose
);
vFlopsNew
=
Saig_ManPbaDerive
(
pAig
,
Gia_ManPiNum
(
pGia
),
nFrames
,
nConfLimit
,
fVerbose
,
piFrame
);
// derive new classes
if
(
pAig
->
pSeqModel
==
NULL
)
{
...
...
src/aig/saig/saig.h
View file @
48ae2c44
...
...
@@ -135,7 +135,7 @@ extern Abc_Cex_t * Saig_ManCbaFindCexCareBits( Aig_Man_t * pAig, Abc_Cex_t
extern
Vec_Int_t
*
Saig_ManCbaFilterInputs
(
Aig_Man_t
*
pAig
,
int
iFirstFlopPi
,
Abc_Cex_t
*
pCex
,
int
fVerbose
);
extern
Vec_Int_t
*
Saig_ManCbaPerform
(
Aig_Man_t
*
pAig
,
int
nInputs
,
Saig_ParBmc_t
*
pPars
);
/*=== sswAbsPba.c ==========================================================*/
extern
Vec_Int_t
*
Saig_ManPbaDerive
(
Aig_Man_t
*
pAig
,
int
nInputs
,
int
nFrames
,
int
nConfLimit
,
int
fVerbose
);
extern
Vec_Int_t
*
Saig_ManPbaDerive
(
Aig_Man_t
*
pAig
,
int
nInputs
,
int
nFrames
,
int
nConfLimit
,
int
fVerbose
,
int
*
piFrame
);
/*=== sswAbsStart.c ==========================================================*/
extern
int
Saig_ManCexRefineStep
(
Aig_Man_t
*
p
,
Vec_Int_t
*
vFlops
,
Abc_Cex_t
*
pCex
,
int
fTryFour
,
int
fSensePath
,
int
fVerbose
);
extern
Vec_Int_t
*
Saig_ManCexAbstractionFlops
(
Aig_Man_t
*
p
,
Gia_ParAbs_t
*
pPars
);
...
...
src/aig/saig/saigAbs.c
View file @
48ae2c44
...
...
@@ -91,9 +91,9 @@ Abc_Cex_t * Saig_ManCexRemap( Aig_Man_t * p, Aig_Man_t * pAbs, Abc_Cex_t * pCexA
Aig_Obj_t
*
pObj
;
int
i
,
f
;
if
(
!
Saig_ManVerifyCex
(
pAbs
,
pCexAbs
)
)
printf
(
"Saig_ManCexRemap(): The intial counter-example is invalid.
\n
"
);
else
printf
(
"Saig_ManCexRemap(): The in
tial counter-example is correct.
\n
"
);
printf
(
"Saig_ManCexRemap(): The in
i
tial counter-example is invalid.
\n
"
);
//
else
// printf( "Saig_ManCexRemap(): The ini
tial counter-example is correct.\n" );
// start the counter-example
pCex
=
Abc_CexAlloc
(
Aig_ManRegNum
(
p
),
Saig_ManPiNum
(
p
),
pCexAbs
->
iFrame
+
1
);
pCex
->
iFrame
=
pCexAbs
->
iFrame
;
...
...
src/aig/saig/saigAbsCba.c
View file @
48ae2c44
...
...
@@ -180,6 +180,8 @@ void Saig_ManCbaFindReason_rec( Aig_Man_t * p, Aig_Obj_t * pObj, Vec_Int_t * vPr
if
(
Aig_ObjIsTravIdCurrent
(
p
,
pObj
)
)
return
;
Aig_ObjSetTravIdCurrent
(
p
,
pObj
);
if
(
Aig_ObjIsConst1
(
pObj
)
)
return
;
if
(
Aig_ObjIsPi
(
pObj
)
)
{
Vec_IntPush
(
vReasons
,
Aig_ObjPioNum
(
pObj
)
);
...
...
@@ -267,7 +269,7 @@ Vec_Int_t * Saig_ManCbaFindReason( Saig_ManCba_t * p )
Aig_ManIncrementTravId
(
p
->
pFrames
);
Saig_ManCbaFindReason_rec
(
p
->
pFrames
,
Aig_ObjFanin0
(
pObj
),
vPrios
,
vReasons
);
Vec_IntFree
(
vPrios
);
assert
(
!
Aig_ObjIsTravIdCurrent
(
p
->
pFrames
,
Aig_ManConst1
(
p
->
pFrames
))
);
//
assert( !Aig_ObjIsTravIdCurrent(p->pFrames, Aig_ManConst1(p->pFrames)) );
return
vReasons
;
}
...
...
@@ -630,7 +632,7 @@ Vec_Int_t * Saig_ManCbaPerform( Aig_Man_t * pAbs, int nInputs, Saig_ParBmc_t * p
if
(
pPars
->
fVerbose
)
{
printf
(
"Adding %d registers to the abstraction. "
,
Vec_IntSize
(
vAbsFfsToAdd
)
);
Abc_PrintTime
(
0
,
"Time"
,
clock
()
-
clk
);
Abc_PrintTime
(
1
,
"Time"
,
clock
()
-
clk
);
}
return
vAbsFfsToAdd
;
}
...
...
src/aig/saig/saigAbsPba.c
View file @
48ae2c44
...
...
@@ -171,19 +171,63 @@ Aig_Man_t * Saig_ManUnrollForPba( Aig_Man_t * pAig, int nFrames, Vec_Int_t ** pv
Abc_Cex_t
*
Saig_ManPbaDeriveCex
(
Aig_Man_t
*
pAig
,
sat_solver
*
pSat
,
Cnf_Dat_t
*
pCnf
,
int
nFrames
,
Vec_Int_t
*
vPiVarMap
)
{
Abc_Cex_t
*
pCex
;
int
i
,
f
,
Entry
;
pCex
=
Abc_CexAlloc
(
Aig_ManRegNum
(
pAig
),
Saig_ManPiNum
(
pAig
),
nFrames
);
Aig_Obj_t
*
pObj
,
*
pObjRi
,
*
pObjRo
;
int
i
,
f
,
Entry
,
iBit
=
0
;
pCex
=
Abc_CexAlloc
(
Aig_ManRegNum
(
pAig
),
Saig_ManPiNum
(
pAig
),
nFrames
);
pCex
->
iPo
=
-
1
;
pCex
->
iFrame
=
-
1
;
Vec_IntForEachEntry
(
vPiVarMap
,
Entry
,
i
)
{
if
(
Entry
>=
0
)
{
int
iSatVar
=
pCnf
->
pVarNums
[
Aig_ObjId
(
Aig_ManPi
(
pCnf
->
pMan
,
Entry
))
];
if
(
sat_solver_var_value
(
pSat
,
iSatVar
)
)
Aig_InfoSetBit
(
pCex
->
pData
,
Aig_ManRegNum
(
pAig
)
+
i
);
}
}
// check what frame has failed
Aig_ManCleanMarkB
(
pAig
);
Aig_ManConst1
(
pAig
)
->
fMarkB
=
1
;
Saig_ManForEachLo
(
pAig
,
pObj
,
i
)
pObj
->
fMarkB
=
Aig_InfoHasBit
(
pCex
->
pData
,
iBit
++
);
for
(
f
=
0
;
f
<
nFrames
;
f
++
)
{
// Aig_ManForEach
// compute new state
Saig_ManForEachPi
(
pAig
,
pObj
,
i
)
pObj
->
fMarkB
=
Aig_InfoHasBit
(
pCex
->
pData
,
iBit
++
);
Aig_ManForEachNode
(
pAig
,
pObj
,
i
)
pObj
->
fMarkB
=
(
Aig_ObjFanin0
(
pObj
)
->
fMarkB
^
Aig_ObjFaninC0
(
pObj
))
&
(
Aig_ObjFanin1
(
pObj
)
->
fMarkB
^
Aig_ObjFaninC1
(
pObj
));
Aig_ManForEachPo
(
pAig
,
pObj
,
i
)
pObj
->
fMarkB
=
Aig_ObjFanin0
(
pObj
)
->
fMarkB
^
Aig_ObjFaninC0
(
pObj
);
Saig_ManForEachLiLo
(
pAig
,
pObjRi
,
pObjRo
,
i
)
pObjRo
->
fMarkB
=
pObjRi
->
fMarkB
;
// check the outputs
Saig_ManForEachPo
(
pAig
,
pObj
,
i
)
{
if
(
pObj
->
fMarkB
)
{
pCex
->
iPo
=
i
;
pCex
->
iFrame
=
f
;
pCex
->
nBits
=
pCex
->
nRegs
+
pCex
->
nPis
*
(
f
+
1
);
break
;
}
}
if
(
i
<
Saig_ManPoNum
(
pAig
)
)
break
;
}
Aig_ManCleanMarkB
(
pAig
);
if
(
f
==
nFrames
)
{
Abc_Print
(
-
1
,
"Saig_ManPbaDeriveCex(): Internal error! Cannot find a failed primary outputs.
\n
"
);
Abc_CexFree
(
pCex
);
pCex
=
NULL
;
}
if
(
!
Saig_ManVerifyCex
(
pAig
,
pCex
)
)
{
Abc_Print
(
-
1
,
"Saig_ManPbaDeriveCex(): Internal error! Counter-example is invalid.
\n
"
);
Abc_CexFree
(
pCex
);
pCex
=
NULL
;
}
return
pCex
;
}
...
...
@@ -199,7 +243,7 @@ Abc_Cex_t * Saig_ManPbaDeriveCex( Aig_Man_t * pAig, sat_solver * pSat, Cnf_Dat_t
SeeAlso []
***********************************************************************/
Vec_Int_t
*
Saig_ManPbaDerive
(
Aig_Man_t
*
pAig
,
int
nInputs
,
int
nFrames
,
int
nConfLimit
,
int
fVerbose
)
Vec_Int_t
*
Saig_ManPbaDerive
(
Aig_Man_t
*
pAig
,
int
nInputs
,
int
nFrames
,
int
nConfLimit
,
int
fVerbose
,
int
*
piFrame
)
{
Vec_Int_t
*
vFlops
=
NULL
,
*
vMapVar2FF
,
*
vAssumps
,
*
vPiVarMap
;
Aig_Man_t
*
pFrames
;
...
...
@@ -248,46 +292,40 @@ Abc_PrintTime( 1, "Solving", clock() - clk );
{
if
(
RetValue
==
l_True
)
{
printf
(
"Saig_ManPerformPba(): The eproblem is SAT. Abstraction refinement is still not enabled.
\n
"
);
/*
Vec_Int_t
*
vAbsFfsToAdd
;
ABC_FREE
(
pAig
->
pSeqModel
);
pAig
->
pSeqModel
=
Saig_ManPbaDeriveCex
(
pAig
,
pSat
,
pCnf
,
nFrames
,
vPiVarMap
);
printf
(
"The problem is SAT in frame %d. Performing CEX-based refinement.
\n
"
,
pAig
->
pSeqModel
->
iFrame
);
*
piFrame
=
pAig
->
pSeqModel
->
iFrame
;
// CEX is detected - refine the flops
vAbsFfsToAdd
=
Saig_ManCbaFilterInputs
(
pAig
,
nInputs
,
pAig
->
pSeqModel
,
fVerbose
);
if
(
Vec_IntSize
(
vAbsFfsToAdd
)
==
0
)
{
Vec_IntFree
(
vAbsFfsToAdd
);
return NULL
;
goto
finish
;
}
if
(
fVerbose
)
{
printf
(
"Adding %d registers to the abstraction. "
,
Vec_IntSize
(
vAbsFfsToAdd
)
);
Abc_PrintTime(
0
, "Time", clock() - clk );
Abc_PrintTime
(
1
,
"Time"
,
clock
()
-
clk
);
}
vFlops
=
vAbsFfsToAdd
;
*/
}
else
{
printf
(
"Saig_ManPerformPba(): SAT solver timed out.
A
bstraction is not changed.
\n
"
);
printf
(
"Saig_ManPerformPba(): SAT solver timed out.
Current a
bstraction is not changed.
\n
"
);
}
Vec_IntFree
(
vPiVarMap
);
Vec_IntFree
(
vAssumps
);
Vec_IntFree
(
vMapVar2FF
);
sat_solver_delete
(
pSat
);
Aig_ManStop
(
pFrames
);
Cnf_DataFree
(
pCnf
);
return
NULL
;
goto
finish
;
}
assert
(
RetValue
==
l_False
);
// UNSAT
*
piFrame
=
nFrames
;
// get relevant SAT literals
nCoreLits
=
sat_solver_final
(
pSat
,
&
pCoreLits
);
assert
(
nCoreLits
>
0
);
if
(
fVerbose
)
printf
(
"AnalizeFinal selected %d assumptions (out of %d). Conflicts = %d.
\n
"
,
nCoreLits
,
Vec_IntSize
(
vAssumps
),
(
int
)
pSat
->
stats
.
conflicts
);
printf
(
"AnalizeFinal
after %d frames
selected %d assumptions (out of %d). Conflicts = %d.
\n
"
,
n
Frames
,
n
CoreLits
,
Vec_IntSize
(
vAssumps
),
(
int
)
pSat
->
stats
.
conflicts
);
// collect flops
vFlops
=
Vec_IntAlloc
(
nCoreLits
);
...
...
@@ -300,6 +338,7 @@ Abc_PrintTime( 1, "Solving", clock() - clk );
Vec_IntSort
(
vFlops
,
0
);
// cleanup
finish:
Vec_IntFree
(
vPiVarMap
);
Vec_IntFree
(
vAssumps
);
Vec_IntFree
(
vMapVar2FF
);
...
...
src/aig/saig/saigAbsStart.c
View file @
48ae2c44
...
...
@@ -196,7 +196,7 @@ int Saig_ManCexRefineStep( Aig_Man_t * p, Vec_Int_t * vFlops, Abc_Cex_t * pCex,
if
(
fVerbose
)
{
printf
(
"Adding %d registers to the abstraction. "
,
Vec_IntSize
(
vFlopsNew
)
);
Abc_PrintTime
(
0
,
"Time"
,
clock
()
-
clk
);
Abc_PrintTime
(
1
,
"Time"
,
clock
()
-
clk
);
}
// vFlopsNew contains PI number that should be kept in pAbs
// add to the abstraction
...
...
src/aig/saig/saigBmc3.c
View file @
48ae2c44
...
...
@@ -1292,6 +1292,9 @@ clkOther += clock() - clk2;
fflush
(
stdout
);
}
}
// consider the next timeframe
if
(
RetValue
==
-
1
&&
pPars
->
nStart
==
0
)
pPars
->
iFrame
=
f
;
//ABC_PRT( "CNF generation runtime", clkOther );
if
(
pPars
->
fVerbose
)
{
...
...
src/base/abci/abc.c
View file @
48ae2c44
...
...
@@ -881,6 +881,10 @@ void Abc_Init( Abc_Frame_t * pAbc )
void
For_ManFileExperiment
();
// For_ManFileExperiment();
}
{
void
Bdc_SpfdDecomposeTest
();
Bdc_SpfdDecomposeTest
();
}
/*
{
int i1, i2, i3, i4, i5, i6, N, Counter = 0;
...
...
@@ -28437,6 +28441,7 @@ int Abc_CommandAbc9AbsPba( Abc_Frame_t * pAbc, int argc, char ** argv )
int
nFramesMax
=
(
pAbc
->
nFrames
>=
0
)
?
pAbc
->
nFrames
:
20
;
int
nConfMax
=
100000
;
int
fVerbose
=
0
;
int
iFrame
=
-
1
;
int
c
;
Extra_UtilGetoptReset
();
...
...
@@ -28490,8 +28495,10 @@ int Abc_CommandAbc9AbsPba( Abc_Frame_t * pAbc, int argc, char ** argv )
Abc_Print
(
-
1
,
"The flop map is not given.
\n
"
);
return
0
;
}
Gia_ManPbaPerform
(
pAbc
->
pGia
,
nFramesMax
,
nConfMax
,
fVerbose
);
// Abc_FrameReplaceCex( pAbc, &pAbc->pGia->pCexSeq );
Gia_ManPbaPerform
(
pAbc
->
pGia
,
nFramesMax
,
nConfMax
,
fVerbose
,
&
iFrame
);
if
(
iFrame
>=
0
)
pAbc
->
nFrames
=
iFrame
;
Abc_FrameReplaceCex
(
pAbc
,
&
pAbc
->
pGia
->
pCexSeq
);
return
0
;
usage:
...
...
@@ -28591,7 +28598,8 @@ int Abc_CommandAbc9AbsCba( Abc_Frame_t * pAbc, int argc, char ** argv )
return
0
;
}
pAbc
->
Status
=
Gia_ManCbaPerform
(
pAbc
->
pGia
,
pPars
);
pAbc
->
nFrames
=
pPars
->
iFrame
;
if
(
pPars
->
nStart
==
0
)
pAbc
->
nFrames
=
pPars
->
iFrame
;
Abc_FrameReplaceCex
(
pAbc
,
&
pAbc
->
pGia
->
pCexSeq
);
return
0
;
...
...
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