summaryrefslogtreecommitdiffstats
path: root/src/map
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2015-12-05 18:10:43 -0800
committerAlan Mishchenko <alanmi@berkeley.edu>2015-12-05 18:10:43 -0800
commit0f29ba75f6ec80b3eb1da4ef6b86157c7d5b8983 (patch)
treec4984999130dc532991ad02b1c44c9b1c6ce565d /src/map
parent56880eab5294d8a13e012eeca1e68255f0bf0e68 (diff)
downloadabc-0f29ba75f6ec80b3eb1da4ef6b86157c7d5b8983.tar.gz
abc-0f29ba75f6ec80b3eb1da4ef6b86157c7d5b8983.tar.bz2
abc-0f29ba75f6ec80b3eb1da4ef6b86157c7d5b8983.zip
Adding commands to read/write/print gate profiles.
Diffstat (limited to 'src/map')
-rw-r--r--src/map/mio/mio.c207
-rw-r--r--src/map/mio/mio.h5
-rw-r--r--src/map/mio/mioApi.c2
-rw-r--r--src/map/mio/mioInt.h1
-rw-r--r--src/map/mio/mioUtils.c43
5 files changed, 250 insertions, 8 deletions
diff --git a/src/map/mio/mio.c b/src/map/mio/mio.c
index 15f43657..1f7ff612 100644
--- a/src/map/mio/mio.c
+++ b/src/map/mio/mio.c
@@ -38,6 +38,9 @@ static int Mio_CommandReadLiberty( Abc_Frame_t * pAbc, int argc, char **argv );
static int Mio_CommandReadGenlib( Abc_Frame_t * pAbc, int argc, char **argv );
static int Mio_CommandWriteGenlib( Abc_Frame_t * pAbc, int argc, char **argv );
static int Mio_CommandPrintGenlib( Abc_Frame_t * pAbc, int argc, char **argv );
+static int Mio_CommandReadProfile( Abc_Frame_t * pAbc, int argc, char **argv );
+static int Mio_CommandWriteProfile( Abc_Frame_t * pAbc, int argc, char **argv );
+static int Mio_CommandPrintProfile( Abc_Frame_t * pAbc, int argc, char **argv );
/*
// internal version of genlib library
@@ -88,6 +91,10 @@ void Mio_Init( Abc_Frame_t * pAbc )
Cmd_CommandAdd( pAbc, "SC mapping", "write_genlib", Mio_CommandWriteGenlib, 0 );
Cmd_CommandAdd( pAbc, "SC mapping", "print_genlib", Mio_CommandPrintGenlib, 0 );
+ Cmd_CommandAdd( pAbc, "SC mapping", "read_profile", Mio_CommandReadProfile, 0 );
+ Cmd_CommandAdd( pAbc, "SC mapping", "write_profile", Mio_CommandWriteProfile, 0 );
+ Cmd_CommandAdd( pAbc, "SC mapping", "print_profile", Mio_CommandPrintProfile, 0 );
+
Cmd_CommandAdd( pAbc, "SC mapping", "read_library", Mio_CommandReadGenlib, 0 );
Cmd_CommandAdd( pAbc, "SC mapping", "write_library", Mio_CommandWriteGenlib, 0 );
Cmd_CommandAdd( pAbc, "SC mapping", "print_library", Mio_CommandPrintGenlib, 0 );
@@ -185,12 +192,10 @@ int Mio_CommandReadLiberty( Abc_Frame_t * pAbc, int argc, char **argv )
char Command[1000];
FILE * pFile;
FILE * pOut, * pErr;
- Abc_Ntk_t * pNet;
char * pFileName;
int fVerbose;
int c;
- pNet = Abc_FrameReadNtk(pAbc);
pOut = Abc_FrameReadOut(pAbc);
pErr = Abc_FrameReadErr(pAbc);
@@ -279,14 +284,12 @@ int Mio_CommandReadGenlib( Abc_Frame_t * pAbc, int argc, char **argv )
FILE * pOut, * pErr;
Mio_Library_t * pLib;
Amap_Lib_t * pLib2;
- Abc_Ntk_t * pNet;
char * pFileName;
char * pExcludeFile = NULL;
int fVerbose;
double WireDelay;
int c;
- pNet = Abc_FrameReadNtk(pAbc);
pOut = Abc_FrameReadOut(pAbc);
pErr = Abc_FrameReadErr(pAbc);
@@ -399,13 +402,11 @@ usage:
int Mio_CommandWriteGenlib( Abc_Frame_t * pAbc, int argc, char **argv )
{
FILE * pOut, * pErr, * pFile;
- Abc_Ntk_t * pNet;
char * pFileName;
int fSelected = 0;
int fVerbose = 0;
int c;
- pNet = Abc_FrameReadNtk(pAbc);
pOut = Abc_FrameReadOut(pAbc);
pErr = Abc_FrameReadErr(pAbc);
@@ -474,13 +475,11 @@ usage:
int Mio_CommandPrintGenlib( Abc_Frame_t * pAbc, int argc, char **argv )
{
FILE * pOut, * pErr;
- Abc_Ntk_t * pNet;
int fShort = 0;
int fSelected = 0;
int fVerbose = 0;
int c;
- pNet = Abc_FrameReadNtk(pAbc);
pOut = Abc_FrameReadOut(pAbc);
pErr = Abc_FrameReadErr(pAbc);
@@ -524,6 +523,198 @@ usage:
return 1;
}
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Mio_CommandReadProfile( Abc_Frame_t * pAbc, int argc, char **argv )
+{
+ FILE * pFile, * pOut, * pErr;
+ Mio_Library_t * pLib;
+ char * pFileName;
+ int c;
+
+ pOut = Abc_FrameReadOut(pAbc);
+ pErr = Abc_FrameReadErr(pAbc);
+
+ // set the defaults
+ Extra_UtilGetoptReset();
+ while ( (c = Extra_UtilGetopt(argc, argv, "h")) != EOF )
+ {
+ switch (c)
+ {
+ case 'h':
+ goto usage;
+ break;
+ default:
+ goto usage;
+ }
+ }
+ if ( argc != globalUtilOptind + 1 )
+ {
+ goto usage;
+ }
+
+ pLib = (Mio_Library_t *)Abc_FrameReadLibGen();
+ if ( pLib == NULL )
+ {
+ fprintf( pErr, "There is no Genlib library entered.\n" );
+ return 1;
+ }
+
+ // get the input file name
+ pFileName = argv[globalUtilOptind];
+ if ( (pFile = Io_FileOpen( pFileName, "open_path", "r", 0 )) == NULL )
+ {
+ fprintf( pErr, "Cannot open input file \"%s\". ", pFileName );
+ if ( (pFileName = Extra_FileGetSimilarName( pFileName, ".profile", NULL, NULL, NULL, NULL )) )
+ fprintf( pErr, "Did you mean \"%s\"?", pFileName );
+ fprintf( pErr, "\n" );
+ return 1;
+ }
+
+ // set the new network
+ Mio_LibraryReadProfile( pFile, pLib );
+ fclose( pFile );
+ return 0;
+
+usage:
+ fprintf( pErr, "usage: read_profile [-h] <file>\n");
+ fprintf( pErr, "\t read a gate profile from a profile file\n" );
+ fprintf( pErr, "\t-h : enable verbose output\n");
+ fprintf( pErr, "\t<file> : file name to read the profile\n");
+ return 1;
+}
+
+/**Function*************************************************************
+
+ Synopsis [Command procedure to read LUT libraries.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Mio_CommandWriteProfile( Abc_Frame_t * pAbc, int argc, char **argv )
+{
+ FILE * pOut, * pErr, * pFile;
+ char * pFileName;
+ int c;
+
+ pOut = Abc_FrameReadOut(pAbc);
+ pErr = Abc_FrameReadErr(pAbc);
+
+ Extra_UtilGetoptReset();
+ while ( (c = Extra_UtilGetopt(argc, argv, "h")) != EOF )
+ {
+ switch (c)
+ {
+ case 'h':
+ goto usage;
+ break;
+ default:
+ goto usage;
+ }
+ }
+ if ( Abc_FrameReadLibGen() == NULL )
+ {
+ printf( "Library is not available.\n" );
+ return 1;
+ }
+ if ( argc != globalUtilOptind + 1 )
+ {
+ printf( "The file name is not given.\n" );
+ return 1;
+ }
+
+ pFileName = argv[globalUtilOptind];
+ pFile = fopen( pFileName, "w" );
+ if ( pFile == NULL )
+ {
+ printf( "Error! Cannot open file \"%s\" for writing the library.\n", pFileName );
+ return 1;
+ }
+ Mio_LibraryWriteProfile( pFile, (Mio_Library_t *)Abc_FrameReadLibGen() );
+ fclose( pFile );
+ printf( "The current profile is written into file \"%s\".\n", pFileName );
+ return 0;
+
+usage:
+ fprintf( pErr, "\nusage: write_profile [-h] <file>\n");
+ fprintf( pErr, "\t writes the current profile into a file\n" );
+ fprintf( pErr, "\t-h : print the command usage\n");
+ fprintf( pErr, "\t<file> : file name to write the profile\n");
+ return 1;
+}
+
+/**Function*************************************************************
+
+ Synopsis [Command procedure to read LUT libraries.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Mio_CommandPrintProfile( Abc_Frame_t * pAbc, int argc, char **argv )
+{
+ FILE * pOut, * pErr;
+ int fShort = 0;
+ int fSelected = 0;
+ int fVerbose = 0;
+ int c;
+
+ pOut = Abc_FrameReadOut(pAbc);
+ pErr = Abc_FrameReadErr(pAbc);
+
+ // set the defaults
+ Extra_UtilGetoptReset();
+ while ( (c = Extra_UtilGetopt(argc, argv, "savh")) != EOF )
+ {
+ switch (c)
+ {
+ case 's':
+ fShort ^= 1;
+ break;
+ case 'a':
+ fSelected ^= 1;
+ break;
+ case 'v':
+ fVerbose ^= 1;
+ break;
+ case 'h':
+ goto usage;
+ break;
+ default:
+ goto usage;
+ }
+ }
+ if ( Abc_FrameReadLibGen() == NULL )
+ {
+ printf( "Library is not available.\n" );
+ return 1;
+ }
+ Mio_LibraryWriteProfile( stdout, (Mio_Library_t *)Abc_FrameReadLibGen() );
+ return 0;
+
+usage:
+ fprintf( pErr, "\nusage: print_profile [-h]\n");
+ fprintf( pErr, "\t print the current gate profile\n" );
+ fprintf( pErr, "\t-h : print the command usage\n");
+ return 1;
+}
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////
diff --git a/src/map/mio/mio.h b/src/map/mio/mio.h
index 0baf73ec..de9fb199 100644
--- a/src/map/mio/mio.h
+++ b/src/map/mio/mio.h
@@ -152,10 +152,12 @@ extern Vec_Int_t * Mio_GateReadExpr ( Mio_Gate_t * pGate );
extern word Mio_GateReadTruth ( Mio_Gate_t * pGate );
extern int Mio_GateReadValue ( Mio_Gate_t * pGate );
extern int Mio_GateReadCell ( Mio_Gate_t * pGate );
+extern int Mio_GateReadProfile ( Mio_Gate_t * pGate );
extern char * Mio_GateReadPinName ( Mio_Gate_t * pGate, int iPin );
extern float Mio_GateReadPinDelay ( Mio_Gate_t * pGate, int iPin );
extern void Mio_GateSetValue ( Mio_Gate_t * pGate, int Value );
extern void Mio_GateSetCell ( Mio_Gate_t * pGate, int Cell );
+extern void Mio_GateSetProfile ( Mio_Gate_t * pGate, int Prof );
extern int Mio_GateIsInv ( Mio_Gate_t * pGate );
extern char * Mio_PinReadName ( Mio_Pin_t * pPin );
extern Mio_PinPhase_t Mio_PinReadPhase ( Mio_Pin_t * pPin );
@@ -200,12 +202,15 @@ extern void Mio_LibraryMultiArea( Mio_Library_t * pLib, double Mult
extern void Mio_LibraryMultiDelay( Mio_Library_t * pLib, double Multi );
extern void Mio_LibraryTransferDelays( Mio_Library_t * pLibD, Mio_Library_t * pLibS );
extern void Mio_LibraryTransferCellIds();
+extern void Mio_LibraryReadProfile( FILE * pFile, Mio_Library_t * pLib );
+extern void Mio_LibraryWriteProfile( FILE * pFile, Mio_Library_t * pLib );
/*=== sclUtil.c =========================================================*/
extern Mio_Library_t * Abc_SclDeriveGenlibSimple( void * pScl );
extern Mio_Library_t * Abc_SclDeriveGenlib( void * pScl, float Slew, float Gain, int nGatesMin, int fVerbose );
extern int Abc_SclHasDelayInfo( void * pScl );
+
ABC_NAMESPACE_HEADER_END
#endif
diff --git a/src/map/mio/mioApi.c b/src/map/mio/mioApi.c
index 4b469ba2..8fc11666 100644
--- a/src/map/mio/mioApi.c
+++ b/src/map/mio/mioApi.c
@@ -179,8 +179,10 @@ word Mio_GateReadTruth ( Mio_Gate_t * pGate ) { return
word * Mio_GateReadTruthP ( Mio_Gate_t * pGate ) { return pGate->nInputs <= 6 ? NULL: pGate->pTruth; }
int Mio_GateReadValue ( Mio_Gate_t * pGate ) { return pGate->Value; }
int Mio_GateReadCell ( Mio_Gate_t * pGate ) { return pGate->Cell; }
+int Mio_GateReadProfile ( Mio_Gate_t * pGate ) { return pGate->Profile; }
void Mio_GateSetValue ( Mio_Gate_t * pGate, int Value ) { pGate->Value = Value; }
void Mio_GateSetCell ( Mio_Gate_t * pGate, int Cell ) { pGate->Cell = Cell; }
+void Mio_GateSetProfile ( Mio_Gate_t * pGate, int Prof ) { pGate->Profile = Prof; }
int Mio_GateIsInv ( Mio_Gate_t * pGate ) { return pGate->uTruth == ABC_CONST(0x5555555555555555); }
/**Function*************************************************************
diff --git a/src/map/mio/mioInt.h b/src/map/mio/mioInt.h
index 8edc51d1..394187c5 100644
--- a/src/map/mio/mioInt.h
+++ b/src/map/mio/mioInt.h
@@ -95,6 +95,7 @@ struct Mio_GateStruct_t_
// the derived information
int Cell; // cell id
int nInputs; // the number of inputs
+ int Profile; // the number of occurrences
double dDelayMax; // the maximum delay
char * pSop; // sum-of-products
Vec_Int_t * vExpr; // boolean expression
diff --git a/src/map/mio/mioUtils.c b/src/map/mio/mioUtils.c
index 623b7c84..5c8e1569 100644
--- a/src/map/mio/mioUtils.c
+++ b/src/map/mio/mioUtils.c
@@ -1345,6 +1345,49 @@ void Mio_LibraryTransferCellIds()
}
}
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Mio_LibraryReadProfile( FILE * pFile, Mio_Library_t * pLib )
+{
+ Mio_Gate_t * pGate;
+ char pBuffer[1000];
+ while ( fgets( pBuffer, 1000, pFile ) != NULL )
+ {
+ char * pToken = strtok( pBuffer, " \t\n" );
+ if ( pToken == NULL )
+ continue;
+ if ( pToken[0] == '#' )
+ continue;
+ // read gate
+ pGate = Mio_LibraryReadGateByName( pLib, pToken, NULL );
+ if ( pGate == NULL )
+ {
+ printf( "Cannot find gate \"%s\" in library \"%s\".\n", Mio_GateReadName(pGate), Mio_LibraryReadName(pLib) );
+ continue;
+ }
+ // read profile
+ pToken = strtok( NULL, " \t\n" );
+ Mio_GateSetProfile( pGate, atoi(pToken) );
+ }
+}
+
+void Mio_LibraryWriteProfile( FILE * pFile, Mio_Library_t * pLib )
+{
+ Mio_Gate_t * pGate;
+ Mio_LibraryForEachGate( pLib, pGate )
+ if ( Mio_GateReadProfile(pGate) > 0 )
+ fprintf( pFile, "%-24s %6d\n", Mio_GateReadName(pGate), Mio_GateReadProfile(pGate) );
+}
+
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///