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
d8505990
Commit
d8505990
authored
Mar 02, 2017
by
Alan Mishchenko
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Adding command 'glitch' for glitch simulation.
parent
fc904409
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
168 additions
and
15 deletions
+168
-15
src/aig/gia/giaGlitch.c
+9
-10
src/base/abc/abc.h
+1
-0
src/base/abci/abc.c
+84
-0
src/base/abci/abcPrint.c
+74
-5
No files found.
src/aig/gia/giaGlitch.c
View file @
d8505990
...
...
@@ -37,7 +37,7 @@ struct Gli_Obj_t_
unsigned
nFanins
:
3
;
// the number of fanins
unsigned
nFanouts
:
25
;
// total number of fanouts
unsigned
Handle
;
// ID of the node
unsigned
uTruth
[
2
];
// truth table of the node
word
*
pTruth
;
// truth table of the node
unsigned
uSimInfo
;
// simulation info of the node
union
{
...
...
@@ -333,7 +333,7 @@ static inline int Gli_NodeComputeValue( Gli_Obj_t * pNode )
int
i
,
Phase
=
0
;
for
(
i
=
0
;
i
<
(
int
)
pNode
->
nFanins
;
i
++
)
Phase
|=
(
Gli_ObjFanin
(
pNode
,
i
)
->
fPhase
<<
i
);
return
Abc_InfoHasBit
(
pNode
->
u
Truth
,
Phase
);
return
Abc_InfoHasBit
(
(
unsigned
*
)
pNode
->
p
Truth
,
Phase
);
}
/**Function*************************************************************
...
...
@@ -352,7 +352,7 @@ static inline int Gli_NodeComputeValue2( Gli_Obj_t * pNode )
int
i
,
Phase
=
0
;
for
(
i
=
0
;
i
<
(
int
)
pNode
->
nFanins
;
i
++
)
Phase
|=
(
Gli_ObjFanin
(
pNode
,
i
)
->
fPhase2
<<
i
);
return
Abc_InfoHasBit
(
pNode
->
u
Truth
,
Phase
);
return
Abc_InfoHasBit
(
(
unsigned
*
)
pNode
->
p
Truth
,
Phase
);
}
/**Function*************************************************************
...
...
@@ -366,16 +366,15 @@ static inline int Gli_NodeComputeValue2( Gli_Obj_t * pNode )
SeeAlso []
***********************************************************************/
int
Gli_ManCreateNode
(
Gli_Man_t
*
p
,
Vec_Int_t
*
vFanins
,
int
nFanouts
,
unsigned
*
pu
Truth
)
int
Gli_ManCreateNode
(
Gli_Man_t
*
p
,
Vec_Int_t
*
vFanins
,
int
nFanouts
,
word
*
pGate
Truth
)
{
Gli_Obj_t
*
pObj
,
*
pFanin
;
int
i
;
assert
(
Vec_IntSize
(
vFanins
)
<=
6
);
assert
(
Vec_IntSize
(
vFanins
)
<=
1
6
);
pObj
=
Gli_ObjAlloc
(
p
,
Vec_IntSize
(
vFanins
),
nFanouts
);
Gli_ManForEachEntry
(
vFanins
,
p
,
pFanin
,
i
)
Gli_ObjAddFanin
(
pObj
,
pFanin
);
pObj
->
uTruth
[
0
]
=
puTruth
[
0
];
pObj
->
uTruth
[
1
]
=
puTruth
[
Vec_IntSize
(
vFanins
)
==
6
];
pObj
->
pTruth
=
pGateTruth
;
pObj
->
fPhase
=
pObj
->
fPhase2
=
Gli_NodeComputeValue
(
pObj
);
return
pObj
->
Handle
;
}
...
...
@@ -584,7 +583,7 @@ unsigned Gli_ManSimulateSeqNode( Gli_Man_t * p, Gli_Obj_t * pNode )
int
nFanins
=
Gli_ObjFaninNum
(
pNode
);
int
i
,
k
,
Phase
;
Gli_Obj_t
*
pFanin
;
assert
(
nFanins
<=
6
);
assert
(
nFanins
<=
1
6
);
Gli_ObjForEachFanin
(
pNode
,
pFanin
,
i
)
pSimInfos
[
i
]
=
pFanin
->
uSimInfo
;
for
(
i
=
0
;
i
<
32
;
i
++
)
...
...
@@ -593,7 +592,7 @@ unsigned Gli_ManSimulateSeqNode( Gli_Man_t * p, Gli_Obj_t * pNode )
for
(
k
=
0
;
k
<
nFanins
;
k
++
)
if
(
(
pSimInfos
[
k
]
>>
i
)
&
1
)
Phase
|=
(
1
<<
k
);
if
(
Abc_InfoHasBit
(
pNode
->
u
Truth
,
Phase
)
)
if
(
Abc_InfoHasBit
(
(
unsigned
*
)
pNode
->
p
Truth
,
Phase
)
)
Result
|=
(
1
<<
i
);
}
return
Result
;
...
...
@@ -772,7 +771,7 @@ void Gli_ManSwitchesAndGlitches( Gli_Man_t * p, int nPatterns, float PiTransProb
}
if
(
fVerbose
)
{
printf
(
"
\n
Simulated %d patterns. "
,
nPatterns
);
printf
(
"
Simulated %d patterns. Input transition probability %.2f. "
,
nPatterns
,
PiTransProb
);
ABC_PRMn
(
"Memory"
,
4
*
p
->
nObjData
);
ABC_PRT
(
"Time"
,
Abc_Clock
()
-
clk
);
}
...
...
src/base/abc/abc.h
View file @
d8505990
...
...
@@ -825,6 +825,7 @@ extern ABC_DLL void Abc_NtkDontCareFree( Odc_Man_t * p );
extern
ABC_DLL
int
Abc_NtkDontCareCompute
(
Odc_Man_t
*
p
,
Abc_Obj_t
*
pNode
,
Vec_Ptr_t
*
vLeaves
,
unsigned
*
puTruth
);
/*=== abcPrint.c ==========================================================*/
extern
ABC_DLL
float
Abc_NtkMfsTotalSwitching
(
Abc_Ntk_t
*
pNtk
);
extern
ABC_DLL
float
Abc_NtkMfsTotalGlitching
(
Abc_Ntk_t
*
pNtk
,
int
nPats
,
int
Prob
,
int
fVerbose
);
extern
ABC_DLL
void
Abc_NtkPrintStats
(
Abc_Ntk_t
*
pNtk
,
int
fFactored
,
int
fSaveBest
,
int
fDumpResult
,
int
fUseLutLib
,
int
fPrintMuxes
,
int
fPower
,
int
fGlitch
,
int
fSkipBuf
,
int
fSkipSmall
,
int
fPrintMem
);
extern
ABC_DLL
void
Abc_NtkPrintIo
(
FILE
*
pFile
,
Abc_Ntk_t
*
pNtk
,
int
fPrintFlops
);
extern
ABC_DLL
void
Abc_NtkPrintLatch
(
FILE
*
pFile
,
Abc_Ntk_t
*
pNtk
);
...
...
src/base/abci/abc.c
View file @
d8505990
...
...
@@ -122,6 +122,7 @@ static int Abc_CommandMfs ( Abc_Frame_t * pAbc, int argc, cha
static
int
Abc_CommandMfs2
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Abc_CommandMfs3
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Abc_CommandTrace
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Abc_CommandGlitch
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Abc_CommandSpeedup
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Abc_CommandPowerdown
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Abc_CommandAddBuffs
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
...
...
@@ -772,6 +773,7 @@ void Abc_Init( Abc_Frame_t * pAbc )
Cmd_CommandAdd
(
pAbc
,
"Synthesis"
,
"mfs2"
,
Abc_CommandMfs2
,
1
);
Cmd_CommandAdd
(
pAbc
,
"Synthesis"
,
"mfs3"
,
Abc_CommandMfs3
,
1
);
Cmd_CommandAdd
(
pAbc
,
"Synthesis"
,
"trace"
,
Abc_CommandTrace
,
0
);
Cmd_CommandAdd
(
pAbc
,
"Synthesis"
,
"glitch"
,
Abc_CommandGlitch
,
0
);
Cmd_CommandAdd
(
pAbc
,
"Synthesis"
,
"speedup"
,
Abc_CommandSpeedup
,
1
);
Cmd_CommandAdd
(
pAbc
,
"Synthesis"
,
"powerdown"
,
Abc_CommandPowerdown
,
1
);
Cmd_CommandAdd
(
pAbc
,
"Synthesis"
,
"addbuffs"
,
Abc_CommandAddBuffs
,
1
);
...
...
@@ -5718,6 +5720,88 @@ usage:
SeeAlso []
***********************************************************************/
int
Abc_CommandGlitch
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
)
{
Abc_Ntk_t
*
pNtk
=
Abc_FrameReadNtk
(
pAbc
);
int
nPats
=
4000
;
int
Prob
=
8
;
int
fVerbose
=
1
;
int
c
;
// set defaults
Extra_UtilGetoptReset
();
while
(
(
c
=
Extra_UtilGetopt
(
argc
,
argv
,
"NPvh"
)
)
!=
EOF
)
{
switch
(
c
)
{
case
'N'
:
if
(
globalUtilOptind
>=
argc
)
{
Abc_Print
(
-
1
,
"Command line switch
\"
-N
\"
should be followed by an integer.
\n
"
);
goto
usage
;
}
nPats
=
atoi
(
argv
[
globalUtilOptind
]);
globalUtilOptind
++
;
if
(
nPats
<
1
)
goto
usage
;
break
;
case
'P'
:
if
(
globalUtilOptind
>=
argc
)
{
Abc_Print
(
-
1
,
"Command line switch
\"
-P
\"
should be followed by an integer.
\n
"
);
goto
usage
;
}
Prob
=
atoi
(
argv
[
globalUtilOptind
]);
globalUtilOptind
++
;
if
(
Prob
<
1
)
goto
usage
;
break
;
case
'v'
:
fVerbose
^=
1
;
break
;
case
'h'
:
goto
usage
;
default:
goto
usage
;
}
}
if
(
pNtk
==
NULL
)
{
Abc_Print
(
-
1
,
"Empty network.
\n
"
);
return
1
;
}
if
(
!
Abc_NtkIsLogic
(
pNtk
)
)
{
Abc_Print
(
-
1
,
"This command can only be applied to a mapped logic network.
\n
"
);
return
1
;
}
if
(
Abc_NtkIsMappedLogic
(
pNtk
)
||
Abc_NtkGetFaninMax
(
pNtk
)
<=
6
)
Abc_Print
(
1
,
"Glitching adds %7.2f %% of signal transitions, compared to switching.
\n
"
,
Abc_NtkMfsTotalGlitching
(
pNtk
,
nPats
,
Prob
,
fVerbose
)
);
else
printf
(
"Currently computes glitching only for K-LUT networks with K <= 6.
\n
"
);
return
0
;
usage:
Abc_Print
(
-
2
,
"usage: glitch [-NP <num>] [-vh]
\n
"
);
Abc_Print
(
-
2
,
"
\t
comparing glitching activity to switching activity
\n
"
);
Abc_Print
(
-
2
,
"
\t
-N <num> : the number of random patterns to use (0 < num < 1000000) [default = %d]
\n
"
,
nPats
);
Abc_Print
(
-
2
,
"
\t
-P <num> : once in how many cycles an input changes its value [default = %d]
\n
"
,
Prob
);
Abc_Print
(
-
2
,
"
\t
-v : toggle printing optimization summary [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_CommandSpeedup
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
)
{
Abc_Ntk_t
*
pNtk
,
*
pNtkRes
;
src/base/abci/abcPrint.c
View file @
d8505990
...
...
@@ -351,9 +351,8 @@ void Abc_NtkPrintStats( Abc_Ntk_t * pNtk, int fFactored, int fSaveBest, int fDum
Abc_Print
(
1
,
" power =%7.2f"
,
Abc_NtkMfsTotalSwitching
(
pNtk
)
);
if
(
fGlitch
)
{
extern
float
Abc_NtkMfsTotalGlitching
(
Abc_Ntk_t
*
pNtk
);
if
(
Abc_NtkIsLogic
(
pNtk
)
&&
Abc_NtkGetFaninMax
(
pNtk
)
<=
6
)
Abc_Print
(
1
,
" glitch =%7.2f %%"
,
Abc_NtkMfsTotalGlitching
(
pNtk
)
);
Abc_Print
(
1
,
" glitch =%7.2f %%"
,
Abc_NtkMfsTotalGlitching
(
pNtk
,
4000
,
8
,
0
)
);
else
printf
(
"
\n
Currently computes glitching only for K-LUT networks with K <= 6."
);
}
...
...
@@ -1744,7 +1743,7 @@ extern Gli_Man_t * Gli_ManAlloc( int nObjs, int nRegs, int nFanioPairs );
extern
void
Gli_ManStop
(
Gli_Man_t
*
p
);
extern
int
Gli_ManCreateCi
(
Gli_Man_t
*
p
,
int
nFanouts
);
extern
int
Gli_ManCreateCo
(
Gli_Man_t
*
p
,
int
iFanin
);
extern
int
Gli_ManCreateNode
(
Gli_Man_t
*
p
,
Vec_Int_t
*
vFanins
,
int
nFanouts
,
unsigned
*
pu
Truth
);
extern
int
Gli_ManCreateNode
(
Gli_Man_t
*
p
,
Vec_Int_t
*
vFanins
,
int
nFanouts
,
word
*
pGate
Truth
);
extern
void
Gli_ManSwitchesAndGlitches
(
Gli_Man_t
*
p
,
int
nPatterns
,
float
PiTransProb
,
int
fVerbose
);
extern
int
Gli_ObjNumSwitches
(
Gli_Man_t
*
p
,
int
iNode
);
...
...
@@ -1761,13 +1760,14 @@ extern int Gli_ObjNumGlitches( Gli_Man_t * p, int iNode );
SeeAlso []
***********************************************************************/
float
Abc_NtkMfsTotalGlitching
(
Abc_Ntk_t
*
pNtk
)
float
Abc_NtkMfsTotalGlitching
Lut
(
Abc_Ntk_t
*
pNtk
,
int
nPats
,
int
Prob
,
int
fVerbose
)
{
int
nSwitches
,
nGlitches
;
Gli_Man_t
*
p
;
Vec_Ptr_t
*
vNodes
;
Vec_Int_t
*
vFanins
,
*
vTruth
;
Abc_Obj_t
*
pObj
,
*
pFanin
;
Vec_Wrd_t
*
vTruths
;
word
*
pTruth
;
unsigned
*
puTruth
;
int
i
,
k
;
assert
(
Abc_NtkIsLogic
(
pNtk
)
);
...
...
@@ -1781,6 +1781,7 @@ float Abc_NtkMfsTotalGlitching( Abc_Ntk_t * pNtk )
vNodes
=
Abc_NtkDfs
(
pNtk
,
0
);
vFanins
=
Vec_IntAlloc
(
6
);
vTruth
=
Vec_IntAlloc
(
1
<<
12
);
vTruths
=
Vec_WrdStart
(
Abc_NtkObjNumMax
(
pNtk
)
);
// derive network for glitch computation
p
=
Gli_ManAlloc
(
Vec_PtrSize
(
vNodes
)
+
Abc_NtkCiNum
(
pNtk
)
+
Abc_NtkCoNum
(
pNtk
),
...
...
@@ -1795,7 +1796,9 @@ float Abc_NtkMfsTotalGlitching( Abc_Ntk_t * pNtk )
Abc_ObjForEachFanin
(
pObj
,
pFanin
,
k
)
Vec_IntPush
(
vFanins
,
pFanin
->
iTemp
);
puTruth
=
Hop_ManConvertAigToTruth
(
(
Hop_Man_t
*
)
pNtk
->
pManFunc
,
(
Hop_Obj_t
*
)
pObj
->
pData
,
Abc_ObjFaninNum
(
pObj
),
vTruth
,
0
);
pObj
->
iTemp
=
Gli_ManCreateNode
(
p
,
vFanins
,
Abc_ObjFanoutNum
(
pObj
),
puTruth
);
pTruth
=
Vec_WrdEntryP
(
vTruths
,
Abc_ObjId
(
pObj
)
);
*
pTruth
=
((
word
)
puTruth
[
Abc_ObjFaninNum
(
pObj
)
==
6
]
<<
32
)
|
(
word
)
puTruth
[
0
];
pObj
->
iTemp
=
Gli_ManCreateNode
(
p
,
vFanins
,
Abc_ObjFanoutNum
(
pObj
),
pTruth
);
}
Abc_NtkForEachCo
(
pNtk
,
pObj
,
i
)
Gli_ManCreateCo
(
p
,
Abc_ObjFanin0
(
pObj
)
->
iTemp
);
...
...
@@ -1816,6 +1819,72 @@ float Abc_NtkMfsTotalGlitching( Abc_Ntk_t * pNtk )
Vec_PtrFree
(
vNodes
);
Vec_IntFree
(
vTruth
);
Vec_IntFree
(
vFanins
);
Vec_WrdFree
(
vTruths
);
return
nSwitches
?
100
.
0
*
(
nGlitches
-
nSwitches
)
/
nSwitches
:
0
.
0
;
}
/**Function*************************************************************
Synopsis [Returns the percentable of increased power due to glitching.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
float
Abc_NtkMfsTotalGlitching
(
Abc_Ntk_t
*
pNtk
,
int
nPats
,
int
Prob
,
int
fVerbose
)
{
int
nSwitches
,
nGlitches
;
Gli_Man_t
*
p
;
Vec_Ptr_t
*
vNodes
;
Vec_Int_t
*
vFanins
;
Abc_Obj_t
*
pObj
,
*
pFanin
;
int
i
,
k
,
nFaninMax
=
Abc_NtkGetFaninMax
(
pNtk
);
if
(
!
Abc_NtkIsMappedLogic
(
pNtk
)
)
return
Abc_NtkMfsTotalGlitchingLut
(
pNtk
,
nPats
,
Prob
,
fVerbose
);
assert
(
Abc_NtkIsMappedLogic
(
pNtk
)
);
if
(
nFaninMax
>
16
)
{
printf
(
"Abc_NtkMfsTotalGlitching() This procedure works only for mapped networks with LUTs size up to 6 inputs.
\n
"
);
return
-
1
.
0
;
}
vNodes
=
Abc_NtkDfs
(
pNtk
,
0
);
vFanins
=
Vec_IntAlloc
(
6
);
// derive network for glitch computation
p
=
Gli_ManAlloc
(
Vec_PtrSize
(
vNodes
)
+
Abc_NtkCiNum
(
pNtk
)
+
Abc_NtkCoNum
(
pNtk
),
Abc_NtkLatchNum
(
pNtk
),
Abc_NtkGetTotalFanins
(
pNtk
)
+
Abc_NtkCoNum
(
pNtk
)
);
Abc_NtkForEachObj
(
pNtk
,
pObj
,
i
)
pObj
->
iTemp
=
-
1
;
Abc_NtkForEachCi
(
pNtk
,
pObj
,
i
)
pObj
->
iTemp
=
Gli_ManCreateCi
(
p
,
Abc_ObjFanoutNum
(
pObj
)
);
Vec_PtrForEachEntry
(
Abc_Obj_t
*
,
vNodes
,
pObj
,
i
)
{
Vec_IntClear
(
vFanins
);
Abc_ObjForEachFanin
(
pObj
,
pFanin
,
k
)
Vec_IntPush
(
vFanins
,
pFanin
->
iTemp
);
pObj
->
iTemp
=
Gli_ManCreateNode
(
p
,
vFanins
,
Abc_ObjFanoutNum
(
pObj
),
Mio_GateReadTruthP
((
Mio_Gate_t
*
)
pObj
->
pData
)
);
}
Abc_NtkForEachCo
(
pNtk
,
pObj
,
i
)
Gli_ManCreateCo
(
p
,
Abc_ObjFanin0
(
pObj
)
->
iTemp
);
// compute glitching
Gli_ManSwitchesAndGlitches
(
p
,
nPats
,
1
.
0
/
Prob
,
fVerbose
);
// compute the ratio
nSwitches
=
nGlitches
=
0
;
Abc_NtkForEachObj
(
pNtk
,
pObj
,
i
)
if
(
pObj
->
iTemp
>=
0
)
{
nSwitches
+=
Abc_ObjFanoutNum
(
pObj
)
*
Gli_ObjNumSwitches
(
p
,
pObj
->
iTemp
);
nGlitches
+=
Abc_ObjFanoutNum
(
pObj
)
*
Gli_ObjNumGlitches
(
p
,
pObj
->
iTemp
);
}
Gli_ManStop
(
p
);
Vec_PtrFree
(
vNodes
);
Vec_IntFree
(
vFanins
);
return
nSwitches
?
100
.
0
*
(
nGlitches
-
nSwitches
)
/
nSwitches
:
0
.
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