2016-06-07 23:32:38 +02:00
|
|
|
/**CFile****************************************************************
|
|
|
|
|
|
|
|
|
|
FileName [abcDetect.c]
|
|
|
|
|
|
|
|
|
|
SystemName [ABC: Logic synthesis and verification system.]
|
|
|
|
|
|
|
|
|
|
PackageName [Network and node package.]
|
|
|
|
|
|
|
|
|
|
Synopsis [Detect conditions.]
|
|
|
|
|
|
2016-06-15 00:37:59 +02:00
|
|
|
Author [Alan Mishchenko, Dao Ai Quoc]
|
2016-06-07 23:32:38 +02:00
|
|
|
|
|
|
|
|
Affiliation [UC Berkeley]
|
|
|
|
|
|
|
|
|
|
Date [Ver. 1.0. Started - June 7, 2016.]
|
|
|
|
|
|
|
|
|
|
Revision [$Id: abcDetect.c,v 1.00 2016/06/07 00:00:00 alanmi Exp $]
|
|
|
|
|
|
|
|
|
|
***********************************************************************/
|
|
|
|
|
|
|
|
|
|
#include "base/abc/abc.h"
|
|
|
|
|
#include "misc/vec/vecHsh.h"
|
2016-06-13 04:07:46 +02:00
|
|
|
#include "misc/util/utilNam.h"
|
2016-06-15 00:37:59 +02:00
|
|
|
#include "sat/cnf/cnf.h"
|
|
|
|
|
#include "sat/bsat/satStore.h"
|
2016-06-07 23:32:38 +02:00
|
|
|
|
|
|
|
|
ABC_NAMESPACE_IMPL_START
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
/// DECLARATIONS ///
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
2016-06-13 04:07:46 +02:00
|
|
|
typedef enum {
|
|
|
|
|
ABC_FIN_NONE = 0, // 0: unknown
|
|
|
|
|
ABC_FIN_SA0, // 1:
|
|
|
|
|
ABC_FIN_SA1, // 2:
|
|
|
|
|
ABC_FIN_NEG, // 3:
|
|
|
|
|
ABC_FIN_RDOB_AND, // 4:
|
|
|
|
|
ABC_FIN_RDOB_NAND, // 5:
|
|
|
|
|
ABC_FIN_RDOB_OR, // 6:
|
|
|
|
|
ABC_FIN_RDOB_NOR, // 7:
|
|
|
|
|
ABC_FIN_RDOB_XOR, // 8:
|
|
|
|
|
ABC_FIN_RDOB_NXOR, // 9:
|
|
|
|
|
ABC_FIN_RDOB_NOT, // 10:
|
|
|
|
|
ABC_FIN_RDOB_BUFF, // 11:
|
|
|
|
|
ABC_FIN_RDOB_LAST // 12:
|
|
|
|
|
} Abc_FinType_t;
|
|
|
|
|
|
2016-06-07 23:32:38 +02:00
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
/// FUNCTION DEFINITIONS ///
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
2016-06-13 04:07:46 +02:00
|
|
|
/**Function*************************************************************
|
|
|
|
|
|
|
|
|
|
Synopsis [Recognize type.]
|
|
|
|
|
|
|
|
|
|
Description []
|
|
|
|
|
|
|
|
|
|
SideEffects []
|
|
|
|
|
|
|
|
|
|
SeeAlso []
|
|
|
|
|
|
|
|
|
|
***********************************************************************/
|
|
|
|
|
int Io_ReadFinType( char * pThis )
|
|
|
|
|
{
|
|
|
|
|
if ( !strcmp(pThis, "SA0") ) return ABC_FIN_SA0;
|
|
|
|
|
if ( !strcmp(pThis, "SA1") ) return ABC_FIN_SA1;
|
|
|
|
|
if ( !strcmp(pThis, "NEG") ) return ABC_FIN_NEG;
|
|
|
|
|
if ( !strcmp(pThis, "RDOB_AND") ) return ABC_FIN_RDOB_AND;
|
|
|
|
|
if ( !strcmp(pThis, "RDOB_NAND") ) return ABC_FIN_RDOB_NAND;
|
|
|
|
|
if ( !strcmp(pThis, "RDOB_OR") ) return ABC_FIN_RDOB_OR;
|
|
|
|
|
if ( !strcmp(pThis, "RDOB_NOR") ) return ABC_FIN_RDOB_NOR;
|
|
|
|
|
if ( !strcmp(pThis, "RDOB_XOR") ) return ABC_FIN_RDOB_XOR;
|
|
|
|
|
if ( !strcmp(pThis, "RDOB_NXOR") ) return ABC_FIN_RDOB_NXOR;
|
|
|
|
|
if ( !strcmp(pThis, "RDOB_NOT") ) return ABC_FIN_RDOB_NOT;
|
|
|
|
|
if ( !strcmp(pThis, "RDOB_BUFF") ) return ABC_FIN_RDOB_BUFF;
|
|
|
|
|
return ABC_FIN_NONE;
|
|
|
|
|
}
|
|
|
|
|
char * Io_WriteFinType( int Type )
|
|
|
|
|
{
|
|
|
|
|
if ( Type == ABC_FIN_SA0 ) return "SA0";
|
|
|
|
|
if ( Type == ABC_FIN_SA1 ) return "SA1";
|
|
|
|
|
if ( Type == ABC_FIN_NEG ) return "NEG";
|
|
|
|
|
if ( Type == ABC_FIN_RDOB_AND ) return "RDOB_AND" ;
|
|
|
|
|
if ( Type == ABC_FIN_RDOB_NAND ) return "RDOB_NAND";
|
|
|
|
|
if ( Type == ABC_FIN_RDOB_OR ) return "RDOB_OR" ;
|
|
|
|
|
if ( Type == ABC_FIN_RDOB_NOR ) return "RDOB_NOR" ;
|
|
|
|
|
if ( Type == ABC_FIN_RDOB_XOR ) return "RDOB_XOR" ;
|
|
|
|
|
if ( Type == ABC_FIN_RDOB_NXOR ) return "RDOB_NXOR";
|
|
|
|
|
if ( Type == ABC_FIN_RDOB_NOT ) return "RDOB_NOT" ;
|
|
|
|
|
if ( Type == ABC_FIN_RDOB_BUFF ) return "RDOB_BUFF";
|
|
|
|
|
return "Unknown";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**Function*************************************************************
|
|
|
|
|
|
|
|
|
|
Synopsis [Read information from file.]
|
|
|
|
|
|
|
|
|
|
Description [Returns information as a set of pairs: (ObjId, TypeId).
|
|
|
|
|
Uses the current network to map ObjName given in the file into ObjId.]
|
|
|
|
|
|
|
|
|
|
SideEffects []
|
|
|
|
|
|
|
|
|
|
SeeAlso []
|
|
|
|
|
|
|
|
|
|
***********************************************************************/
|
|
|
|
|
Vec_Int_t * Io_ReadFins( Abc_Ntk_t * pNtk, char * pFileName, int fVerbose )
|
|
|
|
|
{
|
|
|
|
|
char Buffer[1000];
|
|
|
|
|
Abc_Obj_t * pObj;
|
|
|
|
|
Abc_Nam_t * pNam;
|
|
|
|
|
Vec_Int_t * vMap;
|
|
|
|
|
Vec_Int_t * vPairs = NULL;
|
|
|
|
|
int i, Type, iObj, fFound, nLines = 1;
|
|
|
|
|
FILE * pFile = fopen( pFileName, "r" );
|
|
|
|
|
if ( pFile == NULL )
|
|
|
|
|
{
|
|
|
|
|
printf( "Cannot open input file \"%s\" for reading.\n", pFileName );
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
// map CI/node names into their IDs
|
|
|
|
|
pNam = Abc_NamStart( 1000, 10 );
|
|
|
|
|
vMap = Vec_IntAlloc( 1000 );
|
|
|
|
|
Vec_IntPush( vMap, -1 );
|
|
|
|
|
Abc_NtkForEachObj( pNtk, pObj, i )
|
|
|
|
|
{
|
|
|
|
|
if ( !Abc_ObjIsCi(pObj) && !Abc_ObjIsNode(pObj) )
|
|
|
|
|
continue;
|
|
|
|
|
Abc_NamStrFindOrAdd( pNam, Abc_ObjName(pObj), &fFound );
|
|
|
|
|
if ( fFound )
|
|
|
|
|
{
|
|
|
|
|
printf( "The same name \"%s\" appears twice among CIs and internal nodes.\n", Abc_ObjName(pObj) );
|
|
|
|
|
goto finish;
|
|
|
|
|
}
|
|
|
|
|
Vec_IntPush( vMap, Abc_ObjId(pObj) );
|
|
|
|
|
}
|
|
|
|
|
assert( Vec_IntSize(vMap) == Abc_NamObjNumMax(pNam) );
|
|
|
|
|
// read file lines
|
|
|
|
|
vPairs = Vec_IntAlloc( 1000 );
|
2016-06-15 00:37:59 +02:00
|
|
|
Vec_IntPushTwo( vPairs, -1, -1 );
|
2016-06-13 04:07:46 +02:00
|
|
|
while ( fgets(Buffer, 1000, pFile) != NULL )
|
|
|
|
|
{
|
|
|
|
|
// read line number
|
|
|
|
|
char * pToken = strtok( Buffer, " \n\r\t" );
|
|
|
|
|
if ( nLines++ != atoi(pToken) )
|
|
|
|
|
{
|
|
|
|
|
printf( "Line numbers are not consecutive. Quitting.\n" );
|
|
|
|
|
Vec_IntFreeP( &vPairs );
|
|
|
|
|
goto finish;
|
|
|
|
|
}
|
|
|
|
|
// read object name and find its ID
|
|
|
|
|
pToken = strtok( NULL, " \n\r\t" );
|
|
|
|
|
iObj = Abc_NamStrFind( pNam, pToken );
|
|
|
|
|
if ( !iObj )
|
|
|
|
|
{
|
|
|
|
|
printf( "Cannot find object with name \"%s\".\n", pToken );
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
// read type
|
|
|
|
|
pToken = strtok( NULL, " \n\r\t" );
|
|
|
|
|
Type = Io_ReadFinType( pToken );
|
|
|
|
|
if ( Type == ABC_FIN_NONE )
|
|
|
|
|
{
|
2016-06-15 00:37:59 +02:00
|
|
|
printf( "Cannot read type \"%s\" of object \"%s\".\n", pToken, Abc_ObjName(Abc_NtkObj(pNtk, iObj)) );
|
2016-06-13 04:07:46 +02:00
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
Vec_IntPushTwo( vPairs, Vec_IntEntry(vMap, iObj), Type );
|
|
|
|
|
}
|
2016-06-15 00:37:59 +02:00
|
|
|
assert( Vec_IntSize(vPairs) == 2 * nLines );
|
2016-06-13 04:07:46 +02:00
|
|
|
printf( "Finished reading %d lines.\n", nLines - 1 );
|
|
|
|
|
|
|
|
|
|
// verify the reader by printing the results
|
|
|
|
|
if ( fVerbose )
|
2016-06-15 00:37:59 +02:00
|
|
|
Vec_IntForEachEntryDoubleStart( vPairs, iObj, Type, i, 2 )
|
|
|
|
|
printf( "%-10d%-10s%-10s\n", i/2, Abc_ObjName(Abc_NtkObj(pNtk, iObj)), Io_WriteFinType(Type) );
|
2016-06-13 04:07:46 +02:00
|
|
|
|
|
|
|
|
finish:
|
|
|
|
|
Vec_IntFree( vMap );
|
|
|
|
|
Abc_NamDeref( pNam );
|
|
|
|
|
fclose( pFile );
|
|
|
|
|
return vPairs;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2016-06-07 23:32:38 +02:00
|
|
|
/**Function*************************************************************
|
|
|
|
|
|
2016-06-15 00:37:59 +02:00
|
|
|
Synopsis [Top-level procedure.]
|
2016-06-13 04:07:46 +02:00
|
|
|
|
|
|
|
|
Description []
|
|
|
|
|
|
|
|
|
|
SideEffects []
|
|
|
|
|
|
|
|
|
|
SeeAlso []
|
|
|
|
|
|
|
|
|
|
***********************************************************************/
|
2016-06-15 00:37:59 +02:00
|
|
|
void Abc_NtkDetectClassesTest( Abc_Ntk_t * pNtk, int fVerbose )
|
2016-06-13 04:07:46 +02:00
|
|
|
{
|
2016-06-15 00:37:59 +02:00
|
|
|
printf( "This procedure is currently not used.\n" );
|
2016-06-13 04:07:46 +02:00
|
|
|
}
|
|
|
|
|
|
2016-06-15 00:37:59 +02:00
|
|
|
|
2016-06-07 23:32:38 +02:00
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
/// END OF FILE ///
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ABC_NAMESPACE_IMPL_END
|
|
|
|
|
|