182 lines
5.9 KiB
C
182 lines
5.9 KiB
C
|
/**CFile****************************************************************
|
||
|
|
||
|
FileName [demo.c]
|
||
|
|
||
|
SystemName [ABC: Logic synthesis and verification system.]
|
||
|
|
||
|
PackageName [ABC as a static library.]
|
||
|
|
||
|
Synopsis [A demo program illustrating the use of ABC as a static library.]
|
||
|
|
||
|
Author [Alan Mishchenko]
|
||
|
|
||
|
Affiliation [UC Berkeley]
|
||
|
|
||
|
Date [Ver. 1.0. Started - June 20, 2005.]
|
||
|
|
||
|
Revision [$Id: demo.c,v 1.00 2005/11/14 00:00:00 alanmi Exp $]
|
||
|
|
||
|
***********************************************************************/
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <time.h>
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////
|
||
|
/// DECLARATIONS ///
|
||
|
////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
// procedures to start and stop the ABC framework
|
||
|
// (should be called before and after the ABC procedures are called)
|
||
|
extern void Abc_Start();
|
||
|
extern void Abc_Stop();
|
||
|
|
||
|
// procedures to get the ABC framework and execute commands in it
|
||
|
extern void * Abc_FrameGetGlobalFrame();
|
||
|
extern int Cmd_CommandExecute( void * pAbc, char * sCommand );
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////
|
||
|
/// FUNCTION DEFINITIONS ///
|
||
|
////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
/**Function*************************************************************
|
||
|
|
||
|
Synopsis [The main() procedure.]
|
||
|
|
||
|
Description [This procedure compiles into a stand-alone program for
|
||
|
DAG-aware rewriting of the AIGs. A BLIF or PLA file to be considered
|
||
|
for rewriting should be given as a command-line argument. Implementation
|
||
|
of the rewriting is inspired by the paper: Per Bjesse, Arne Boralv,
|
||
|
"DAG-aware circuit compression for formal verification", Proc. ICCAD 2004.]
|
||
|
|
||
|
SideEffects []
|
||
|
|
||
|
SeeAlso []
|
||
|
|
||
|
***********************************************************************/
|
||
|
int main( int argc, char * argv[] )
|
||
|
{
|
||
|
// parameters
|
||
|
int fUseResyn2 = 0;
|
||
|
int fPrintStats = 1;
|
||
|
int fVerify = 1;
|
||
|
// variables
|
||
|
void * pAbc;
|
||
|
char * pFileName;
|
||
|
char Command[1000];
|
||
|
int clkRead, clkResyn, clkVer, clk;
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
// get the input file name
|
||
|
if ( argc != 2 )
|
||
|
{
|
||
|
printf( "Wrong number of command-line arguments.\n" );
|
||
|
return 1;
|
||
|
}
|
||
|
pFileName = argv[1];
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
// start the ABC framework
|
||
|
Abc_Start();
|
||
|
pAbc = Abc_FrameGetGlobalFrame();
|
||
|
|
||
|
clk = clock();
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
// read the file
|
||
|
sprintf( Command, "read %s", pFileName );
|
||
|
if ( Cmd_CommandExecute( pAbc, Command ) )
|
||
|
{
|
||
|
fprintf( stdout, "Cannot execute command \"%s\".\n", Command );
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
// balance
|
||
|
sprintf( Command, "balance" );
|
||
|
if ( Cmd_CommandExecute( pAbc, Command ) )
|
||
|
{
|
||
|
fprintf( stdout, "Cannot execute command \"%s\".\n", Command );
|
||
|
return 1;
|
||
|
}
|
||
|
clkRead = clock() - clk;
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
// print stats
|
||
|
if ( fPrintStats )
|
||
|
{
|
||
|
sprintf( Command, "print_stats" );
|
||
|
if ( Cmd_CommandExecute( pAbc, Command ) )
|
||
|
{
|
||
|
fprintf( stdout, "Cannot execute command \"%s\".\n", Command );
|
||
|
return 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
clk = clock();
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
// synthesize
|
||
|
if ( fUseResyn2 )
|
||
|
{
|
||
|
sprintf( Command, "balance; rewrite -l; refactor -l; balance; rewrite -l; rewrite -lz; balance; refactor -lz; rewrite -lz; balance" );
|
||
|
if ( Cmd_CommandExecute( pAbc, Command ) )
|
||
|
{
|
||
|
fprintf( stdout, "Cannot execute command \"%s\".\n", Command );
|
||
|
return 1;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
sprintf( Command, "balance; rewrite -l; rewrite -lz; balance; rewrite -lz; balance" );
|
||
|
if ( Cmd_CommandExecute( pAbc, Command ) )
|
||
|
{
|
||
|
fprintf( stdout, "Cannot execute command \"%s\".\n", Command );
|
||
|
return 1;
|
||
|
}
|
||
|
}
|
||
|
clkResyn = clock() - clk;
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
// print stats
|
||
|
if ( fPrintStats )
|
||
|
{
|
||
|
sprintf( Command, "print_stats" );
|
||
|
if ( Cmd_CommandExecute( pAbc, Command ) )
|
||
|
{
|
||
|
fprintf( stdout, "Cannot execute command \"%s\".\n", Command );
|
||
|
return 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
// write the result in blif
|
||
|
sprintf( Command, "write_blif result.blif" );
|
||
|
if ( Cmd_CommandExecute( pAbc, Command ) )
|
||
|
{
|
||
|
fprintf( stdout, "Cannot execute command \"%s\".\n", Command );
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
// perform verification
|
||
|
clk = clock();
|
||
|
if ( fVerify )
|
||
|
{
|
||
|
sprintf( Command, "cec %s result.blif", pFileName );
|
||
|
if ( Cmd_CommandExecute( pAbc, Command ) )
|
||
|
{
|
||
|
fprintf( stdout, "Cannot execute command \"%s\".\n", Command );
|
||
|
return 1;
|
||
|
}
|
||
|
}
|
||
|
clkVer = clock() - clk;
|
||
|
|
||
|
printf( "Reading = %6.2f sec ", (float)(clkRead)/(float)(CLOCKS_PER_SEC) );
|
||
|
printf( "Rewriting = %6.2f sec ", (float)(clkResyn)/(float)(CLOCKS_PER_SEC) );
|
||
|
printf( "Verification = %6.2f sec\n", (float)(clkVer)/(float)(CLOCKS_PER_SEC) );
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
// stop the ABC framework
|
||
|
Abc_Stop();
|
||
|
return 0;
|
||
|
}
|
||
|
|