summaryrefslogtreecommitdiffstats
path: root/src/map/mio
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2007-10-01 08:01:00 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2007-10-01 08:01:00 -0700
commit4812c90424dfc40d26725244723887a2d16ddfd9 (patch)
treeb32ace96e7e2d84d586e09ba605463b6f49c3271 /src/map/mio
parente54d9691616b9a0326e2fdb3156bb4eeb8abfcd7 (diff)
downloadabc-4812c90424dfc40d26725244723887a2d16ddfd9.tar.gz
abc-4812c90424dfc40d26725244723887a2d16ddfd9.tar.bz2
abc-4812c90424dfc40d26725244723887a2d16ddfd9.zip
Version abc71001
Diffstat (limited to 'src/map/mio')
-rw-r--r--src/map/mio/mio.c269
-rw-r--r--src/map/mio/mio.h150
-rw-r--r--src/map/mio/mioApi.c172
-rw-r--r--src/map/mio/mioFunc.c268
-rw-r--r--src/map/mio/mioGENERIC.c46
-rw-r--r--src/map/mio/mioInt.h125
-rw-r--r--src/map/mio/mioRead.c582
-rw-r--r--src/map/mio/mioUtils.c531
-rw-r--r--src/map/mio/module.make5
9 files changed, 2148 insertions, 0 deletions
diff --git a/src/map/mio/mio.c b/src/map/mio/mio.c
new file mode 100644
index 00000000..10a5af9d
--- /dev/null
+++ b/src/map/mio/mio.c
@@ -0,0 +1,269 @@
+/**CFile****************************************************************
+
+ FileName [mio.c]
+
+ PackageName [MVSIS 1.3: Multi-valued logic synthesis system.]
+
+ Synopsis [File reading/writing for technology mapping.]
+
+ Author [MVSIS Group]
+
+ Affiliation [UC Berkeley]
+
+ Date [Ver. 1.0. Started - August 18, 2003.]
+
+ Revision [$Id: mio.c,v 1.4 2004/08/05 18:34:51 satrajit Exp $]
+
+***********************************************************************/
+
+#include "abc.h"
+#include "mvc.h"
+#include "mainInt.h"
+#include "mioInt.h"
+#include "mapper.h"
+
+////////////////////////////////////////////////////////////////////////
+/// DECLARATIONS ///
+////////////////////////////////////////////////////////////////////////
+
+static int Mio_CommandReadLibrary( Abc_Frame_t * pAbc, int argc, char **argv );
+static int Mio_CommandPrintLibrary( Abc_Frame_t * pAbc, int argc, char **argv );
+
+// internal version of GENLIB library
+static char * pMcncGenlib[25] = {
+ "GATE inv1 1 O=!a; PIN * INV 1 999 0.9 0.0 0.9 0.0\n",
+ "GATE inv2 2 O=!a; PIN * INV 2 999 1.0 0.0 1.0 0.0\n",
+ "GATE inv3 3 O=!a; PIN * INV 3 999 1.1 0.0 1.1 0.0\n",
+ "GATE inv4 4 O=!a; PIN * INV 4 999 1.2 0.0 1.2 0.0\n",
+ "GATE nand2 2 O=!(a*b); PIN * INV 1 999 1.0 0.0 1.0 0.0\n",
+ "GATE nand3 3 O=!(a*b*c); PIN * INV 1 999 1.1 0.0 1.1 0.0\n",
+ "GATE nand4 4 O=!(a*b*c*d); PIN * INV 1 999 1.4 0.0 1.4 0.0\n",
+ "GATE nor2 2 O=!(a+b); PIN * INV 1 999 1.4 0.0 1.4 0.0\n",
+ "GATE nor3 3 O=!(a+b+c); PIN * INV 1 999 2.4 0.0 2.4 0.0\n",
+ "GATE nor4 4 O=!(a+b+c+d); PIN * INV 1 999 3.8 0.0 3.8 0.0\n",
+ "GATE xora 5 O=a*!b+!a*b; PIN * UNKNOWN 2 999 1.9 0.0 1.9 0.0\n",
+ "GATE xorb 5 O=!(a*b+!a*!b); PIN * UNKNOWN 2 999 1.9 0.0 1.9 0.0\n",
+ "GATE xnora 5 O=a*b+!a*!b; PIN * UNKNOWN 2 999 2.1 0.0 2.1 0.0\n",
+ "GATE xnorb 5 O=!(!a*b+a*!b); PIN * UNKNOWN 2 999 2.1 0.0 2.1 0.0\n",
+ "GATE aoi21 3 O=!(a*b+c); PIN * INV 1 999 1.6 0.0 1.6 0.0\n",
+ "GATE aoi22 4 O=!(a*b+c*d); PIN * INV 1 999 2.0 0.0 2.0 0.0\n",
+ "GATE oai21 3 O=!((a+b)*c); PIN * INV 1 999 1.6 0.0 1.6 0.0\n",
+ "GATE oai22 4 O=!((a+b)*(c+d)); PIN * INV 1 999 2.0 0.0 2.0 0.0\n",
+ "GATE buf 1 O=a; PIN * NONINV 1 999 1.0 0.0 1.0 0.0\n",
+ "GATE zero 0 O=CONST0;\n",
+ "GATE one 0 O=CONST1;\n"
+};
+
+////////////////////////////////////////////////////////////////////////
+/// FUNCTION DEFINITIONS ///
+////////////////////////////////////////////////////////////////////////
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Mio_Init( Abc_Frame_t * pAbc )
+{
+ char * pFileTemp = "mcnc_temp.genlib";
+ Mio_Library_t * pLibGen;
+ FILE * pFile;
+ int i;
+
+ // write genlib into file
+ pFile = fopen( pFileTemp, "w" );
+ for ( i = 0; pMcncGenlib[i]; i++ )
+ fputs( pMcncGenlib[i], pFile );
+ fclose( pFile );
+ // read genlib from file
+ pLibGen = Mio_LibraryRead( pAbc, pFileTemp, NULL, 0 );
+ Abc_FrameSetLibGen( pLibGen );
+#ifdef WIN32
+ _unlink( pFileTemp );
+#else
+ unlink( pFileTemp );
+#endif
+
+ Cmd_CommandAdd( pAbc, "SC mapping", "read_library", Mio_CommandReadLibrary, 0 );
+ Cmd_CommandAdd( pAbc, "SC mapping", "print_library", Mio_CommandPrintLibrary, 0 );
+}
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Mio_End()
+{
+// Mio_LibraryDelete( s_pLib );
+ Mio_LibraryDelete( Abc_FrameReadLibGen() );
+}
+
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Mio_CommandReadLibrary( Abc_Frame_t * pAbc, int argc, char **argv )
+{
+ FILE * pFile;
+ FILE * pOut, * pErr;
+ Mio_Library_t * pLib;
+ Abc_Ntk_t * pNet;
+ char * FileName;
+ int fVerbose;
+ int c;
+
+ pNet = Abc_FrameReadNtk(pAbc);
+ pOut = Abc_FrameReadOut(pAbc);
+ pErr = Abc_FrameReadErr(pAbc);
+
+ // set the defaults
+ fVerbose = 1;
+ Extra_UtilGetoptReset();
+ while ( (c = Extra_UtilGetopt(argc, argv, "vh")) != EOF )
+ {
+ switch (c)
+ {
+ case 'v':
+ fVerbose ^= 1;
+ break;
+ case 'h':
+ goto usage;
+ break;
+ default:
+ goto usage;
+ }
+ }
+
+
+ if ( argc != globalUtilOptind + 1 )
+ {
+ goto usage;
+ }
+
+ // get the input file name
+ FileName = argv[globalUtilOptind];
+ if ( (pFile = Io_FileOpen( FileName, "open_path", "r", 0 )) == NULL )
+ {
+ fprintf( pErr, "Cannot open input file \"%s\". ", FileName );
+ if ( (FileName = Extra_FileGetSimilarName( FileName, ".genlib", ".lib", ".gen", ".g", NULL )) )
+ fprintf( pErr, "Did you mean \"%s\"?", FileName );
+ fprintf( pErr, "\n" );
+ return 1;
+ }
+ fclose( pFile );
+
+ // set the new network
+ pLib = Mio_LibraryRead( pAbc, FileName, 0, fVerbose );
+ if ( pLib == NULL )
+ {
+ fprintf( pErr, "Reading GENLIB library has failed.\n" );
+ return 1;
+ }
+ // free the current superlib because it depends on the old Mio library
+ if ( Abc_FrameReadLibSuper() )
+ {
+ extern void Map_SuperLibFree( Map_SuperLib_t * p );
+// Map_SuperLibFree( s_pSuperLib );
+// s_pSuperLib = NULL;
+ Map_SuperLibFree( Abc_FrameReadLibSuper() );
+ Abc_FrameSetLibSuper( NULL );
+ }
+
+ // replace the current library
+// Mio_LibraryDelete( s_pLib );
+// s_pLib = pLib;
+ Mio_LibraryDelete( Abc_FrameReadLibGen() );
+ Abc_FrameSetLibGen( pLib );
+ return 0;
+
+usage:
+ fprintf( pErr, "usage: read_library [-vh]\n");
+ fprintf( pErr, "\t read the library from a genlib file\n" );
+ fprintf( pErr, "\t-h : enable verbose output\n");
+ return 1; /* error exit */
+}
+
+
+/**Function*************************************************************
+
+ Synopsis [Command procedure to read LUT libraries.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Mio_CommandPrintLibrary( Abc_Frame_t * pAbc, int argc, char **argv )
+{
+ FILE * pOut, * pErr;
+ Abc_Ntk_t * pNet;
+ int fVerbose;
+ int c;
+
+ pNet = Abc_FrameReadNtk(pAbc);
+ pOut = Abc_FrameReadOut(pAbc);
+ pErr = Abc_FrameReadErr(pAbc);
+
+ // set the defaults
+ fVerbose = 1;
+ Extra_UtilGetoptReset();
+ while ( (c = Extra_UtilGetopt(argc, argv, "vh")) != EOF )
+ {
+ switch (c)
+ {
+ case 'v':
+ fVerbose ^= 1;
+ break;
+ case 'h':
+ goto usage;
+ break;
+ default:
+ goto usage;
+ }
+ }
+
+
+ if ( argc != globalUtilOptind )
+ {
+ goto usage;
+ }
+
+ // set the new network
+ Mio_WriteLibrary( stdout, Abc_FrameReadLibGen(), 0 );
+ return 0;
+
+usage:
+ fprintf( pErr, "\nusage: print_library [-vh]\n");
+ fprintf( pErr, "\t print the current genlib library\n" );
+ fprintf( pErr, "\t-v : toggles enabling of verbose output [default = %s]\n", (fVerbose? "yes" : "no") );
+ fprintf( pErr, "\t-h : print the command usage\n");
+ return 1; /* error exit */
+}
+////////////////////////////////////////////////////////////////////////
+/// END OF FILE ///
+////////////////////////////////////////////////////////////////////////
+
+
diff --git a/src/map/mio/mio.h b/src/map/mio/mio.h
new file mode 100644
index 00000000..dbe2420b
--- /dev/null
+++ b/src/map/mio/mio.h
@@ -0,0 +1,150 @@
+/**CFile****************************************************************
+
+ FileName [mio.h]
+
+ PackageName [MVSIS 2.0: Multi-valued logic synthesis system.]
+
+ Synopsis [File reading/writing for technology mapping.]
+
+ Author [MVSIS Group]
+
+ Affiliation [UC Berkeley]
+
+ Date [Ver. 1.0. Started - September 8, 2003.]
+
+ Revision [$Id: mio.h,v 1.6 2004/08/09 22:16:31 satrajit Exp $]
+
+***********************************************************************/
+
+#ifndef __MIO_H__
+#define __MIO_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+////////////////////////////////////////////////////////////////////////
+/// INCLUDES ///
+////////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////////
+/// PARAMETERS ///
+////////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////////
+/// STRUCTURE DEFINITIONS ///
+////////////////////////////////////////////////////////////////////////
+
+typedef enum { MIO_PHASE_UNKNOWN, MIO_PHASE_INV, MIO_PHASE_NONINV } Mio_PinPhase_t;
+
+typedef struct Mio_LibraryStruct_t_ Mio_Library_t;
+typedef struct Mio_GateStruct_t_ Mio_Gate_t;
+typedef struct Mio_PinStruct_t_ Mio_Pin_t;
+
+////////////////////////////////////////////////////////////////////////
+/// GLOBAL VARIABLES ///
+////////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////////
+/// MACRO DEFINITIONS ///
+////////////////////////////////////////////////////////////////////////
+
+#define Mio_LibraryForEachGate( Lib, Gate ) \
+ for ( Gate = Mio_LibraryReadGates(Lib); \
+ Gate; \
+ Gate = Mio_GateReadNext(Gate) )
+#define Mio_LibraryForEachGateSafe( Lib, Gate, Gate2 ) \
+ for ( Gate = Mio_LibraryReadGates(Lib), \
+ Gate2 = (Gate? Mio_GateReadNext(Gate): NULL); \
+ Gate; \
+ Gate = Gate2, \
+ Gate2 = (Gate? Mio_GateReadNext(Gate): NULL) )
+
+#define Mio_GateForEachPin( Gate, Pin ) \
+ for ( Pin = Mio_GateReadPins(Gate); \
+ Pin; \
+ Pin = Mio_PinReadNext(Pin) )
+#define Mio_GateForEachPinSafe( Gate, Pin, Pin2 ) \
+ for ( Pin = Mio_GateReadPins(Gate), \
+ Pin2 = (Pin? Mio_PinReadNext(Pin): NULL); \
+ Pin; \
+ Pin = Pin2, \
+ Pin2 = (Pin? Mio_PinReadNext(Pin): NULL) )
+
+////////////////////////////////////////////////////////////////////////
+/// FUNCTION DEFINITIONS ///
+////////////////////////////////////////////////////////////////////////
+
+/*=== mioApi.c =============================================================*/
+extern char * Mio_LibraryReadName ( Mio_Library_t * pLib );
+extern int Mio_LibraryReadGateNum ( Mio_Library_t * pLib );
+extern Mio_Gate_t * Mio_LibraryReadGates ( Mio_Library_t * pLib );
+extern DdManager * Mio_LibraryReadDd ( Mio_Library_t * pLib );
+extern Mio_Gate_t * Mio_LibraryReadGateByName ( Mio_Library_t * pLib, char * pName );
+extern char * Mio_LibraryReadSopByName ( Mio_Library_t * pLib, char * pName );
+extern Mio_Gate_t * Mio_LibraryReadConst0 ( Mio_Library_t * pLib );
+extern Mio_Gate_t * Mio_LibraryReadConst1 ( Mio_Library_t * pLib );
+extern Mio_Gate_t * Mio_LibraryReadNand2 ( Mio_Library_t * pLib );
+extern Mio_Gate_t * Mio_LibraryReadAnd2 ( Mio_Library_t * pLib );
+extern Mio_Gate_t * Mio_LibraryReadBuf ( Mio_Library_t * pLib );
+extern Mio_Gate_t * Mio_LibraryReadInv ( Mio_Library_t * pLib );
+extern float Mio_LibraryReadDelayInvRise( Mio_Library_t * pLib );
+extern float Mio_LibraryReadDelayInvFall( Mio_Library_t * pLib );
+extern float Mio_LibraryReadDelayInvMax( Mio_Library_t * pLib );
+extern float Mio_LibraryReadDelayNand2Rise( Mio_Library_t * pLib );
+extern float Mio_LibraryReadDelayNand2Fall( Mio_Library_t * pLib );
+extern float Mio_LibraryReadDelayNand2Max( Mio_Library_t * pLib );
+extern float Mio_LibraryReadDelayAnd2Max( Mio_Library_t * pLib );
+extern float Mio_LibraryReadAreaInv ( Mio_Library_t * pLib );
+extern float Mio_LibraryReadAreaBuf ( Mio_Library_t * pLib );
+extern float Mio_LibraryReadAreaNand2 ( Mio_Library_t * pLib );
+extern int Mio_LibraryReadGateNameMax( Mio_Library_t * pLib );
+extern char * Mio_GateReadName ( Mio_Gate_t * pGate );
+extern char * Mio_GateReadOutName ( Mio_Gate_t * pGate );
+extern double Mio_GateReadArea ( Mio_Gate_t * pGate );
+extern char * Mio_GateReadForm ( Mio_Gate_t * pGate );
+extern Mio_Pin_t * Mio_GateReadPins ( Mio_Gate_t * pGate );
+extern Mio_Library_t * Mio_GateReadLib ( Mio_Gate_t * pGate );
+extern Mio_Gate_t * Mio_GateReadNext ( Mio_Gate_t * pGate );
+extern int Mio_GateReadInputs ( Mio_Gate_t * pGate );
+extern double Mio_GateReadDelayMax ( Mio_Gate_t * pGate );
+extern char * Mio_GateReadSop ( Mio_Gate_t * pGate );
+extern DdNode * Mio_GateReadFunc ( Mio_Gate_t * pGate );
+extern char * Mio_PinReadName ( Mio_Pin_t * pPin );
+extern Mio_PinPhase_t Mio_PinReadPhase ( Mio_Pin_t * pPin );
+extern double Mio_PinReadInputLoad ( Mio_Pin_t * pPin );
+extern double Mio_PinReadMaxLoad ( Mio_Pin_t * pPin );
+extern double Mio_PinReadDelayBlockRise ( Mio_Pin_t * pPin );
+extern double Mio_PinReadDelayFanoutRise( Mio_Pin_t * pPin );
+extern double Mio_PinReadDelayBlockFall ( Mio_Pin_t * pPin );
+extern double Mio_PinReadDelayFanoutFall( Mio_Pin_t * pPin );
+extern double Mio_PinReadDelayBlockMax ( Mio_Pin_t * pPin );
+extern Mio_Pin_t * Mio_PinReadNext ( Mio_Pin_t * pPin );
+/*=== mioRead.c =============================================================*/
+extern Mio_Library_t * Mio_LibraryRead( void * pAbc, char * FileName, char * ExcludeFile, int fVerbose );
+extern int Mio_LibraryReadExclude( void * pAbc, char * ExcludeFile, st_table * tExcludeGate );
+/*=== mioFunc.c =============================================================*/
+extern int Mio_LibraryParseFormulas( Mio_Library_t * pLib );
+/*=== mioUtils.c =============================================================*/
+extern void Mio_LibraryDelete( Mio_Library_t * pLib );
+extern void Mio_GateDelete( Mio_Gate_t * pGate );
+extern void Mio_PinDelete( Mio_Pin_t * pPin );
+extern Mio_Pin_t * Mio_PinDup( Mio_Pin_t * pPin );
+extern void Mio_WriteLibrary( FILE * pFile, Mio_Library_t * pLib, int fPrintSops );
+extern Mio_Gate_t ** Mio_CollectRoots( Mio_Library_t * pLib, int nInputs, float tDelay, bool fSkipInv, int * pnGates );
+extern void Mio_DeriveTruthTable( Mio_Gate_t * pGate, unsigned uTruthsIn[][2], int nSigns, int nInputs, unsigned uTruthRes[] );
+extern void Mio_DeriveGateDelays( Mio_Gate_t * pGate,
+ float ** ptPinDelays, int nPins, int nInputs, float tDelayZero,
+ float * ptDelaysRes, float * ptPinDelayMax );
+extern Mio_Gate_t * Mio_GateCreatePseudo( int nInputs );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+////////////////////////////////////////////////////////////////////////
+/// END OF FILE ///
+////////////////////////////////////////////////////////////////////////
+
diff --git a/src/map/mio/mioApi.c b/src/map/mio/mioApi.c
new file mode 100644
index 00000000..73473f8b
--- /dev/null
+++ b/src/map/mio/mioApi.c
@@ -0,0 +1,172 @@
+/**CFile****************************************************************
+
+ FileName [mioApi.c]
+
+ PackageName [MVSIS 1.3: Multi-valued logic synthesis system.]
+
+ Synopsis [File reading/writing for technology mapping.]
+
+ Author [MVSIS Group]
+
+ Affiliation [UC Berkeley]
+
+ Date [Ver. 1.0. Started - September 8, 2003.]
+
+ Revision [$Id: mioApi.c,v 1.4 2004/06/28 14:20:25 alanmi Exp $]
+
+***********************************************************************/
+
+#include "mioInt.h"
+
+////////////////////////////////////////////////////////////////////////
+/// DECLARATIONS ///
+////////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////////
+/// FUNCTION DEFINITIONS ///
+////////////////////////////////////////////////////////////////////////
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+char * Mio_LibraryReadName ( Mio_Library_t * pLib ) { return pLib->pName; }
+int Mio_LibraryReadGateNum ( Mio_Library_t * pLib ) { return pLib->nGates; }
+Mio_Gate_t * Mio_LibraryReadGates ( Mio_Library_t * pLib ) { return pLib->pGates; }
+DdManager * Mio_LibraryReadDd ( Mio_Library_t * pLib ) { return pLib->dd; }
+Mio_Gate_t * Mio_LibraryReadBuf ( Mio_Library_t * pLib ) { return pLib->pGateBuf; }
+Mio_Gate_t * Mio_LibraryReadInv ( Mio_Library_t * pLib ) { return pLib->pGateInv; }
+Mio_Gate_t * Mio_LibraryReadConst0 ( Mio_Library_t * pLib ) { return pLib->pGate0; }
+Mio_Gate_t * Mio_LibraryReadConst1 ( Mio_Library_t * pLib ) { return pLib->pGate1; }
+Mio_Gate_t * Mio_LibraryReadNand2 ( Mio_Library_t * pLib ) { return pLib->pGateNand2; }
+Mio_Gate_t * Mio_LibraryReadAnd2 ( Mio_Library_t * pLib ) { return pLib->pGateAnd2; }
+float Mio_LibraryReadDelayInvRise ( Mio_Library_t * pLib ) { return (float)(pLib->pGateInv? pLib->pGateInv->pPins->dDelayBlockRise : 0.0); }
+float Mio_LibraryReadDelayInvFall ( Mio_Library_t * pLib ) { return (float)(pLib->pGateInv? pLib->pGateInv->pPins->dDelayBlockFall : 0.0); }
+float Mio_LibraryReadDelayInvMax ( Mio_Library_t * pLib ) { return (float)(pLib->pGateInv? pLib->pGateInv->pPins->dDelayBlockMax : 0.0); }
+float Mio_LibraryReadDelayNand2Rise( Mio_Library_t * pLib ) { return (float)(pLib->pGateNand2? pLib->pGateNand2->pPins->dDelayBlockRise : 0.0); }
+float Mio_LibraryReadDelayNand2Fall( Mio_Library_t * pLib ) { return (float)(pLib->pGateNand2? pLib->pGateNand2->pPins->dDelayBlockFall : 0.0); }
+float Mio_LibraryReadDelayNand2Max ( Mio_Library_t * pLib ) { return (float)(pLib->pGateNand2? pLib->pGateNand2->pPins->dDelayBlockMax : 0.0); }
+float Mio_LibraryReadDelayAnd2Max ( Mio_Library_t * pLib ) { return (float)(pLib->pGateAnd2? pLib->pGateAnd2->pPins->dDelayBlockMax : 0.0); }
+float Mio_LibraryReadAreaInv ( Mio_Library_t * pLib ) { return (float)(pLib->pGateInv? pLib->pGateInv->dArea : 0.0); }
+float Mio_LibraryReadAreaBuf ( Mio_Library_t * pLib ) { return (float)(pLib->pGateBuf? pLib->pGateBuf->dArea : 0.0); }
+float Mio_LibraryReadAreaNand2 ( Mio_Library_t * pLib ) { return (float)(pLib->pGateNand2? pLib->pGateNand2->dArea : 0.0); }
+
+/**Function*************************************************************
+
+ Synopsis [Returns the longest gate name.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Mio_LibraryReadGateNameMax( Mio_Library_t * pLib )
+{
+ Mio_Gate_t * pGate;
+ int LenMax = 0, LenCur;
+ Mio_LibraryForEachGate( pLib, pGate )
+ {
+ LenCur = strlen( Mio_GateReadName(pGate) );
+ if ( LenMax < LenCur )
+ LenMax = LenCur;
+ }
+ return LenMax;
+}
+
+/**Function*************************************************************
+
+ Synopsis [Read Mvc of the gate by name.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+Mio_Gate_t * Mio_LibraryReadGateByName( Mio_Library_t * pLib, char * pName )
+{
+ Mio_Gate_t * pGate;
+ if ( st_lookup( pLib->tName2Gate, pName, (char **)&pGate ) )
+ return pGate;
+ return NULL;
+}
+
+/**Function*************************************************************
+
+ Synopsis [Read Mvc of the gate by name.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+char * Mio_LibraryReadSopByName( Mio_Library_t * pLib, char * pName )
+{
+ Mio_Gate_t * pGate;
+ if ( st_lookup( pLib->tName2Gate, pName, (char **)&pGate ) )
+ return pGate->pSop;
+ return NULL;
+}
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+char * Mio_GateReadName ( Mio_Gate_t * pGate ) { return pGate->pName; }
+char * Mio_GateReadOutName ( Mio_Gate_t * pGate ) { return pGate->pOutName; }
+double Mio_GateReadArea ( Mio_Gate_t * pGate ) { return pGate->dArea; }
+char * Mio_GateReadForm ( Mio_Gate_t * pGate ) { return pGate->pForm; }
+Mio_Pin_t * Mio_GateReadPins ( Mio_Gate_t * pGate ) { return pGate->pPins; }
+Mio_Library_t * Mio_GateReadLib ( Mio_Gate_t * pGate ) { return pGate->pLib; }
+Mio_Gate_t * Mio_GateReadNext ( Mio_Gate_t * pGate ) { return pGate->pNext; }
+int Mio_GateReadInputs ( Mio_Gate_t * pGate ) { return pGate->nInputs; }
+double Mio_GateReadDelayMax( Mio_Gate_t * pGate ) { return pGate->dDelayMax; }
+char * Mio_GateReadSop ( Mio_Gate_t * pGate ) { return pGate->pSop; }
+DdNode * Mio_GateReadFunc ( Mio_Gate_t * pGate ) { return pGate->bFunc; }
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+char * Mio_PinReadName ( Mio_Pin_t * pPin ) { return pPin->pName; }
+Mio_PinPhase_t Mio_PinReadPhase ( Mio_Pin_t * pPin ) { return pPin->Phase; }
+double Mio_PinReadInputLoad ( Mio_Pin_t * pPin ) { return pPin->dLoadInput; }
+double Mio_PinReadMaxLoad ( Mio_Pin_t * pPin ) { return pPin->dLoadMax; }
+double Mio_PinReadDelayBlockRise ( Mio_Pin_t * pPin ) { return pPin->dDelayBlockRise; }
+double Mio_PinReadDelayFanoutRise( Mio_Pin_t * pPin ) { return pPin->dDelayFanoutRise;}
+double Mio_PinReadDelayBlockFall ( Mio_Pin_t * pPin ) { return pPin->dDelayBlockFall; }
+double Mio_PinReadDelayFanoutFall( Mio_Pin_t * pPin ) { return pPin->dDelayFanoutFall;}
+double Mio_PinReadDelayBlockMax ( Mio_Pin_t * pPin ) { return pPin->dDelayBlockMax; }
+Mio_Pin_t * Mio_PinReadNext ( Mio_Pin_t * pPin ) { return pPin->pNext; }
+
+////////////////////////////////////////////////////////////////////////
+/// END OF FILE ///
+////////////////////////////////////////////////////////////////////////
+
+
diff --git a/src/map/mio/mioFunc.c b/src/map/mio/mioFunc.c
new file mode 100644
index 00000000..21a078f9
--- /dev/null
+++ b/src/map/mio/mioFunc.c
@@ -0,0 +1,268 @@
+/**CFile****************************************************************
+
+ FileName [mioFunc.c]
+
+ PackageName [MVSIS 1.3: Multi-valued logic synthesis system.]
+
+ Synopsis [File reading/writing for technology mapping.]
+
+ Author [MVSIS Group]
+
+ Affiliation [UC Berkeley]
+
+ Date [Ver. 1.0. Started - September 8, 2003.]
+
+ Revision [$Id: mioFunc.c,v 1.4 2004/06/28 14:20:25 alanmi Exp $]
+
+***********************************************************************/
+
+#include "mioInt.h"
+#include "parse.h"
+
+////////////////////////////////////////////////////////////////////////
+/// DECLARATIONS ///
+////////////////////////////////////////////////////////////////////////
+
+// these symbols (and no other) can appear in the formulas
+#define MIO_SYMB_AND '*'
+#define MIO_SYMB_OR '+'
+#define MIO_SYMB_NOT '!'
+#define MIO_SYMB_AFTNOT '\''
+#define MIO_SYMB_OPEN '('
+#define MIO_SYMB_CLOSE ')'
+
+static int Mio_GateParseFormula( Mio_Gate_t * pGate );
+static int Mio_GateCollectNames( char * pFormula, char * pPinNames[] );
+
+////////////////////////////////////////////////////////////////////////
+/// FUNCTION DEFINITIONS ///
+////////////////////////////////////////////////////////////////////////
+
+/**Function*************************************************************
+
+ Synopsis [Deriving the functionality of the gates.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Mio_LibraryParseFormulas( Mio_Library_t * pLib )
+{
+ Mio_Gate_t * pGate;
+
+ // count the gates
+ pLib->nGates = 0;
+ Mio_LibraryForEachGate( pLib, pGate )
+ pLib->nGates++;
+
+ // start a temporary BDD manager
+ pLib->dd = Cudd_Init( 20, 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
+ // introduce ZDD variables
+ Cudd_zddVarsFromBddVars( pLib->dd, 2 );
+
+ // for each gate, derive its function
+ Mio_LibraryForEachGate( pLib, pGate )
+ if ( Mio_GateParseFormula( pGate ) )
+ return 1;
+ return 0;
+}
+
+
+/**Function*************************************************************
+
+ Synopsis [Deriving the functionality of the gates.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Mio_GateParseFormula( Mio_Gate_t * pGate )
+{
+ DdManager * dd = pGate->pLib->dd;
+ char * pPinNames[100];
+ char * pPinNamesCopy[100];
+ Mio_Pin_t * pPin, ** ppPin;
+ int nPins, iPin, i;
+
+ // set the maximum delay of the gate; count pins
+ pGate->dDelayMax = 0.0;
+ nPins = 0;
+ Mio_GateForEachPin( pGate, pPin )
+ {
+ // set the maximum delay of the gate
+ if ( pGate->dDelayMax < pPin->dDelayBlockMax )
+ pGate->dDelayMax = pPin->dDelayBlockMax;
+ // count the pin
+ nPins++;
+ }
+
+ // check for the gate with const function
+ if ( nPins == 0 )
+ {
+ if ( strcmp( pGate->pForm, MIO_STRING_CONST0 ) == 0 )
+ {
+ pGate->bFunc = b0;
+ pGate->pSop = Abc_SopRegister( pGate->pLib->pMmFlex, " 0\n" );
+ pGate->pLib->pGate0 = pGate;
+ }
+ else if ( strcmp( pGate->pForm, MIO_STRING_CONST1 ) == 0 )
+ {
+ pGate->bFunc = b1;
+ pGate->pSop = Abc_SopRegister( pGate->pLib->pMmFlex, " 1\n" );
+ pGate->pLib->pGate1 = pGate;
+ }
+ else
+ {
+ printf( "Cannot parse formula \"%s\" of gate \"%s\".\n", pGate->pForm, pGate->pName );
+ return 1;
+ }
+ Cudd_Ref( pGate->bFunc );
+ return 0;
+ }
+
+ // collect the names as they appear in the formula
+ nPins = Mio_GateCollectNames( pGate->pForm, pPinNames );
+ if ( nPins == 0 )
+ {
+ printf( "Cannot read formula \"%s\" of gate \"%s\".\n", pGate->pForm, pGate->pName );
+ return 1;
+ }
+
+ // set the number of inputs
+ pGate->nInputs = nPins;
+
+ // consider the case when all the pins have identical pin info
+ if ( strcmp( pGate->pPins->pName, "*" ) == 0 )
+ {
+ // get the topmost (generic) pin
+ pPin = pGate->pPins;
+ FREE( pPin->pName );
+
+ // create individual pins from the generic pin
+ ppPin = &pPin->pNext;
+ for ( i = 1; i < nPins; i++ )
+ {
+ // get the new pin
+ *ppPin = Mio_PinDup( pPin );
+ // set its name
+ (*ppPin)->pName = pPinNames[i];
+ // prepare the next place in the list
+ ppPin = &((*ppPin)->pNext);
+ }
+ *ppPin = NULL;
+
+ // set the name of the topmost pin
+ pPin->pName = pPinNames[0];
+ }
+ else
+ {
+ // reorder the variable names to appear the save way as the pins
+ iPin = 0;
+ Mio_GateForEachPin( pGate, pPin )
+ {
+ // find the pin with the name pPin->pName
+ for ( i = 0; i < nPins; i++ )
+ {
+ if ( pPinNames[i] && strcmp( pPinNames[i], pPin->pName ) == 0 )
+ {
+ // free pPinNames[i] because it is already available as pPin->pName
+ // setting pPinNames[i] to NULL is useful to make sure that
+ // this name is not assigned to two pins in the list
+ FREE( pPinNames[i] );
+ pPinNamesCopy[iPin++] = pPin->pName;
+ break;
+ }
+ if ( i == nPins )
+ {
+ printf( "Cannot find pin name \"%s\" in the formula \"%s\" of gate \"%s\".\n",
+ pPin->pName, pGate->pForm, pGate->pName );
+ return 1;
+ }
+ }
+ }
+
+ // check for the remaining names
+ for ( i = 0; i < nPins; i++ )
+ if ( pPinNames[i] )
+ {
+ printf( "Name \"%s\" appears in the formula \"%s\" of gate \"%s\" but there is no such pin.\n",
+ pPinNames[i], pGate->pForm, pGate->pName );
+ return 1;
+ }
+
+ // copy the names back
+ memcpy( pPinNames, pPinNamesCopy, nPins * sizeof(char *) );
+ }
+
+ // expand the manager if necessary
+ if ( dd->size < nPins )
+ {
+ Cudd_Quit( dd );
+ dd = Cudd_Init( nPins + 10, 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
+ Cudd_zddVarsFromBddVars( dd, 2 );
+ }
+
+ // derive the formula as the BDD
+ pGate->bFunc = Parse_FormulaParser( stdout, pGate->pForm, nPins, 0, pPinNames, dd, dd->vars );
+ Cudd_Ref( pGate->bFunc );
+
+ // derive the cover (SOP)
+ pGate->pSop = Abc_ConvertBddToSop( pGate->pLib->pMmFlex, dd, pGate->bFunc, pGate->bFunc, nPins, 0, pGate->pLib->vCube, -1 );
+ return 0;
+}
+
+/**Function*************************************************************
+
+ Synopsis [Collect the pin names in the formula.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Mio_GateCollectNames( char * pFormula, char * pPinNames[] )
+{
+ char Buffer[1000];
+ char * pTemp;
+ int nPins, i;
+
+ // save the formula as it was
+ strcpy( Buffer, pFormula );
+
+ // remove the non-name symbols
+ for ( pTemp = Buffer; *pTemp; pTemp++ )
+ if ( *pTemp == MIO_SYMB_AND || *pTemp == MIO_SYMB_OR || *pTemp == MIO_SYMB_NOT
+ || *pTemp == MIO_SYMB_OPEN || *pTemp == MIO_SYMB_CLOSE || *pTemp == MIO_SYMB_AFTNOT )
+ *pTemp = ' ';
+
+ // save the names
+ nPins = 0;
+ pTemp = strtok( Buffer, " " );
+ while ( pTemp )
+ {
+ for ( i = 0; i < nPins; i++ )
+ if ( strcmp( pTemp, pPinNames[i] ) == 0 )
+ break;
+ if ( i == nPins )
+ { // cannot find this name; save it
+ pPinNames[nPins++] = Extra_UtilStrsav(pTemp);
+ }
+ // get the next name
+ pTemp = strtok( NULL, " " );
+ }
+ return nPins;
+}
+
+////////////////////////////////////////////////////////////////////////
+/// END OF FILE ///
+////////////////////////////////////////////////////////////////////////
+
+
diff --git a/src/map/mio/mioGENERIC.c b/src/map/mio/mioGENERIC.c
new file mode 100644
index 00000000..972c4ffc
--- /dev/null
+++ b/src/map/mio/mioGENERIC.c
@@ -0,0 +1,46 @@
+/**CFile****************************************************************
+
+ FileName [mio___.c]
+
+ PackageName [MVSIS 1.3: Multi-valued logic synthesis system.]
+
+ Synopsis [File reading/writing for technology mapping.]
+
+ Author [MVSIS Group]
+
+ Affiliation [UC Berkeley]
+
+ Date [Ver. 1.0. Started - September 8, 2003.]
+
+ Revision [$Id: mio___.h,v 1.0 2003/09/08 00:00:00 alanmi Exp $]
+
+***********************************************************************/
+
+#include "mioInt.h"
+
+////////////////////////////////////////////////////////////////////////
+/// DECLARATIONS ///
+////////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////////
+/// FUNCTION DEFINITIONS ///
+////////////////////////////////////////////////////////////////////////
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+
+
+////////////////////////////////////////////////////////////////////////
+/// END OF FILE ///
+////////////////////////////////////////////////////////////////////////
+
+
diff --git a/src/map/mio/mioInt.h b/src/map/mio/mioInt.h
new file mode 100644
index 00000000..3f90b625
--- /dev/null
+++ b/src/map/mio/mioInt.h
@@ -0,0 +1,125 @@
+/**CFile****************************************************************
+
+ FileName [mioInt.h]
+
+ PackageName [MVSIS 2.0: Multi-valued logic synthesis system.]
+
+ Synopsis [File reading/writing for technology mapping.]
+
+ Author [MVSIS Group]
+
+ Affiliation [UC Berkeley]
+
+ Date [Ver. 1.0. Started - September 8, 2003.]
+
+ Revision [$Id: mioInt.h,v 1.4 2004/06/28 14:20:25 alanmi Exp $]
+
+***********************************************************************/
+
+#ifndef __MIO_INT_H__
+#define __MIO_INT_H__
+
+////////////////////////////////////////////////////////////////////////
+/// INCLUDES ///
+////////////////////////////////////////////////////////////////////////
+
+#include "abc.h"
+#include "mvc.h"
+#include "main.h"
+#include "mio.h"
+#include "extra.h"
+
+////////////////////////////////////////////////////////////////////////
+/// PARAMETERS ///
+////////////////////////////////////////////////////////////////////////
+
+#define MIO_STRING_GATE "GATE"
+#define MIO_STRING_PIN "PIN"
+#define MIO_STRING_NONINV "NONINV"
+#define MIO_STRING_INV "INV"
+#define MIO_STRING_UNKNOWN "UNKNOWN"
+
+#define MIO_STRING_CONST0 "CONST0"
+#define MIO_STRING_CONST1 "CONST1"
+
+// the bit masks
+#define MIO_MASK(n) ((~((unsigned)0)) >> (32-(n)))
+#define MIO_FULL (~((unsigned)0))
+
+////////////////////////////////////////////////////////////////////////
+/// STRUCTURE DEFINITIONS ///
+////////////////////////////////////////////////////////////////////////
+
+struct Mio_LibraryStruct_t_
+{
+ char * pName; // the name of the library
+ int nGates; // the number of the gates
+ Mio_Gate_t * pGates; // the linked list of all gates in no particular order
+ Mio_Gate_t * pGate0; // the constant zero gate
+ Mio_Gate_t * pGate1; // the constant one gate
+ Mio_Gate_t * pGateBuf; // the buffer
+ Mio_Gate_t * pGateInv; // the inverter
+ Mio_Gate_t * pGateNand2; // the NAND2 gate
+ Mio_Gate_t * pGateAnd2; // the AND2 gate
+ st_table * tName2Gate; // the mapping of gate names into their pointer
+ DdManager * dd; // the nanager storing functions of gates
+ Extra_MmFlex_t * pMmFlex; // the memory manaqer for SOPs
+ Vec_Str_t * vCube; // temporary cube
+};
+
+struct Mio_GateStruct_t_
+{
+ // information derived from the genlib file
+ char * pName; // the name of the gate
+ double dArea; // the area of the gate
+ char * pForm; // the formula describing functionality of the gate
+ Mio_Pin_t * pPins; // the linked list of all pins (one pin if info is the same)
+ char * pOutName; // the name of the output pin
+ // the library to which this gate belongs
+ Mio_Library_t * pLib;
+ // the next gate in the list
+ Mio_Gate_t * pNext;
+
+ // the derived information
+ int nInputs; // the number of inputs
+ double dDelayMax; // the maximum delay
+ DdNode * bFunc; // the functionality
+ char * pSop;
+};
+
+struct Mio_PinStruct_t_
+{
+ char * pName;
+ Mio_PinPhase_t Phase;
+ double dLoadInput;
+ double dLoadMax;
+ double dDelayBlockRise;
+ double dDelayFanoutRise;
+ double dDelayBlockFall;
+ double dDelayFanoutFall;
+ double dDelayBlockMax;
+ Mio_Pin_t * pNext;
+};
+
+
+////////////////////////////////////////////////////////////////////////
+/// GLOBAL VARIABLES ///
+////////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////////
+/// MACRO DEFINITIONS ///
+////////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////////
+/// FUNCTION DEFINITIONS ///
+////////////////////////////////////////////////////////////////////////
+
+/*=== mio.c =============================================================*/
+/*=== mioRead.c =============================================================*/
+/*=== mioUtils.c =============================================================*/
+
+#endif
+
+////////////////////////////////////////////////////////////////////////
+/// END OF FILE ///
+////////////////////////////////////////////////////////////////////////
diff --git a/src/map/mio/mioRead.c b/src/map/mio/mioRead.c
new file mode 100644
index 00000000..13c2cdcd
--- /dev/null
+++ b/src/map/mio/mioRead.c
@@ -0,0 +1,582 @@
+/**CFile****************************************************************
+
+ FileName [mioRead.c]
+
+ PackageName [MVSIS 1.3: Multi-valued logic synthesis system.]
+
+ Synopsis [File reading/writing for technology mapping.]
+
+ Author [MVSIS Group]
+
+ Affiliation [UC Berkeley]
+
+ Date [Ver. 1.0. Started - September 8, 2003.]
+
+ Revision [$Id: mioRead.c,v 1.9 2004/10/19 06:40:16 satrajit Exp $]
+
+***********************************************************************/
+
+#include "mioInt.h"
+
+////////////////////////////////////////////////////////////////////////
+/// DECLARATIONS ///
+////////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////////
+/// FUNCTION DEFINITIONS ///
+////////////////////////////////////////////////////////////////////////
+
+static Mio_Library_t * Mio_LibraryReadOne( Abc_Frame_t * pAbc, char * FileName, bool fExtendedFormat, st_table * tExcludeGate, int fVerbose );
+static int Mio_LibraryReadInternal( Mio_Library_t * pLib, char * pBuffer, bool fExtendedFormat, st_table * tExcludeGate, int fVerbose );
+static Mio_Gate_t * Mio_LibraryReadGate( char ** ppToken, bool fExtendedFormat );
+static Mio_Pin_t * Mio_LibraryReadPin( char ** ppToken, bool fExtendedFormat );
+static char * chomp( char *s );
+static void Mio_LibraryDetectSpecialGates( Mio_Library_t * pLib );
+static void Io_ReadFileRemoveComments( char * pBuffer, int * pnDots, int * pnLines );
+
+#ifdef WIN32
+extern int isspace( int c ); // to silence the warning in VS
+#endif
+
+/**Function*************************************************************
+
+ Synopsis [Read the genlib type of library.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+Mio_Library_t * Mio_LibraryRead( void * pAbc, char * FileName, char * ExcludeFile, int fVerbose )
+{
+ Mio_Library_t * pLib;
+ int num;
+
+ st_table * tExcludeGate = 0;
+
+ if ( ExcludeFile )
+ {
+ tExcludeGate = st_init_table(strcmp, st_strhash);
+ if ( (num = Mio_LibraryReadExclude( pAbc, ExcludeFile, tExcludeGate )) == -1 )
+ {
+ st_free_table( tExcludeGate );
+ tExcludeGate = 0;
+ return 0;
+ }
+
+ fprintf ( Abc_FrameReadOut( pAbc ), "Read %d gates from exclude file\n", num );
+ }
+
+ pLib = Mio_LibraryReadOne( pAbc, FileName, 0, tExcludeGate, fVerbose ); // try normal format first ..
+ if ( pLib == NULL )
+ {
+ pLib = Mio_LibraryReadOne( pAbc, FileName, 1, tExcludeGate, fVerbose ); // .. otherwise try extended format
+ if ( pLib != NULL )
+ printf ( "Warning: Read extended GENLIB format but ignoring extensions\n" );
+ }
+
+ return pLib;
+}
+
+/**Function*************************************************************
+
+ Synopsis [Read the genlib type of library.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+Mio_Library_t * Mio_LibraryReadOne( Abc_Frame_t * pAbc, char * FileName, bool fExtendedFormat, st_table * tExcludeGate, int fVerbose )
+{
+ Mio_Library_t * pLib;
+ char * pBuffer = 0;
+
+ // allocate the genlib structure
+ pLib = ALLOC( Mio_Library_t, 1 );
+ memset( pLib, 0, sizeof(Mio_Library_t) );
+ pLib->pName = Extra_UtilStrsav( FileName );
+ pLib->tName2Gate = st_init_table(strcmp, st_strhash);
+ pLib->pMmFlex = Extra_MmFlexStart();
+ pLib->vCube = Vec_StrAlloc( 100 );
+
+ // read the file and clean comments
+ // pBuffer = Io_ReadFileFileContents( FileName, NULL );
+ // we don't use above function but actually do the same thing explicitly
+ // to handle open_path expansion correctly
+
+ {
+ FILE * pFile;
+ int nFileSize;
+
+ // open the BLIF file for binary reading
+ pFile = Io_FileOpen( FileName, "open_path", "rb", 1 );
+// pFile = fopen( FileName, "rb" );
+ // if we got this far, file should be okay otherwise would
+ // have been detected by caller
+ assert ( pFile != NULL );
+ // get the file size, in bytes
+ fseek( pFile, 0, SEEK_END );
+ nFileSize = ftell( pFile );
+ // move the file current reading position to the beginning
+ rewind( pFile );
+ // load the contents of the file into memory
+ pBuffer = ALLOC( char, nFileSize + 10 );
+ fread( pBuffer, nFileSize, 1, pFile );
+ // terminate the string with '\0'
+ pBuffer[ nFileSize ] = '\0';
+ strcat( pBuffer, "\n.end\n" );
+ // close file
+ fclose( pFile );
+ }
+
+ Io_ReadFileRemoveComments( pBuffer, NULL, NULL );
+
+ // parse the contents of the file
+ if ( Mio_LibraryReadInternal( pLib, pBuffer, fExtendedFormat, tExcludeGate, fVerbose ) )
+ {
+ Mio_LibraryDelete( pLib );
+ free( pBuffer );
+ return NULL;
+ }
+ free( pBuffer );
+
+ // derive the functinality of gates
+ if ( Mio_LibraryParseFormulas( pLib ) )
+ {
+ printf( "Mio_LibraryRead: Had problems parsing formulas.\n" );
+ Mio_LibraryDelete( pLib );
+ return NULL;
+ }
+
+ // detect INV and NAND2
+ Mio_LibraryDetectSpecialGates( pLib );
+//Mio_WriteLibrary( stdout, pLib );
+ return pLib;
+}
+
+/**Function*************************************************************
+
+ Synopsis [Read the genlib type of library.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Mio_LibraryReadInternal( Mio_Library_t * pLib, char * pBuffer, bool fExtendedFormat, st_table * tExcludeGate, int fVerbose )
+{
+ Mio_Gate_t * pGate, ** ppGate;
+ char * pToken;
+ int nGates = 0;
+ int nDel = 0;
+
+ // start the linked list of gates
+ pLib->pGates = NULL;
+ ppGate = &pLib->pGates;
+
+ // read gates one by one
+ pToken = strtok( pBuffer, " \t\r\n" );
+ while ( pToken && strcmp( pToken, MIO_STRING_GATE ) == 0 )
+ {
+ // derive the next gate
+ pGate = Mio_LibraryReadGate( &pToken, fExtendedFormat );
+ if ( pGate == NULL )
+ return 1;
+
+ // set the library
+ pGate->pLib = pLib;
+
+ // printf ("Processing: '%s'\n", pGate->pName);
+
+ if ( tExcludeGate && st_is_member( tExcludeGate, pGate->pName ) )
+ {
+ //printf ("Excluding: '%s'\n", pGate->pName);
+ Mio_GateDelete( pGate );
+ nDel++;
+ }
+ else
+ {
+ // add this gate to the list
+ *ppGate = pGate;
+ ppGate = &pGate->pNext;
+ nGates++;
+
+ // remember this gate by name
+ if ( !st_is_member( pLib->tName2Gate, pGate->pName ) )
+ st_insert( pLib->tName2Gate, pGate->pName, (char *)pGate );
+ else
+ printf( "The gate with name \"%s\" appears more than once.\n", pGate->pName );
+ }
+ }
+ if ( fVerbose )
+ printf( "The number of gates read = %d.\n", nGates );
+
+ // check what is the last word read
+ if ( pToken && strcmp( pToken, ".end" ) != 0 )
+ return 1;
+
+ if ( nDel != 0 )
+ printf( "Actually excluded %d cells\n", nDel );
+
+ return 0;
+}
+
+/**Function*************************************************************
+
+ Synopsis [Read the genlib type of gate.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+Mio_Gate_t * Mio_LibraryReadGate( char ** ppToken, bool fExtendedFormat )
+{
+ Mio_Gate_t * pGate;
+ Mio_Pin_t * pPin, ** ppPin;
+ char * pToken = *ppToken;
+
+ // allocate the gate structure
+ pGate = ALLOC( Mio_Gate_t, 1 );
+ memset( pGate, 0, sizeof(Mio_Gate_t) );
+
+ // read the name
+ pToken = strtok( NULL, " \t\r\n" );
+ pGate->pName = Extra_UtilStrsav( pToken );
+
+ // read the area
+ pToken = strtok( NULL, " \t\r\n" );
+ pGate->dArea = atof( pToken );
+
+ // read the formula
+
+ // first the output name
+ pToken = strtok( NULL, "=" );
+ pGate->pOutName = chomp( pToken );
+
+ // then rest of the expression
+ pToken = strtok( NULL, ";" );
+ pGate->pForm = Extra_UtilStrsav( pToken );
+
+ // read the pin info
+ // start the linked list of pins
+ pGate->pPins = NULL;
+ ppPin = &pGate->pPins;
+
+ // read gates one by one
+ pToken = strtok( NULL, " \t\r\n" );
+ while ( pToken && strcmp( pToken, MIO_STRING_PIN ) == 0 )
+ {
+ // derive the next gate
+ pPin = Mio_LibraryReadPin( &pToken, fExtendedFormat );
+ if ( pPin == NULL )
+ {
+ Mio_GateDelete( pGate );
+ *ppToken = pToken;
+ return NULL;
+ }
+ // add this pin to the list
+ *ppPin = pPin;
+ ppPin = &pPin->pNext;
+ // get the next token
+ pToken = strtok( NULL, " \t\r\n" );
+ }
+
+ *ppToken = pToken;
+ return pGate;
+}
+
+
+
+/**Function*************************************************************
+
+ Synopsis [Read the genlib type of pin.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+Mio_Pin_t * Mio_LibraryReadPin( char ** ppToken, bool fExtendedFormat )
+{
+ Mio_Pin_t * pPin;
+ char * pToken = *ppToken;
+
+ // allocate the gate structure
+ pPin = ALLOC( Mio_Pin_t, 1 );
+ memset( pPin, 0, sizeof(Mio_Pin_t) );
+
+ // read the name
+ pToken = strtok( NULL, " \t\r\n" );
+ pPin->pName = Extra_UtilStrsav( pToken );
+
+ // read the pin phase
+ pToken = strtok( NULL, " \t\r\n" );
+ if ( strcmp( pToken, MIO_STRING_UNKNOWN ) == 0 )
+ pPin->Phase = MIO_PHASE_UNKNOWN;
+ else if ( strcmp( pToken, MIO_STRING_INV ) == 0 )
+ pPin->Phase = MIO_PHASE_INV;
+ else if ( strcmp( pToken, MIO_STRING_NONINV ) == 0 )
+ pPin->Phase = MIO_PHASE_NONINV;
+ else
+ {
+ printf( "Cannot read pin phase specification\n" );
+ Mio_PinDelete( pPin );
+ *ppToken = pToken;
+ return NULL;
+ }
+
+ pToken = strtok( NULL, " \t\r\n" );
+ pPin->dLoadInput = atof( pToken );
+
+ pToken = strtok( NULL, " \t\r\n" );
+ pPin->dLoadMax = atof( pToken );
+
+ pToken = strtok( NULL, " \t\r\n" );
+ pPin->dDelayBlockRise = atof( pToken );
+
+ pToken = strtok( NULL, " \t\r\n" );
+ pPin->dDelayFanoutRise = atof( pToken );
+
+ pToken = strtok( NULL, " \t\r\n" );
+ pPin->dDelayBlockFall = atof( pToken );
+
+ pToken = strtok( NULL, " \t\r\n" );
+ pPin->dDelayFanoutFall = atof( pToken );
+
+ if ( fExtendedFormat )
+ {
+ /* In extended format, the field after dDelayFanoutRise
+ * is to be ignored
+ **/
+
+ pPin->dDelayBlockFall = pPin->dDelayFanoutFall;
+
+ pToken = strtok( NULL, " \t" );
+ pPin->dDelayFanoutFall = atof( pToken );
+
+ /* last field is ignored */
+ pToken = strtok( NULL, " \t\r\n" );
+ }
+
+ if ( pPin->dDelayBlockRise > pPin->dDelayBlockFall )
+ pPin->dDelayBlockMax = pPin->dDelayBlockRise;
+ else
+ pPin->dDelayBlockMax = pPin->dDelayBlockFall;
+
+ *ppToken = pToken;
+ return pPin;
+}
+
+
+/**Function*************************************************************
+
+ Synopsis [Duplicates string and returns it with leading and
+ trailing spaces removed.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+char *chomp( char *s )
+{
+ char *b = ALLOC(char, strlen(s)+1), *c = b;
+ while (*s && isspace(*s))
+ ++s;
+ while (*s && !isspace(*s))
+ *c++ = *s++;
+ *c = 0;
+ return b;
+}
+
+/**Function*************************************************************
+
+ Synopsis [Duplicates string and returns it with leading and
+ trailing spaces removed.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Mio_LibraryDetectSpecialGates( Mio_Library_t * pLib )
+{
+ Mio_Gate_t * pGate;
+ DdNode * bFuncBuf, * bFuncInv, * bFuncNand2, * bFuncAnd2;
+
+ bFuncBuf = pLib->dd->vars[0]; Cudd_Ref( bFuncBuf );
+ bFuncInv = Cudd_Not( pLib->dd->vars[0] ); Cudd_Ref( bFuncInv );
+ bFuncNand2 = Cudd_bddNand( pLib->dd, pLib->dd->vars[0], pLib->dd->vars[1] ); Cudd_Ref( bFuncNand2 );
+ bFuncAnd2 = Cudd_bddAnd( pLib->dd, pLib->dd->vars[0], pLib->dd->vars[1] ); Cudd_Ref( bFuncAnd2 );
+
+ // get buffer
+ Mio_LibraryForEachGate( pLib, pGate )
+ if ( pLib->pGateBuf == NULL && pGate->bFunc == bFuncBuf )
+ {
+ pLib->pGateBuf = pGate;
+ break;
+ }
+ 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
+ Mio_LibraryForEachGate( pLib, pGate )
+ if ( pLib->pGateInv == NULL && pGate->bFunc == bFuncInv )
+ {
+ pLib->pGateInv = pGate;
+ break;
+ }
+ 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
+ Mio_LibraryForEachGate( pLib, pGate )
+ if ( pLib->pGateNand2 == NULL && pGate->bFunc == bFuncNand2 )
+ {
+ pLib->pGateNand2 = pGate;
+ break;
+ }
+ Mio_LibraryForEachGate( pLib, pGate )
+ if ( pLib->pGateAnd2 == NULL && pGate->bFunc == bFuncAnd2 )
+ {
+ pLib->pGateAnd2 = pGate;
+ break;
+ }
+ if ( pLib->pGateAnd2 == NULL && pLib->pGateNand2 == NULL )
+ {
+ printf( "Warnings: GENLIB library reader cannot detect the AND2 or NAND2 gate.\n" );
+ printf( "Some parts of the supergate-based technology mapper may not work correctly.\n" );
+ }
+
+ Cudd_RecursiveDeref( pLib->dd, bFuncInv );
+ Cudd_RecursiveDeref( pLib->dd, bFuncNand2 );
+ Cudd_RecursiveDeref( pLib->dd, bFuncAnd2 );
+}
+
+/**Function*************************************************************
+
+ Synopsis [populate hash table of gates to be exlcuded from genlib]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Mio_LibraryReadExclude( void * pAbc, char * ExcludeFile, st_table * tExcludeGate )
+{
+ int nDel = 0;
+ FILE *pEx;
+ char buffer[128];
+
+ assert ( tExcludeGate );
+
+ if ( ExcludeFile )
+ {
+ pEx = fopen( ExcludeFile, "r" );
+
+ if ( pEx == NULL )
+ {
+ fprintf ( Abc_FrameReadErr( pAbc ), "Error: Could not open exclude file %s. Stop.\n", ExcludeFile );
+ return -1;
+ }
+
+ while (1 == fscanf( pEx, "%127s", buffer ))
+ {
+ //printf ("Read: '%s'\n", buffer );
+ st_insert( tExcludeGate, Extra_UtilStrsav( buffer ), (char *)0 );
+ nDel++;
+ }
+
+ fclose( pEx );
+ }
+
+ return nDel;
+}
+
+/**Function*************************************************************
+
+ Synopsis [Eliminates comments from the input file.]
+
+ Description [As a byproduct, this procedure also counts the number
+ lines and dot-statements in the input file. This also joins non-comment
+ lines that are joined with a backspace '\']
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Io_ReadFileRemoveComments( char * pBuffer, int * pnDots, int * pnLines )
+{
+ char * pCur;
+ int nDots, nLines;
+ // scan through the buffer and eliminate comments
+ // (in the BLIF file, comments are lines starting with "#")
+ nDots = nLines = 0;
+ for ( pCur = pBuffer; *pCur; pCur++ )
+ {
+ // if this is the beginning of comment
+ // clean it with spaces until the new line statement
+ if ( *pCur == '#' )
+ while ( *pCur != '\n' )
+ *pCur++ = ' ';
+
+ // count the number of new lines and dots
+ if ( *pCur == '\n' ) {
+ if (*(pCur-1)=='\r') {
+ // DOS(R) file support
+ if (*(pCur-2)!='\\') nLines++;
+ else {
+ // rewind to backslash and overwrite with a space
+ *(pCur-2) = ' ';
+ *(pCur-1) = ' ';
+ *pCur = ' ';
+ }
+ } else {
+ // UNIX(TM) file support
+ if (*(pCur-1)!='\\') nLines++;
+ else {
+ // rewind to backslash and overwrite with a space
+ *(pCur-1) = ' ';
+ *pCur = ' ';
+ }
+ }
+ }
+ else if ( *pCur == '.' )
+ nDots++;
+ }
+ if ( pnDots )
+ *pnDots = nDots;
+ if ( pnLines )
+ *pnLines = nLines;
+}
+
+////////////////////////////////////////////////////////////////////////
+/// END OF FILE ///
+////////////////////////////////////////////////////////////////////////
+
+
diff --git a/src/map/mio/mioUtils.c b/src/map/mio/mioUtils.c
new file mode 100644
index 00000000..bd3d01f7
--- /dev/null
+++ b/src/map/mio/mioUtils.c
@@ -0,0 +1,531 @@
+/**CFile****************************************************************
+
+ FileName [mioUtils.c]
+
+ PackageName [MVSIS 1.3: Multi-valued logic synthesis system.]
+
+ Synopsis [File reading/writing for technology mapping.]
+
+ Author [MVSIS Group]
+
+ Affiliation [UC Berkeley]
+
+ Date [Ver. 1.0. Started - September 8, 2003.]
+
+ Revision [$Id: mioUtils.c,v 1.6 2004/09/03 18:02:20 satrajit Exp $]
+
+***********************************************************************/
+
+#include "mioInt.h"
+
+////////////////////////////////////////////////////////////////////////
+/// DECLARATIONS ///
+////////////////////////////////////////////////////////////////////////
+
+static void Mio_WriteGate( FILE * pFile, Mio_Gate_t * pGate, int fPrintSops );
+static void Mio_WritePin( FILE * pFile, Mio_Pin_t * pPin );
+static int Mio_DelayCompare( Mio_Gate_t ** ppG1, Mio_Gate_t ** ppG2 );
+static void Mio_DeriveTruthTable_rec( DdNode * bFunc, unsigned uTruthsIn[][2], unsigned uTruthRes[] );
+
+////////////////////////////////////////////////////////////////////////
+/// FUNCTION DEFINITIONS ///
+////////////////////////////////////////////////////////////////////////
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Mio_LibraryDelete( Mio_Library_t * pLib )
+{
+ Mio_Gate_t * pGate, * pGate2;
+ if ( pLib == NULL )
+ return;
+ // free the bindings of nodes to gates from this library for all networks
+ Abc_FrameUnmapAllNetworks( Abc_FrameGetGlobalFrame() );
+ // free the library
+ FREE( pLib->pName );
+ Mio_LibraryForEachGateSafe( pLib, pGate, pGate2 )
+ Mio_GateDelete( pGate );
+ Extra_MmFlexStop( pLib->pMmFlex );
+ Vec_StrFree( pLib->vCube );
+ if ( pLib->tName2Gate )
+ st_free_table( pLib->tName2Gate );
+ if ( pLib->dd )
+ Cudd_Quit( pLib->dd );
+ free( pLib );
+}
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Mio_GateDelete( Mio_Gate_t * pGate )
+{
+ Mio_Pin_t * pPin, * pPin2;
+ FREE( pGate->pOutName );
+ FREE( pGate->pName );
+ FREE( pGate->pForm );
+ if ( pGate->bFunc )
+ Cudd_RecursiveDeref( pGate->pLib->dd, pGate->bFunc );
+ Mio_GateForEachPinSafe( pGate, pPin, pPin2 )
+ Mio_PinDelete( pPin );
+ free( pGate );
+}
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Mio_PinDelete( Mio_Pin_t * pPin )
+{
+ FREE( pPin->pName );
+ free( pPin );
+}
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+Mio_Pin_t * Mio_PinDup( Mio_Pin_t * pPin )
+{
+ Mio_Pin_t * pPinNew;
+
+ pPinNew = ALLOC( Mio_Pin_t, 1 );
+ *pPinNew = *pPin;
+ pPinNew->pName = (pPinNew->pName ? Extra_UtilStrsav(pPinNew->pName) : NULL);
+ pPinNew->pNext = NULL;
+
+ return pPinNew;
+}
+
+
+
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Mio_WriteLibrary( FILE * pFile, Mio_Library_t * pLib, int fPrintSops )
+{
+ Mio_Gate_t * pGate;
+
+ fprintf( pFile, "# The genlib library \"%s\".\n", pLib->pName );
+ Mio_LibraryForEachGate( pLib, pGate )
+ Mio_WriteGate( pFile, pGate, fPrintSops );
+}
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Mio_WriteGate( FILE * pFile, Mio_Gate_t * pGate, int fPrintSops )
+{
+ Mio_Pin_t * pPin;
+
+ fprintf( pFile, "GATE " );
+ fprintf( pFile, "%12s ", pGate->pName );
+ fprintf( pFile, "%10.2f ", pGate->dArea );
+ fprintf( pFile, "%s=%s;\n", pGate->pOutName, pGate->pForm );
+ // print the pins
+ if ( fPrintSops )
+ fprintf( pFile, "%s", pGate->pSop? pGate->pSop : "unspecified\n" );
+// Extra_bddPrint( pGate->pLib->dd, pGate->bFunc );
+// fprintf( pFile, "\n" );
+ Mio_GateForEachPin( pGate, pPin )
+ Mio_WritePin( pFile, pPin );
+}
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Mio_WritePin( FILE * pFile, Mio_Pin_t * pPin )
+{
+ char * pPhaseNames[10] = { "UNKNOWN", "INV", "NONINV" };
+ fprintf( pFile, " PIN " );
+ fprintf( pFile, "%9s ", pPin->pName );
+ fprintf( pFile, "%10s ", pPhaseNames[pPin->Phase] );
+ fprintf( pFile, "%6d ", (int)pPin->dLoadInput );
+ fprintf( pFile, "%6d ", (int)pPin->dLoadMax );
+ fprintf( pFile, "%6.2f ", pPin->dDelayBlockRise );
+ fprintf( pFile, "%6.2f ", pPin->dDelayFanoutRise );
+ fprintf( pFile, "%6.2f ", pPin->dDelayBlockFall );
+ fprintf( pFile, "%6.2f", pPin->dDelayFanoutFall );
+ fprintf( pFile, "\n" );
+}
+
+/**Function*************************************************************
+
+ Synopsis [Collects the set of root gates.]
+
+ Description [Only collects the gates with unique functionality,
+ which have fewer inputs and shorter delay than the given limits.]
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+Mio_Gate_t ** Mio_CollectRoots( Mio_Library_t * pLib, int nInputs, float tDelay, bool fSkipInv, int * pnGates )
+{
+ Mio_Gate_t * pGate;
+ Mio_Gate_t ** ppGates;
+ /* st_table * tFuncs; */
+ /* st_generator * gen; */
+ DdNode * bFunc;
+ DdManager * dd;
+ int nGates, iGate;
+
+ dd = Mio_LibraryReadDd( pLib );
+ nGates = Mio_LibraryReadGateNum( pLib );
+
+ /*
+
+ // for each functionality select one gate; skip constants and buffers
+ tFuncs = st_init_table( st_ptrcmp, st_ptrhash );
+ Mio_LibraryForEachGate( pLib, pGate )
+ {
+ bFunc = Mio_GateReadFunc(pGate);
+ if ( pGate->nInputs > nInputs )
+ continue;
+ if ( pGate->dDelayMax > (double)tDelay )
+ continue;
+ if ( bFunc == b0 || bFunc == b1 )
+ continue;
+ if ( bFunc == dd->vars[0] )
+ continue;
+ if ( bFunc == Cudd_Not(dd->vars[0]) && fSkipInv )
+ continue;
+ if ( st_is_member( tFuncs, (char *)bFunc ) )
+ continue;
+ st_insert( tFuncs, (char *)bFunc, (char *)pGate );
+ }
+
+ // collect the gates into the array
+ ppGates = ALLOC( Mio_Gate_t *, nGates );
+ iGate = 0;
+ st_foreach_item( tFuncs, gen, (char **)&bFunc, (char **)&pGate )
+ ppGates[ iGate++ ] = pGate;
+ assert( iGate <= nGates );
+ st_free_table( tFuncs );
+
+ */
+
+ ppGates = ALLOC( Mio_Gate_t *, nGates );
+ iGate = 0;
+ Mio_LibraryForEachGate( pLib, pGate )
+ {
+ bFunc = Mio_GateReadFunc(pGate);
+ if ( pGate->nInputs > nInputs )
+ continue;
+ if ( pGate->dDelayMax > (double)tDelay )
+ continue;
+ if ( bFunc == b0 || bFunc == b1 )
+ continue;
+ if ( bFunc == dd->vars[0] )
+ continue;
+ if ( bFunc == Cudd_Not(dd->vars[0]) && fSkipInv )
+ continue;
+
+ assert( iGate < nGates );
+ ppGates[ iGate++ ] = pGate;
+ }
+
+ if ( iGate > 0 )
+ {
+ // sort the gates by delay
+ qsort( (void *)ppGates, iGate, sizeof(Mio_Gate_t *),
+ (int (*)(const void *, const void *)) Mio_DelayCompare );
+ assert( Mio_DelayCompare( ppGates, ppGates + iGate - 1 ) <= 0 );
+ }
+
+ if ( pnGates )
+ *pnGates = iGate;
+ return ppGates;
+}
+
+/**Function*************************************************************
+
+ Synopsis [Compares the max delay of two gates.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Mio_DelayCompare( Mio_Gate_t ** ppG1, Mio_Gate_t ** ppG2 )
+{
+ if ( (*ppG1)->dDelayMax < (*ppG2)->dDelayMax )
+ return -1;
+ if ( (*ppG1)->dDelayMax > (*ppG2)->dDelayMax )
+ return 1;
+ return 0;
+}
+
+/**Function*************************************************************
+
+ Synopsis [Derives the truth table of the gate.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Mio_DeriveTruthTable( Mio_Gate_t * pGate, unsigned uTruthsIn[][2], int nSigns, int nInputs, unsigned uTruthRes[] )
+{
+ Mio_DeriveTruthTable_rec( pGate->bFunc, uTruthsIn, uTruthRes );
+}
+
+/**Function*************************************************************
+
+ Synopsis [Recursively derives the truth table of the gate.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Mio_DeriveTruthTable_rec( DdNode * bFunc, unsigned uTruthsIn[][2], unsigned uTruthRes[] )
+{
+ unsigned uTruthsCof0[2];
+ unsigned uTruthsCof1[2];
+
+ // complement the resulting truth table, if the function is complemented
+ if ( Cudd_IsComplement(bFunc) )
+ {
+ Mio_DeriveTruthTable_rec( Cudd_Not(bFunc), uTruthsIn, uTruthRes );
+ uTruthRes[0] = ~uTruthRes[0];
+ uTruthRes[1] = ~uTruthRes[1];
+ return;
+ }
+
+ // if the function is constant 1, return the constant 1 truth table
+ if ( bFunc->index == CUDD_CONST_INDEX )
+ {
+ uTruthRes[0] = MIO_FULL;
+ uTruthRes[1] = MIO_FULL;
+ return;
+ }
+
+ // solve the problem for both cofactors
+ Mio_DeriveTruthTable_rec( cuddE(bFunc), uTruthsIn, uTruthsCof0 );
+ Mio_DeriveTruthTable_rec( cuddT(bFunc), uTruthsIn, uTruthsCof1 );
+
+ // derive the resulting truth table using the input truth tables
+ uTruthRes[0] = (uTruthsCof0[0] & ~uTruthsIn[bFunc->index][0]) |
+ (uTruthsCof1[0] & uTruthsIn[bFunc->index][0]);
+ uTruthRes[1] = (uTruthsCof0[1] & ~uTruthsIn[bFunc->index][1]) |
+ (uTruthsCof1[1] & uTruthsIn[bFunc->index][1]);
+}
+
+/**Function*************************************************************
+
+ Synopsis [Derives the truth table of the root of the gate.]
+
+ Description [Given the truth tables of the leaves of the gate,
+ this procedure derives the truth table of the root.]
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Mio_DeriveTruthTable2( Mio_Gate_t * pGate, unsigned uTruthsIn[][2], int nTruths, int nInputs, unsigned uTruthRes[] )
+{
+ unsigned uSignCube[2];
+ int i, nFanins;
+ char * pCube;
+
+ // make sure that the number of input truth tables in equal to the number of gate inputs
+ assert( pGate->nInputs == nTruths );
+ assert( nInputs < 7 );
+
+ nFanins = Abc_SopGetVarNum( pGate->pSop );
+ assert( nFanins == nInputs );
+
+ // clean the resulting truth table
+ uTruthRes[0] = 0;
+ uTruthRes[1] = 0;
+ if ( nInputs < 6 )
+ {
+// for ( c = 0; *(pCube = pGate->pSop + c * (nFanins + 3)); c++ )
+ Abc_SopForEachCube( pGate->pSop, nFanins, pCube )
+ {
+ // add the clause
+ uSignCube[0] = MIO_FULL;
+ for ( i = 0; i < nFanins; i++ )
+ {
+ if ( pCube[i] == '0' )
+ uSignCube[0] &= ~uTruthsIn[i][0];
+ else if ( pCube[i] == '1' )
+ uSignCube[0] &= uTruthsIn[i][0];
+ }
+ }
+ if ( nInputs < 5 )
+ uTruthRes[0] &= MIO_MASK(1<<nInputs);
+ }
+ else
+ {
+ // consider the case when two unsigneds should be used
+// for ( c = 0; *(pCube = pGate->pSop + c * (nFanins + 3)); c++ )
+ Abc_SopForEachCube( pGate->pSop, nFanins, pCube )
+ {
+ uSignCube[0] = MIO_FULL;
+ uSignCube[1] = MIO_FULL;
+ for ( i = 0; i < nFanins; i++ )
+ {
+ if ( pCube[i] == '0' )
+ {
+ uSignCube[0] &= ~uTruthsIn[i][0];
+ uSignCube[1] &= ~uTruthsIn[i][1];
+ }
+ else if ( pCube[i] == '1' )
+ {
+ uSignCube[0] &= uTruthsIn[i][0];
+ uSignCube[1] &= uTruthsIn[i][1];
+ }
+ }
+ uTruthRes[0] |= uSignCube[0];
+ uTruthRes[1] |= uSignCube[1];
+ }
+ }
+}
+
+/**Function*************************************************************
+
+ Synopsis [Derives the area and delay of the root of the gate.]
+
+ Description [Array of the resulting delays should be initialized
+ to the (negative) SUPER_NO_VAR value.]
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Mio_DeriveGateDelays( Mio_Gate_t * pGate,
+ float ** ptPinDelays, int nPins, int nInputs, float tDelayZero,
+ float * ptDelaysRes, float * ptPinDelayMax )
+{
+ Mio_Pin_t * pPin;
+ float Delay, DelayMax;
+ int i, k;
+ assert( pGate->nInputs == nPins );
+ // set all the delays to the unused delay
+ for ( i = 0; i < nInputs; i++ )
+ ptDelaysRes[i] = tDelayZero;
+ // compute the delays for each input and the max delay at the same time
+ DelayMax = 0;
+ for ( i = 0; i < nInputs; i++ )
+ {
+ for ( k = 0, pPin = pGate->pPins; pPin; pPin = pPin->pNext, k++ )
+ {
+ if ( ptPinDelays[k][i] < 0 )
+ continue;
+ Delay = ptPinDelays[k][i] + (float)pPin->dDelayBlockMax;
+ if ( ptDelaysRes[i] < Delay )
+ ptDelaysRes[i] = Delay;
+ }
+ if ( k != nPins )
+ {
+ printf ("DEBUG: problem gate is %s\n", Mio_GateReadName( pGate ));
+ }
+ assert( k == nPins );
+ if ( DelayMax < ptDelaysRes[i] )
+ DelayMax = ptDelaysRes[i];
+ }
+ *ptPinDelayMax = DelayMax;
+}
+
+
+/**Function*************************************************************
+
+ Synopsis [Creates a pseudo-gate.]
+
+ Description [The pseudo-gate is a N-input gate with all info set to 0.]
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+Mio_Gate_t * Mio_GateCreatePseudo( int nInputs )
+{
+ Mio_Gate_t * pGate;
+ Mio_Pin_t * pPin;
+ int i;
+ // allocate the gate structure
+ pGate = ALLOC( Mio_Gate_t, 1 );
+ memset( pGate, 0, sizeof(Mio_Gate_t) );
+ pGate->nInputs = nInputs;
+ // create pins
+ for ( i = 0; i < nInputs; i++ )
+ {
+ pPin = ALLOC( Mio_Pin_t, 1 );
+ memset( pPin, 0, sizeof(Mio_Pin_t) );
+ pPin->pNext = pGate->pPins;
+ pGate->pPins = pPin;
+ }
+ return pGate;
+}
+
+////////////////////////////////////////////////////////////////////////
+/// END OF FILE ///
+////////////////////////////////////////////////////////////////////////
+
+
diff --git a/src/map/mio/module.make b/src/map/mio/module.make
new file mode 100644
index 00000000..26a4561c
--- /dev/null
+++ b/src/map/mio/module.make
@@ -0,0 +1,5 @@
+SRC += src/map/mio/mio.c \
+ src/map/mio/mioApi.c \
+ src/map/mio/mioFunc.c \
+ src/map/mio/mioRead.c \
+ src/map/mio/mioUtils.c