From 8a91a9afe8d56b7f266e4a9e64aceac8737395dc Mon Sep 17 00:00:00 2001 From: Alan Mishchenko Date: Sat, 29 Sep 2012 19:44:45 -0400 Subject: Experiments with mini AIG manager. --- src/aig/miniaig/miniaig.h | 193 ++++++++++++++++++++++++++++++++++++++++++++ src/aig/miniaig/module.make | 1 + src/base/abc/miniaig.h | 193 -------------------------------------------- src/base/abci/abcMini.c | 2 +- 4 files changed, 195 insertions(+), 194 deletions(-) create mode 100644 src/aig/miniaig/miniaig.h create mode 100644 src/aig/miniaig/module.make delete mode 100644 src/base/abc/miniaig.h (limited to 'src') diff --git a/src/aig/miniaig/miniaig.h b/src/aig/miniaig/miniaig.h new file mode 100644 index 00000000..0d6aa62f --- /dev/null +++ b/src/aig/miniaig/miniaig.h @@ -0,0 +1,193 @@ +/**CFile**************************************************************** + + FileName [miniaig.h] + + SystemName [ABC: Logic synthesis and verification system.] + + PackageName [Minimalistic AIG package.] + + Synopsis [External declarations.] + + Author [Alan Mishchenko] + + Affiliation [UC Berkeley] + + Date [Ver. 1.0. Started - September 29, 2012.] + + Revision [$Id: miniaig.h,v 1.00 2012/09/29 00:00:00 alanmi Exp $] + +***********************************************************************/ + +#ifndef MINI_AIG__mini_aig_h +#define MINI_AIG__mini_aig_h + +//////////////////////////////////////////////////////////////////////// +/// INCLUDES /// +//////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include + +//////////////////////////////////////////////////////////////////////// +/// PARAMETERS /// +//////////////////////////////////////////////////////////////////////// + +#define MINI_AIG_NULL (0x7FFFFFFF) +#define MINI_AIG_START_SIZE (0x000000FF) + +//////////////////////////////////////////////////////////////////////// +/// BASIC TYPES /// +//////////////////////////////////////////////////////////////////////// + +typedef struct Mini_Aig_t_ Mini_Aig_t; +struct Mini_Aig_t_ +{ + int nCap; + int nSize; + int * pArray; +}; + +//////////////////////////////////////////////////////////////////////// +/// MACRO DEFINITIONS /// +//////////////////////////////////////////////////////////////////////// + +// memory management +#define MINI_AIG_ALLOC(type, num) ((type *) malloc(sizeof(type) * (num))) +#define MINI_AIG_CALLOC(type, num) ((type *) calloc((num), sizeof(type))) +#define MINI_AIG_FALLOC(type, num) ((type *) memset(malloc(sizeof(type) * (num)), 0xff, sizeof(type) * (num))) +#define MINI_AIG_FREE(obj) ((obj) ? (free((char *) (obj)), (obj) = 0) : 0) +#define MINI_AIG_REALLOC(type, obj, num) \ + ((obj) ? ((type *) realloc((char *)(obj), sizeof(type) * (num))) : \ + ((type *) malloc(sizeof(type) * (num)))) + +// internal procedures +static void Mini_AigGrow( Mini_Aig_t * p, int nCapMin ) +{ + if ( p->nCap >= nCapMin ) + return; + p->pArray = MINI_AIG_REALLOC( int, p->pArray, nCapMin ); + assert( p->pArray ); + p->nCap = nCapMin; +} +static void Mini_AigPush( Mini_Aig_t * p, int Lit0, int Lit1 ) +{ + if ( p->nSize + 2 > p->nCap ) + { + if ( p->nCap < MINI_AIG_START_SIZE ) + Mini_AigGrow( p, MINI_AIG_START_SIZE ); + else + Mini_AigGrow( p, 2 * p->nCap ); + } + p->pArray[p->nSize++] = Lit0; + p->pArray[p->nSize++] = Lit1; +} + +// accessing fanins +static int Mini_AigNodeFanin0( Mini_Aig_t * p, int Id ) +{ + assert( Id >= 0 && 2*Id < p->nSize ); + return p->pArray[2*Id]; +} +static int Mini_AigNodeFanin1( Mini_Aig_t * p, int Id ) +{ + assert( Id >= 0 && 2*Id < p->nSize ); + return p->pArray[2*Id+1]; +} + +// working with variables and literals +static int Mini_AigVar2Lit( int Var, int fCompl ) { return Var + Var + fCompl; } +static int Mini_AigLit2Var( int Lit ) { return Lit >> 1; } +static int Mini_AigLitIsCompl( int Lit ) { return Lit & 1; } +static int Mini_AigLitNot( int Lit ) { return Lit ^ 1; } +static int Mini_AigLitNotCond( int Lit, int c ) { return Lit ^ (int)(c > 0); } +static int Mini_AigLitRegular( int Lit ) { return Lit & ~01; } + +static int Mini_AigLitConst0() { return 0; } +static int Mini_AigLitConst1() { return 1; } +static int Mini_AigLitIsConst0( int Lit ) { return Lit == 0; } +static int Mini_AigLitIsConst1( int Lit ) { return Lit == 1; } +static int Mini_AigLitIsConst( int Lit ) { return Lit == 0 || Lit == 1; } + +static int Mini_AigNodeNum( Mini_Aig_t * p ) { return p->nSize/2; } +static int Mini_AigNodeIsConst( Mini_Aig_t * p, int Id ) { assert( Id >= 0 ); return Id == 0; } +static int Mini_AigNodeIsPi( Mini_Aig_t * p, int Id ) { assert( Id >= 0 ); return Id > 0 && Mini_AigNodeFanin0( p, Id ) == MINI_AIG_NULL; } +static int Mini_AigNodeIsPo( Mini_Aig_t * p, int Id ) { assert( Id >= 0 ); return Id > 0 && Mini_AigNodeFanin0( p, Id ) != MINI_AIG_NULL && Mini_AigNodeFanin1( p, Id ) == MINI_AIG_NULL; } +static int Mini_AigNodeIsAnd( Mini_Aig_t * p, int Id ) { assert( Id >= 0 ); return Id > 0 && Mini_AigNodeFanin0( p, Id ) != MINI_AIG_NULL && Mini_AigNodeFanin1( p, Id ) != MINI_AIG_NULL; } + + +// constructor/destructor +static Mini_Aig_t * Mini_AigStart() +{ + Mini_Aig_t * p; + p = MINI_AIG_ALLOC( Mini_Aig_t, 1 ); + p->nSize = 0; + p->nCap = MINI_AIG_START_SIZE; + p->pArray = MINI_AIG_ALLOC( int, p->nCap ); + Mini_AigPush( p, MINI_AIG_NULL, MINI_AIG_NULL ); + return p; +} +static void Mini_AigStop( Mini_Aig_t * p ) +{ + MINI_AIG_FREE( p->pArray ); + MINI_AIG_FREE( p ); +} + + +// creating nodes +// (constant node is created when AIG manager is created) +static int Mini_AigCreatePi( Mini_Aig_t * p ) +{ + int Lit = p->nSize; + Mini_AigPush( p, MINI_AIG_NULL, MINI_AIG_NULL ); + return Lit; +} +static int Mini_AigCreatePo( Mini_Aig_t * p, int Lit0 ) +{ + int Lit = p->nSize; + assert( Lit0 >= 0 && Lit0 < Lit ); + Mini_AigPush( p, Lit0, MINI_AIG_NULL ); + return Lit; +} + +// boolean operations +static int Mini_AigAnd( Mini_Aig_t * p, int Lit0, int Lit1 ) +{ + int Lit = p->nSize; + assert( Lit0 >= 0 && Lit0 < Lit ); + assert( Lit1 >= 0 && Lit1 < Lit ); + Mini_AigPush( p, Lit0, Lit1 ); + return Lit; +} +static int Mini_AigOr( Mini_Aig_t * p, int Lit0, int Lit1 ) +{ + return Mini_AigLitNot( Mini_AigAnd( p, Mini_AigLitNot(Lit0), Mini_AigLitNot(Lit1) ) ); +} +static int Mini_AigMux( Mini_Aig_t * p, int LitC, int Lit1, int Lit0 ) +{ + int Res0 = Mini_AigAnd( p, LitC, Lit1 ); + int Res1 = Mini_AigAnd( p, Mini_AigLitNot(LitC), Lit0 ); + return Mini_AigOr( p, Res0, Res1 ); +} +static int Mini_AigXor( Mini_Aig_t * p, int Lit0, int Lit1 ) +{ + return Mini_AigMux( p, Lit0, Mini_AigLitNot(Lit1), Lit1 ); +} + + +#define Mini_AigForEachPi( p, i ) for (i = 1; i < Mini_AigNodeNum(p); i++) if ( !Mini_AigNodeIsPi(p, i) ) else +#define Mini_AigForEachPo( p, i ) for (i = 1; i < Mini_AigNodeNum(p); i++) if ( !Mini_AigNodeIsPo(p, i) ) else +#define Mini_AigForEachAnd( p, i ) for (i = 1; i < Mini_AigNodeNum(p); i++) if ( !Mini_AigNodeIsAnd(p, i) ) else + + +//////////////////////////////////////////////////////////////////////// +/// FUNCTION DECLARATIONS /// +//////////////////////////////////////////////////////////////////////// + +#endif + +//////////////////////////////////////////////////////////////////////// +/// END OF FILE /// +//////////////////////////////////////////////////////////////////////// + diff --git a/src/aig/miniaig/module.make b/src/aig/miniaig/module.make new file mode 100644 index 00000000..d6d908e7 --- /dev/null +++ b/src/aig/miniaig/module.make @@ -0,0 +1 @@ +SRC += diff --git a/src/base/abc/miniaig.h b/src/base/abc/miniaig.h deleted file mode 100644 index 0d6aa62f..00000000 --- a/src/base/abc/miniaig.h +++ /dev/null @@ -1,193 +0,0 @@ -/**CFile**************************************************************** - - FileName [miniaig.h] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Minimalistic AIG package.] - - Synopsis [External declarations.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - September 29, 2012.] - - Revision [$Id: miniaig.h,v 1.00 2012/09/29 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#ifndef MINI_AIG__mini_aig_h -#define MINI_AIG__mini_aig_h - -//////////////////////////////////////////////////////////////////////// -/// INCLUDES /// -//////////////////////////////////////////////////////////////////////// - -#include -#include -#include -#include - -//////////////////////////////////////////////////////////////////////// -/// PARAMETERS /// -//////////////////////////////////////////////////////////////////////// - -#define MINI_AIG_NULL (0x7FFFFFFF) -#define MINI_AIG_START_SIZE (0x000000FF) - -//////////////////////////////////////////////////////////////////////// -/// BASIC TYPES /// -//////////////////////////////////////////////////////////////////////// - -typedef struct Mini_Aig_t_ Mini_Aig_t; -struct Mini_Aig_t_ -{ - int nCap; - int nSize; - int * pArray; -}; - -//////////////////////////////////////////////////////////////////////// -/// MACRO DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -// memory management -#define MINI_AIG_ALLOC(type, num) ((type *) malloc(sizeof(type) * (num))) -#define MINI_AIG_CALLOC(type, num) ((type *) calloc((num), sizeof(type))) -#define MINI_AIG_FALLOC(type, num) ((type *) memset(malloc(sizeof(type) * (num)), 0xff, sizeof(type) * (num))) -#define MINI_AIG_FREE(obj) ((obj) ? (free((char *) (obj)), (obj) = 0) : 0) -#define MINI_AIG_REALLOC(type, obj, num) \ - ((obj) ? ((type *) realloc((char *)(obj), sizeof(type) * (num))) : \ - ((type *) malloc(sizeof(type) * (num)))) - -// internal procedures -static void Mini_AigGrow( Mini_Aig_t * p, int nCapMin ) -{ - if ( p->nCap >= nCapMin ) - return; - p->pArray = MINI_AIG_REALLOC( int, p->pArray, nCapMin ); - assert( p->pArray ); - p->nCap = nCapMin; -} -static void Mini_AigPush( Mini_Aig_t * p, int Lit0, int Lit1 ) -{ - if ( p->nSize + 2 > p->nCap ) - { - if ( p->nCap < MINI_AIG_START_SIZE ) - Mini_AigGrow( p, MINI_AIG_START_SIZE ); - else - Mini_AigGrow( p, 2 * p->nCap ); - } - p->pArray[p->nSize++] = Lit0; - p->pArray[p->nSize++] = Lit1; -} - -// accessing fanins -static int Mini_AigNodeFanin0( Mini_Aig_t * p, int Id ) -{ - assert( Id >= 0 && 2*Id < p->nSize ); - return p->pArray[2*Id]; -} -static int Mini_AigNodeFanin1( Mini_Aig_t * p, int Id ) -{ - assert( Id >= 0 && 2*Id < p->nSize ); - return p->pArray[2*Id+1]; -} - -// working with variables and literals -static int Mini_AigVar2Lit( int Var, int fCompl ) { return Var + Var + fCompl; } -static int Mini_AigLit2Var( int Lit ) { return Lit >> 1; } -static int Mini_AigLitIsCompl( int Lit ) { return Lit & 1; } -static int Mini_AigLitNot( int Lit ) { return Lit ^ 1; } -static int Mini_AigLitNotCond( int Lit, int c ) { return Lit ^ (int)(c > 0); } -static int Mini_AigLitRegular( int Lit ) { return Lit & ~01; } - -static int Mini_AigLitConst0() { return 0; } -static int Mini_AigLitConst1() { return 1; } -static int Mini_AigLitIsConst0( int Lit ) { return Lit == 0; } -static int Mini_AigLitIsConst1( int Lit ) { return Lit == 1; } -static int Mini_AigLitIsConst( int Lit ) { return Lit == 0 || Lit == 1; } - -static int Mini_AigNodeNum( Mini_Aig_t * p ) { return p->nSize/2; } -static int Mini_AigNodeIsConst( Mini_Aig_t * p, int Id ) { assert( Id >= 0 ); return Id == 0; } -static int Mini_AigNodeIsPi( Mini_Aig_t * p, int Id ) { assert( Id >= 0 ); return Id > 0 && Mini_AigNodeFanin0( p, Id ) == MINI_AIG_NULL; } -static int Mini_AigNodeIsPo( Mini_Aig_t * p, int Id ) { assert( Id >= 0 ); return Id > 0 && Mini_AigNodeFanin0( p, Id ) != MINI_AIG_NULL && Mini_AigNodeFanin1( p, Id ) == MINI_AIG_NULL; } -static int Mini_AigNodeIsAnd( Mini_Aig_t * p, int Id ) { assert( Id >= 0 ); return Id > 0 && Mini_AigNodeFanin0( p, Id ) != MINI_AIG_NULL && Mini_AigNodeFanin1( p, Id ) != MINI_AIG_NULL; } - - -// constructor/destructor -static Mini_Aig_t * Mini_AigStart() -{ - Mini_Aig_t * p; - p = MINI_AIG_ALLOC( Mini_Aig_t, 1 ); - p->nSize = 0; - p->nCap = MINI_AIG_START_SIZE; - p->pArray = MINI_AIG_ALLOC( int, p->nCap ); - Mini_AigPush( p, MINI_AIG_NULL, MINI_AIG_NULL ); - return p; -} -static void Mini_AigStop( Mini_Aig_t * p ) -{ - MINI_AIG_FREE( p->pArray ); - MINI_AIG_FREE( p ); -} - - -// creating nodes -// (constant node is created when AIG manager is created) -static int Mini_AigCreatePi( Mini_Aig_t * p ) -{ - int Lit = p->nSize; - Mini_AigPush( p, MINI_AIG_NULL, MINI_AIG_NULL ); - return Lit; -} -static int Mini_AigCreatePo( Mini_Aig_t * p, int Lit0 ) -{ - int Lit = p->nSize; - assert( Lit0 >= 0 && Lit0 < Lit ); - Mini_AigPush( p, Lit0, MINI_AIG_NULL ); - return Lit; -} - -// boolean operations -static int Mini_AigAnd( Mini_Aig_t * p, int Lit0, int Lit1 ) -{ - int Lit = p->nSize; - assert( Lit0 >= 0 && Lit0 < Lit ); - assert( Lit1 >= 0 && Lit1 < Lit ); - Mini_AigPush( p, Lit0, Lit1 ); - return Lit; -} -static int Mini_AigOr( Mini_Aig_t * p, int Lit0, int Lit1 ) -{ - return Mini_AigLitNot( Mini_AigAnd( p, Mini_AigLitNot(Lit0), Mini_AigLitNot(Lit1) ) ); -} -static int Mini_AigMux( Mini_Aig_t * p, int LitC, int Lit1, int Lit0 ) -{ - int Res0 = Mini_AigAnd( p, LitC, Lit1 ); - int Res1 = Mini_AigAnd( p, Mini_AigLitNot(LitC), Lit0 ); - return Mini_AigOr( p, Res0, Res1 ); -} -static int Mini_AigXor( Mini_Aig_t * p, int Lit0, int Lit1 ) -{ - return Mini_AigMux( p, Lit0, Mini_AigLitNot(Lit1), Lit1 ); -} - - -#define Mini_AigForEachPi( p, i ) for (i = 1; i < Mini_AigNodeNum(p); i++) if ( !Mini_AigNodeIsPi(p, i) ) else -#define Mini_AigForEachPo( p, i ) for (i = 1; i < Mini_AigNodeNum(p); i++) if ( !Mini_AigNodeIsPo(p, i) ) else -#define Mini_AigForEachAnd( p, i ) for (i = 1; i < Mini_AigNodeNum(p); i++) if ( !Mini_AigNodeIsAnd(p, i) ) else - - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -#endif - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - diff --git a/src/base/abci/abcMini.c b/src/base/abci/abcMini.c index a43b7d7b..dd80c64d 100644 --- a/src/base/abci/abcMini.c +++ b/src/base/abci/abcMini.c @@ -20,7 +20,7 @@ #include "base/abc/abc.h" #include "base/main/main.h" -#include "base/abc/miniaig.h" +#include "aig/miniaig/miniaig.h" ABC_NAMESPACE_IMPL_START -- cgit v1.2.3