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
bebd7ee6
Commit
bebd7ee6
authored
Aug 29, 2012
by
Alan Mishchenko
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
New package to read/write a subset of Liberty for STA.
parent
5ff49be9
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
439 additions
and
48 deletions
+439
-48
src/map/mio/mioRead.c
+17
-23
src/map/scl/scl.c
+26
-13
src/map/scl/scl.h
+3
-3
src/map/scl/sclFile.c
+4
-4
src/map/scl/sclInt.h
+7
-3
src/map/scl/sclMan.h
+181
-0
src/map/scl/sclSize.c
+171
-1
src/map/scl/sclTime.c
+0
-0
src/map/scl/sclUtil.c
+30
-1
No files found.
src/map/mio/mioRead.c
View file @
bebd7ee6
...
...
@@ -526,6 +526,16 @@ void Mio_LibrarySortGates( Mio_Library_t * pLib )
SeeAlso []
***********************************************************************/
static
inline
Mio_Gate_t
*
Mio_GateCompare
(
Mio_Gate_t
*
pThis
,
Mio_Gate_t
*
pNew
,
word
uTruth
)
{
if
(
pNew
->
uTruth
!=
uTruth
)
return
pThis
;
if
(
pThis
==
NULL
)
return
pNew
;
if
(
pThis
->
dArea
>
pNew
->
dArea
||
(
pThis
->
dArea
==
pNew
->
dArea
&&
strcmp
(
pThis
->
pName
,
pNew
->
pName
)
>
0
)
)
return
pNew
;
return
pThis
;
}
void
Mio_LibraryDetectSpecialGates
(
Mio_Library_t
*
pLib
)
{
Mio_Gate_t
*
pGate
;
...
...
@@ -538,45 +548,29 @@ void Mio_LibraryDetectSpecialGates( Mio_Library_t * pLib )
uFuncInv
=
~
uFuncBuf
;
uFuncNand2
=
~
uFuncAnd2
;
// get buffer
// get
smallest-area
buffer
Mio_LibraryForEachGate
(
pLib
,
pGate
)
if
(
pLib
->
pGateBuf
==
NULL
&&
pGate
->
uTruth
==
uFuncBuf
)
{
pLib
->
pGateBuf
=
pGate
;
break
;
}
pLib
->
pGateBuf
=
Mio_GateCompare
(
pLib
->
pGateBuf
,
pGate
,
uFuncBuf
);
if
(
pLib
->
pGateBuf
==
NULL
)
{
printf
(
"Warnings: GENLIB library reader cannot detect the buffer gate.
\n
"
);
printf
(
"Some parts of the supergate-based technology mapper may not work correctly.
\n
"
);
}
// get inverter
// get
smallest-area
inverter
Mio_LibraryForEachGate
(
pLib
,
pGate
)
if
(
pLib
->
pGateInv
==
NULL
&&
pGate
->
uTruth
==
uFuncInv
)
{
pLib
->
pGateInv
=
pGate
;
break
;
}
pLib
->
pGateInv
=
Mio_GateCompare
(
pLib
->
pGateInv
,
pGate
,
uFuncInv
);
if
(
pLib
->
pGateInv
==
NULL
)
{
printf
(
"Warnings: GENLIB library reader cannot detect the invertor gate.
\n
"
);
printf
(
"Some parts of the supergate-based technology mapper may not work correctly.
\n
"
);
}
// get
the NAND2 and
AND2 gates
// get
smallest-area NAND2/
AND2 gates
Mio_LibraryForEachGate
(
pLib
,
pGate
)
if
(
pLib
->
pGateNand2
==
NULL
&&
pGate
->
uTruth
==
uFuncNand2
)
{
pLib
->
pGateNand2
=
pGate
;
break
;
}
pLib
->
pGateNand2
=
Mio_GateCompare
(
pLib
->
pGateNand2
,
pGate
,
uFuncNand2
);
Mio_LibraryForEachGate
(
pLib
,
pGate
)
if
(
pLib
->
pGateAnd2
==
NULL
&&
pGate
->
uTruth
==
uFuncAnd2
)
{
pLib
->
pGateAnd2
=
pGate
;
break
;
}
pLib
->
pGateAnd2
=
Mio_GateCompare
(
pLib
->
pGateAnd2
,
pGate
,
uFuncAnd2
);
if
(
pLib
->
pGateAnd2
==
NULL
&&
pLib
->
pGateNand2
==
NULL
)
{
printf
(
"Warnings: GENLIB library reader cannot detect the AND2 or NAND2 gate.
\n
"
);
...
...
src/map/scl/scl.c
View file @
bebd7ee6
...
...
@@ -63,7 +63,7 @@ void Scl_Init( Abc_Frame_t * pAbc )
}
void
Scl_End
(
Abc_Frame_t
*
pAbc
)
{
Abc_SclLoad
(
NULL
,
&
pAbc
->
pLibScl
);
Abc_SclLoad
(
NULL
,
(
SC_Lib
**
)
&
pAbc
->
pLibScl
);
}
...
...
@@ -109,7 +109,7 @@ int Scl_CommandRead( Abc_Frame_t * pAbc, int argc, char ** argv )
fclose
(
pFile
);
// read new library
Abc_SclLoad
(
pFileName
,
&
pAbc
->
pLibScl
);
Abc_SclLoad
(
pFileName
,
(
SC_Lib
**
)
&
pAbc
->
pLibScl
);
Abc_SclWriteText
(
"sizing
\\
scl_out.txt"
,
pAbc
->
pLibScl
);
return
0
;
...
...
@@ -166,7 +166,7 @@ int Scl_CommandWrite( Abc_Frame_t * pAbc, int argc, char **argv )
fclose
(
pFile
);
// save current library
Abc_SclSave
(
pFileName
,
pAbc
->
pLibScl
);
Abc_SclSave
(
pFileName
,
(
SC_Lib
*
)
pAbc
->
pLibScl
);
return
0
;
usage:
...
...
@@ -292,12 +292,24 @@ usage:
int
Scl_CommandGsize
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
)
{
int
c
;
int
nSteps
=
100
;
Extra_UtilGetoptReset
();
while
(
(
c
=
Extra_UtilGetopt
(
argc
,
argv
,
"h"
)
)
!=
EOF
)
while
(
(
c
=
Extra_UtilGetopt
(
argc
,
argv
,
"
N
h"
)
)
!=
EOF
)
{
switch
(
c
)
{
case
'N'
:
if
(
globalUtilOptind
>=
argc
)
{
Abc_Print
(
-
1
,
"Command line switch
\"
-N
\"
should be followed by a positive integer.
\n
"
);
goto
usage
;
}
nSteps
=
atoi
(
argv
[
globalUtilOptind
]);
globalUtilOptind
++
;
if
(
nSteps
<=
0
)
goto
usage
;
break
;
case
'h'
:
goto
usage
;
default:
...
...
@@ -326,13 +338,14 @@ int Scl_CommandGsize( Abc_Frame_t * pAbc, int argc, char **argv )
return
1
;
}
// Abc_SclSizingPerform( pAbc->pLibScl, Abc_FrameReadNtk(pAbc) );
// Abc_SclSizingPerform( pAbc->pLibScl, Abc_FrameReadNtk(pAbc)
, nSteps
);
return
0
;
usage:
fprintf
(
pAbc
->
Err
,
"usage: gsize [-h]
\n
"
);
fprintf
(
pAbc
->
Err
,
"
\t
performs gate sizing using Liberty library
\n
"
);
fprintf
(
pAbc
->
Err
,
"
\t
-h : print the help massage
\n
"
);
fprintf
(
pAbc
->
Err
,
"usage: gsize [-N num] [-h]
\n
"
);
fprintf
(
pAbc
->
Err
,
"
\t
performs gate sizing using Liberty library
\n
"
);
fprintf
(
pAbc
->
Err
,
"
\t
-N <num> : the number of refinement iterations [default = %d]
\n
"
,
nSteps
);
fprintf
(
pAbc
->
Err
,
"
\t
-h : print the help massage
\n
"
);
return
1
;
}
...
...
@@ -404,11 +417,11 @@ int Scl_CommandBuffer( Abc_Frame_t * pAbc, int argc, char ** argv )
return
0
;
usage:
Abc_Print
(
-
2
,
"usage: buffer [-N num] [-vh]
\n
"
);
Abc_Print
(
-
2
,
"
\t
performs buffering of the mapped network
\n
"
);
Abc_Print
(
-
2
,
"
\t
-N <num> : the number of refinement iterations [default = %d]
\n
"
,
Degree
);
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
"
);
fprintf
(
pAbc
->
Err
,
"usage: buffer [-N num] [-vh]
\n
"
);
fprintf
(
pAbc
->
Err
,
"
\t
performs buffering of the mapped network
\n
"
);
fprintf
(
pAbc
->
Err
,
"
\t
-N <num> : the number of refinement iterations [default = %d]
\n
"
,
Degree
);
fprintf
(
pAbc
->
Err
,
"
\t
-v : toggle printing optimization summary [default = %s]
\n
"
,
fVerbose
?
"yes"
:
"no"
);
fprintf
(
pAbc
->
Err
,
"
\t
-h : print the command usage
\n
"
);
return
1
;
}
...
...
src/map/scl/scl.h
View file @
bebd7ee6
...
...
@@ -47,12 +47,12 @@ ABC_NAMESPACE_HEADER_START
////////////////////////////////////////////////////////////////////////
/*=== sclFile.c =============================================================*/
extern
void
Abc_SclLoad
(
char
*
pFileName
,
void
**
ppScl
);
extern
void
Abc_SclSave
(
char
*
pFileName
,
void
*
pScl
);
extern
void
Abc_SclLoad
(
char
*
pFileName
,
SC_Lib
**
ppScl
);
extern
void
Abc_SclSave
(
char
*
pFileName
,
SC_Lib
*
pScl
);
/*=== sclTime.c =============================================================*/
extern
void
Abc_SclTimePerform
(
SC_Lib
*
pLib
,
void
*
pNtk
);
/*=== sclSize.c =============================================================*/
extern
void
Abc_SclSizingPerform
(
SC_Lib
*
pLib
,
void
*
pNtk
);
extern
void
Abc_SclSizingPerform
(
SC_Lib
*
pLib
,
void
*
pNtk
,
int
nSteps
);
ABC_NAMESPACE_HEADER_END
...
...
src/map/scl/sclFile.c
View file @
bebd7ee6
...
...
@@ -332,11 +332,11 @@ SC_Lib * Abc_SclRead( char * pFileName )
Abc_SclLinkCells
(
p
);
return
p
;
}
void
Abc_SclLoad
(
char
*
pFileName
,
void
**
ppScl
)
void
Abc_SclLoad
(
char
*
pFileName
,
SC_Lib
**
ppScl
)
{
if
(
*
ppScl
)
{
Abc_SclLibFree
(
*
(
SC_Lib
**
)
ppScl
);
Abc_SclLibFree
(
*
ppScl
);
*
ppScl
=
NULL
;
}
assert
(
*
ppScl
==
NULL
);
...
...
@@ -522,10 +522,10 @@ void Abc_SclWrite( char * pFileName, SC_Lib * p )
}
Vec_StrFree
(
vOut
);
}
void
Abc_SclSave
(
char
*
pFileName
,
void
*
pScl
)
void
Abc_SclSave
(
char
*
pFileName
,
SC_Lib
*
pScl
)
{
if
(
pScl
==
NULL
)
return
;
Abc_SclWrite
(
pFileName
,
(
SC_Lib
*
)
pScl
);
Abc_SclWrite
(
pFileName
,
pScl
);
}
...
...
src/map/scl/sclInt.h
View file @
bebd7ee6
...
...
@@ -28,6 +28,7 @@
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#include "misc/vec/vec.h"
...
...
@@ -175,9 +176,12 @@ struct SC_Lib_
/// MACRO DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
static
inline
SC_Cell
*
SC_LibCell
(
SC_Lib
*
p
,
int
i
)
{
return
(
SC_Cell
*
)
Vec_PtrEntry
(
p
->
vCells
,
i
);
}
static
inline
SC_Pin
*
SC_CellPin
(
SC_Cell
*
p
,
int
i
)
{
return
(
SC_Pin
*
)
Vec_PtrEntry
(
p
->
vPins
,
i
);
}
static
inline
Vec_Wrd_t
*
SC_CellFunc
(
SC_Cell
*
p
)
{
return
SC_CellPin
(
p
,
p
->
n_inputs
)
->
vFunc
;
}
static
inline
SC_Cell
*
SC_LibCell
(
SC_Lib
*
p
,
int
i
)
{
return
(
SC_Cell
*
)
Vec_PtrEntry
(
p
->
vCells
,
i
);
}
static
inline
SC_Pin
*
SC_CellPin
(
SC_Cell
*
p
,
int
i
)
{
return
(
SC_Pin
*
)
Vec_PtrEntry
(
p
->
vPins
,
i
);
}
static
inline
Vec_Wrd_t
*
SC_CellFunc
(
SC_Cell
*
p
)
{
return
SC_CellPin
(
p
,
p
->
n_inputs
)
->
vFunc
;
}
static
inline
double
SC_LibCapFf
(
SC_Lib
*
p
,
double
cap
)
{
return
cap
*
p
->
unit_cap_fst
*
pow
(
10
,
15
-
p
->
unit_cap_snd
);
}
static
inline
double
SC_LibTimePs
(
SC_Lib
*
p
,
double
time
)
{
return
time
*
pow
(
10
,
12
-
p
->
unit_time
);
}
#define SC_LitForEachCell( p, pCell, i ) Vec_PtrForEachEntry( SC_Cell *, p->vCells, pCell, i )
#define SC_CellForEachPin( p, pPin, i ) Vec_PtrForEachEntry( SC_Pin *, pCell->vPins, pPin, i )
...
...
src/map/scl/sclMan.h
0 → 100644
View file @
bebd7ee6
/**CFile****************************************************************
FileName [sclMan.h]
SystemName [ABC: Logic synthesis and verification system.]
Synopsis [Standard-cell library representation.]
Author [Alan Mishchenko, Niklas Een]
Affiliation [UC Berkeley]
Date [Ver. 1.0. Started - August 24, 2012.]
Revision [$Id: sclMan.h,v 1.0 2012/08/24 00:00:00 alanmi Exp $]
***********************************************************************/
#ifndef ABC__map__scl__sclMan_h
#define ABC__map__scl__sclMan_h
////////////////////////////////////////////////////////////////////////
/// INCLUDES ///
////////////////////////////////////////////////////////////////////////
ABC_NAMESPACE_HEADER_START
////////////////////////////////////////////////////////////////////////
/// PARAMETERS ///
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
/// STRUCTURE DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
typedef
struct
SC_Pair_
SC_Pair
;
typedef
struct
SC_Man_
SC_Man
;
struct
SC_Pair_
{
float
rise
;
float
fall
;
};
struct
SC_Man_
{
SC_Lib
*
pLib
;
// library
Abc_Ntk_t
*
pNtk
;
// network
float
SumArea
;
// total area
int
nObjs
;
// allocated size
Vec_Int_t
*
vGates
;
// mapping of objId into gateId
SC_Pair
*
pLoads
;
// loads for each gate
SC_Pair
*
pTimes
;
// arrivals for each gate
SC_Pair
*
pSlews
;
// slews for each gate
SC_Pair
*
pTimes2
;
// arrivals for each gate
SC_Pair
*
pSlews2
;
// slews for each gate
char
*
pWLoadUsed
;
// name of the used WireLoad model
clock_t
clkStart
;
// starting time
};
////////////////////////////////////////////////////////////////////////
/// GLOBAL VARIABLES ///
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
/// MACRO DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
static
inline
SC_Pair
*
Abc_SclObjLoad
(
SC_Man
*
p
,
Abc_Obj_t
*
pObj
)
{
return
p
->
pLoads
+
Abc_ObjId
(
pObj
);
}
static
inline
SC_Pair
*
Abc_SclObjTime
(
SC_Man
*
p
,
Abc_Obj_t
*
pObj
)
{
return
p
->
pTimes
+
Abc_ObjId
(
pObj
);
}
static
inline
SC_Pair
*
Abc_SclObjSlew
(
SC_Man
*
p
,
Abc_Obj_t
*
pObj
)
{
return
p
->
pSlews
+
Abc_ObjId
(
pObj
);
}
static
inline
SC_Pair
*
Abc_SclObjTime2
(
SC_Man
*
p
,
Abc_Obj_t
*
pObj
)
{
return
p
->
pTimes2
+
Abc_ObjId
(
pObj
);
}
static
inline
SC_Pair
*
Abc_SclObjSlew2
(
SC_Man
*
p
,
Abc_Obj_t
*
pObj
)
{
return
p
->
pSlews2
+
Abc_ObjId
(
pObj
);
}
static
inline
float
Abc_SclObjGain
(
SC_Man
*
p
,
Abc_Obj_t
*
pObj
)
{
return
(
Abc_SclObjTime2
(
p
,
pObj
)
->
rise
-
Abc_SclObjTime
(
p
,
pObj
)
->
rise
)
+
(
Abc_SclObjTime2
(
p
,
pObj
)
->
fall
-
Abc_SclObjTime
(
p
,
pObj
)
->
fall
);
}
static
inline
void
Abc_SclObjDupFanin
(
SC_Man
*
p
,
Abc_Obj_t
*
pObj
)
{
assert
(
Abc_ObjIsCo
(
pObj
)
);
*
Abc_SclObjTime
(
p
,
pObj
)
=
*
Abc_SclObjTime
(
p
,
Abc_ObjFanin0
(
pObj
));
}
static
inline
double
Abc_SclObjLoadFf
(
SC_Man
*
p
,
Abc_Obj_t
*
pObj
,
int
fRise
)
{
return
SC_LibCapFf
(
p
->
pLib
,
fRise
?
Abc_SclObjLoad
(
p
,
pObj
)
->
rise
:
Abc_SclObjLoad
(
p
,
pObj
)
->
fall
);
}
static
inline
double
Abc_SclObjTimePs
(
SC_Man
*
p
,
Abc_Obj_t
*
pObj
,
int
fRise
)
{
return
SC_LibTimePs
(
p
->
pLib
,
fRise
?
Abc_SclObjTime
(
p
,
pObj
)
->
rise
:
Abc_SclObjTime
(
p
,
pObj
)
->
fall
);
}
static
inline
double
Abc_SclObjSlewPs
(
SC_Man
*
p
,
Abc_Obj_t
*
pObj
,
int
fRise
)
{
return
SC_LibTimePs
(
p
->
pLib
,
fRise
?
Abc_SclObjSlew
(
p
,
pObj
)
->
rise
:
Abc_SclObjSlew
(
p
,
pObj
)
->
fall
);
}
static
inline
SC_Cell
*
Abc_SclObjCell
(
SC_Man
*
p
,
Abc_Obj_t
*
pObj
)
{
return
SC_LibCell
(
p
->
pLib
,
Vec_IntEntry
(
p
->
vGates
,
Abc_ObjId
(
pObj
))
);
}
////////////////////////////////////////////////////////////////////////
/// FUNCTION DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
static
inline
void
Abc_SclConeStore
(
SC_Man
*
p
,
Vec_Int_t
*
vCone
)
{
Abc_Obj_t
*
pObj
;
int
i
;
Abc_NtkForEachObjVec
(
vCone
,
p
->
pNtk
,
pObj
,
i
)
{
*
Abc_SclObjTime2
(
p
,
pObj
)
=
*
Abc_SclObjTime
(
p
,
pObj
);
*
Abc_SclObjSlew2
(
p
,
pObj
)
=
*
Abc_SclObjSlew
(
p
,
pObj
);
}
}
static
inline
void
Abc_SclConeRestore
(
SC_Man
*
p
,
Vec_Int_t
*
vCone
)
{
Abc_Obj_t
*
pObj
;
int
i
;
Abc_NtkForEachObjVec
(
vCone
,
p
->
pNtk
,
pObj
,
i
)
{
*
Abc_SclObjTime
(
p
,
pObj
)
=
*
Abc_SclObjTime2
(
p
,
pObj
);
*
Abc_SclObjSlew
(
p
,
pObj
)
=
*
Abc_SclObjSlew2
(
p
,
pObj
);
}
}
/**Function*************************************************************
Synopsis [Prepares STA manager.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
static
inline
SC_Man
*
Abc_SclManAlloc
(
SC_Lib
*
pLib
,
Abc_Ntk_t
*
pNtk
)
{
SC_Man
*
p
;
assert
(
Abc_NtkHasMapping
(
pNtk
)
);
p
=
ABC_CALLOC
(
SC_Man
,
1
);
p
->
pLib
=
pLib
;
p
->
pNtk
=
pNtk
;
p
->
nObjs
=
Abc_NtkObjNumMax
(
pNtk
);
p
->
pLoads
=
ABC_CALLOC
(
SC_Pair
,
p
->
nObjs
);
p
->
pTimes
=
ABC_CALLOC
(
SC_Pair
,
p
->
nObjs
);
p
->
pSlews
=
ABC_CALLOC
(
SC_Pair
,
p
->
nObjs
);
p
->
pTimes2
=
ABC_CALLOC
(
SC_Pair
,
p
->
nObjs
);
p
->
pSlews2
=
ABC_CALLOC
(
SC_Pair
,
p
->
nObjs
);
p
->
clkStart
=
clock
();
return
p
;
}
static
inline
void
Abc_SclManFree
(
SC_Man
*
p
)
{
Vec_IntFreeP
(
&
p
->
vGates
);
ABC_FREE
(
p
->
pLoads
);
ABC_FREE
(
p
->
pTimes
);
ABC_FREE
(
p
->
pSlews
);
ABC_FREE
(
p
->
pTimes2
);
ABC_FREE
(
p
->
pSlews2
);
ABC_FREE
(
p
);
}
/*=== sclTime.c =============================================================*/
extern
SC_Man
*
Abc_SclManStart
(
SC_Lib
*
pLib
,
Abc_Ntk_t
*
pNtk
);
extern
Abc_Obj_t
*
Abc_SclFindMostCritical
(
SC_Man
*
p
,
int
*
pfRise
);
extern
Vec_Int_t
*
Abc_SclCriticalPathFind
(
SC_Man
*
p
);
extern
void
Abc_SclTimeCone
(
SC_Man
*
p
,
Vec_Int_t
*
vCone
);
extern
void
Abc_SclUpdateLoad
(
SC_Man
*
p
,
Abc_Obj_t
*
pObj
,
SC_Cell
*
pOld
,
SC_Cell
*
pNew
);
extern
void
Abc_SclCriticalPathPrint
(
SC_Man
*
p
);
ABC_NAMESPACE_HEADER_END
#endif
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////
src/map/scl/sclSize.c
View file @
bebd7ee6
...
...
@@ -16,7 +16,10 @@
***********************************************************************/
#include "base/abc/abc.h"
#include "map/mio/mio.h"
#include "sclInt.h"
#include "sclMan.h"
ABC_NAMESPACE_IMPL_START
...
...
@@ -29,6 +32,154 @@ ABC_NAMESPACE_IMPL_START
/// FUNCTION DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
/**Function*************************************************************
Synopsis [Collect TFO of the fanins of the object.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void
Abc_SclCollectTfo_rec
(
Abc_Obj_t
*
pObj
,
Vec_Int_t
*
vVisited
)
{
Abc_Obj_t
*
pNext
;
int
i
;
if
(
Abc_NodeIsTravIdCurrent
(
pObj
)
)
return
;
Abc_NodeSetTravIdCurrent
(
pObj
);
Abc_ObjForEachFanout
(
pObj
,
pNext
,
i
)
Abc_SclCollectTfo_rec
(
pNext
,
vVisited
);
Vec_IntPush
(
vVisited
,
Abc_ObjId
(
pObj
)
);
}
Vec_Int_t
*
Abc_SclCollectTfo
(
Abc_Ntk_t
*
p
,
Abc_Obj_t
*
pObj
)
{
Vec_Int_t
*
vVisited
;
Abc_Obj_t
*
pFanin
;
int
i
;
assert
(
Abc_ObjIsNode
(
pObj
)
);
vVisited
=
Vec_IntAlloc
(
100
);
Abc_NtkIncrementTravId
(
p
);
Abc_SclCollectTfo_rec
(
pObj
,
vVisited
);
Abc_ObjForEachFanin
(
pObj
,
pFanin
,
i
)
if
(
Abc_ObjIsNode
(
pFanin
)
)
Abc_SclCollectTfo_rec
(
pFanin
,
vVisited
);
Vec_IntReverseOrder
(
vVisited
);
return
vVisited
;
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
SC_Cell
*
Abc_SclObjResiable
(
SC_Man
*
p
,
Abc_Obj_t
*
pObj
)
{
SC_Cell
*
pOld
=
Abc_SclObjCell
(
p
,
pObj
);
return
pOld
->
pNext
!=
pOld
?
pOld
->
pNext
:
NULL
;
}
float
Abc_SclSizingGain
(
SC_Man
*
p
,
Abc_Obj_t
*
pPivot
)
{
double
dGain
=
0
;
Vec_Int_t
*
vCone
;
Abc_Obj_t
*
pObj
;
int
i
;
assert
(
Abc_ObjIsNode
(
pPivot
)
);
vCone
=
Abc_SclCollectTfo
(
p
->
pNtk
,
pPivot
);
Abc_SclConeStore
(
p
,
vCone
);
Abc_SclTimeCone
(
p
,
vCone
);
Abc_NtkForEachObjVec
(
vCone
,
p
->
pNtk
,
pObj
,
i
)
if
(
Abc_ObjIsCo
(
pObj
)
)
dGain
+=
Abc_SclObjGain
(
p
,
pObj
);
Abc_SclConeRestore
(
p
,
vCone
);
Vec_IntFree
(
vCone
);
return
dGain
;
}
Abc_Obj_t
*
Abc_SclChooseBiggestGain
(
SC_Man
*
p
,
Vec_Int_t
*
vPath
)
{
SC_Cell
*
pOld
,
*
pNew
;
Abc_Obj_t
*
pPivot
=
NULL
,
*
pObj
;
double
dGainBest
=
0
,
dGain
;
int
i
,
gateId
;
Abc_NtkForEachObjVec
(
vPath
,
p
->
pNtk
,
pObj
,
i
)
{
if
(
Abc_ObjIsCo
(
pObj
)
)
continue
;
pOld
=
Abc_SclObjCell
(
p
,
pObj
);
pNew
=
Abc_SclObjResiable
(
p
,
pObj
);
if
(
pNew
==
NULL
)
continue
;
printf
(
"changing %s for %s
\n
"
,
pOld
->
name
,
pNew
->
name
);
gateId
=
Vec_IntEntry
(
p
->
vGates
,
Abc_ObjId
(
pObj
));
Vec_IntWriteEntry
(
p
->
vGates
,
Abc_ObjId
(
pObj
),
Abc_SclCellFind
(
p
->
pLib
,
pNew
->
name
)
);
Abc_SclUpdateLoad
(
p
,
pObj
,
pOld
,
pNew
);
dGain
=
Abc_SclSizingGain
(
p
,
pObj
);
Abc_SclUpdateLoad
(
p
,
pObj
,
pNew
,
pOld
);
Vec_IntWriteEntry
(
p
->
vGates
,
Abc_ObjId
(
pObj
),
Abc_SclCellFind
(
p
->
pLib
,
pOld
->
name
)
);
assert
(
gateId
==
Vec_IntEntry
(
p
->
vGates
,
Abc_ObjId
(
pObj
))
);
if
(
dGainBest
<
dGain
)
{
dGainBest
=
dGain
;
pPivot
=
pObj
;
}
}
return
pPivot
;
}
void
Abc_SclUpdateNetwork
(
SC_Man
*
p
,
Abc_Obj_t
*
pObj
)
{
Vec_Int_t
*
vCone
;
SC_Cell
*
pOld
,
*
pNew
;
// find new gate
pOld
=
Abc_SclObjCell
(
p
,
pObj
);
pNew
=
Abc_SclObjResiable
(
p
,
pObj
);
assert
(
pNew
!=
NULL
);
// update gate
Vec_IntWriteEntry
(
p
->
vGates
,
Abc_ObjId
(
pObj
),
Abc_SclCellFind
(
p
->
pLib
,
pNew
->
name
)
);
pObj
->
pData
=
Mio_LibraryReadGateByName
(
(
Mio_Library_t
*
)
p
->
pNtk
->
pManFunc
,
pNew
->
name
);
Abc_SclUpdateLoad
(
p
,
pObj
,
pOld
,
pNew
);
p
->
SumArea
+=
pNew
->
area
-
pOld
->
area
;
// update info
vCone
=
Abc_SclCollectTfo
(
p
->
pNtk
,
pObj
);
Abc_SclTimeCone
(
p
,
vCone
);
Vec_IntFree
(
vCone
);
}
float
Abc_SclFindMaxDelay
(
SC_Man
*
p
)
{
float
fMaxArr
=
0
;
Abc_Obj_t
*
pObj
;
SC_Pair
*
pArr
;
int
i
;
Abc_NtkForEachCo
(
p
->
pNtk
,
pObj
,
i
)
{
pArr
=
Abc_SclObjTime
(
p
,
pObj
);
if
(
fMaxArr
<
pArr
->
rise
)
fMaxArr
=
pArr
->
rise
;
if
(
fMaxArr
<
pArr
->
fall
)
fMaxArr
=
pArr
->
fall
;
}
return
fMaxArr
;
}
void
Abc_SclPrintResult
(
SC_Man
*
p
,
int
i
)
{
int
fRise
=
0
;
Abc_Obj_t
*
pPivot
=
Abc_SclFindMostCritical
(
p
,
&
fRise
);
printf
(
"%5d : "
,
i
);
printf
(
"area =%10.2f "
,
p
->
SumArea
);
printf
(
"delay =%8.2f ps "
,
Abc_SclObjTimePs
(
p
,
pPivot
,
fRise
)
);
Abc_PrintTime
(
1
,
"time"
,
clock
()
-
p
->
clkStart
);
}
/**Function*************************************************************
...
...
@@ -41,8 +192,27 @@ ABC_NAMESPACE_IMPL_START
SeeAlso []
***********************************************************************/
void
Abc_SclSizingPerform
(
SC_Lib
*
pLib
,
void
*
pNt
k
)
void
Abc_SclSizingPerform
(
SC_Lib
*
pLib
,
void
*
pNt
,
int
nSteps
)
{
SC_Man
*
p
;
Abc_Ntk_t
*
pNtk
=
(
Abc_Ntk_t
*
)
pNt
;
Vec_Int_t
*
vPath
;
Abc_Obj_t
*
pBest
;
int
i
;
p
=
Abc_SclManStart
(
pLib
,
pNtk
);
Abc_SclCriticalPathPrint
(
p
);
for
(
i
=
0
;
i
<
nSteps
;
i
++
)
{
vPath
=
Abc_SclCriticalPathFind
(
p
);
pBest
=
Abc_SclChooseBiggestGain
(
p
,
vPath
);
Vec_IntFree
(
vPath
);
if
(
pBest
==
NULL
)
break
;
Abc_SclUpdateNetwork
(
p
,
pBest
);
Abc_SclPrintResult
(
p
,
i
);
}
Abc_SclCriticalPathPrint
(
p
);
Abc_SclManFree
(
p
);
}
...
...
src/map/scl/sclTime.c
View file @
bebd7ee6
This diff is collapsed.
Click to expand it.
src/map/scl/sclUtil.c
View file @
bebd7ee6
...
...
@@ -16,6 +16,8 @@
***********************************************************************/
#include "base/abc/abc.h"
#include "map/mio/mio.h"
#include "sclInt.h"
ABC_NAMESPACE_IMPL_START
...
...
@@ -29,7 +31,6 @@ ABC_NAMESPACE_IMPL_START
/// FUNCTION DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
/**Function*************************************************************
Synopsis [Reading library from file.]
...
...
@@ -177,6 +178,34 @@ void Abc_SclPrintCells( SC_Lib * p )
}
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
Vec_Int_t
*
Abc_SclManFindGates
(
SC_Lib
*
pLib
,
Abc_Ntk_t
*
p
)
{
Vec_Int_t
*
vVec
;
Abc_Obj_t
*
pObj
;
int
i
;
vVec
=
Vec_IntStartFull
(
Abc_NtkObjNumMax
(
p
)
);
Abc_NtkForEachNode
(
p
,
pObj
,
i
)
{
char
*
pName
=
Mio_GateReadName
((
Mio_Gate_t
*
)
pObj
->
pData
);
int
gateId
=
Abc_SclCellFind
(
pLib
,
pName
);
assert
(
gateId
>=
0
);
Vec_IntWriteEntry
(
vVec
,
i
,
gateId
);
//printf( "Found gate %s\n", pName );
}
return
vVec
;
}
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
...
...
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