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
76447062
Commit
76447062
authored
Jul 22, 2011
by
Alan Mishchenko
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Adding &equiv3, a new way of refining equivalence classes.
parent
5b71a8f8
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
252 additions
and
15 deletions
+252
-15
src/aig/ssw/ssw.h
+1
-0
src/aig/ssw/sswRarity.c
+61
-13
src/base/abci/abc.c
+143
-1
src/base/abci/abcDar.c
+47
-1
No files found.
src/aig/ssw/ssw.h
View file @
76447062
...
...
@@ -116,6 +116,7 @@ extern int Ssw_SecWithPairs( Aig_Man_t * pAig1, Aig_Man_t * pAig2, Vec
extern
int
Ssw_SecGeneral
(
Aig_Man_t
*
pAig1
,
Aig_Man_t
*
pAig2
,
Ssw_Pars_t
*
pPars
);
extern
int
Ssw_SecGeneralMiter
(
Aig_Man_t
*
pMiter
,
Ssw_Pars_t
*
pPars
);
/*=== sswRarity.c ===================================================*/
extern
int
Ssw_RarSignalFilter
(
Aig_Man_t
*
pAig
,
int
nFrames
,
int
nWords
,
int
nBinSize
,
int
nRounds
,
int
TimeOut
,
Abc_Cex_t
*
pCex
,
int
fLatchOnly
,
int
fVerbose
);
extern
int
Ssw_RarSimulate
(
Aig_Man_t
*
pAig
,
int
nFrames
,
int
nWords
,
int
nBinSize
,
int
nRounds
,
int
TimeOut
,
int
fVerbose
);
/*=== sswSim.c ===================================================*/
extern
Ssw_Sml_t
*
Ssw_SmlSimulateComb
(
Aig_Man_t
*
pAig
,
int
nWords
);
...
...
src/aig/ssw/sswRarity.c
View file @
76447062
...
...
@@ -19,6 +19,7 @@
***********************************************************************/
#include "sswInt.h"
#include "giaAig.h"
ABC_NAMESPACE_IMPL_START
...
...
@@ -305,25 +306,25 @@ Vec_Int_t * Ssw_RarFindStartingState( Aig_Man_t * pAig, Abc_Cex_t * pCex )
SeeAlso []
***********************************************************************/
int
Ssw_RarSignalFilter
(
Aig_Man_t
*
pAig
,
int
n
Words
,
int
nFrames
,
int
nBinSize
,
int
nRounds
,
Abc_Cex_t
*
pCex
,
int
fLatchOnly
,
int
fVerbose
)
int
Ssw_RarSignalFilter
(
Aig_Man_t
*
pAig
,
int
n
Frames
,
int
nWords
,
int
nBinSize
,
int
nRounds
,
int
TimeOut
,
Abc_Cex_t
*
pCex
,
int
fLatchOnly
,
int
fVerbose
)
{
int
fMiter
=
0
;
Ssw_RarMan_t
*
p
;
int
r
,
i
,
k
,
clkTotal
=
clock
();
int
RetValue
=
-
1
;
assert
(
Aig_ManRegNum
(
pAig
)
>
0
);
assert
(
Aig_ManConstrNum
(
pAig
)
==
0
);
// consider the case of empty AIG
if
(
Aig_ManNodeNum
(
pAig
)
==
0
)
return
-
1
;
if
(
fVerbose
)
printf
(
"Filtering equivs with %d words through %d frames with %d binsize, %d rounds, and %d sec timeout.
\n
"
,
nWords
,
nFrames
,
nBinSize
,
nRounds
,
TimeOut
);
// reset random numbers
Aig_ManRandom
(
1
);
// create manager
p
=
Ssw_RarManStart
(
pAig
,
nWords
,
nFrames
,
nBinSize
,
fVerbose
);
// create trivial equivalence classes with all nodes being candidates for constant 1
if
(
pAig
->
pReprs
==
NULL
)
p
->
ppClasses
=
Ssw_ClassesPrepareSimple
(
pAig
,
fLatchOnly
,
0
);
else
p
->
ppClasses
=
Ssw_ClassesPrepareFromReprs
(
pAig
);
Ssw_ClassesSetData
(
p
->
ppClasses
,
NULL
,
NULL
,
Ssw_SmlObjIsConstWord
,
Ssw_SmlObjsAreEqualWord
);
// compute starting state if needed
assert
(
p
->
vInits
==
NULL
);
if
(
pCex
)
...
...
@@ -337,6 +338,13 @@ int Ssw_RarSignalFilter( Aig_Man_t * pAig, int nWords, int nFrames, int nBinSize
assert
(
Vec_IntSize
(
p
->
vInits
)
==
Aig_ManRegNum
(
pAig
)
*
nWords
);
// initialize simulation manager
Ssw_SmlInitializeSpecial
(
p
->
pSml
,
p
->
vInits
);
// create trivial equivalence classes with all nodes being candidates for constant 1
if
(
pAig
->
pReprs
==
NULL
)
p
->
ppClasses
=
Ssw_ClassesPrepareSimple
(
pAig
,
fLatchOnly
,
0
);
else
p
->
ppClasses
=
Ssw_ClassesPrepareFromReprs
(
pAig
);
Ssw_ClassesSetData
(
p
->
ppClasses
,
p
->
pSml
,
NULL
,
Ssw_SmlObjIsConstWord
,
Ssw_SmlObjsAreEqualWord
);
// print the stats
if
(
fVerbose
)
{
...
...
@@ -354,6 +362,13 @@ int Ssw_RarSignalFilter( Aig_Man_t * pAig, int nWords, int nFrames, int nBinSize
}
// simulate
Ssw_SmlSimulateOne
(
p
->
pSml
);
if
(
fMiter
&&
Ssw_SmlCheckNonConstOutputs
(
p
->
pSml
)
)
{
if
(
fVerbose
)
printf
(
"
\n
"
);
printf
(
"Simulation asserted a PO in frame f: %d <= f < %d.
\n
"
,
r
*
nFrames
,
(
r
+
1
)
*
nFrames
);
RetValue
=
0
;
break
;
}
// check equivalence classes
Ssw_ClassesRefineConst1
(
p
->
ppClasses
,
1
);
Ssw_ClassesRefine
(
p
->
ppClasses
,
1
);
...
...
@@ -367,21 +382,52 @@ int Ssw_RarSignalFilter( Aig_Man_t * pAig, int nWords, int nFrames, int nBinSize
Ssw_RarUpdateCounters
(
p
);
Ssw_RarTransferPatterns
(
p
,
p
->
vInits
);
Ssw_SmlInitializeSpecial
(
p
->
pSml
,
p
->
vInits
);
/*
// check timeout
if ( Time
Limit && ((float)TimeLimi
t <= (float)(clock()-clkTotal)/(float)(CLOCKS_PER_SEC)) )
if
(
Time
Out
&&
((
float
)
TimeOu
t
<=
(
float
)(
clock
()
-
clkTotal
)
/
(
float
)(
CLOCKS_PER_SEC
))
)
{
printf( "Reached timeout (%d seconds).\n", TimeLimit );
if
(
fVerbose
)
printf
(
"
\n
"
);
printf
(
"Reached timeout (%d seconds).
\n
"
,
TimeOut
);
break
;
}
*/
}
if
(
r
==
nRounds
)
{
printf
(
"Simulation did not assert POs in the first %d frames. "
,
nRounds
*
nFrames
);
Abc_PrintTime
(
1
,
"Time"
,
clock
()
-
clkTotal
);
}
// cleanup
Ssw_RarManStop
(
p
);
return
-
1
;
}
/**Function*************************************************************
Synopsis [Filter equivalence classes of nodes.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int
Ssw_RarSignalFilterGia
(
Gia_Man_t
*
p
,
int
nFrames
,
int
nWords
,
int
nBinSize
,
int
nRounds
,
int
TimeOut
,
Abc_Cex_t
*
pCex
,
int
fLatchOnly
,
int
fVerbose
)
{
Aig_Man_t
*
pAig
;
int
RetValue
;
pAig
=
Gia_ManToAigSimple
(
p
);
if
(
p
->
pReprs
!=
NULL
)
{
Gia_ManReprToAigRepr2
(
pAig
,
p
);
ABC_FREE
(
p
->
pReprs
);
ABC_FREE
(
p
->
pNexts
);
}
RetValue
=
Ssw_RarSignalFilter
(
pAig
,
nFrames
,
nWords
,
nBinSize
,
nRounds
,
TimeOut
,
pCex
,
fLatchOnly
,
fVerbose
);
Gia_ManReprFromAigRepr
(
pAig
,
p
);
Aig_ManStop
(
pAig
);
return
RetValue
;
}
/**Function*************************************************************
...
...
@@ -407,14 +453,16 @@ int Ssw_RarSimulate( Aig_Man_t * pAig, int nFrames, int nWords, int nBinSize, in
if
(
Aig_ManNodeNum
(
pAig
)
==
0
)
return
-
1
;
if
(
fVerbose
)
printf
(
"Simulating %d words through %d frames with %d binsize, %d rounds, and %d timeout.
\n
"
,
printf
(
"Simulating %d words through %d frames with %d binsize, %d rounds, and %d
sec
timeout.
\n
"
,
nWords
,
nFrames
,
nBinSize
,
nRounds
,
TimeOut
);
// reset random numbers
Aig_ManRandom
(
1
);
// create manager
p
=
Ssw_RarManStart
(
pAig
,
nWords
,
nFrames
,
nBinSize
,
fVerbose
);
p
->
vInits
=
Vec_IntStart
(
Aig_ManRegNum
(
pAig
)
*
nWords
);
Ssw_SmlInitializeSpecial
(
p
->
pSml
,
p
->
vInits
);
// perform simulation rounds
for
(
r
=
0
;
r
<
nRounds
;
r
++
)
{
...
...
src/base/abci/abc.c
View file @
76447062
...
...
@@ -343,6 +343,7 @@ static int Abc_CommandAbc9Resim ( Abc_Frame_t * pAbc, int argc, cha
static
int
Abc_CommandAbc9SpecI
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Abc_CommandAbc9Equiv
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Abc_CommandAbc9Equiv2
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Abc_CommandAbc9Equiv3
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Abc_CommandAbc9Semi
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Abc_CommandAbc9Times
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Abc_CommandAbc9Frames
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
...
...
@@ -763,6 +764,7 @@ void Abc_Init( Abc_Frame_t * pAbc )
Cmd_CommandAdd
(
pAbc
,
"ABC9"
,
"&speci"
,
Abc_CommandAbc9SpecI
,
0
);
Cmd_CommandAdd
(
pAbc
,
"ABC9"
,
"&equiv"
,
Abc_CommandAbc9Equiv
,
0
);
Cmd_CommandAdd
(
pAbc
,
"ABC9"
,
"&equiv2"
,
Abc_CommandAbc9Equiv2
,
0
);
Cmd_CommandAdd
(
pAbc
,
"ABC9"
,
"&equiv3"
,
Abc_CommandAbc9Equiv3
,
0
);
Cmd_CommandAdd
(
pAbc
,
"ABC9"
,
"&semi"
,
Abc_CommandAbc9Semi
,
0
);
Cmd_CommandAdd
(
pAbc
,
"ABC9"
,
"×"
,
Abc_CommandAbc9Times
,
0
);
Cmd_CommandAdd
(
pAbc
,
"ABC9"
,
"&frames"
,
Abc_CommandAbc9Frames
,
0
);
...
...
@@ -25221,7 +25223,7 @@ int Abc_CommandAbc9Equiv2( Abc_Frame_t * pAbc, int argc, char ** argv )
default:
goto
usage
;
}
}
}
if
(
pAbc
->
pGia
==
NULL
)
{
Abc_Print
(
-
1
,
"Abc_CommandAbc9Equiv2(): There is no AIG.
\n
"
);
...
...
@@ -25273,6 +25275,146 @@ usage:
SeeAlso []
***********************************************************************/
int
Abc_CommandAbc9Equiv3
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
)
{
// extern int Abc_NtkDarSeqEquiv2( Abc_Ntk_t * pNtk, int nFrames, int nWords, int nBinSize, int nRounds, int TimeOut, Abc_Cex_t * pCex, int fLatchOnly, int fVerbose );
extern
int
Ssw_RarSignalFilterGia
(
Gia_Man_t
*
p
,
int
nFrames
,
int
nWords
,
int
nBinSize
,
int
nRounds
,
int
TimeOut
,
Abc_Cex_t
*
pCex
,
int
fLatchOnly
,
int
fVerbose
);
int
c
;
int
nFrames
=
20
;
int
nWords
=
50
;
int
nBinSize
=
8
;
int
nRounds
=
80
;
int
TimeOut
=
0
;
int
fUseCex
=
0
;
int
fLatchOnly
=
0
;
int
fVerbose
=
1
;
Extra_UtilGetoptReset
();
while
(
(
c
=
Extra_UtilGetopt
(
argc
,
argv
,
"FWBRTxlvh"
)
)
!=
EOF
)
{
switch
(
c
)
{
case
'F'
:
if
(
globalUtilOptind
>=
argc
)
{
Abc_Print
(
-
1
,
"Command line switch
\"
-F
\"
should be followed by an integer.
\n
"
);
goto
usage
;
}
nFrames
=
atoi
(
argv
[
globalUtilOptind
]);
globalUtilOptind
++
;
if
(
nFrames
<
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
;
}
nWords
=
atoi
(
argv
[
globalUtilOptind
]);
globalUtilOptind
++
;
if
(
nWords
<
0
)
goto
usage
;
break
;
case
'B'
:
if
(
globalUtilOptind
>=
argc
)
{
Abc_Print
(
-
1
,
"Command line switch
\"
-B
\"
should be followed by an integer.
\n
"
);
goto
usage
;
}
nBinSize
=
atoi
(
argv
[
globalUtilOptind
]);
globalUtilOptind
++
;
if
(
nBinSize
<
0
)
goto
usage
;
break
;
case
'R'
:
if
(
globalUtilOptind
>=
argc
)
{
Abc_Print
(
-
1
,
"Command line switch
\"
-R
\"
should be followed by an integer.
\n
"
);
goto
usage
;
}
nRounds
=
atoi
(
argv
[
globalUtilOptind
]);
globalUtilOptind
++
;
if
(
nRounds
<
0
)
goto
usage
;
break
;
case
'T'
:
if
(
globalUtilOptind
>=
argc
)
{
Abc_Print
(
-
1
,
"Command line switch
\"
-T
\"
should be followed by an integer.
\n
"
);
goto
usage
;
}
TimeOut
=
atoi
(
argv
[
globalUtilOptind
]);
globalUtilOptind
++
;
if
(
TimeOut
<
0
)
goto
usage
;
break
;
case
'x'
:
fUseCex
^=
1
;
break
;
case
'l'
:
fLatchOnly
^=
1
;
break
;
case
'v'
:
fVerbose
^=
1
;
break
;
case
'h'
:
goto
usage
;
default:
goto
usage
;
}
}
if
(
pAbc
->
pGia
==
NULL
)
{
Abc_Print
(
-
1
,
"Abc_CommandAbc9Equiv3(): There is no AIG.
\n
"
);
return
1
;
}
if
(
Gia_ManRegNum
(
pAbc
->
pGia
)
==
0
)
{
Abc_Print
(
0
,
"Abc_CommandAbc9Equiv3(): There is no flops. Nothing is done.
\n
"
);
return
0
;
}
if
(
fUseCex
)
{
if
(
pAbc
->
pCex
->
nPis
!=
Gia_ManPiNum
(
pAbc
->
pGia
)
)
{
Abc_Print
(
-
1
,
"Abc_CommandAbc9Equiv3(): The number of PIs differs in cex (%d) and in AIG (%d).
\n
"
,
pAbc
->
pCex
->
nPis
,
Gia_ManPiNum
(
pAbc
->
pGia
)
);
return
1
;
}
}
// pAbc->Status = Abc_NtkDarSeqEquiv2( pNtk, nFrames, nWords, nBinSize, nRounds, TimeOut, fUseCex? pAbc->pCex: NULL, fLatchOnly, fVerbose );
pAbc
->
Status
=
Ssw_RarSignalFilterGia
(
pAbc
->
pGia
,
nFrames
,
nWords
,
nBinSize
,
nRounds
,
TimeOut
,
fUseCex
?
pAbc
->
pCex
:
NULL
,
fLatchOnly
,
fVerbose
);
// pAbc->nFrames = pAbc->pCex->iFrame;
// Abc_FrameReplaceCex( pAbc, &pAbc->pCex );
return
0
;
usage:
Abc_Print
(
-
2
,
"usage: &equiv3 [-FWBRT num] [-xlvh]
\n
"
);
Abc_Print
(
-
2
,
"
\t
computes candidate equivalence classes
\n
"
);
Abc_Print
(
-
2
,
"
\t
-F num : the max number of frames for BMC [default = %d]
\n
"
,
nFrames
);
Abc_Print
(
-
2
,
"
\t
-W num : the number of words to simulate [default = %d]
\n
"
,
nWords
);
Abc_Print
(
-
2
,
"
\t
-B num : the number of flops in one bin [default = %d]
\n
"
,
nBinSize
);
Abc_Print
(
-
2
,
"
\t
-R num : the max number of simulation rounds [default = %d]
\n
"
,
nRounds
);
Abc_Print
(
-
2
,
"
\t
-T num : runtime limit in seconds for all rounds [default = %d]
\n
"
,
TimeOut
);
Abc_Print
(
-
2
,
"
\t
-x : toggle using the current cex to perform refinement [default = %s]
\n
"
,
fUseCex
?
"yes"
:
"no"
);
Abc_Print
(
-
2
,
"
\t
-l : toggle considering only latch output equivalences [default = %s]
\n
"
,
fLatchOnly
?
"yes"
:
"no"
);
Abc_Print
(
-
2
,
"
\t
-v : toggle printing verbose information [default = %s]
\n
"
,
fVerbose
?
"yes"
:
"no"
);
Abc_Print
(
-
2
,
"
\t
-h : print the command usage
\n
"
);
return
1
;
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int
Abc_CommandAbc9Semi
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
)
{
Cec_ParSmf_t
Pars
,
*
pPars
=
&
Pars
;
...
...
src/base/abci/abcDar.c
View file @
76447062
...
...
@@ -3028,7 +3028,53 @@ int Abc_NtkDarSeqSim2( Abc_Ntk_t * pNtk, int nFrames, int nWords, int nBinSize,
Abc_AigCleanup
((
Abc_Aig_t
*
)
pNtk
->
pManFunc
);
}
pMan
=
Abc_NtkToDar
(
pNtk
,
0
,
1
);
if
(
Ssw_RarSimulate
(
pMan
,
nFrames
,
nWords
,
nBinSize
,
nRounds
,
TimeOut
,
fVerbose
)
)
if
(
Ssw_RarSimulate
(
pMan
,
nFrames
,
nWords
,
nBinSize
,
nRounds
,
TimeOut
,
fVerbose
)
==
0
)
{
if
(
pMan
->
pSeqModel
)
{
printf
(
"Simulation of %d frames with %d words asserted output %d in frame %d. "
,
nFrames
,
nWords
,
pMan
->
pSeqModel
->
iPo
,
pMan
->
pSeqModel
->
iFrame
);
status
=
Saig_ManVerifyCex
(
pMan
,
pMan
->
pSeqModel
);
if
(
status
==
0
)
printf
(
"Abc_NtkDarSeqSim(): Counter-example verification has FAILED.
\n
"
);
}
ABC_FREE
(
pNtk
->
pModel
);
ABC_FREE
(
pNtk
->
pSeqModel
);
pNtk
->
pSeqModel
=
pMan
->
pSeqModel
;
pMan
->
pSeqModel
=
NULL
;
RetValue
=
0
;
}
else
{
printf
(
"Simulation of %d frames with %d words did not assert the outputs. "
,
nFrames
,
nWords
);
}
ABC_PRT
(
"Time"
,
clock
()
-
clk
);
Aig_ManStop
(
pMan
);
return
RetValue
;
}
/**Function*************************************************************
Synopsis [Performs random simulation.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int
Abc_NtkDarSeqEquiv2
(
Abc_Ntk_t
*
pNtk
,
int
nFrames
,
int
nWords
,
int
nBinSize
,
int
nRounds
,
int
TimeOut
,
Abc_Cex_t
*
pCex
,
int
fLatchOnly
,
int
fVerbose
)
{
Aig_Man_t
*
pMan
;
int
status
,
RetValue
=
-
1
,
clk
=
clock
();
if
(
Abc_NtkGetChoiceNum
(
pNtk
)
)
{
printf
(
"Removing %d choices from the AIG.
\n
"
,
Abc_NtkGetChoiceNum
(
pNtk
)
);
Abc_AigCleanup
((
Abc_Aig_t
*
)
pNtk
->
pManFunc
);
}
pMan
=
Abc_NtkToDar
(
pNtk
,
0
,
1
);
if
(
Ssw_RarSignalFilter
(
pMan
,
nFrames
,
nWords
,
nBinSize
,
nRounds
,
TimeOut
,
pCex
,
fLatchOnly
,
fVerbose
)
==
0
)
{
if
(
pMan
->
pSeqModel
)
{
...
...
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