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
a4f80c1d
Commit
a4f80c1d
authored
Oct 13, 2013
by
Alan Mishchenko
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Cleaning up buffering code.
parent
89cab3ad
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
107 additions
and
322 deletions
+107
-322
src/map/scl/scl.c
+107
-197
src/map/scl/sclDnsize.c
+0
-2
src/map/scl/sclSize.c
+0
-120
src/map/scl/sclSize.h
+0
-1
src/map/scl/sclUpsize.c
+0
-2
No files found.
src/map/scl/scl.c
View file @
a4f80c1d
...
...
@@ -37,14 +37,13 @@ static int Scl_CommandDumpGen ( Abc_Frame_t * pAbc, int argc, char ** argv );
static
int
Scl_CommandPrintGS
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Scl_CommandStime
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Scl_CommandTopo
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Scl_CommandBuffer
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Scl_CommandBufSize
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Scl_CommandUnBuffer
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Scl_CommandBuffer
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Scl_CommandBufferOld
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Scl_CommandMinsize
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Scl_CommandMaxsize
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Scl_CommandUpsize
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Scl_CommandDnsize
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Scl_CommandBsize
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Scl_CommandPrintBuf
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Scl_CommandReadConstr
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
static
int
Scl_CommandPrintConstr
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
);
...
...
@@ -99,14 +98,13 @@ void Scl_Init( Abc_Frame_t * pAbc )
Cmd_CommandAdd
(
pAbc
,
"SCL mapping"
,
"print_gs"
,
Scl_CommandPrintGS
,
0
);
Cmd_CommandAdd
(
pAbc
,
"SCL mapping"
,
"stime"
,
Scl_CommandStime
,
0
);
Cmd_CommandAdd
(
pAbc
,
"SCL mapping"
,
"topo"
,
Scl_CommandTopo
,
1
);
// Cmd_CommandAdd( pAbc, "SCL mapping", "buffer", Scl_CommandBuffer, 1 );
Cmd_CommandAdd
(
pAbc
,
"SCL mapping"
,
"bufsize"
,
Scl_CommandBufSize
,
1
);
Cmd_CommandAdd
(
pAbc
,
"SCL mapping"
,
"unbuffer"
,
Scl_CommandUnBuffer
,
1
);
Cmd_CommandAdd
(
pAbc
,
"SCL mapping"
,
"buffer"
,
Scl_CommandBuffer
,
1
);
// Cmd_CommandAdd( pAbc, "SCL mapping", "_buffer", Scl_CommandBufferOld, 1 );
Cmd_CommandAdd
(
pAbc
,
"SCL mapping"
,
"minsize"
,
Scl_CommandMinsize
,
1
);
Cmd_CommandAdd
(
pAbc
,
"SCL mapping"
,
"maxsize"
,
Scl_CommandMaxsize
,
1
);
Cmd_CommandAdd
(
pAbc
,
"SCL mapping"
,
"upsize"
,
Scl_CommandUpsize
,
1
);
Cmd_CommandAdd
(
pAbc
,
"SCL mapping"
,
"dnsize"
,
Scl_CommandDnsize
,
1
);
// Cmd_CommandAdd( pAbc, "SCL mapping", "bsize", Scl_CommandBsize, 1 );
Cmd_CommandAdd
(
pAbc
,
"SCL mapping"
,
"print_buf"
,
Scl_CommandPrintBuf
,
0
);
Cmd_CommandAdd
(
pAbc
,
"SCL mapping"
,
"read_constr"
,
Scl_CommandReadConstr
,
0
);
Cmd_CommandAdd
(
pAbc
,
"SCL mapping"
,
"print_constr"
,
Scl_CommandPrintConstr
,
0
);
...
...
@@ -803,73 +801,17 @@ usage:
SeeAlso []
***********************************************************************/
int
Scl_Command
Buffer
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
)
int
Scl_Command
UnBuffer
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
)
{
Abc_Ntk_t
*
pNtk
=
Abc_FrameReadNtk
(
pAbc
);
Abc_Ntk_t
*
pNtkRes
;
int
FanMin
,
FanMax
,
FanMaxR
,
fAddInvs
,
fUseInvs
,
fBufPis
,
fSkipDup
;
int
c
,
fVerbose
;
int
fOldAlgo
=
0
;
FanMin
=
6
;
FanMax
=
14
;
FanMaxR
=
0
;
fAddInvs
=
0
;
fUseInvs
=
0
;
fBufPis
=
0
;
fSkipDup
=
0
;
fVerbose
=
0
;
Abc_Ntk_t
*
pNtkRes
,
*
pNtk
=
Abc_FrameReadNtk
(
pAbc
);
int
c
,
fRemInv
=
0
,
fVerbose
=
0
;
Extra_UtilGetoptReset
();
while
(
(
c
=
Extra_UtilGetopt
(
argc
,
argv
,
"
NMRaixpd
vh"
)
)
!=
EOF
)
while
(
(
c
=
Extra_UtilGetopt
(
argc
,
argv
,
"
i
vh"
)
)
!=
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
;
}
FanMin
=
atoi
(
argv
[
globalUtilOptind
]);
globalUtilOptind
++
;
if
(
FanMin
<
0
)
goto
usage
;
break
;
case
'M'
:
if
(
globalUtilOptind
>=
argc
)
{
Abc_Print
(
-
1
,
"Command line switch
\"
-M
\"
should be followed by a positive integer.
\n
"
);
goto
usage
;
}
FanMax
=
atoi
(
argv
[
globalUtilOptind
]);
globalUtilOptind
++
;
if
(
FanMax
<
0
)
goto
usage
;
break
;
case
'R'
:
if
(
globalUtilOptind
>=
argc
)
{
Abc_Print
(
-
1
,
"Command line switch
\"
-R
\"
should be followed by a positive integer.
\n
"
);
goto
usage
;
}
FanMaxR
=
atoi
(
argv
[
globalUtilOptind
]);
globalUtilOptind
++
;
if
(
FanMaxR
<
0
)
goto
usage
;
break
;
case
'a'
:
fOldAlgo
^=
1
;
break
;
case
'i'
:
fAddInvs
^=
1
;
break
;
case
'x'
:
fUseInvs
^=
1
;
break
;
case
'p'
:
fBufPis
^=
1
;
break
;
case
'd'
:
fSkipDup
^=
1
;
fRemInv
^=
1
;
break
;
case
'v'
:
fVerbose
^=
1
;
...
...
@@ -883,51 +825,34 @@ int Scl_CommandBuffer( Abc_Frame_t * pAbc, int argc, char ** argv )
if
(
pNtk
==
NULL
)
{
Abc_Print
(
-
1
,
"Empty
network.
\n
"
);
fprintf
(
pAbc
->
Err
,
"There is no current
network.
\n
"
);
return
1
;
}
if
(
!
Abc_NtkIsLogic
(
pNtk
)
)
{
Abc_Print
(
-
1
,
"This command can only be applied to a logic network.
\n
"
);
return
1
;
}
if
(
fAddInvs
&&
pNtk
->
vPhases
==
NULL
)
{
Abc_Print
(
-
1
,
"Fanin phase information is not avaiable.
\n
"
);
fprintf
(
pAbc
->
Err
,
"The current network is not a logic network.
\n
"
);
return
1
;
}
// modify the current network
if
(
fAddInvs
)
pNtkRes
=
Abc_SclBufferPhase
(
pNtk
,
fVerbose
);
else
if
(
fOldAlgo
)
pNtkRes
=
Abc_SclPerformBuffering
(
pNtk
,
FanMaxR
,
FanMax
,
fUseInvs
,
fVerbose
);
if
(
fRemInv
)
pNtkRes
=
Abc_SclUnBufferPhase
(
pNtk
,
fVerbose
);
else
pNtkRes
=
Abc_Scl
BufPerform
(
pNtk
,
FanMin
,
FanMax
,
fBufPis
,
fSkipDup
,
fVerbose
);
pNtkRes
=
Abc_Scl
UnBufferPerform
(
pNtk
,
fVerbose
);
if
(
pNtkRes
==
NULL
)
{
Abc_Print
(
-
1
,
"The command has failed.
\n
"
);
return
1
;
}
// replace the current network
Abc_FrameReplaceCurrentNetwork
(
pAbc
,
pNtkRes
);
return
0
;
usage:
fprintf
(
pAbc
->
Err
,
"usage: buffer [-NMR num] [-aixpdvh]
\n
"
);
fprintf
(
pAbc
->
Err
,
"
\t
performs buffering of the mapped network
\n
"
);
fprintf
(
pAbc
->
Err
,
"
\t
-N <num> : the min fanout considered by the algorithm [default = %d]
\n
"
,
FanMin
);
fprintf
(
pAbc
->
Err
,
"
\t
-M <num> : the max allowed fanout count of node/buffer [default = %d]
\n
"
,
FanMax
);
fprintf
(
pAbc
->
Err
,
"
\t
-R <num> : the max allowed fanout count of root node [default = %d]
\n
"
,
FanMaxR
);
fprintf
(
pAbc
->
Err
,
"
\t
-a : toggle using old algorithm [default = %s]
\n
"
,
fOldAlgo
?
"yes"
:
"no"
);
fprintf
(
pAbc
->
Err
,
"
\t
-i : toggle adding interters instead of buffering [default = %s]
\n
"
,
fAddInvs
?
"yes"
:
"no"
);
fprintf
(
pAbc
->
Err
,
"
\t
-x : toggle using interters instead of buffers [default = %s]
\n
"
,
fUseInvs
?
"yes"
:
"no"
);
fprintf
(
pAbc
->
Err
,
"
\t
-p : toggle buffering primary inputs [default = %s]
\n
"
,
fBufPis
?
"yes"
:
"no"
);
fprintf
(
pAbc
->
Err
,
"
\t
-d : toggle disabling gate duplication [default = %s]
\n
"
,
fSkipDup
?
"yes"
:
"no"
);
fprintf
(
pAbc
->
Err
,
"usage: unbuffer [-ivh]
\n
"
);
fprintf
(
pAbc
->
Err
,
"
\t
collapses buffer/inverter trees
\n
"
);
fprintf
(
pAbc
->
Err
,
"
\t
-i : toggle removing interters [default = %s]
\n
"
,
fRemInv
?
"yes"
:
"no"
);
fprintf
(
pAbc
->
Err
,
"
\t
-v : toggle printing verbose information [default = %s]
\n
"
,
fVerbose
?
"yes"
:
"no"
);
fprintf
(
pAbc
->
Err
,
"
\t
-h : print the command usage
\n
"
);
return
1
;
}
}
/**Function*************************************************************
...
...
@@ -940,7 +865,7 @@ usage:
SeeAlso []
***********************************************************************/
int
Scl_CommandBuf
Size
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
)
int
Scl_CommandBuf
fer
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
)
{
SC_BusPars
Pars
,
*
pPars
=
&
Pars
;
Abc_Ntk_t
*
pNtkRes
,
*
pNtk
=
Abc_FrameReadNtk
(
pAbc
);
...
...
@@ -1045,7 +970,7 @@ int Scl_CommandBufSize( Abc_Frame_t * pAbc, int argc, char ** argv )
return
0
;
usage:
fprintf
(
pAbc
->
Err
,
"usage: buf
size
[-GSD num] [-sbpcvwh]
\n
"
);
fprintf
(
pAbc
->
Err
,
"usage: buf
fer
[-GSD num] [-sbpcvwh]
\n
"
);
fprintf
(
pAbc
->
Err
,
"
\t
performs buffering and sizing and mapped network
\n
"
);
fprintf
(
pAbc
->
Err
,
"
\t
-G <num> : target gain percentage [default = %d]
\n
"
,
pPars
->
GainRatio
);
fprintf
(
pAbc
->
Err
,
"
\t
-S <num> : target slew in pisoseconds [default = %d]
\n
"
,
pPars
->
Slew
);
...
...
@@ -1071,17 +996,73 @@ usage:
SeeAlso []
***********************************************************************/
int
Scl_Command
UnBuffer
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
)
int
Scl_Command
BufferOld
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
)
{
Abc_Ntk_t
*
pNtkRes
,
*
pNtk
=
Abc_FrameReadNtk
(
pAbc
);
int
c
,
fRemInv
=
0
,
fVerbose
=
0
;
Abc_Ntk_t
*
pNtk
=
Abc_FrameReadNtk
(
pAbc
);
Abc_Ntk_t
*
pNtkRes
;
int
FanMin
,
FanMax
,
FanMaxR
,
fAddInvs
,
fUseInvs
,
fBufPis
,
fSkipDup
;
int
c
,
fVerbose
;
int
fOldAlgo
=
0
;
FanMin
=
6
;
FanMax
=
14
;
FanMaxR
=
0
;
fAddInvs
=
0
;
fUseInvs
=
0
;
fBufPis
=
0
;
fSkipDup
=
0
;
fVerbose
=
0
;
Extra_UtilGetoptReset
();
while
(
(
c
=
Extra_UtilGetopt
(
argc
,
argv
,
"
i
vh"
)
)
!=
EOF
)
while
(
(
c
=
Extra_UtilGetopt
(
argc
,
argv
,
"
NMRaixpd
vh"
)
)
!=
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
;
}
FanMin
=
atoi
(
argv
[
globalUtilOptind
]);
globalUtilOptind
++
;
if
(
FanMin
<
0
)
goto
usage
;
break
;
case
'M'
:
if
(
globalUtilOptind
>=
argc
)
{
Abc_Print
(
-
1
,
"Command line switch
\"
-M
\"
should be followed by a positive integer.
\n
"
);
goto
usage
;
}
FanMax
=
atoi
(
argv
[
globalUtilOptind
]);
globalUtilOptind
++
;
if
(
FanMax
<
0
)
goto
usage
;
break
;
case
'R'
:
if
(
globalUtilOptind
>=
argc
)
{
Abc_Print
(
-
1
,
"Command line switch
\"
-R
\"
should be followed by a positive integer.
\n
"
);
goto
usage
;
}
FanMaxR
=
atoi
(
argv
[
globalUtilOptind
]);
globalUtilOptind
++
;
if
(
FanMaxR
<
0
)
goto
usage
;
break
;
case
'a'
:
fOldAlgo
^=
1
;
break
;
case
'i'
:
fRemInv
^=
1
;
fAddInvs
^=
1
;
break
;
case
'x'
:
fUseInvs
^=
1
;
break
;
case
'p'
:
fBufPis
^=
1
;
break
;
case
'd'
:
fSkipDup
^=
1
;
break
;
case
'v'
:
fVerbose
^=
1
;
...
...
@@ -1095,34 +1076,51 @@ int Scl_CommandUnBuffer( Abc_Frame_t * pAbc, int argc, char **argv )
if
(
pNtk
==
NULL
)
{
fprintf
(
pAbc
->
Err
,
"There is no current
network.
\n
"
);
Abc_Print
(
-
1
,
"Empty
network.
\n
"
);
return
1
;
}
if
(
!
Abc_NtkIsLogic
(
pNtk
)
)
{
fprintf
(
pAbc
->
Err
,
"The current network is not
a logic network.
\n
"
);
Abc_Print
(
-
1
,
"This command can only be applied to
a logic network.
\n
"
);
return
1
;
}
if
(
fRemInv
)
pNtkRes
=
Abc_SclUnBufferPhase
(
pNtk
,
fVerbose
);
if
(
fAddInvs
&&
pNtk
->
vPhases
==
NULL
)
{
Abc_Print
(
-
1
,
"Fanin phase information is not avaiable.
\n
"
);
return
1
;
}
// modify the current network
if
(
fAddInvs
)
pNtkRes
=
Abc_SclBufferPhase
(
pNtk
,
fVerbose
);
else
if
(
fOldAlgo
)
pNtkRes
=
Abc_SclPerformBuffering
(
pNtk
,
FanMaxR
,
FanMax
,
fUseInvs
,
fVerbose
);
else
pNtkRes
=
Abc_Scl
UnBufferPerform
(
pNtk
,
fVerbose
);
pNtkRes
=
Abc_Scl
BufPerform
(
pNtk
,
FanMin
,
FanMax
,
fBufPis
,
fSkipDup
,
fVerbose
);
if
(
pNtkRes
==
NULL
)
{
Abc_Print
(
-
1
,
"The command has failed.
\n
"
);
return
1
;
}
// replace the current network
Abc_FrameReplaceCurrentNetwork
(
pAbc
,
pNtkRes
);
return
0
;
usage:
fprintf
(
pAbc
->
Err
,
"usage: unbuffer [-ivh]
\n
"
);
fprintf
(
pAbc
->
Err
,
"
\t
collapses buffer/inverter trees
\n
"
);
fprintf
(
pAbc
->
Err
,
"
\t
-i : toggle removing interters [default = %s]
\n
"
,
fRemInv
?
"yes"
:
"no"
);
fprintf
(
pAbc
->
Err
,
"usage: _buffer [-NMR num] [-aixpdvh]
\n
"
);
fprintf
(
pAbc
->
Err
,
"
\t
performs buffering of the mapped network
\n
"
);
fprintf
(
pAbc
->
Err
,
"
\t
-N <num> : the min fanout considered by the algorithm [default = %d]
\n
"
,
FanMin
);
fprintf
(
pAbc
->
Err
,
"
\t
-M <num> : the max allowed fanout count of node/buffer [default = %d]
\n
"
,
FanMax
);
fprintf
(
pAbc
->
Err
,
"
\t
-R <num> : the max allowed fanout count of root node [default = %d]
\n
"
,
FanMaxR
);
fprintf
(
pAbc
->
Err
,
"
\t
-a : toggle using old algorithm [default = %s]
\n
"
,
fOldAlgo
?
"yes"
:
"no"
);
fprintf
(
pAbc
->
Err
,
"
\t
-i : toggle adding interters instead of buffering [default = %s]
\n
"
,
fAddInvs
?
"yes"
:
"no"
);
fprintf
(
pAbc
->
Err
,
"
\t
-x : toggle using interters instead of buffers [default = %s]
\n
"
,
fUseInvs
?
"yes"
:
"no"
);
fprintf
(
pAbc
->
Err
,
"
\t
-p : toggle buffering primary inputs [default = %s]
\n
"
,
fBufPis
?
"yes"
:
"no"
);
fprintf
(
pAbc
->
Err
,
"
\t
-d : toggle disabling gate duplication [default = %s]
\n
"
,
fSkipDup
?
"yes"
:
"no"
);
fprintf
(
pAbc
->
Err
,
"
\t
-v : toggle printing verbose information [default = %s]
\n
"
,
fVerbose
?
"yes"
:
"no"
);
fprintf
(
pAbc
->
Err
,
"
\t
-h : print the command usage
\n
"
);
return
1
;
}
}
/**Function*************************************************************
...
...
@@ -1646,94 +1644,6 @@ usage:
SeeAlso []
***********************************************************************/
int
Scl_CommandBsize
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
)
{
extern
Abc_Ntk_t
*
Abc_SclBuffSizeStep
(
SC_Lib
*
pLib
,
Abc_Ntk_t
*
pNtk
,
int
nTreeCRatio
,
int
fUseWireLoads
);
Abc_Ntk_t
*
pNtkRes
;
int
c
;
int
fUseWireLoads
=
1
;
int
nTreeCRatio
=
0
;
Extra_UtilGetoptReset
();
while
(
(
c
=
Extra_UtilGetopt
(
argc
,
argv
,
"Xch"
)
)
!=
EOF
)
{
switch
(
c
)
{
case
'X'
:
if
(
globalUtilOptind
>=
argc
)
{
Abc_Print
(
-
1
,
"Command line switch
\"
-X
\"
should be followed by a positive integer.
\n
"
);
goto
usage
;
}
nTreeCRatio
=
atoi
(
argv
[
globalUtilOptind
]);
globalUtilOptind
++
;
if
(
nTreeCRatio
<
0
)
goto
usage
;
break
;
case
'c'
:
fUseWireLoads
^=
1
;
break
;
case
'h'
:
goto
usage
;
default:
goto
usage
;
}
}
if
(
Abc_FrameReadNtk
(
pAbc
)
==
NULL
)
{
fprintf
(
pAbc
->
Err
,
"There is no current network.
\n
"
);
return
1
;
}
if
(
!
Abc_NtkHasMapping
(
Abc_FrameReadNtk
(
pAbc
))
)
{
fprintf
(
pAbc
->
Err
,
"The current network is not mapped.
\n
"
);
return
1
;
}
if
(
!
Abc_SclCheckNtk
(
Abc_FrameReadNtk
(
pAbc
),
0
)
)
{
fprintf
(
pAbc
->
Err
,
"The current network is not in a topo order (run
\"
topo
\"
).
\n
"
);
return
1
;
}
if
(
pAbc
->
pLibScl
==
NULL
)
{
fprintf
(
pAbc
->
Err
,
"There is no Liberty library available.
\n
"
);
return
1
;
}
if
(
Abc_FrameReadNtk
(
pAbc
)
->
vPhases
==
0
)
{
fprintf
(
pAbc
->
Err
,
"There is no phases available.
\n
"
);
return
1
;
}
pNtkRes
=
Abc_SclBuffSizeStep
(
(
SC_Lib
*
)
pAbc
->
pLibScl
,
Abc_FrameReadNtk
(
pAbc
),
nTreeCRatio
,
fUseWireLoads
);
if
(
pNtkRes
==
NULL
)
{
Abc_Print
(
-
1
,
"The command has failed.
\n
"
);
return
1
;
}
Abc_FrameReplaceCurrentNetwork
(
pAbc
,
pNtkRes
);
return
0
;
usage:
fprintf
(
pAbc
->
Err
,
"usage: bsize [-X num] [-ch]
\n
"
);
fprintf
(
pAbc
->
Err
,
"
\t
performs STA using Liberty library
\n
"
);
fprintf
(
pAbc
->
Err
,
"
\t
-X : min Cout/Cave ratio for tree estimations [default = %d]
\n
"
,
nTreeCRatio
);
fprintf
(
pAbc
->
Err
,
"
\t
-c : toggle using wire-loads if specified [default = %s]
\n
"
,
fUseWireLoads
?
"yes"
:
"no"
);
fprintf
(
pAbc
->
Err
,
"
\t
-h : print the help massage
\n
"
);
return
1
;
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int
Scl_CommandPrintBuf
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
)
{
Abc_Ntk_t
*
pNtk
=
Abc_FrameReadNtk
(
pAbc
);
...
...
src/map/scl/sclDnsize.c
View file @
a4f80c1d
...
...
@@ -122,8 +122,6 @@ clk = Abc_Clock();
continue
;
if
(
i
>
Notches
)
break
;
// if ( p->vInDrive && !Abc_SclInputDriveOk( p, pObj, pCellNew ) )
// continue;
// set new cell
Abc_SclObjSetCell
(
pObj
,
pCellNew
);
Abc_SclUpdateLoad
(
p
,
pObj
,
pCellOld
,
pCellNew
);
...
...
src/map/scl/sclSize.c
View file @
a4f80c1d
...
...
@@ -813,126 +813,6 @@ void Abc_SclPrintBuffers( SC_Lib * pLib, Abc_Ntk_t * pNtk, int fVerbose )
}
/**Function*************************************************************
Synopsis [Checks if the input drive capability is ok.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int
Abc_SclInputDriveOk
(
SC_Man
*
p
,
Abc_Obj_t
*
pObj
,
SC_Cell
*
pCell
)
{
Abc_Obj_t
*
pFanin
;
int
i
;
assert
(
Abc_ObjFaninNum
(
pObj
)
==
pCell
->
n_inputs
);
Abc_ObjForEachFanin
(
pObj
,
pFanin
,
i
)
if
(
Abc_ObjIsPi
(
pFanin
)
&&
Abc_SclObjInDrive
(
p
,
pFanin
)
>
0
&&
(
Abc_SclObjInDrive
(
p
,
pFanin
)
/
Abc_ObjFanoutNum
(
pFanin
))
<
SC_CellPinCap
(
pCell
,
i
)
)
return
0
;
return
1
;
}
/**Function*************************************************************
Synopsis [Select nodes that need to be buffered.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
Vec_Wec_t
*
Abc_SclSelectSplitNodes
(
SC_Man
*
p
,
Abc_Ntk_t
*
pNtk
)
{
Vec_Wec_t
*
vSplits
;
Vec_Int_t
*
vCrits
,
*
vNonCrits
,
*
vLevel
;
Abc_Obj_t
*
pObj
,
*
pFanout
;
int
i
,
k
;
assert
(
p
->
EstLoadMax
>
0
);
vCrits
=
Vec_IntAlloc
(
1000
);
vNonCrits
=
Vec_IntAlloc
(
1000
);
vSplits
=
Vec_WecAlloc
(
1000
);
Abc_NtkForEachNodeCi
(
pNtk
,
pObj
,
i
)
{
if
(
Abc_SclObjLoadValue
(
p
,
pObj
)
<
1
)
{
// printf( "%d ", Abc_ObjFanoutNum(pObj) );
continue
;
}
/*
printf( "%d : %.0f ", i, 0.5 * (Abc_SclObjLoad(p, pObj)->fall + Abc_SclObjLoad(p, pObj)->rise) );
Abc_ObjForEachFanout( pObj, pFanout, k )
printf( "%.1f ", SC_CellPinCapAve(Abc_SclObjCell(pFanout)) );
printf( "\n" );
*/
// skip non-critical nodes
// if ( Abc_SclObjSlack(p, pObj) > 100 )
// continue;
// collect non-critical fanouts of the node
Vec_IntClear
(
vCrits
);
Vec_IntClear
(
vNonCrits
);
Abc_ObjForEachFanout
(
pObj
,
pFanout
,
k
)
if
(
Abc_SclObjGetSlack
(
p
,
pFanout
,
p
->
MaxDelay0
)
<
100
)
Vec_IntPush
(
vCrits
,
Abc_ObjId
(
pFanout
)
);
else
Vec_IntPush
(
vNonCrits
,
Abc_ObjId
(
pFanout
)
);
// assert( Vec_IntSize(vNonCrits) < Abc_ObjFanoutNum(pObj) );
// skip if there is nothing to split
// if ( Vec_IntSize(vNonCrits) < 2 )
// continue;
// remember them
vLevel
=
Vec_WecPushLevel
(
vSplits
);
Vec_IntPush
(
vLevel
,
i
);
Vec_IntAppend
(
vLevel
,
vCrits
);
// remember them
vLevel
=
Vec_WecPushLevel
(
vSplits
);
Vec_IntPush
(
vLevel
,
i
);
Vec_IntAppend
(
vLevel
,
vNonCrits
);
}
Vec_IntFree
(
vCrits
);
Vec_IntFree
(
vNonCrits
);
// print out
printf
(
"Collected %d nodes to split.
\n
"
,
Vec_WecSize
(
vSplits
)
);
return
vSplits
;
}
void
Abc_SclPerformSplit
(
SC_Man
*
p
,
Abc_Ntk_t
*
pNtk
,
Vec_Wec_t
*
vSplits
)
{
Abc_Obj_t
*
pObj
,
*
pObjInv
,
*
pFanout
;
Vec_Int_t
*
vLevel
;
int
i
,
k
;
assert
(
pNtk
->
vPhases
!=
NULL
);
Vec_WecForEachLevel
(
vSplits
,
vLevel
,
i
)
{
pObj
=
Abc_NtkObj
(
pNtk
,
Vec_IntEntry
(
vLevel
,
0
)
);
pObjInv
=
Abc_NtkCreateNodeInv
(
pNtk
,
pObj
);
Abc_NtkForEachObjVecStart
(
vLevel
,
pNtk
,
pFanout
,
k
,
1
)
{
Abc_ObjFaninFlipPhase
(
pFanout
,
Abc_NodeFindFanin
(
pFanout
,
pObj
)
);
Abc_ObjPatchFanin
(
pFanout
,
pObj
,
pObjInv
);
}
}
Vec_IntFillExtra
(
pNtk
->
vPhases
,
Abc_NtkObjNumMax
(
pNtk
),
0
);
}
Abc_Ntk_t
*
Abc_SclBuffSizeStep
(
SC_Lib
*
pLib
,
Abc_Ntk_t
*
pNtk
,
int
nTreeCRatio
,
int
fUseWireLoads
)
{
SC_Man
*
p
;
Vec_Wec_t
*
vSplits
;
p
=
Abc_SclManStart
(
pLib
,
pNtk
,
fUseWireLoads
,
1
,
0
,
nTreeCRatio
);
Abc_SclTimeNtkPrint
(
p
,
0
,
0
);
if
(
p
->
nEstNodes
)
printf
(
"Estimated nodes = %d.
\n
"
,
p
->
nEstNodes
);
vSplits
=
Abc_SclSelectSplitNodes
(
p
,
pNtk
);
Abc_SclPerformSplit
(
p
,
pNtk
,
vSplits
);
Vec_WecFree
(
vSplits
);
Abc_SclManFree
(
p
);
return
Abc_NtkDupDfs
(
pNtk
);
}
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////
...
...
src/map/scl/sclSize.h
View file @
a4f80c1d
...
...
@@ -571,7 +571,6 @@ extern void Abc_SclTimeIncInsert( SC_Man * p, Abc_Obj_t * pObj );
extern
void
Abc_SclTimeIncUpdateLevel
(
Abc_Obj_t
*
pObj
);
extern
void
Abc_SclTimePerform
(
SC_Lib
*
pLib
,
Abc_Ntk_t
*
pNtk
,
int
nTreeCRatio
,
int
fUseWireLoads
,
int
fShowAll
,
int
fPrintPath
,
int
fDumpStats
);
extern
void
Abc_SclPrintBuffers
(
SC_Lib
*
pLib
,
Abc_Ntk_t
*
pNtk
,
int
fVerbose
);
extern
int
Abc_SclInputDriveOk
(
SC_Man
*
p
,
Abc_Obj_t
*
pObj
,
SC_Cell
*
pCell
);
/*=== sclUpsize.c ===============================================================*/
extern
int
Abc_SclCountNearCriticalNodes
(
SC_Man
*
p
);
extern
void
Abc_SclUpsizePerform
(
SC_Lib
*
pLib
,
Abc_Ntk_t
*
pNtk
,
SC_SizePars
*
pPars
);
...
...
src/map/scl/sclUpsize.c
View file @
a4f80c1d
...
...
@@ -291,8 +291,6 @@ int Abc_SclFindBestCell( SC_Man * p, Abc_Obj_t * pObj, Vec_Int_t * vRecalcs, Vec
continue
;
if
(
k
>
Notches
)
break
;
// if ( p->vInDrive && !Abc_SclInputDriveOk( p, pObj, pCellNew ) )
// continue;
// set new cell
Abc_SclObjSetCell
(
pObj
,
pCellNew
);
Abc_SclUpdateLoad
(
p
,
pObj
,
pCellOld
,
pCellNew
);
...
...
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